mindcode 0.2.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. mindcode-0.5.1/PKG-INFO +347 -0
  2. mindcode-0.5.1/README.md +331 -0
  3. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/_version.py +1 -1
  4. mindcode-0.5.1/mindcode/acp_agent/__init__.py +5 -0
  5. mindcode-0.5.1/mindcode/acp_agent/__main__.py +70 -0
  6. mindcode-0.5.1/mindcode/acp_agent/agent.py +469 -0
  7. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/approval.py +32 -7
  8. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/adapters/terminal_bench.py +6 -2
  9. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/runner.py +6 -4
  10. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/__init__.py +14 -9
  11. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/_shared.py +4 -6
  12. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/commands/bench.py +17 -8
  13. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/commands/chat.py +14 -8
  14. mindcode-0.5.1/mindcode/cli/commands/config_cmd.py +127 -0
  15. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/commands/shell.py +34 -19
  16. mindcode-0.5.1/mindcode/cli/commands/status.py +52 -0
  17. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/commands/task.py +26 -12
  18. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/shell/completion.py +5 -6
  19. mindcode-0.5.1/mindcode/cli/shell/input_pipeline.py +124 -0
  20. mindcode-0.5.1/mindcode/cli/shell/repl.py +1158 -0
  21. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/shell/slash.py +249 -138
  22. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/shell/startup.py +2 -1
  23. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/shell/tui.py +193 -37
  24. mindcode-0.5.1/mindcode/config.py +482 -0
  25. mindcode-0.5.1/mindcode/policy.py +230 -0
  26. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/render.py +153 -56
  27. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/runtime.py +86 -87
  28. mindcode-0.5.1/mindcode.egg-info/PKG-INFO +347 -0
  29. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode.egg-info/SOURCES.txt +11 -0
  30. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode.egg-info/requires.txt +2 -1
  31. {mindcode-0.2.0 → mindcode-0.5.1}/pyproject.toml +3 -2
  32. mindcode-0.5.1/tests/test_acp_agent.py +283 -0
  33. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_approval.py +17 -5
  34. mindcode-0.5.1/tests/test_cli_commands.py +816 -0
  35. mindcode-0.5.1/tests/test_config.py +311 -0
  36. mindcode-0.5.1/tests/test_exec_command_guard.py +118 -0
  37. mindcode-0.5.1/tests/test_external_file_approval.py +203 -0
  38. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_policy_choice.py +41 -22
  39. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_policy_timeout.py +5 -2
  40. mindcode-0.5.1/tests/test_provider_retry_defaults.py +80 -0
  41. mindcode-0.5.1/tests/test_reasoner_compat.py +129 -0
  42. mindcode-0.5.1/tests/test_render_exec.py +236 -0
  43. mindcode-0.5.1/tests/test_shell_channels.py +1790 -0
  44. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_shell_completion.py +44 -18
  45. mindcode-0.5.1/tests/test_shell_interrupt.py +860 -0
  46. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_shell_session.py +72 -7
  47. mindcode-0.5.1/tests/test_shell_slash_priority.py +174 -0
  48. mindcode-0.5.1/tests/test_shell_tui.py +1075 -0
  49. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_skills_mcp.py +11 -5
  50. mindcode-0.5.1/tests/test_slash_resume.py +499 -0
  51. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_subagents.py +5 -3
  52. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_system_prompt.py +3 -1
  53. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_task_resume.py +11 -11
  54. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_tasking.py +2 -2
  55. mindcode-0.2.0/PKG-INFO +0 -244
  56. mindcode-0.2.0/README.md +0 -229
  57. mindcode-0.2.0/mindcode/cli/commands/config_cmd.py +0 -197
  58. mindcode-0.2.0/mindcode/cli/commands/status.py +0 -37
  59. mindcode-0.2.0/mindcode/cli/shell/repl.py +0 -597
  60. mindcode-0.2.0/mindcode/config.py +0 -173
  61. mindcode-0.2.0/mindcode/policy.py +0 -173
  62. mindcode-0.2.0/mindcode.egg-info/PKG-INFO +0 -244
  63. mindcode-0.2.0/tests/test_cli_commands.py +0 -368
  64. mindcode-0.2.0/tests/test_config.py +0 -117
  65. mindcode-0.2.0/tests/test_exec_command_guard.py +0 -86
  66. mindcode-0.2.0/tests/test_render_exec.py +0 -126
  67. mindcode-0.2.0/tests/test_shell_channels.py +0 -292
  68. mindcode-0.2.0/tests/test_shell_tui.py +0 -391
  69. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/__init__.py +0 -0
  70. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/__main__.py +0 -0
  71. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/__init__.py +0 -0
  72. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/adapters/__init__.py +0 -0
  73. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/adapters/base.py +0 -0
  74. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/adapters/mini_bfcl.py +0 -0
  75. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/adapters/mini_gaia.py +0 -0
  76. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/adapters/mini_terminal.py +0 -0
  77. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/adapters/swe_bench.py +0 -0
  78. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/fake_tools.py +0 -0
  79. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/jsonutil.py +0 -0
  80. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/paths.py +0 -0
  81. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/predictions.py +0 -0
  82. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/report.py +0 -0
  83. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/schema.py +0 -0
  84. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/scorers/base.py +0 -0
  85. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/scorers/composite.py +0 -0
  86. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/scorers/exact.py +0 -0
  87. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/scorers/json_call.py +0 -0
  88. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/scorers/swe.py +0 -0
  89. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/scorers/terminal.py +0 -0
  90. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/scorers/terminal_bench.py +0 -0
  91. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/trace.py +0 -0
  92. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/bench/workspace.py +0 -0
  93. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/commands/__init__.py +0 -0
  94. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/commands/remote.py +0 -0
  95. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/commands/terminal.py +0 -0
  96. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/shell/__init__.py +0 -0
  97. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/cli/shell/menu.py +0 -0
  98. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/mcp.py +0 -0
  99. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/remote.py +0 -0
  100. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/skills.py +0 -0
  101. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/subagents.py +0 -0
  102. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/tasking.py +0 -0
  103. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/terminal/__init__.py +0 -0
  104. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/terminal/__main__.py +0 -0
  105. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode/terminal_core.py +0 -0
  106. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode.egg-info/dependency_links.txt +0 -0
  107. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode.egg-info/entry_points.txt +0 -0
  108. {mindcode-0.2.0 → mindcode-0.5.1}/mindcode.egg-info/top_level.txt +0 -0
  109. {mindcode-0.2.0 → mindcode-0.5.1}/setup.cfg +0 -0
  110. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_bench.py +0 -0
  111. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_diff_capture.py +0 -0
  112. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_remote.py +0 -0
  113. {mindcode-0.2.0 → mindcode-0.5.1}/tests/test_terminal.py +0 -0
