dsh-lark-bot 0.15.8 → 0.16.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 CHANGED
@@ -14,6 +14,7 @@
14
14
  <img src="https://img.shields.io/badge/status-released-blue" alt="Status">
15
15
  <a href="https://dshfind.com/zh/plugins/PlutoKeating/dsh-lark-bot?ref=badge"><img src="https://dshfind.com/api/badge/PlutoKeating/dsh-lark-bot?lang=zh" alt="dshfind"></a>
16
16
  <a href="https://dshbase.com/zh/plugins/dsh-lark-bot"><img src="https://dshbase.com/badges/dsh-lark-bot.svg" alt="dshbase 实测可装"></a>
17
+ <a href="https://dsh-plugin.org/plugins/plutokeating/dsh-lark-bot"><img src="https://dsh-plugin.org/badges/listed.svg" alt="Listed on dsh-plugin.org"></a>
17
18
  <a href="https://github.com/PlutoKeating/dsh-lark-bot/releases"><img src="https://img.shields.io/github/v/release/PlutoKeating/dsh-lark-bot?sort=semver&label=latest%20release" alt="Latest release"></a>
18
19
  <a href="https://github.com/PlutoKeating/dsh-lark-bot/commits/main"><img src="https://img.shields.io/github/commits-since/PlutoKeating/dsh-lark-bot/v0.7.0?label=commits%20since%20v0.7.0" alt="Commits since v0.7.0"></a>
19
20
  </p>
@@ -39,7 +40,7 @@
39
40
 
40
41
  **你的 DeepSeek Harness 只能“贴身”用?** dsh 跑在本机,每次看进度、改任务都得回到电脑前;离开工位后任务卡住、跑偏甚至 dsh 崩了,你都收不到任何消息——回来才发现白等半天。
41
42
 
42
- **dsh-lark-bot 把遥控器装进你的飞书**:在私聊、群聊、话题里直接指挥本机 dsh coding agent,流式卡片实时看思考与工具调用;任务完成主动推送到你所在的任何群并 @ 你;即使 dsh 崩溃下线,飞书里依然叫得应——发 `/safemode` 进入仅核心安全模式,直接在聊天里定位问题、重启引擎。**这是唯一“dsh 挂了你不会失联”的桥接方案。**
43
+ **dsh-lark-bot 把遥控器装进你的飞书**:在私聊、群聊、话题里直接指挥本机 dsh coding agent,流式卡片的飞书原生折叠面板实时展示思考与工具调用,最终回答单独成消息;任务完成还能主动推送到你所在的任何群并 @ 你;即使 dsh 崩溃下线,飞书里依然叫得应——发 `/safemode` 进入仅核心安全模式,直接在聊天里定位问题、重启引擎。**这是唯一“dsh 挂了你不会失联”的桥接方案。**
43
44
 
44
45
  **适合谁**:在飞书 / Lark(私聊、群聊、话题)里指挥本机 dsh coding agent 的开发者与团队,尤其是需要多项目隔离、角色分工、并行任务与会话归档的协作场景。
45
46
 
@@ -48,17 +49,22 @@
48
49
  **基础能力**:
49
50
 
50
51
  - 私聊、群聊、话题(thread)里指挥本机 dsh coding agent,图片 / 文本文件直接发给 bot 即可;
51
- - 流式卡片实时展示思考、工具调用与结果,支持交互按钮(停止 / 审批 / 问答卡);
52
+ - 流式过程卡以飞书原生折叠面板实时展示思考、工具调用与结果,完成后最终回答单独发送,支持交互按钮(停止 / 计划门禁 / 审批 / 问答卡);
52
53
  - Git 仓库内为每个会话自动创建隔离 worktree 项目工作区,多项目互不干扰。
53
54
 
54
- **六项全网独有组合**:
55
+ **十一项全网独有组合**:
55
56
 
56
57
  - 🆘 **Guardian 安全网守护——“永远叫得应”**:DSH 崩溃后飞书仍会回复你,`/safemode` 进入仅核心安全模式直接重启。
57
58
  - 👥 **多角色 Agent——“一个机器人,一整个团队”**:`/role` 切换或指派 PM / 开发 / 文档等角色,每个角色独立人设、模型偏好与规则。
59
+ - 🤝 **多机器人交接——“一个群,多个独立 Agent”**:`bot add` 增加独立身份/服务/凭据/上下文的实例,可信机器人可在同群通过真实 @ 交接,连续协作有硬上限。
58
60
  - ⚡ **并行多任务——“不用排队”**:同一群聊同时跑多个任务、会话隔离;其他方案只能串行排队。
61
+ - 🧾 **崩溃后可对账——“发出去了不是石沉大海”**:消息先写持久任务账本再入队;重启恢复排队项,中断任务保留 checkpoint 并由 `/jobs` 显式重试。
59
62
  - 🗂 **会话归档与清理——“会话列表不会烂掉”**:`/archive` 归档旧任务、`/retention` 配置自动保留策略。
60
63
  - 📣 **跨会话主动通知 + @人——“活干完了它会来找你”**:A 群跑完任务主动推送到 B 群 / 私聊并 @ 你。
64
+ - ⚙️ **dsh Web 可视化设置——“不用背环境变量”**:在官方 Settings → Plugins 页面点选应用、工作目录、模型、并行数与提醒,并可直达诊断。
61
65
  - 🔑 **对话内管理模型和密钥——“不用离开飞书”**:`/providers` `/provider` `/key` 直接查看、切换供应商、热更新密钥。
66
+ - 🎚️ **快速 / 平衡 / 深度模式——“任务强度一键选”**:`/mode` 按 scope 持久选择,下一轮生效且不打断当前任务。
67
+ - 🧭 **关键任务先拍板——“计划看清再动手”**:完整计划先单独发出,再用卡片批准执行或附意见继续规划,原任务自动续跑。
62
68
 
63
69
  ## 30 秒上手
64
70
 
@@ -77,7 +83,7 @@ npx dsh-lark-bot@latest setup --profile dsh-lark
77
83
  dsh --profile dsh-lark
