dsh-session-conductor 0.0.0-stage → 1.0.10
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 +165 -2
- package/cordis.patch.yml +48 -0
- package/lib/apply.js +1361 -0
- package/lib/client-parts/apply.js +43 -0
- package/lib/client-parts/components/compaction.js +124 -0
- package/lib/client-parts/components/conductor-settings.js +62 -0
- package/lib/client-parts/components/group.js +115 -0
- package/lib/client-parts/components/panel.js +1265 -0
- package/lib/client-parts/components/processing.js +98 -0
- package/lib/client-parts/components/session-icon.js +20 -0
- package/lib/client-parts/components/settings.js +415 -0
- package/lib/client-parts/foundation/bootstrap.js +48 -0
- package/lib/client-parts/foundation/i18n.js +74 -0
- package/lib/client-parts/foundation/list-cache.js +28 -0
- package/lib/client-parts/foundation/styles.js +236 -0
- package/lib/client.js +2534 -0
- package/lib/core/config.js +159 -0
- package/lib/core/domain.js +157 -0
- package/lib/core/lazy.js +20 -0
- package/lib/core/state.js +106 -0
- package/lib/core.js +82 -0
- package/lib/eio-repair.js +204 -0
- package/lib/features/context-usage/index.js +219 -0
- package/lib/features/continue/eligibility.js +49 -0
- package/lib/features/continue/scan.js +134 -0
- package/lib/features/continue/session.js +235 -0
- package/lib/features/inject/preset.js +20 -0
- package/lib/features/member-model/index.js +14 -0
- package/lib/features/member-model/locate.js +157 -0
- package/lib/features/member-model/override.js +76 -0
- package/lib/features/member-model/setup.js +55 -0
- package/lib/features/member-model/switch.js +186 -0
- package/lib/features/rename/analysis.js +303 -0
- package/lib/features/rename/title.js +158 -0
- package/lib/features/rename/value.js +77 -0
- package/lib/features/search.js +119 -0
- package/lib/features/session-ops-routes.js +218 -0
- package/lib/features/session-ops.js +414 -0
- package/lib/group.js +303 -0
- package/lib/guards.js +28 -0
- package/lib/http.js +24 -0
- package/lib/i18n/en.json +204 -0
- package/lib/i18n/zh.json +204 -0
- package/lib/index.js +78 -0
- package/lib/repair.js +426 -0
- package/lib/seq-gap-repair.js +224 -0
- package/lib/session-codec.js +43 -0
- package/lib/session-log.js +46 -0
- package/lib/sessions/detach.js +113 -0
- package/lib/sessions/events.js +73 -0
- package/lib/sessions/interruption.js +73 -0
- package/lib/sessions/list-cache.js +175 -0
- package/lib/sessions/list.js +187 -0
- package/lib/sessions/route.js +60 -0
- package/lib/sessions/turn.js +21 -0
- package/lib/shared/constants.js +20 -0
- package/lib/shared/log.js +17 -0
- package/lib/shared/settings.js +14 -0
- package/lib/shared/test-hooks.js +93 -0
- package/lib/shared/util.js +6 -0
- package/lib/template-inject.js +289 -0
- package/lib/value.js +430 -0
- package/lib/zstd-frames.js +177 -0
- package/package.json +65 -3
- package/skills/dsh-session-conductor-functions.md +197 -0
- package/skills/dsh-session-conductor.md +151 -0
- package/skills/dsh-session-official-doc.md +245 -0
- package/skills/task-completion-report.md +56 -0
package/README.md
CHANGED
|
@@ -1,3 +1,166 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-session-conductor
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> DSH(DeepSeek Harness)会话管理增强插件:让会话列表可管理、可修复、可自动续跑。
|
|
4
|
+
|
|
5
|
+
侧边栏新增「会话管理」面板,归档会话可恢复、支持批量删除、AI 自动重命名、中断自动续跑、按工作区分组显示;设置页提供方案/收尾模板注入与自动重命名模型选择。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 功能总览
|
|
10
|
+
|
|
11
|
+
| 功能 | 说明 | 入口 |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| 会话管理面板 | 全部/已归档/活跃/说明四视图;归档、恢复、删除(批量/按条件)、置为不活跃、释放全部空闲 | 侧边栏「会话管理」按钮 |
|
|
14
|
+
| 自动重命名 | 每个回合后 AI 分析会话内容,主题明显偏离时自动生成新标题(带运行状态后缀) | 面板逐会话开关 |
|
|
15
|
+
| 自动续跑 | 识别非人为中断(崩溃/限流/超时/错误),自动继续原任务;失败后 30s 重试 | 面板逐会话开关(临时设置,重启即默认关) |
|
|
16
|
+
| 会话分组 | 按工作区分组显示;「在分组下新建会话」 | 设置 → 插件 → 会话分组 |
|
|
17
|
+
| 撤回最后一条消息 | 删除最后一条用户消息及整轮回复(先预览 + 二次确认 + .undo-backup 备份) | 面板按钮 |
|
|
18
|
+
| 损坏修复 | seq-gap / EIO 坏块 / 双格式(jsonl+zstd 并存)三类会话日志修复 | 面板「说明」页按钮 |
|
|
19
|
+
| 价值分析 | LLM 按规则给会话分类(已完成/未完成/久未活跃/活跃中) | 面板按钮 |
|
|
20
|
+
| 全文搜索 | 官方 FTS5 优先 + 内置 zstd 扫描兜底 | 面板搜索框 |
|
|
21
|
+
| 压缩模型选择 | 上下文自动压缩用模型独立选择(省成本) | 设置 → 插件 → 压缩模型 |
|
|
22
|
+
| 模板注入 | 方案模板 / 收尾模板:本地设备上传 / 在线网址 / DSH 目录浏览三种导入,内容可再编辑,注入系统提示词(方案/收尾各一条上下文注入) | 设置 → 会话管理 → 模板注入 |
|
|
23
|
+
| 自动重命名模型 | 指定便宜/专用模型做标题分析 | 设置 → 会话管理 |
|
|
24
|
+
| 成员模型切换 | 给队友/子代理单独切模型(只动该成员会话,不影响其他成员):先用 `list_models` 拿确切模型 id,再 `set_member_model` 按成员名/sessionId 切换(写 `model/selection` 事件交给官方投影接管,跨轮持久;未挂载成员也能切,运行中会先等它暂停) | AI 工具 `list_models` / `set_member_model` |
|
|
25
|
+
| 上下文用量自查 | AI 按需查自己会话的上下文占用(百分比、已用/容量 tokens)与构成(系统提示词/工具定义/对话消息),占用达 85% 时附收敛建议。数据与界面圆环同源(官方 `contextPressure` / `contextBreakdown` 投影),只读、无参数 | AI 工具 `context_usage` |
|
|
26
|
+
|
|
27
|
+
## 界面预览
|
|
28
|
+
|
|
29
|
+
会话管理面板(侧边栏入口):
|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+
设置页 · 模板注入(设置 → 会话管理):
|
|
34
|
+
|
|
35
|
+

