@di-code/coding-agent 0.1.6 → 0.1.8
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 +112 -68
- package/compositions/base.yml +54 -0
- package/compositions/interactive.yml +14 -0
- package/compositions/json.yml +6 -0
- package/compositions/print.yml +5 -0
- package/compositions/rpc.yml +12 -0
- package/compositions/webui.yml +9 -0
- package/dist/cli.d.ts +22 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -3
- package/dist/cli.js.map +1 -1
- package/dist/composition-loader-entry.d.ts +11 -0
- package/dist/composition-loader-entry.d.ts.map +1 -0
- package/dist/composition-loader-entry.js +12 -0
- package/dist/composition-loader-entry.js.map +1 -0
- package/dist/compositions.d.ts +32 -0
- package/dist/compositions.d.ts.map +1 -0
- package/dist/compositions.js +173 -0
- package/dist/compositions.js.map +1 -0
- package/dist/core/session/session-manager.d.ts +9 -2
- package/dist/core/session/session-manager.d.ts.map +1 -1
- package/dist/core/session/session-manager.js +28 -0
- package/dist/core/session/session-manager.js.map +1 -1
- package/dist/core/session/session-storage.d.ts.map +1 -1
- package/dist/core/session/session-storage.js +20 -3
- package/dist/core/session/session-storage.js.map +1 -1
- package/dist/core/session/types.d.ts +11 -2
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/types.js.map +1 -1
- package/dist/core/session-tools.d.ts +5 -0
- package/dist/core/session-tools.d.ts.map +1 -0
- package/dist/core/session-tools.js +17 -0
- package/dist/core/session-tools.js.map +1 -0
- package/dist/core/session.d.ts +21 -7
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +77 -41
- package/dist/core/session.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -38
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +1 -207
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +1 -24
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +1 -135
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +1 -26
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +1 -140
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +1 -23
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/file-search.d.ts +1 -13
- package/dist/core/tools/file-search.d.ts.map +1 -1
- package/dist/core/tools/file-search.js +1 -98
- package/dist/core/tools/file-search.js.map +1 -1
- package/dist/core/tools/glob.d.ts +1 -10
- package/dist/core/tools/glob.d.ts.map +1 -1
- package/dist/core/tools/glob.js +1 -43
- package/dist/core/tools/glob.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -12
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -66
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/load-skill.d.ts +1 -9
- package/dist/core/tools/load-skill.d.ts.map +1 -1
- package/dist/core/tools/load-skill.js +1 -21
- package/dist/core/tools/load-skill.js.map +1 -1
- package/dist/core/tools/path-boundary.d.ts +1 -4
- package/dist/core/tools/path-boundary.d.ts.map +1 -1
- package/dist/core/tools/path-boundary.js +1 -65
- package/dist/core/tools/path-boundary.js.map +1 -1
- package/dist/core/tools/read.d.ts +1 -16
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -131
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts +1 -16
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -44
- package/dist/core/tools/write.js.map +1 -1
- package/dist/entry.js +30 -28
- package/dist/entry.js.map +1 -1
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +2 -0
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/interactive/builtin.d.ts +17 -0
- package/dist/interactive/builtin.d.ts.map +1 -0
- package/dist/interactive/builtin.js +47 -0
- package/dist/interactive/builtin.js.map +1 -0
- package/dist/interactive/controller.d.ts +85 -0
- package/dist/interactive/controller.d.ts.map +1 -0
- package/dist/interactive/controller.js +211 -0
- package/dist/interactive/controller.js.map +1 -0
- package/dist/interactive/index.d.ts +3 -0
- package/dist/interactive/index.d.ts.map +1 -0
- package/dist/interactive/index.js +3 -0
- package/dist/interactive/index.js.map +1 -0
- package/dist/interactive-host-entry.d.ts +7 -0
- package/dist/interactive-host-entry.d.ts.map +1 -0
- package/dist/interactive-host-entry.js +123 -0
- package/dist/interactive-host-entry.js.map +1 -0
- package/dist/interactive-profile.d.ts +18 -0
- package/dist/interactive-profile.d.ts.map +1 -0
- package/dist/interactive-profile.js +290 -0
- package/dist/interactive-profile.js.map +1 -0
- package/dist/interactive-resources-entry.d.ts +7 -0
- package/dist/interactive-resources-entry.d.ts.map +1 -0
- package/dist/interactive-resources-entry.js +42 -0
- package/dist/interactive-resources-entry.js.map +1 -0
- package/dist/legacy-main.d.ts +39 -0
- package/dist/legacy-main.d.ts.map +1 -0
- package/dist/legacy-main.js +611 -0
- package/dist/legacy-main.js.map +1 -0
- package/dist/main.d.ts +15 -34
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +130 -513
- package/dist/main.js.map +1 -1
- package/dist/mcp/entries.d.ts +42 -0
- package/dist/mcp/entries.d.ts.map +1 -0
- package/dist/mcp/entries.js +98 -0
- package/dist/mcp/entries.js.map +1 -0
- package/dist/mcp-client-entry.d.ts +5 -0
- package/dist/mcp-client-entry.d.ts.map +1 -0
- package/dist/mcp-client-entry.js +6 -0
- package/dist/mcp-client-entry.js.map +1 -0
- package/dist/mcp-config-entry.d.ts +5 -0
- package/dist/mcp-config-entry.d.ts.map +1 -0
- package/dist/mcp-config-entry.js +6 -0
- package/dist/mcp-config-entry.js.map +1 -0
- package/dist/mcp-tools-entry.d.ts +5 -0
- package/dist/mcp-tools-entry.d.ts.map +1 -0
- package/dist/mcp-tools-entry.js +6 -0
- package/dist/mcp-tools-entry.js.map +1 -0
- package/dist/mcp-transport-entry.d.ts +5 -0
- package/dist/mcp-transport-entry.d.ts.map +1 -0
- package/dist/mcp-transport-entry.js +6 -0
- package/dist/mcp-transport-entry.js.map +1 -0
- package/dist/modes/interactive-entry.d.ts +18 -0
- package/dist/modes/interactive-entry.d.ts.map +1 -0
- package/dist/modes/interactive-entry.js +21 -0
- package/dist/modes/interactive-entry.js.map +1 -0
- package/dist/modes/interactive-state.js +1 -1
- package/dist/modes/interactive-state.js.map +1 -1
- package/dist/modes/interactive.d.ts +16 -6
- package/dist/modes/interactive.d.ts.map +1 -1
- package/dist/modes/interactive.js +99 -33
- package/dist/modes/interactive.js.map +1 -1
- package/dist/modes/json-entry.d.ts +13 -0
- package/dist/modes/json-entry.d.ts.map +1 -0
- package/dist/modes/json-entry.js +14 -0
- package/dist/modes/json-entry.js.map +1 -0
- package/dist/modes/json.d.ts +4 -1
- package/dist/modes/json.d.ts.map +1 -1
- package/dist/modes/json.js +3 -3
- package/dist/modes/json.js.map +1 -1
- package/dist/modes/print-entry.d.ts +10 -0
- package/dist/modes/print-entry.d.ts.map +1 -0
- package/dist/modes/print-entry.js +11 -0
- package/dist/modes/print-entry.js.map +1 -0
- package/dist/modes/tree-selector.d.ts.map +1 -1
- package/dist/modes/tree-selector.js +4 -0
- package/dist/modes/tree-selector.js.map +1 -1
- package/dist/plugin-dump-composition.d.ts +6 -0
- package/dist/plugin-dump-composition.d.ts.map +1 -0
- package/dist/plugin-dump-composition.js +7 -0
- package/dist/plugin-dump-composition.js.map +1 -0
- package/dist/plugin-inventory.d.ts +7 -0
- package/dist/plugin-inventory.d.ts.map +1 -0
- package/dist/plugin-inventory.js +8 -0
- package/dist/plugin-inventory.js.map +1 -0
- package/dist/plugin-manager.d.ts +6 -0
- package/dist/plugin-manager.d.ts.map +1 -0
- package/dist/plugin-manager.js +7 -0
- package/dist/plugin-manager.js.map +1 -0
- package/dist/plugin-trace.d.ts +6 -0
- package/dist/plugin-trace.d.ts.map +1 -0
- package/dist/plugin-trace.js +7 -0
- package/dist/plugin-trace.js.map +1 -0
- package/dist/plugins/dynamic-broker.d.ts +76 -0
- package/dist/plugins/dynamic-broker.d.ts.map +1 -0
- package/dist/plugins/dynamic-broker.js +852 -0
- package/dist/plugins/dynamic-broker.js.map +1 -0
- package/dist/plugins/profile.d.ts +15 -0
- package/dist/plugins/profile.d.ts.map +1 -0
- package/dist/plugins/profile.js +34 -0
- package/dist/plugins/profile.js.map +1 -0
- package/dist/plugins/runtime-host.d.ts +37 -0
- package/dist/plugins/runtime-host.d.ts.map +1 -0
- package/dist/plugins/runtime-host.js +95 -0
- package/dist/plugins/runtime-host.js.map +1 -0
- package/dist/plugins/trust.d.ts +8 -0
- package/dist/plugins/trust.d.ts.map +1 -0
- package/dist/plugins/trust.js +59 -0
- package/dist/plugins/trust.js.map +1 -0
- package/dist/project-trust-entry.d.ts +15 -0
- package/dist/project-trust-entry.d.ts.map +1 -0
- package/dist/project-trust-entry.js +15 -0
- package/dist/project-trust-entry.js.map +1 -0
- package/dist/rpc/client.d.ts +78 -6
- package/dist/rpc/client.d.ts.map +1 -1
- package/dist/rpc/client.js +172 -4
- package/dist/rpc/client.js.map +1 -1
- package/dist/rpc/dispatcher.d.ts +121 -0
- package/dist/rpc/dispatcher.d.ts.map +1 -0
- package/dist/rpc/dispatcher.js +994 -0
- package/dist/rpc/dispatcher.js.map +1 -0
- package/dist/rpc/index.d.ts +2 -0
- package/dist/rpc/index.d.ts.map +1 -1
- package/dist/rpc/index.js +2 -0
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/lifecycle.d.ts +6 -0
- package/dist/rpc/lifecycle.d.ts.map +1 -0
- package/dist/rpc/lifecycle.js +24 -0
- package/dist/rpc/lifecycle.js.map +1 -0
- package/dist/rpc/protocol.d.ts +112 -31
- package/dist/rpc/protocol.d.ts.map +1 -1
- package/dist/rpc/protocol.js +569 -117
- package/dist/rpc/protocol.js.map +1 -1
- package/dist/rpc/server-service.d.ts +7 -0
- package/dist/rpc/server-service.d.ts.map +1 -0
- package/dist/rpc/server-service.js +3 -0
- package/dist/rpc/server-service.js.map +1 -0
- package/dist/rpc/server.d.ts +16 -19
- package/dist/rpc/server.d.ts.map +1 -1
- package/dist/rpc/server.js +59 -115
- package/dist/rpc/server.js.map +1 -1
- package/dist/rpc-client-sdk-entry.d.ts +12 -0
- package/dist/rpc-client-sdk-entry.d.ts.map +1 -0
- package/dist/rpc-client-sdk-entry.js +11 -0
- package/dist/rpc-client-sdk-entry.js.map +1 -0
- package/dist/rpc-entry.js +50 -18
- package/dist/rpc-entry.js.map +1 -1
- package/dist/rpc-server-entry.d.ts +8 -0
- package/dist/rpc-server-entry.d.ts.map +1 -0
- package/dist/rpc-server-entry.js +67 -0
- package/dist/rpc-server-entry.js.map +1 -0
- package/dist/runtime/attachment-store.d.ts +13 -0
- package/dist/runtime/attachment-store.d.ts.map +1 -0
- package/dist/runtime/attachment-store.js +93 -0
- package/dist/runtime/attachment-store.js.map +1 -0
- package/dist/runtime/bootstrap.d.ts +14 -0
- package/dist/runtime/bootstrap.d.ts.map +1 -0
- package/dist/runtime/bootstrap.js +29 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/dist/runtime/interactive-host-service.d.ts +22 -0
- package/dist/runtime/interactive-host-service.d.ts.map +1 -0
- package/dist/runtime/interactive-host-service.js +2 -0
- package/dist/runtime/interactive-host-service.js.map +1 -0
- package/dist/runtime/interactive-resource-service.d.ts +11 -0
- package/dist/runtime/interactive-resource-service.d.ts.map +1 -0
- package/dist/runtime/interactive-resource-service.js +3 -0
- package/dist/runtime/interactive-resource-service.js.map +1 -0
- package/dist/runtime/plugin-inventory-entry.d.ts +5 -0
- package/dist/runtime/plugin-inventory-entry.d.ts.map +1 -0
- package/dist/runtime/plugin-inventory-entry.js +18 -0
- package/dist/runtime/plugin-inventory-entry.js.map +1 -0
- package/dist/runtime/plugin-inventory-service.d.ts +8 -0
- package/dist/runtime/plugin-inventory-service.d.ts.map +1 -0
- package/dist/runtime/plugin-inventory-service.js +3 -0
- package/dist/runtime/plugin-inventory-service.js.map +1 -0
- package/dist/runtime/plugin-manager-entry.d.ts +20 -0
- package/dist/runtime/plugin-manager-entry.d.ts.map +1 -0
- package/dist/runtime/plugin-manager-entry.js +96 -0
- package/dist/runtime/plugin-manager-entry.js.map +1 -0
- package/dist/runtime/plugin-observability-entry.d.ts +12 -0
- package/dist/runtime/plugin-observability-entry.d.ts.map +1 -0
- package/dist/runtime/plugin-observability-entry.js +73 -0
- package/dist/runtime/plugin-observability-entry.js.map +1 -0
- package/dist/runtime/product-host.d.ts +91 -0
- package/dist/runtime/product-host.d.ts.map +1 -0
- package/dist/runtime/product-host.js +529 -0
- package/dist/runtime/product-host.js.map +1 -0
- package/dist/runtime/session-factory.d.ts +17 -0
- package/dist/runtime/session-factory.d.ts.map +1 -0
- package/dist/runtime/session-factory.js +75 -0
- package/dist/runtime/session-factory.js.map +1 -0
- package/dist/runtime/session-host.d.ts +152 -0
- package/dist/runtime/session-host.d.ts.map +1 -0
- package/dist/runtime/session-host.js +895 -0
- package/dist/runtime/session-host.js.map +1 -0
- package/dist/runtime-core-entry.d.ts +11 -0
- package/dist/runtime-core-entry.d.ts.map +1 -0
- package/dist/runtime-core-entry.js +9 -0
- package/dist/runtime-core-entry.js.map +1 -0
- package/dist/session-factory-entry.d.ts +7 -0
- package/dist/session-factory-entry.d.ts.map +1 -0
- package/dist/session-factory-entry.js +9 -0
- package/dist/session-factory-entry.js.map +1 -0
- package/dist/session-store-jsonl-entry.d.ts +7 -0
- package/dist/session-store-jsonl-entry.d.ts.map +1 -0
- package/dist/session-store-jsonl-entry.js +33 -0
- package/dist/session-store-jsonl-entry.js.map +1 -0
- package/dist/startup.d.ts +21 -1
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +179 -10
- package/dist/startup.js.map +1 -1
- package/dist/subagents/index.d.ts +2 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +2 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents/service.d.ts +50 -0
- package/dist/subagents/service.d.ts.map +1 -0
- package/dist/subagents/service.js +521 -0
- package/dist/subagents/service.js.map +1 -0
- package/dist/ui-host.d.ts +125 -0
- package/dist/ui-host.d.ts.map +1 -0
- package/dist/ui-host.js +275 -0
- package/dist/ui-host.js.map +1 -0
- package/dist/web/assets/index-BwfuGMvv.css +1 -0
- package/dist/web/assets/index-DPUaJqFJ.js +41 -0
- package/dist/web/assets/index-DPUaJqFJ.js.map +1 -0
- package/dist/web/index.html +14 -0
- package/dist/web-command.d.ts +11 -0
- package/dist/web-command.d.ts.map +1 -0
- package/dist/web-command.js +114 -0
- package/dist/web-command.js.map +1 -0
- package/dist/web-frontend.d.ts +73 -0
- package/dist/web-frontend.d.ts.map +1 -0
- package/dist/web-frontend.js +249 -0
- package/dist/web-frontend.js.map +1 -0
- package/dist/web.d.ts +254 -0
- package/dist/web.d.ts.map +1 -0
- package/dist/web.js +740 -0
- package/dist/web.js.map +1 -0
- package/dist/webui-entry.d.ts +3 -0
- package/dist/webui-entry.d.ts.map +1 -0
- package/dist/webui-entry.js +73 -0
- package/dist/webui-entry.js.map +1 -0
- package/dist/webui.d.ts +91 -0
- package/dist/webui.d.ts.map +1 -0
- package/dist/webui.js +882 -0
- package/dist/webui.js.map +1 -0
- package/package.json +89 -8
package/README.md
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
`@di-code/coding-agent` 是 [di-code](https://github.com/qddidi/di-code) 的可安装终端 AI 编码代理。安装后提供:
|
|
4
4
|
|
|
5
|
-
- `di-code
|
|
5
|
+
- `di-code`:面向人的交互式、单次输出、JSON 事件和本地 Web CLI(`di-code web`);
|
|
6
6
|
- `di-code-rpc`:供 Node.js 宿主程序管理的 JSONL RPC 子进程入口;
|
|
7
|
+
- `di-code-webui`:本地 HTTP/SSE WebUI 传输入口;
|
|
7
8
|
- 内置的 `read`、`write`、`edit`、`glob`、`grep`、`bash` 工具、JSONL 会话、图片输入、上下文压缩;
|
|
8
9
|
- 可复用的 **Skills(技能指令)**、`AGENTS.md` 项目说明,以及插件扩展机制。
|
|
9
10
|
|
|
@@ -45,17 +46,11 @@ di-code
|
|
|
45
46
|
3. **填写 API key**:选择真实 Provider 时,在隐藏输入框中粘贴对应的 key;输入内容不会显示在终端中。
|
|
46
47
|
4. **确认并开始对话**:向导完成后进入 interactive 模式,在底部输入框输入问题并按 `Enter`。
|
|
47
48
|
|
|
48
|
-
向导输入的 API key 会保存到用户全局 `~/.di-code/settings.json
|
|
49
|
+
向导输入的 API key 会保存到用户全局 `~/.di-code/settings.json`,供之后启动复用
|
|
49
50
|
|
|
50
|
-
已经进入交互模式后,使用 `/login` 可以重新打开 Provider、模型和 key
|
|
51
|
+
已经进入交互模式后,使用 `/login` 可以重新打开 Provider、模型和 key 向导。
|
|
51
52
|
|
|
52
|
-
`/login` 还会更新同一文件的 `defaultProvider` 和 `defaultModel`。当全局配置中有多个 Provider 时,下一次启动会使用这两个默认值;显式设置的 `DI_CODE_PROVIDER` 与 `DI_CODE_MODEL` 始终优先。
|
|
53
53
|
|
|
54
|
-
向导完成后可以直接这样使用:
|
|
55
|
-
|
|
56
|
-
```text
|
|
57
|
-
请先读取项目结构,然后告诉我应该从哪些文件开始修改。
|
|
58
|
-
```
|
|
59
54
|
|
|
60
55
|
### 方式二:直接用 `settings.json` 配置
|
|
61
56
|
|
|
@@ -124,9 +119,11 @@ di-code "检查当前项目的测试状态"
|
|
|
124
119
|
| 字段 | 作用 |
|
|
125
120
|
| --- | --- |
|
|
126
121
|
| `providers` | Provider 配置对象,key 是 Provider ID |
|
|
127
|
-
| `defaultProvider` | 可选的默认 Provider;`/login` 自动更新,多个 Provider
|
|
128
|
-
| `defaultModel` | `defaultProvider` 的可选默认模型;`/login`
|
|
122
|
+
| `defaultProvider` | 可选的默认 Provider;`/login` 自动更新,多个 Provider 时用于消除启动歧义;项目值优先于用户级值 |
|
|
123
|
+
| `defaultModel` | `defaultProvider` 的可选默认模型;`/login` 和 `/model` 自动更新;项目值优先于用户级值 |
|
|
124
|
+
| `thinkingLevels` | 按 Provider 和模型保存的推理强度;项目值优先于同一用户级偏好 |
|
|
129
125
|
| `locale` | 仅用户全局 `~/.di-code/settings.json`:`en` 或 `zh-CN`;控制内置 CLI 与交互终端文案 |
|
|
126
|
+
| `permissionMode` | 仅用户全局 settings:`ask`、`allow` 或 `deny`;作为后续 Session 的工具权限默认值 |
|
|
130
127
|
| `api` | 接口类型:`openai-responses`、`openai-chat-completions` 或 `anthropic-messages` |
|
|
131
128
|
| `baseUrl` | Provider 的接口地址,必须是绝对的 `http` 或 `https` URL |
|
|
132
129
|
| `apiKey` | API key,推荐填写 `$ENV_VAR` 或 `${ENV_VAR}` |
|
|
@@ -135,7 +132,7 @@ di-code "检查当前项目的测试状态"
|
|
|
135
132
|
| `models[].input` | 输入类型,填写 `text`、`image` 或两者 |
|
|
136
133
|
| `models[].reasoning` | 是否支持 reasoning/thinking 内容 |
|
|
137
134
|
| `models[].contextWindow` | 上下文 token 上限 |
|
|
138
|
-
| `models[].maxTokens` | 单次最大输出 token
|
|
135
|
+
| `models[].maxTokens` | 单次最大输出 token 数,必须小于 `contextWindow`,以保留输入空间 |
|
|
139
136
|
|
|
140
137
|
`models` 可以配置多个模型,运行时用 `/model` 切换,或者修改 `DI_CODE_MODEL`:
|
|
141
138
|
|
|
@@ -155,14 +152,6 @@ di-code "检查当前项目的测试状态"
|
|
|
155
152
|
}
|
|
156
153
|
```
|
|
157
154
|
|
|
158
|
-
合并后的 `settings.json` 中只有一个 Provider 时,可以省略 `DI_CODE_PROVIDER`;如果有多个 Provider,则必须设置它。`DI_CODE_MODEL` 省略时使用该 Provider 模型列表的第一项。配置完成后,先用 print 模式验证:
|
|
159
|
-
|
|
160
|
-
```powershell
|
|
161
|
-
di-code --print "用一句话介绍当前项目"
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
出现 `Unknown model` 时,检查 `DI_CODE_MODEL` 是否与 `models[].id` 完全一致;出现 `Configured apiKey environment variable ... is not set` 时,检查环境变量名称是否拼写正确。
|
|
165
|
-
|
|
166
155
|
### 方式三:使用环境变量
|
|
167
156
|
|
|
168
157
|
如果使用内建 Provider,可以只设置环境变量,不创建 `settings.json`:
|
|
@@ -275,9 +264,15 @@ di-code --continue "继续上一次工作"
|
|
|
275
264
|
|
|
276
265
|
运行 `di-code` 或 `di-code --interactive` 后,在底部输入框输入请求并按 `Enter`。生成过程中输入的新请求会排队,按顺序执行。
|
|
277
266
|
|
|
267
|
+
### 自定义 TUI Host
|
|
268
|
+
|
|
269
|
+
第三方 ANSI TUI 可通过 `@di-code/coding-agent/ui-host` API v1 替换 composition 中的 `interactive-host`,而无需复制 Provider、MCP、Skills、JSONL Session 或 Agent loop bootstrap。entry 使用 `createUiHostEntry()` 注册自己的 UI 生命周期;回调获得的 `UiHost.session` 提供 prompt、取消、retry、受管 Session 切换、树和压缩,`UiHost.product` 只提供只读资源快照、主题/键位注册和脱敏诊断。它不暴露 `commandRegistry` 任意执行器,也不提供 HTTP/SSE WebUI 或新的 RPC 方法。
|
|
270
|
+
|
|
271
|
+
回调必须持续到 UI 退出,并监听传入的 `AbortSignal`。正常退出、取消、抛错或 composition dispose 时,产品会取消并等待 Session 操作、释放 MCP/Session 资源,再使 facade 失效;之后访问 facade 会得到 `UiHostLifecycleError`(`DISPOSED`)。Session 操作错误通过稳定 code 表示,例如 `BUSY`、`INVALID_INPUT`、`NOT_FOUND` 和 `SESSION_IN_USE`。自定义 TUI 与所有插件一样运行在同一 Node.js 进程中,manifest `permissions` 仅供声明和审计,并不是操作系统级沙箱。完整 package、composition patch 和生命周期示例见 [插件使用指南](../../docs/插件使用指南.md#自定义-tui-host)。
|
|
272
|
+
|
|
278
273
|
### Slash commands 与快捷键
|
|
279
274
|
|
|
280
|
-
输入 `/`
|
|
275
|
+
输入 `/` 后可补全命令;补全菜单打开时按 `Enter` 会直接运行当前选中的 slash command,按 `Tab` 只补全到输入框。
|
|
281
276
|
|
|
282
277
|
| 命令 | 作用 |
|
|
283
278
|
| --- | --- |
|
|
@@ -285,7 +280,7 @@ di-code --continue "继续上一次工作"
|
|
|
285
280
|
| `/clear` | 仅清除屏幕可见消息,不删除会话文件 |
|
|
286
281
|
| `/model` | 切换当前 Provider 的模型 |
|
|
287
282
|
| `/session` | 选择或切换会话 |
|
|
288
|
-
| `/tree` |
|
|
283
|
+
| `/tree` | 打开当前历史对话分支树;可以选择回退至哪个阶段 |
|
|
289
284
|
| `/theme` | 选择 dark 或 light 主题 |
|
|
290
285
|
| `/settings` | 配置上下文压缩开关和内置终端语言 |
|
|
291
286
|
| `/login` | 打开 Provider、模型和隐藏 API key 向导;保存到用户全局配置并切换当前会话 |
|
|
@@ -302,22 +297,26 @@ di-code --continue "继续上一次工作"
|
|
|
302
297
|
| --- | --- |
|
|
303
298
|
| `Enter` | 发送当前 prompt |
|
|
304
299
|
| `Shift+Enter` | 在输入框中插入换行 |
|
|
305
|
-
| `Esc` |
|
|
300
|
+
| `Esc` | 取消当前模型请求并显示取消状态;没有请求时关闭补全或选择器 |
|
|
306
301
|
| `Ctrl+C` | 退出并恢复终端状态 |
|
|
307
302
|
| `Tab` | 补全 slash command |
|
|
308
303
|
| `Alt+S` | 把编辑框当前内容作为引导发送给运行中的 Agent(与 `/steer` 等价) |
|
|
309
|
-
| `Shift+Tab` | 循环切换模型的 thinking
|
|
304
|
+
| `Shift+Tab` | 循环切换模型的 thinking 等级并保存为用户偏好(模型不支持时提示错误) |
|
|
310
305
|
| `Ctrl+O` / `Ctrl+L` | 打开模型 / 会话选择器 |
|
|
311
306
|
| `Ctrl+T` / `Ctrl+S` | 打开主题 / 设置 |
|
|
312
307
|
| `Ctrl+R` | 重试最近失败的 prompt |
|
|
313
308
|
|
|
314
|
-
|
|
309
|
+
取消只停止当前请求,不会删除已经追加到磁盘的会话记录,并显示取消状态而非错误。之后可使用 `/retry` 再试一次。
|
|
315
310
|
|
|
316
311
|
## 会话、图片与内置工具
|
|
317
312
|
|
|
318
313
|
### 会话
|
|
319
314
|
|
|
320
|
-
交互式启动默认会在用户目录 `~/.di-code/sessions/<工作区哈希>/` 创建 v2 JSONL 会话。记录为 append-only(只追加)格式,可引用任意已提交父节点,因此一份文件可以保存多个分支;重启默认恢复物理文件末端记录所在的分支。`/tree` 只在 interactive 模式提供专用树浏览器:以紧凑单栏树显示节点摘要和当前路径,当前选择以 `›` 标识;选择用户消息会将其文本恢复到编辑器,并从它的父节点创建新的 sibling 分支;选择 assistant、tool result 或 summary 则将该节点作为活动叶节点。`s` 会在所选路径上执行现有上下文压缩,成功后的 summary 成为下一条 prompt
|
|
315
|
+
交互式启动默认会在用户目录 `~/.di-code/sessions/<工作区哈希>/` 创建 v2 JSONL 会话。记录为 append-only(只追加)格式,可引用任意已提交父节点,因此一份文件可以保存多个分支;重启默认恢复物理文件末端记录所在的分支。`/tree` 只在 interactive 模式提供专用树浏览器:以紧凑单栏树显示节点摘要和当前路径,当前选择以 `›` 标识;选择用户消息会将其文本恢复到编辑器,并从它的父节点创建新的 sibling 分支;选择 assistant、tool result 或 summary 则将该节点作为活动叶节点。`s` 会在所选路径上执行现有上下文压缩,成功后的 summary 成为下一条 prompt 的分支父节点;手动压缩在“保留最近 token”配置覆盖整段历史时仍会保留最新完整用户回合并压缩更早历史,只有没有可压缩的早期回合时才会明确失败。图片附件不会自动恢复,导航只改变模型可见上下文,不能回滚工作区副作用。v1 或未知版本的会话文件不迁移,打开时返回 `UNSUPPORTED_VERSION`。完整磁盘历史和发送给模型的压缩上下文分开保存,summary 只作用于其所在分支。`/session` 与 `--continue` 只显示或恢复当前工作区的默认会话;`--session` 可以打开任意指定路径。已有项目内 `.di-code/sessions/` 文件不会自动移动,仍可用 `--session <path>` 显式打开。
|
|
316
|
+
|
|
317
|
+
产品 interactive 与 RPC 会话都由 Composition 的 `AgentSessionFactory` 创建。factory 为每个会话建立 isolated Context,并从当时已激活的 `ToolRegistry` 与 capability services 固定工具快照;禁用或未加载的工具不会被会话补回。interactive 的 JSONL 持久化通过 `SessionStoreRegistry` 的 `jsonl` entry 创建或打开,不能绕过 registry 直接在宿主启动分支中组装 Session。直接构造 `AgentSession` 必须传入不可变 `tools` 快照;SDK 集成应使用 Composition factory 或自行从其注册表创建该快照。
|
|
318
|
+
|
|
319
|
+
产品层内部 `SessionHost`/`SessionActor` 会集中拥有 Session、MCP、工具快照、事件订阅和 requestId 操作表;每个 actor 按 principal 与真实 workspace 隔离。它使用 opaque Session ID 解析受管 JSONL 文件,并在重复打开时返回稳定的所有权冲突。失败或取消的 prompt 会以 host 私有 plugin record 绑定 request ID 和文本;因此 RPC `retry(targetRequestId)` 在关闭再打开同一 Session 后仍会选择同一个失败 turn,而不会猜测“最后一条消息”。Host 的 `dispose()` 与 `AgentSession.dispose()` 都是幂等的,会先结束或取消活跃操作,再释放 listener、子 Context、锁和 MCP 连接。内建 interactive TUI 通过私有 `UiHost` facade 使用这些能力;该 facade 不是 WebUI、RPC 或第三方公开契约。
|
|
321
320
|
|
|
322
321
|
会话可能包含你的 prompt、模型回答、工具结果和图片内容。不要在 prompt 或图片中提交不应保留在本地历史中的密钥或敏感材料。
|
|
323
322
|
|
|
@@ -374,7 +373,7 @@ di-code mcp get company-api
|
|
|
374
373
|
di-code mcp remove company-api --scope project
|
|
375
374
|
```
|
|
376
375
|
|
|
377
|
-
配置范围按 `local` > `project` > `user` 生效:local 写入 `<work-root>/.di-code/mcp.local.json`,project 写入 `<work-root>/.mcp.json`,user 写入 `~/.di-code/mcp.json`。同一 Server ID 整体覆盖,不做字段级合并。interactive 启动时,每个 MCP Server 会先显示黄色 `[loading]`,并在完成时原位替换为绿色 `[ok]` 或红色 `[error]`;成功状态包含 tools、resources 和 prompts 数量,失败信息经过脱敏。`mcp add <id> -- <command> [args...]` 默认使用 local stdio;HTTP 必须显式指定 `--transport http`。`list` 和 `get` 会脱敏 header、环境变量和其他凭据;`add` 不安装或下载 Server 软件,stdio 的命令仍由用户提供并在连接时执行。
|
|
376
|
+
配置范围按 `local` > `project` > `user` 生效:local 写入 `<work-root>/.di-code/mcp.local.json`,project 写入 `<work-root>/.mcp.json`,user 写入 `~/.di-code/mcp.json`。同一 Server ID 整体覆盖,不做字段级合并。interactive 启动时,每个 MCP Server 会先显示黄色 `[loading]`,并在完成时原位替换为绿色 `[ok]` 或红色 `[error]`;成功状态包含 tools、resources 和 prompts 数量,失败信息经过脱敏。`McpTransportRegistry` 注册 stdio 和 Streamable HTTP factory,MCP client entry 追踪其 Fiber 创建的所有 manager,并在 interactive 退出、启动失败或 composition dispose 时幂等关闭连接。`mcp add <id> -- <command> [args...]` 默认使用 local stdio;HTTP 必须显式指定 `--transport http`。`list` 和 `get` 会脱敏 header、环境变量和其他凭据;`add` 不安装或下载 Server 软件,stdio 的命令仍由用户提供并在连接时执行。
|
|
378
377
|
|
|
379
378
|
## 项目说明与 Skills
|
|
380
379
|
|
|
@@ -462,48 +461,15 @@ di-code --no-skills "不要加载任何 Skill"
|
|
|
462
461
|
|
|
463
462
|
## 插件
|
|
464
463
|
|
|
465
|
-
插件是与 di-code 运行在**同一 Node.js 进程**中的 JavaScript/TypeScript
|
|
466
|
-
|
|
467
|
-
1. 供模型调用的工具;
|
|
468
|
-
2. interactive 模式中的 slash command;
|
|
469
|
-
3. Agent 与会话生命周期事件处理器。
|
|
470
|
-
|
|
471
|
-
插件不是 MCP Server,也没有热重载、插件市场或真正的权限沙箱。manifest 的 `permissions` 是声明和审计信息,**不会**阻止插件访问文件、网络或子进程。因此,只安装或信任可信来源的插件。interactive 启动时,每个实际加载的插件会先显示黄色 `[loading]`,并在完成时原位替换为绿色 `[ok]` 或红色 `[error]`;成功项会列出该插件新增的 tools 和 slash commands 数量。print 和 JSON 模式保持 `plugin_diagnostic` 输出。
|
|
472
|
-
|
|
473
|
-
### 使用项目本地插件
|
|
474
|
-
|
|
475
|
-
项目插件位置固定:
|
|
476
|
-
|
|
477
|
-
```text
|
|
478
|
-
<project>/.di-code/plugins/<plugin-id>/
|
|
479
|
-
plugin.json
|
|
480
|
-
src/index.ts
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
最小 `plugin.json`:
|
|
484
|
-
|
|
485
|
-
```json
|
|
486
|
-
{
|
|
487
|
-
"apiVersion": 1,
|
|
488
|
-
"id": "project-status",
|
|
489
|
-
"name": "Project Status",
|
|
490
|
-
"version": "0.1.0",
|
|
491
|
-
"entry": "./src/index.ts",
|
|
492
|
-
"permissions": {
|
|
493
|
-
"filesystem": "none",
|
|
494
|
-
"network": [],
|
|
495
|
-
"process": []
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
```
|
|
464
|
+
插件是与 di-code 运行在**同一 Node.js 进程**中的 JavaScript/TypeScript namespace module。Provider、Agent、工具、Session、CLI/TUI、RPC、MCP 和 Skills 都以 Composition entry 装配;第三方 entry 可以在公开 runtime/registry 边界贡献服务、工具、命令、renderer 或事件观察者。
|
|
499
465
|
|
|
500
|
-
|
|
466
|
+
发布插件必须在 `package.json.diCode.plugins` 中只列出一个 package `exports` entry。namespace 必须导出非空 `name` 和 `apply`,不能有 `default` export;`apiVersion` 若存在必须为 `1`,`version` 若存在必须是合法标识。Loader 只解析 enabled managed package;disabled package 不会 import。required entry 失败会回滚已经 active 的 entry 并阻止启动,optional entry 失败会成为 `skipped` inventory。完整 package shape、SDK、Composition、trust、capability 和 lifecycle 规则见[插件使用指南](../../docs/插件使用指南.md)。
|
|
501
467
|
|
|
502
|
-
|
|
468
|
+
插件不是 MCP Server,也没有热重载、插件市场或真正的权限沙箱。manifest 的 `permissions` 是声明和 capability audit 信息,**不会**阻止插件访问文件、网络或子进程。因此,只安装可信来源的插件。`--trace-plugins` 可显示实际 phase 和失败诊断。
|
|
503
469
|
|
|
504
470
|
### 管理全局插件
|
|
505
471
|
|
|
506
|
-
全局托管插件安装在用户的 `~/.di-code/` 下,只有已启用的插件会在启动时加载:
|
|
472
|
+
全局托管插件安装在用户的 `~/.di-code/plugins/installed/` 下,只有已启用的插件会在启动时加载:
|
|
507
473
|
|
|
508
474
|
```powershell
|
|
509
475
|
# 本地目录、npm 包或 git URL 都可以作为来源
|
|
@@ -513,6 +479,7 @@ di-code plugin install git:https://github.com/acme/di-code-project-status.git
|
|
|
513
479
|
|
|
514
480
|
# 查看 ID、启用状态和版本
|
|
515
481
|
di-code plugin list
|
|
482
|
+
di-code plugin get project-status
|
|
516
483
|
|
|
517
484
|
di-code plugin disable project-status
|
|
518
485
|
di-code plugin enable project-status
|
|
@@ -522,6 +489,15 @@ di-code plugin remove project-status
|
|
|
522
489
|
|
|
523
490
|
安装过程固定使用 `npm --ignore-scripts`,但这并不使插件本身安全:插件在加载时仍是本机代码。`plugin` 管理命令不需要配置 Provider。
|
|
524
491
|
|
|
492
|
+
默认运行时先加载 `base` composition,再加载 `interactive`、`print`、`json` 或 `rpc` entry 集合,并追加所有 enabled managed package entry。`--profile <print|json|interactive>` 选择 CLI profile;`--composition <path>` 将一个 JSON 或 YAML document 作为最后一层应用,固定优先级为 `base -> mode -> ~/.di-code/composition.yml -> <work-root>/.di-code/composition.yml -> --composition`。项目 composition 仅在该项目已被 `--trust-project` 信任时读取;`--no-project-plugins` 会为当前运行跳过它,但不会禁用用户托管插件。RPC 使用同一 trust 规则:未信任项目不会读取其 composition,但仍加载用户已启用的受管 package。缺失的 user/project 文件会忽略,格式错误或显式文件不可读取则终止启动并显示路径。`plugin-manager` 是一个 command plugin,管理操作不会 import 已禁用插件。嵌入产品仍可直接使用 `@di-code/plugin-loader` 的公开 API。需要诊断 composition 时可运行:
|
|
493
|
+
|
|
494
|
+
```powershell
|
|
495
|
+
di-code --trace-plugins
|
|
496
|
+
di-code --dump-composition
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
两条命令按需挂载 `plugin-trace` 和 `plugin-dump-composition`,输出实际 resolved tree、entry phase、owner Fiber、capability audit 与脱敏失败信息;不会输出 entry config、安装路径、凭据或完整 Provider 请求。
|
|
500
|
+
|
|
525
501
|
## 自定义 Provider
|
|
526
502
|
|
|
527
503
|
在 interactive TTY 的首次向导或 `/login` 中选择 `Custom`,可以按协议、Base URL、API key 和模型 ID 的顺序配置一个用户级固定 `custom` Provider。支持 `openai-responses`、`openai-chat-completions` 和 `anthropic-messages`。Base URL 必须是绝对 `http`/`https` URL,不能包含凭据、query、hash 或尾随 `/`。如果模型 ID 与内置目录中的同协议模型精确匹配,向导会复制其能力元数据;否则使用保守的文本模型默认值。重新配置会覆盖 `custom`,但保留其他用户级 Provider。
|
|
@@ -560,7 +536,7 @@ $env:DI_CODE_MODEL = "company-coder"
|
|
|
560
536
|
di-code "总结当前项目"
|
|
561
537
|
```
|
|
562
538
|
|
|
563
|
-
`api` 可为 `openai-responses`、`openai-chat-completions` 或 `anthropic-messages`。自定义 Provider 必须提供 `models`;每个模型可设置 `id`、`name`、`input`、`reasoning`、`contextWindow`、`maxTokens`(或 `maxOutputTokens`)及按美元/百万 token 计的 `cost
|
|
539
|
+
`api` 可为 `openai-responses`、`openai-chat-completions` 或 `anthropic-messages`。自定义 Provider 必须提供 `models`;每个模型可设置 `id`、`name`、`input`、`reasoning`、`reasoningEfforts`、`defaultReasoningEffort`、`contextWindow`、`maxTokens`(或 `maxOutputTokens`)及按美元/百万 token 计的 `cost`。`defaultReasoningEffort` 必须在 `reasoningEfforts` 中。Chat Completions 模型还可声明 `chatCompletionsCompat`,用于 DeepSeek/GLM/Kimi 的 thinking、reasoning_effort、`max_tokens`、流式 usage 和 `tool_stream` 等兼容差异。Kimi 模型支持 `low`、`high`、`max` 推理等级;Kimi 不发送 DeepSeek/智谱的 `thinking` 对象,而是发送 `reasoning_effort`。
|
|
564
540
|
|
|
565
541
|
`apiKey` 支持直接字符串,也支持 `$NAME` 或 `${NAME}` 环境变量引用。项目级 `settings.json` 若含明文 key,必须保持未提交;`baseUrl` 必须是绝对 `http`/`https` URL。
|
|
566
542
|
|
|
@@ -590,6 +566,8 @@ di-code --mode json "检查测试状态" | ForEach-Object {
|
|
|
590
566
|
|
|
591
567
|
`di-code-rpc` 是供宿主程序启动的子进程入口,不是交互命令。它从 stdin 接收一行一个 JSON 请求,并从 stdout 写一行一个版本化响应或事件;stderr 仅用于诊断。
|
|
592
568
|
|
|
569
|
+
worker 由 composition 的 `session-factory` 创建 session,并由同一 composition 的 `rpc-server` entry 创建和拥有 `RpcServer`;入口本身只等待该 service。stdin 结束或收到终止信号时,它会先结束或取消活跃请求并写入终态 response,再 flush stdout、dispose composition,最后退出。嵌入 `RpcServer` 时,使用可 await 的 `shutdown()` 获得同一顺序;`stop()` 保留为兼容的非阻塞入口。
|
|
570
|
+
|
|
593
571
|
公开 RPC 方法:
|
|
594
572
|
|
|
595
573
|
| 方法 | 参数 | 结果 |
|
|
@@ -598,28 +576,91 @@ di-code --mode json "检查测试状态" | ForEach-Object {
|
|
|
598
576
|
| `prompt` | `{ "message": "..." }` | 最终 `AssistantMessage`,中间事件另行输出 |
|
|
599
577
|
| `cancel` | `{ "requestId": "..." }` | 是否找到并取消该请求 |
|
|
600
578
|
|
|
579
|
+
`RpcServer` 是 JSONL 传输适配器;协议解析、参数校验、方法分发、操作表和事件恢复由无 stdin/stdout 依赖的 `RpcDispatcher` 完成。嵌入其他传输时只能复用 dispatcher,不得让网络写入等待 Agent 事件处理。
|
|
580
|
+
|
|
581
|
+
新客户端先调用 `get_capabilities` 并在 `events` 中声明 `sequence`、`operation_update`、`snapshot_required` 等扩展事件。未协商的连接只接收原有 Agent 事件,因此旧客户端不会遇到未知 event。协商后可调用 `list_sessions`、`new_session`、`open_session`、`get_transcript`、`get_tree`、`navigate_tree`、`steer`、`retry`、`get_operation`、模型/运行时、压缩、usage 和资源快照方法,以及 `list_commands` 和 `run_command`。前者只返回当前 composition 注册的命令和当前 Session 已加载的 Skills;后者只接受清单中已注册的命令名与字符串参数,`args` 可以为空,扩展命令仍在其 registry handler 中运行。`set_runtime` 和 `set_thinking_level` 都会在空闲时更新当前 Session,并持久化为之后 WebUI Session 与终端启动使用的默认模型/推理偏好;已有工作区 `.di-code/settings.json` 时写入工作区,否则写入用户级 settings。若终端显式设置了 `DI_CODE_PROVIDER` 或 `DI_CODE_MODEL`,环境变量仍优先。`set_thinking_level` 传入 `level: "low" | "medium" | "high" | "max"` 时按值设置;省略 `level` 保持原有循环行为。异步请求由 request ID 归属;重复同一 ID 返回同一个操作结果,`get_operation` 可查询 detached 操作,`cancel` 可取消它。事件带可选 `sessionId` 和单调 `sequence`,`resume_events` 在环形缓冲已过期时发送 `snapshot_required`,客户端必须重新读取状态、transcript、tree 和 usage。
|
|
582
|
+
|
|
583
|
+
v1 只新增方法与可选字段。产品配置、附件、工具审批和插件命名空间仍要求对应的显式 Host capability、schema、权限和 owner disposer;没有这些能力的 composition 会以 `METHOD_NOT_FOUND` 拒绝。`run_command` 是唯一的命令投影:它只执行同一 composition 中已注册且由 `list_commands` 返回的名称,浏览器不会取得 registry 或调用任意插件代码。
|
|
584
|
+
|
|
601
585
|
Node.js 宿主从公开入口导入 SDK:
|
|
602
586
|
|
|
603
587
|
```ts
|
|
604
588
|
import { RpcClient, RPC_PROTOCOL_VERSION } from "@di-code/coding-agent/rpc";
|
|
605
589
|
```
|
|
606
590
|
|
|
591
|
+
`RpcClient` 和 `RpcSupervisor` 提供类型化的状态、prompt/steer/retry/cancel、Session 列表/切换、transcript/tree、模型、压缩、
|
|
592
|
+
operation、附件,以及 Provider、项目 trust、context file 和 MCP 配置 facade;`call()` 只保留给已协商的低层方法。`login()` 的
|
|
593
|
+
API key 只在请求中传递,返回值、事件、Session 和诊断均不包含它。MCP 或 trust 配置成功后,Host 会在空闲状态刷新当前 Session 的
|
|
594
|
+
Skills、context 和 MCP 工具快照;生成或压缩期间会以 `BUSY` 拒绝这类变更。
|
|
595
|
+
附件先经 `createAttachment(name, contentType, base64Data)` 上传,再将返回 ID 传给 `prompt(message, { attachmentIds })`。只接受
|
|
596
|
+
PNG、JPEG、WebP、GIF,每次请求最多 4 个、每个最多 5 MiB;WebUI 将数据保存到每个 client/actor 独立的受管附件目录,
|
|
597
|
+
并在首次 prompt/steer 使用、超时或 Host dispose 时删除;JSONL RPC 没有附件目录时使用同样限制的进程内存存储。
|
|
598
|
+
SDK 不自动重放任何请求,即使子进程退出或事件恢复失败也不例外;调用方必须使用新的 request ID 明确发起重试。
|
|
599
|
+
|
|
600
|
+
事件订阅使用 `subscribe()`。调用 `negotiate(["sequence", "operation_update", "snapshot_required", "product_audit"])` 后,保存收到记录的
|
|
601
|
+
`sequence`,并在重连后通过 `resumeEvents(lastSequence)` 恢复。返回 `snapshotRequired: true` 时,重新读取 state、transcript、tree
|
|
602
|
+
和 usage,而不要推测遗漏的事件。所有 response、event、error code 和 version 都在 SDK JSONL 边界验证;未知事件或不符合 v1
|
|
603
|
+
形状的记录会关闭 client 并拒绝 pending request。
|
|
604
|
+
|
|
605
|
+
RPC client 也有独立的 `rpc-client-sdk` namespace composition entry;嵌入式宿主可以从 `@di-code/coding-agent/rpc-client-sdk` 导入其 `rpcClientSdkKey`,由 Loader 创建 `RpcClient`。`runtime-core`、`composition-loader` 和 `project-trust` 同样提供独立 entry,分别拥有运行时服务、Loader factory 和 trust store 服务。
|
|
606
|
+
|
|
607
607
|
需要监督子进程生命周期时,使用 `@di-code/orchestrator`,不要依赖 coding-agent 的内部文件路径。
|
|
608
608
|
|
|
609
|
+
### WebUI HTTP/SSE
|
|
610
|
+
|
|
611
|
+
`di-code web` 将助手回复渲染为 GitHub Flavored Markdown;嵌入 HTML 不解析,也不会执行。
|
|
612
|
+
|
|
613
|
+
`di-code web [--port <0-65535>]` 是面向浏览器的同源入口,默认使用随机可用端口并且始终只绑定 `127.0.0.1`。同一个 Node 进程拥有静态 SPA、`GET /healthz`、`GET /api/boot` 和现有 HTTP/SSE RPC adapter 的 `/api` 路由;页面只读取 boot/capabilities,实际 prompt、Session 和工具调用仍由 `RpcDispatcher`/`SessionHost` 执行。静态资源来自已安装包的 `dist/web`,API 路由与 SPA fallback 隔离,路径穿越和 symlink 逃逸会被拒绝。首次静态页面响应建立 HttpOnly、SameSite cookie,浏览器不需要知道 transport token。
|
|
614
|
+
|
|
615
|
+
`npm run web:dev` 是源码开发 supervisor:它保留现有 Provider/settings 环境、等待 backend 的真实随机端口、再启动 Vite 代理;若当前 Provider 尚未配置 API key,则 backend 使用 Faux runtime 启动页面,供用户在 Settings 中完成登录,内置 Provider(包括 Zhipu)仍会显示为未配置状态,settings 文件本身的格式或安全校验错误仍会失败。端口冲突会失败,`Ctrl+C` 会终止 backend 和 Vite。它只供本地开发,不能用于远程 bind 或放宽 workspace 授权。
|
|
616
|
+
|
|
617
|
+
Web SPA 的首页读取 `/api/boot`、`list_sessions` 和脱敏 `get_settings` 快照,提供双栏导航、workspace 选择、受管 Session 创建/打开、响应式侧栏,以及拆分为 General/Models 的 Settings overlay。启动时的真实 workspace 与重复 `--workspace` 显式授权且已信任的 workspace 会以不透明 ID 返回,选择后只显示该 workspace 的会话;会话按最后修改时间倒序。侧栏的 `Add workspace` 支持系统目录选择器和将文件夹直接拖入;目录校验通过后立即加入授权列表并切换到该 workspace。工作区行悬停时显示更多与新建会话图标,更多菜单可改名或删除(启动工作区不可删除)。取消选择不会改变当前 workspace。每个 workspace actor 的工具边界使用该 workspace 自身根目录,切换后模型不会继续访问启动目录。设置快照中的每个模型会包含其实际支持的 `reasoningEfforts`;活动 Provider 即使未注册到全局目录也会作为运行时回退返回。对话 store 以 `get_state`、完整 transcript 和 usage snapshot 为权威,消费有序 SSE 来投影 streaming text、thinking、operation 与 usage;重连使用 resume token,收到 `snapshot_required` 或刷新后完整重拉,绝不静默重放 prompt。新建会话会先在列表中显示占位项,首条用户消息生成标题后再替换。图片和文本都作为 durable user message 保存;Web transcript 将持久化图片映射为 data URL 并在对应用户消息中渲染。为读取最大 5 MiB 图片的 base64 JSONL 记录,`get_transcript.maxBytes` 上限为 8 MiB。每个 transcript 消息同时携带 durable entry ID;从完成回复创建分支时,RPC 会以该 entry ID 截断后续上下文、打开新分支并返回其 active session。composer 支持输入法组合、拖放/粘贴/文件选择图片、最多四个 opaque attachment handle、运行时 steer、cancel 和失败 retry。PNG/JPEG/WebP/GIF 单张图片可达 5 MiB,base64 传输按附件上限而非普通 prompt 长度校验,并作为 Provider context 的 image content block 传递。仅模型目录声明 `input: ["text", "image"]` 时,composer 才允许附加图片;文本模型不能静默发送空图片。OpenAI Chat Completions 兼容 Provider 会把用户图片映射为标准的 `image_url` data URL content part。浏览器内仅有预览 object URL;服务端路径、transport token、Provider key 不会出现在页面、事件或错误中。配置中心只接受窄参数 RPC:Provider 登录/登出、自定义 Provider、运行时模型和推理强度、默认 Provider/model、locale 和权限模式;已有工作区 settings 时模型与推理强度保存到工作区,否则保存到用户级 settings。环境变量托管字段只读显示,API key 不会出现在快照、事件或错误中。外观切换仅作用于浏览器本地页面。
|
|
618
|
+
|
|
619
|
+
Web composer 的 Commands 菜单和输入开头的 `/` 都会显示当前 composition 的内置、扩展命令和已加载的 `/skill:<name>`;选择不需要参数的内置或扩展 command 会立即通过 `run_command` 执行,只有 `/skill:<name>` 和 `/steer` 会写入输入框以补充请求内容。`/tree` 打开 Session 树节点弹窗,同一线性分支保持左对齐,只有实际分叉才增加缩进;选择 user 节点会回填其文本并从父节点继续,选择完成的 assistant、tool result 或 summary 节点会从所选节点继续。带 tool call 的中间 assistant 节点不可选择,应选择对应 tool result。树导航不会回滚已经发生的工作区副作用。Web transcript 遇到持久化的显式 Skill 展开消息时,只展示 Skill 名称,不展示其展开正文。
|
|
620
|
+
|
|
621
|
+
对话区的 `Chat`/`Trajectory` tabs 直接消费 `tool_execution_start/end`、`compaction_*`、`usage_update` 和 `tool_approval` 事件。空闲时的 `Compact context` 控制项调用现有 `compact` RPC,生成或压缩期间会禁用。工具卡为 `read`、`write`、`edit`、`bash`、`glob`、`grep` 保留独立状态和折叠输出,edit 结果的 `details.diff/patch` 以纯文本代码块显示;长输出不会注入 HTML。`ask` 模式的审批使用服务端生成的 `approvalId`,浏览器通过 `approve_tool` 回传决定,不能绕过 Agent 的工具校验。
|
|
622
|
+
|
|
623
|
+
`di-code-webui` 是给自定义或嵌入式 HTTP 客户端保留的 token header transport:
|
|
624
|
+
|
|
625
|
+
`di-code-webui` 使用 `webui` composition 创建 `HostManager` 和每个浏览器 client 的 `SessionActor`,再由 `RpcDispatcher` 执行所有 RPC v1
|
|
626
|
+
方法。它通过 `list_commands`/`run_command` 受控投影同一 composition 已注册的命令,不向浏览器暴露 `commandRegistry` 或任意命令执行入口,也不会创建第二个 Agent loop。Web 与 TUI 使用同一套环境变量、工作区和用户级 settings 解析 Provider、模型、语言、thinking 默认值和持久化 Session;client/actor 目录只保存附件等传输临时状态,不能承载 settings 或 Session。设置 `DI_CODE_WEBUI_TOKEN` 为至少 32 个字符的随机值后启动;默认绑定
|
|
627
|
+
`127.0.0.1` 和随机可用端口,可用 `DI_CODE_WEBUI_PORT` 指定端口。`DI_CODE_WEBUI_HOST` 只有与 `DI_CODE_WEBUI_ALLOW_REMOTE=1` 同时设置时才可绑定非回环地址。
|
|
628
|
+
|
|
629
|
+
`POST /rpc`、`GET /events` 和 `POST /attachments` 都要求 `Authorization: Bearer <token>` 或 `X-Di-Code-Token` header。服务拒绝不匹配的
|
|
630
|
+
Host、Origin、token、工作区和超限请求;默认只授权启动时的真实 workspace。每个 client 的持久化 Session 与附件 storage 分离,不能通过 opaque
|
|
631
|
+
Session 或 attachment ID 访问其他 client 的数据。`WebUiServer.rotateToken()` 和 `revokeToken()` 会关闭现有 SSE 订阅并使旧 token 立即失效。
|
|
632
|
+
|
|
633
|
+
SSE 的 `ready` 数据提供 10 分钟有效的 `resumeToken`;每次成功恢复都会轮换 token,旧值立即失效。每个带 sequence 的事件也使用 SSE `id` 字段。空闲连接每 15 秒发送一次 SSE comment keepalive;默认最多 8 个 SSE 连接/浏览器 client、64 个/服务进程,超限返回 `429`。重连以
|
|
634
|
+
`X-Di-Code-Resume-Token` 和 `Last-Event-ID` headers 恢复事件。重放窗口不足时会收到
|
|
635
|
+
`snapshot_required`,调用方必须重新读取 state、transcript、tree 和 usage。连接关闭不会取消 detached operation;使用 `get_operation` 查询,只有
|
|
636
|
+
`cancel` 会取消。终态 operation 默认保留 10 分钟且最多 256 条,过期或超出上限后 `get_operation` 返回 `NOT_FOUND`。附件通过 JSON base64
|
|
637
|
+
上传,限制为 PNG/JPEG/WebP/GIF、每个 5 MiB、每 client 32 个或 64 MiB、TTL 10 分钟,保存在 actor 受管目录中并在首次 prompt/steer
|
|
638
|
+
使用、过期或 Host dispose 后删除。
|
|
639
|
+
|
|
640
|
+
ProductHost 的 login/logout、项目 trust 和 MCP 配置均作为可取消的 detached operation 执行;Session 正在生成或压缩时会返回 `BUSY`。协商 `product_audit` 后,成功变更会发送仅含动作、Provider/MCP 标识或 trust 状态的审计事件,绝不包含 API key 或配置 secret。
|
|
641
|
+
|
|
642
|
+
WebUI 不是沙箱。认证客户端能触发当前 workspace 内的文件和 shell 工具,远程绑定等同于向 token 持有者开放这些能力;不要把 token、Provider
|
|
643
|
+
凭据或 attachment 内容记录到 URL、事件、日志或错误文本。
|
|
644
|
+
|
|
645
|
+
仓库示例 [`examples/webui-client.ts`](../../examples/webui-client.ts) 只使用 HTTP/SSE 公开字段,覆盖完整的最小客户端流程。运行前先构建并以
|
|
646
|
+
`DI_CODE_PROVIDER=faux`、固定 `DI_CODE_WEBUI_PORT` 和至少 32 字符的 `DI_CODE_WEBUI_TOKEN` 启动 `di-code-webui`。自定义 ANSI TUI 的已测试 fixture
|
|
647
|
+
位于 [`test/fixtures/custom-tui.ts`](test/fixtures/custom-tui.ts),只从 `@di-code/coding-agent/ui-host` 和 `@di-code/tui` 导入;它通过 composition
|
|
648
|
+
替换 `interactive-host`,不复制 Session、MCP 或 Agent bootstrap。
|
|
649
|
+
|
|
609
650
|
## 安全边界与故障排查
|
|
610
651
|
|
|
611
652
|
- 在可信项目根目录运行;`bash` 不是沙箱,插件也没有沙箱。
|
|
612
653
|
- 向导会将输入的 API key 保存到用户全局 `~/.di-code/settings.json`;不要放入 prompt、Skill、插件源码、会话、图片、项目配置或 Git。
|
|
613
|
-
- 项目 Skill
|
|
654
|
+
- 项目 Skill 和 MCP 配置默认不加载;交互式 TTY 首次发现这些内容时会询问一次,`--trust-project` / `--untrust-project` 可显式控制。该决定不会导入旧项目本地插件目录,也不会赋予额外系统权限。
|
|
614
655
|
- Provider、模型、图片、配置和工具参数都会校验;外部项目内容和模型输出仍应视作不可信输入。
|
|
615
656
|
|
|
616
657
|
| 问题 | 优先检查 |
|
|
617
658
|
| --- | --- |
|
|
618
659
|
| `Provider is not configured` | 设置 `DI_CODE_PROVIDER` 及对应 API key;或在 TTY 中运行 `di-code` 使用向导;离线测试使用 `faux` |
|
|
619
660
|
| `Unknown model` | 确认 `DI_CODE_MODEL` 属于当前 `DI_CODE_PROVIDER` |
|
|
620
|
-
| 项目 Skill /
|
|
661
|
+
| 项目 Skill / MCP 没有加载 | Skill 目录是否为 `.di-code/skills` 或 `.agents/skills`,或检查 `.mcp.json`;交互式启动时确认 trust 提示,或运行 `di-code --trust-project --interactive` |
|
|
621
662
|
| `Unknown skill` | Skill 是否有正确 `SKILL.md` frontmatter,名称是否匹配 `/skill:<name>`;检查是否被 `--no-skills` 禁用 |
|
|
622
|
-
|
|
|
663
|
+
| plugin Loader 诊断 | 检查 `package.json.diCode.plugins`、对应 `exports`、namespace `name`/`apply` 与 `di-code --dump-composition` 输出;详见插件指南 |
|
|
623
664
|
| 图片被拒绝 | 确认格式、4 张/5 MiB 限制,以及模型 `input` 包含 `image` |
|
|
624
665
|
| 文件工具无法访问路径 | 从工作根目录启动,且目标未越出根目录;二进制文件不支持 |
|
|
625
666
|
|
|
@@ -629,3 +670,6 @@ import { RpcClient, RPC_PROTOCOL_VERSION } from "@di-code/coding-agent/rpc";
|
|
|
629
670
|
- 插件详细指南:[GitHub 上的《插件使用指南》](https://github.com/qddidi/di-code/blob/main/docs/%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.md)
|
|
630
671
|
- 问题反馈:<https://github.com/qddidi/di-code/issues>
|
|
631
672
|
- 许可证:[MIT](https://github.com/qddidi/di-code/blob/main/LICENSE)
|
|
673
|
+
WebUI 高级设置通过 RPC v1 暴露 `list_plugins` 与可取消的 `set_plugin_enabled`;Skills、MCP、Trust 和配置快照沿用现有窄方法,不提供任意命令执行入口。插件权限仅用于声明和审计,Workspace trust 只影响项目本地 Skills、MCP 与 composition 加载。
|
|
674
|
+
|
|
675
|
+
Web 插件扩展通过新增的 `list_web_contributions` RPC 返回 version `1` 的声明式 manifest。宿主只按白名单 `componentKey` 映射 `app.sidebar`、`session.tree`、`conversation.node`、`conversation.tool` 和 `settings.panel` slot;插件命令、任意 URL/HTML/JS 和完整 dispatcher 不会进入浏览器。贡献按 `order` 稳定排序并绑定 owner disposer,Workspace 未信任时不暴露项目插件 Web 声明;插件失败或卸载只影响其 slot,不影响 Agent loop、Session 或核心页面。
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
entries:
|
|
2
|
+
- { id: Bootstrap, name: "@di-code/builtins/bootstrap" }
|
|
3
|
+
- { id: runtime-core, name: "@di-code/coding-agent/runtime-core-entry", dependsOn: [Bootstrap] }
|
|
4
|
+
- { id: composition-loader, name: "@di-code/coding-agent/composition-loader-entry", dependsOn: [runtime-core] }
|
|
5
|
+
- { id: project-trust, name: "@di-code/coding-agent/project-trust-entry", dependsOn: [runtime-core], required: false }
|
|
6
|
+
- { id: command-core, name: "@di-code/builtins/command-core", dependsOn: [Bootstrap] }
|
|
7
|
+
- { id: cli-parser, name: "@di-code/builtins/cli-parser", dependsOn: [command-core] }
|
|
8
|
+
- { id: runtime, name: "@di-code/builtins/runtime", dependsOn: [Bootstrap] }
|
|
9
|
+
- { id: diagnostics, name: "@di-code/builtins/diagnostics", dependsOn: [runtime] }
|
|
10
|
+
- { id: process-exit, name: "@di-code/builtins/process-exit", dependsOn: [runtime] }
|
|
11
|
+
- { id: plugin-manager, name: "@di-code/coding-agent/plugin-manager", dependsOn: [command-core] }
|
|
12
|
+
- { id: plugin-inventory, name: "@di-code/coding-agent/plugin-inventory", dependsOn: [runtime] }
|
|
13
|
+
- { id: provider-registry, name: "@di-code/builtins/provider-registry" }
|
|
14
|
+
- { id: model-catalog, name: "@di-code/builtins/model-catalog", dependsOn: [provider-registry] }
|
|
15
|
+
- { id: credential-env, name: "@di-code/builtins/credential-env", dependsOn: [provider-registry] }
|
|
16
|
+
- { id: runtime-selection, name: "@di-code/builtins/runtime-selection", dependsOn: [provider-registry] }
|
|
17
|
+
- { id: provider-faux, name: "@di-code/builtins/provider-faux", dependsOn: [provider-registry] }
|
|
18
|
+
- { id: provider-openai, name: "@di-code/builtins/provider-openai", dependsOn: [provider-registry, runtime-selection, credential-env], required: false }
|
|
19
|
+
- { id: provider-anthropic, name: "@di-code/builtins/provider-anthropic", dependsOn: [provider-registry, runtime-selection, credential-env], required: false }
|
|
20
|
+
- { id: provider-deepseek, name: "@di-code/builtins/provider-deepseek", dependsOn: [provider-registry, runtime-selection, credential-env], required: false }
|
|
21
|
+
- { id: provider-kimi, name: "@di-code/builtins/provider-kimi", dependsOn: [provider-registry, runtime-selection, credential-env], required: false }
|
|
22
|
+
- { id: provider-zhipu, name: "@di-code/builtins/provider-zhipu", dependsOn: [provider-registry, runtime-selection, credential-env], required: false }
|
|
23
|
+
- { id: provider-onboarding, name: "@di-code/builtins/provider-onboarding", dependsOn: [provider-registry, credential-env], required: false }
|
|
24
|
+
- { id: session-memory, name: "@di-code/builtins/session-memory", dependsOn: [runtime] }
|
|
25
|
+
- { id: tool-registry, name: "@di-code/builtins/tool-registry", dependsOn: [runtime] }
|
|
26
|
+
- { id: workspace, name: "@di-code/builtins/workspace", dependsOn: [tool-registry] }
|
|
27
|
+
- { id: process, name: "@di-code/builtins/process", dependsOn: [tool-registry] }
|
|
28
|
+
- { id: network, name: "@di-code/builtins/network", dependsOn: [tool-registry] }
|
|
29
|
+
- { id: tool-approval, name: "@di-code/builtins/tool-approval", dependsOn: [tool-registry] }
|
|
30
|
+
- { id: tool-policy, name: "@di-code/builtins/tool-policy", dependsOn: [tool-registry] }
|
|
31
|
+
- { id: tool-output, name: "@di-code/builtins/tool-output", dependsOn: [tool-registry] }
|
|
32
|
+
- { id: tool-read, name: "@di-code/builtins/tool-read", dependsOn: [tool-registry, workspace] }
|
|
33
|
+
- { id: tool-write, name: "@di-code/builtins/tool-write", dependsOn: [tool-registry, workspace] }
|
|
34
|
+
- { id: tool-edit, name: "@di-code/builtins/tool-edit", dependsOn: [tool-registry, workspace] }
|
|
35
|
+
- { id: tool-bash, name: "@di-code/builtins/tool-bash", dependsOn: [tool-registry, workspace] }
|
|
36
|
+
- { id: tool-glob, name: "@di-code/builtins/tool-glob", dependsOn: [tool-registry, workspace] }
|
|
37
|
+
- { id: tool-grep, name: "@di-code/builtins/tool-grep", dependsOn: [tool-registry, workspace] }
|
|
38
|
+
- { id: tool-load-skill, name: "@di-code/builtins/tool-load-skill", dependsOn: [tool-registry, workspace] }
|
|
39
|
+
- { id: session-store-registry, name: "@di-code/builtins/session-store-jsonl", dependsOn: [runtime] }
|
|
40
|
+
- { id: session-migrations, name: "@di-code/builtins/session-migrations", dependsOn: [session-store-registry] }
|
|
41
|
+
- { id: session-store-jsonl, name: "@di-code/coding-agent/session-store-jsonl-entry", dependsOn: [session-store-registry, session-migrations] }
|
|
42
|
+
- { id: session-tree, name: "@di-code/builtins/session-tree", dependsOn: [session-store-jsonl] }
|
|
43
|
+
- { id: session-query, name: "@di-code/builtins/session-query", dependsOn: [session-store-jsonl] }
|
|
44
|
+
- { id: usage-meter, name: "@di-code/builtins/usage-meter", dependsOn: [runtime] }
|
|
45
|
+
- { id: context-budget, name: "@di-code/builtins/context-budget", dependsOn: [runtime] }
|
|
46
|
+
- { id: compaction-basic, name: "@di-code/builtins/compaction-basic", dependsOn: [context-budget] }
|
|
47
|
+
- { id: compaction-tool-result, name: "@di-code/builtins/compaction-tool-result", dependsOn: [compaction-basic] }
|
|
48
|
+
- { id: system-prompt, name: "@di-code/builtins/system-prompt", dependsOn: [runtime] }
|
|
49
|
+
- { id: resource-loader, name: "@di-code/builtins/resource-loader", dependsOn: [runtime] }
|
|
50
|
+
- { id: skills, name: "@di-code/builtins/skills", dependsOn: [resource-loader] }
|
|
51
|
+
- { id: mcp-config, name: "@di-code/coding-agent/mcp-config-entry", dependsOn: [runtime] }
|
|
52
|
+
- { id: mcp-transport, name: "@di-code/coding-agent/mcp-transport-entry", dependsOn: [mcp-config] }
|
|
53
|
+
- { id: mcp-client, name: "@di-code/coding-agent/mcp-client-entry", dependsOn: [mcp-config, mcp-transport] }
|
|
54
|
+
- { id: mcp-tools, name: "@di-code/coding-agent/mcp-tools-entry", dependsOn: [mcp-config, mcp-client] }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
entries:
|
|
2
|
+
- { id: agent-session, name: "@di-code/builtins/agent-session", dependsOn: [provider-registry, tool-registry, context-budget, system-prompt, compaction-basic, compaction-tool-result] }
|
|
3
|
+
- { id: session-factory, name: "@di-code/coding-agent/session-factory-entry", dependsOn: [agent-session] }
|
|
4
|
+
- { id: interactive-resources, name: "@di-code/coding-agent/interactive-resources-entry", dependsOn: [system-prompt, resource-loader, skills] }
|
|
5
|
+
- { id: command-session, name: "@di-code/builtins/command-session", dependsOn: [command-core] }
|
|
6
|
+
- { id: command-model, name: "@di-code/builtins/command-model", dependsOn: [command-core] }
|
|
7
|
+
- { id: command-settings, name: "@di-code/builtins/command-settings", dependsOn: [command-core] }
|
|
8
|
+
- { id: command-compact, name: "@di-code/builtins/command-compact", dependsOn: [command-core] }
|
|
9
|
+
- { id: command-interactive-core, name: "@di-code/builtins/command-interactive-core", dependsOn: [command-core] }
|
|
10
|
+
- { id: theme, name: "@di-code/builtins/theme", dependsOn: [command-core] }
|
|
11
|
+
- { id: interactive-context, name: "@di-code/builtins/interactive-context", dependsOn: [command-core] }
|
|
12
|
+
- { id: tui-renderer, name: "@di-code/builtins/tui-renderer", dependsOn: [command-core] }
|
|
13
|
+
- { id: mode-interactive, name: "@di-code/builtins/mode-interactive", dependsOn: [command-core] }
|
|
14
|
+
- { id: interactive-host, name: "@di-code/coding-agent/interactive-host-entry", dependsOn: [session-factory, session-store-jsonl, interactive-resources, mcp-config, mcp-client, mcp-tools, interactive-context, mode-interactive] }
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
entries:
|
|
2
|
+
- id: agent-loop
|
|
3
|
+
name: "@di-code/builtins/agent-loop"
|
|
4
|
+
dependsOn: [runtime-selection, provider-faux, session-memory, tool-registry, workspace, process, network, tool-approval, tool-policy, tool-output]
|
|
5
|
+
- { id: output-json, name: "@di-code/builtins/output-json", dependsOn: [command-core] }
|
|
6
|
+
- { id: mode-json, name: "@di-code/builtins/mode-json", dependsOn: [command-core, agent-loop, output-json] }
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
entries:
|
|
2
|
+
- id: agent-loop
|
|
3
|
+
name: "@di-code/builtins/agent-loop"
|
|
4
|
+
dependsOn: [runtime-selection, provider-faux, session-memory, tool-registry, workspace, process, network, tool-approval, tool-policy, tool-output]
|
|
5
|
+
- { id: mode-print, name: "@di-code/builtins/mode-print", dependsOn: [Bootstrap, command-core, agent-loop] }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
entries:
|
|
2
|
+
- { id: rpc-client-sdk, name: "@di-code/coding-agent/rpc-client-sdk-entry", dependsOn: [runtime-core] }
|
|
3
|
+
- { id: command-core, name: "@di-code/builtins/command-core", dependsOn: [Bootstrap] }
|
|
4
|
+
- { id: mode-rpc, name: "@di-code/builtins/mode-rpc", dependsOn: [command-core] }
|
|
5
|
+
- { id: agent-session, name: "@di-code/builtins/agent-session", dependsOn: [provider-registry, tool-registry, system-prompt, compaction-basic, compaction-tool-result] }
|
|
6
|
+
- { id: session-factory, name: "@di-code/coding-agent/session-factory-entry", dependsOn: [agent-session] }
|
|
7
|
+
|
|
8
|
+
# RpcDispatcher uses the same persistent product host as the interactive profile.
|
|
9
|
+
- { id: interactive-resources, name: "@di-code/coding-agent/interactive-resources-entry", dependsOn: [system-prompt, resource-loader, skills] }
|
|
10
|
+
- { id: rpc-protocol-v1, name: "@di-code/builtins/rpc-protocol-v1", dependsOn: [session-factory] }
|
|
11
|
+
- { id: rpc-server, name: "@di-code/coding-agent/rpc-server-entry", dependsOn: [rpc-protocol-v1, session-factory, session-store-jsonl, interactive-resources, mcp-config, mcp-client, mcp-tools, mode-rpc] }
|
|
12
|
+
- { id: rpc-events, name: "@di-code/builtins/rpc-events", dependsOn: [rpc-server] }
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
entries:
|
|
2
|
+
- { id: command-session, name: "@di-code/builtins/command-session", dependsOn: [command-core] }
|
|
3
|
+
- { id: command-model, name: "@di-code/builtins/command-model", dependsOn: [command-core] }
|
|
4
|
+
- { id: command-settings, name: "@di-code/builtins/command-settings", dependsOn: [command-core] }
|
|
5
|
+
- { id: command-compact, name: "@di-code/builtins/command-compact", dependsOn: [command-core] }
|
|
6
|
+
- { id: command-interactive-core, name: "@di-code/builtins/command-interactive-core", dependsOn: [command-core] }
|
|
7
|
+
- { id: agent-session, name: "@di-code/builtins/agent-session", dependsOn: [provider-registry, tool-registry, system-prompt, compaction-basic, compaction-tool-result] }
|
|
8
|
+
- { id: session-factory, name: "@di-code/coding-agent/session-factory-entry", dependsOn: [agent-session] }
|
|
9
|
+
- { id: interactive-resources, name: "@di-code/coding-agent/interactive-resources-entry", dependsOn: [system-prompt, resource-loader, skills] }
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
|
+
import type { CliParser } from "@di-code/builtins";
|
|
1
2
|
import { type Locale } from "./i18n.ts";
|
|
2
3
|
export type OutputMode = "print" | "json" | "interactive";
|
|
4
|
+
export type CompositionProfile = OutputMode;
|
|
3
5
|
export type CliCommand = {
|
|
4
6
|
kind: "help";
|
|
5
7
|
} | {
|
|
6
8
|
kind: "version";
|
|
9
|
+
} | {
|
|
10
|
+
kind: "web";
|
|
11
|
+
port: number;
|
|
12
|
+
workspaces?: readonly string[];
|
|
13
|
+
} | {
|
|
14
|
+
kind: "observe";
|
|
15
|
+
action: "trace" | "dump-composition";
|
|
7
16
|
} | {
|
|
8
17
|
kind: "plugin";
|
|
9
|
-
action: "install" | "list" | "enable" | "disable" | "update" | "remove";
|
|
18
|
+
action: "install" | "list" | "get" | "enable" | "disable" | "update" | "remove";
|
|
10
19
|
argument?: string;
|
|
11
20
|
} | {
|
|
12
21
|
kind: "mcp";
|
|
@@ -26,6 +35,12 @@ export type CliCommand = {
|
|
|
26
35
|
imagePaths?: readonly string[];
|
|
27
36
|
noSkills?: true;
|
|
28
37
|
noContextFiles?: true;
|
|
38
|
+
/** Selects the composition matching the output mode. */
|
|
39
|
+
profile?: CompositionProfile;
|
|
40
|
+
/** An explicit composition document applied after user and project layers. */
|
|
41
|
+
compositionPath?: string;
|
|
42
|
+
/** Excludes the project composition layer without affecting user-managed plugins. */
|
|
43
|
+
noProjectPlugins?: true;
|
|
29
44
|
skillPaths?: readonly string[];
|
|
30
45
|
projectTrust?: boolean;
|
|
31
46
|
};
|
|
@@ -34,6 +49,8 @@ export declare class CliUsageError extends Error {
|
|
|
34
49
|
}
|
|
35
50
|
export declare function parseCliArgs(args: readonly string[]): CliCommand;
|
|
36
51
|
export declare function helpText(locale: Locale): string;
|
|
52
|
+
/** Product-owned parser service consumed by the CLI composition entry. */
|
|
53
|
+
export declare function createCliParser(): CliParser<CliCommand>;
|
|
37
54
|
export interface CliDependencies {
|
|
38
55
|
stdout(text: string): void;
|
|
39
56
|
stderr(text: string): void;
|
|
@@ -43,11 +60,15 @@ export interface CliDependencies {
|
|
|
43
60
|
plugin?(command: Extract<CliCommand, {
|
|
44
61
|
kind: "plugin";
|
|
45
62
|
}>): Promise<number>;
|
|
63
|
+
observe?(command: Extract<CliCommand, {
|
|
64
|
+
kind: "observe";
|
|
65
|
+
}>): Promise<number>;
|
|
46
66
|
mcp?(command: Extract<CliCommand, {
|
|
47
67
|
kind: "mcp";
|
|
48
68
|
}>): Promise<number>;
|
|
49
69
|
readonly version: string;
|
|
50
70
|
readonly locale?: Locale;
|
|
71
|
+
readonly parser?: CliParser<CliCommand>;
|
|
51
72
|
}
|
|
52
73
|
export declare function runCli(args: readonly string[], dependencies: CliDependencies): Promise<number>;
|
|
53
74
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,MAAM,EAAa,MAAM,WAAW,CAAC;AAEnE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|