@wangchenglai/dsh-acp-session 0.1.0 → 0.1.1
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 +84 -77
- package/index.js +526 -526
- package/lib/replay.js +94 -94
- package/lib/store.js +156 -156
- package/package.json +38 -39
- package/profile-patch.yml +15 -15
- package/start-acp.sh +64 -24
package/README.md
CHANGED
|
@@ -1,77 +1,84 @@
|
|
|
1
|
-
# @wangchenglai/dsh-acp-session
|
|
2
|
-
|
|
3
|
-
给 DeepSeek Harness 的 ACP 补上三件事,让客户端只用**标准 ACP** 就能管理会话:
|
|
4
|
-
|
|
5
|
-
| 能力 | dsh 自带 | 本插件 |
|
|
6
|
-
|---|---|---|
|
|
7
|
-
| `session/list` 返回 `title` / `updatedAt` | ❌ 只有 id + cwd | ✅ 用 `sessionPersistence` 补上 |
|
|
8
|
-
| `session/load`(回放历史) | ❌ 未实现 | ✅ `session/resume` + 按 `session/update` 回放 |
|
|
9
|
-
| `session/delete` | ❌ 未实现 | ✅ 关闭会话 + 删除会话目录 |
|
|
10
|
-
|
|
11
|
-
## 原理
|
|
12
|
-
|
|
13
|
-
不 fork、不修改 dsh 源码,而是"套"在它外面:
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
浏览器 ──stdio──▶ [本插件:消息中继] ──进程内 stream──▶ @deepseek-ai/dsh-acp
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
`@deepseek-ai/dsh-acp` 的配置里有 `stream` 字段(运行时 transport),本插件用它把
|
|
20
|
-
上游 ACP 接到进程内的双工通道上,自己接管真正的 stdio:
|
|
21
|
-
|
|
22
|
-
- 普通消息:原样双向转发
|
|
23
|
-
- `session/list`:转发后补 `title` / `updatedAt`
|
|
24
|
-
- `session/load`:`session/resume`("already active" 视为成功)+ 回放历史 + 返回 `{}`
|
|
25
|
-
- `session/delete`:`session/close`(忽略失败)+ 删会话目录 + 返回 `{}`
|
|
26
|
-
|
|
27
|
-
会话数据全部通过 dsh 自己的 `ctx.sessionPersistence`(`list` / `resolveCurrentLog` /
|
|
28
|
-
`readStoredLog`)读取,不再自己解压 `session.v4.jsonl.zstd`。
|
|
29
|
-
|
|
30
|
-
## 安装(镜像内)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
&&
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
`
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
1
|
+
# @wangchenglai/dsh-acp-session
|
|
2
|
+
|
|
3
|
+
给 DeepSeek Harness 的 ACP 补上三件事,让客户端只用**标准 ACP** 就能管理会话:
|
|
4
|
+
|
|
5
|
+
| 能力 | dsh 自带 | 本插件 |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| `session/list` 返回 `title` / `updatedAt` | ❌ 只有 id + cwd | ✅ 用 `sessionPersistence` 补上 |
|
|
8
|
+
| `session/load`(回放历史) | ❌ 未实现 | ✅ `session/resume` + 按 `session/update` 回放 |
|
|
9
|
+
| `session/delete` | ❌ 未实现 | ✅ 关闭会话 + 删除会话目录 |
|
|
10
|
+
|
|
11
|
+
## 原理
|
|
12
|
+
|
|
13
|
+
不 fork、不修改 dsh 源码,而是"套"在它外面:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
浏览器 ──stdio──▶ [本插件:消息中继] ──进程内 stream──▶ @deepseek-ai/dsh-acp
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`@deepseek-ai/dsh-acp` 的配置里有 `stream` 字段(运行时 transport),本插件用它把
|
|
20
|
+
上游 ACP 接到进程内的双工通道上,自己接管真正的 stdio:
|
|
21
|
+
|
|
22
|
+
- 普通消息:原样双向转发
|
|
23
|
+
- `session/list`:转发后补 `title` / `updatedAt`
|
|
24
|
+
- `session/load`:`session/resume`("already active" 视为成功)+ 回放历史 + 返回 `{}`
|
|
25
|
+
- `session/delete`:`session/close`(忽略失败)+ 删会话目录 + 返回 `{}`
|
|
26
|
+
|
|
27
|
+
会话数据全部通过 dsh 自己的 `ctx.sessionPersistence`(`list` / `resolveCurrentLog` /
|
|
28
|
+
`readStoredLog`)读取,不再自己解压 `session.v4.jsonl.zstd`。
|
|
29
|
+
|
|
30
|
+
## 安装(镜像内)
|
|
31
|
+
|
|
32
|
+
插件已发布到 npm(`@wangchenglai/dsh-acp-session`),镜像构建时按版本安装。
|
|
33
|
+
Dockerfile 里:
|
|
34
|
+
|
|
35
|
+
```dockerfile
|
|
36
|
+
ARG DSH_ACP_SESSION_VERSION=0.1.0
|
|
37
|
+
RUN mkdir -p /opt/dsh-plugins \
|
|
38
|
+
&& npm install --prefix /opt/dsh-plugins \
|
|
39
|
+
"@wangchenglai/dsh-acp-session@${DSH_ACP_SESSION_VERSION}" \
|
|
40
|
+
--no-audit --no-fund --omit=dev --save-exact \
|
|
41
|
+
&& ln -sfn /opt/dsh-plugins/node_modules/@wangchenglai/dsh-acp-session /opt/dsh-plugins/acp-session \
|
|
42
|
+
&& chmod +x /opt/dsh-plugins/acp-session/start-acp.sh
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
升级插件时只改 `DSH_ACP_SESSION_VERSION`(或构建参数 `--build-arg`),
|
|
46
|
+
镜像里始终是指定版本,不会跟着 npm 的 `latest` 漂移。
|
|
47
|
+
|
|
48
|
+
`start-acp.sh` 负责:
|
|
49
|
+
|
|
50
|
+
1. 把插件软链到 `$DSH_HOME/profiles/acp/node_modules/@wangchenglai/dsh-acp-session`
|
|
51
|
+
(不动用户的 `package.json`,也不需要联网跑 pnpm)
|
|
52
|
+
2. `exec dsh --profile acp --patch /opt/dsh-plugins/acp-session/profile-patch.yml`
|
|
53
|
+
(`--patch` 是叠加层,用户已有的 profile 文件不受影响)
|
|
54
|
+
|
|
55
|
+
`jupyter_server_config.py` 里把 ACP 的启动命令改成:
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
'command': ['node', '/usr/local/bin/acp-to-ws', '--port', '{port}', '--',
|
|
59
|
+
'bash', '/opt/dsh-plugins/acp-session/start-acp.sh'],
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 本地验证
|
|
63
|
+
|
|
64
|
+
在容器里(不需要平台后端):
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# 1. 确认插件被 dsh 认出来
|
|
68
|
+
dsh --profile acp --patch /opt/dsh-plugins/acp-session/profile-patch.yml --dump-config \
|
|
69
|
+
| grep -A3 acp-session
|
|
70
|
+
|
|
71
|
+
# 2. 用 ACP 探针跑一遍
|
|
72
|
+
node tools/acp-probe2.js # 依次 initialize / session/new / prompt /
|
|
73
|
+
# session/list / session/load / session/delete
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 已知边界
|
|
77
|
+
|
|
78
|
+
- `session/delete` 依赖 `resolveCurrentLog` 给出的路径,删除的是**整个会话目录**
|
|
79
|
+
(一个目录里只有该会话的日志)。
|
|
80
|
+
- 回放只覆盖 user/assistant 文本、推理和工具调用的状态;工具结果目前客户端也不渲染。
|
|
81
|
+
- `session/list` 为了拿标题会逐个读会话日志(dsh 的持久化层有缓存),
|
|
82
|
+
会话数量到几百时会有可感知的延迟;真到那一步再改成只读头部。
|
|
83
|
+
- 上游 `session/resume` 对"已激活"的会话会报错,本插件按成功处理——这正是
|
|
84
|
+
`load` 想要的状态,但意味着调用方无法区分"刚恢复"和"本来就在跑"。
|