|
|
36
|
+
|
|
37
|
+
## 安装
|
|
38
|
+
|
|
39
|
+
装到哪个 profile 由 `--profile` 指定。`dsh plugin` 会把后面的参数**转发给该 profile 目录下的 pnpm**,
|
|
40
|
+
因此第 2 步与「直接在该 profile 目录执行 pnpm」等价(该命令会初始化首次使用的 profile)。
|
|
41
|
+
|
|
42
|
+
1. **把插件源码放进 profile 的真实目录**(目录拷贝,不要软链):
|
|
43
|
+
```
|
|
44
|
+
<DSH_HOME>/profiles/<profile>/local-plugins/dsh-session-conductor/
|
|
45
|
+
```
|
|
46
|
+
2. **用 dsh 在该 profile 里装依赖**(写入 profile 的 `package.json` 与 `node_modules/`):
|
|
47
|
+
```
|
|
48
|
+
dsh plugin --profile <profile> add file:local-plugins/dsh-session-conductor
|
|
49
|
+
dsh plugin --profile <profile> install
|
|
50
|
+
```
|
|
51
|
+
装完 profile `package.json` 的 `dependencies` 里应出现
|
|
52
|
+
`"dsh-session-conductor": "file:local-plugins/dsh-session-conductor"`。
|
|
53
|
+
3. **bundle 形态再补 loader 行**:把插件名加进 profile `package.json` 的 `dsh.profile.bundles`;
|
|
54
|
+
插件自带的 `cordis.patch.yml` 必须用顶层 `- insert:` **新建** loader 行 —— 顶层 `- id:` 是"覆盖已有行",
|
|
55
|
+
基座没有该 id 时市场会报 `patch target not found`。
|
|
56
|
+
4. **装前预演、装后确认**:装前先 dry-run(确认插件入口能被 import、patch 能进组合树、不破坏现有插件组合);
|
|
57
|
+
装完重启宿主,并在实例日志里确认该插件 `loaded`。
|
|
58
|
+
|
|
59
|
+
> 为什么放在 profile 的 `local-plugins/` 而不是全局:插件与宿主版本强绑定,放在 profile 内可随实例
|
|
60
|
+
> 独立升级,也不会让多个 profile 互相污染。
|
|
61
|
+
|
|
62
|
+
### 从 GitHub 安装(可选)
|
|
63
|
+
|
|
64
|
+
本仓库是公开仓库,可直接用 GitHub 源安装。
|
|
65
|
+
|
|
66
|
+
⚠️ **`dsh plugin --profile <名> add …` 当前实测会挂死且零输出**(两次都以 timeout 结束、日志为空)⇒
|
|
67
|
+
安装请在**该 profile 目录里直跑 pnpm**(`dsh plugin` 的设计是把参数转发给 profile 的 pnpm,两者本应等价,
|
|
68
|
+
但转发这条路目前不可用):
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
cd <DSH_HOME>/profiles/<profile>
|
|
72
|
+
pnpm add github:EIGHTfs/dsh-session-conductor#<commit>
|
|
73
|
+
# 等价写法:pnpm add git+https://github.com/EIGHTfs/dsh-session-conductor.git#<commit>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**前置条件**:
|
|
77
|
+
|
|
78
|
+
1. **本机要有 `npm`** —— pnpm 构建 git 来源的包时会在临时目录执行 `npm install`;
|
|
79
|
+
缺 npm 时表现为 `ERR_PNPM_PREPARE_PACKAGE` + `spawn ENOENT: npm: command not found`。
|
|
80
|
+
2. **pnpm 11 默认禁止 git 源依赖执行构建脚本** —— 仅**带 `prepare`/`prepack` 的插件**需要放行
|
|
81
|
+
(例:dsh-git-push 的 prepare 构建不入库的 `lib/client.js`)。**本仓库没有 prepare/prepack ⇒ 无需这一步**;
|
|
82
|
+
若安装的是那类插件,先在 profile 的 `pnpm-workspace.yaml` 里加:
|
|
83
|
+
|
|
84
|
+
```yaml
|
|
85
|
+
allowBuilds:
|
|
86
|
+
<包名>@https://codeload.github.com/<owner>/<repo>/tar.gz/<commit>: true
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
⚠️ key 里带 commit 哈希 ⇒ 换版本/换提交要同步改这一行;否则报 `ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED`。
|
|
90
|
+
|
|
91
|
+
- 用 `#<commit>` 固定版本(本仓库远端暂无 tag,写 `#v1.0.x` 会拉不到);公开仓库匿名可装,私有仓库才需凭据。
|
|
92
|
+
- 装完同样要做上面的第 3、4 步(`dsh.profile.bundles` + `cordis.patch.yml` 的 `- insert:` + 重启确认 `loaded`)。
|
|
93
|
+
|
|
94
|
+
## 使用
|
|
95
|
+
|
|
96
|
+
### 会话管理面板
|
|
97
|
+
|
|
98
|
+
点击侧边栏底部「会话管理」按钮展开浮层面板:
|
|
99
|
+
|
|
100
|
+
- **全部**:列出每个会话(标题/目录/时间/状态),支持归档、删除、撤回、自动重命名/续跑开关、搜索、价值分析
|
|
101
|
+
- **已归档**:列出被归档的会话,可恢复(取消归档)、删除
|
|
102
|
+
- **活跃**:当前活跃(live/running)的会话
|
|
103
|
+
- **说明**:损坏修复(seq-gap / EIO / 双格式)+ 使用说明
|
|
104
|
+
|
|
105
|
+
### 设置页(设置 → 会话管理)
|
|
106
|
+
|
|
107
|
+
左侧栏「会话管理」独立页:
|
|
108
|
+
|
|
109
|
+
- **模板注入**:方案模板 / 收尾模板两个槽位。每个槽位下拉选导入方式:
|
|
110
|
+
- **本地文件**:从设备选择上传(系统文件选择器)
|
|
111
|
+
- **在线 md 网址**:输入网址,后端下载转存
|
|
112
|
+
- **DSH 目录浏览**:路径选择悬浮窗(目录树 + 路径输入,点 .md 选中后导入)
|
|
113
|
+
导入内容显示在编辑框(动态高度、自动换行),**可再次编辑并保存**;开启后注入系统提示词,AI 一开始就看见(方案/收尾各一条上下文注入)。
|
|
114
|
+
- **自动重命名模型**:选择标题分析用的模型(跟随会话模型或指定便宜/专用模型)
|
|
115
|
+
|
|
116
|
+
### 真实后端预览页
|
|
117
|
+
|
|
118
|
+
改 UI 后免重启查看效果:
|
|
119
|
+
|
|
120
|
+
- **快照模式(推荐,免重启)**:`bash tools/preview-snapshot.sh` → 生成 `assets/preview-*.html`(内嵌生成时真实后端响应),file:// 打开即可查看,无 CORS、无假数据
|
|
121
|
+
- **DSH 同源路由**:重启后访问 `/api/session-conductor/preview/settings`(或 `/panel`),同源实时 fetch
|
|
122
|
+
|
|
123
|
+
## API
|
|
124
|
+
|
|
125
|
+
插件以 `/api/session-conductor/*` 前缀注册宿主路由:
|
|
126
|
+
|
|
127
|
+
| 端点 | 方法 | 用途 |
|
|
128
|
+
|---|---|---|
|
|
129
|
+
| `/list` | GET | 会话列表(标题/目录/时间/状态,落盘缓存按 revision 增量) |
|
|
130
|
+
| `/archive` / `/restore` | POST | 归档 / 恢复会话 |
|
|
131
|
+
| `/delete` | POST | 删除会话(拒绝运行中) |
|
|
132
|
+
| `/undo` | POST | 撤回最后一条消息 |
|
|
133
|
+
| `/auto-rename` | POST | 自动重命名开关 |
|
|
134
|
+
| `/auto-continue` | POST | 自动续跑开关 |
|
|
135
|
+
| `/auto-continue-gate` | GET/POST | 全局续跑闸门 |
|
|
136
|
+
| `/release` | POST | 释放空闲会话 |
|
|
137
|
+
| `/value-analysis` | POST | 价值分析 |
|
|
138
|
+
| `/repair` / `/repair-eio` / `/repair-dual` | POST | 三类损坏修复 |
|
|
139
|
+
| `/search` | GET | 全文搜索 |
|
|
140
|
+
| `/compaction-model` | GET/POST | 压缩模型 |
|
|
141
|
+
| `/templates` | GET/POST | 模板注入(slots 元信息 + 内容) |
|
|
142
|
+
| `/templates/dir` | GET | 目录浏览 |
|
|
143
|
+
| `/auto-rename-model` | GET | 自动重命名模型(透传官方 modelCatalog) |
|
|
144
|
+
| `/i18n` | GET | 语言包(zh/en 外置 JSON) |
|
|
145
|
+
| `/preview/settings` `/preview/panel` | GET | 真实后端预览页(同源服务) |
|
|
146
|
+
|
|
147
|
+
示例:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
curl http://<host>/api/session-conductor/list
|
|
151
|
+
# → { "ok": true, "sessions": [ { "id": "...", "title": "...", "cwd": "...", "updatedAt": 172... } ], "total": N }
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
curl -X POST http://<host>/api/session-conductor/archive \
|
|
156
|
+
-H "Content-Type: application/json" -d '{"id":"<sessionId>"}'
|
|
157
|
+
# → { "ok": true, "archived": true }
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## 文档索引
|
|
161
|
+
|
|
162
|
+
> 文件目录结构、版本列表、函数列表由 dsh-git-push 的 doc-tree / doc-version / doc-func 工具维护(独立 md,README 只引用):
|
|
163
|
+
|
|
164
|
+
- [文件目录结构](docs/FILE-TREE.md) — 目录树与文件作用(doc-tree 维护,`tree-doc.json` 注释映射)
|
|
165
|
+
- [版本列表](docs/VERSIONS.md) — 按 git 提交聚合的版本记录表(doc-version 维护)
|
|
166
|
+
- [函数列表](docs/FUNCTIONS.md) — lib/ 全部导出函数的名称/位置/签名(doc-func 维护)
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# dsh-session-conductor bundle patch —— 会话管理增强(单包双面)。
|
|
2
|
+
# · 宿主插件(dsh.bundle):注册 /api/session-conductor/* 路由
|
|
3
|
+
# GET /list 列出全部会话(标题/运行状态/是否归档/中断状态/开关)
|
|
4
|
+
# POST /archive 归档会话(原生 workspaceRegistry.archiveSession)
|
|
5
|
+
# POST /unarchive 取消归档(注册表 setState 写回,前端自动收到变更帧)
|
|
6
|
+
# POST /delete 删除会话(拒绝运行中;detach + 记账清理 + 删磁盘日志)
|
|
7
|
+
# POST /auto-rename 开启/关闭「自动重命名」(回合结束 AI 分析,主题偏离才改名)
|
|
8
|
+
# POST /analyze 立即分析一次对话主题,必要时自动重命名
|
|
9
|
+
# POST /continue 手动续跑一个被中断的会话
|
|
10
|
+
# POST /auto-continue 开启/关闭某会话「自动续跑」(覆盖全局默认)
|
|
11
|
+
# POST /scan 立即扫描一遍会话并自动续跑
|
|
12
|
+
# POST /detach 置为不活跃:释放一个 live 空闲会话(拒绝运行中/subagent)
|
|
13
|
+
# POST /detach-all 释放全部空闲会话
|
|
14
|
+
# · 浏览器插件(dsh.client):侧边栏底部「会话管理」入口 + 面板
|
|
15
|
+
# (全部会话 / 已归档 / 活跃 / 说明 视图;恢复归档、删除会话、自动重命名、
|
|
16
|
+
# 中断徽标 + 继续按钮 + 自动续跑开关、置为不活跃/释放全部空闲)
|
|
17
|
+
#
|
|
18
|
+
# 可选 config(顶层键,全部有默认值):
|
|
19
|
+
# enabled: true 自动续跑总开关
|
|
20
|
+
# defaultAutoContinue: true 单会话默认开启自动续跑(面板可逐会话覆盖)
|
|
21
|
+
# maxConcurrent: 2 全局同时续跑会话数上限
|
|
22
|
+
# maxAttached: 12 活跃(attached)会话上限,达到后自动续跑暂停
|
|
23
|
+
# cooldownMs: 900000 同会话自动续跑最小间隔(毫秒,默认 15 分钟)
|
|
24
|
+
# maxContinuesPerSession: 3 每会话自动续跑总次数上限(防死循环)
|
|
25
|
+
# turnTimeoutMs: 1200000 单回合续跑最长等待(毫秒,默认 20 分钟)
|
|
26
|
+
# scanIntervalMs: 300000 周期扫描间隔(毫秒,默认 5 分钟)
|
|
27
|
+
# · 会话分组(2026-09-26 起仅只读展示 + 分组下新建会话,/api/session-conductor/group/*):
|
|
28
|
+
# groupEnabled: true 分组模块总开关(false = 不注册 group 路由)
|
|
29
|
+
# blockGroupNewSession: false 禁止「在分组下直接新建会话」(true 时 new-session 返回 401;缺省 workspaceId = 上次会话工作区)
|
|
30
|
+
- insert:
|
|
31
|
+
- id: dsh-session-conductor
|
|
32
|
+
name: dsh-session-conductor
|
|
33
|
+
|
|
34
|
+
# —— 全文搜索:解锁官方 FTS5 内容搜索( 起并入,原独立插件 dsh-session-search 已合并)——
|
|
35
|
+
# 官方默认 session-query-sqlite 配成 openAt: never(侧边栏搜索只匹配标题/工作区名)。
|
|
36
|
+
# 这里覆盖为 first-search:首次搜索时构建 SQLite FTS5 索引,GUI 搜索即变为内容全文搜索
|
|
37
|
+
# (snippet 命中上下文、相关度排序、分页均为官方现成实现)。
|
|
38
|
+
# ⚠️ patch 层按 id 整行替换 config 不合并:必须 restate 全部 key。
|
|
39
|
+
# ⚠️ path 必须是磁盘文件( 起)。原值 ':memory:' 会把全部会话正文的 FTS5 索引建在内存里:
|
|
40
|
+
# 实测每 MB 文本约耗 3.3MB 内存,本机会话正文约 443MB → 单次「首次搜索」建索引峰值约 1.4GB,
|
|
41
|
+
# 叠加进程基线后触发 OOM,表现为「启用本插件后隔一会 DSH 进程被杀、会话加载不出来」。
|
|
42
|
+
# 官方 base bundle 注释同样要求启用内容搜索时配 durable path(默认 openAt: never 不建索引)。
|
|
43
|
+
# path 用 !!js 取 DSH_HOME,避免写死本机绝对路径;索引是派生数据,可随时删除重建。
|
|
44
|
+
# 兜底:本插件 /api/session-conductor/search 内置 zstd 逐会话扫描(FTS5 不可用时仍可搜)。
|
|
45
|
+
- id: session-query-sqlite
|
|
46
|
+
config:
|
|
47
|
+
path: !!js (process.env.DSH_HOME || (process.env.HOME + '/.dsh')) + '/session-query.sqlite'
|
|
48
|
+
openAt: first-search
|