min-agent 0.2.1 → 0.4.0
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.
- package/README.md +242 -31
- package/dist/agent.js +1233 -485
- package/dist/assistant-stream.js +11 -7
- package/dist/cli/commands/chat.js +10 -0
- package/dist/cli/commands/exec.js +32 -0
- package/dist/cli/commands/history.js +58 -0
- package/dist/cli/commands/index.js +224 -0
- package/dist/cli/commands/init.js +18 -0
- package/dist/cli/commands/mcp.js +173 -0
- package/dist/cli/commands/memory.js +69 -0
- package/dist/cli/commands/models.js +21 -0
- package/dist/cli/commands/permission.js +12 -0
- package/dist/cli/commands/rules.js +33 -0
- package/dist/cli/commands/sandbox.js +13 -0
- package/dist/cli/commands/serve.js +9 -0
- package/dist/cli/commands/setup.js +4 -0
- package/dist/cli/commands/shared.js +16 -0
- package/dist/cli/commands/skills.js +119 -0
- package/dist/cli/commands/update.js +7 -0
- package/dist/cli/commands/write-config.js +30 -0
- package/dist/cli/errors.js +36 -0
- package/dist/cli/exec-prompt.js +26 -0
- package/dist/cli/option-helpers.js +53 -0
- package/dist/cli/program.js +180 -0
- package/dist/cli.js +7 -632
- package/dist/clipboard.js +59 -23
- package/dist/code-mode.js +35 -17
- package/dist/compaction.js +457 -169
- package/dist/config.js +298 -38
- package/dist/confirm.js +105 -9
- package/dist/context-window.js +156 -75
- package/dist/doom-loop.js +268 -26
- package/dist/fetch-timeout.js +152 -0
- package/dist/http-approvals.js +60 -0
- package/dist/http.js +119 -0
- package/dist/instructions.js +72 -33
- package/dist/logger.js +95 -0
- package/dist/markdown.js +35 -50
- package/dist/mcp.js +847 -102
- package/dist/memory.js +128 -45
- package/dist/output.js +42 -31
- package/dist/paste-handler.js +3 -3
- package/dist/permission-cli.js +43 -0
- package/dist/plugins.js +76 -11
- package/dist/pricing.js +119 -0
- package/dist/provider.js +34 -15
- package/dist/question-format.js +60 -0
- package/dist/sandbox-cli.js +82 -0
- package/dist/sandbox.js +403 -0
- package/dist/save-throttle.js +45 -0
- package/dist/serve/common.js +404 -0
- package/dist/serve/routes-chat.js +347 -0
- package/dist/serve/routes-mcp.js +212 -0
- package/dist/serve/routes-memory.js +66 -0
- package/dist/serve/routes-meta.js +205 -0
- package/dist/serve/routes-sessions.js +61 -0
- package/dist/serve/routes-skills.js +70 -0
- package/dist/serve.js +74 -635
- package/dist/sessions.js +197 -15
- package/dist/skills.js +531 -77
- package/dist/synthetic.js +7 -0
- package/dist/title-gen.js +9 -2
- package/dist/token-display.js +36 -0
- package/dist/tool-display.js +178 -0
- package/dist/tool-output.js +53 -46
- package/dist/tools/apply_patch.js +265 -0
- package/dist/tools/atomic-file.js +35 -0
- package/dist/tools/backend.js +61 -0
- package/dist/tools/bash.js +186 -71
- package/dist/tools/code_search.js +13 -6
- package/dist/tools/edit.js +26 -9
- package/dist/tools/explore.js +144 -16
- package/dist/tools/glob.js +7 -3
- package/dist/tools/grep.js +153 -14
- package/dist/tools/index.js +9 -24
- package/dist/tools/question.js +31 -30
- package/dist/tools/read.js +77 -15
- package/dist/tools/search-searxng.js +223 -0
- package/dist/tools/search-serper.js +189 -0
- package/dist/tools/task.js +100 -33
- package/dist/tools/todo.js +178 -67
- package/dist/tools/web_fetch.js +158 -46
- package/dist/tools/web_search.js +217 -29
- package/dist/tools/write.js +34 -11
- package/dist/tui/App.js +89 -6
- package/dist/tui/ConfirmBar.js +57 -4
- package/dist/tui/InputBar.js +504 -44
- package/dist/tui/MessageList.js +674 -20
- package/dist/tui/ModelPicker.js +113 -0
- package/dist/tui/QuestionBar.js +136 -0
- package/dist/tui/SessionPicker.js +79 -0
- package/dist/tui/StatusBar.js +14 -12
- package/dist/tui/agent-runner.js +223 -0
- package/dist/tui/caret-pos.js +177 -0
- package/dist/tui/caret.js +69 -0
- package/dist/tui/click-count.js +13 -0
- package/dist/tui/diff-view.js +61 -0
- package/dist/tui/drag-state.js +49 -0
- package/dist/tui/hydrate.js +129 -0
- package/dist/tui/index.js +189 -31
- package/dist/tui/input-history.js +125 -0
- package/dist/tui/layout.js +88 -0
- package/dist/tui/mouse.js +46 -0
- package/dist/tui/prompt-queue.js +24 -0
- package/dist/tui/selection.js +226 -0
- package/dist/tui/session-switch.js +28 -0
- package/dist/tui/slash-commands.js +106 -0
- package/dist/tui/slash-handler.js +545 -0
- package/dist/tui/text-width.js +113 -0
- package/dist/tui/theme.js +12 -0
- package/dist/tui/token-info.js +7 -0
- package/dist/tui/tool-children.js +19 -0
- package/dist/tui/undo-stack.js +14 -0
- package/dist/tui/use-sgr-mouse.js +29 -0
- package/dist/tui-chat.js +346 -330
- package/dist/updater.js +116 -0
- package/dist/xml-search.js +194 -0
- package/docs/API.md +410 -32
- package/docs/superpowers/plans/2026-08-16-batch1-tui-improvements.md +1510 -0
- package/docs/superpowers/plans/2026-08-16-batch2-cli-tools-api.md +2105 -0
- package/docs/superpowers/plans/2026-08-16-batch3-config-engineering.md +1595 -0
- package/docs/superpowers/plans/2026-08-16-input-caret.md +782 -0
- package/docs/superpowers/plans/2026-08-20-tui-completeness.md +873 -0
- package/docs/superpowers/plans/2026-08-20-unified-tui-default.md +631 -0
- package/docs/superpowers/specs/2026-08-16-batch1-tui-improvements-design.md +183 -0
- package/docs/superpowers/specs/2026-08-16-batch2-cli-tools-api-design.md +220 -0
- package/docs/superpowers/specs/2026-08-16-batch3-config-engineering-design.md +196 -0
- package/docs/superpowers/specs/2026-08-16-input-caret-design.md +63 -0
- package/docs/superpowers/specs/2026-08-17-mouse-selection-design.md +116 -0
- package/docs/superpowers/specs/2026-08-20-config-http-alignment-design.md +47 -0
- package/docs/superpowers/specs/2026-08-20-mcp-plugins-alignment-design.md +37 -0
- package/docs/superpowers/specs/2026-08-20-sandbox-permissions-design.md +68 -0
- package/docs/superpowers/specs/2026-08-20-tui-completeness-design.md +273 -0
- package/docs/superpowers/specs/2026-08-20-unified-tui-default-design.md +165 -0
- package/package.json +12 -8
- package/skills/self-config/SKILL.md +90 -0
- package/skills/self-config/reference.md +149 -0
package/docs/API.md
CHANGED
|
@@ -16,6 +16,12 @@ min-agent serve --host 0.0.0.0 --port 3000
|
|
|
16
16
|
| `MIN_AGENT_SERVE_TOKEN` | Bearer token 鉴权 |
|
|
17
17
|
| `MIN_AGENT_SERVE_CORS` | 设为 `1` 启用 CORS |
|
|
18
18
|
|
|
19
|
+
> 安全:当监听地址不是 loopback(`127.0.0.1`/`::1`/`localhost`)时,必须设置 `MIN_AGENT_SERVE_TOKEN`,否则服务拒绝启动。`/v1/chat`、`/v1/code` 与 `/v1/paste` 最多支持 8 个并发请求,超出返回 `429`。
|
|
20
|
+
>
|
|
21
|
+
> CORS 未设置 token 时仅允许 localhost Origin(无 Origin 头的请求不受限);非 localhost Origin 返回 `403 origin_not_allowed`。设置 `MIN_AGENT_SERVE_TOKEN` 后不受 Origin 限制。
|
|
22
|
+
>
|
|
23
|
+
> 会话 ID 仅接受 `[A-Za-z0-9_-]+`,非法 ID 一律返回 404/400,防止路径穿越。
|
|
24
|
+
|
|
19
25
|
---
|
|
20
26
|
|
|
21
27
|
## 端点一览
|
|
@@ -24,25 +30,50 @@ min-agent serve --host 0.0.0.0 --port 3000
|
|
|
24
30
|
|------|------|------|
|
|
25
31
|
| GET | `/health` | 存活检查 |
|
|
26
32
|
| GET | `/v1/meta` | 运行环境 |
|
|
33
|
+
| GET | `/v1/update` | 检查 npm 是否有新版本(不执行安装) |
|
|
27
34
|
| GET | `/v1/models` | 模型列表 |
|
|
28
35
|
| GET | `/v1/context` | 上下文窗口信息 |
|
|
29
36
|
| GET | `/v1/project` | 项目扫描 |
|
|
30
|
-
| POST | `/v1/chat` |
|
|
31
|
-
| POST | `/v1/code` |
|
|
37
|
+
| POST | `/v1/chat` | 对话(项目感知) |
|
|
38
|
+
| POST | `/v1/code` | 与 `/v1/chat` 相同(兼容路径) |
|
|
32
39
|
| POST | `/v1/paste` | 图片+文本对话 |
|
|
33
40
|
| POST | `/v1/chat/compact` | 手动压缩会话 |
|
|
34
41
|
| POST | `/v1/chat/reload-instructions` | 重载规则 |
|
|
42
|
+
| POST | `/v1/chat/redo` | 重发会话最后一条用户消息 |
|
|
35
43
|
| GET | `/v1/sessions` | 列出会话 |
|
|
36
44
|
| DELETE | `/v1/sessions/:id` | 删除会话 |
|
|
37
|
-
| GET | `/v1/memory` |
|
|
45
|
+
| GET | `/v1/memory` | 列出记忆(含 `project_memories`) |
|
|
38
46
|
| POST | `/v1/memory` | 添加记忆 |
|
|
39
47
|
| GET | `/v1/memory/search?q=xxx` | 搜索记忆 |
|
|
40
48
|
| DELETE | `/v1/memory/:index` | 删除记忆 |
|
|
49
|
+
| GET | `/v1/budget` | 当前预算上限 |
|
|
50
|
+
| POST | `/v1/budget` | 设置预算上限 |
|
|
51
|
+
| GET | `/v1/permission` | 当前确认模式 |
|
|
52
|
+
| POST | `/v1/permission` | 设置确认模式 |
|
|
53
|
+
| GET | `/v1/sandbox` | 当前隔离策略 |
|
|
54
|
+
| POST | `/v1/sandbox` | 设置隔离策略 |
|
|
55
|
+
| GET | `/v1/diff` | 工作区未提交变更 |
|
|
56
|
+
| POST | `/v1/approvals` | 回答危险操作确认 |
|
|
57
|
+
| POST | `/v1/answers` | 回答代理提问 |
|
|
41
58
|
| GET | `/v1/mcp` | MCP 状态 |
|
|
59
|
+
| GET | `/v1/mcp/:name/resources` | 列出资源与 URI 模板 |
|
|
60
|
+
| GET | `/v1/mcp/:name/prompts` | 列出 prompt 模板 |
|
|
61
|
+
| POST | `/v1/mcp/:name/resources/read` | 读取一条资源 |
|
|
62
|
+
| POST | `/v1/mcp/:name/prompts/get` | 填充一条 prompt |
|
|
42
63
|
| POST | `/v1/mcp` | 添加 MCP 服务器 |
|
|
43
64
|
| DELETE | `/v1/mcp/:name` | 删除 MCP 服务器 |
|
|
44
|
-
| GET | `/v1/skills` |
|
|
65
|
+
| GET | `/v1/skills` | 技能列表(含启用状态) |
|
|
66
|
+
| GET | `/v1/skills/:name` | 技能详情(含正文) |
|
|
67
|
+
| POST | `/v1/skills/reload` | 重新扫描技能目录 |
|
|
45
68
|
| GET | `/v1/rules` | 已加载规则 |
|
|
69
|
+
| GET | `/v1/sessions/:id` | 会话详情 |
|
|
70
|
+
| POST | `/v1/sessions/:id/rename` | 重命名会话 |
|
|
71
|
+
| POST | `/v1/chat/undo` | 撤销最后一轮 |
|
|
72
|
+
| POST | `/v1/skills/:name/enable` | 启用技能 |
|
|
73
|
+
| POST | `/v1/skills/:name/disable` | 禁用技能 |
|
|
74
|
+
| POST | `/v1/mcp/:name/enable` | 启用 MCP 服务器 |
|
|
75
|
+
| POST | `/v1/mcp/:name/disable` | 禁用 MCP 服务器 |
|
|
76
|
+
| GET | `/v1/cost` | 模型价格与成本估算 |
|
|
46
77
|
|
|
47
78
|
---
|
|
48
79
|
|
|
@@ -55,9 +86,25 @@ min-agent serve --host 0.0.0.0 --port 3000
|
|
|
55
86
|
## `GET /v1/meta`
|
|
56
87
|
|
|
57
88
|
```json
|
|
58
|
-
{ "version": "0.1.0", "cwd": "/path/to/project", "instructions_chars": 1234 }
|
|
89
|
+
{ "version": "0.1.0", "cwd": "/path/to/project", "instructions_chars": 1234, "sandbox": { "mode": "off", "network": "allow", "extraWriteRoots": [], "extraReadRoots": [], "source": null, "label": "未隔离,允许联网" }, "permission": { "permission": "ask", "source": null, "label": "询问确认" } }
|
|
59
90
|
```
|
|
60
91
|
|
|
92
|
+
## `GET /v1/update`
|
|
93
|
+
|
|
94
|
+
查询当前运行版本与 npm 上的最新版本。此接口只检查,不会执行 `npm install`。
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{ "current": "0.3.0", "latest": "0.3.1", "update_available": true }
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
无法访问 npm registry 时:
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{ "current": "0.3.0", "latest": null, "update_available": false, "error": "registry_unavailable" }
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
CLI 升级请使用 `min-agent update`(执行 `npm install -g min-agent`)。
|
|
107
|
+
|
|
61
108
|
## `GET /v1/models`
|
|
62
109
|
|
|
63
110
|
```json
|
|
@@ -67,9 +114,11 @@ min-agent serve --host 0.0.0.0 --port 3000
|
|
|
67
114
|
## `GET /v1/context`
|
|
68
115
|
|
|
69
116
|
```json
|
|
70
|
-
{ "context_window":
|
|
117
|
+
{ "context_window": 1000000, "source": "config", "model": "gpt-4o" }
|
|
71
118
|
```
|
|
72
119
|
|
|
120
|
+
`source` 为 `config`(配置中的 `contextWindow`)、`detected`(从接口读到)或 `fallback`(未读到,按 512k 处理)。
|
|
121
|
+
|
|
73
122
|
## `GET /v1/project`
|
|
74
123
|
|
|
75
124
|
```json
|
|
@@ -97,9 +146,21 @@ min-agent serve --host 0.0.0.0 --port 3000
|
|
|
97
146
|
| `message` | string | 用户消息(与 `messages` 二选一) |
|
|
98
147
|
| `messages` | array | 完整 ModelMessage[] |
|
|
99
148
|
| `model` | string | 覆盖模型 |
|
|
149
|
+
| `provider` | string | 指定 provider(默认 activeProvider) |
|
|
100
150
|
| `stream` | boolean | SSE 流式 |
|
|
101
151
|
| `session_id` | string | 恢复会话 |
|
|
102
152
|
| `images` | string[] | 本地图片路径 |
|
|
153
|
+
| `temperature` | number | 采样温度(透传模型 API) |
|
|
154
|
+
| `maxTokens` | number | 最大输出 token 数 |
|
|
155
|
+
| `topP` | number | 核采样参数 |
|
|
156
|
+
| `plan_mode` | boolean | 只读计划模式(去掉写入类工具) |
|
|
157
|
+
| `auto_approve` | boolean | 默认 `true`。设为 `false` 时必须 `stream: true`,并通过 `POST /v1/approvals` / `POST /v1/answers` 回调 |
|
|
158
|
+
| `sandbox` | string | 本轮隔离:`off` / `workspace` / `strict`。只能比服务当前策略更严,不能放宽 |
|
|
159
|
+
| `network` | string | 本轮联网:`allow` / `deny`。`deny` 只能收紧 |
|
|
160
|
+
|
|
161
|
+
`auto_approve: false` 且未开流式时返回 `400 auto_approve_requires_stream`。确认/提问最多等待 5 分钟,超时视为拒绝或跳过。客户端断开连接时未完成的确认视为拒绝。
|
|
162
|
+
|
|
163
|
+
`max_steps_reached` 为 `true` 表示本轮已用尽自动续跑次数(上下文压缩/空回复等),或显式设置了 `agent.maxSteps` 且已到达该上限。默认不按固定步数切断一轮生成。`incomplete` 为 `true` 表示模型在调用工具后没有给出完整回复,或连续多次空回复。`stopped` 为 `true` 表示因同一操作反复执行而主动结束本轮。`empty_response` 为 `true` 表示 provider 连续返回空流(HTTP 200 但没有任何内容,多为上游超时/限流),`empty_attempts` 为已尝试次数;这类空回复会以原请求重发重试(首次立即,之后指数退避),可用 `agent.maxEmptyAttempts`(默认 4)与 `agent.emptyRetryDelayMs`(默认 1000)调整。发送下一条消息即可继续。`continues` 为本轮实际自动续跑次数。`task_state` 为当前任务目标与待办列表,会写入会话并在压缩后保留。网页检索连续过久、或检索后尚未写出用户要求的结果时,代理会改为基于已有资料产出结果;本轮内再调用搜索/抓取会收到停止检索并直接产出的提示,而不是新的检索结果(即使 `autoContinue` 为 `false`)。
|
|
103
164
|
|
|
104
165
|
### 非流式响应
|
|
105
166
|
|
|
@@ -112,11 +173,23 @@ min-agent serve --host 0.0.0.0 --port 3000
|
|
|
112
173
|
"session_id": "abc123",
|
|
113
174
|
"step_count": 2,
|
|
114
175
|
"usage": { "inputTokens": 1200, "outputTokens": 300 },
|
|
176
|
+
"context_tokens": 1200,
|
|
115
177
|
"has_error": false,
|
|
116
|
-
"aborted": false
|
|
178
|
+
"aborted": false,
|
|
179
|
+
"max_steps_reached": false,
|
|
180
|
+
"incomplete": false,
|
|
181
|
+
"budget_exceeded": false,
|
|
182
|
+
"continues": 0,
|
|
183
|
+
"stopped": false,
|
|
184
|
+
"empty_response": false,
|
|
185
|
+
"empty_attempts": 0,
|
|
186
|
+
"task_state": { "goal": "...", "todos": [], "nextId": 1 },
|
|
187
|
+
"project": { "languages": [...], "directory": "...", "...": "..." }
|
|
117
188
|
}
|
|
118
189
|
```
|
|
119
190
|
|
|
191
|
+
`usage` 为本轮各次模型请求的 token 合计(计费口径;多步工具调用会把每次请求的 input 加总)。`context_tokens` 为最近一次请求占用的上下文大小,用来衡量窗口占用,不要把 `usage.inputTokens` 当占用百分比的分子。
|
|
192
|
+
|
|
120
193
|
### 流式 SSE 事件
|
|
121
194
|
|
|
122
195
|
| type | 字段 | 说明 |
|
|
@@ -126,20 +199,18 @@ min-agent serve --host 0.0.0.0 --port 3000
|
|
|
126
199
|
| `tool_call` | name, input | 工具调用 |
|
|
127
200
|
| `tool_result` | name, output | 工具返回 |
|
|
128
201
|
| `compaction` | line | 压缩进度 |
|
|
202
|
+
| `notice` | kind, attempt, max_attempts, delay_ms | 提示(目前只有 `kind: "empty_response"`,表示 provider 返回空流后即将重发同一请求) |
|
|
129
203
|
| `error` | message | 错误 |
|
|
130
|
-
| `done` | step_count, usage, messages, session_id | 结束 |
|
|
204
|
+
| `done` | step_count, usage, context_tokens, has_error, aborted, max_steps_reached, incomplete, budget_exceeded, continues, stopped, empty_response, empty_attempts, messages, session_id, task_state, project | 结束 |
|
|
205
|
+
| `confirm` | id, message | 等待确认(仅 `auto_approve: false`) |
|
|
206
|
+
| `question` | id, prompt, options | 等待回答(仅 `auto_approve: false`)。`options` 为字符串数组;对象选项(如 `{label, description}`)会先被规范成字符串再下发 |
|
|
131
207
|
| `fatal` | message | 致命错误 |
|
|
132
208
|
|
|
133
209
|
---
|
|
134
210
|
|
|
135
211
|
## `POST /v1/code`
|
|
136
212
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
响应额外包含:
|
|
140
|
-
```json
|
|
141
|
-
{ "mode": "code", "project": { "languages": [...], ... }, ... }
|
|
142
|
-
```
|
|
213
|
+
与 `/v1/chat` 相同的兼容路径。请求体与响应结构一致(含 `project`)。
|
|
143
214
|
|
|
144
215
|
---
|
|
145
216
|
|
|
@@ -153,8 +224,20 @@ Code 模式对话(项目感知 prompt + explore 工具)。请求体与 `/v1/
|
|
|
153
224
|
| `mime_type` | string | MIME 类型(默认 `image/png`) |
|
|
154
225
|
| `message` | string | 文本 prompt |
|
|
155
226
|
| `model` | string | 覆盖模型 |
|
|
227
|
+
| `provider` | string | 指定 provider(默认 activeProvider) |
|
|
156
228
|
| `session_id` | string | 追加到会话 |
|
|
157
229
|
| `stream` | boolean | SSE 流式 |
|
|
230
|
+
| `temperature` | number | 采样温度 |
|
|
231
|
+
| `maxTokens` | number | 最大输出 token 数 |
|
|
232
|
+
| `topP` | number | 核采样参数 |
|
|
233
|
+
| `plan_mode` | boolean | 只读计划模式 |
|
|
234
|
+
| `auto_approve` | boolean | 同 `/v1/chat` |
|
|
235
|
+
|
|
236
|
+
`stream: true` 时 SSE 事件与 `/v1/chat` 一致(含 `X-Accel-Buffering: no` 响应头、`done` 事件的 usage/context_tokens/has_error/aborted/max_steps_reached/incomplete/continues/stopped/empty_response/empty_attempts/task_state/messages 字段);非流式响应与 `/v1/chat` 非流式响应结构一致。
|
|
237
|
+
|
|
238
|
+
`session_id` 不存在时返回 `404 session_not_found`(与 `/v1/chat` 一致)。
|
|
239
|
+
|
|
240
|
+
非流式响应与 `/v1/chat` 相同,始终包含 `project`。请求里多传 `code` 会被忽略。
|
|
158
241
|
|
|
159
242
|
---
|
|
160
243
|
|
|
@@ -167,6 +250,218 @@ Code 模式对话(项目感知 prompt + explore 工具)。请求体与 `/v1/
|
|
|
167
250
|
{ "ok": true, "compacted": true, "message_count": 5 }
|
|
168
251
|
```
|
|
169
252
|
|
|
253
|
+
## `GET /v1/sessions/:id`
|
|
254
|
+
|
|
255
|
+
```json
|
|
256
|
+
{
|
|
257
|
+
"session": {
|
|
258
|
+
"meta": { "id": "abc", "title": "...", "created": "...", "updated": "...", "messageCount": 2 },
|
|
259
|
+
"taskState": { "goal": "...", "todos": [{ "id": 1, "text": "...", "status": "in_progress" }], "nextId": 2 },
|
|
260
|
+
"messages": [...]
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## `POST /v1/sessions/:id/rename`
|
|
266
|
+
|
|
267
|
+
```json
|
|
268
|
+
// 请求
|
|
269
|
+
{ "title": "new title" }
|
|
270
|
+
// 响应
|
|
271
|
+
{ "ok": true, "session_id": "abc", "title": "new title" }
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## `POST /v1/chat/undo`
|
|
275
|
+
|
|
276
|
+
```json
|
|
277
|
+
// 请求
|
|
278
|
+
{ "session_id": "abc123" }
|
|
279
|
+
// 响应
|
|
280
|
+
{ "ok": true, "message_count": 3, "messages": [...] }
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
截断到最后一条 user 消息(保留该消息,删除其后的 assistant/tool 消息)。
|
|
284
|
+
|
|
285
|
+
## `POST /v1/chat/redo`
|
|
286
|
+
|
|
287
|
+
取出会话中最后一条用户文本,追加一轮后再跑。请求体与 `/v1/chat` 相同的可选字段(`stream`、`model`、`provider`、`plan_mode`、`auto_approve`、采样参数),`session_id` 必填。
|
|
288
|
+
|
|
289
|
+
```json
|
|
290
|
+
// 请求
|
|
291
|
+
{ "session_id": "abc123", "stream": false }
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
没有用户文本时返回 `400 no_user_message`。
|
|
295
|
+
|
|
296
|
+
## `GET /v1/budget`
|
|
297
|
+
|
|
298
|
+
```json
|
|
299
|
+
{ "maxCostUSD": 5, "source": "global" }
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
`source` 为 `project`、`global` 或 `null`(未设置)。`maxCostUSD` 为合并后的生效值。
|
|
303
|
+
|
|
304
|
+
## `POST /v1/budget`
|
|
305
|
+
|
|
306
|
+
```json
|
|
307
|
+
// 请求
|
|
308
|
+
{ "maxCostUSD": 8, "scope": "project" }
|
|
309
|
+
// 响应
|
|
310
|
+
{ "ok": true, "maxCostUSD": 8, "source": "project", "scope": "project" }
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
`scope` 省略时写入全局。`maxCostUSD` 必须为正数。
|
|
314
|
+
|
|
315
|
+
## `GET /v1/permission`
|
|
316
|
+
|
|
317
|
+
```json
|
|
318
|
+
{ "permission": "ask", "source": null, "label": "询问确认" }
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
`permission` 为 `ask` / `accept-edits` / `allow-all`。`source` 为 `cli`、`project`、`global` 或 `null`(使用默认:询问确认)。
|
|
322
|
+
|
|
323
|
+
## `POST /v1/permission`
|
|
324
|
+
|
|
325
|
+
```json
|
|
326
|
+
// 请求
|
|
327
|
+
{ "permission": "accept-edits", "scope": "project" }
|
|
328
|
+
// 响应
|
|
329
|
+
{ "ok": true, "scope": "project", "permission": "accept-edits", "source": "project", "label": "自动允许改文件" }
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
`scope` 省略时写入全局。`permission` 必须为 `ask` / `accept-edits` / `allow-all`。
|
|
333
|
+
|
|
334
|
+
## `GET /v1/sandbox`
|
|
335
|
+
|
|
336
|
+
```json
|
|
337
|
+
{ "mode": "off", "network": "allow", "extraWriteRoots": [], "extraReadRoots": [], "source": null, "label": "未隔离,允许联网" }
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
`source` 为 `cli`、`env`、`project`、`global` 或 `null`(使用默认:不隔离)。未配置时 `mode` 为 `off`。
|
|
341
|
+
|
|
342
|
+
## `POST /v1/sandbox`
|
|
343
|
+
|
|
344
|
+
```json
|
|
345
|
+
// 请求
|
|
346
|
+
{ "mode": "workspace", "network": "deny", "scope": "project" }
|
|
347
|
+
// 响应
|
|
348
|
+
{ "ok": true, "scope": "project", "mode": "workspace", "network": "deny", "extraWriteRoots": [], "extraReadRoots": [], "source": "project", "label": "工作区隔离,禁止联网" }
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
`scope` 省略时写入全局。至少提供 `mode`、`network`、`extraWriteRoots`、`extraReadRoots` 之一。`mode` 为 `off` / `workspace` / `strict`;`network` 为 `allow` / `deny`。
|
|
352
|
+
|
|
353
|
+
## `GET /v1/diff`
|
|
354
|
+
|
|
355
|
+
```json
|
|
356
|
+
{ "ok": true, "diff": "..." }
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
非 git 仓库或无变更时仍返回 200:`{ "ok": false, "reason": "not_git"|"no_changes"|"error", "message": "..." }`。
|
|
360
|
+
|
|
361
|
+
## `POST /v1/approvals`
|
|
362
|
+
|
|
363
|
+
配合 SSE `confirm` 事件。
|
|
364
|
+
|
|
365
|
+
```json
|
|
366
|
+
// 请求
|
|
367
|
+
{ "id": "…", "accepted": true }
|
|
368
|
+
// 响应
|
|
369
|
+
{ "ok": true, "id": "…", "accepted": true }
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
未知 id 返回 `404 unknown_approval_id`。
|
|
373
|
+
|
|
374
|
+
## `POST /v1/answers`
|
|
375
|
+
|
|
376
|
+
配合 SSE `question` 事件。`answer` 为 `null` 表示跳过。
|
|
377
|
+
|
|
378
|
+
```json
|
|
379
|
+
// 请求
|
|
380
|
+
{ "id": "…", "answer": "use bun" }
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
未知 id 返回 `404 unknown_answer_id`。
|
|
384
|
+
|
|
385
|
+
## `GET /v1/skills`
|
|
386
|
+
|
|
387
|
+
```json
|
|
388
|
+
{
|
|
389
|
+
"count": 2,
|
|
390
|
+
"enabled_count": 1,
|
|
391
|
+
"stale_disabled": ["removed-skill"],
|
|
392
|
+
"skills": [
|
|
393
|
+
{
|
|
394
|
+
"name": "my-skill",
|
|
395
|
+
"description": "What it does",
|
|
396
|
+
"location": "/path/.min-agent/skills/my-skill/SKILL.md",
|
|
397
|
+
"enabled": true,
|
|
398
|
+
"version": "1.0.0",
|
|
399
|
+
"allowed_tools": ["read"],
|
|
400
|
+
"requires_bins": ["some-cli"]
|
|
401
|
+
}
|
|
402
|
+
]
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
禁用项额外带 `disabled_scope`(`global` 或 `project`)。
|
|
407
|
+
随包装载的技能额外带 `builtin: true`;会话开始即注入正文的技能额外带 `always_load: true`(内置 `self-config` 即如此)。
|
|
408
|
+
`stale_disabled` 列出两个范围的 `disabledSkills` 中没有对应技能的名字(拼写错误或技能已删除)。
|
|
409
|
+
|
|
410
|
+
## `GET /v1/skills/:name`
|
|
411
|
+
|
|
412
|
+
返回单个技能,附带 `content`(SKILL.md 正文)。技能不存在返回 404 `{ "error": "skill_not_found", "available": [...] }`。
|
|
413
|
+
|
|
414
|
+
## `POST /v1/skills/reload`
|
|
415
|
+
|
|
416
|
+
重新扫描技能目录(新增/修改 SKILL.md 后无需重启服务)。
|
|
417
|
+
|
|
418
|
+
```json
|
|
419
|
+
{ "ok": true, "count": 2, "enabled_count": 1, "stale_disabled": [], "skills": [...] }
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
## `POST /v1/skills/:name/enable` / `/disable`
|
|
423
|
+
|
|
424
|
+
请求体可选:
|
|
425
|
+
|
|
426
|
+
```json
|
|
427
|
+
{ "scope": "project" }
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
`scope` 为 `global`(默认,写 `~/.min-agent/config.json`)或 `project`(写 `.min-agent/config.json`)。项目范围优先于全局,因此全局禁用的技能可以在单个项目里用 `{"scope":"project"}` 的 enable 重新启用。
|
|
431
|
+
|
|
432
|
+
```json
|
|
433
|
+
{ "ok": true, "name": "my-skill", "enabled": false, "scope": "project" }
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
若改动被另一范围覆盖,响应带 `blocked_by`(`global` 或 `project`),`enabled` 反映实际生效状态。
|
|
437
|
+
技能不存在返回 404 `{ "error": "skill_not_found", "available": [...] }`;`scope` 非法返回 400 `{ "error": "invalid_scope" }`。
|
|
438
|
+
|
|
439
|
+
## `POST /v1/mcp/:name/enable` / `/disable`
|
|
440
|
+
|
|
441
|
+
请求体可选:
|
|
442
|
+
|
|
443
|
+
```json
|
|
444
|
+
{ "scope": "project" }
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
`scope` 为 `global`(默认,写 `~/.min-agent/mcp.json`)或 `project`(写 `.min-agent/mcp.json`)。服务器在另一范围时返回 404 并带 `hint`。
|
|
448
|
+
|
|
449
|
+
```json
|
|
450
|
+
{ "ok": true, "name": "fs", "enabled": true, "scope": "global", "connected": true }
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
## `GET /v1/cost`
|
|
454
|
+
|
|
455
|
+
| 参数 | 说明 |
|
|
456
|
+
|------|------|
|
|
457
|
+
| `model` | 模型 ID(默认配置默认模型) |
|
|
458
|
+
| `input` | 输入 token 数 |
|
|
459
|
+
| `output` | 输出 token 数 |
|
|
460
|
+
|
|
461
|
+
```json
|
|
462
|
+
{ "model": "gpt-4o", "price": { "inputPerMillion": 2.5, "outputPerMillion": 10 }, "cost_usd": 7.5 }
|
|
463
|
+
```
|
|
464
|
+
|
|
170
465
|
## `POST /v1/chat/reload-instructions`
|
|
171
466
|
|
|
172
467
|
```json
|
|
@@ -192,28 +487,42 @@ Code 模式对话(项目感知 prompt + explore 工具)。请求体与 `/v1/
|
|
|
192
487
|
## `GET /v1/memory`
|
|
193
488
|
|
|
194
489
|
```json
|
|
195
|
-
{
|
|
490
|
+
{
|
|
491
|
+
"memories": [{ "content": "...", "tags": [...], "created": "..." }],
|
|
492
|
+
"project_memories": [{ "content": "...", "tags": [...], "created": "..." }]
|
|
493
|
+
}
|
|
196
494
|
```
|
|
197
495
|
|
|
496
|
+
`memories` 始终为全局;`project_memories` 为当前目录 `.min-agent/memory.json`。
|
|
497
|
+
|
|
198
498
|
## `POST /v1/memory`
|
|
199
499
|
|
|
200
500
|
```json
|
|
201
501
|
// 请求
|
|
202
|
-
{ "content": "prefer TypeScript", "tags": ["preference"] }
|
|
502
|
+
{ "content": "prefer TypeScript", "tags": ["preference"], "scope": "project" }
|
|
203
503
|
// 响应
|
|
204
|
-
{ "ok": true, "memory": {...} }
|
|
504
|
+
{ "ok": true, "memory": {...}, "scope": "project" }
|
|
205
505
|
```
|
|
206
506
|
|
|
507
|
+
`scope` 省略时写入全局(兼容旧客户端)。非法值返回 `400 invalid_scope`。
|
|
508
|
+
|
|
207
509
|
## `GET /v1/memory/search?q=typescript`
|
|
208
510
|
|
|
511
|
+
可选 `scope=global|project`。省略时两个商店都搜。
|
|
512
|
+
|
|
209
513
|
```json
|
|
210
|
-
{
|
|
514
|
+
{
|
|
515
|
+
"results": [{ "content": "...", "tags": [...], "index": 0 }],
|
|
516
|
+
"project_results": []
|
|
517
|
+
}
|
|
211
518
|
```
|
|
212
519
|
|
|
213
520
|
## `DELETE /v1/memory/:index`
|
|
214
521
|
|
|
522
|
+
可选 `?scope=project`;默认全局。索引从 1 开始,按对应商店编号。
|
|
523
|
+
|
|
215
524
|
```json
|
|
216
|
-
{ "ok": true, "deleted": 1 }
|
|
525
|
+
{ "ok": true, "deleted": 1, "scope": "global" }
|
|
217
526
|
```
|
|
218
527
|
|
|
219
528
|
---
|
|
@@ -221,36 +530,86 @@ Code 模式对话(项目感知 prompt + explore 工具)。请求体与 `/v1/
|
|
|
221
530
|
## `GET /v1/mcp`
|
|
222
531
|
|
|
223
532
|
```json
|
|
224
|
-
{
|
|
533
|
+
{
|
|
534
|
+
"servers": {
|
|
535
|
+
"filesystem": { "connected": true, "enabled": true, "tools": ["read_file", "write_file"], "resource_count": 2, "prompt_count": 1 },
|
|
536
|
+
"broken": { "connected": false, "enabled": true, "tools": [], "resource_count": 0, "prompt_count": 0, "error": "connection timed out after 30000ms" }
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
`resource_count` / `prompt_count` 为连接时缓存的数量。未声明 resources/prompts 的服务器为 0。
|
|
542
|
+
|
|
543
|
+
## `GET /v1/mcp/:name/resources`
|
|
544
|
+
|
|
545
|
+
```json
|
|
546
|
+
{
|
|
547
|
+
"name": "filesystem",
|
|
548
|
+
"resources": [{ "uri": "file:///tmp/a.txt", "name": "a.txt", "mimeType": "text/plain" }],
|
|
549
|
+
"templates": [{ "uriTemplate": "file:///{path}", "name": "file" }]
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
未配置返回 `404 mcp_not_found`;已配置但未连接返回 `404 mcp_not_connected`。
|
|
554
|
+
|
|
555
|
+
## `GET /v1/mcp/:name/prompts`
|
|
556
|
+
|
|
557
|
+
```json
|
|
558
|
+
{
|
|
559
|
+
"name": "docs",
|
|
560
|
+
"prompts": [{ "name": "review", "description": "Review a file", "arguments": [{ "name": "path", "required": true }] }]
|
|
561
|
+
}
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
## `POST /v1/mcp/:name/resources/read`
|
|
565
|
+
|
|
566
|
+
```json
|
|
567
|
+
// 请求
|
|
568
|
+
{ "uri": "file:///tmp/a.txt" }
|
|
569
|
+
// 响应
|
|
570
|
+
{ "ok": true, "name": "filesystem", "uri": "file:///tmp/a.txt", "content": "..." }
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
## `POST /v1/mcp/:name/prompts/get`
|
|
574
|
+
|
|
575
|
+
```json
|
|
576
|
+
// 请求
|
|
577
|
+
{ "prompt": "review", "arguments": { "path": "src/a.ts" } }
|
|
578
|
+
// 响应
|
|
579
|
+
{ "ok": true, "name": "docs", "prompt": "review", "content": "user: ..." }
|
|
225
580
|
```
|
|
226
581
|
|
|
227
582
|
## `POST /v1/mcp`
|
|
228
583
|
|
|
584
|
+
添加或覆盖一个 MCP 服务器。保存后立即重连(`sync`),响应带实时状态。
|
|
585
|
+
|
|
229
586
|
```json
|
|
230
587
|
// 本地 stdio
|
|
231
588
|
{ "name": "fs", "command": ["npx", "-y", "@modelcontextprotocol/server-filesystem", "/tmp"] }
|
|
589
|
+
// 本地 stdio(字符串 + args)
|
|
590
|
+
{ "name": "fs", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"] }
|
|
232
591
|
// 远程
|
|
233
|
-
{ "name": "remote", "url": "https://mcp.example.com", "token": "xxx" }
|
|
592
|
+
{ "name": "remote", "url": "https://mcp.example.com", "token": "xxx", "remoteTransport": "sse" }
|
|
593
|
+
// 项目范围(写 .min-agent/mcp.json)
|
|
594
|
+
{ "name": "fs", "command": ["..."], "project": true }
|
|
234
595
|
```
|
|
235
596
|
|
|
597
|
+
支持的字段:`name`(必填)、`command`(数组或字符串)、`args`、`url`、`token`、`headers`、`environment`、`remoteTransport`(`streamable-http`/`sse`/`auto`,非法值返回 400)、`timeout`、`connectTimeout`、`callTimeout`、`enabled`、`project`。
|
|
598
|
+
|
|
236
599
|
```json
|
|
237
|
-
{ "ok": true, "name": "fs" }
|
|
600
|
+
{ "ok": true, "name": "fs", "scope": "global", "connected": true, "tools": ["read_file"] }
|
|
238
601
|
```
|
|
239
602
|
|
|
240
603
|
## `DELETE /v1/mcp/:name`
|
|
241
604
|
|
|
605
|
+
`?project=1` 删除项目范围(`.min-agent/mcp.json`)的条目;默认全局。服务器在另一范围时返回 404 并带 `hint`。
|
|
606
|
+
|
|
242
607
|
```json
|
|
243
|
-
{ "ok": true, "deleted": "fs" }
|
|
608
|
+
{ "ok": true, "deleted": "fs", "scope": "global" }
|
|
244
609
|
```
|
|
245
610
|
|
|
246
611
|
---
|
|
247
612
|
|
|
248
|
-
## `GET /v1/skills`
|
|
249
|
-
|
|
250
|
-
```json
|
|
251
|
-
{ "skills": [{ "name": "git-workflow", "description": "...", "location": "..." }] }
|
|
252
|
-
```
|
|
253
|
-
|
|
254
613
|
## `GET /v1/rules`
|
|
255
614
|
|
|
256
615
|
```json
|
|
@@ -263,10 +622,11 @@ Code 模式对话(项目感知 prompt + explore 工具)。请求体与 `/v1/
|
|
|
263
622
|
|
|
264
623
|
| 状态 | 说明 |
|
|
265
624
|
|------|------|
|
|
266
|
-
| 400 | 请求参数错误 |
|
|
625
|
+
| 400 | 请求参数错误 / JSON 解析失败(`invalid_json`) |
|
|
267
626
|
| 401 | 未授权 |
|
|
268
627
|
| 404 | 资源不存在 |
|
|
269
|
-
|
|
|
628
|
+
| 408 | 请求体读取超时(`payload_timeout`,30s) |
|
|
629
|
+
| 413 | 请求体过大(>2MB,`payload_too_large`) |
|
|
270
630
|
| 415 | Content-Type 不是 JSON |
|
|
271
631
|
| 500 | 内部错误 |
|
|
272
632
|
|
|
@@ -285,7 +645,7 @@ curl -N http://127.0.0.1:8787/v1/chat \
|
|
|
285
645
|
-H "Content-Type: application/json" \
|
|
286
646
|
-d '{"message":"say hi","stream":true}'
|
|
287
647
|
|
|
288
|
-
#
|
|
648
|
+
# 兼容路径 /v1/code
|
|
289
649
|
curl http://127.0.0.1:8787/v1/code \
|
|
290
650
|
-H "Content-Type: application/json" \
|
|
291
651
|
-d '{"message":"add error handling to login"}'
|
|
@@ -305,6 +665,24 @@ curl -X POST http://127.0.0.1:8787/v1/memory \
|
|
|
305
665
|
-H "Content-Type: application/json" \
|
|
306
666
|
-d '{"content":"prefer TypeScript","tags":["preference"]}'
|
|
307
667
|
|
|
668
|
+
# 设置项目预算
|
|
669
|
+
curl -X POST http://127.0.0.1:8787/v1/budget \
|
|
670
|
+
-H "Content-Type: application/json" \
|
|
671
|
+
-d '{"maxCostUSD":5,"scope":"project"}'
|
|
672
|
+
|
|
673
|
+
# 设置确认模式
|
|
674
|
+
curl -X POST http://127.0.0.1:8787/v1/permission \
|
|
675
|
+
-H "Content-Type: application/json" \
|
|
676
|
+
-d '{"permission":"accept-edits","scope":"project"}'
|
|
677
|
+
|
|
678
|
+
# 启用工作区隔离
|
|
679
|
+
curl -X POST http://127.0.0.1:8787/v1/sandbox \
|
|
680
|
+
-H "Content-Type: application/json" \
|
|
681
|
+
-d '{"mode":"workspace","scope":"project"}'
|
|
682
|
+
|
|
683
|
+
# 查看工作区变更
|
|
684
|
+
curl http://127.0.0.1:8787/v1/diff
|
|
685
|
+
|
|
308
686
|
# 压缩会话
|
|
309
687
|
curl -X POST http://127.0.0.1:8787/v1/chat/compact \
|
|
310
688
|
-H "Content-Type: application/json" \
|