dsh-plus-surface
Đã xác minhdsh-plus-surface · v0.2.6 · MIT · Giao diện web
DSH+ 壳的事实桥:把 dsh 进程内的会话事实(进行中/结束/被查看)写成 ~/.dsh/dsh-plus/bridge.json,并为壳提供页面内会话跳转入口。
Cài đặt
dsh plugin add dsh-plus-surface Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Phát hành lên npm mà không có repository công khai. Hãy kiểm tra nội dung package trước khi cài.
Thẻ
Readme
dsh-plus-surface
DSH+ 显示面的 dsh 侧插件:事实出口 + 动作入口 + 唯一 Skill。把 dsh 进程内的会话事实写成
$DSH_HOME/dsh-plus/bridge.json(事实出口),接收壳发来的可序列化动作(动作入口),
并注册 一个 bundled skill(rank 600):dsh-plus-surface。会话角标、HTTP 灯等场景
都写在这一篇里;加新内容 = 改同一份 recipes/recipe.json(或 ~/.dsh/dsh-plus/recipe.json),不要再注册 skill、不要新建插件或目录。
两半职责
| 半 | 环境 | 职责 |
|---|---|---|
index.js(host) |
dsh web host 进程 | 听 agent/created|status|disposed 维护进程级真相 {status, runningSince, finishedAt},原子写桥文件;同时开 HTTP 只读事实出口 GET /dsh-plus-surface/bridge.json(与桥文件同一份内存事实,供远端壳经端口映射拉取);client 透传的标量快照走自有 HTTP 路由 POST /dsh-plus-surface/sync 合并(仅顶层会话、字段消失即清;0.1.5 起 connection.rpc.handle 撞 cordis 隔离边界不可用,见 index.js 文件头 §3);ctx.skills.registerProvider 只注册 dsh-plus-surface(rank 600)+ skills/change 钩子 |
client.js(client) |
dsh web 页面 | 把每个顶层会话的可序列化标量字段整体透传给 host(pendingInteraction / title / cwd / …)并上报页面选中态(selected,host 据此推导 completed);暴露 window.__dshPlus.handle(action) 通用动作入口(open-session 现可扩展)+ jump 兼容别名 |
判断逻辑(进行中角标、已完成未看 / 待交互气泡、气泡生命周期)全部在壳的 recipe.json 里做纯字段匹配;本插件只透传事实、只执行壳发来的动作。CLI 进程不产事实(无 connection 服务即不启用事实桥)。
双出口:本地文件 + HTTP(远端连接)
事实出口常开两个,零配置、无远端/本地开关——选择权在壳:
- 本地壳:
fs.watchFile读bridge.json(1s 感知) - 远端壳(另一台机器的 dsh web 经端口映射加进 DSH+):轮询
GET /dsh-plus-surface/bridge.json(1s),与桥文件同形状同语义(含pendingInteraction/completed粘性清除) - 自动换证(0.1.2+,可选):
GET /dsh-plus-surface/launch.json只对环回连接返回{ token }。壳若拿到就静默换证;没装本插件不影响页面接入——视图按浏览器直接打开地址,换证是壳自己的事。
安全口径:HTTP 出口只读、随 dsh web 的环回绑定,不开新端口;经映射/反代转发时自行确认不对公网开放。
插件缺席时壳自动退到 /api/session.list 降级轮询(只有基本角标/完成气泡,无待交互气泡)。
桥文件形状
{
"version": 1,
"pid": 12345,
"updatedAt": 1787400000000,
"sessions": {
"session-…": {
"status": "running", // running | idle(host 独写)
"runningSince": 1787400000000, // host 独写
"finishedAt": null, // 最近一次 running→idle 的时刻(host 独写)
"completed": false, // 完成未看(host 依各 client 选中上报推导:
// 结束瞬间无人选中 = 未看;任一 client 选中即清,
// 直到下个 running 沿重新武装)
"cli": { // client 透传的标量快照,整体替换、字段消失即清
"title": "对话标题",
"cwd": "/abs/path",
"pendingInteraction": null, // approval | plan-review | question
"updatedAt": 1787400000000
}
}
}
}
动作入口(handle)
壳点显示面上的按钮 → 发一个可序列化描述符给 client 半:
window.__dshPlus.handle({ type: 'open-session', target: { sessionId: 'session-…' } })
现成动作是 open-session。新 action.type 才改本插件 client.js 的 handle()(壳管道不动)——不要另起一个插件。工具栏条目本身只改 recipe.json。
安装
dsh plugin --profile web add <本目录绝对路径>
# 源码改动后按 AGENTS.md 约定:在 ~/.dsh/profiles/web 下 pnpm install --force 重打包
重启 dsh web 后生效(DSH+ 托盘菜单 → 重启 DSH 即可)。
注意:exports 里必须包含 "./package.json": "./package.json"——client 模块系统
用 require.resolve('<pkg>/package.json') 读 dsh.client 声明,exports 地图会墙化子路径,
缺了这一行 client 半会被静默跳过(host 半照常工作,boot 图里没有本包)。
兼容基线
verifiedWith: 0.2.0-rc.2。私有面脆弱点逐条登记在 index.js / client.js 文件头注释。