78
84
  ```
79
85
 
80
- ③ 首次启动终端打印二维码 → 飞书 / Lark App 扫码创建或选择 PersonalAgent 应用 → 绑定后私聊直接发消息,群聊 / 话题里 `@bot`。
86
+ ③ 首次启动终端打印二维码 → 飞书 / Lark App 扫码创建或选择 PersonalAgent 应用 → 绑定后私聊直接发消息;群聊 / 话题默认 `@bot`,也可显式开启受白名单保护的无 @ 模式。
81
87
 
82
88
  `setup` 自动完成:定位本机 dsh → 预批准 pnpm 构建策略 → 标准 `dsh plugin add` → 默认安装「安全网守护」系统服务,一条命令完成全部安装。
83
89
 
@@ -91,31 +97,44 @@ dsh --profile dsh-lark
91
97
 
92
98
  在飞书里向 bot 发送普通消息即可开始工作,常用命令:
93
99
 
100
+ bot 自带的命令帮助、状态、错误提示与交互卡片均提供中文 / English。Card JSON 2.0 在各文本组件使用飞书原生
101
+ `i18n_content`,同一张群卡会按每位读者的客户端语言显示;无法取得读者语言的普通
102
+ Markdown、toast 与旧客户端降级路径同时显示中英文。agent 生成的回答、推理、工具输入输出和用户原文
103
+ 保持原样,不自动翻译。
104
+
94
105
  | 命令 | 作用 |
95
106
  | --- | --- |
96
107
  | `/new` `/reset` | 开始新会话|
97
108
  | `/newg <群名>` | 自动新建群聊(拉你入群)并开新会话,当前会话保留|
98
- | `/cd <path>` | 切换工作目录并重置会话|
109
+ | `/cd <path>` | 切换到该工作目录的独立会话(切回可继续)|
99
110
  | `/ws list` | 查看命名工作空间|
100
111
  | `/ws save <name>` | 保存当前工作空间|
101
112
  | `/ws use <name>` | 切换到命名工作空间|
102
113
  | `/ws remove <name>` | 删除命名工作空间|
103
- | `/status` | 查看当前状态|
114
+ | `/status` | 查看可刷新状态卡(工作区 / 模型 / session / run / context / token / pending / 任务账本)|
115
+ | `/doctor` | 生成脱敏诊断包并作为文件发送(管理员;可下载转发)|
116
+ | `/jobs [list\|show <消息ID>\|retry <消息ID>]` | 对账排队/运行/完成/失败/中断任务;确认后显式重试 |
104
117
  | `/resume` | 查看当前会话最近上下文|
118
+ | `/session`、`/session bind <sessionId>`、`/session current` | 浏览当前 canonical workspace 的 DSH session,经披露确认后显式绑定 / 查看绑定(`web` adapter)|
105
119
  | `/stop` | 终止当前任务|
106
120
  | `/timeout [N\|off\|default]` | 查看或设置当前会话运行超时|
107
121
  | `/concurrency [N\|default]` | 查看或设置当前 scope 并行任务数(默认 2)|
122
+ | `/permission [ask\|allow\|deny] [scope]` | 查看或设置工具权限策略(设置仅管理员;可指定当前聊天内 scope)|
123
+ | `/isolation [group\|topic\|member]` | 查看或设置本群会话隔离模式(设置仅管理员)|
108
124
  | `/role list`、`/role show <id>` | 查看角色列表 / 详情|
109
125
  | `/role set <id>`、`/role clear` | 为当前 scope 绑定 / 解除角色|
110
126
  | `/role save <id> <name> [--persona 文案] [--model <id>] [--tools <csv>] [--rules 文案]` | 创建 / 更新角色(管理员)|
111
127
  | `/role remove <id>` | 删除角色(管理员)|
112
128
  | `/notify <scope\|chatId> <text>` | 跨会话发送通知(管理员)|
113
129
  | `/notify list` | 查看 bridge 已注册的 scope|
130
+ | `/notifications [show\|off\|default\|on …]` | 配置当前 scope 的完成 / 失败 / 审批提醒,或恢复 Web 默认值|
131
+ | `/replies [show\|default\|set …]` | 配置当前 scope 的回复合并、发送间隔、批量上限与近似去重(profile 管理员或当前群管理员可修改)|
114
132
  | `/retention [N\|default]` | 查看或设置保留消息条数(超出自动归档)|
115
- | `/archive [note]`、`/archive list [N]`、`/archive clean` | 手动归档 / 查看 / 清理会话记录|
133
+ | `/archive [note]`、`/archive send <id> [scope\|chatId]`、`/archive list [N]`、`/archive clean` | 归档并发送 / 重发到当前或指定会话(跨会话仅管理员)/ 查看 / 清理|
116
134
  | `/density [compact\|standard\|detailed]` | 查看或设置卡片密度|
117
- | `/model`、`/providers`、`/provider`、`/key` | 打开交互式管理卡片(BotFather 式多轮向导;选择用按钮、填写用卡片输入、写入前确认)|
118
- | `/model use <id>` | 热切换当前会话模型(下一轮生效,无需重启)|
135
+ | `/mode [quick\|balanced\|deep]`(兼容 `/effort`) | 用卡片或命令切换当前会话任务强度;下一轮生效 |
136
+ | `/model`、`/providers`、`/provider`、`/key` | 打开交互式管理卡片(模型直接点选/恢复默认;管理写操作走多轮向导)|
137
+ | `/model use <provider/model>` | 热切换当前会话模型(也兼容唯一模型 ID;下一轮生效,无需重启)|
119
138
  | `/model default <id>` | 写入 dsh 默认模型 `agent-default-model`(管理员)|
120
139
  | `/model add\|remove <provider> <modelId>` | 添加 / 删除 provider 的模型(管理员)|
121
140
  | `/provider add\|update\|remove <id>` | 管理 provider(管理员;deepseek-official 与自定义 pi-ai)|
@@ -126,15 +145,97 @@ dsh --profile dsh-lark
126
145
 
127
146
  飞书消息中的图片会下载到本地 media 目录并传给 dsh;文本类文件会读取内容并注入任务上下文。
128
147
 
148
+ **DSH session 消息级同步(`web` adapter)**:发送 `/session` 只会列出当前 canonical workspace
149
+ 的非 subagent session 元数据,不显示正文;选择后确认卡会列明标题、ID、workspace、更新时间、
150
+ 回填数量、当前 scope,以及是否替换/独占迁移。只有确认后才发送有数量和字节双重上限的历史
151
+ transcript 卡并持久绑定。私聊允许已授权用户;member scope 仅本人;共享 group/topic 仅 profile
152
+ 管理员;跨 scope 独占迁移也仅 profile 管理员。WebUI 或 dsh-TUI 的 open/resume/activity **永远不会**
153
+ 自动切换飞书绑定,也不会广播给所有 scope。绑定后,DSH `session/event` 是唯一真源:外部用户消息
154
+ 镜像为带来源的 bot 消息,assistant chunk 节流更新同一张 bot-owned 卡,最终消息原位终态化;更新
155
+ 失败才追加增量。bridge 以持久 seq cursor 重连补齐,并用 message ID / event seq / prompt `rpcId`
156
+ 抑制飞书回显;tool/thinking 默认不投影。状态位于 profile 的 `session-projections.json`(0600),包含
157
+ 路由、待确认历史水位/cursor、当前 turn 来源和消息映射;仅为跨重启续写流式卡保存其未终态正文,
158
+ 不复制完整 transcript。历史确认完成前 live 事件保持串行等待,发送失败会在启动/重连时重试。
159
+ 新投影卡使用稳定的飞书 `uuid` 幂等创建,覆盖发送成功但 cursor 尚未落盘时的崩溃重放。
160
+
129
161
  **`/newg <群名>`**:自动新建私密群、拉发送者入群并回复群链接——新群即新 scope / 新会话,当前会话不受影响。需应用具备 `im:chat` 与 `im:chat.members:write_only` 权限。
130
162
 
131
- 同一 scope(私聊 / 群聊 / 话题)默认 **2 个任务并行**(`DSH_LARK_SCOPE_CONCURRENCY` 或 `/concurrency` 调整):多条消息以独立 run 并行推进,每个 run 使用独立 dsh session 与 runId;`/status` 查看全部运行中的 run,`/stop` 一次性终止。
163
+ 同一 scope(私聊 / 群聊 / 话题)默认 **2 个任务并行**(`DSH_LARK_SCOPE_CONCURRENCY` 或 `/concurrency` 调整):多条消息以独立 run 并行推进,每个 run 使用独立 dsh session 与 runId;`/status` 查看当前 workspace 的 run,`/new` 只停止当前 workspace,`/stop` 一次性终止 scope 内全部运行。
164
+
165
+ **会话状态卡**:`/status` 展示工作区、有效模型、session、显式投影绑定/cursor、active runs、版本、上下文占用、
166
+ 累计 input / output / cache token,以及待审批 / 待提问 / 待批准计划;点击“刷新”会原位更新同一张卡。
167
+ 只展示 adapter 或模型目录明确提供的数据:ACP 可提供真实 context `used / size` 与累计 token,
168
+ SDK 可提供每次模型调用的 token/cache 用量;上游未提供的字段显示“暂无”,不按文本长度估算。
169
+ 累计用量随 scope 持久化;最近的 context 快照按 canonical provider/model 与 native session 分别保留,
170
+ 并行 run 不会互相覆盖,当前身份不匹配时也不会复用旧占用值。会话与指标按 `scope + workspace`
171
+ 持久化;`/cd` / `/ws use` 会中断原工作区仍在运行的任务,但不会删除其会话、指标或归档,切回即可
172
+ 继续;只有 `/new` / `/reset` 清空当前 workspace。待处理卡与归档列表/清理也只统计当前 workspace。
173
+ 成员 scope 的刷新只允许 owner 操作。
174
+
175
+ **消息与任务可靠性**:普通 agent 消息以飞书 `messageId` 去重,先原子写入 profile 的
176
+ `jobs.json`(0600)再进入内存队列。进程重启后,尚未开始的 queued 消息自动回到原 scope、thread
177
+ 与 workspace;崩溃时已 running 的任务会转为 interrupted,保留最后安全阶段、run/native session
178
+ 标识,但不会自动重复可能已有外部副作用的操作。用 `/jobs` 对账、`/jobs show <消息ID>` 查看,确认后
179
+ 再 `/jobs retry <消息ID>`。`/status` 和重连提示会显示当前 workspace 的账本统计。保证范围从 bridge
180
+ 已经收到并成功落盘开始;断网期间飞书从未投递给 bridge 的事件无法由本地账本恢复。
181
+ 若首次落盘失败,bot 会明确回复“未接收/未执行,请重发”;若执行前 running receipt 失败,任务不会
182
+ 启动,并明确落为 failed 或保留 queued 等待重启恢复。终态落盘失败也会提示对账;残留 running 会在
183
+ 出站通道就绪后安全标为 interrupted,中断通知失败会跨启动继续投递。
184
+
185
+ **群聊会话隔离**:管理员可用 `/isolation group|topic|member` 在“整群共享 / 话题独立 /
186
+ 成员独立”之间切换;默认 `topic` 保持既有行为。切换只改变后续消息的 scope 路由,不迁移或
187
+ 删除已有会话,切回即可继续;切换前已发出的停止 / 审批 / 问答卡仍绑定原 scope,`/stop` 也会
188
+ 覆盖当前成员可达的切换前 scope。成员模式的任务卡会显示发送者 open_id,避免误把别人的上下文
189
+ 当成当前对话。策略持久化在 `~/.dsh-lark/profiles/<profile>/isolation.json`。
132
190
 
133
191
  **多角色 Agent**:管理员用 `/role save <id> <name> --persona <文案> [--model <id>] [--tools <csv>] [--rules <文案>]` 定义 PM / 开发 / 文档等角色,`/role set <id>` 绑定到当前 scope;每个 run 携带角色 persona 与规则,角色模型低于每会话 `/model use`。角色定义持久化在 `~/.dsh-lark/profiles/<profile>/roles.json`。
134
192
 
193
+ **多机器人实例与 @ 交接**:
194
+
195
+ ```bash
196
+ dsh-lark-bot bot add reviewer --model gateway/review-model # 无凭据参数时扫码创建独立 PersonalAgent
197
+ dsh-lark-bot bot list
198
+ dsh-lark-bot bot status reviewer
199
+ dsh-lark-bot bot remove reviewer # 保留会话/工作树数据
200
+ ```
201
+
202
+ 每个实例使用独立的 bridge profile、`dsh-lark-<name>` profile、
203
+ `~/.dsh-lark/bots/<name>/dsh` DSH_HOME、OS 用户服务、飞书与 provider 凭据、模型目录、
204
+ session/scope/worktree/archive;添加/移除不会重启其他实例。可在执行 `bot add` 时为当前进程设置
205
+ 该实例专用的 `DEEPSEEK_API_KEY`;自定义 provider 凭据可在实例启动后通过 `/key set` 写入独立凭据库。
206
+ 连接后,本机共享的
207
+ `fleet.json` 只把已登记 bot open_id 视为可信 peer。agent 获得 peer 的精确 open_id,可用
208
+ `lark_notify` 在当前群真实 @ 对方并附交接摘要;未知 bot、未 @、system/anonymous 消息不进入 agent,
209
+ bot 发来的 `/...` 也只作为任务文本。共享 `handoffs.json` 对 messageId 去重并在全 fleet 统计连续
210
+ 交接,默认 6 轮;任一新鲜真人消息(即使未 @)立即重置。成员隔离群中的 bot 交接使用该实例的
211
+ group/topic scope,避免生成无人可操作的 bot-owned 审批卡。额外实例由自己的 service 常驻;默认
212
+ guardian 仍只救援其配置的主实例。
213
+ `default` 主机器人不能通过 `bot remove` 删除,避免附加实例管理误伤既有机器人。
214
+ 附加实例仅支持各自隔离 runtime 的 `sdk` / `acp`(以及 legacy `headless`);`bot add` 与运行时都会
215
+ 拒绝 `web`,因为共享 Web agent 的广播事件流无法提供实例级 session 隔离。
216
+
135
217
  **出站 @ 提及与跨会话通知**:`/notify <scope|chatId> <text>` 可向其他会话推送汇报(管理员);agent 侧内置 `lark_notify` dsh 工具(SDK / ACP runtime 均可装配),任务完成后主动向其他群 / 话题发消息并 @ 成员。回调走 127.0.0.1 本地端口 + 随机 token,不暴露公网。
136
218
 
137
- **任务中向你提问(问答卡)**:agent 需要你拍板、确认或补充信息时,通过 `lark_ask_user` 工具弹**问答卡**(单选 / 多选 / 自由文本),回答后任务自动继续,等待期间运行超时看门狗暂停。(与 `/ask` 的“你主动提问”方向相反。)
219
+ **可配置主动提醒**:Web 设置默认关闭、不刷屏,也可为未单独设置的会话选择“完成与失败”或“全部”。普通用户可用 `/notifications on current` 覆盖当前 scope,默认 @ 自己并在审批等待 10 分钟后只提醒一次;可用 `events=`、`mentions=`、`remind=` 调整。管理员还可把目标设为已登记的其他 `scope|chatId`。偏好原子持久化到 profile,重启不丢,并在 `/status` 显示;`/notifications off` 显式关闭,`/notifications default` 恢复 Web 默认值。
220
+
221
+ **回复流量控制**:默认保持即时逐条回复。profile 管理员或当前群的群主/群管理员可用 `/replies set merge=5 batch=3 interval=10 dedupe=60` 为当前 scope 开启 5 秒合并窗口、每条合并最多 3 个任务、两批至少间隔 10 秒,并在 60 秒内抑制同一发送者在同 workspace 的近似重复任务;超出批量上限的答案在 bridge 进程存活期间继续排队,不会因批量上限被丢弃。`/replies` 与 `/status` 显示有效策略,`/replies default` 恢复默认。
222
+
223
+ **任务执行模式**:发送 `/mode` 可用双语卡片选择 `quick`(快速:直接回答,只做必要检查)、`balanced`(平衡:兼顾速度与可靠性,默认)或 `deep`(深度:充分调查并验证假设与结果);也可直接发送 `/mode quick|balanced|deep`,`/effort` 是等价别名。选择按隔离 scope 持久化并显示在 `/status`。每个 run 启动时固化模式,因此切换只影响下一轮,不会中断当前任务、清空上下文或绕过权限/计划审批。
224
+
225
+ **结果文件直接回传**:SDK / ACP / Web agent 可调用 `lark_send_file`,把当前会话 workspace、实际执行 worktree、当前 scope 归档或实例日志中的文件直接上传到原飞书聊天 / 话题;普通 `/archive [note]` 会在落盘后立即发送 Markdown + JSONL,失败时保留路径并可用 `/archive send <id> [scope|chatId]` 重试或由管理员转发到指定会话。上传只接受普通文件,默认单文件不超过 20 MiB;真实路径必须位于 bridge 计算的会话目录内,runtime 自报 cwd 不能扩大边界。
226
+
227
+ **逐操作审批与 scope 权限策略**:默认 SDK 与 Web 宿主在 `tools/pre-execute` 强制拦截高风险调用,并接入 dsh rc.8 官方 `approval/request` seam;ACP 走原生 `session/request_permission`。默认 `ask` 会弹出“允许执行一次 / 拒绝”卡。管理员可用 `/permission allow` 对当前隔离 scope 自动放行逐工具审批,或用 `/permission deny` 直接拒绝并向聊天给出明确反馈;`/permission ask` 恢复逐次询问。member 隔离下可从目标 `/status` 复制 scope,执行 `/permission <策略> <scope>`;只允许修改当前聊天内 scope。策略成功落盘后才确认,持久化到 profile 的 `permission-policies.json`(0600),重启不丢,且显示在 `/status`。该策略不绕过较大/高风险任务的计划门禁;legacy `headless` 不具备工具回调能力。
228
+
229
+ **关键任务计划门禁**:SDK / ACP / Web agent 在修改文件、运行脚本等较大或高风险动作前使用
230
+ `lark_request_plan_approval`;同一 turn 未获批准时,runtime pre-execute 策略会拒绝写入、删除、
231
+ 移动、命令执行与 `run_code`。bridge 先把完整 Markdown 计划作为普通消息发出,再弹出“批准,开始执行 /
232
+ 继续规划”决策卡;卡内可填写修改意见。工具在等待期间阻塞且暂停空闲超时,批准后原任务自动继续;
233
+ 继续规划时 agent 会收到意见、修订计划并再次请求确认。门禁无固定十分钟截止,跟随所属 run 的取消
234
+ 信号;停止任务会精确取消该 session 的 pending 卡并撤回。legacy headless adapter 不具备工具回调能力。
235
+
236
+ **任务中向你提问(问答卡)**:agent 需要你拍板、确认或补充信息时,通过 `lark_ask_user` 工具弹**问答卡**(单选 / 多选 / 自由文本)。可提交卡片,也可直接回复该卡片输入任意文字;单选/多选没有合适项时,回复文字就是补充答案。系统按被回复的 card messageId 精确匹配 pending 问题,回答后任务自动继续,等待期间运行超时看门狗暂停。(与 `/ask` 的“你主动提问”方向相反。)
237
+
238
+ 计划、审批与问答卡提交后会立即显示成功提示、发送一条终态确认并撤回原卡,避免按钮仍停留在聊天中造成“未生效”的误解;确认或撤回失败不会影响已经提交给 agent 的决策、审批结果或答案。
138
239
 
139
240
  **安全网守护**:独立于 dsh 进程、系统级常驻的最小守护进程(systemd / LaunchAgent / Windows 启动项),默认随 `setup` 安装。dsh 正常时静默;dsh 下线或无法 boot(如第三方插件破坏 profile 组合)时自动接管飞书通道,无需命令行即可自救:
140
241
 
@@ -149,14 +250,35 @@ dsh-lark-bot guardian install --dsh-profile dsh-lark
149
250
  ```
