Repository navigation
Releases
v0.3.0
新增
- Web GUI 只读侧栏面板「任务栈」。侧栏多一个入口,点开是当前会话的栈:active 任务、它下面 paused 的任务、最近完成的若干条,按几秒一次轮询快照端点刷新。侧栏行和它打开的页面共用一个 id,两处指向同一个视图。
- 面板自己解释自己:图例、中文分区标题、深度徽标、相对时间(「3 分钟前」),读者不必先记住每种颜色的含义。
- 面板只读:关任务仍然只走模型工具和
/focus。GUI 的写路径需要单独的授权故事,这一版刻意没有引入。
修复
- paused 行按帧自身的状态分组。此前按「这一行是否等于栈顶视图的同一个对象」来判断,而线上文档把
top作为同一帧的第二个视图对象发出,于是每一行都不等于它,active 任务被当成 paused 又列了一遍。改为直接读frame.status。 - 声明
engines.dsh支持区间。宿主升到 dsh0.2.1-rc.2后本包被静默跳过:manifest 没有engines.dsh时兼容性判断回落到 peer 里精确 pin 的 rc 版本,日志只有一行skipping profile bundle,工具、/focus、端点、面板一起消失且没有任何报错。现在由engines.dsh: >=0.2.0-rc.2 <0.3.0单独裁决(检查带 prerelease 语义,两个 rc 都满足,将来的 0.3 仍会被拒),两个 peer 区间同步放宽。
工程
- 发布改用 npm trusted publishing(OIDC):仓库里不再有长期 token,凭据随 job 结束失效,并自动附带 provenance 证明。
- 发布失败时把日志尾部作为 check-run annotation 抛出;403 里出现
OIDC permission denied时直接指向 trusted publisher 的 Allowed actions 配置,而不是让人去核对 owner/repo/workflow 三个字段。 - Release 只在版本 tag 上创建:手动 dispatch 曾把分支名当 tag,造出一个游离的
mainrelease 和 tag。 - store 测试里「某路径是不是绝对路径」改为向平台询问,不再把 Windows 的形式当作唯一答案 —— 这条断言在 Linux runner 上第一次才真正生效。
- 客户端 bundle 是手写的
createElement,构建时不转译,被 review 的文件就是浏览器执行的文件;构建脚本会拒绝不解析、没调用__ModuleLoader__.load、或用别的 id 注册的 bundle。
v0.2.0 — read-only HTTP snapshot endpoint
本版新增:只读 HTTP 快照端点
供 Web GUI 面板读取当前会话的任务栈:
GET /api/dsh-task-stack/snapshot?sessionId=<id>&cwd=<绝对路径>
返回 depth / top / stack / history / warnings。
| 情况 | 响应 |
|---|---|
| 正常 | 200 + JSON,cache-control: no-store |
| 未认证(无浏览器 cookie)/ Host 不受信 | 401 / 403 |
组合里没有 connection 服务(无法鉴权) |
503,失败关闭 |
缺 sessionId、cwd 非绝对路径 |
400 |
非 GET/HEAD |
405 + Allow |
| 会话没有状态文件 | 200,空栈(不是 404) |
安全
raw WebServer 路由不继承 Connection 的鉴权,因此端点自行调用 connection.requestRejection(req)——与第一方 API 同一道 Host/Origin + 浏览器 cookie 校验。组合里没有 connection 时失败关闭返回 503,而不是无鉴权放行。
只读
端点只暴露 getSnapshot;关闭任务仍走 focus_complete 或 /focus。写入面需要单独的安全设计,不在本版范围内。
破坏性变更
无。三个工具、/focus 命令、配置字段、状态文件格式都没有变化,从 0.1.x 升级不影响现有任务栈数据。
验证
- 发布闸门 11 步全绿,共 80 项断言
- 新增
scripts/test-http.mjs:挂载真实@deepseek-ai/dsh-host-webserver到 OS 分配的端口,用真实 socket 驱动,覆盖 fence 双向、缺 connection 返回 503、卸载时撤销路由 - 真实宿主实测:带浏览器 cookie →
200且与磁盘状态逐项一致;匿名 →401;被拒 Host →403
安装
dsh plugin --profile <名称> add @ray1270/dsh-task-stack注:npm 上的 0.2.0 是这个 tag 指向的内容(shasum 130e8109a3259781ba8a5213697f661790ba012f,17 个文件)。
v0.1.1 — CI and README badges
本版变化
补齐工程化:让仓库本身可被信任地使用与验证。
持续集成
新增 .github/workflows/ci.yml:每次 push / PR 都跑完整的发布闸门——pnpm install --frozen-lockfile → node scripts/release-check.mjs(10 步:typecheck、build、产物自检、无宿主 probe、4 套测试、demo)→ npm pack --dry-run。
矩阵当前只放 Windows:测试套件在 Windows 上开发与验证,而当时机器上既没有 WSL 也没有 Docker,无法证明它们在 Linux 上能过——没跑过的腿不该提交上去让人收获一个原因不明的红。Linux 腿已写好并以注释形式留在 workflow 里。
README
- 顶部加三个徽章:npm version / license / CI
- 项目结构段补全(
commands.ts、CI workflow、LICENSE、各测试脚本)
package.json
补 repository / homepage / bugs 字段。
安装
dsh plugin --profile <名称> add @ray1270/dsh-task-stack兼容性
DSH 0.2.0-rc.2;@deepseek-ai/cordis ^4.0.2、dsh-tools、dsh-commands、schemastery ^3.18.2 均为 peerDependencies,由宿主运行时提供。不注册任何 prompt section、不做自动注入。
v0.1.0 — persistent per-session task stack
首次发布
给 DeepSeek Harness Agent 用的可持久化任务栈:模型显式调用三个工具 push / pop / 查看自己的多步任务焦点,状态以纯文本 JSON 落在会话工作区里。
- 跨上下文压缩存活 —— 状态在磁盘上,压缩掉对话也不丢
- 跨会话恢复可找回 —— 同一
sessionId+cwd重新挂载即读回同一份文件 - 零自动注入 —— 不写系统提示词、不注入上下文,Agent 不主动调用就一个 token 都不花
三个工具
| 工具 | 作用 |
|---|---|
focus_task |
把一个多步目标压栈;原来的栈顶转为 paused |
focus_complete |
弹出栈顶、记一行结论、让下一层重新变 active |
read_focus |
读取整个栈与最近历史(唯一查看方式,没有自动注入) |
另有斜杠命令 /focus:查看 / done <结论> / clear,不花模型轮次。
存储
- 每个会话一个 JSON 文件:
<会话工作区>/<stateDir>/<sessionId>.json - 原子写入(tmp → fsync → rename),读者只会看到完整的旧文档或新文档
- per-file 异步锁,并发调用不会丢更新
- 文件缺失 / 读失败 / JSON 坏 / 版本不符 / 会话不符 → 退化成空栈或丢弃坏帧并附 warning,从不抛异常
配置(Cordis 在插件启动前校验)
| 字段 | 默认 | 含义 |
|---|---|---|
stateDir |
.dsh/task-stack |
状态文件目录,相对会话工作区 |
maxStackDepth |
20 |
栈上最多同时开着的任务数 |
historyLimit |
100 |
历史最多保留多少条 |
statePruneDays |
0 |
删除超过这么多天没写过的会话状态(0 = 不清理) |
越界值直接拒绝加载该插件并在启动日志指出字段,不会静默夹紧成另一个策略。
验证
- 69 项断言(store 22 / tools 18 / config 12 / commands 13 / lifecycle 4)
- lifecycle 套件把插件挂成真实 Cordis 子 fiber 并覆盖真实 ToolRuntime,证明卸载/热重载不留残留
- 加载器集成走真实的
cordis-plugin-loader
安装
dsh plugin --profile <名称> add @ray1270/dsh-task-stack