@xdxer/dingtalk-agent 0.1.4-beta.7 → 0.1.4-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.en.md +395 -0
  3. package/README.md +466 -36
  4. package/dist/bin/dingtalk-agent.js +1071 -340
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/actions.js +98 -14
  7. package/dist/src/actions.js.map +1 -1
  8. package/dist/src/agent-audit.js +460 -0
  9. package/dist/src/agent-audit.js.map +1 -0
  10. package/dist/src/agent-bindings.js +132 -0
  11. package/dist/src/agent-bindings.js.map +1 -0
  12. package/dist/src/agent-definition.js +182 -0
  13. package/dist/src/agent-definition.js.map +1 -0
  14. package/dist/src/agent-enhance.js +678 -0
  15. package/dist/src/agent-enhance.js.map +1 -0
  16. package/dist/src/bootstrap.js +125 -17
  17. package/dist/src/bootstrap.js.map +1 -1
  18. package/dist/src/development-workspace.js +729 -0
  19. package/dist/src/development-workspace.js.map +1 -0
  20. package/dist/src/dws.js +145 -0
  21. package/dist/src/dws.js.map +1 -1
  22. package/dist/src/eval-evidence.js +193 -0
  23. package/dist/src/eval-evidence.js.map +1 -0
  24. package/dist/src/init.js +1 -1
  25. package/dist/src/init.js.map +1 -1
  26. package/dist/src/invocation.js +36 -0
  27. package/dist/src/invocation.js.map +1 -0
  28. package/dist/src/lab.js +679 -0
  29. package/dist/src/lab.js.map +1 -0
  30. package/dist/src/lease.js +100 -0
  31. package/dist/src/lease.js.map +1 -0
  32. package/dist/src/memory/candidates.js +451 -0
  33. package/dist/src/memory/candidates.js.map +1 -0
  34. package/dist/src/memory/completion-evidence.js +536 -0
  35. package/dist/src/memory/completion-evidence.js.map +1 -0
  36. package/dist/src/memory/operational.js +263 -0
  37. package/dist/src/memory/operational.js.map +1 -0
  38. package/dist/src/memory/remote-state.js +478 -0
  39. package/dist/src/memory/remote-state.js.map +1 -0
  40. package/dist/src/memory/task-checkpoints.js +204 -0
  41. package/dist/src/memory/task-checkpoints.js.map +1 -0
  42. package/dist/src/multica-deploy.js +1480 -0
  43. package/dist/src/multica-deploy.js.map +1 -0
  44. package/dist/src/multica-provider.js +685 -0
  45. package/dist/src/multica-provider.js.map +1 -0
  46. package/dist/src/opencode-evals.js +1062 -0
  47. package/dist/src/opencode-evals.js.map +1 -0
  48. package/dist/src/opencode-provider.js +531 -0
  49. package/dist/src/opencode-provider.js.map +1 -0
  50. package/dist/src/opencode-workspace.js +197 -0
  51. package/dist/src/opencode-workspace.js.map +1 -0
  52. package/dist/src/perception.js +225 -0
  53. package/dist/src/perception.js.map +1 -0
  54. package/dist/src/personal-event-evals.js +595 -0
  55. package/dist/src/personal-event-evals.js.map +1 -0
  56. package/dist/src/promotion.js +786 -0
  57. package/dist/src/promotion.js.map +1 -0
  58. package/dist/src/remote-semantic-state-live-evals.js +888 -0
  59. package/dist/src/remote-semantic-state-live-evals.js.map +1 -0
  60. package/dist/src/remote-semantic-state-worker.js +38 -0
  61. package/dist/src/remote-semantic-state-worker.js.map +1 -0
  62. package/dist/src/remote-state-evals.js +501 -0
  63. package/dist/src/remote-state-evals.js.map +1 -0
  64. package/dist/src/response-gate.js +51 -0
  65. package/dist/src/response-gate.js.map +1 -0
  66. package/dist/src/robot-evals.js +770 -0
  67. package/dist/src/robot-evals.js.map +1 -0
  68. package/dist/src/sessions.js +66 -105
  69. package/dist/src/sessions.js.map +1 -1
  70. package/dist/src/skill-manager.js +25 -16
  71. package/dist/src/skill-manager.js.map +1 -1
  72. package/dist/src/skills.js.map +1 -1
  73. package/dist/src/storage-evals.js +26 -0
  74. package/dist/src/storage-evals.js.map +1 -0
  75. package/dist/src/types.js.map +1 -1
  76. package/dist/src/waits.js +5 -1
  77. package/dist/src/waits.js.map +1 -1
  78. package/dist/src/workspace.js +28 -3
  79. package/dist/src/workspace.js.map +1 -1
  80. package/docs/INSTALLATION.md +47 -0
  81. package/docs/SECOND-AGENT-ACCEPTANCE.md +62 -0
  82. package/docs/architecture/agent-memory-topology.png +0 -0
  83. package/docs/architecture/agent-memory-topology.svg +132 -0
  84. package/docs/architecture/general-agent-kernel-topology.png +0 -0
  85. package/docs/architecture/general-agent-kernel-topology.svg +149 -0
  86. package/docs/architecture/provider-bound-development-workspace.png +0 -0
  87. package/docs/architecture/provider-bound-development-workspace.svg +141 -0
  88. package/docs/architecture/task-completion-gate.png +0 -0
  89. package/docs/architecture/task-completion-gate.svg +191 -0
  90. package/docs/schemas/agent-audit-load-evidence.schema.json +14 -0
  91. package/docs/schemas/agent-audit.schema.json +92 -0
  92. package/docs/schemas/agent-bindings.schema.json +54 -0
  93. package/docs/schemas/agent-definition.schema.json +78 -0
  94. package/docs/schemas/agent-enhancement-plan.schema.json +88 -0
  95. package/docs/schemas/agent-enhancement-receipt.schema.json +37 -0
  96. package/docs/schemas/enriched-invocation.schema.json +46 -0
  97. package/docs/schemas/eval-candidate-plan.schema.json +28 -0
  98. package/docs/schemas/eval-candidate-result.schema.json +20 -0
  99. package/docs/schemas/eval-candidate.schema.json +30 -0
  100. package/docs/schemas/invocation.schema.json +19 -0
  101. package/docs/schemas/memory-candidate-proposal.schema.json +18 -0
  102. package/docs/schemas/memory-candidate.schema.json +76 -0
  103. package/docs/schemas/memory-publish-target.schema.json +25 -0
  104. package/docs/schemas/multica-deployment-list.schema.json +29 -0
  105. package/docs/schemas/multica-deployment-operation.schema.json +51 -0
  106. package/docs/schemas/multica-deployment-plan.schema.json +70 -0
  107. package/docs/schemas/multica-deployment-receipt.schema.json +87 -0
  108. package/docs/schemas/multica-deployment-status.schema.json +23 -0
  109. package/docs/schemas/multica-workspace-inspection.schema.json +77 -0
  110. package/docs/schemas/multica-workspace-plan.schema.json +68 -0
  111. package/docs/schemas/multica-workspace-resource-list.schema.json +27 -0
  112. package/docs/schemas/multica-workspace-status.schema.json +34 -0
  113. package/docs/schemas/observation.schema.json +21 -0
  114. package/docs/schemas/operational-memory-provider.schema.json +36 -0
  115. package/docs/schemas/operational-memory-record.schema.json +24 -0
  116. package/docs/schemas/perception-input.schema.json +56 -0
  117. package/docs/schemas/project.schema.json +112 -0
  118. package/docs/schemas/promotion-list.schema.json +36 -0
  119. package/docs/schemas/promotion-plan.schema.json +60 -0
  120. package/docs/schemas/promotion-policy.schema.json +29 -0
  121. package/docs/schemas/promotion-receipt.schema.json +43 -0
  122. package/docs/schemas/promotion-status.schema.json +23 -0
  123. package/docs/schemas/release-readiness.schema.json +65 -0
  124. package/docs/schemas/remote-semantic-state-live-eval.schema.json +60 -0
  125. package/docs/schemas/remote-semantic-state-manifest.schema.json +79 -0
  126. package/docs/schemas/remote-semantic-state-provider.schema.json +98 -0
  127. package/docs/schemas/response-gate.schema.json +20 -0
  128. package/docs/schemas/task-checkpoint.schema.json +71 -0
  129. package/docs/schemas/task-completion-evidence.schema.json +154 -0
  130. package/docs/schemas/workspace-doctor.schema.json +56 -0
  131. package/docs/schemas/workspace-state.schema.json +39 -0
  132. package/evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json +123 -0
  133. package/evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json +69 -0
  134. package/evals/baselines/2026-07-16/opencode-multi-surface-summary.json +63 -0
  135. package/evals/baselines/2026-07-16/remote-state-live-summary.json +70 -0
  136. package/evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json +98 -0
  137. package/evals/baselines/2026-07-17/personal-event-live-readiness-summary.json +68 -0
  138. package/examples/agents/fde-coach/AGENTS.md +26 -0
  139. package/examples/agents/fde-coach/MEMORY.md +3 -0
  140. package/examples/agents/fde-coach/fields/default/field.json +24 -0
  141. package/examples/agents/fde-coach/knowledge/INDEX.md +4 -0
  142. package/examples/agents/fde-coach/skills/fde-coach/SKILL.md +13 -0
  143. package/examples/agents/release-manager/AGENTS.md +26 -0
  144. package/examples/agents/release-manager/MEMORY.md +3 -0
  145. package/examples/agents/release-manager/fields/default/field.json +24 -0
  146. package/examples/agents/release-manager/knowledge/INDEX.md +4 -0
  147. package/examples/agents/release-manager/skills/release-manager/SKILL.md +13 -0
  148. package/lab/README.md +109 -0
  149. package/lab/agent-eval/catalog.json +91 -0
  150. package/lab/agent-eval/classic-failures.json +177 -0
  151. package/lab/agent-eval/completion-gate-regression.json +99 -0
  152. package/lab/agent-eval/personal-event-live.example.json +94 -0
  153. package/lab/agent-eval/remote-semantic-state-live.example.json +70 -0
  154. package/lab/agent-eval/remote-semantic-state-provider.fixture.json +47 -0
  155. package/lab/agent-eval/remote-state-workspace/AGENTS.md +8 -0
  156. package/lab/agent-eval/remote-state-workspace/opencode.json +7 -0
  157. package/lab/agent-eval/remote-state-workspace/skills/remote-state-operator/SKILL.md +13 -0
  158. package/lab/agent-eval/remote-state.example.json +31 -0
  159. package/lab/agent-eval/workspace/AGENTS.md +7 -0
  160. package/lab/agent-eval/workspace/MEMORY.md +4 -0
  161. package/lab/agent-eval/workspace/artifacts/pending-review.md +3 -0
  162. package/lab/agent-eval/workspace/knowledge/INDEX.md +4 -0
  163. package/lab/agent-eval/workspace/opencode.json +20 -0
  164. package/lab/manifest.example.json +27 -0
  165. package/lab/manifest.personal-event.example.json +27 -0
  166. package/lab/project-workspace/README.md +11 -0
  167. package/lab/project-workspace/fake-multica-provider.mjs +266 -0
  168. package/lab/project-workspace/multica-deploy.fixture.json +29 -0
  169. package/lab/project-workspace/multica-readonly.fixture.json +69 -0
  170. package/lab/project-workspace/observation.fixture.json +14 -0
  171. package/lab/project-workspace/opencode-provider-suite.json +65 -0
  172. package/lab/project-workspace/project.fixture.json +44 -0
  173. package/lab/project-workspace/promotion-policy.fixture.json +15 -0
  174. package/lab/robot-eval/pool.example.json +30 -0
  175. package/lab/robot-eval/suite.json +123 -0
  176. package/lab/robot-eval/workspace/AGENTS.md +21 -0
  177. package/lab/robot-eval/workspace/MEMORY.md +3 -0
  178. package/lab/robot-eval/workspace/knowledge/INDEX.md +5 -0
  179. package/lab/robot-eval/workspace/opencode.json +22 -0
  180. package/lab/schemas/agent-eval-catalog.schema.json +47 -0
  181. package/lab/schemas/lab-manifest.schema.json +70 -0
  182. package/lab/schemas/personal-event-eval.schema.json +91 -0
  183. package/lab/schemas/remote-state-eval.schema.json +66 -0
  184. package/lab/schemas/robot-eval-suite.schema.json +184 -0
  185. package/lab/schemas/robot-pool.schema.json +56 -0
  186. package/package.json +30 -14
  187. package/skills/dingtalk-agent-boot-multica/SKILL.md +40 -0
  188. package/skills/dingtalk-agent-compose/SKILL.md +110 -0
  189. package/skills/dingtalk-agent-compose/assets/AGENTS.template.md +26 -0
  190. package/skills/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +13 -0
  191. package/skills/dingtalk-agent-compose/assets/agent.bindings.local.template.json +13 -0
  192. package/skills/dingtalk-agent-compose/assets/opencode.template.json +12 -0
  193. package/skills/dingtalk-agent-compose/assets/role-skill.template.md +24 -0
  194. package/skills/dingtalk-agent-compose/evals/evals.json +94 -0
  195. package/skills/dingtalk-agent-compose/references/agent-definition-contract.md +55 -0
  196. package/skills/dingtalk-agent-compose/references/opencode-host-contract.md +65 -0
  197. package/skills/dingtalk-agent-compose/references/storage-routing.md +20 -0
  198. package/skills/dingtalk-agent-deploy/SKILL.md +60 -0
  199. package/skills/dingtalk-agent-deploy/references/multica-deployment-contract.md +49 -0
  200. package/skills/dingtalk-agent-deploy/references/promotion-observation-contract.md +49 -0
  201. package/skills/dingtalk-agent-eval/SKILL.md +116 -0
  202. package/skills/dingtalk-agent-eval/assets/eval-catalog.template.json +18 -0
  203. package/skills/dingtalk-agent-eval/evals/evals.json +61 -0
  204. package/skills/dingtalk-agent-eval/references/eval-topology.md +34 -0
  205. package/skills/dingtalk-agent-eval/references/evidence-contract.md +31 -0
  206. package/skills/dingtalk-agent-eval/references/scenario-taxonomy.md +25 -0
  207. package/skills/dingtalk-agent-eval/references/storage-modes.md +75 -0
  208. package/skills/dingtalk-basic-behavior/SKILL.md +63 -3
  209. package/skills/dingtalk-basic-behavior/assets/memory-candidate-proposal.json +10 -0
  210. package/skills/dingtalk-basic-behavior/assets/{task-checkpoint.md → task-checkpoint.json} +2 -21
  211. package/skills/dingtalk-basic-behavior/references/action-contract.md +2 -0
  212. package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +15 -1
  213. package/skills/dingtalk-basic-behavior/references/perception-and-gates.md +28 -0
  214. package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +32 -7
  215. package/dist/src/boot.js +0 -70
  216. package/dist/src/boot.js.map +0 -1
  217. package/dist/src/duty.js +0 -74
  218. package/dist/src/duty.js.map +0 -1
  219. package/dist/src/kb.js +0 -240
  220. package/dist/src/kb.js.map +0 -1
  221. package/dist/src/runs.js +0 -79
  222. package/dist/src/runs.js.map +0 -1
  223. package/docs/ARCHITECTURE.md +0 -219
  224. package/docs/MINIMAL-WORKSPACE-V1.md +0 -172
  225. package/docs/OPEN-SOURCE-REFERENCES.md +0 -107
  226. package/docs/SELF-TEST.md +0 -252
  227. package/docs//345/206/205/347/275/221/345/256/236/347/233/270.md +0 -77
  228. package/evals/baselines/2026-07-14/behavior-summary.json +0 -28
  229. package/evals/baselines/2026-07-14/contract-summary.json +0 -18
  230. package/evals/baselines/2026-07-14/live-canary-summary.json +0 -25
  231. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/SKILL.md +0 -72
  232. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/action-contract.md +0 -31
  233. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/event-to-behavior.md +0 -22
  234. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/memory-and-evolution.md +0 -25
  235. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/runtime-modes.md +0 -34
  236. package/evals/baselines/2026-07-15/task-lifecycle-summary.json +0 -50
  237. package/evals/evals.json +0 -339
  238. package/evals/fixtures/dm-ambiguous-send.json +0 -4
  239. package/evals/fixtures/dm-blocked.json +0 -4
  240. package/evals/fixtures/dm-clear.json +0 -4
  241. package/evals/fixtures/dm-discussion.json +0 -4
  242. package/evals/fixtures/dm-doc-write-no-tool.json +0 -4
  243. package/evals/fixtures/dm-long-task-ack.json +0 -4
  244. package/evals/fixtures/dm-nonblocking-gap.json +0 -4
  245. package/evals/fixtures/dm-structured-task.json +0 -4
  246. package/evals/fixtures/group.json +0 -10
  247. package/evals/fixtures/mentioned.json +0 -3
  248. package/evals/run-contract-evals.mjs +0 -1169
  249. package/evals/run-shadow-evals.mjs +0 -267
  250. package/evals/runners/README.md +0 -66
  251. package/evals/runners/claude-shadow.mjs +0 -533
  252. package/evals/schemas/action-request.schema.json +0 -77
  253. package/evals/shadow-evals.json +0 -133
  254. package/skills/AGENTS.md +0 -104
  255. package/skills//344/273/273/345/212/241.md +0 -48
  256. package/skills//345/237/272/347/241/200/350/241/214/344/270/272.md +0 -44
  257. package/skills//345/277/203/350/267/263.md +0 -79
  258. package/skills//346/266/210/346/201/257.md +0 -50
  259. package/skills//347/237/245/350/257/206.md +0 -55
  260. package/skills//350/257/204/346/265/213.md +0 -62
  261. package/skills//351/222/211/351/222/211.md +0 -64
  262. package/templates/ontology/index.md +0 -24
  263. package/templates/ontology/self/access.md +0 -38
  264. package/templates/ontology/self/role-spec.md +0 -34
  265. package/templates/ontology/self/workspace.md +0 -41
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lab.js","sourceRoot":"","sources":["../../src/lab.ts"],"names":[],"mappings":"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","sourcesContent":["// 真实世界联调控制面:只管理测试授权、预算、marker、证据与清理。\n// 业务动作仍走 prepareSession + Action Gate + typed DWS,不在这里复制命令面。\n\nimport {\n existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync,\n writeFileSync,\n} from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport { normalizeEvent, digest, stableStringify } from './events.js'\nimport { executeAction } from './actions.js'\nimport { prepareSession, readJson } from './sessions.js'\nimport { loadWorkspace } from './workspace.js'\nimport * as dws from './dws.js'\nimport type { AgentConfig, NormalizedEvent } from './types.js'\n\nexport type LabMode = 'mock-integration' | 'robot-connect' | 'personal-event'\n\nexport interface LabManifest {\n $schema: 'dingtalk-agent/lab-manifest@1'\n id: string\n mode: LabMode\n syntheticOnly: true\n egressOwner: 'connector' | 'dingtalk-agent'\n markerPrefix: string\n evidenceRoot: string\n dws: { profile: string; expectedUserId: string }\n allowlist: {\n tenantIds: string[]\n conversationIds: string[]\n actorIds: string[]\n resourceIds: string[]\n }\n budgets: {\n maxRuns: number\n maxOutwardActions: number\n maxTextCharacters: number\n }\n resources: {\n workspace: string\n robot?: {\n unifiedAppId: string\n robotClientId: string\n botOpenDingTalkId: string\n allowedUserId: string\n channel: string\n }\n }\n}\n\nexport interface LabRunOptions {\n caseId: string\n action?: 'reply' | 'ask' | 'silence'\n replyText?: string\n inputText?: string\n silenceReason?: string\n perception?: Record<string, unknown>\n useEventCorrelation?: boolean\n markerOverride?: string\n live?: boolean\n yes?: boolean\n}\n\nexport function loadLabManifest(root: string, file: string): LabManifest {\n const path = safeInside(root, file, true)\n let value: unknown\n try { value = JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`Lab manifest 不是合法 JSON: ${error.message}`) }\n return validateManifest(root, value)\n}\n\nexport function doctorLab(root: string, file: string): Record<string, unknown> {\n const checks: Array<{ id: string; passed: boolean; detail: string }> = []\n let manifest: LabManifest | null = null\n try {\n manifest = loadLabManifest(root, file)\n checks.push({ id: 'manifest', passed: true, detail: `${manifest.id}/${manifest.mode}` })\n } catch (error) {\n checks.push({ id: 'manifest', passed: false, detail: String(error.message || error) })\n }\n if (manifest) {\n checks.push({\n id: 'synthetic-only', passed: manifest.syntheticOnly === true,\n detail: 'Lab 只允许合成数据。',\n })\n checks.push({\n id: 'single-egress', passed: expectedEgress(manifest.mode) === manifest.egressOwner,\n detail: `${manifest.mode} → ${manifest.egressOwner}`,\n })\n checks.push({\n id: 'budget', passed: manifest.budgets.maxOutwardActions === 1 &&\n manifest.budgets.maxRuns > 0 && manifest.budgets.maxRuns <= 20,\n detail: JSON.stringify(manifest.budgets),\n })\n checks.push({\n id: 'evidence-root', passed: isInside(resolve(root), resolve(root, manifest.evidenceRoot)),\n detail: resolve(root, manifest.evidenceRoot),\n })\n try {\n assertWorkspaceBindings(root, manifest)\n checks.push({ id: 'workspace-binding', passed: true, detail: manifest.resources.workspace || '.' })\n } catch (error) {\n checks.push({ id: 'workspace-binding', passed: false, detail: String(error.message || error) })\n }\n if (manifest.mode === 'mock-integration') {\n let fakeDetail = ''\n try { fakeDetail = assertFakeDws() }\n catch (error) { fakeDetail = String(error.message || error) }\n checks.push({\n id: 'fake-dws', passed: fakeDetail.startsWith('verified:'),\n detail: fakeDetail,\n })\n }\n }\n return {\n $schema: 'dingtalk-agent/lab-doctor@1',\n ready: checks.every((item) => item.passed),\n sideEffect: false,\n manifest: manifest ? redactManifest(manifest) : null,\n checks,\n }\n}\n\nexport function runLab(\n root: string,\n cfg: AgentConfig,\n manifestFile: string,\n rawEvent: Record<string, unknown> | null,\n options: LabRunOptions,\n): Record<string, unknown> {\n const manifest = loadLabManifest(root, manifestFile)\n assertWorkspaceBindings(root, manifest)\n assertRunAuthorization(manifest, options)\n if (manifest.mode === 'robot-connect') {\n if (rawEvent) throw new Error('robot-connect Lab 不接受 event-file;由 connector 接收合成消息')\n return runRobotLab(root, manifest, options)\n }\n if (!rawEvent) throw new Error(`${manifest.mode} Lab 需要 --event-file`)\n return runPreparedLab(root, cfg, manifest, rawEvent, options)\n}\n\nexport function verifyLab(root: string, evidence: string): Record<string, unknown> {\n const evidencePath = safeInside(root, evidence, true)\n let manifest: Record<string, any> = {}\n try { manifest = readJson(join(evidencePath, 'manifest.redacted.json')) }\n catch { /* required-file check below reports it */ }\n const required = [\n 'manifest.redacted.json', 'event.json', 'invocation.json', 'enriched-invocation.json',\n 'action-intent.json', 'action-attempt.json', 'action-receipt.json',\n 'platform-readback.json', 'teardown.json',\n ]\n if (manifest.mode && manifest.mode !== 'robot-connect') {\n required.push(\n 'identity.json', 'run.json', 'response-gate.json', 'resume.json',\n 'agent-definition.json', 'skill-manifest.json',\n )\n }\n const checks = required.map((name) => ({\n id: `file:${name}`,\n passed: existsSync(join(evidencePath, name)),\n detail: name,\n }))\n let marker = ''\n let receipt: Record<string, any> = {}\n let intent: Record<string, any> = {}\n let readback: Record<string, any> = {}\n let attempt: Record<string, any> = {}\n try {\n const event = readJson(join(evidencePath, 'event.json'))\n intent = readJson(join(evidencePath, 'action-intent.json'))\n attempt = readJson(join(evidencePath, 'action-attempt.json'))\n receipt = readJson(join(evidencePath, 'action-receipt.json'))\n readback = readJson(join(evidencePath, 'platform-readback.json'))\n marker = extractMarker(String(event.message?.text || intent.payload?.text || ''))\n } catch (error) {\n checks.push({ id: 'parse', passed: false, detail: String(error.message || error) })\n }\n const actionKind = String(intent.kind || '')\n const silence = actionKind === 'silence'\n checks.push({\n id: 'marker', passed: Boolean(marker && (silence || stableStringify(intent).includes(marker))),\n detail: marker || 'missing',\n })\n checks.push({\n id: 'receipt', passed: receipt.outcome === 'confirmed' && receipt.verified === true,\n detail: `${receipt.outcome || 'missing'}/${String(receipt.verified)}`,\n })\n const markerCount = countTextOccurrences(readback, marker)\n const platformPassed = silence\n ? readback.sideEffect === false && attempt.transportStarted === false && markerCount === 0\n : manifest.mode === 'robot-connect'\n ? hasQueryableReadback(readback) && markerCount >= 1\n : hasQueryableReadback(readback) && markerCount === 1\n checks.push({\n id: 'platform-readback', passed: platformPassed,\n detail: `kind=${actionKind || manifest.mode || 'unknown'} markerCount=${markerCount}; ${JSON.stringify(readback).slice(0, 240)}`,\n })\n const report = {\n $schema: 'dingtalk-agent/lab-assertions@1',\n passed: checks.every((item) => item.passed),\n engine: receipt.verified === true ? 'pass' : 'fail',\n platform: hasQueryableReadback(readback) ? 'visible' : 'unverified',\n userFeedback: 'not-collected',\n marker,\n markerCount,\n action: actionKind || null,\n checks,\n verifiedAt: new Date().toISOString(),\n }\n writeJson(join(evidencePath, 'assertions.json'), report)\n return report\n}\n\nexport function teardownLab(\n root: string,\n manifestFile: string,\n evidence: string,\n options: Pick<LabRunOptions, 'live' | 'yes'> = {},\n): Record<string, unknown> {\n const manifest = loadLabManifest(root, manifestFile)\n const evidencePath = safeInside(root, evidence, true)\n let external: Record<string, unknown> | null = null\n if (manifest.mode === 'robot-connect') {\n assertLiveConfirmation(options)\n const robot = manifest.resources.robot!\n const stop = dws.run([\n 'dev', 'connect', 'stop', '--robot-client-id', robot.robotClientId,\n '--yes', ...profileArgs(manifest.dws.profile),\n ], { allowFail: true, retries: 0 })\n const status = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', robot.robotClientId,\n '--json', ...profileArgs(manifest.dws.profile),\n ], { allowFail: true, retries: 0 })\n external = { stop, status }\n }\n const checks: Array<{ id: string; passed: boolean; detail: string }> = []\n if (manifest.mode === 'robot-connect') {\n checks.push({\n id: 'connector-released',\n passed: stableStringify(external).includes('not_running') ||\n stableStringify(external).includes('stopped'),\n detail: stableStringify(external),\n })\n } else {\n checks.push({\n id: 'no-lab-owned-connector', passed: external === null,\n detail: 'personal-event/mock Lab does not create or retain a connector',\n })\n try {\n const intent = readJson(join(evidencePath, 'action-intent.json'))\n const attempt = readJson(join(evidencePath, 'action-attempt.json'))\n const receipt = readJson(join(evidencePath, 'action-receipt.json'))\n checks.push({\n id: 'terminal-receipt',\n passed: receipt.outcome === 'confirmed' && receipt.verified === true &&\n receipt.actionId === intent.id &&\n (intent.kind === 'silence' || Boolean(attempt.startedAt)),\n detail: `${intent.kind || 'missing'}/${receipt.outcome || 'missing'}/${String(receipt.verified)}`,\n })\n } catch (error) {\n checks.push({ id: 'terminal-receipt', passed: false, detail: String(error.message || error) })\n }\n }\n const passed = checks.every((item) => item.passed)\n const report = {\n $schema: 'dingtalk-agent/lab-teardown@1',\n status: passed ? 'complete' : 'incomplete',\n passed,\n mode: manifest.mode,\n external,\n checks,\n completedAt: new Date().toISOString(),\n note: manifest.mode === 'personal-event'\n ? '消息不自动删除;本次 teardown 只确认没有 Lab 持有的 connector。'\n : 'Lab 控制面已清理。',\n }\n writeJson(join(evidencePath, 'teardown.json'), report)\n return report\n}\n\nfunction runPreparedLab(\n root: string,\n cfg: AgentConfig,\n manifest: LabManifest,\n originalEvent: Record<string, unknown>,\n options: LabRunOptions,\n): Record<string, unknown> {\n assertRunBudget(root, manifest)\n const caseId = safeCase(options.caseId)\n const generatedMarker = options.markerOverride ||\n `${manifest.markerPrefix}${caseId}-${randomUUID()}]`\n if (!generatedMarker.startsWith(`${manifest.markerPrefix}${caseId}-`) ||\n !/^\\[DTA-LAB-[^\\]\\r\\n]+\\]$/u.test(generatedMarker)) {\n throw new Error(`Lab marker 必须绑定当前 case: ${caseId}`)\n }\n const rawEvent = manifest.mode === 'mock-integration'\n ? addMarkerAndUniqueIds(originalEvent, generatedMarker)\n : originalEvent\n const event = normalizeEvent(rawEvent)\n const marker = manifest.mode === 'mock-integration'\n ? generatedMarker : extractMarker(event.message.text)\n if (!marker || !marker.startsWith(`${manifest.markerPrefix}${caseId}-`)) {\n throw new Error(`Live 入站消息必须包含 ${manifest.markerPrefix}<case>-<uuid>] marker`)\n }\n assertAllowedEvent(manifest, event)\n const prepareOptions: Record<string, unknown> = { perception: options.perception }\n if (!options.useEventCorrelation) {\n prepareOptions.sessionKey = `lab:${caseId}:${digest(marker).slice(0, 12)}`\n }\n const dispatch = prepareSession(root, cfg, rawEvent, prepareOptions)\n const action = options.action || 'reply'\n const actionText = `${marker} ${String(options.replyText ||\n (action === 'ask' ? '请补充一个阻塞信息。' : 'Lab canary reply')).trim()}`\n if (action !== 'silence' && actionText.length > manifest.budgets.maxTextCharacters) {\n throw new Error(`Lab 回复超过预算 ${manifest.budgets.maxTextCharacters}`)\n }\n const evidencePath = evidencePathFor(root, manifest, dispatch.runId)\n mkdirSync(evidencePath, { recursive: true })\n writeEvidenceCommon(evidencePath, manifest, event,\n readJson(join(dispatch.cwd, 'context', 'invocation.json')),\n readJson(join(dispatch.cwd, 'context', 'enriched-invocation.json')))\n copyPreparedContextEvidence(dispatch.cwd, evidencePath)\n writeJson(join(evidencePath, 'teardown.json'), {\n $schema: 'dingtalk-agent/lab-teardown@1', status: 'pending', mode: manifest.mode,\n })\n let receipt: Record<string, any>\n try {\n receipt = executeAction(dispatch.cwd, action, action === 'silence'\n ? { reason: options.silenceReason || 'unmentioned' }\n : { text: actionText })\n } catch (error) {\n const failure = error as Error & {\n receipt?: Record<string, any>\n evidencePath?: string\n }\n if (failure.receipt?.actionId) {\n const failedActionRoot = resolve(\n root, cfg.runtime.eventIndexRoot, 'actions', dispatch.runId, failure.receipt.actionId)\n if (existsSync(failedActionRoot)) {\n copyActionEvidence(failedActionRoot, evidencePath, failure.receipt, action)\n }\n }\n writeJson(join(evidencePath, 'failure.json'), {\n $schema: 'dingtalk-agent/lab-failure@1',\n stage: 'action', action, runId: dispatch.runId,\n error: String(failure.message || error), occurredAt: new Date().toISOString(),\n })\n failure.evidencePath = evidencePath\n throw failure\n }\n try {\n const actionRoot = findActionRoot(root, cfg, dispatch.runId, receipt.actionId)\n copyActionEvidence(actionRoot, evidencePath, receipt, action)\n const assertions = verifyLab(root, evidencePath)\n return {\n $schema: 'dingtalk-agent/lab-run@1',\n mode: manifest.mode,\n marker,\n action,\n evidencePath,\n dispatch,\n receipt,\n assertions,\n }\n } catch (error) {\n const failure = error as Error & { evidencePath?: string }\n writeJson(join(evidencePath, 'failure.json'), {\n $schema: 'dingtalk-agent/lab-failure@1',\n stage: 'evidence-collection', action, runId: dispatch.runId,\n error: String(failure.message || error), occurredAt: new Date().toISOString(),\n })\n failure.evidencePath = evidencePath\n throw failure\n }\n}\n\nfunction copyPreparedContextEvidence(runPath: string, evidencePath: string): void {\n copyJson(join(runPath, 'run.json'), join(evidencePath, 'run.json'))\n copyJson(join(runPath, 'context', 'response-gate.json'),\n join(evidencePath, 'response-gate.json'))\n copyJson(join(runPath, 'context', 'resume.json'), join(evidencePath, 'resume.json'))\n copyJson(join(runPath, 'context', 'agent-definition', 'definition.json'),\n join(evidencePath, 'agent-definition.json'))\n copyJson(join(runPath, 'context', 'skills', 'manifest.json'),\n join(evidencePath, 'skill-manifest.json'))\n}\n\nfunction copyActionEvidence(\n actionRoot: string,\n evidencePath: string,\n receipt: Record<string, any>,\n action: LabRunOptions['action'],\n): void {\n copyJson(join(actionRoot, 'intent.json'), join(evidencePath, 'action-intent.json'))\n const attemptPath = join(actionRoot, 'attempt.json')\n if (existsSync(attemptPath)) copyJson(attemptPath, join(evidencePath, 'action-attempt.json'))\n else writeJson(join(evidencePath, 'action-attempt.json'), {\n $schema: 'dingtalk-agent/action-attempt@1', actionId: receipt.actionId,\n transportStarted: false, reason: 'local-no-side-effect',\n })\n const identityPath = join(actionRoot, 'identity.json')\n if (existsSync(identityPath)) copyJson(identityPath, join(evidencePath, 'identity.json'))\n else writeJson(join(evidencePath, 'identity.json'), {\n $schema: 'dingtalk-agent/action-identity@1', required: false,\n reason: 'local-no-side-effect',\n })\n writeJson(join(evidencePath, 'action-receipt.json'), receipt)\n const transportResultPath = join(actionRoot, 'transport-result.json')\n if (existsSync(transportResultPath)) {\n copyJson(transportResultPath, join(evidencePath, 'transport-result.json'))\n }\n const verificationPath = join(actionRoot, 'verification.json')\n writeJson(join(evidencePath, 'platform-readback.json'), action === 'silence'\n ? { status: 'confirmed', sideEffect: false, verification: 'local-no-side-effect' }\n : existsSync(verificationPath)\n ? readJson(verificationPath)\n : { status: 'unverified', receipt })\n}\n\nfunction runRobotLab(\n root: string,\n manifest: LabManifest,\n options: LabRunOptions,\n): Record<string, unknown> {\n assertRunBudget(root, manifest)\n const robot = manifest.resources.robot!\n const marker = `${manifest.markerPrefix}${safeCase(options.caseId)}-${randomUUID()}]`\n const input = `${marker} ${String(options.inputText || '7 + 5 等于多少?请直接回答。').trim()}`\n const runId = `robot_${digest(marker).slice(0, 20)}`\n const evidencePath = evidencePathFor(root, manifest, runId)\n mkdirSync(evidencePath, { recursive: true })\n let start: unknown = null\n let send: unknown = null\n let readback: unknown = null\n let stopped: unknown = null\n try {\n start = dws.run([\n 'dev', 'connect', '--unified-app-id', robot.unifiedAppId,\n '--channel', robot.channel, '--agent-workdir', resolve(root, manifest.resources.workspace),\n '--allowed-users', robot.allowedUserId, '--agent-permission-mode', 'ask',\n '--agent-approval-mode', 'ask', '--agent-memory=false', '--reply-card=false',\n '--user-rate-limit', '5', '--agent-timeout', '120', '--daemon',\n ...profileArgs(manifest.dws.profile),\n ], { retries: 0 })\n send = dws.run([\n 'chat', 'message', 'send', '--open-dingtalk-id', robot.botOpenDingTalkId,\n '--text', input, '--uuid', randomUUID(), '--yes', ...profileArgs(manifest.dws.profile),\n ], { retries: 0 })\n readback = dws.run([\n 'chat', 'message', 'list', '--open-dingtalk-id', robot.botOpenDingTalkId,\n '--direction', 'newer', '--limit', '20', ...profileArgs(manifest.dws.profile),\n ], { retries: 1 })\n } finally {\n stopped = dws.run([\n 'dev', 'connect', 'stop', '--robot-client-id', robot.robotClientId,\n '--yes', ...profileArgs(manifest.dws.profile),\n ], { allowFail: true, retries: 0 })\n }\n const visible = stableStringify(readback).includes(marker)\n const event = {\n $schema: 'dingtalk-agent/event@1', id: runId, kind: 'robot.synthetic',\n message: { text: input },\n }\n writeEvidenceCommon(evidencePath, manifest, event, {\n $schema: 'dingtalk-agent/invocation@1', mode: 'direct', authority: 'host',\n eventId: runId, sessionKey: runId, occurredAt: null,\n actor: null, target: null, conversation: null,\n })\n writeJson(join(evidencePath, 'action-intent.json'), {\n $schema: 'dingtalk-agent/lab-connector-intent@1', kind: 'robot-smoke', marker, input,\n })\n writeJson(join(evidencePath, 'action-attempt.json'), { started: true, start, send })\n writeJson(join(evidencePath, 'action-receipt.json'), {\n $schema: 'dingtalk-agent/lab-connector-receipt@1', kind: 'robot-smoke',\n outcome: visible ? 'confirmed' : 'uncertain', verified: visible,\n verification: 'chat-message-list',\n })\n writeJson(join(evidencePath, 'platform-readback.json'), readback || {})\n writeJson(join(evidencePath, 'teardown.json'), {\n $schema: 'dingtalk-agent/lab-teardown@1', status: 'complete', stopped,\n completedAt: new Date().toISOString(),\n })\n const assertions = verifyLab(root, evidencePath)\n return { $schema: 'dingtalk-agent/lab-run@1', mode: manifest.mode,\n marker, evidencePath, assertions }\n}\n\nfunction writeEvidenceCommon(\n evidencePath: string,\n manifest: LabManifest,\n event: unknown,\n invocation: unknown,\n enrichedInvocation: unknown = null,\n): void {\n writeJson(join(evidencePath, 'manifest.redacted.json'), redactManifest(manifest))\n writeJson(join(evidencePath, 'event.json'), event)\n writeJson(join(evidencePath, 'invocation.json'), invocation)\n writeJson(join(evidencePath, 'enriched-invocation.json'), enrichedInvocation || {\n $schema: 'dingtalk-agent/enriched-invocation@1',\n status: 'base-only',\n note: 'Phase 2 只记录基础 Invocation;Perception Enricher 在 Phase 3 接入。',\n })\n}\n\nfunction validateManifest(root: string, value: unknown): LabManifest {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Lab manifest 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/lab-manifest@1') {\n throw new Error('Lab manifest schema 必须是 dingtalk-agent/lab-manifest@1')\n }\n if (!['mock-integration', 'robot-connect', 'personal-event'].includes(input.mode)) {\n throw new Error(`Lab mode 非法: ${input.mode || '(missing)'}`)\n }\n if (input.syntheticOnly !== true) throw new Error('Lab 必须声明 syntheticOnly=true')\n if (input.egressOwner !== expectedEgress(input.mode)) {\n throw new Error(`${input.mode} 的唯一出口必须是 ${expectedEgress(input.mode)}`)\n }\n if (!String(input.id || '').trim()) throw new Error('Lab manifest 缺少 id')\n if (!String(input.markerPrefix || '').startsWith('[DTA-LAB-')) {\n throw new Error('markerPrefix 必须以 [DTA-LAB- 开头')\n }\n if (!input.allowlist || !input.budgets || !input.resources || !input.dws) {\n throw new Error('Lab manifest 缺少 allowlist / budgets / resources / dws')\n }\n for (const key of ['tenantIds', 'conversationIds', 'actorIds', 'resourceIds']) {\n if (!Array.isArray(input.allowlist[key]) ||\n input.allowlist[key].some((item: unknown) => typeof item !== 'string')) {\n throw new Error(`Lab allowlist.${key} 必须是 string[]`)\n }\n }\n if (input.mode !== 'robot-connect' &&\n (!input.allowlist.tenantIds.length || !input.allowlist.conversationIds.length ||\n !input.allowlist.actorIds.length)) {\n throw new Error('Prepared Lab 必须显式 allowlist tenant / conversation / actor')\n }\n const budget = input.budgets\n if (!Number.isInteger(budget.maxRuns) || budget.maxRuns < 1 || budget.maxRuns > 20 ||\n budget.maxOutwardActions !== 1 || !Number.isInteger(budget.maxTextCharacters) ||\n budget.maxTextCharacters < 1 || budget.maxTextCharacters > 4000) {\n throw new Error('Lab budgets 必须满足 maxRuns=1..20、maxOutwardActions=1、maxTextCharacters=1..4000')\n }\n if (!String(input.evidenceRoot || '').trim()) throw new Error('Lab 缺少 evidenceRoot')\n safeInside(root, input.evidenceRoot, false)\n if (!String(input.resources.workspace || '').trim()) throw new Error('Lab 缺少 resources.workspace')\n safeInside(root, input.resources.workspace, true)\n if (input.mode === 'robot-connect') {\n const robot = input.resources.robot || {}\n for (const key of ['unifiedAppId', 'robotClientId', 'botOpenDingTalkId', 'allowedUserId', 'channel']) {\n if (!String(robot[key] || '').trim()) throw new Error(`robot-connect 缺少 resources.robot.${key}`)\n }\n const resources = input.allowlist.resourceIds\n if (![robot.unifiedAppId, robot.robotClientId, robot.botOpenDingTalkId]\n .every((id) => resources.includes(id)) ||\n !input.allowlist.actorIds.includes(robot.allowedUserId)) {\n throw new Error('robot-connect 的 app/robot/bot 必须进入 resourceIds,allowed user 必须进入 actorIds')\n }\n } else if (!String(input.dws.profile || '').trim() || !String(input.dws.expectedUserId || '').trim()) {\n throw new Error('Prepared Lab 必须固定 dws.profile 与 expectedUserId')\n }\n return input as LabManifest\n}\n\nfunction assertWorkspaceBindings(root: string, manifest: LabManifest): void {\n const workspaceRoot = safeInside(root, manifest.resources.workspace, true)\n if (manifest.mode === 'robot-connect') return\n const workspace = loadWorkspace(workspaceRoot)\n if (workspace.dws.profile !== manifest.dws.profile ||\n workspace.dws.expectedUserId !== manifest.dws.expectedUserId) {\n throw new Error('Lab manifest 的 DWS 身份与 Workspace Definition 不一致')\n }\n const fieldPath = join(workspaceRoot, 'fields', 'default', 'field.json')\n const field = readJson(fieldPath)\n if (field.transport?.egressOwner !== manifest.egressOwner ||\n field.transport?.mode !== (manifest.mode === 'mock-integration' ? 'personal-event' : manifest.mode)) {\n throw new Error('Lab manifest 的 mode/egressOwner 与 Field 不一致')\n }\n}\n\nfunction assertRunAuthorization(manifest: LabManifest, options: LabRunOptions): void {\n if (!String(options.caseId || '').trim()) throw new Error('lab run 需要 --case-id')\n if (manifest.mode === 'mock-integration') {\n assertFakeDws()\n if (options.live) throw new Error('mock-integration 不接受 --live')\n return\n }\n assertLiveConfirmation(options)\n}\n\nfunction assertFakeDws(): string {\n if (process.env.DTA_LAB_FAKE_DWS !== '1') {\n throw new Error('mock-integration 必须设置 DTA_LAB_FAKE_DWS=1')\n }\n const declared = String(process.env.DTA_LAB_FAKE_DWS_PATH || '').trim()\n if (!declared || !isAbsolute(declared)) {\n throw new Error('mock-integration 必须设置存在的绝对 DTA_LAB_FAKE_DWS_PATH')\n }\n if (!existsSync(declared)) throw new Error(`DTA_LAB_FAKE_DWS_PATH 不存在: ${declared}`)\n const actual = findExecutable('dws')\n if (!actual || realpathSync(actual) !== realpathSync(declared)) {\n throw new Error(`PATH 中的 dws 与 DTA_LAB_FAKE_DWS_PATH 不一致: ${actual || 'missing'}`)\n }\n const marker = `${realpathSync(declared)}.dta-fake`\n if (!existsSync(marker) || readFileSync(marker, 'utf8').trim() !== 'dingtalk-agent/fake-dws@1') {\n throw new Error('fake DWS 缺少同路径 .dta-fake 身份标记')\n }\n return `verified:${realpathSync(declared)}`\n}\n\nfunction findExecutable(name: string): string {\n for (const directory of String(process.env.PATH || '').split(delimiter)) {\n if (!directory) continue\n const candidate = join(directory, name)\n if (existsSync(candidate)) return candidate\n }\n return ''\n}\n\nfunction assertLiveConfirmation(options: Pick<LabRunOptions, 'live' | 'yes'>): void {\n if (!options.live || !options.yes) {\n throw new Error('Live Lab 会产生真实钉钉副作用;必须同时显式传入 --live --yes')\n }\n}\n\nfunction assertAllowedEvent(manifest: LabManifest, event: NormalizedEvent): void {\n const actorIds = [event.actor.id, event.actor.userId, event.actor.openDingTalkId].filter(Boolean)\n if (!manifest.allowlist.tenantIds.includes(event.tenant.id)) {\n throw new Error(`Lab tenant 不在 allowlist: ${event.tenant.id}`)\n }\n if (!manifest.allowlist.conversationIds.includes(event.conversation.id)) {\n throw new Error(`Lab conversation 不在 allowlist: ${event.conversation.id}`)\n }\n if (!actorIds.some((id) => manifest.allowlist.actorIds.includes(id))) {\n throw new Error(`Lab actor 不在 allowlist: ${actorIds.join('/')}`)\n }\n}\n\nfunction addMarkerAndUniqueIds(raw: Record<string, unknown>, marker: string): Record<string, unknown> {\n const copy = JSON.parse(JSON.stringify(raw))\n if (copy.$schema === 'dingtalk-agent/event@1') {\n copy.id = `${String(copy.id || 'mock')}-${digest(marker).slice(0, 10)}`\n copy.message = { ...(copy.message || {}),\n id: `${String(copy.message?.id || 'message')}-${digest(marker).slice(0, 10)}`,\n text: `${marker} ${String(copy.message?.text || '')}`.trim() }\n return copy\n }\n if (typeof copy.data !== 'string') throw new Error('mock event 缺少可注入 marker 的 data JSON')\n const data = JSON.parse(copy.data)\n const suffix = digest(marker).slice(0, 10)\n data.event_id = `${String(data.event_id || 'mock')}-${suffix}`\n data.message_id = `${String(data.message_id || 'message')}-${suffix}`\n data.content = `${marker} ${String(data.content || '')}`.trim()\n copy.data = JSON.stringify(data)\n return copy\n}\n\nfunction findActionRoot(\n root: string, cfg: AgentConfig, runId: string, actionId: string,\n): string {\n const path = resolve(root, cfg.runtime.eventIndexRoot, 'actions', runId, actionId)\n if (!existsSync(path)) throw new Error(`Lab 找不到 Action journal: ${actionId}`)\n return path\n}\n\nfunction assertRunBudget(root: string, manifest: LabManifest): void {\n const evidenceRoot = safeInside(root, manifest.evidenceRoot, false)\n if (!existsSync(evidenceRoot)) return\n const used = readdirSync(evidenceRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory()).length\n if (used >= manifest.budgets.maxRuns) {\n throw new Error(`Lab Run 预算已用完: ${used}/${manifest.budgets.maxRuns};先 verify/teardown 并换新 Lab id`)\n }\n}\n\nfunction evidencePathFor(root: string, manifest: LabManifest, runId: string): string {\n const evidenceRoot = safeInside(root, manifest.evidenceRoot, false)\n return join(evidenceRoot, safeCase(runId))\n}\n\nfunction redactManifest(manifest: LabManifest): Record<string, unknown> {\n const redact = (value: string) => value\n ? `<redacted:${digest(value).slice(0, 10)}>` : ''\n return {\n ...manifest,\n dws: {\n profile: redact(manifest.dws.profile),\n expectedUserId: redact(manifest.dws.expectedUserId),\n },\n allowlist: Object.fromEntries(Object.entries(manifest.allowlist)\n .map(([key, values]) => [key, values.map(redact)])),\n resources: {\n workspace: manifest.resources.workspace,\n robot: manifest.resources.robot\n ? Object.fromEntries(Object.entries(manifest.resources.robot)\n .map(([key, value]) => [key === 'channel' ? key : key, key === 'channel' ? value : redact(value)]))\n : undefined,\n },\n }\n}\n\nfunction copyJson(from: string, to: string): void {\n if (!existsSync(from)) throw new Error(`Lab evidence 缺少 ${basename(from)}`)\n writeJson(to, readJson(from))\n}\n\nfunction writeJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction extractMarker(text: string): string {\n return text.match(/\\[DTA-LAB-[^\\]\\r\\n]{1,180}\\]/)?.[0] || ''\n}\n\nfunction hasQueryableReadback(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false\n const text = stableStringify(value)\n return /openMessageId|openMsgId|open_message_id|messages|records/.test(text)\n}\n\nfunction countTextOccurrences(value: unknown, needle: string): number {\n if (!needle || value === null || value === undefined) return 0\n if (typeof value === 'string') return value.split(needle).length - 1\n if (Array.isArray(value)) {\n return value.reduce((sum, item) => sum + countTextOccurrences(item, needle), 0)\n }\n if (typeof value === 'object') {\n let total = 0\n for (const item of Object.values(value as Record<string, unknown>)) {\n total += countTextOccurrences(item, needle)\n }\n return total\n }\n return 0\n}\n\nfunction expectedEgress(mode: LabMode): LabManifest['egressOwner'] {\n return mode === 'robot-connect' ? 'connector' : 'dingtalk-agent'\n}\n\nfunction safeInside(root: string, path: string, mustExist: boolean): string {\n const rootPath = existsSync(root) ? realpathSync(resolve(root)) : resolve(root)\n const target = resolve(rootPath, path)\n if (!isInside(rootPath, target)) throw new Error(`Lab 路径必须位于 Workspace 内: ${path}`)\n if (mustExist && !existsSync(target)) throw new Error(`Lab 路径不存在: ${path}`)\n return mustExist ? realpathSync(target) : target\n}\n\nfunction isInside(root: string, path: string): boolean {\n const rel = relative(root, path)\n return rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)\n}\n\nfunction safeCase(value: string): string {\n return String(value || '').replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'case'\n}\n\nfunction profileArgs(profile: string): string[] {\n return profile ? ['--profile', profile] : []\n}\n"]}
@@ -0,0 +1,100 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { hostname } from 'node:os';
4
+ import { randomUUID } from 'node:crypto';
5
+ const LOCK_HOST = hostname();
6
+ const lockSleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
7
+ /**
8
+ * 进程级 durable lease。mkdir 保证互斥,owner token 防止误释放;同机死 PID
9
+ * 可立即恢复,跨主机只能按 staleAfterMs 回收。
10
+ */
11
+ export function acquireLease(path, label, { waitMs, staleAfterMs }) {
12
+ const deadline = Date.now() + waitMs;
13
+ const token = randomUUID();
14
+ mkdirSync(dirname(path), { recursive: true });
15
+ while (true) {
16
+ try {
17
+ mkdirSync(path);
18
+ try {
19
+ writeJsonAtomic(join(path, 'owner.json'), {
20
+ token, pid: process.pid, host: LOCK_HOST,
21
+ acquiredAt: new Date().toISOString(), staleAfterMs,
22
+ });
23
+ }
24
+ catch (error) {
25
+ rmSync(path, { recursive: true, force: true });
26
+ throw error;
27
+ }
28
+ return () => releaseLease(path, token);
29
+ }
30
+ catch (error) {
31
+ const code = error.code;
32
+ if (code !== 'EEXIST')
33
+ throw error;
34
+ const state = inspectLease(path, staleAfterMs);
35
+ if (state.stale) {
36
+ const tomb = `${path}.stale.${process.pid}.${randomUUID()}`;
37
+ try {
38
+ renameSync(path, tomb);
39
+ rmSync(tomb, { recursive: true, force: true });
40
+ continue;
41
+ }
42
+ catch (moveError) {
43
+ const moveCode = moveError.code;
44
+ if (moveCode === 'ENOENT' || moveCode === 'EEXIST')
45
+ continue;
46
+ throw moveError;
47
+ }
48
+ }
49
+ if (Date.now() < deadline) {
50
+ lockSleep(Math.min(100, Math.max(1, deadline - Date.now())));
51
+ continue;
52
+ }
53
+ throw new Error(`${label}: ${path};owner=${state.owner || 'unknown'}。` +
54
+ '可重试;确认宿主进程已死后再人工 reconcile');
55
+ }
56
+ }
57
+ }
58
+ function inspectLease(path, staleAfterMs) {
59
+ let age = 0;
60
+ try {
61
+ age = Date.now() - statSync(path).mtimeMs;
62
+ }
63
+ catch (error) {
64
+ return { stale: error.code === 'ENOENT', owner: '' };
65
+ }
66
+ let owner;
67
+ try {
68
+ owner = JSON.parse(readFileSync(join(path, 'owner.json'), 'utf8'));
69
+ }
70
+ catch { }
71
+ if (!owner)
72
+ return { stale: age >= 2_000, owner: '' };
73
+ const summary = `${owner.host || '?'}:${owner.pid || '?'}@${owner.acquiredAt || '?'}`;
74
+ if (owner.host === LOCK_HOST && Number.isInteger(Number(owner.pid))) {
75
+ try {
76
+ process.kill(Number(owner.pid), 0);
77
+ return { stale: false, owner: summary };
78
+ }
79
+ catch (error) {
80
+ if (error.code === 'ESRCH')
81
+ return { stale: true, owner: summary };
82
+ return { stale: age >= staleAfterMs, owner: summary };
83
+ }
84
+ }
85
+ return { stale: age >= staleAfterMs, owner: summary };
86
+ }
87
+ function releaseLease(path, token) {
88
+ try {
89
+ const owner = JSON.parse(readFileSync(join(path, 'owner.json'), 'utf8'));
90
+ if (owner.token === token)
91
+ rmSync(path, { recursive: true, force: true });
92
+ }
93
+ catch { }
94
+ }
95
+ function writeJsonAtomic(path, value) {
96
+ const temp = `${path}.${process.pid}.${Date.now()}.tmp`;
97
+ writeFileSync(temp, JSON.stringify(value, null, 2) + '\n', { flag: 'wx' });
98
+ renameSync(temp, path);
99
+ }
100
+ //# sourceMappingURL=lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lease.js","sourceRoot":"","sources":["../../src/lease.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync,\n} from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { hostname } from 'node:os'\nimport { randomUUID } from 'node:crypto'\n\nconst LOCK_HOST = hostname()\nconst lockSleep = (ms: number) =>\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n\nexport interface LeaseOptions {\n waitMs: number\n staleAfterMs: number\n}\n\n/**\n * 进程级 durable lease。mkdir 保证互斥,owner token 防止误释放;同机死 PID\n * 可立即恢复,跨主机只能按 staleAfterMs 回收。\n */\nexport function acquireLease(\n path: string,\n label: string,\n { waitMs, staleAfterMs }: LeaseOptions,\n): () => void {\n const deadline = Date.now() + waitMs\n const token = randomUUID()\n mkdirSync(dirname(path), { recursive: true })\n while (true) {\n try {\n mkdirSync(path)\n try {\n writeJsonAtomic(join(path, 'owner.json'), {\n token, pid: process.pid, host: LOCK_HOST,\n acquiredAt: new Date().toISOString(), staleAfterMs,\n })\n } catch (error) {\n rmSync(path, { recursive: true, force: true })\n throw error\n }\n return () => releaseLease(path, token)\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n if (code !== 'EEXIST') throw error\n const state = inspectLease(path, staleAfterMs)\n if (state.stale) {\n const tomb = `${path}.stale.${process.pid}.${randomUUID()}`\n try {\n renameSync(path, tomb)\n rmSync(tomb, { recursive: true, force: true })\n continue\n } catch (moveError) {\n const moveCode = (moveError as NodeJS.ErrnoException).code\n if (moveCode === 'ENOENT' || moveCode === 'EEXIST') continue\n throw moveError\n }\n }\n if (Date.now() < deadline) {\n lockSleep(Math.min(100, Math.max(1, deadline - Date.now())))\n continue\n }\n throw new Error(\n `${label}: ${path};owner=${state.owner || 'unknown'}。` +\n '可重试;确认宿主进程已死后再人工 reconcile',\n )\n }\n }\n}\n\nfunction inspectLease(path: string, staleAfterMs: number): { stale: boolean; owner: string } {\n let age = 0\n try { age = Date.now() - statSync(path).mtimeMs }\n catch (error) {\n return { stale: (error as NodeJS.ErrnoException).code === 'ENOENT', owner: '' }\n }\n let owner: Record<string, unknown> | undefined\n try { owner = JSON.parse(readFileSync(join(path, 'owner.json'), 'utf8')) }\n catch {}\n if (!owner) return { stale: age >= 2_000, owner: '' }\n const summary = `${owner.host || '?'}:${owner.pid || '?'}@${owner.acquiredAt || '?'}`\n if (owner.host === LOCK_HOST && Number.isInteger(Number(owner.pid))) {\n try {\n process.kill(Number(owner.pid), 0)\n return { stale: false, owner: summary }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ESRCH') return { stale: true, owner: summary }\n return { stale: age >= staleAfterMs, owner: summary }\n }\n }\n return { stale: age >= staleAfterMs, owner: summary }\n}\n\nfunction releaseLease(path: string, token: string): void {\n try {\n const owner = JSON.parse(readFileSync(join(path, 'owner.json'), 'utf8'))\n if (owner.token === token) rmSync(path, { recursive: true, force: true })\n } catch {}\n}\n\nfunction writeJsonAtomic(path: string, value: unknown): void {\n const temp = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temp, path)\n}\n"]}