@harmonyos-arkts/opencode-acp 0.0.1 → 0.0.3
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/CHANGELOG.md +91 -0
- package/README.md +100 -38
- package/README.zh.md +41 -39
- package/dist/index.cjs +1420 -215
- package/dist/index.cjs.map +4 -4
- package/docs/codebase-overview.md +191 -0
- package/docs/mcp-extmethod-design.md +366 -0
- package/docs/provider-config-flow.md +312 -0
- package/docs/question-asked.md +35 -18
- package/docs/session-stats-to-vscode-design.md +217 -0
- package/docs/subagent-visibility.md +26 -25
- package/docs/tui-vs-acp-analysis.md +36 -36
- package/package.json +10 -4
|
@@ -14,15 +14,15 @@ OpenCode 的 agent 可以通过 Task 工具创建子 agent(subagent)来并
|
|
|
14
14
|
|
|
15
15
|
```typescript
|
|
16
16
|
export interface SessionState {
|
|
17
|
-
id: string
|
|
18
|
-
cwd: string
|
|
19
|
-
parentID?: string
|
|
20
|
-
title?: string
|
|
21
|
-
mcpServers: McpServer[]
|
|
22
|
-
createdAt: Date
|
|
23
|
-
model?: { providerID: string; modelID: string }
|
|
24
|
-
variant?: string
|
|
25
|
-
modeId?: string
|
|
17
|
+
id: string;
|
|
18
|
+
cwd: string;
|
|
19
|
+
parentID?: string; // 子 session 有,顶层 session 没有
|
|
20
|
+
title?: string;
|
|
21
|
+
mcpServers: McpServer[];
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
model?: { providerID: string; modelID: string };
|
|
24
|
+
variant?: string;
|
|
25
|
+
modeId?: string;
|
|
26
26
|
}
|
|
27
27
|
```
|
|
28
28
|
|
|
@@ -30,8 +30,8 @@ export interface SessionState {
|
|
|
30
30
|
|
|
31
31
|
```typescript
|
|
32
32
|
class SessionManager {
|
|
33
|
-
private sessions = new Map<string, SessionState>()
|
|
34
|
-
private children = new Map<string, Set<string>>()
|
|
33
|
+
private sessions = new Map<string, SessionState>(); // sessionId → state
|
|
34
|
+
private children = new Map<string, Set<string>>(); // parentId → childIds
|
|
35
35
|
}
|
|
36
36
|
```
|
|
37
37
|
|
|
@@ -102,6 +102,7 @@ ACP Client ◄── session_info_update ────────────
|
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
关键设计:
|
|
105
|
+
|
|
105
106
|
- 子 session 用**自己的 sessionId** 发送 `session_info_update`,不是用父 session 的
|
|
106
107
|
- `_meta.parentSessionId` 让客户端知道它是子 session
|
|
107
108
|
- `_meta.isSubagent = true` 标记身份
|
|
@@ -151,20 +152,20 @@ findRootSession("ses_grandchild")
|
|
|
151
152
|
|
|
152
153
|
## 关键方法说明
|
|
153
154
|
|
|
154
|
-
| 方法
|
|
155
|
-
|
|
156
|
-
| `SessionManager.registerDiscovered()` | session-manager.ts:97
|
|
157
|
-
| `SessionManager.findRootSession()`
|
|
158
|
-
| `SessionManager.getRelatedSessions()` | session-manager.ts:135 | 获取 session 子树所有 ID(含自身)
|
|
159
|
-
| `EventHandler.resolveSession()`
|
|
160
|
-
| `EventHandler.announceChildSession()` | event-handler.ts:421
|
|
155
|
+
| 方法 | 文件 | 作用 |
|
|
156
|
+
| ------------------------------------- | ---------------------- | ----------------------------------------------------- |
|
|
157
|
+
| `SessionManager.registerDiscovered()` | session-manager.ts:97 | 自动注册 SSE 发现的子 session,建立 parent-child 索引 |
|
|
158
|
+
| `SessionManager.findRootSession()` | session-manager.ts:123 | 递归向上查找顶层 session(沿 parent 链) |
|
|
159
|
+
| `SessionManager.getRelatedSessions()` | session-manager.ts:135 | 获取 session 子树所有 ID(含自身) |
|
|
160
|
+
| `EventHandler.resolveSession()` | event-handler.ts:169 | 路由事件:直接查找 → 向上查找 → 返回 sessionId 和 cwd |
|
|
161
|
+
| `EventHandler.announceChildSession()` | event-handler.ts:421 | 向 ACP 客户端发送 session_info_update 通知子 session |
|
|
161
162
|
|
|
162
163
|
## 与 OpenCode 内置 ACP 的对比
|
|
163
164
|
|
|
164
|
-
| 方面
|
|
165
|
-
|
|
166
|
-
| 顶层 session 注册
|
|
167
|
-
| 子 session 注册
|
|
168
|
-
| parent-child 索引
|
|
169
|
-
| 子 session 事件路由
|
|
170
|
-
| 客户端子 session 感知 | ❌ 客户端不知道子 session 存在
|
|
165
|
+
| 方面 | OpenCode 内置 ACP | Harmony-ACP |
|
|
166
|
+
| --------------------- | -------------------------------- | -------------------------------------------- |
|
|
167
|
+
| 顶层 session 注册 | ✅ newSession/loadSession 时注册 | ✅ 同上 |
|
|
168
|
+
| 子 session 注册 | ❌ 不注册,事件丢弃 | ✅ SSE 事件自动发现并注册 |
|
|
169
|
+
| parent-child 索引 | ❌ 无 | ✅ `children` Map 维护 |
|
|
170
|
+
| 子 session 事件路由 | ❌ 无法路由 | ✅ `resolveSession()` 正确路由 |
|
|
171
|
+
| 客户端子 session 感知 | ❌ 客户端不知道子 session 存在 | ✅ 通过 `session_info_update` + `_meta` 通知 |
|
|
@@ -2,45 +2,45 @@
|
|
|
2
2
|
|
|
3
3
|
## 已实现的能力
|
|
4
4
|
|
|
5
|
-
| 能力
|
|
6
|
-
|
|
7
|
-
| 会话创建/加载
|
|
8
|
-
| 会话列表/切换
|
|
9
|
-
| 会话 Fork
|
|
10
|
-
| 会话恢复
|
|
11
|
-
| Prompt(文本/图片) | ✅
|
|
12
|
-
| 取消执行
|
|
13
|
-
| 消息流式输出
|
|
14
|
-
| 思考过程流式输出
|
|
15
|
-
| Tool Call 生命周期
|
|
16
|
-
| 权限请求
|
|
17
|
-
| 问题回答
|
|
18
|
-
| 子会话可见性
|
|
19
|
-
| 模式切换
|
|
20
|
-
| 模型切换
|
|
21
|
-
| Token/费用追踪
|
|
22
|
-
| Diff 显示
|
|
23
|
-
| 流量日志
|
|
5
|
+
| 能力 | TUI | Harmony-ACP | 说明 |
|
|
6
|
+
| ------------------- | --- | ----------- | ------------------------------------------ |
|
|
7
|
+
| 会话创建/加载 | ✅ | ✅ | newSession, loadSession |
|
|
8
|
+
| 会话列表/切换 | ✅ | ✅ | listSessions |
|
|
9
|
+
| 会话 Fork | ✅ | ✅ | forkSession |
|
|
10
|
+
| 会话恢复 | ✅ | ✅ | resumeSession |
|
|
11
|
+
| Prompt(文本/图片) | ✅ | ✅ | 支持文本、图片、资源 |
|
|
12
|
+
| 取消执行 | ✅ | ✅ | cancel |
|
|
13
|
+
| 消息流式输出 | ✅ | ✅ | agent_message_chunk |
|
|
14
|
+
| 思考过程流式输出 | ✅ | ✅ | agent_thought_chunk |
|
|
15
|
+
| Tool Call 生命周期 | ✅ | ✅ | pending → running → completed/failed |
|
|
16
|
+
| 权限请求 | ✅ | ✅ | requestPermission |
|
|
17
|
+
| 问题回答 | ✅ | ✅ | extMethod("questionAsked") |
|
|
18
|
+
| 子会话可见性 | ✅ | ✅ | 独立虚拟 session + parent-child 关联 |
|
|
19
|
+
| 模式切换 | ✅ | ✅ | setSessionMode |
|
|
20
|
+
| 模型切换 | ✅ | ✅ | setSessionModel |
|
|
21
|
+
| Token/费用追踪 | ✅ | ✅ | usage_update |
|
|
22
|
+
| Diff 显示 | ✅ | ✅ | edit tool 带 diff content |
|
|
23
|
+
| 流量日志 | ❌ | ✅ | Harmony-ACP 独有能力,全量 ACP/OC 流量记录 |
|
|
24
24
|
|
|
25
25
|
## 未实现 / 缺失的能力
|
|
26
26
|
|
|
27
|
-
| 能力
|
|
28
|
-
|
|
29
|
-
| **Plan 更新**
|
|
30
|
-
| **Session 删除**
|
|
31
|
-
| **Session 重命名** | ✅
|
|
32
|
-
| **Session 压缩**
|
|
33
|
-
| **Undo/Redo**
|
|
34
|
-
| **Share/Export**
|
|
35
|
-
| **Todo 更新**
|
|
36
|
-
| **认证**
|
|
37
|
-
| **Modes 填充**
|
|
38
|
-
| **Model Options**
|
|
39
|
-
| **Context Size**
|
|
40
|
-
| **LSP/MCP 状态**
|
|
41
|
-
| **VCS 分支**
|
|
42
|
-
| **诊断信息**
|
|
43
|
-
| **资源链接处理**
|
|
27
|
+
| 能力 | TUI 有 | Harmony-ACP | 影响 |
|
|
28
|
+
| ------------------ | ------ | ----------- | --------------------------------------------- |
|
|
29
|
+
| **Plan 更新** | ✅ | ❌ | plan_update 未实现,planning agent 输出不可见 |
|
|
30
|
+
| **Session 删除** | ✅ | ❌ | 无 deleteSession |
|
|
31
|
+
| **Session 重命名** | ✅ | ❌ | 无 rename |
|
|
32
|
+
| **Session 压缩** | ✅ | ❌ | compact 消息未转发 |
|
|
33
|
+
| **Undo/Redo** | ✅ | ❌ | 撤销/重做消息 |
|
|
34
|
+
| **Share/Export** | ✅ | ❌ | 分享/导出会话 |
|
|
35
|
+
| **Todo 更新** | ✅ | ❌ | todo.updated 事件未处理 |
|
|
36
|
+
| **认证** | ❌ | ❌ | 声明了 auth 但未实现 |
|
|
37
|
+
| **Modes 填充** | 部分 | ⚠️ | TODO: mode loading 未完成 |
|
|
38
|
+
| **Model Options** | 部分 | ⚠️ | TODO: 从 providers 填充 |
|
|
39
|
+
| **Context Size** | ✅ | ⚠️ | usage_update 中 size 硬编码为 0 |
|
|
40
|
+
| **LSP/MCP 状态** | ✅ | ❌ | 未转发 LSP、MCP、VCS 状态 |
|
|
41
|
+
| **VCS 分支** | ✅ | ❌ | vcs.branch.updated 未转发 |
|
|
42
|
+
| **诊断信息** | ✅ | ❌ | LSP errors/warnings 未转发 |
|
|
43
|
+
| **资源链接处理** | ✅ | ⚠️ | 非文本 resource_link 被跳过 |
|
|
44
44
|
|
|
45
45
|
## 按优先级排序
|
|
46
46
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@harmonyos-arkts/opencode-acp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Enhanced ACP (Agent Client Protocol) server for OpenCode with subagent visibility",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -11,26 +11,32 @@
|
|
|
11
11
|
"dist/index.cjs",
|
|
12
12
|
"dist/index.cjs.map",
|
|
13
13
|
"README.zh.md",
|
|
14
|
+
"CHANGELOG.md",
|
|
14
15
|
"docs/"
|
|
15
16
|
],
|
|
16
17
|
"scripts": {
|
|
18
|
+
"format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"",
|
|
17
19
|
"prepublishOnly": "npm run build",
|
|
18
20
|
"build": "node scripts/build.mjs",
|
|
19
21
|
"typecheck": "tsc --noEmit",
|
|
20
22
|
"dev": "node --watch src/index.ts",
|
|
21
|
-
"test": "
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
22
25
|
"test:integration": "node scripts/test-integration.mjs",
|
|
23
26
|
"logs": "node scripts/view-log.mjs",
|
|
24
27
|
"logs:filter": "node scripts/view-log.mjs --filter"
|
|
25
28
|
},
|
|
26
29
|
"dependencies": {
|
|
27
30
|
"@agentclientprotocol/sdk": "^0.16.1",
|
|
28
|
-
"@opencode-ai/sdk": "latest"
|
|
31
|
+
"@opencode-ai/sdk": "latest",
|
|
32
|
+
"diff": "^9.0.0"
|
|
29
33
|
},
|
|
30
34
|
"devDependencies": {
|
|
31
35
|
"@types/node": "^22.19.17",
|
|
32
36
|
"esbuild": "^0.25.0",
|
|
33
|
-
"
|
|
37
|
+
"prettier": "^3.8.3",
|
|
38
|
+
"typescript": "^5.7.0",
|
|
39
|
+
"vitest": "^4.1.5"
|
|
34
40
|
},
|
|
35
41
|
"engines": {
|
|
36
42
|
"node": ">=18.0.0"
|