Repository navigation
Releases
v0.3.7 — 后台任务结算状态修复 + 同实例串行化
修复:后台任务结算状态 + 同实例并发串流
缺陷 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:ui12/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 零混入
- 后台 tick 任务结算后
v0.3.6 — 工具返回值通过 DSH 无损 JSON 校验
修复:工具返回值必须通过 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:ui12/12npm run test:e2e通过,含无损 JSON 断言