@@ -0,0 +1,347 @@
1
+ Metadata-Version: 2.4
2
+ Name: mindcode
3
+ Version: 0.5.1
4
+ Summary: codex-style interactive coding agent on top of mindagent
5
+ Author: mindcode
6
+ License: MIT
7
+ Requires-Python: >=3.10
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: mindagent>=0.5.3
10
+ Requires-Dist: agent-client-protocol>=0.12
11
+ Requires-Dist: rich>=13
12
+ Requires-Dist: openai>=1.0
13
+ Requires-Dist: python-dotenv>=1.0
14
+ Requires-Dist: typer>=0.12
15
+ Requires-Dist: prompt-toolkit>=3.0.30
16
+
17
+ # mindcode
18
+
19
+ 一个能够自我进化的交互式 Coding Agent CLI,构建在 [mindagent](../) 之上。
20
+
21
+ ## 核心能力
22
+
23
+ - workspace 内的代码读取、编辑和命令执行
24
+ - 交互式会话与一次性任务
25
+ - 可选 master/coder subagent 协作(`--subagents`)
26
+ - 支持注入 Skills 与 MCP server 工具(`build_runtime(..., skills=..., mcp_clients=...)`)
27
+ - 前台/后台任务记录和进程重启后的语义恢复
28
+ - 本地持久终端和 SSH 远程命令
29
+ - mini、SWE-bench 和 Terminal-Bench 评测入口
30
+ - 配套 VS Code 聊天插件(`vscode-extension/`)
31
+
32
+ ## 特性
33
+
34
+ - **顶层 Agent 入口**:`mindcode [PROMPT] [选项]` 直接进入交互或 one-shot 模式;`chat` / `status` / `config` 等保留为公开子命令
35
+ - **可选 Subagent 模式**:`mindcode --subagents` 启用受限的 master/coder 协作;master 仅能委派,coder 才能访问 workspace
36
+ - 全屏 TUI:顶部 logo/会话信息、可滚动 Markdown 消息区、固定带边框多行输入框与状态栏
37
+ - 顶部信息栏显示本会话累计 token 消耗;provider 未返回 usage 时显示 `tokens —`
38
+ - Rich 富渲染:Markdown、彩色工具面板、file_edit diff 高亮和流式 LLM 输出
39
+ - TUI 内选择菜单:`/models`、`/permissions` 用方向键选择
40
+ - REPL 权限模式:`ask_user`(默认,写入和危险操作逐项询问)/ `full_accept`(接受权限上限内的操作风险)
41
+ - 会话持久化与恢复:基于 `LocalConversationStore`,存到 `~/.cache/mindcode/sessions/`
42
+ - OpenAI-compatible Provider 配置:首次启动时在 `~/.cache/mindcode/config.toml` 生成 rotor 示例
43
+ - 丰富 slash 命令:`/models` `/compact` `/permissions` `/status` `/resume` `/clear` `/help` `/exit`
44
+
45
+ ## VS Code 插件
46
+
47
+ 与 CLI 配套的 VS Code 聊天插件位于 [`vscode-extension/`](vscode-extension/)。
48
+ 进入该目录并按其 README 构建后,可在 VS Code 中按 `F5` 启动 Extension Development Host。
49
+
50
+ ```bash
51
+ cd vscode-extension
52
+ npm install # 首次
53
+ npm run build:all # 构建 webview 与插件
54
+ npm test # vitest 单测
55
+ ```
56
+
57
+ ## 安装
58
+
59
+ 要求 Python >= 3.10。在 mindcode 目录执行安装:
60
+
61
+ ```bash
62
+ cd /path/to/mindagent/app/mindcode
63
+ pip install -e .
64
+
65
+ mindcode --version # 0.5.0
66
+ ```
67
+
68
+ `pip install -e .` 会根据项目依赖自动从 PyPI 安装 `mindagent>=0.5.3`。
69
+
70
+ ## 文档
71
+
72
+ - `docs/command.md` — TUI slash 命令规范(状态合同:Implemented / Removed / Proposed / Blocked)
73
+ - `docs/usage.md` — 配置与日常命令示例
74
+ - `docs/design/architecture.md` — 架构设计
75
+ - `docs/devlog/` — 需求、roadmap 与各功能设计记录
76
+ - `docs/wiki/` — channels、remote、terminal sessions 等专题
77
+ - `docs/buglist.md` — 已知问题清单
78
+ - `../../docs/guides/policies-and-approval.md` — mindagent 侧策略与审批详解
79
+
80
+ ## 命令结构
81
+
82
+ ```
83
+ mindcode [PROMPT] [选项] # 交互式 REPL;提供 PROMPT 时为 one-shot
84
+ mindcode chat -m "..." [选项] # 一次性 prompt(参数与顶层入口基本一致)
85
+ mindcode status # 显示全局状态
86
+ mindcode task <subcmd> # 任务:run / resume / list / status / tail / cancel
87
+ mindcode terminal <subcmd> # 本地终端:open / new / list / send / tail / close
88
+ mindcode remote <subcmd> # SSH 远程:add / list / show / remove / exec / tail
89
+ mindcode bench <subcmd> # 评测:list / run / report / inspect / swe-eval / terminal-eval
90
+ mindcode config <subcmd> # 配置管理
91
+ mindcode config providers # 列出所有 provider
92
+ mindcode config models <provider> # 列出 provider 的模型
93
+ mindcode config models-set <p> ... # 设置 model_list;第一个模型成为 default_model
94
+ mindcode config api-key <p> <k> # 设置 api_key
95
+ mindcode config get <p> <field> # 读取字段
96
+ mindcode config set <p> <f> <v> # 修改字段
97
+ mindcode config list # 显示完整配置(脱敏)
98
+ mindcode config path # 显示配置文件路径
99
+ mindcode --version
100
+ mindcode --help
101
+ ```
102
+
103
+ ## 配置
104
+
105
+ 首次启动 `mindcode` 会自动在 `~/.cache/mindcode/config.toml` 创建一个
106
+ OpenAI-compatible rotor 示例。默认地址是本机 `http://127.0.0.1:8000/v1`,使用前应按实际网关修改。
107
+
108
+ 模板节选:
109
+
110
+ ```toml
111
+ default_provider = "rotor"
112
+
113
+ [providers.rotor]
114
+ protocol = "openai"
115
+ api_key = ""
116
+ base_url = "http://127.0.0.1:8000/v1"
117
+ default_model = "glm-5.2"
118
+ models = ["glm-5.2", "glm-5.1", "glm-4.7"]
119
+ ```
120
+
121
+ ### 方式 A:命令行(脚本化)
122
+
123
+ ```bash
124
+ mindcode config api-key rotor sk-xxxxxxxxxxxx # 设置密钥
125
+ mindcode config providers # 列出所有 provider
126
+ mindcode config models rotor # 列出 rotor 的模型
127
+ mindcode config set rotor default_model glm-5.1
128
+ mindcode config list # 完整配置(脱敏)
129
+ ```
130
+
131
+ ### 方式 B:REPL 内 slash 命令(交互式)
132
+
133
+ ```
134
+ /models # 方向键选择切换
135
+ /compact # 生成摘要以压缩会话上下文
136
+ /permissions # Ask User / Full Accept
137
+ /resume # 列出并恢复本地保存的历史 session
138
+ /status # 当前历史 session 状态与上下文使用
139
+ /help # 完整命令列表
140
+ ```
141
+
142
+ 也可直接编辑 `~/.cache/mindcode/config.toml`。
143
+
144
+ ## 使用
145
+
146
+ ### 一次性模式
147
+
148
+ ```bash
149
+ mindcode chat -m "读取 README.md 的前 5 行并总结"
150
+ # 或
151
+ mindcode "读取 README.md 的前 5 行并总结"
152
+ # 需要 master/coder 协作时(默认仍为单 agent)
153
+ mindcode --subagents "审查当前改动并运行相关测试"
154
+ ```
155
+
156
+ ### 交互模式
157
+
158
+ - `Enter` 发送;`Esc` + `Enter` 插入换行;多行输入框会自动增高。
159
+ - 输入 `/` 显示全部 slash 命令;继续输入会筛选。`↑` / `↓` 选择,`Enter` 先填入默认第一项,再按一次才执行。
160
+ - `/models` 与 `/permissions` 使用统一的灰阶选择框:`↑` / `↓` 切换,`Enter` 应用,`Esc` 取消;需要自由输入参数时仍在底部输入框内编辑和粘贴。
161
+ - `Page Up` / `Page Down` 或鼠标滚轮滚动消息;`End` 回到底部。
162
+ - 鼠标拖选消息会复制所选文本;`Ctrl` + `Y` 复制最新一条助手回复。
163
+ - 单行文字在输入框和用户消息卡片内上下居中;多行内容向下撑开。
164
+ - 用户消息会以与输入框相同的边框卡片进入对话,助手消息保留 Markdown 排版。
165
+ - Agent 运行时显示 `Working…`,输入框仍可提交后续消息并按顺序排队。
166
+ - 工具状态使用简洁标签:`Edit`、`Command`、`Read`、`Search`、`Context`、`Memory`、`Image`、`Time`、`Calculate`、`Delegate`;完成或失败时原地更新。
167
+
168
+ ```bash
169
+ mindcode # 默认进 shell
170
+ › 在 workspace 创建 hello.txt 写入 hi
171
+ › file_edit (create) hello.txt [WRITE]
172
+ ask_user 将在执行前询问;也可切换到 /permissions full_accept
173
+ ┌─ diff: hello.txt ──────────────────────┐
174
+ │ +hi │
175
+ └─────────────────────────────────────────┘
176
+ › /resume
177
+ › /exit
178
+ ```
179
+
180
+ ### 恢复会话
181
+
182
+ ```bash
183
+ mindcode -r sess-1718530000
184
+ › 我刚才创建了什么文件?
185
+ ```
186
+
187
+ ### 顶层 `mindcode` 参数
188
+
189
+ ```
190
+ mindcode [PROMPT] [-w WORKSPACE] [-a {ask_user,full_accept}]
191
+ [-p PROVIDER] [-m MODEL]
192
+ [-r SESSION_ID] [-s SESSION_ID] [--no-stream] [--subagents]
193
+ [--max-steps N] [--step-timeout SECONDS]
194
+ [--total-timeout SECONDS]
195
+ ```
196
+
197
+ | 参数 | 说明 |
198
+ |---|---|
199
+ | `PROMPT` | 一次性 prompt;省略进入交互模式 |
200
+ | `-w, --workspace` | workspace 根目录(默认 `.`) |
201
+ | `-a, --approve-mode` | 权限模式:`ask_user`(默认,写入和危险操作逐项询问)或 `full_accept`(接受权限上限内的操作风险);`ask`/`full`/`auto` 为兼容别名 |
202
+ | `-p, --provider` | 覆盖 config.toml 中的 default_provider |
203
+ | `-m, --model` | 覆盖 provider 中的 default_model |
204
+ | `-r, --resume` | 恢复指定 session_id |
205
+ | `-s, --session` | 指定新 session_id |
206
+ | `--no-stream` | 关闭流式输出 |
207
+ | `--subagents` | 启用 master/coder 委派模式。master 只允许 `agent_delegate`,coder 负责 workspace 工具调用;委派固定等待结果,不会启动后台任务。 |
208
+ | `--max-steps` | 单个 run 的最大 ReAct step 数(默认 50) |
209
+ | `--step-timeout` | 单步超时秒数(默认 300);`0` 表示禁用 |
210
+ | `--total-timeout` | 绝对总时长上限;普通单代理交互默认禁用,one-shot/Subagent 默认 1800 秒;`0` 表示禁用 |
211
+
212
+ ## 常用命令示例
213
+
214
+ ### task(可后台运行、可恢复)
215
+
216
+ ```bash
217
+ mindcode task run "重构 tests/test_config.py 并保持测试通过" -w /path/to/proj
218
+ mindcode task run "长任务..." --background # 后台运行(-b)
219
+ mindcode task list # 列出任务
220
+ mindcode task status <task_id> # 查看单个任务状态
221
+ mindcode task tail <task_id> -n 50 # 查看最近事件;-f 持续追踪
222
+ mindcode task resume <task_id> -m "继续完成剩余步骤" # 追加消息后语义恢复
223
+ mindcode task cancel <task_id> # 取消任务
224
+ ```
225
+
226
+ ### terminal(本地持久终端)
227
+
228
+ ```bash
229
+ mindcode terminal new # 新建持久终端 session
230
+ mindcode terminal list # 列出 session
231
+ mindcode terminal send <id> "npm test" # 向 session 写入命令
232
+ mindcode terminal tail <id> -n 40 # 查看输出;-f 持续追踪
233
+ mindcode terminal close <id> # 关闭 session
234
+ mindcode terminal open -C /path/to/proj # 在 Ghostty.app 中打开目录
235
+ ```
236
+
237
+ ### remote(SSH 远程)
238
+
239
+ ```bash
240
+ mindcode remote add prod --host root@10.0.0.5 --workdir /srv/app
241
+ mindcode remote add pi --host pi@192.168.1.20 --workdir ~ --port 2222 --key ~/.ssh/id_ed25519
242
+ mindcode remote list # 列出 remote
243
+ mindcode remote show prod # 查看配置(脱敏)
244
+ mindcode remote exec prod "systemctl status app" # 远程执行命令
245
+ mindcode remote tail prod /var/log/app.log -n 80 --follow # 追踪远程日志
246
+ mindcode remote remove prod # 删除 remote
247
+ ```
248
+
249
+ ### bench(评测)
250
+
251
+ ```bash
252
+ mindcode bench list # 列出 suite 与 case 数
253
+ mindcode bench run --suite mini_gaia --limit 5 # 运行评测
254
+ mindcode bench report <run_id> # 汇总评分
255
+ mindcode bench inspect <run_id> # 查看逐 case 详情
256
+ mindcode bench swe-eval --predictions pred.jsonl # SWE-bench 官方评测
257
+ mindcode bench terminal-eval --dataset ./tasks # Terminal-Bench 评测
258
+ ```
259
+
260
+ 内置 suite:`mini_bfcl`、`mini_gaia`、`mini_terminal`(仓库 `benchmarks/` 自带 mini cases)、
261
+ `swe_bench`、`terminal_bench`。run 产物默认写入 `bench_runs/`。
262
+
263
+ ## 测试
264
+
265
+ ```bash
266
+ # 仓库根目录执行
267
+ PYTHONPATH=src:app/mindcode python -m pytest -q app/mindcode/tests
268
+
269
+ # 或在 app/mindcode 目录内
270
+ python -m pytest -q
271
+ ```
272
+
273
+ ## 模块结构
274
+
275
+ ```
276
+ mindcode/
277
+ ├── _version.py # __version__, __logo__
278
+ ├── config.py # MindcodeConfig + ProviderConfig + load/save
279
+ ├── config/ # 内置 model.toml / settings.toml 模板
280
+ ├── runtime.py # build_runtime / build_master_worker_system + DiffingFileEditTool
281
+ ├── approval.py # 审批描述、shell 审批与外部文件只读授权回调
282
+ ├── subagents.py # MasterWorkerSystem 生命周期边界
283
+ ├── policy.py # ApprovalMode + AskUserPolicy/FullAcceptPolicy + ActionAuthorizer
284
+ ├── render.py # RichRenderer(event handler,TUI 工具面板渲染)
285
+ ├── skills.py # Skill / SkillRegistry / SkillLoader(front-matter 指令块)
286
+ ├── mcp.py # MCPClient 协议 + MCPToolAdapter
287
+ ├── tasking.py # TaskStore / TaskEventRecorder(本地任务记录与事件持久化)
288
+ ├── terminal_core.py # TerminalManager + worker 协议(本地持久终端)
289
+ ├── terminal/ # python -m mindcode.terminal 终端 worker 入口
290
+ ├── remote.py # RemoteStore + SSHCommandBuilder + RemoteExecutor
291
+ ├── bench/ # benchmark adapters、runner、scorers、report
292
+ └── cli/
293
+ ├── __init__.py # typer app + DefaultShellGroup(顶层默认入口)
294
+ ├── _shared.py # 共享 console + find_config_file
295
+ ├── commands/
296
+ │ ├── shell.py # 顶层 `mindcode` 默认入口 handler
297
+ │ ├── chat.py # `mindcode chat -m "..."`
298
+ │ ├── status.py # `mindcode status`
299
+ │ ├── config_cmd.py # `mindcode config providers/models/api-key/models-set/...`
300
+ │ ├── task.py # `mindcode task run/resume/list/status/tail/cancel`
301
+ │ ├── terminal.py # `mindcode terminal open/new/list/send/tail/close`
302
+ │ ├── remote.py # `mindcode remote add/list/show/remove/exec/tail`
303
+ │ └── bench.py # `mindcode bench list/run/report/inspect/swe-eval/terminal-eval`
304
+ └── shell/
305
+ ├── repl.py # Shell 类 + REPL 主循环
306
+ ├── slash.py # slash 命令注册与分发
307
+ ├── completion.py # `/` 前缀补全与筛选
308
+ ├── tui.py # 全屏布局、Markdown 消息流与状态栏
309
+ ├── menu.py # interactive_menu(ChoiceInput 包装)
310
+ └── startup.py # build_welcome_banner(Rich Panel)
311
+ ```
312
+
313
+ ## 设计要点
314
+
315
+ - `DiffingFileEditTool` 包装 mindagent 的 `FileEditTool`,在调用前后捕获文件内容,生成 unified diff 注入到 `Observation.result["mindcode_diff"]`。
316
+ - diff 渲染监听 `OBSERVATION_CREATED` 事件而非 `ACTION_FINISHED`,因为 result payload 只在前者。
317
+ - REPL 的 `/permissions` 通过重建当前 runtime 切换 `ask_user` 与 `full_accept`;前者对写入和危险操作逐项询问,后者接受权限上限内的操作风险,切换只影响当前会话。
318
+ - typer app 用自定义 `TyperGroup.parse_args`:无公开子命令时自动注入隐藏的内部 Shell handler,顶层 `mindcode` 因而复用完整参数解析;旧的 `mindcode shell` 语法会返回迁移提示。
319
+ - 全屏 TUI 用 Prompt Toolkit 管理固定输入框和消息视口;Rich 负责 Markdown 与工具输出渲染。
320
+ - ChoiceInput 失败时(旧版 prompt_toolkit)会自动 fallback 到序号输入。
321
+
322
+ ## 文件访问与审批
323
+
324
+ - `SessionPolicy` 与 `RunConfig` 是 Core 检查的权限上限,自定义 Policy、审批回调与
325
+ `full_accept` 都不能绕过。纯 Policy 判断范围,`MindCodeActionAuthorizer` 负责等待 UI。
326
+ - `ask_user` 与 `full_accept` 读取 workspace 外文件时,都需要确认精确路径的此次只读
327
+ 访问。授权绑定 session/run/action、完整参数及文件对象,默认 120 秒内有效且只消费
328
+ 一次;写入、编辑与外部命令工作目录不适用。
329
+ - SDK 可为 `build_runtime()` / `build_master_worker_system()` 注入
330
+ `file_access_callback(context, request)`,返回绑定 `request_id` 的
331
+ `ExternalFileReadDecision`。普通 `approval_callback` 或聊天中的“允许”不能签发它。
332
+ - 外部文件授权审计默认保存在内存,可通过 `file_access_audit_sink(event)` 接入宿主
333
+ 持久化;运行结束会清理未消费的授权,不自动新增磁盘审计文件。
334
+ - 普通问答使用 `USER_INPUT_REQUIRED` 与 `submit_user_input()`;旧 `approve_run()`
335
+ 因未绑定授权请求而被拒绝。
336
+ - `exec_command` 只限制 `cwd`,不会隔离子进程访问的文件。`sed`、`find`、`git diff`
337
+ 等命令保守按写风险审批,具体范围见
338
+ [策略与权限](../../docs/guides/policies-and-approval.md)。
339
+
340
+ ## 局限
341
+
342
+ - 不支持 `/undo`:`exec_command` 的副作用可能不可逆,回滚复杂。
343
+ - 会话恢复只续聊 user/assistant 历史,不恢复 TaskState / Evidence / pending continuation。
344
+ - `task resume` 是重新观察 workspace 后创建新 Run,不会重放未确认的旧 Action。
345
+ - 后台任务目前依赖本机 PID;不提供跨主机监督或精确进程身份恢复。
346
+ - `bench run` 第一版仅支持串行(concurrency=1);`exec_command` 无沙箱,
347
+ SWE-bench / Terminal-Bench 评测依赖本机对应的评测环境。
@@ -0,0 +1,331 @@
1
+ # mindcode
2
+
3
+ 一个能够自我进化的交互式 Coding Agent CLI,构建在 [mindagent](../) 之上。
4
+
5
+ ## 核心能力
6
+
7
+ - workspace 内的代码读取、编辑和命令执行
8
+ - 交互式会话与一次性任务
9
+ - 可选 master/coder subagent 协作(`--subagents`)
10
+ - 支持注入 Skills 与 MCP server 工具(`build_runtime(..., skills=..., mcp_clients=...)`)
11
+ - 前台/后台任务记录和进程重启后的语义恢复
12
+ - 本地持久终端和 SSH 远程命令
13
+ - mini、SWE-bench 和 Terminal-Bench 评测入口
14
+ - 配套 VS Code 聊天插件(`vscode-extension/`)
15
+
16
+ ## 特性
17
+
18
+ - **顶层 Agent 入口**:`mindcode [PROMPT] [选项]` 直接进入交互或 one-shot 模式;`chat` / `status` / `config` 等保留为公开子命令
19
+ - **可选 Subagent 模式**:`mindcode --subagents` 启用受限的 master/coder 协作;master 仅能委派,coder 才能访问 workspace
20
+ - 全屏 TUI:顶部 logo/会话信息、可滚动 Markdown 消息区、固定带边框多行输入框与状态栏
21
+ - 顶部信息栏显示本会话累计 token 消耗;provider 未返回 usage 时显示 `tokens —`
22
+ - Rich 富渲染:Markdown、彩色工具面板、file_edit diff 高亮和流式 LLM 输出
23
+ - TUI 内选择菜单:`/models`、`/permissions` 用方向键选择
24
+ - REPL 权限模式:`ask_user`(默认,写入和危险操作逐项询问)/ `full_accept`(接受权限上限内的操作风险)
25
+ - 会话持久化与恢复:基于 `LocalConversationStore`,存到 `~/.cache/mindcode/sessions/`
26
+ - OpenAI-compatible Provider 配置:首次启动时在 `~/.cache/mindcode/config.toml` 生成 rotor 示例
27
+ - 丰富 slash 命令:`/models` `/compact` `/permissions` `/status` `/resume` `/clear` `/help` `/exit`
28
+
29
+ ## VS Code 插件
30
+
31
+ 与 CLI 配套的 VS Code 聊天插件位于 [`vscode-extension/`](vscode-extension/)。
32
+ 进入该目录并按其 README 构建后,可在 VS Code 中按 `F5` 启动 Extension Development Host。
33
+
34
+ ```bash
35
+ cd vscode-extension
36
+ npm install # 首次
37
+ npm run build:all # 构建 webview 与插件
38
+ npm test # vitest 单测
39
+ ```
40
+
41
+ ## 安装
42
+
43
+ 要求 Python >= 3.10。在 mindcode 目录执行安装:
44
+
45
+ ```bash
46
+ cd /path/to/mindagent/app/mindcode
47
+ pip install -e .
48
+
49
+ mindcode --version # 0.5.0
50
+ ```
51
+
52
+ `pip install -e .` 会根据项目依赖自动从 PyPI 安装 `mindagent>=0.5.3`。
53
+
54
+ ## 文档
55
+
56
+ - `docs/command.md` — TUI slash 命令规范(状态合同:Implemented / Removed / Proposed / Blocked)
57
+ - `docs/usage.md` — 配置与日常命令示例
58
+ - `docs/design/architecture.md` — 架构设计
59
+ - `docs/devlog/` — 需求、roadmap 与各功能设计记录
60
+ - `docs/wiki/` — channels、remote、terminal sessions 等专题
61
+ - `docs/buglist.md` — 已知问题清单
62
+ - `../../docs/guides/policies-and-approval.md` — mindagent 侧策略与审批详解
63
+
64
+ ## 命令结构
65
+
66
+ ```
67
+ mindcode [PROMPT] [选项] # 交互式 REPL;提供 PROMPT 时为 one-shot
68
+ mindcode chat -m "..." [选项] # 一次性 prompt(参数与顶层入口基本一致)
69
+ mindcode status # 显示全局状态
70
+ mindcode task <subcmd> # 任务:run / resume / list / status / tail / cancel
71
+ mindcode terminal <subcmd> # 本地终端:open / new / list / send / tail / close
72
+ mindcode remote <subcmd> # SSH 远程:add / list / show / remove / exec / tail
73
+ mindcode bench <subcmd> # 评测:list / run / report / inspect / swe-eval / terminal-eval
74
+ mindcode config <subcmd> # 配置管理
75
+ mindcode config providers # 列出所有 provider
76
+ mindcode config models <provider> # 列出 provider 的模型
77
+ mindcode config models-set <p> ... # 设置 model_list;第一个模型成为 default_model
78
+ mindcode config api-key <p> <k> # 设置 api_key
79
+ mindcode config get <p> <field> # 读取字段
80
+ mindcode config set <p> <f> <v> # 修改字段
81
+ mindcode config list # 显示完整配置(脱敏)
82
+ mindcode config path # 显示配置文件路径
83
+ mindcode --version
84
+ mindcode --help
85
+ ```
86
+
87
+ ## 配置
88
+
89
+ 首次启动 `mindcode` 会自动在 `~/.cache/mindcode/config.toml` 创建一个
90
+ OpenAI-compatible rotor 示例。默认地址是本机 `http://127.0.0.1:8000/v1`,使用前应按实际网关修改。
91
+
92
+ 模板节选:
93
+
94
+ ```toml
95
+ default_provider = "rotor"
96
+
97
+ [providers.rotor]
98
+ protocol = "openai"
99
+ api_key = ""
100
+ base_url = "http://127.0.0.1:8000/v1"
101
+ default_model = "glm-5.2"
102
+ models = ["glm-5.2", "glm-5.1", "glm-4.7"]
103
+ ```
104
+
105
+ ### 方式 A:命令行(脚本化)
106
+
107
+ ```bash
108
+ mindcode config api-key rotor sk-xxxxxxxxxxxx # 设置密钥
109
+ mindcode config providers # 列出所有 provider
110
+ mindcode config models rotor # 列出 rotor 的模型
111
+ mindcode config set rotor default_model glm-5.1
112
+ mindcode config list # 完整配置(脱敏)
113
+ ```
114
+
115
+ ### 方式 B:REPL 内 slash 命令(交互式)
116
+
117
+ ```
118
+ /models # 方向键选择切换
119
+ /compact # 生成摘要以压缩会话上下文
120
+ /permissions # Ask User / Full Accept
121
+ /resume # 列出并恢复本地保存的历史 session
122
+ /status # 当前历史 session 状态与上下文使用
123
+ /help # 完整命令列表
124
+ ```
125
+
126
+ 也可直接编辑 `~/.cache/mindcode/config.toml`。
127
+
128
+ ## 使用
129
+
130
+ ### 一次性模式
131
+
132
+ ```bash
133
+ mindcode chat -m "读取 README.md 的前 5 行并总结"
134
+ # 或
135
+ mindcode "读取 README.md 的前 5 行并总结"
136
+ # 需要 master/coder 协作时(默认仍为单 agent)
137
+ mindcode --subagents "审查当前改动并运行相关测试"
138
+ ```
139
+
140
+ ### 交互模式
141
+
142
+ - `Enter` 发送;`Esc` + `Enter` 插入换行;多行输入框会自动增高。
143
+ - 输入 `/` 显示全部 slash 命令;继续输入会筛选。`↑` / `↓` 选择,`Enter` 先填入默认第一项,再按一次才执行。
144
+ - `/models` 与 `/permissions` 使用统一的灰阶选择框:`↑` / `↓` 切换,`Enter` 应用,`Esc` 取消;需要自由输入参数时仍在底部输入框内编辑和粘贴。
145
+ - `Page Up` / `Page Down` 或鼠标滚轮滚动消息;`End` 回到底部。
146
+ - 鼠标拖选消息会复制所选文本;`Ctrl` + `Y` 复制最新一条助手回复。
147
+ - 单行文字在输入框和用户消息卡片内上下居中;多行内容向下撑开。
148
+ - 用户消息会以与输入框相同的边框卡片进入对话,助手消息保留 Markdown 排版。
149
+ - Agent 运行时显示 `Working…`,输入框仍可提交后续消息并按顺序排队。
150
+ - 工具状态使用简洁标签:`Edit`、`Command`、`Read`、`Search`、`Context`、`Memory`、`Image`、`Time`、`Calculate`、`Delegate`;完成或失败时原地更新。
151
+
152
+ ```bash
153
+ mindcode # 默认进 shell
154
+ › 在 workspace 创建 hello.txt 写入 hi
155
+ › file_edit (create) hello.txt [WRITE]
156
+ ask_user 将在执行前询问;也可切换到 /permissions full_accept
157
+ ┌─ diff: hello.txt ──────────────────────┐
158
+ │ +hi │
159
+ └─────────────────────────────────────────┘
160
+ › /resume
161
+ › /exit
162
+ ```
163
+
164
+ ### 恢复会话
165
+
166
+ ```bash
167
+ mindcode -r sess-1718530000
168
+ › 我刚才创建了什么文件?
169
+ ```
170
+
171
+ ### 顶层 `mindcode` 参数
172
+
173
+ ```
174
+ mindcode [PROMPT] [-w WORKSPACE] [-a {ask_user,full_accept}]
175
+ [-p PROVIDER] [-m MODEL]
176
+ [-r SESSION_ID] [-s SESSION_ID] [--no-stream] [--subagents]
177
+ [--max-steps N] [--step-timeout SECONDS]
178
+ [--total-timeout SECONDS]
179
+ ```
180
+
181
+ | 参数 | 说明 |
182
+ |---|---|
183
+ | `PROMPT` | 一次性 prompt;省略进入交互模式 |
184
+ | `-w, --workspace` | workspace 根目录(默认 `.`) |
185
+ | `-a, --approve-mode` | 权限模式:`ask_user`(默认,写入和危险操作逐项询问)或 `full_accept`(接受权限上限内的操作风险);`ask`/`full`/`auto` 为兼容别名 |
186
+ | `-p, --provider` | 覆盖 config.toml 中的 default_provider |
187
+ | `-m, --model` | 覆盖 provider 中的 default_model |
188
+ | `-r, --resume` | 恢复指定 session_id |
189
+ | `-s, --session` | 指定新 session_id |
190
+ | `--no-stream` | 关闭流式输出 |
191
+ | `--subagents` | 启用 master/coder 委派模式。master 只允许 `agent_delegate`,coder 负责 workspace 工具调用;委派固定等待结果,不会启动后台任务。 |
192
+ | `--max-steps` | 单个 run 的最大 ReAct step 数(默认 50) |
193
+ | `--step-timeout` | 单步超时秒数(默认 300);`0` 表示禁用 |
194
+ | `--total-timeout` | 绝对总时长上限;普通单代理交互默认禁用,one-shot/Subagent 默认 1800 秒;`0` 表示禁用 |
195
+
196
+ ## 常用命令示例
197
+
198
+ ### task(可后台运行、可恢复)
199
+
200
+ ```bash
201
+ mindcode task run "重构 tests/test_config.py 并保持测试通过" -w /path/to/proj
202
+ mindcode task run "长任务..." --background # 后台运行(-b)
203
+ mindcode task list # 列出任务
204
+ mindcode task status <task_id> # 查看单个任务状态
205
+ mindcode task tail <task_id> -n 50 # 查看最近事件;-f 持续追踪
206
+ mindcode task resume <task_id> -m "继续完成剩余步骤" # 追加消息后语义恢复
207
+ mindcode task cancel <task_id> # 取消任务
208
+ ```
209
+
210
+ ### terminal(本地持久终端)
211
+
212
+ ```bash
213
+ mindcode terminal new # 新建持久终端 session
214
+ mindcode terminal list # 列出 session
215
+ mindcode terminal send <id> "npm test" # 向 session 写入命令
216
+ mindcode terminal tail <id> -n 40 # 查看输出;-f 持续追踪
217
+ mindcode terminal close <id> # 关闭 session
218
+ mindcode terminal open -C /path/to/proj # 在 Ghostty.app 中打开目录
219
+ ```
220
+
221
+ ### remote(SSH 远程)
222
+
223
+ ```bash
224
+ mindcode remote add prod --host root@10.0.0.5 --workdir /srv/app
225
+ mindcode remote add pi --host pi@192.168.1.20 --workdir ~ --port 2222 --key ~/.ssh/id_ed25519
226
+ mindcode remote list # 列出 remote
227
+ mindcode remote show prod # 查看配置(脱敏)
228
+ mindcode remote exec prod "systemctl status app" # 远程执行命令
229
+ mindcode remote tail prod /var/log/app.log -n 80 --follow # 追踪远程日志
230
+ mindcode remote remove prod # 删除 remote
231
+ ```
232
+
233
+ ### bench(评测)
234
+
235
+ ```bash
236
+ mindcode bench list # 列出 suite 与 case 数
237
+ mindcode bench run --suite mini_gaia --limit 5 # 运行评测
238
+ mindcode bench report <run_id> # 汇总评分
239
+ mindcode bench inspect <run_id> # 查看逐 case 详情
240
+ mindcode bench swe-eval --predictions pred.jsonl # SWE-bench 官方评测
241
+ mindcode bench terminal-eval --dataset ./tasks # Terminal-Bench 评测
242
+ ```
243
+
244
+ 内置 suite:`mini_bfcl`、`mini_gaia`、`mini_terminal`(仓库 `benchmarks/` 自带 mini cases)、
245
+ `swe_bench`、`terminal_bench`。run 产物默认写入 `bench_runs/`。
246
+
247
+ ## 测试
248
+
249
+ ```bash
250
+ # 仓库根目录执行
251
+ PYTHONPATH=src:app/mindcode python -m pytest -q app/mindcode/tests
252
+
253
+ # 或在 app/mindcode 目录内
254
+ python -m pytest -q
255
+ ```
256
+
257
+ ## 模块结构
258
+
259
+ ```
260
+ mindcode/
261
+ ├── _version.py # __version__, __logo__
262
+ ├── config.py # MindcodeConfig + ProviderConfig + load/save
263
+ ├── config/ # 内置 model.toml / settings.toml 模板
264
+ ├── runtime.py # build_runtime / build_master_worker_system + DiffingFileEditTool
265
+ ├── approval.py # 审批描述、shell 审批与外部文件只读授权回调
266
+ ├── subagents.py # MasterWorkerSystem 生命周期边界
267
+ ├── policy.py # ApprovalMode + AskUserPolicy/FullAcceptPolicy + ActionAuthorizer
268
+ ├── render.py # RichRenderer(event handler,TUI 工具面板渲染)
269
+ ├── skills.py # Skill / SkillRegistry / SkillLoader(front-matter 指令块)
270
+ ├── mcp.py # MCPClient 协议 + MCPToolAdapter
271
+ ├── tasking.py # TaskStore / TaskEventRecorder(本地任务记录与事件持久化)
272
+ ├── terminal_core.py # TerminalManager + worker 协议(本地持久终端)
273
+ ├── terminal/ # python -m mindcode.terminal 终端 worker 入口
274
+ ├── remote.py # RemoteStore + SSHCommandBuilder + RemoteExecutor
275
+ ├── bench/ # benchmark adapters、runner、scorers、report
276
+ └── cli/
277
+ ├── __init__.py # typer app + DefaultShellGroup(顶层默认入口)
278
+ ├── _shared.py # 共享 console + find_config_file
279
+ ├── commands/
280
+ │ ├── shell.py # 顶层 `mindcode` 默认入口 handler
281
+ │ ├── chat.py # `mindcode chat -m "..."`
282
+ │ ├── status.py # `mindcode status`
283
+ │ ├── config_cmd.py # `mindcode config providers/models/api-key/models-set/...`
284
+ │ ├── task.py # `mindcode task run/resume/list/status/tail/cancel`
285
+ │ ├── terminal.py # `mindcode terminal open/new/list/send/tail/close`
286
+ │ ├── remote.py # `mindcode remote add/list/show/remove/exec/tail`
287
+ │ └── bench.py # `mindcode bench list/run/report/inspect/swe-eval/terminal-eval`
288
+ └── shell/
289
+ ├── repl.py # Shell 类 + REPL 主循环
290
+ ├── slash.py # slash 命令注册与分发
291
+ ├── completion.py # `/` 前缀补全与筛选
292
+ ├── tui.py # 全屏布局、Markdown 消息流与状态栏
293
+ ├── menu.py # interactive_menu(ChoiceInput 包装)
294
+ └── startup.py # build_welcome_banner(Rich Panel)
295
+ ```
296
+
297
+ ## 设计要点
298
+
299
+ - `DiffingFileEditTool` 包装 mindagent 的 `FileEditTool`,在调用前后捕获文件内容,生成 unified diff 注入到 `Observation.result["mindcode_diff"]`。
300
+ - diff 渲染监听 `OBSERVATION_CREATED` 事件而非 `ACTION_FINISHED`,因为 result payload 只在前者。
301
+ - REPL 的 `/permissions` 通过重建当前 runtime 切换 `ask_user` 与 `full_accept`;前者对写入和危险操作逐项询问,后者接受权限上限内的操作风险,切换只影响当前会话。
302
+ - typer app 用自定义 `TyperGroup.parse_args`:无公开子命令时自动注入隐藏的内部 Shell handler,顶层 `mindcode` 因而复用完整参数解析;旧的 `mindcode shell` 语法会返回迁移提示。
303
+ - 全屏 TUI 用 Prompt Toolkit 管理固定输入框和消息视口;Rich 负责 Markdown 与工具输出渲染。
304
+ - ChoiceInput 失败时(旧版 prompt_toolkit)会自动 fallback 到序号输入。
305
+
306
+ ## 文件访问与审批
307
+
308
+ - `SessionPolicy` 与 `RunConfig` 是 Core 检查的权限上限,自定义 Policy、审批回调与
309
+ `full_accept` 都不能绕过。纯 Policy 判断范围,`MindCodeActionAuthorizer` 负责等待 UI。
310
+ - `ask_user` 与 `full_accept` 读取 workspace 外文件时,都需要确认精确路径的此次只读
311
+ 访问。授权绑定 session/run/action、完整参数及文件对象,默认 120 秒内有效且只消费
312
+ 一次;写入、编辑与外部命令工作目录不适用。
313
+ - SDK 可为 `build_runtime()` / `build_master_worker_system()` 注入
314
+ `file_access_callback(context, request)`,返回绑定 `request_id` 的
315
+ `ExternalFileReadDecision`。普通 `approval_callback` 或聊天中的“允许”不能签发它。
316
+ - 外部文件授权审计默认保存在内存,可通过 `file_access_audit_sink(event)` 接入宿主
317
+ 持久化;运行结束会清理未消费的授权,不自动新增磁盘审计文件。
318
+ - 普通问答使用 `USER_INPUT_REQUIRED` 与 `submit_user_input()`;旧 `approve_run()`
319
+ 因未绑定授权请求而被拒绝。
320
+ - `exec_command` 只限制 `cwd`,不会隔离子进程访问的文件。`sed`、`find`、`git diff`
321
+ 等命令保守按写风险审批,具体范围见
322
+ [策略与权限](../../docs/guides/policies-and-approval.md)。
323
+
324
+ ## 局限
325
+
326
+ - 不支持 `/undo`:`exec_command` 的副作用可能不可逆,回滚复杂。
327
+ - 会话恢复只续聊 user/assistant 历史,不恢复 TaskState / Evidence / pending continuation。
328
+ - `task resume` 是重新观察 workspace 后创建新 Run,不会重放未确认的旧 Action。
329
+ - 后台任务目前依赖本机 PID;不提供跨主机监督或精确进程身份恢复。
330
+ - `bench run` 第一版仅支持串行(concurrency=1);`exec_command` 无沙箱,
331
+ SWE-bench / Terminal-Bench 评测依赖本机对应的评测环境。