150
251
  不需要时 `setup --no-guardian` 跳过;单独卸载用 `dsh-lark-bot guardian uninstall`。
151
252
 
253
+ **正常引擎后台服务(issue #23)**:安装仍只有 `setup` 这一条路径;如需登录后自动运行、退出终端
254
+ 仍在线,可再用一条命令把同一个标准 dsh profile 交给系统用户服务托管(不会启动第二套桥接引擎):
255
+
256
+ ```bash
257
+ dsh-lark-bot service install --profile dsh-lark
258
+ dsh-lark-bot service status --profile dsh-lark
259
+ dsh-lark-bot service logs --profile dsh-lark -n 200 -f
260
+ dsh-lark-bot service restart --profile dsh-lark
261
+ dsh-lark-bot service stop --profile dsh-lark
262
+ dsh-lark-bot service start --profile dsh-lark
263
+ dsh-lark-bot service uninstall --profile dsh-lark
264
+ ```
265
+
266
+ Linux 优先使用 systemd user unit,无 user systemd 时回退 XDG supervisor;macOS 使用 LaunchAgent,
267
+ Windows 使用登录计划任务。服务异常退出会自动重启,`doctor` 会报告已安装服务的状态。guardian
268
+ 发现正常引擎掉线时会优先重启该受管服务,避免重复拉起;`upgrade --restart` 也走同一路径。
269
+ `stop` / `uninstall` 会持久记录“期望停止”,guardian 不会擅自拉起;install/start 若检测到同
270
+ profile 的前台进程会拒绝并提示先停止,生命周期锁阻止并发双启动。
271
+ 机器睡眠或断网期间 WebSocket 无法收消息;恢复后 SDK 自动重连,并向最近活跃会话发送恢复提示。
272
+
152
273
  ### 模型 / Provider / 凭据管理
153
274
 
154
275
  配置以 dsh 官方方式持久化(与 dsh Web **Settings → Models** 同一存储协议),改动下一请求生效、无需重启:
155
276
 
156
- - **交互式管理卡片**:`/providers`(或 `/provider`、`/model`、`/key`)打开管理卡片,按
157
- BotFather 式的多轮向导完成增删改查——能选择的用按钮点选(API 协议、provider、模型、凭据引用),
277
+ - **交互式管理卡片**:`/providers`(或 `/provider`、`/model`、`/key`)打开管理卡片;当前模型带
278
+ 标记,可直接点选其他模型或“恢复默认”,下一轮生效且保留上下文。增删改查按
279
+ BotFather 式的多轮向导完成——能选择的用按钮点选(API 协议、provider、模型、凭据引用),
158
280
  需要填值的用卡片输入(ID、Base URL、模型列表、密钥值),写入前有确认卡,随时可取消。
159
- - `/model use <id>`:按会话热切换模型(下一轮生效);`/model default <id>`:写入 dsh 默认模型。
281
+ - `/model use <provider/model>`:按会话精确路由并热切换模型(也兼容唯一模型 ID,下一轮生效);`/model default <id>`:写入 dsh 默认模型。
160
282
  - `/providers`:查看 provider、模型与凭据状态;`/provider add|update|remove`:管理自定义 provider
161
283
  (需 `--api` / `--base-url` / 至少一个 `--model`,与官方 schema 一致)或 `deepseek-official`。
162
284
  - `/key set|remove|list`:读写 `~/.dsh/.credentials.yaml`(0600);settings 只存 `apiKeyEnv` 引用,
@@ -193,7 +315,7 @@ npx dsh-lark-bot@latest upgrade --profile dsh-lark --yes
193
315
  - `--force`:无法访问 npm(离线)时按当前运行版本重装;
194
316
  - `--no-guardian`:跳过守护升级;
195
317
  - **runtime profile 一致性修复**:升级后自动把 `dsh-lark-sdk` / `dsh-lark-acp` 的
196
- own-package 链接重指到新版本(避免下次启动重新预置)。
318
+ own-package 链接重指到新版本,并当场幂等重装版本陈旧的 SDK server / ACP 依赖。
197
319
 
198
320
  无需交互确认时加 `--yes`(非交互环境不带 `--yes` 会安全中止)。其余方式:
199
321
 
@@ -240,7 +362,7 @@ dsh plugin --profile dsh-lark remove dsh-lark-bot
240
362
 
241
363
  **Q: DeepSeek Harness 怎么接入飞书?**
242
364
 
243
- **A:** 安装 Node.js ≥ 22 与 DeepSeek Harness(已配置 `DEEPSEEK_API_KEY`),执行 `npx dsh-lark-bot@latest setup --profile dsh-lark`,再 `dsh --profile dsh-lark` 扫码绑定即可。私聊直接发消息,群聊 / 话题里 `@bot`。
365
+ **A:** 安装 Node.js ≥ 22 与 DeepSeek Harness(已配置 `DEEPSEEK_API_KEY`),执行 `npx dsh-lark-bot@latest setup --profile dsh-lark`,再 `dsh --profile dsh-lark` 扫码绑定即可。私聊直接发消息;群聊 / 话题默认 `@bot`,也可按下文的权限与白名单要求开启无 @ 模式。
244
366
 
245
367
  **Q: 需要公网 IP、域名或服务器吗?**
246
368
 
@@ -248,7 +370,7 @@ dsh plugin --profile dsh-lark remove dsh-lark-bot
248
370
 
249
371
  **Q: dsh-lark-bot 和其他 DeepSeek Harness 飞书插件(如 harness-lark)有什么区别?**
250
372
 
251
- **A:** 功能组合最全:安全网守护、多角色 Agent、并行多任务、会话归档、跨会话主动通知、对话内模型 / 密钥管理六项合一;标准 dsh profile bundle,`npx dsh-lark-bot@latest setup` 一条命令安装,无需独立 Docker / 后台服务。
373
+ **A:** 功能组合最全:安全网守护、多角色 Agent、多机器人可信交接、并行多任务、持久任务对账、会话归档、跨会话主动通知、dsh Web 可视化设置、对话内模型 / 密钥管理、执行模式与关键任务计划门禁十一项合一;标准 dsh profile bundle,`setup` 是唯一安装路径;可选 `service install` 只负责把同一 profile 交给 OS 常驻,不是第二套运行时。
252
374
 
253
375
  **Q: 项目从哪下载?会不会有假冒版本?**
254
376
 
@@ -264,10 +386,10 @@ dsh plugin --profile dsh-lark remove dsh-lark-bot
264
386
 
265
387
  ## 兼容性
266
388
 
267
- - **DeepSeek Harness(`dsh`)**:已验证 **dsh 0.1.0-rc.6**(最后验证 2026-08-15:SDK JSON-RPC / ACP runtime 握手 +
268
- 真实任务流式验证),通过官方 `@deepseek-ai/dsh-sdk-client` / `@deepseek-ai/dsh-acp` 接入;
389
+ - **DeepSeek Harness(`dsh`)**:已验证 **dsh 0.1.0-rc.8**(最后验证 2026-08-20:临时安装 + SDK JSON-RPC / ACP runtime initialize、工具/审批、live session 续接与 restart collision 探针),通过官方 `@deepseek-ai/dsh-sdk-client` / `@deepseek-ai/dsh-acp` 接入;
269
390
  具体锁定版本、升级政策与自动化探测见 [`docs/COMPATIBILITY.md`](docs/COMPATIBILITY.md),
270
- adapter 接入细节见 [`docs/adapter-notes.md`](docs/adapter-notes.md)
391
+ adapter 接入细节见 [`docs/adapter-notes.md`](docs/adapter-notes.md),rc.8 差异、已知风险和
392
+ 自动/人工验证边界见 [`docs/DSH_RC8_AUDIT.md`](docs/DSH_RC8_AUDIT.md)。
271
393
  - **运行时**:Node.js ≥ 22.19(见 `package.json` engines)。
272
394
  - **平台**:Linux / macOS / Windows(飞书 WebSocket 出站长连接,免公网服务器 / 域名 / 内网穿透)。
273
395
  - 默认 adapter 为官方 **`@deepseek-ai/dsh-sdk-client`**(SDK JSON-RPC runtime,原生 session 续跑 +
@@ -291,6 +413,15 @@ dsh plugin --profile dsh-lark remove dsh-lark-bot
291
413
 
292
414
  ## 配置
293
415
 
416
+ ### dsh Web 可视化设置(推荐)
417
+
418
+ 打开本机 dsh Web,进入 **Settings → Plugins → Plugin configuration → dsh-lark-bot**。页面可直接查看和修改服务区域、App ID、App Secret、默认项目文件夹、默认模型、每会话并行任务数、adapter 与默认提醒策略:
419
+
420
+ - App Secret 标记为 secret,只能写入,Web 响应、卡片和日志都不会回显;扫码绑定后实际生效的 profile 会作为页面初始值,App ID 不会错误显示为空。
421
+ - 点击“保存设置”后,凭据、区域、工作目录和 adapter 会安全停止旧 generation 后自动重连;模型、并行数和提醒会热更新到下一任务/提醒,不中断正在执行的任务,页面逐项标明时机。
422
+ - “快速诊断”可在本页直接检查设置连接、App ID、工作目录、模型和远程只读状态;需要运行态详情时可继续复制 `/status` 或 `/doctor` 到飞书会话。
423
+ - 浏览器半侧由本包的 `./client` 动态加载并注册到官方插件配置页,不需要 fork 或重建 dsh Web。没有 Web 设置服务时,现有飞书命令和下列环境变量仍可使用。
424
+
294
425
  - 本地配置:`~/.dsh-lark/config.json`
295
426
  - 状态根目录可用 `DSH_LARK_HOME` 覆盖
296
427
  - 环境变量统一使用 `DSH_LARK_*` 前缀
@@ -298,11 +429,12 @@ dsh plugin --profile dsh-lark remove dsh-lark-bot
298
429
  - 敏感项:`DSH_LARK_APP_SECRET`、`DEEPSEEK_API_KEY` 等凭据只保存在本机配置 / 环境中,日志与
299
430
  卡片自动脱敏,仓库只提交 `.env.example` 模板。
300
431
 
301
- 会话运行在 Git 仓库中时,会自动在 `~/.dsh-lark/profiles/<profile>/worktrees/<scope>/` 创建隔离 worktree,并复制项目级 `AGENTS.md`。
432
+ 会话运行在 Git 仓库中时,会自动在 `~/.dsh-lark/profiles/<profile>/worktrees/<scope-slug>-<path-hash>/` 创建隔离 worktree,并复制项目级 `AGENTS.md`。升级时会先从 Git registry 核验旧版 `<scope-slug>` worktree 的 owning repo:会话与旧 retention 归档归回真实项目,匹配时原位迁移并保留分支与未提交文件;当前指针已切到其他项目时则保留旧树并为新项目独立建树。
302
433
 
303
434
  每个飞书 scope 默认保存最近 40 条对话消息(可用 `/retention` 或 `DSH_LARK_RETENTION_MSGS`
304
435
  调整);超出保留窗口的消息自动归档到 `~/.dsh-lark/profiles/<profile>/archives/`(Markdown +
305
- JSONL,目录本身是 Git 仓库,每次归档独立 commit),支持 `/archive` 手动归档与保留策略清理。
436
+ JSONL,目录本身是 Git 仓库,每次归档独立 commit),支持 `/archive` 对当前 workspace 手动归档、
437
+ 查看与执行保留策略清理。
306
438
  SDK 模式下 dsh 原生 session 续跑,headless 模式则把历史注入下一次 prompt 实现近似记忆。
307
439
 
308
440
  当前核心环境变量:
@@ -314,19 +446,27 @@ SDK 模式下 dsh 原生 session 续跑,headless 模式则把历史注入下
314
446
  | `DSH_LARK_WORKSPACE` | 未设置 | 新会话默认工作目录|
315
447
  | `DSH_LARK_DSH_COMMAND` | `自动发现` | dsh 启动命令;通常无需设置|
316
448
  | `DSH_LARK_DSH_ARGS` | `自动发现` | dsh 启动参数,逗号分隔;通常无需设置|
317
- | `DSH_LARK_ADAPTER` | `sdk` | `sdk`(默认)/ `acp`(审批)/ `headless`(legacy)/ `web`(本地 dsh web agent,单写者)|
449
+ | `DSH_LARK_ADAPTER` | `sdk` | `sdk`(默认,approval answerer)/ `acp`(协议原生审批)/ `headless`(legacy)/ `web`(本地 dsh web agent,单写者)|
318
450
  | `DSH_LARK_PROVIDER` | `deepseek-official` | 模型 provider|
319
451
  | `DSH_LARK_MODEL` | `deepseek-v4-flash` | 默认模型|
320
452
  | `DSH_LARK_MAX_TOKENS` | 未设置 | SDK agent 每请求输出 token 上限|
321
453
  | `DSH_LARK_WEB_URL` | `http://127.0.0.1:3080` | `web` 适配器:本地 dsh web agent 的 base URL|
322
- | `DSH_LARK_WEB_PUSH` | `true` | `web` 适配器:网页端回合完成时推送到飞书并自动切换会话映射(`0` 关闭)|
454
+ | `DSH_LARK_SESSION_PROJECTION` | `true` | `web` 适配器:启用用户显式绑定后的历史/实时消息投影;绝不自动切换(`0` 关闭)|
455
+ | `DSH_LARK_SESSION_BACKFILL_MESSAGES` | `20` | 确认绑定时最多回填的人类消息数|
456
+ | `DSH_LARK_SESSION_BACKFILL_BYTES` | `65536` | 一次历史 transcript 卡最多披露的 UTF-8 字节数|
457
+ | `DSH_LARK_SESSION_STREAM_UPDATE_MS` | `800` | 同一 assistant 投影卡的最小更新间隔(最小 400ms)|
458
+ | `DSH_LARK_WEB_PUSH` | 未设置 | 已弃用兼容别名;仅当新开关未设置时作为 `DSH_LARK_SESSION_PROJECTION` 读取|
323
459
  | `DSH_LARK_ACCESS_DEFAULT_DENY` | `false` | 无白名单时拒绝私聊|
324
460
  | `DSH_LARK_EVENT_FRESHNESS_MS` | `600000` | 过期消息拒绝窗口(0 关闭)|
461
+ | `DSH_LARK_GROUP_NO_AT` | `false` | 处理白名单实时无 @ 消息并轮询已登记群聊历史;要求 `im:message.group_msg` 权限和非空 `allowed_users` |
462
+ | `DSH_LARK_GROUP_POLL_MS` | `3000` | 无 @ 群消息轮询间隔(毫秒,最小 1000)|
463
+ | `DSH_LARK_BOT_HANDOFF_MAX` | `6` | 本机可信机器人连续 @ 交接上限(最小 2;真人消息重置)|
325
464
  | `DSH_LARK_RUN_TIMEOUT_MS` | `300000` | 单次运行空闲超时:持续无活动事件才终止(活跃任务不会被误杀)|
326
465
  | `DSH_LARK_STOP_GRACE_MS` | `5000` | SIGTERM 后等待优雅退出再 SIGKILL 的宽限期|
327
466
  | `DSH_LARK_SCOPE_CONCURRENCY` | `2` | 每个 scope 的并行任务数(1=严格串行)|
328
- | `DSH_LARK_RETENTION_MSGS` | `40` | 每个 scope 保留的消息条数(0=全部保留)|
329
- | `DSH_LARK_ARCHIVE_MAX` | `50` | 每个 scope 最多保留的归档数(0=不清理)|
467
+ | `DSH_LARK_NOTIFICATION_DEFAULT` | `off` | 未设置 scope 覆盖时的主动提醒:`off` / `completed`(完成+失败)/ `all`(含审批)|
468
+ | `DSH_LARK_RETENTION_MSGS` | `40` | 每个 scope + workspace 保留的消息条数(0=全部保留)|
469
+ | `DSH_LARK_ARCHIVE_MAX` | `50` | 每个 scope + workspace 最多保留的归档数(0=不清理)|
330
470
  | `DSH_LARK_ARCHIVE_MAX_AGE_DAYS` | `90` | 归档最大保留天数(0=不清理)|
331
471
  | `DSH_LARK_HEARTBEAT_MS` | `5000` | 桥接引擎心跳写入间隔(守护存活信号)|
332
472
  | `DSH_LARK_GUARDIAN_DISABLED` | `false` | `1` 时安全网守护进程保持停止|
@@ -351,10 +491,37 @@ SDK 模式下 dsh 原生 session 续跑,headless 模式则把历史注入下
351
491
  本工具在**本机**运行,安装前请知悉它会访问:
352
492
 
353
493
  - **飞书凭据**:PersonalAgent 应用的 `app_id` / `app_secret`,明文写入本机 `~/.dsh-lark/config.json`(文件权限 600)。
494
+ - **多机器人身份与消息**:`fleet.json`(0600)保存实例名、dsh/bridge profile、独立 DSH_HOME、bot open_id/名称,不保存密钥;
495
+ `handoffs.json`(0600)保存 chat id、最近交接 message id 与轮数。只有已登记 peer 的真实 @ 消息会进入
496
+ agent;已登记 peer 的 name/open_id 会注入每轮 agent prompt 并随任务上下文发送给模型 provider,
497
+ 以便生成精确 @ 交接。交接提示、卡片和回复仍发送到共享群,对群成员可见。移除实例会删除其
498
+ 飞书配置凭据、独立 `.credentials.yaml` 与 service env;DSH_HOME 中的 provider 设置/runtime
499
+ session 默认保留以便恢复,
500
+ 默认保留 `profiles/<name>/` 会话/工作树;需要删除这些数据时由用户另行处理。
354
501
  - **文件系统**:读取 / 写入你通过 `/cd`、`/ws` 指定的工作目录(含执行 shell 命令、修改文件)。
355
502
  - **网络**:向飞书开放平台建立 WebSocket 出站长连接收发消息;向 DeepSeek API 发送任务上下文。
356
- - **本地回调**:运行 `lark_notify` 工具时,dsh runtime 子进程通过 `127.0.0.1` 随机端口 +
357
- 每启动随机 token 回调 bridge 进程(仅本机回环,不监听公网)。
503
+ - **群消息与可选历史**:为识别“直接回复问答卡”,群实时事件先进入 bridge,再由 bridge 忽略未 @ 且未命中 pending 卡的消息。仅当 `DSH_LARK_GROUP_NO_AT=true` 时,实时无 @ 消息会进入任务管线,并轮询曾经通过事件登记的群聊 / 话题;两条路径都只处理白名单真人消息(及可选群白名单),历史消息还须为启动后的未删除消息,并与实时事件按 message ID 去重。该模式需管理员授予 `im:message.group_msg` 权限并确认符合团队隐私政策。
504
+ - **成员隔离标识与群可见性**:`member` 模式把发送者 `open_id` 写入本机 `isolation.json` 派生的
505
+ session / scope directory / worktree / archive 索引或路径,并显示在共享群任务卡。它只隔离 agent
506
+ 上下文,不隐藏群消息:输入、进度卡与回复仍对群成员可见;其他成员不能操作该成员的任务卡。
507
+ - **本地会话用量**:adapter 上报的 input/output/cache token 与 context used/limit 随 scope 写入
508
+ `~/.dsh-lark/profiles/<profile>/sessions.json`(0600),并显示在 `/status` 卡;成员 scope 仅 owner
509
+ 可刷新,但群内已经发送的状态卡仍遵循共享群消息可见性。
510
+ - **诊断包**:管理员可在会话发送 `/doctor`,bridge 在内存中生成 Markdown 文件并上传到原聊天 /
511
+ 话题;包含版本、平台、非敏感配置计数、当前 workspace 的运行/pending/任务账本摘要、服务状态与
512
+ 当前 bridge 进程内有界最近结构化事件(不读取 dsh 宿主共享 stdout)。不包含 App ID/Secret、凭据值、消息正文或 session transcript;常见密钥形态、
513
+ 当前进程已知敏感环境值及主目录会再次脱敏。文件一旦发到群中即对群成员可见,建议在私聊生成并在
514
+ 转发前人工复核。生成等待有超时边界,底层服务命令也会被有界终止;上传等待超时时会明确提示
515
+ 结果未知及文件可能迟到,避免用户立即重试造成重复投递。
516
+ - **持久任务账本**:`profiles/<profile>/jobs.json`(0600)保存 bridge 已接收任务的原始消息正文、
517
+ 附件/提及元数据、chat/thread/scope、workspace、状态与安全 checkpoint,最多保留 500 条终态记录。
518
+ `/jobs` 输出会脱敏并按当前 scope + workspace 隔离;文件内容与 `sessions.json` 一样可能包含用户在
519
+ prompt 中主动提供的敏感文本,应保护 profile 目录并在分享前清理。账本不保存隐藏推理或工具参数。
520
+ - **scope 路由**:`scopes.json` 保存 chat/thread 与最近入站 messageId;messageId 仅用于把 agent
521
+ 后续问答卡作为 reply 正确发回原话题。
522
+ - **本地回调**:运行 `lark_notify`、`lark_send_file`、`lark_ask_user`、`lark_request_plan_approval` 或逐工具审批时,dsh
523
+ runtime 子进程通过 `127.0.0.1` 随机端口 + 每启动随机 token 回调 bridge 进程(仅本机回环,
524
+ 不监听公网);计划内容、待执行工具的理由/参数与决策卡会发送到当前飞书 / Lark 会话。群聊中的审批内容对群成员可见。
358
525
  - **进程**:spawn 本机 `dsh` runtime 子进程(`dsh-sdk-jsonrpc-server` / `dsh-acp` profile)执行 agent 任务。
359
526
  - **dsh 配置**:`/model` `/providers` `/provider` `/key` 命令按 dsh 官方存储协议读写
360
527
  `~/.dsh/settings.yaml` 与 `~/.dsh/.credentials.yaml`(仅管理员可写;settings 只存 `apiKeyEnv`
@@ -363,17 +530,23 @@ SDK 模式下 dsh 原生 session 续跑,headless 模式则把历史注入下
363
530
  凭据;dsh 下线时接管同一 bot 的飞书长连接并扫描本机进程(仅 `ps` 命令行,不读内存);
364
531
  `/safemode` 时创建仅官方核心的 dsh profile(headless 或 SDK JSON-RPC runtime,均无第三方插件)
365
532
  并逐条执行任务;SDK 引擎会以官方 `dsh-sdk-jsonrpc-server` 子进程提供实时流式事件。
533
+ - **正常引擎后台服务(可选)**:`service install` 将标准 `dsh --profile <name>` 交给当前用户的
534
+ systemd / launchd / Windows 计划任务托管。服务环境只按白名单快照到
535
+ `~/.dsh-lark/service/<profile>.env`(POSIX 0600;Windows owner-only ACL);plist / 计划任务不嵌入密钥。日志写入
536
+ `profiles/<profile>/logs/service.log`。`service uninstall` 删除系统入口与 env 快照,但保留配置、会话与日志。
366
537
 
367
538
  所有数据仅在本机与飞书、DeepSeek 之间流转,不收集、不上传任何遥测。密钥不会提交进仓库(见 `.gitignore`)。
368
539
 
369
540
  ## 排障
370
541
 
371
542
  先运行 `dsh-lark-bot doctor`,它会检查 profile、工作目录,并对当前 adapter 做真实可用性探测
372
- (`sdk` / `acp` / `headless` 对应 runtime 的初始化握手)。
543
+ (`sdk` / `acp` / `headless` 对应 runtime 的初始化握手);启用无 @ 群消息后,还会使用一个已登记群聊探测历史消息权限。
544
+ 无法接触终端时,管理员可直接在飞书发送 `/doctor` 获取可下载的脱敏诊断包;聊天版为运行态快照,
545
+ 不会另起 adapter 做破坏性探测,终端版仍是完整可用性检查。
373
546
 
374
547
  常见问题:
375
548
 
376
- - **bot 静默 / 长连接失败**:查看 stderr 上的 JSONL 日志,关注 `channel` 与 `channel-command` 类别;SDK 会自动重连。
549
+ - **bot 静默 / 长连接失败**:运行 `service status` 并查看 `service logs -f`(前台运行则看 stderr),关注 `channel` 与 `channel-command` 类别;SDK 会自动重连并在恢复后向最近活跃会话提示。系统睡眠期间不能接收消息。
377
550
  - **agent 无响应**:发送 `/status` 查看当前 scope、cwd 和 active run;发送 `/stop` 终止当前任务;持续无响应超过 `DSH_LARK_RUN_TIMEOUT_MS` 时看门狗会自动终止(空闲超时,活跃任务不会被误杀)。
378
551
  - **首次扫码失败**:确认本机时间准确、网络可访问飞书开放平台;已拿到 App ID/Secret 时可用 `--app-id` / `--app-secret` 跳过扫码。
379
552
 
@@ -386,6 +559,12 @@ SDK 模式下 dsh 原生 session 续跑,headless 模式则把历史注入下
386
559
 
387
560
  ## 开发
388
561
 
562
+ **dsh-TUI 兼容边界**:本包以唯一根 `dsh-plugin.json` 声明 v0.15 host facet,并在构建后运行
563
+ `pnpm check:tui-admission` 与真实 PTY `pnpm check:tui-tty`。可选 TUI seam 缺失时安全 no-op;同步
564
+ 仍只依赖 DSH history/event,不监听 TUI input/session switch。该 facet 为 `trusted-in-process`,
565
+ 不是安全沙箱。项目继续采用 GNU AGPLv3;生态 listing 不改变许可证,也不代表兼容认证、安全审查
566
+ 或官方背书。
567
+
389
568
  ```bash
390
569
  pnpm install
391
570
  pnpm typecheck
@@ -394,7 +573,7 @@ pnpm build
394
573
  pnpm check:publish-bundle # 校验 dist 与全部 exports/bin 入口一致(发布前防线)
395
574
  pnpm ci:local
396
575
  pnpm release:check # ci:local + 上游一致性检查
397
- pnpm compat:probe # 临时 DSH_HOME 安装锁定版 dsh,跑真实 SDK 握手
576
+ pnpm compat:probe # 临时安装锁定版 dsh,验证 SDK/ACP 握手及 SDK 工具/续接
398
577
  pnpm dsh:upstream # 对比 npm 上游 stable 与锁定矩阵
399
578
  pnpm security:monitor # 假冒仓库与仿冒包监控(建议每周)
400
579
  ```
@@ -482,7 +661,7 @@ pnpm publish:dual
482
661
  飞书 / Lark ──WebSocket 长连接──▶ bridge/ ──▶ session/ ──▶ workspace/ ──▶ adapters/ ──▶ dsh ──▶ DeepSeek V4
483
662
  ```
484
663
 
485
- 核心思路:**飞书通道与 agent 后端解耦**。桥接层复刻 `lark-channel-bridge` 的成熟做法(WebSocket 长连接 + 流式卡片 + 会话路由),agent 后端通过 adapter 抽象,默认挂接官方 DeepSeek Harness SDK(`DSH_LARK_ADAPTER=sdk`),可选 ACP 审批模式与 legacy headless。
664
+ 核心思路:**飞书通道与 agent 后端解耦**。桥接层复刻 `lark-channel-bridge` 的成熟做法(WebSocket 长连接 + 流式卡片 + 会话路由),agent 后端通过 adapter 抽象,默认挂接带逐工具审批的官方 DeepSeek Harness SDK(`DSH_LARK_ADAPTER=sdk`),ACP 保留协议原生审批,另有 legacy headless。
486
665
 
487
666
  默认安装的「安全网守护」(`src/guardian/`)独立于 dsh 进程常驻:dsh 在线时静默,下线时接管飞书
488
667
  通道接收 `/safemode` 控制信号,以仅核心 profile(`dsh-base` + `dsh-headless`)拉起受限对话
@@ -497,11 +676,13 @@ pnpm publish:dual
497
676
  | `src/session/` | 会话路由、排队、访问控制|
498
677
  | `src/workspace/` | 项目工作区、git worktree 隔离与规则注入|
499
678
  | `src/adapters/` | agent 后端适配器(sdk 默认 / acp 审批 / headless legacy / web 单写者)|
500
- | `src/card/` | 流式卡片状态与渲染|
501
- | `src/bot/` | 运行注册、消息排队、审批/问答注册表|
679
+ | `src/card/` | 流式卡片、Card JSON 2.0 per-viewer 中英国际化与审批 / 问答 / 计划决策卡渲染|
680
+ | `src/bot/` | 运行注册、消息排队、审批 / 问答 / 计划注册表、群聊隔离策略、多机器人 fleet / 交接限制|
502
681
  | `src/commands/` | 斜杠命令(/cd /ws /new …)|
503
- | `src/cli/` | CLI 入口:`setup`(唯一安装命令)/ `doctor`(诊断)/ `upgrade`(一键升级)/ 隐藏 `run`|
504
- | `src/upgrade/` | 一键升级(issue #10):版本探测、升级状态、运行检测、guardian/profile 重启助手、runtime 链接修复|
682
+ | `src/diagnostics/` | `/doctor` 内存诊断文件生成、限额与二次脱敏 |
683
+ | `src/cli/` | CLI 入口:`setup` / `bot add|list|status|remove` / `service` / `doctor` / `upgrade` / 隐藏运行入口|
684
+ | `src/service/` | 正常 dsh profile 的跨平台用户服务、0600 环境快照、状态与日志管理|
685
+ | `src/upgrade/` | 一键升级(issue #10/#51):版本探测、升级状态、guardian/profile 重启、runtime 链接及依赖迁移|
505
686
  | `src/guardian/` | 安全网守护:心跳、进程观察、仅核心安全 profile、接管状态机、系统服务安装|
506
687
  | `src/config/` | profile / 配置 / 访问白名单 / dsh 配置管理|
507
688
  | `src/core/` | 结构化日志|
@@ -530,7 +711,7 @@ pnpm publish:dual
530
711
 
531
712
  </div>
532
713
 
533
- > 本项目的社区收录 / 推荐状态,随提交的更新请求持续维护。截至 v0.15.1(2026-08-17 复核):
714
+ > 本项目的社区收录 / 推荐状态,随提交的更新请求持续维护。截至 v0.15.9(2026-08-20 复核):
534
715
 
535
716
  | 平台 | 状态 | 说明 |
536
717
  | :--- | :--- | :--- |
@@ -538,21 +719,23 @@ pnpm publish:dual
538
719
  | [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) | 📨 收录 PR 已提交 · 待合并| 7.2k+ star 的社区插件精选大榜(`dsh-plugin` 生态流量入口);收录 PR [#1408](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/pull/1408) 已提交,合并后回填状态|
539
720
  | [dshfind](https://dshfind.com/zh/plugins/PlutoKeating/dsh-lark-bot) | ✅ 已收录 · 详情页在线| 条目名称修正 [issue #2](https://github.com/hikariming/dshfind/issues/2) 已关闭;**v0.15.1 数据刷新请求 [#6 跟进评论](https://github.com/hikariming/dshfind/issues/6#issuecomment-5317081509) 已提交 · 待维护方处理**;顶部徽章 / 展示卡来自 dshfind|
540
721
  | [dshbase](https://dshbase.com/zh/plugins/dsh-lark-bot) | ✅ 已收录 · 实测可装| 中文插件目录(收录 1771+ 插件),自动化 CI 实测 `dsh plugin add` 可装可启动,标注 `✅ 已验证 · 实测可装`;顶部徽章来自 dshbase|
722
+ | [dsh-plugin.org](https://dsh-plugin.org/zh/plugins/plutokeating/dsh-lark-bot) | ✅ 已收录 · 官方源已核验| 平台已下架冒用本项目名称的寄生仓库条目,并收录 `PlutoKeating/dsh-lark-bot` 官方源;[收录申请 #1](https://github.com/yacuo/dsh-plugin/issues/1) 与[安全举报 #2](https://github.com/yacuo/dsh-plugin/issues/2) 均经维护者确认处理并关闭;平台另发布了[一文读懂安装与使用教程](https://dsh-plugin.org/zh/plugins/plutokeating/dsh-lark-bot/using-dsh-lark-bot);顶部徽章来自 dsh-plugin.org|
541
723
  | [omdsh-dev/community](https://github.com/orgs/omdsh-dev/discussions/11) | ✅ 收录申请通过 · 讨论活跃| `[Plugin]` 收录申请(Discussion #11)已通过并持续维护,最新更新说明 v0.10.2;**v0.15.1 更新说明已备妥,待人工粘贴(org 级 discussion 不支持 API)**|
542
724
 
543
- **更新请求进度(截至 2026-08-17 复核)**:
725
+ **更新请求进度(截至 2026-08-20 复核)**:
544
726
 
545
727
  - awesome-dsh-plugins 收录条目 v0.8.0:[#127](https://github.com/AdamPlatin123/awesome-dsh-plugins/pull/127) — ✅ 已合并;榜单行同步:[#139](https://github.com/AdamPlatin123/awesome-dsh-plugins/issues/139) — ✅ 已关闭
546
728
  - awesome-dsh-plugin 大榜收录:[#1408](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/pull/1408) — 📨 已提交(2026-08-17,v0.15.0 数据;v0.15.1 [跟进评论](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/pull/1408#issuecomment-5317081726) 已提交)
547
729
  - dshfind 条目名称修正 + v0.8.0 刷新:[#2](https://github.com/hikariming/dshfind/issues/2) — ✅ 已关闭;v0.10.1 刷新:[#6](https://github.com/hikariming/dshfind/issues/6) — 📨 待处理(v0.15.1 [跟进评论](https://github.com/hikariming/dshfind/issues/6#issuecomment-5317081509) 已提交)
730
+ - dsh-plugin.org 官方源收录与寄生条目下架:[收录申请 #1](https://github.com/yacuo/dsh-plugin/issues/1) / [安全举报 #2](https://github.com/yacuo/dsh-plugin/issues/2) — ✅ 维护者已处理并关闭;[官方详情页](https://dsh-plugin.org/zh/plugins/plutokeating/dsh-lark-bot)与[专题教程](https://dsh-plugin.org/zh/plugins/plutokeating/dsh-lark-bot/using-dsh-lark-bot)已上线
548
731
  - omdsh-dev/community 收录:[Discussion #11](https://github.com/orgs/omdsh-dev/discussions/11) — ✅ 通过,讨论活跃(最新更新说明 v0.10.2);v0.15.1 更新说明 — 📨 已备妥,待人工粘贴
549
732
  - 平台数据刷新(v0.14.0 → v0.15.1)— ✅ 已恢复提交(2026-08-17):awesome-dsh-plugins [PR #230](https://github.com/AdamPlatin123/awesome-dsh-plugins/pull/230) · dshfind [#6 跟进](https://github.com/hikariming/dshfind/issues/6#issuecomment-5317081509) · omdsh 说明备妥
550
733
 
551
- **亮点跟进**(六项独家能力与 issue #6 设计实现):
734
+ **历史亮点跟进**(当时六项独家能力与 issue #6 设计实现;当前能力见上方十一项清单):
552
735
 
553
736
  - awesome-dsh-plugins 榜单行同步(仓库描述 → 最新)与 agent-test 报告名称异常:[#139](https://github.com/AdamPlatin123/awesome-dsh-plugins/issues/139) — 📨 已提交(维护方已确认,等待渲染周期同步)
554
737
  - dshfind 详情页补「对话内管理模型和密钥」亮点:[#2 跟进评论](https://github.com/hikariming/dshfind/issues/2#issuecomment-5301019067) — 📨 已提交
555
- - omdsh 六项独家亮点补充(含 Guardian 设计实现):[Discussion #11 亮点评论](https://github.com/orgs/omdsh-dev/discussions/11#discussioncomment-18026370) — 📨 已提交
738
+ - omdsh 当时六项独家亮点补充(含 Guardian 设计实现):[Discussion #11 亮点评论](https://github.com/orgs/omdsh-dev/discussions/11#discussioncomment-18026370) — 📨 已提交
556
739
 
557
740
  ## 假冒仓库警告
558
741