[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1240":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":14,"stars7d":14,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":41,"readmeContent":42,"aiSummary":43,"trendingCount":16,"starSnapshotCount":16,"syncStatus":44,"lastSyncTime":45,"discoverSource":46},1240,"invincat","dog-qiuqiu\u002Finvincat","dog-qiuqiu","A native Python agent CLI built on DeepAgents CLI, featuring an independent memory Agent that captures learnings after each task and delivers efficient AI coding assistance through hierarchical memory management.","",null,"Python",208,22,4,1,0,7,12,4.09,false,"main",true,[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"agent","agent-skills","agentic-ai","agentic-workflow","ai","autonomous-agents","claude-code","cli","code","code-generation","codex","deepseek","gemini-cli","langchain","llm","python","qwen","2026-06-12 02:00:25","# Invincat CLI\n\n[中文文档](doc\u002FREADME_CN.md) | [Documentation Index](doc\u002FREADME.md)\n\n![](data\u002Fbanner_en.png)\n\nA Python-based terminal AI programming assistant — collaborate with AI directly in your project directory: read\u002Fwrite files, execute commands, browse the web, and maintain memory across sessions.\n\n![](data\u002Fcli_en.png)\n\n## Why Invincat\n\nInvincat is designed for real engineering work in local repositories, not demo-only chat.\n\n- Terminal-native workflow: stay in your project directory and use AI without switching IDEs or browser tabs.\n- Execution with guardrails: shell\u002Ffile\u002Fnetwork actions are approval-gated by default, with optional auto-approve for trusted flows.\n- Plan-first delivery mode: `\u002Fplan` lets teams review and approve checklists before execution, reducing risky one-shot edits.\n- Long-context durability: micro compression + offload keep long sessions usable without losing operational history.\n- Practical memory model: user\u002Fproject memory stores persist conventions across sessions and are inspectable via `\u002Fmemory`.\n- Extensible architecture: MCP tools, skills, and subagents allow adapting the assistant to team-specific workflows.\n\n## Agent Architecture\n\nInvincat uses a multi-agent runtime with clear role boundaries.\n\n### Execution Flow\n\n1. `User Input` enters the session router.\n2. If `\u002Fplan` mode is active, input is routed to the `Planner Agent`; otherwise to the `Main Agent`.\n3. `Main Agent` executes tools (file\u002Fshell\u002Fweb\u002FMCP) under approval and middleware guardrails.\n4. After a non-trivial turn completes, `Memory Agent` runs asynchronously to extract durable user\u002Fproject memory updates.\n5. When needed, `Main Agent` delegates bounded subtasks to local or async subagents.\n\n### Agent Roles and Responsibilities\n\n| Agent | Primary Responsibility | Allowed\u002FExpected Behavior | Hard Boundary |\n|------|-------------------------|---------------------------|---------------|\n| Main Agent | Execute user tasks end-to-end | Read\u002Fwrite files, run commands, use MCP\u002Ftools, coordinate subtasks | Must not directly read\u002Fwrite `memory_user.json` or `memory_project.json` |\n| Planner Agent (`\u002Fplan`) | Produce and refine executable plans | Read-only context gathering, `write_todos`, `approve_plan`, optional clarification via `ask_user` | No implementation actions (no file edits, no command execution) |\n| Memory Agent | Curate durable memory after each completed turn | Score and apply memory ops (`create\u002Fupdate\u002Frescore\u002Fretier\u002Farchive\u002Fdelete\u002Fnoop`) to user\u002Fproject stores | Conservative extraction; skips low-confidence or ephemeral facts |\n| Local Subagents | Parallelize bounded in-process subtasks | Handle scoped tasks delegated by main agent with explicit instructions | Operate only within delegated scope; main agent remains final integrator |\n| Async Subagents | Offload long\u002Fremote tasks | Launch\u002Fupdate\u002Fcancel remote subagent jobs via async tools | Treated as delegated workers, not primary conversation owner |\n\n### Runtime Guardrails\n\n- Planner mode uses both visible-tool filtering and runtime allow-list enforcement.\n- Memory store files are protected by middleware and updated only through the memory pipeline.\n- Memory extraction runs in post-turn async middleware (`aafter_agent`) so it does not block user-visible responses.\n\n## Documentation\n\n- Chinese guide: [doc\u002FREADME_CN.md](doc\u002FREADME_CN.md)\n- Memory design (Chinese): [doc\u002FMEMORY_DESIGN.md](doc\u002FMEMORY_DESIGN.md)\n- Memory design (English): [doc\u002FMEMORY_DESIGN_EN.md](doc\u002FMEMORY_DESIGN_EN.md)\n\n---\n\n## Installation\n\n**Requirements**: Python 3.11+\n\n```bash\n# Install from PyPI\npip install invincat-cli\n```\n\nOr install from source:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fdog-qiuqiu\u002Finvincat.git\ncd invincat\npip install -e .\n```\n\n---\n\n## Quick Start\n\n```bash\n# Start in your project directory\ncd ~\u002Fmy-project\ninvincat-cli\n```\n\nAfter the first launch, run `\u002Fmodel` to configure the model and API Key, then you can start the conversation directly.\n\n---\n\n## Model Configuration\n\n### Configure via Interface\n\nRun `\u002Fmodel` command to open the model management interface:\n\n![](data\u002Fmodel_en.png)\n\n1. Press `Ctrl+N` to register a new model\n2. Fill in the provider, model name, and API Key\n3. Select from the list and press `Enter` to activate\n\n### Primary\u002FMemory Model Mechanism\n\nInvincat uses two model targets:\n\n- `Primary` model: handles normal conversation execution and planner-mode execution handoff.\n- `Memory` model: used only by the post-turn memory extraction pipeline.\n- If no dedicated memory model is configured, memory extraction follows the current primary model.\n- If the dedicated memory model fails to initialize at runtime, memory extraction automatically falls back to the primary model for that turn.\n\n### Supported Providers\n\n| Provider | Example Models |\n|----------|----------------|\n| `anthropic` | `claude-sonnet-4-6`, `claude-opus-4-7` |\n| `openai` | `gpt-4o`, `o3` |\n| `google_genai` | `gemini-2.0-flash`, `gemini-2.5-pro` |\n| `openrouter` | Supports all models on OpenRouter |\n\nFor OpenAI-compatible interfaces (DeepSeek, Zhipu, local Ollama, etc.), simply set the `base_url` to connect.\n\n### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `ANTHROPIC_API_KEY` | Anthropic API Key |\n| `OPENAI_API_KEY` | OpenAI API Key |\n| `GOOGLE_API_KEY` | Google API Key |\n| `OPENROUTER_API_KEY` | OpenRouter API Key |\n| `TAVILY_API_KEY` | Tavily web search Key (optional) |\n\n---\n\n## Basic Usage\n\nType your question or task directly in the input box and press `Enter` to send. AI will automatically select the appropriate tools to complete the task:\n\n```\nSearch for the latest usage of LangGraph interrupt\n```\n---\n\n### Command Mode (`\u002F` prefix)\n\n```\n\u002Fclear\n\u002Fthreads\n\u002Fmodel\n... ...\n```\n\nPress `Tab` to autocomplete available commands. See [Slash Commands](#slash-commands) for the complete list.\n\n---\n\n## Plan Mode\n\nUse planner mode when you want to discuss and approve a plan before execution:\n\n```bash\n\u002Fplan\n```\n\nThen describe your task in chat. The planner agent will:\n\n- analyze requirements with read-only tools\n- write a todo list (`write_todos`)\n- ask for explicit approval (`approve_plan`)\n\nAfter approval, planner mode exits and keeps the approved checklist visible.\nThe approved checklist is then handed to the main agent for execution.\nIf you reject the plan, the planner stays in planning mode so you can refine\nrequirements and regenerate the checklist.\n\nExit planner mode anytime:\n\n```bash\n\u002Fexit-plan\n```\n\n`\u002Fexit-plan` also cancels an in-flight planner turn and drops queued planner handoff actions, so no stale plan execution will continue after exit.\n\n---\n\n## File References\n\nUse `@` in your message to reference files, and AI will read and understand their content:\n\n```\n@src\u002Fmain.py Are there any potential performance issues in this file?\n```\n---\n\n## Tool Approval\n\nWhen AI performs operations like file writing, shell commands, or network requests, it will pause by default for confirmation:\n\n**Auto-approve Mode**: Press `Shift+Tab` to toggle. When enabled, all tool calls are automatically approved, suitable for trusted task scenarios. The status bar will display an `AUTO` indicator.\n\n> ⚠️ It's recommended to enable auto-approve only after you're familiar with the task content.\n\n## Input Line Breaks\n\nPress `Ctrl+J` in the input box to insert a line break, suitable for entering longer code or paragraphs.\n\n---\n\n## Context Management\n\n### Micro Compression\n\nA lightweight compression that runs automatically before each model call, **no LLM involved**, taking \u003C1ms.\n\n**How it works**: Groups conversation messages by \"tool call groups\", keeps a **dynamic recent window** intact, and compresses older large tool outputs in two levels:\n\n- `cleared-light`: richer placeholder near the cutoff (keeps head\u002Ftail signals)\n- `cleared-heavy`: stronger placeholder for older groups (keeps concise summary)\n\n**Compressible Tool Outputs**:\n| Tool | Compression Effect |\n|------|-------------------|\n| `read_file` | file content → light\u002Fheavy placeholder |\n| `edit_file` | diff output → light\u002Fheavy placeholder |\n| `write_file` | write result → light\u002Fheavy placeholder |\n| `execute` | shell output → light\u002Fheavy placeholder |\n| `grep`\u002F`glob`\u002F`ls` | search\u002Flist output → light\u002Fheavy placeholder |\n| `web_search`\u002F`fetch_url` | web content → light\u002Fheavy placeholder |\n\n**Not Compressed**: agent\u002Fsubagent results, `ask_user` responses, MCP tool outputs, `compact_conversation` results.\n\nTune micro compression with environment variables:\n\n```bash\nINVINCAT_MICRO_COMPACT_KEEP_RECENT_GROUPS=3\nINVINCAT_MICRO_COMPACT_DYNAMIC_GROUP_FACTOR=12\nINVINCAT_MICRO_COMPACT_MAX_KEEP_RECENT_GROUPS=8\nINVINCAT_MICRO_COMPACT_LIGHT_NEAR_CUTOFF_GROUPS=2\nINVINCAT_MICRO_COMPACT_MIN_COMPRESS_CHARS=240\n```\n\n> 💡 Micro compression only affects the context sent to the model, does not modify persisted state, and complete history is still saved in checkpoints.\n\n### Auto Compression\n\nWhen context window usage exceeds **80%**, the system automatically compresses older messages into summaries to free up space, requiring no manual operation. The status bar token count turns orange above 70% and red above 90% as warnings.\n\n### Manual Compression\n\n```\n\u002Foffload\n```\n\nOr equivalently `\u002Fcompact`. After execution, it shows how many messages were compressed and how many tokens were freed.\n\n## Memory System\n\nAI can remember your preferences, project conventions, and important information across sessions.\n\n### Memory Architecture Highlights\n\n- JSON single source of truth: runtime memory uses `memory_user.json` and `memory_project.json` only, which keeps reads\u002Fwrites auditable and deterministic.\n- Dual-scope isolation: separates cross-project personal preferences (`user`) from repository conventions (`project`) to avoid memory pollution.\n- Read\u002Fwrite pipeline decoupling:\n  - `RefreshableMemoryMiddleware` is responsible only for loading\u002Frendering\u002Finjecting memory.\n  - `MemoryAgentMiddleware` is responsible only for post-turn extraction and structured writes.\n- Async post-turn extraction: memory updates run after main responses, so memory persistence does not block interactive latency.\n- Incremental extraction with recovery: consumes only delta messages after last successful cursor, with full-history fallback when history is rewritten.\n- Evidence-aware project memory: project scope favors durable conventions backed by tool evidence and avoids transient session noise.\n- Deterministic invalid-fact cleanup: stale or contradicted active memories can be removed by rule-based validation, reducing long-lived wrong memory.\n- Strong write safety: schema validation, dedup\u002Fconflict guards, path whitelist, and atomic write (`tmp + os.replace`) prevent corruption.\n- Transparent and operable: `\u002Fmemory` provides full-screen live inspection and management for both scopes.\n\n### Memory Governance Innovation\n\nThis project treats memory as a governed subsystem, not just a longer chat history.\n\n- Decision\u002Fwrite split: the memory agent decides operations, while runtime validators and guards decide what is actually persisted.\n- Typed lifecycle model: memory evolves through explicit operations (`create\u002Fupdate\u002Frescore\u002Fretier\u002Farchive\u002Fdelete\u002Fnoop`) instead of opaque free-form rewrites.\n- Built-in drift control: invalid-fact cleanup, scoring\u002Ftiering, and archive\u002Fdelete semantics prevent memory from becoming stale or bloated.\n- Evidence-gated project memory: project conventions require durable signals and tool evidence, reducing accidental writes from transient noise.\n- Operator-friendly governance: memory stores are inspectable JSON, and `\u002Fmemory` provides live visibility for review and correction.\n\n### Memory Runtime Architecture\n\n```mermaid\nflowchart LR\n    A[Conversation Turn] --> B[Main Agent Response]\n    B --> C[MemoryAgentMiddleware aafter_agent]\n    C --> D{Non-trivial + completed + throttle passed?}\n    D -- No --> E[Skip extraction]\n    D -- Yes --> F[Incremental slice by cursor + anchor]\n    F --> G[Collect tool evidence]\n    G --> H[Structured ops JSON]\n    H --> I[Validate + guardrails]\n    I --> J[Atomic write memory_user.json \u002F memory_project.json]\n    J --> K[Next turn RefreshableMemoryMiddleware injects active memory]\n```\n\n### Memory Files\n\n| Type | Path | Scope |\n|------|------|-------|\n| Global Memory Store | `~\u002F.invincat\u002F{assistant_id}\u002Fmemory_user.json` (default: `~\u002F.invincat\u002Fagent\u002Fmemory_user.json`) | Universal for all projects (coding style, personal preferences) |\n| Project Memory Store | `{project root}\u002F.invincat\u002Fmemory_project.json` (fallback: `{cwd}\u002F.invincat\u002Fmemory_project.json` when project root is not detected) | Current project context (repository conventions, architecture, stack); falls back to current working directory when no project root is detected |\n\n`AGENTS.md` is deprecated for runtime memory injection. The runtime memory pipeline now uses `memory_*.json` as the single source of truth.\n\n### Auto Memory Update\n\nMemory updates are triggered after non-trivial completed turns, with:\n\n- incremental extraction: consume only messages added since the previous\n  memory extraction in the same thread\n- cursor invalidation fallback: if history is rewritten (for example,\n  compaction\u002Fcheckpoint replay), fallback to one full-history pass\n- turn-interval throttling\n- keyword-based early triggers (preferences\u002Frules\u002Fconventions)\n- time\u002Ffile cooldown guards\n\nTune behavior via environment variables:\n\n```bash\nINVINCAT_MEMORY_CONTEXT_MESSAGES=0\nINVINCAT_MEMORY_MIN_TURN_INTERVAL=1\nINVINCAT_MEMORY_MIN_SECONDS_BETWEEN_RUNS=0\nINVINCAT_MEMORY_FILE_COOLDOWN_SECONDS=0\n```\n\n`INVINCAT_MEMORY_CONTEXT_MESSAGES=0` means no cap on the incremental delta\nsince the last memory extraction. Set a positive integer to cap the delta\nto recent N messages.\n\nBy default the memory agent runs after every non-trivial turn\n(`MIN_TURN_INTERVAL=1`, no wall-clock or file cooldown) so memory stays\nin sync with the latest signal. Raise the values to re-enable throttling\nif the extraction cost becomes a concern.\n\nFor production tuning (cost-sensitive setups), a practical starting point is:\n\n```bash\nINVINCAT_MEMORY_MIN_TURN_INTERVAL=2\nINVINCAT_MEMORY_MIN_SECONDS_BETWEEN_RUNS=8\nINVINCAT_MEMORY_FILE_COOLDOWN_SECONDS=5\n```\n\n### Troubleshooting Project Memory Not Updating\n\nIf project memory updates appear rare, check in this order:\n\n1. Is the turn non-trivial and completed? Very short confirmations (`ok`, `thanks`, `继续`) are skipped.\n2. Did evidence come from supported tools? Project evidence extraction prioritizes `read_file`, `edit_file`, `write_file`, `execute`, `bash`, `shell`.\n3. Is evidence durable and convention-like? Temporary logs or one-off statuses are intentionally ignored.\n4. Is throttling active? `MIN_TURN_INTERVAL`, wall-clock cooldown, or file cooldown can suppress runs.\n5. Was history rewritten? Cursor mismatch triggers fallback behavior; check whether compaction\u002Freplay happened.\n6. Did writes fail guardrails? Invalid\u002Fconflicting operations are dropped by schema and safety validation.\n\nQuick verification path:\n\n1. Run one concrete, non-trivial turn that states a stable project rule.\n2. Ensure at least one supporting read\u002Fexecute tool result exists in that turn.\n3. Open `\u002Fmemory` and check the `project` tab for new or updated active items.\n\n### Memory Design Docs\n\n- [Memory Design (Chinese)](doc\u002FMEMORY_DESIGN.md)\n- [Memory Design (English)](doc\u002FMEMORY_DESIGN_EN.md)\n\n### Memory Manager UI\n\n```\n\u002Fmemory\n```\n\nOpen the full-screen memory manager for live inspection of memory stores:\n\n- separate pages for `user` and `project` scope (`1` \u002F `2`, or `Tab` to switch)\n- highlights key fields (`status`, `id`, `section`, `content`) for each item\n- supports `r` (refresh), `a` (show\u002Fhide archived), `Esc` (close)\n\n---\n\n## Skill System\n\nSkills are predefined workflow templates for reusing complex task steps.\n\n### How Skills Work\n\nInvincat supports two skill invocation paths:\n\n- Explicit invocation: `\u002Fskill:\u003Cname> [args]` loads that skill's `SKILL.md` and injects it into the current turn.\n- Middleware invocation: `SkillsMiddleware` can auto-match and apply skills during normal agent execution.\n\nDiscovery happens at startup\u002Freload and skill metadata is cached for autocomplete and faster lookup.\n\n### Skill Precedence\n\nWhen duplicate names exist, higher-precedence directories override lower ones:\n\n1. `\u003Cpackage>\u002Fbuilt_in_skills\u002F`\n2. `~\u002F.invincat\u002F\u003Cagent>\u002Fskills\u002F`\n3. `~\u002F.agents\u002Fskills\u002F`\n4. `\u003Cproject>\u002F.invincat\u002Fskills\u002F`\n5. `\u003Cproject>\u002F.agents\u002Fskills\u002F`\n6. `~\u002F.claude\u002Fskills\u002F` (experimental)\n7. `\u003Cproject>\u002F.claude\u002Fskills\u002F` (experimental)\n\n### Using Skills\n\n```\n\u002Fskill:web-research Search for LangGraph best practices\n\u002Fskill:code-review Check code quality in src\u002F directory\n```\n\n### Skill Locations\n\n| Location | Path | Description |\n|----------|------|-------------|\n| Built-in Skills | Installed with package | `skill-creator` |\n| User (Invincat alias) | `~\u002F.invincat\u002Fagent\u002Fskills\u002F` | Available across projects |\n| User (shared alias) | `~\u002F.agents\u002Fskills\u002F` | Shared across agent tools |\n| Project (Invincat alias) | `.invincat\u002Fskills\u002F` | Only available in current project |\n| Project (shared alias) | `.agents\u002Fskills\u002F` | Shared across tools in current project |\n\nDirectory behavior:\n\n- `~\u002F.invincat\u002Fagent\u002Fskills\u002F` and `~\u002F.agents\u002Fskills\u002F` are auto-created when needed.\n- Project skill directories are loaded only when a project root is detected.\n- Skill file reads enforce path containment (with extra allow-list support for symlink targets).\n\n### Creating Custom Skills\n\n```\n\u002Fskill-creator\n```\n\nStarts an interactive wizard that guides you through creating and saving new skills.\n\n---\n\n## Session Management\n\n### View and Switch Sessions\n\n```\n\u002Fthreads\n```\n\nOpens the session browser, displaying all historical conversations (time, message count, branch, etc.).\n\n### Start New Conversation\n\n```\n\u002Fclear\n```\n\nClears the current conversation and starts a new session (old sessions are still saved and can be retrieved via `\u002Fthreads`).\n\n---\n\n## Slash Commands\n\nType `\u002F` in the input box and press `Tab` to view and autocomplete all commands.\n\n### Session\n\n| Command | Description |\n|---------|-------------|\n| `\u002Fclear` | Clear current conversation, start new session |\n| `\u002Fthreads` | Browse and restore historical sessions |\n| `\u002Fplan` | Enter planner mode; approved checklist is handed to the main agent |\n| `\u002Fexit-plan` | Exit planner mode, cancel running planner turn and queued handoff |\n| `\u002Fquit` \u002F `\u002Fq` | Exit program |\n\n### Model & Interface\n\n| Command | Description |\n|---------|-------------|\n| `\u002Fmodel` | Switch\u002Fmanage model config (`1` primary, `2` memory), and set defaults |\n| `\u002Ftheme` | Switch color theme |\n| `\u002Flanguage` | Switch interface language (Chinese \u002F English) |\n| `\u002Ftokens` | View token usage details |\n\n### Context & Memory\n\n| Command | Description |\n|---------|-------------|\n| `\u002Foffload` \u002F `\u002Fcompact` | Manually compress context, free tokens |\n| `\u002Fmemory` | Open full-screen memory manager (live user\u002Fproject view) |\n\n### Tools & Extensions\n\n| Command | Description |\n|---------|-------------|\n| `\u002Fmcp` | View connected MCP servers and tools |\n| `\u002Feditor` | Edit current input in external editor |\n| `\u002Fwecombot-start` | Start the WeCom bot bridge for the current CLI session |\n| `\u002Fwecombot-status` | Show WeCom bot bridge status |\n| `\u002Fwecombot-stop` | Stop the WeCom bot bridge |\n| `\u002Fskill-creator` | Interactive wizard for creating new skills |\n| `\u002Fchangelog` | Open release notes\u002Fchangelog |\n| `\u002Ffeedback` | Show feedback channel information |\n| `\u002Fdocs` | Open project documentation entry |\n\n### Others\n\n| Command | Description |\n|---------|-------------|\n| `\u002Fhelp` | Display help information |\n| `\u002Fversion` | Display version number |\n| `\u002Freload` | Reload configuration files |\n| `\u002Ftrace` | Open current conversation in LangSmith (requires configuration) |\n\n---\n\n## WeCom Integration\n\nInvincat can bridge Enterprise WeCom bot messages into the current CLI session.\nMessages received from WeCom are injected into the same active conversation, so\nthey share the current model, memory, tools, approvals, and working directory.\n\n### Setup\n\nSet the bot credentials before starting the CLI, or export them in the shell\nwhere the CLI is already running:\n\n```bash\nexport WECOM_BOT_ID=\"your_bot_id\"\nexport WECOM_BOT_SECRET=\"your_bot_secret\"\nexport WECOM_WS_URL=\"wss:\u002F\u002Fopenws.work.weixin.qq.com\" # optional\n```\n\nStart the bridge inside the CLI:\n\n```text\n\u002Fwecombot-start\n```\n\nManage lifecycle:\n\n| Command | Description |\n|---------|-------------|\n| `\u002Fwecombot-start` | Open the WeCom long-connection client and subscribe to bot callbacks |\n| `\u002Fwecombot-status` | Show whether the bridge task is running |\n| `\u002Fwecombot-stop` | Stop the bridge task and close the active connection |\n\n### Reply Behavior\n\n- The bridge uses WeCom `msgtype=stream` replies with a stable `stream_id`, so\n  one WeCom message is updated in place instead of sending many separate chat\n  bubbles.\n- Before the model starts producing answer text, the message shows an animated\n  one-line progress state such as `处理中：正在分析问题...` or\n  `处理中：正在执行工具 read_file...`.\n- Once the model emits real text chunks, progress animation stops and the same\n  WeCom message switches to streaming the accumulated answer text.\n- The final frame is sent with `finish=true` and contains the completed answer.\n- During WeCom turns, the agent can use the WeCom-only `send_wecom_file(path)`\n  tool to send a generated local file back to the current WeCom chat.\n- Each WeCom turn can run for up to 30 minutes before the bridge returns a\n  timeout message.\n\n### Notes and Limits\n\n- Text, file, image, voice, and mixed text+image callbacks are accepted from WeCom.\n  Inbound media is downloaded and decrypted into `.invincat\u002Fwecom_downloads\u002F`\n  under the current project, then the local file path is injected into the\n  agent turn. Other message types are ignored.\n- Incoming WeCom messages are processed serially against the current CLI session\n  to avoid mixing two remote messages into the same agent turn.\n- The bridge reconnects automatically and keeps a small outbound queue for\n  best-effort delivery while disconnected.\n- True token-level streaming depends on the model provider and LangChain driver.\n  If the upstream model returns one large chunk, WeCom will also receive one\n  large content update rather than token-by-token output.\n- File sending is only exposed to the model during `\u002Fwecombot` turns. The file\n  must already exist inside the current project directory, must be a regular\n  non-empty file, and must be no larger than 20 MB.\n- Enable debug logging and look for `wecom text delta received chars=...` to\n  verify whether the provider is producing real incremental chunks.\n\n---\n\n## FAQ\n\n**Q: No response on first launch?**\nYou need to configure the model first. Run `\u002Fmodel` → Press `Ctrl+N` to register a model → Fill in the API Key.\n\n**Q: What are the main\u002Fsub models?**\n`\u002Fmodel 1` is the primary model for normal task execution. `\u002Fmodel 2` is the dedicated memory model for post-turn memory extraction. If memory default is not set (or fails), it falls back to primary.\n\n**Q: How to interrupt a running task?**\nPress `Esc` to interrupt the current AI response; if AI is waiting for tool approval, `Esc` acts as a rejection.\n\n**Q: Context too long causing slow response?**\nRun `\u002Foffload` to manually compress history, or wait for automatic compression (triggers when usage exceeds 80%).\n\n**Q: How to make AI remember my coding preferences?**\nJust tell AI directly, for example \"Remember: my project uses 4-space indentation, no semicolons\", and AI will automatically save it to memory files at the appropriate time.\n\n**Q: How to share skills across different projects?**\nPut global skills in `~\u002F.invincat\u002Fagent\u002Fskills\u002F` or `~\u002F.agents\u002Fskills\u002F`. Put project-only skills in `.invincat\u002Fskills\u002F` or `.agents\u002Fskills\u002F`.\n","Invincat CLI 是一个基于 Python 的终端 AI 编程助手，通过层次化的记忆管理提供高效的 AI 编码支持。其核心功能包括在项目目录中直接与 AI 协作、读写文件、执行命令和浏览网页，并且能够跨会话保持记忆。技术特点上，它采用了多代理运行时架构，明确划分了每个代理的角色和责任，例如主代理负责执行用户任务，计划代理生成并优化可执行计划，记忆代理异步更新持久化记忆等。此外，还具备执行防护栏、计划优先交付模式以及长上下文耐久性等特点。适用于需要在本地仓库进行实际工程工作的场景，如代码生成、调试和维护等，特别适合希望在不切换 IDE 或浏览器标签页的情况下利用 AI 辅助开发的开发者。",2,"2026-06-11 02:42:31","CREATED_QUERY"]