Skip to content

Releases

v0.3.7 — 后台任务结算状态修复 + 同实例串行化

Choose a tag to compare

@nishuoyang nishuoyang released this 08 Sep 15:22

修复:后台任务结算状态 + 同实例并发串流

缺陷 1:后台任务结算后 job_output / job_list 报错、通知显示 [status: undefined]

dsh-jobs 约定 done 必须兑现 JobOutcome { status: 'completed' | 'killed' | 'failed', detail?, output? };dsh-jobs-local 会直接 job.status = outcome.status,且 snapshot() 无条件输出 status 键。此前后台任务返回 { exitCode, signal },于是 status 为 undefined,结算后读取 job_output / job_list 触发无损 JSON 校验失败,运行时通知也变成 [status: undefined]。

现已改为返回合规的 { status, detail },detail 形如 exit code: 0。

缺陷 2:同一实例并发调用互相串流

Workbench CLI 的会话是按实例复用的(session 只有 list / close,没有单次调用独立会话的参数),同实例并发执行时 stdout 会交错,出现“后台任务的输出里混进前台体检结果、体检段落变空”的现象。

现新增按 instance_id 的 FIFO 互斥锁 withInstanceLock,覆盖 ecs_exec(前台 / 批量 / 后台)、ecs_diagnose、ecs_deploy、ecs_upload、ecs_download 以及设置面板 RPC;不同实例仍然完全并行。

语义提示:同一实例上,前台命令会排队等待正在运行的后台任务结束——这是隔离所必需的代价。

改动

  • lib/common.js:新增 withInstanceLock(instanceId, fn)(模块级 FIFO 门闩链)
  • lib/tools/ecs-exec.js:后台 done 返回 JobOutcome;单次 / 批量 / 后台全部进锁
  • lib/tools/ecs-deploy.js:整个“上传 → 生效命令 → 健康检查”阶段序列进锁
  • lib/settings-api.js、ecs-diagnose.js、ecs-upload.js、ecs-download.js:实例相关 CLI 调用进锁
  • test/e2e-local.mjs:新增 jobs 契约断言(含模拟真实 snapshot() 过 isJsonValue)与“同实例并发不串流”实测

验证

  • npm run test:ui 12/12,npm run test:e2e 通过
  • 真机复测(i-uf66ct2o35p7fjcd0sru / cn-shanghai):
    • 后台 tick 任务结算后 job_output 返回完整记录(exit_code: 0、duration: 3.074s),job_list 显示 completed,通知为 [status: completed, exit code: 0]
    • 后台任务 + 并发 ecs_diagnose:体检 7/7 段完整、内存与磁盘段非空、docker ps 表格对齐,后台 stdout 零混入

v0.3.6 — 工具返回值通过 DSH 无损 JSON 校验

Choose a tag to compare

@nishuoyang nishuoyang released this 08 Sep 15:21

修复:工具返回值必须通过 DSH 无损 JSON 校验

DSH 的工具调用管线会对 execute 返回值、output.render、output.presentationMeta、presentCall / presentResult 逐个执行无损 JSON 校验(isJsonValue)。此前多处把可能为 undefined 的字段直接写进结果对象,导致工具直接报错:

value is not lossless JSON
output.presentationMeta returned non-lossless JSON

改动

  • lib/common.js:新增 omitUndefined(value),递归丢弃所有 undefined 属性(保留 null / 0 / false / '')。
  • lib/index.js:注册边界统一包裹 execute,并对 output.render / output.presentationMeta / presentCall / presentResult 做同样处理,任何工具都不会再漏出 undefined。
  • 各工具(exec / diagnose / deploy / upload / download / list / session):在源头收敛可选字段,不再出现 stdout_spill_path: undefined、detail_json: undefined、error: undefined 这类键。
  • test/e2e-local.mjs:引入 @deepseek-ai/dsh-session 的真实 isJsonValue,对每个工具的 value / presentationMeta / presentCall 逐项断言(修复前 false,修复后 true)。

验证

  • npm test(smoke)通过
  • npm run test:ui 12/12
  • npm run test:e2e 通过,含无损 JSON 断言