Skip to content

Releases

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 13:24

新增

  • Web GUI 只读侧栏面板「任务栈」。侧栏多一个入口,点开是当前会话的栈:active 任务、它下面 paused 的任务、最近完成的若干条,按几秒一次轮询快照端点刷新。侧栏行和它打开的页面共用一个 id,两处指向同一个视图。
  • 面板自己解释自己:图例、中文分区标题、深度徽标、相对时间(「3 分钟前」),读者不必先记住每种颜色的含义。
  • 面板只读:关任务仍然只走模型工具和 /focus。GUI 的写路径需要单独的授权故事,这一版刻意没有引入。

修复

  • paused 行按帧自身的状态分组。此前按「这一行是否等于栈顶视图的同一个对象」来判断,而线上文档把 top 作为同一帧的第二个视图对象发出,于是每一行都不等于它,active 任务被当成 paused 又列了一遍。改为直接读 frame.status。
  • 声明 engines.dsh 支持区间。宿主升到 dsh 0.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,造出一个游离的 main release 和 tag。
  • store 测试里「某路径是不是绝对路径」改为向平台询问,不再把 Windows 的形式当作唯一答案 —— 这条断言在 Linux runner 上第一次才真正生效。
  • 客户端 bundle 是手写的 createElement,构建时不转译,被 review 的文件就是浏览器执行的文件;构建脚本会拒绝不解析、没调用 __ModuleLoader__.load、或用别的 id 注册的 bundle。

v0.2.0 — read-only HTTP snapshot endpoint

Choose a tag to compare

@Ray1270 Ray1270 released this 04 Oct 09:00

本版新增:只读 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

Choose a tag to compare

@Ray1270 Ray1270 released this 04 Oct 09:05

本版变化

补齐工程化:让仓库本身可被信任地使用与验证。

持续集成

新增 .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

Choose a tag to compare

@Ray1270 Ray1270 released this 04 Oct 09:05

首次发布

给 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