@xdxer/dingtalk-agent 0.1.4-beta.8 → 0.1.4

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 (254) hide show
  1. package/CHANGELOG.md +233 -0
  2. package/README.en.md +167 -0
  3. package/README.md +101 -248
  4. package/dist/bin/dingtalk-agent.js +1255 -25
  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 +1385 -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 +711 -0
  15. package/dist/src/agent-enhance.js.map +1 -0
  16. package/dist/src/agent-platform.js +299 -0
  17. package/dist/src/agent-platform.js.map +1 -0
  18. package/dist/src/bootstrap.js +125 -17
  19. package/dist/src/bootstrap.js.map +1 -1
  20. package/dist/src/config.js +1 -7
  21. package/dist/src/config.js.map +1 -1
  22. package/dist/src/development-workspace.js +755 -0
  23. package/dist/src/development-workspace.js.map +1 -0
  24. package/dist/src/doctor.js +74 -15
  25. package/dist/src/doctor.js.map +1 -1
  26. package/dist/src/dws.js +145 -0
  27. package/dist/src/dws.js.map +1 -1
  28. package/dist/src/eval-evidence.js +193 -0
  29. package/dist/src/eval-evidence.js.map +1 -0
  30. package/dist/src/host-detect.js +146 -0
  31. package/dist/src/host-detect.js.map +1 -0
  32. package/dist/src/instruction-path.js +270 -0
  33. package/dist/src/instruction-path.js.map +1 -0
  34. package/dist/src/invocation.js +36 -0
  35. package/dist/src/invocation.js.map +1 -0
  36. package/dist/src/lab.js +679 -0
  37. package/dist/src/lab.js.map +1 -0
  38. package/dist/src/lease.js +100 -0
  39. package/dist/src/lease.js.map +1 -0
  40. package/dist/src/map.js +157 -0
  41. package/dist/src/map.js.map +1 -0
  42. package/dist/src/memory/candidates.js +451 -0
  43. package/dist/src/memory/candidates.js.map +1 -0
  44. package/dist/src/memory/completion-evidence.js +536 -0
  45. package/dist/src/memory/completion-evidence.js.map +1 -0
  46. package/dist/src/memory/operational.js +263 -0
  47. package/dist/src/memory/operational.js.map +1 -0
  48. package/dist/src/memory/remote-state.js +478 -0
  49. package/dist/src/memory/remote-state.js.map +1 -0
  50. package/dist/src/memory/task-checkpoints.js +204 -0
  51. package/dist/src/memory/task-checkpoints.js.map +1 -0
  52. package/dist/src/multica-deploy.js +1538 -0
  53. package/dist/src/multica-deploy.js.map +1 -0
  54. package/dist/src/multica-provider.js +685 -0
  55. package/dist/src/multica-provider.js.map +1 -0
  56. package/dist/src/opencode-evals.js +1547 -0
  57. package/dist/src/opencode-evals.js.map +1 -0
  58. package/dist/src/opencode-isolation.js +124 -0
  59. package/dist/src/opencode-isolation.js.map +1 -0
  60. package/dist/src/opencode-provider.js +532 -0
  61. package/dist/src/opencode-provider.js.map +1 -0
  62. package/dist/src/opencode-workspace.js +208 -0
  63. package/dist/src/opencode-workspace.js.map +1 -0
  64. package/dist/src/perception.js +225 -0
  65. package/dist/src/perception.js.map +1 -0
  66. package/dist/src/personal-event-evals.js +595 -0
  67. package/dist/src/personal-event-evals.js.map +1 -0
  68. package/dist/src/promotion.js +786 -0
  69. package/dist/src/promotion.js.map +1 -0
  70. package/dist/src/remote-semantic-state-live-evals.js +888 -0
  71. package/dist/src/remote-semantic-state-live-evals.js.map +1 -0
  72. package/dist/src/remote-semantic-state-worker.js +38 -0
  73. package/dist/src/remote-semantic-state-worker.js.map +1 -0
  74. package/dist/src/remote-state-evals.js +502 -0
  75. package/dist/src/remote-state-evals.js.map +1 -0
  76. package/dist/src/response-gate.js +51 -0
  77. package/dist/src/response-gate.js.map +1 -0
  78. package/dist/src/robot-evals.js +771 -0
  79. package/dist/src/robot-evals.js.map +1 -0
  80. package/dist/src/sessions.js +66 -105
  81. package/dist/src/sessions.js.map +1 -1
  82. package/dist/src/setup.js +6 -5
  83. package/dist/src/setup.js.map +1 -1
  84. package/dist/src/skill-manager.js +162 -24
  85. package/dist/src/skill-manager.js.map +1 -1
  86. package/dist/src/skills.js +2 -1
  87. package/dist/src/skills.js.map +1 -1
  88. package/dist/src/storage-evals.js +26 -0
  89. package/dist/src/storage-evals.js.map +1 -0
  90. package/dist/src/types.js.map +1 -1
  91. package/dist/src/upgrade.js +23 -27
  92. package/dist/src/upgrade.js.map +1 -1
  93. package/dist/src/version.js +73 -0
  94. package/dist/src/version.js.map +1 -0
  95. package/dist/src/waits.js +5 -1
  96. package/dist/src/waits.js.map +1 -1
  97. package/dist/src/workspace.js +28 -3
  98. package/dist/src/workspace.js.map +1 -1
  99. package/docs/INSTALLATION.md +50 -3
  100. package/docs/SECOND-AGENT-ACCEPTANCE.md +62 -0
  101. package/docs/architecture/agent-memory-topology.png +0 -0
  102. package/docs/architecture/agent-memory-topology.svg +132 -0
  103. package/docs/architecture/general-agent-kernel-topology.png +0 -0
  104. package/docs/architecture/general-agent-kernel-topology.svg +149 -0
  105. package/docs/architecture/provider-bound-development-workspace.png +0 -0
  106. package/docs/architecture/provider-bound-development-workspace.svg +141 -0
  107. package/docs/architecture/task-completion-gate.png +0 -0
  108. package/docs/architecture/task-completion-gate.svg +191 -0
  109. package/docs/assets/agent-delivery-lifecycle.svg +103 -0
  110. package/docs/schemas/agent-audit-load-evidence.schema.json +14 -0
  111. package/docs/schemas/agent-audit.schema.json +92 -0
  112. package/docs/schemas/agent-bindings.schema.json +54 -0
  113. package/docs/schemas/agent-definition.schema.json +78 -0
  114. package/docs/schemas/agent-enhancement-plan.schema.json +88 -0
  115. package/docs/schemas/agent-enhancement-receipt.schema.json +37 -0
  116. package/docs/schemas/agent-platform.schema.json +13 -0
  117. package/docs/schemas/enriched-invocation.schema.json +46 -0
  118. package/docs/schemas/eval-candidate-plan.schema.json +28 -0
  119. package/docs/schemas/eval-candidate-result.schema.json +20 -0
  120. package/docs/schemas/eval-candidate.schema.json +30 -0
  121. package/docs/schemas/invocation.schema.json +19 -0
  122. package/docs/schemas/memory-candidate-proposal.schema.json +18 -0
  123. package/docs/schemas/memory-candidate.schema.json +76 -0
  124. package/docs/schemas/memory-publish-target.schema.json +25 -0
  125. package/docs/schemas/multica-deployment-list.schema.json +29 -0
  126. package/docs/schemas/multica-deployment-operation.schema.json +51 -0
  127. package/docs/schemas/multica-deployment-plan.schema.json +70 -0
  128. package/docs/schemas/multica-deployment-receipt.schema.json +87 -0
  129. package/docs/schemas/multica-deployment-status.schema.json +23 -0
  130. package/docs/schemas/multica-workspace-inspection.schema.json +77 -0
  131. package/docs/schemas/multica-workspace-plan.schema.json +68 -0
  132. package/docs/schemas/multica-workspace-resource-list.schema.json +27 -0
  133. package/docs/schemas/multica-workspace-status.schema.json +34 -0
  134. package/docs/schemas/observation.schema.json +21 -0
  135. package/docs/schemas/operational-memory-provider.schema.json +36 -0
  136. package/docs/schemas/operational-memory-record.schema.json +24 -0
  137. package/docs/schemas/perception-input.schema.json +56 -0
  138. package/docs/schemas/project.schema.json +115 -0
  139. package/docs/schemas/promotion-list.schema.json +36 -0
  140. package/docs/schemas/promotion-plan.schema.json +60 -0
  141. package/docs/schemas/promotion-policy.schema.json +29 -0
  142. package/docs/schemas/promotion-receipt.schema.json +43 -0
  143. package/docs/schemas/promotion-status.schema.json +23 -0
  144. package/docs/schemas/release-readiness.schema.json +66 -0
  145. package/docs/schemas/remote-semantic-state-live-eval.schema.json +60 -0
  146. package/docs/schemas/remote-semantic-state-manifest.schema.json +79 -0
  147. package/docs/schemas/remote-semantic-state-provider.schema.json +98 -0
  148. package/docs/schemas/response-gate.schema.json +20 -0
  149. package/docs/schemas/task-checkpoint.schema.json +71 -0
  150. package/docs/schemas/task-completion-evidence.schema.json +154 -0
  151. package/docs/schemas/workspace-doctor.schema.json +56 -0
  152. package/docs/schemas/workspace-state.schema.json +39 -0
  153. package/evals/README.md +17 -0
  154. package/evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json +123 -0
  155. package/evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json +69 -0
  156. package/evals/baselines/2026-07-16/opencode-multi-surface-summary.json +63 -0
  157. package/evals/baselines/2026-07-16/remote-state-live-summary.json +70 -0
  158. package/evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json +98 -0
  159. package/evals/baselines/2026-07-17/personal-event-live-readiness-summary.json +68 -0
  160. package/examples/agents/fde-coach/AGENTS.md +26 -0
  161. package/examples/agents/fde-coach/MEMORY.md +3 -0
  162. package/examples/agents/fde-coach/fields/default/field.json +24 -0
  163. package/examples/agents/fde-coach/knowledge/INDEX.md +4 -0
  164. package/examples/agents/fde-coach/skills/fde-coach/SKILL.md +13 -0
  165. package/examples/agents/release-manager/AGENTS.md +26 -0
  166. package/examples/agents/release-manager/MEMORY.md +3 -0
  167. package/examples/agents/release-manager/fields/default/field.json +24 -0
  168. package/examples/agents/release-manager/knowledge/INDEX.md +4 -0
  169. package/examples/agents/release-manager/skills/release-manager/SKILL.md +13 -0
  170. package/lab/README.md +109 -0
  171. package/lab/agent-eval/catalog.json +91 -0
  172. package/lab/agent-eval/classic-failures.json +177 -0
  173. package/lab/agent-eval/completion-gate-regression.json +99 -0
  174. package/lab/agent-eval/personal-event-live.example.json +94 -0
  175. package/lab/agent-eval/remote-semantic-state-live.example.json +70 -0
  176. package/lab/agent-eval/remote-semantic-state-provider.fixture.json +47 -0
  177. package/lab/agent-eval/remote-state-workspace/AGENTS.md +8 -0
  178. package/lab/agent-eval/remote-state-workspace/opencode.json +7 -0
  179. package/lab/agent-eval/remote-state-workspace/skills/remote-state-operator/SKILL.md +13 -0
  180. package/lab/agent-eval/remote-state.example.json +31 -0
  181. package/lab/agent-eval/workspace/AGENTS.md +7 -0
  182. package/lab/agent-eval/workspace/MEMORY.md +4 -0
  183. package/lab/agent-eval/workspace/artifacts/pending-review.md +3 -0
  184. package/lab/agent-eval/workspace/knowledge/INDEX.md +4 -0
  185. package/lab/agent-eval/workspace/opencode.json +20 -0
  186. package/lab/manifest.example.json +27 -0
  187. package/lab/manifest.personal-event.example.json +27 -0
  188. package/lab/project-workspace/README.md +11 -0
  189. package/lab/project-workspace/fake-multica-provider.mjs +277 -0
  190. package/lab/project-workspace/multica-deploy.fixture.json +29 -0
  191. package/lab/project-workspace/multica-readonly.fixture.json +69 -0
  192. package/lab/project-workspace/observation.fixture.json +14 -0
  193. package/lab/project-workspace/opencode-provider-suite.json +65 -0
  194. package/lab/project-workspace/project.fixture.json +44 -0
  195. package/lab/project-workspace/promotion-policy.fixture.json +15 -0
  196. package/lab/robot-eval/pool.example.json +30 -0
  197. package/lab/robot-eval/suite.json +123 -0
  198. package/lab/robot-eval/workspace/AGENTS.md +21 -0
  199. package/lab/robot-eval/workspace/MEMORY.md +3 -0
  200. package/lab/robot-eval/workspace/knowledge/INDEX.md +5 -0
  201. package/lab/robot-eval/workspace/opencode.json +22 -0
  202. package/lab/schemas/agent-eval-catalog.schema.json +47 -0
  203. package/lab/schemas/lab-manifest.schema.json +70 -0
  204. package/lab/schemas/personal-event-eval.schema.json +91 -0
  205. package/lab/schemas/remote-state-eval.schema.json +66 -0
  206. package/lab/schemas/robot-eval-suite.schema.json +184 -0
  207. package/lab/schemas/robot-pool.schema.json +56 -0
  208. package/package.json +28 -9
  209. package/skills/README.md +23 -0
  210. package/skills/core/dingtalk-agent-compose/SKILL.md +151 -0
  211. package/skills/core/dingtalk-agent-compose/assets/AGENTS.template.md +35 -0
  212. package/skills/core/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +13 -0
  213. package/skills/core/dingtalk-agent-compose/assets/agent.bindings.local.template.json +13 -0
  214. package/skills/core/dingtalk-agent-compose/assets/hosts/opencode/opencode.template.json +12 -0
  215. package/skills/core/dingtalk-agent-compose/assets/role-skill.template.md +32 -0
  216. package/skills/core/dingtalk-agent-compose/evals/evals.json +129 -0
  217. package/skills/core/dingtalk-agent-compose/references/agent-definition-contract.md +55 -0
  218. package/skills/core/dingtalk-agent-compose/references/host-loading-contract.md +58 -0
  219. package/skills/core/dingtalk-agent-compose/references/hosts/claude-code.md +48 -0
  220. package/skills/core/dingtalk-agent-compose/references/hosts/opencode.md +77 -0
  221. package/skills/core/dingtalk-agent-compose/references/storage-routing.md +20 -0
  222. package/skills/core/dingtalk-agent-eval/SKILL.md +140 -0
  223. package/skills/core/dingtalk-agent-eval/assets/eval-catalog.template.json +18 -0
  224. package/skills/core/dingtalk-agent-eval/evals/evals.json +83 -0
  225. package/skills/core/dingtalk-agent-eval/references/eval-topology.md +48 -0
  226. package/skills/core/dingtalk-agent-eval/references/evidence-contract.md +52 -0
  227. package/skills/core/dingtalk-agent-eval/references/failure-to-case.md +35 -0
  228. package/skills/core/dingtalk-agent-eval/references/interactive-debug-channels.md +93 -0
  229. package/skills/core/dingtalk-agent-eval/references/local-connector-smoke.md +75 -0
  230. package/skills/core/dingtalk-agent-eval/references/scenario-taxonomy.md +25 -0
  231. package/skills/core/dingtalk-agent-eval/references/storage-modes.md +75 -0
  232. package/skills/core/dingtalk-basic-behavior/SKILL.md +87 -0
  233. package/skills/core/dingtalk-basic-behavior/assets/memory-candidate-proposal.json +10 -0
  234. package/skills/{dingtalk-basic-behavior/assets/task-checkpoint.md → core/dingtalk-basic-behavior/assets/task-checkpoint.json} +2 -21
  235. package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/action-contract.md +2 -0
  236. package/skills/core/dingtalk-basic-behavior/references/memory-and-evolution.md +53 -0
  237. package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +28 -0
  238. package/skills/core/dingtalk-basic-behavior/references/risk-authority-and-privacy.md +62 -0
  239. package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/task-lifecycle.md +47 -10
  240. package/skills/core/dingtalk-basic-behavior/references/truth-and-recovery.md +65 -0
  241. package/skills/platforms/deap/PLATFORM.md +3 -0
  242. package/skills/platforms/deap/README.md +3 -0
  243. package/skills/platforms/multica-dingtalk/PLATFORM.md +40 -0
  244. package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +40 -0
  245. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/SKILL.md +60 -0
  246. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/references/multica-deployment-contract.md +49 -0
  247. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/references/promotion-observation-contract.md +49 -0
  248. package/skills/platforms/multica-dingtalk/multica-external/SKILL.md +282 -0
  249. package/skills/platforms/multica-dingtalk/multica-external/scripts/bootstrap.sh +78 -0
  250. package/skills/platforms/multica-dingtalk/multica-external/scripts/multica_ext.py +1180 -0
  251. package/skills/dingtalk-basic-behavior/SKILL.md +0 -86
  252. package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +0 -27
  253. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/event-to-behavior.md +0 -0
  254. /package/skills/{dingtalk-basic-behavior → core/dingtalk-basic-behavior}/references/runtime-modes.md +0 -0
@@ -2,6 +2,8 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import { delimiter, join } from 'node:path';
4
4
  import { spawnSync } from 'node:child_process';
5
+ import { cleanVersion, compareVersions } from './version.js';
6
+ import { skillSuiteStatus } from './skill-manager.js';
5
7
  const PACKAGE_NAME = '@xdxer/dingtalk-agent';
6
8
  const REGISTRY = 'https://registry.npmjs.org';
7
9
  export function upgradeAgent(packageRoot, options = {}) {
@@ -12,6 +14,8 @@ export function upgradeAgent(packageRoot, options = {}) {
12
14
  const prefix = options.prefix || join(home, '.local');
13
15
  const binDir = process.platform === 'win32' ? prefix : join(prefix, 'bin');
14
16
  const executable = join(binDir, process.platform === 'win32' ? 'dta.cmd' : 'dta');
17
+ // 升级前先冻结本机 Skill 版本,否则重装之后无从核对到底动了什么。
18
+ const skillsBefore = skillSuiteStatus(packageRoot, { home }).skills;
15
19
  if (options.channel && options.version) {
16
20
  throw new Error('upgrade 的 --channel 与 --version 不能同时使用');
17
21
  }
@@ -37,6 +41,14 @@ export function upgradeAgent(packageRoot, options = {}) {
37
41
  $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,
38
42
  target: packageSource, prefix, executable, changed, dryRun: true,
39
43
  ready: false, setup: null,
44
+ skills: skillsBefore.map((item) => ({
45
+ name: item.name,
46
+ before: item.canonical.installedVersion,
47
+ after: null,
48
+ bundled: item.bundled.skillVersion,
49
+ state: item.canonical.state,
50
+ changed: item.canonical.state !== 'current',
51
+ })),
40
52
  commands: { install: installCommand, verify: verifyCommand },
41
53
  };
42
54
  }
@@ -82,6 +94,17 @@ export function upgradeAgent(packageRoot, options = {}) {
82
94
  target: packageSource, prefix, executable, changed, dryRun: false,
83
95
  ready: setupRun.status === 0 && setup.doctor?.ready === true,
84
96
  setup,
97
+ skills: skillsBefore.map((item) => {
98
+ const after = (setup?.skills || []).find((entry) => entry?.name === item.name);
99
+ return {
100
+ name: item.name,
101
+ before: item.canonical.installedVersion,
102
+ after: after?.canonical?.installedVersion ?? null,
103
+ bundled: after?.bundled?.skillVersion ?? item.bundled.skillVersion,
104
+ state: after?.canonical?.state ?? 'unknown',
105
+ changed: (after?.canonical?.installedVersion ?? '') !== item.canonical.installedVersion,
106
+ };
107
+ }),
85
108
  commands: { install: installCommand, verify: verifyCommand },
86
109
  };
87
110
  }
@@ -104,33 +127,6 @@ function resolveTargetVersion(packageSource, env) {
104
127
  return output.replace(/^['"]|['"]$/g, '');
105
128
  throw new Error(`npm view 没有返回 ${packageSource} 的版本`);
106
129
  }
107
- function cleanVersion(value = '') {
108
- const clean = value.trim().replace(/^v/, '');
109
- if (!clean)
110
- return '';
111
- if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(clean)) {
112
- throw new Error(`非法版本号: ${value}`);
113
- }
114
- return clean;
115
- }
116
- function compareVersions(a, b) {
117
- const parse = (value) => {
118
- const [core, prerelease = ''] = value.replace(/^v/, '').split('-', 2);
119
- return { core: core.split('.').map((part) => Number.parseInt(part, 10) || 0), prerelease };
120
- };
121
- const left = parse(a);
122
- const right = parse(b);
123
- for (let index = 0; index < 3; index += 1) {
124
- if ((left.core[index] || 0) !== (right.core[index] || 0)) {
125
- return (left.core[index] || 0) > (right.core[index] || 0) ? 1 : -1;
126
- }
127
- }
128
- if (!left.prerelease && right.prerelease)
129
- return 1;
130
- if (left.prerelease && !right.prerelease)
131
- return -1;
132
- return left.prerelease.localeCompare(right.prerelease, undefined, { numeric: true });
133
- }
134
130
  function shellQuote(value) {
135
131
  return /^[A-Za-z0-9_./:=@"$-]+$/.test(value) ? value : `'${value.replace(/'/g, `'"'"'`)}'`;
136
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, join } from 'node:path'\nimport { spawnSync } from 'node:child_process'\n\nconst PACKAGE_NAME = '@xdxer/dingtalk-agent'\nconst REGISTRY = 'https://registry.npmjs.org'\n\nexport interface UpgradeOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n prefix?: string\n channel?: 'beta' | 'latest'\n version?: string\n dryRun?: boolean\n force?: boolean\n}\n\nexport interface UpgradeResult {\n $schema: 'dingtalk-agent/upgrade@1'\n currentVersion: string\n targetVersion: string\n target: string\n prefix: string\n executable: string\n changed: boolean\n dryRun: boolean\n ready: boolean\n setup: Record<string, any> | null\n commands: { install: string; verify: string }\n}\n\nexport function upgradeAgent(packageRoot: string, options: UpgradeOptions = {}): UpgradeResult {\n const home = options.home || homedir()\n const env = { ...process.env, ...(options.env || {}) }\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const currentVersion = String(pkg.version || '')\n const prefix = options.prefix || join(home, '.local')\n const binDir = process.platform === 'win32' ? prefix : join(prefix, 'bin')\n const executable = join(binDir, process.platform === 'win32' ? 'dta.cmd' : 'dta')\n\n if (options.channel && options.version) {\n throw new Error('upgrade 的 --channel 与 --version 不能同时使用')\n }\n const channel = options.channel || (currentVersion.includes('-') ? 'beta' : 'latest')\n if (!['beta', 'latest'].includes(channel)) {\n throw new Error(`不支持的升级通道: ${channel};只能是 beta 或 latest`)\n }\n const requested = cleanVersion(options.version) || channel\n const packageSource = env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${requested}`\n const targetVersion = env.DTA_UPGRADE_TARGET_VERSION || resolveTargetVersion(packageSource, env)\n if (compareVersions(targetVersion, currentVersion) < 0 && !(options.version && options.force)) {\n throw new Error(\n `升级目标 ${targetVersion} 低于当前版本 ${currentVersion},拒绝自动降级;` +\n '如确需降级,请同时使用 --version 与 --force',\n )\n }\n const installArgs = [\n 'install', '--global', '--prefix', prefix, '--registry', REGISTRY, packageSource,\n ]\n const installCommand = ['npm', ...installArgs].map(shellQuote).join(' ')\n const verifyCommand = `${shellQuote(executable)} setup --skip-cli-install`\n const changed = options.force || targetVersion !== currentVersion\n\n if (options.dryRun) {\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: true,\n ready: false, setup: null,\n commands: { install: installCommand, verify: verifyCommand },\n }\n }\n\n if (changed) {\n const install = spawnSync('npm', installArgs, { encoding: 'utf8', env, timeout: 120_000 })\n const output = [install.stdout, install.stderr].filter(Boolean).join('\\n').trim()\n if (install.error || install.status !== 0) {\n throw new Error(\n `CLI 升级失败: ${install.error?.message || output || `退出码 ${install.status}`}\\n` +\n `可手动执行: ${installCommand}`,\n )\n }\n }\n if (!existsSync(executable)) {\n throw new Error(`npm 升级完成但找不到新 CLI: ${executable}\\n可手动执行: ${installCommand}`)\n }\n const effectiveEnv = {\n ...env,\n HOME: home,\n PATH: [binDir, env.PATH || ''].filter(Boolean).join(delimiter),\n }\n const versionRun = spawnSync(executable, ['--version'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 8_000,\n })\n const installedVersion = String(versionRun.stdout || '').trim()\n if (versionRun.status !== 0 || installedVersion !== targetVersion) {\n throw new Error(\n `新 CLI 版本校验失败: expected=${targetVersion}, actual=${installedVersion || 'unknown'}\\n` +\n `可重试: ${installCommand}`,\n )\n }\n const setupRun = spawnSync(executable, ['setup', '--skip-cli-install', '--json'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 180_000,\n })\n let setup: Record<string, any> | null = null\n try { setup = setupRun.stdout ? JSON.parse(setupRun.stdout) : null } catch { /* reported below */ }\n if (!setup) {\n throw new Error(\n `CLI 已升级到 ${installedVersion},但 setup 输出无法解析: ` +\n `${String(setupRun.stderr || setupRun.stdout).trim() || `退出码 ${setupRun.status}`}\\n` +\n `可手动执行: ${verifyCommand}`,\n )\n }\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: false,\n ready: setupRun.status === 0 && setup.doctor?.ready === true,\n setup,\n commands: { install: installCommand, verify: verifyCommand },\n }\n}\n\nfunction resolveTargetVersion(packageSource: string, env: NodeJS.ProcessEnv): string {\n const run = spawnSync('npm', ['view', packageSource, 'version', '--json', '--registry', REGISTRY], {\n encoding: 'utf8', env, timeout: 30_000,\n })\n const output = String(run.stdout || '').trim()\n if (run.error || run.status !== 0) {\n throw new Error(\n `无法解析升级目标 ${packageSource}: ` +\n `${run.error?.message || String(run.stderr || '').trim() || `退出码 ${run.status}`}`,\n )\n }\n try {\n const value = JSON.parse(output)\n if (typeof value === 'string' && value) return value\n } catch { /* fall through */ }\n if (output) return output.replace(/^['\"]|['\"]$/g, '')\n throw new Error(`npm view 没有返回 ${packageSource} 的版本`)\n}\n\nfunction cleanVersion(value = ''): string {\n const clean = value.trim().replace(/^v/, '')\n if (!clean) return ''\n if (!/^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/.test(clean)) {\n throw new Error(`非法版本号: ${value}`)\n }\n return clean\n}\n\nfunction compareVersions(a: string, b: string): number {\n const parse = (value: string) => {\n const [core, prerelease = ''] = value.replace(/^v/, '').split('-', 2)\n return { core: core.split('.').map((part) => Number.parseInt(part, 10) || 0), prerelease }\n }\n const left = parse(a)\n const right = parse(b)\n for (let index = 0; index < 3; index += 1) {\n if ((left.core[index] || 0) !== (right.core[index] || 0)) {\n return (left.core[index] || 0) > (right.core[index] || 0) ? 1 : -1\n }\n }\n if (!left.prerelease && right.prerelease) return 1\n if (left.prerelease && !right.prerelease) return -1\n return left.prerelease.localeCompare(right.prerelease, undefined, { numeric: true })\n}\n\nfunction shellQuote(value: string): string {\n return /^[A-Za-z0-9_./:=@\"$-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n"]}
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, join } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { cleanVersion, compareVersions } from './version.js'\nimport { skillSuiteStatus } from './skill-manager.js'\n\nconst PACKAGE_NAME = '@xdxer/dingtalk-agent'\nconst REGISTRY = 'https://registry.npmjs.org'\n\nexport interface UpgradeOptions {\n home?: string\n env?: NodeJS.ProcessEnv\n prefix?: string\n channel?: 'beta' | 'latest'\n version?: string\n dryRun?: boolean\n force?: boolean\n}\n\nexport interface UpgradeResult {\n $schema: 'dingtalk-agent/upgrade@1'\n currentVersion: string\n targetVersion: string\n target: string\n prefix: string\n executable: string\n changed: boolean\n dryRun: boolean\n ready: boolean\n setup: Record<string, any> | null\n skills: UpgradeSkillReport[]\n commands: { install: string; verify: string }\n}\n\n/** 升级前后各 Skill 的版本核对;`after` 为 null 表示 dry-run 尚未执行。 */\nexport interface UpgradeSkillReport {\n name: string\n before: string\n after: string | null\n bundled: string\n state: string\n changed: boolean\n}\n\nexport function upgradeAgent(packageRoot: string, options: UpgradeOptions = {}): UpgradeResult {\n const home = options.home || homedir()\n const env = { ...process.env, ...(options.env || {}) }\n const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'))\n const currentVersion = String(pkg.version || '')\n const prefix = options.prefix || join(home, '.local')\n const binDir = process.platform === 'win32' ? prefix : join(prefix, 'bin')\n const executable = join(binDir, process.platform === 'win32' ? 'dta.cmd' : 'dta')\n // 升级前先冻结本机 Skill 版本,否则重装之后无从核对到底动了什么。\n const skillsBefore = skillSuiteStatus(packageRoot, { home }).skills\n\n if (options.channel && options.version) {\n throw new Error('upgrade 的 --channel 与 --version 不能同时使用')\n }\n const channel = options.channel || (currentVersion.includes('-') ? 'beta' : 'latest')\n if (!['beta', 'latest'].includes(channel)) {\n throw new Error(`不支持的升级通道: ${channel};只能是 beta 或 latest`)\n }\n const requested = cleanVersion(options.version) || channel\n const packageSource = env.DTA_UPGRADE_PACKAGE_SOURCE || `${PACKAGE_NAME}@${requested}`\n const targetVersion = env.DTA_UPGRADE_TARGET_VERSION || resolveTargetVersion(packageSource, env)\n if (compareVersions(targetVersion, currentVersion) < 0 && !(options.version && options.force)) {\n throw new Error(\n `升级目标 ${targetVersion} 低于当前版本 ${currentVersion},拒绝自动降级;` +\n '如确需降级,请同时使用 --version 与 --force',\n )\n }\n const installArgs = [\n 'install', '--global', '--prefix', prefix, '--registry', REGISTRY, packageSource,\n ]\n const installCommand = ['npm', ...installArgs].map(shellQuote).join(' ')\n const verifyCommand = `${shellQuote(executable)} setup --skip-cli-install`\n const changed = options.force || targetVersion !== currentVersion\n\n if (options.dryRun) {\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: true,\n ready: false, setup: null,\n skills: skillsBefore.map((item) => ({\n name: item.name,\n before: item.canonical.installedVersion,\n after: null,\n bundled: item.bundled.skillVersion,\n state: item.canonical.state,\n changed: item.canonical.state !== 'current',\n })),\n commands: { install: installCommand, verify: verifyCommand },\n }\n }\n\n if (changed) {\n const install = spawnSync('npm', installArgs, { encoding: 'utf8', env, timeout: 120_000 })\n const output = [install.stdout, install.stderr].filter(Boolean).join('\\n').trim()\n if (install.error || install.status !== 0) {\n throw new Error(\n `CLI 升级失败: ${install.error?.message || output || `退出码 ${install.status}`}\\n` +\n `可手动执行: ${installCommand}`,\n )\n }\n }\n if (!existsSync(executable)) {\n throw new Error(`npm 升级完成但找不到新 CLI: ${executable}\\n可手动执行: ${installCommand}`)\n }\n const effectiveEnv = {\n ...env,\n HOME: home,\n PATH: [binDir, env.PATH || ''].filter(Boolean).join(delimiter),\n }\n const versionRun = spawnSync(executable, ['--version'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 8_000,\n })\n const installedVersion = String(versionRun.stdout || '').trim()\n if (versionRun.status !== 0 || installedVersion !== targetVersion) {\n throw new Error(\n `新 CLI 版本校验失败: expected=${targetVersion}, actual=${installedVersion || 'unknown'}\\n` +\n `可重试: ${installCommand}`,\n )\n }\n const setupRun = spawnSync(executable, ['setup', '--skip-cli-install', '--json'], {\n encoding: 'utf8', env: effectiveEnv, timeout: 180_000,\n })\n let setup: Record<string, any> | null = null\n try { setup = setupRun.stdout ? JSON.parse(setupRun.stdout) : null } catch { /* reported below */ }\n if (!setup) {\n throw new Error(\n `CLI 已升级到 ${installedVersion},但 setup 输出无法解析: ` +\n `${String(setupRun.stderr || setupRun.stdout).trim() || `退出码 ${setupRun.status}`}\\n` +\n `可手动执行: ${verifyCommand}`,\n )\n }\n return {\n $schema: 'dingtalk-agent/upgrade@1', currentVersion, targetVersion,\n target: packageSource, prefix, executable, changed, dryRun: false,\n ready: setupRun.status === 0 && setup.doctor?.ready === true,\n setup,\n skills: skillsBefore.map((item) => {\n const after = (setup?.skills || []).find((entry: any) => entry?.name === item.name)\n return {\n name: item.name,\n before: item.canonical.installedVersion,\n after: after?.canonical?.installedVersion ?? null,\n bundled: after?.bundled?.skillVersion ?? item.bundled.skillVersion,\n state: after?.canonical?.state ?? 'unknown',\n changed: (after?.canonical?.installedVersion ?? '') !== item.canonical.installedVersion,\n }\n }),\n commands: { install: installCommand, verify: verifyCommand },\n }\n}\n\nfunction resolveTargetVersion(packageSource: string, env: NodeJS.ProcessEnv): string {\n const run = spawnSync('npm', ['view', packageSource, 'version', '--json', '--registry', REGISTRY], {\n encoding: 'utf8', env, timeout: 30_000,\n })\n const output = String(run.stdout || '').trim()\n if (run.error || run.status !== 0) {\n throw new Error(\n `无法解析升级目标 ${packageSource}: ` +\n `${run.error?.message || String(run.stderr || '').trim() || `退出码 ${run.status}`}`,\n )\n }\n try {\n const value = JSON.parse(output)\n if (typeof value === 'string' && value) return value\n } catch { /* fall through */ }\n if (output) return output.replace(/^['\"]|['\"]$/g, '')\n throw new Error(`npm view 没有返回 ${packageSource} 的版本`)\n}\n\nfunction shellQuote(value: string): string {\n return /^[A-Za-z0-9_./:=@\"$-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n"]}
@@ -0,0 +1,73 @@
1
+ // 版本号解析与比较。npm 包版本与 Skill frontmatter 版本共用同一实现,避免两套排序规则。
2
+ // 比较结果只用于报告与门禁,不用于跳过执行:安装/升级始终由上游 skills CLI 无条件覆盖。
3
+ /** 归一化版本号;空串表示"未声明",非法格式直接抛错。 */
4
+ export function cleanVersion(value = '') {
5
+ const clean = value.trim().replace(/^v/, '');
6
+ if (!clean)
7
+ return '';
8
+ if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(clean)) {
9
+ throw new Error(`非法版本号: ${value}`);
10
+ }
11
+ return clean;
12
+ }
13
+ /** 版本号是否合法且非空。用于把"用户手改坏了"与"格式正确"分开处理。 */
14
+ export function isValidVersion(value = '') {
15
+ try {
16
+ return Boolean(cleanVersion(value));
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ /**
23
+ * semver 比较:core 三段按数值,prerelease 按 dot-identifier 逐段。
24
+ * 数字段按数值比较,数字段低于非数字段,段数少者在前缀相同时更小(semver §11)。
25
+ */
26
+ export function compareVersions(a, b) {
27
+ const parse = (value) => {
28
+ const [core, prerelease = ''] = value.replace(/^v/, '').split('-', 2);
29
+ return { core: core.split('.').map((part) => Number.parseInt(part, 10) || 0), prerelease };
30
+ };
31
+ const left = parse(a);
32
+ const right = parse(b);
33
+ for (let index = 0; index < 3; index += 1) {
34
+ if ((left.core[index] || 0) !== (right.core[index] || 0)) {
35
+ return (left.core[index] || 0) > (right.core[index] || 0) ? 1 : -1;
36
+ }
37
+ }
38
+ // 有 prerelease 者小于无 prerelease 者。
39
+ if (!left.prerelease && right.prerelease)
40
+ return 1;
41
+ if (left.prerelease && !right.prerelease)
42
+ return -1;
43
+ if (!left.prerelease && !right.prerelease)
44
+ return 0;
45
+ return comparePrerelease(left.prerelease, right.prerelease);
46
+ }
47
+ function comparePrerelease(a, b) {
48
+ const left = a.split('.');
49
+ const right = b.split('.');
50
+ for (let index = 0; index < Math.max(left.length, right.length); index += 1) {
51
+ const l = left[index];
52
+ const r = right[index];
53
+ if (l === undefined)
54
+ return -1;
55
+ if (r === undefined)
56
+ return 1;
57
+ const lNumeric = /^\d+$/.test(l);
58
+ const rNumeric = /^\d+$/.test(r);
59
+ if (lNumeric && rNumeric) {
60
+ const diff = Number.parseInt(l, 10) - Number.parseInt(r, 10);
61
+ if (diff !== 0)
62
+ return diff > 0 ? 1 : -1;
63
+ continue;
64
+ }
65
+ // 数字段永远低于非数字段。
66
+ if (lNumeric !== rNumeric)
67
+ return lNumeric ? -1 : 1;
68
+ if (l !== r)
69
+ return l > r ? 1 : -1;
70
+ }
71
+ return 0;
72
+ }
73
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"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","sourcesContent":["// 版本号解析与比较。npm 包版本与 Skill frontmatter 版本共用同一实现,避免两套排序规则。\n// 比较结果只用于报告与门禁,不用于跳过执行:安装/升级始终由上游 skills CLI 无条件覆盖。\n\n/** 归一化版本号;空串表示\"未声明\",非法格式直接抛错。 */\nexport function cleanVersion(value = ''): string {\n const clean = value.trim().replace(/^v/, '')\n if (!clean) return ''\n if (!/^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/.test(clean)) {\n throw new Error(`非法版本号: ${value}`)\n }\n return clean\n}\n\n/** 版本号是否合法且非空。用于把\"用户手改坏了\"与\"格式正确\"分开处理。 */\nexport function isValidVersion(value = ''): boolean {\n try { return Boolean(cleanVersion(value)) } catch { return false }\n}\n\n/**\n * semver 比较:core 三段按数值,prerelease 按 dot-identifier 逐段。\n * 数字段按数值比较,数字段低于非数字段,段数少者在前缀相同时更小(semver §11)。\n */\nexport function compareVersions(a: string, b: string): number {\n const parse = (value: string) => {\n const [core, prerelease = ''] = value.replace(/^v/, '').split('-', 2)\n return { core: core.split('.').map((part) => Number.parseInt(part, 10) || 0), prerelease }\n }\n const left = parse(a)\n const right = parse(b)\n for (let index = 0; index < 3; index += 1) {\n if ((left.core[index] || 0) !== (right.core[index] || 0)) {\n return (left.core[index] || 0) > (right.core[index] || 0) ? 1 : -1\n }\n }\n // 有 prerelease 者小于无 prerelease 者。\n if (!left.prerelease && right.prerelease) return 1\n if (left.prerelease && !right.prerelease) return -1\n if (!left.prerelease && !right.prerelease) return 0\n return comparePrerelease(left.prerelease, right.prerelease)\n}\n\nfunction comparePrerelease(a: string, b: string): number {\n const left = a.split('.')\n const right = b.split('.')\n for (let index = 0; index < Math.max(left.length, right.length); index += 1) {\n const l = left[index]\n const r = right[index]\n if (l === undefined) return -1\n if (r === undefined) return 1\n const lNumeric = /^\\d+$/.test(l)\n const rNumeric = /^\\d+$/.test(r)\n if (lNumeric && rNumeric) {\n const diff = Number.parseInt(l, 10) - Number.parseInt(r, 10)\n if (diff !== 0) return diff > 0 ? 1 : -1\n continue\n }\n // 数字段永远低于非数字段。\n if (lNumeric !== rNumeric) return lNumeric ? -1 : 1\n if (l !== r) return l > r ? 1 : -1\n }\n return 0\n}\n"]}
package/dist/src/waits.js CHANGED
@@ -387,7 +387,11 @@ export function readWaitForEvent(root, cfg, fieldId, event) {
387
387
  return existsSync(path) ? readJson(path) : null;
388
388
  }
389
389
  export function isCancelCommand(text) {
390
- return /^\/(?:stop|cancel|停止|取消)$/i.test(String(text || '').trim());
390
+ // Live canary 的合成入站必须保留唯一 marker;marker 只是证据,不应阻断
391
+ // 随后的显式取消命令。生产消息不带 marker 时仍保持原有严格匹配。
392
+ const value = String(text || '').trim()
393
+ .replace(/^\[DTA-LAB-[^\]\n]+\]\s*/u, '');
394
+ return /^\/(?:stop|cancel|停止|取消)$/i.test(value);
391
395
  }
392
396
  /** eventId 一旦绑定 Wait,重放永远解析原 Wait,不能重新扫描当前 scope head。 */
393
397
  function createEventBinding(rootPath, event, operation, wait) {
@@ -1 +1 @@
1
- {"version":3,"file":"waits.js","sourceRoot":"","sources":["../../src/waits.ts"],"names":[],"mappings":"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","sourcesContent":["// 单链 Durable Wait(TypeScript source)。\n//\n// v1 只解决一件事:ask 之后,下一条来自同一 Field/tenant/conversation/actor\n// 的 DM 或直接 @,恢复原 Session 并创建新 Run。这里不实现通用 workflow/stack。\n\nimport {\n existsSync, linkSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync,\n writeFileSync,\n} from 'node:fs'\nimport { dirname, resolve, join } from 'node:path'\nimport { hostname } from 'node:os'\nimport { randomUUID } from 'node:crypto'\nimport { digest, stableStringify } from './events.js'\n\nconst OPEN_CHAIN = new Set([\n 'arming', 'active', 'uncertain', 'claimed', 'cancel-pending',\n])\nconst RESUMABLE = new Set(['active', 'uncertain'])\nconst DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000\n\nexport function armWait(root, cfg, input) {\n const scope = scopeFromTarget(input.fieldId, input.event, input.target)\n if (!scope) {\n throw new Error('ask 无法建立 Wait:必须有 tenant、conversation、actor,且事件是 DM 或直接 @')\n }\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const waitId = `wait_${digest(`${input.sessionId}\\0${input.actionId}`).slice(0, 20)}`\n const history = join(rootPath, 'history', `${waitId}.json`)\n mkdirSync(rootPath, { recursive: true })\n // 旧 ask 的 Receipt 可能在同一 scope 已进入下一轮 Wait 后重放;历史记录存在时\n // 只返回原 Wait,不能用旧 Receipt 覆盖当前正在等待的新问题。\n if (existsSync(history)) {\n const recorded = readJson(history)\n assertScope(recorded, scope, scopeHash)\n if (recorded.id === waitId && recorded.actionId === input.actionId &&\n recorded.sessionId === input.sessionId) return recorded\n }\n return withLock(path, () => {\n let existing = existsSync(path) ? readJson(path) : null\n if (existing) {\n assertScope(existing, scope, scopeHash)\n existing = repairFromReceipt(root, cfg, path, existing)\n }\n if (existing?.id === waitId && existing.actionId === input.actionId) return existing\n const ownedClaim = existing?.status === 'claimed' &&\n existing.sessionId === input.sessionId &&\n existing.claim?.runId === input.sourceRunId\n if (existing && OPEN_CHAIN.has(existing.status) && !expired(existing) &&\n !ownedClaim) {\n throw new Error(\n `同一人员/会话已有未完成 Wait ${existing.id}(Session ${existing.sessionId});` +\n '单链 v1 拒绝并行追问')\n }\n if (ownedClaim) {\n persistHistory(path, {\n ...existing, status: 'continued', continuedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n }\n const now = new Date().toISOString()\n const ttl = positiveNumber(cfg.runtime?.waitTtlMs, DEFAULT_TTL_MS)\n const record = {\n $schema: 'dingtalk-agent/wait@1',\n id: waitId,\n scopeHash,\n scope,\n fieldId: input.fieldId,\n sessionId: input.sessionId,\n sessionPath: resolve(input.sessionPath),\n sourceRunId: input.sourceRunId,\n actionId: input.actionId,\n questionText: String(input.questionText || ''),\n status: 'arming',\n version: Number(existing?.version || 0) + 1,\n createdAt: now,\n updatedAt: now,\n expiresAt: new Date(Date.now() + ttl).toISOString(),\n delivery: null,\n claim: null,\n }\n persistWait(path, record)\n return record\n })\n}\n\n/** Receipt 是真值;重放 Receipt 也能幂等补齐 active/uncertain Wait。 */\nexport function reconcileWaitFromReceipt(root, cfg, wait, receipt) {\n if (!wait) return null\n if (wait.actionId !== receipt.actionId) {\n throw new Error(`Wait/Receipt actionId 不一致: ${wait.actionId}/${receipt.actionId}`)\n }\n if (wait.lastAppliedReceiptActionId === receipt.actionId) return wait\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id && current.actionId === receipt.actionId) {\n if (current.lastAppliedReceiptActionId === receipt.actionId) return current\n const next = applyReceipt(current, receipt)\n persistWait(path, next)\n return next\n }\n // 该链可能已经进入下一轮 Wait;旧 Receipt 只补自己的历史,不得覆盖 scope head。\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) {\n throw new Error(`Wait/Receipt 身份冲突: wait=${current.id}, action=${receipt.actionId}`)\n }\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== receipt.actionId) {\n throw new Error(`Wait 历史与 Receipt 身份冲突: wait=${wait.id}, action=${receipt.actionId}`)\n }\n if (recorded.lastAppliedReceiptActionId === receipt.actionId) return recorded\n const next = applyReceipt(recorded, receipt)\n persistHistory(path, next)\n return next\n })\n}\n\n/** DWS 已返回可查询结果后立即开放 Wait;平台回读可以随后完成。 */\nexport function markWaitTransportAccepted(root, cfg, wait, result) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id) {\n const next = applyTransportResult(current, result)\n persistWait(path, next)\n return next\n }\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) throw new Error(`Wait 已被其他链替换: ${wait.id}`)\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== wait.actionId) {\n throw new Error(`Wait 历史与 transport-result 身份冲突: ${wait.id}`)\n }\n const next = applyTransportResult(recorded, result)\n persistHistory(path, next)\n return next\n })\n}\n\n/** resumed Run 给出最终 reply/silence 后,释放单链 scope。 */\nexport function completeWaitFromReceipt(root, cfg, resume, receipt) {\n if (resume?.mode !== 'resume' || !resume.waitId) return null\n const rootPath = waitRoot(root, cfg)\n const historyPath = join(rootPath, 'history', `${resume.waitId}.json`)\n let recorded = existsSync(historyPath) ? readJson(historyPath) : null\n let scopeHash = recorded?.scopeHash || resume.waitScopeHash || ''\n if (!scopeHash && existsSync(rootPath)) {\n const matches = readdirSync(rootPath)\n .filter((name) => name.endsWith('.json'))\n .map((name) => readJson(join(rootPath, name)))\n .filter((candidate) => candidate.id === resume.waitId)\n if (matches.length === 1) {\n recorded = matches[0]\n scopeHash = recorded.scopeHash\n }\n }\n if (!scopeHash) throw new Error(`Wait 历史丢失且无法从 scope head 修复: ${resume.waitId}`)\n const path = join(rootPath, `${scopeHash}.json`)\n return withLock(path, () => {\n if (!recorded) {\n const current = existsSync(path) ? readJson(path) : null\n if (!current || current.id !== resume.waitId) {\n throw new Error(`Wait 历史丢失且 scope head 不匹配: ${resume.waitId}`)\n }\n recorded = current\n persistHistory(path, recorded)\n }\n const now = new Date().toISOString()\n const current = existsSync(path) ? readJson(path) : null\n if (current?.id === recorded.id) {\n if (current.status === 'cancelled') {\n persistHistory(path, current)\n return current\n }\n const next = {\n ...current,\n status: current.status === 'cancel-pending' ? 'cancel-pending' : 'completed',\n updatedAt: now, completedAt: now,\n completedByReceiptActionId: receipt.actionId,\n }\n persistWait(path, next)\n return next\n }\n const next = {\n ...recorded, status: recorded.status === 'cancelled' ? 'cancelled' : 'completed',\n updatedAt: now, completedAt: now, completedByReceiptActionId: receipt.actionId,\n }\n persistHistory(path, next)\n return next\n })\n}\n\n/**\n * 显式 /stop、/cancel 是宿主控制面:不依赖当前 Field/Behavior/Skill。\n * 先写 cancel-pending,再在线性化锁内提升 Session generation,最后写 cancelled。\n */\nexport function cancelWaitForEvent(root, cfg, event) {\n if (!isCancelCommand(event.message?.text)) return null\n const eventScope = scopeWithoutField(event)\n if (!eventScope) return null\n const rootPath = waitRoot(root, cfg)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'cancel', eventScope)\n if (replay.outcome === 'no-match') return null\n if (replay.outcome === 'ambiguous') {\n throw new Error(`取消命中多个 Wait,已固化为 ambiguous: ${(replay.candidates || []).join(', ')}`)\n }\n return cancelBoundWait(root, cfg, event, replay)\n }\n if (!existsSync(rootPath)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const candidates: Array<{ path: string; record: Record<string, any> }> = []\n for (const name of readdirSync(rootPath)) {\n if (!name.endsWith('.json')) continue\n const path = join(rootPath, name)\n const record = readJson(path)\n const sameCancel = record.claim?.eventId === event.id &&\n record.claim?.cancelRequested === true\n if (sameEventScope(record.scope, eventScope) &&\n (OPEN_CHAIN.has(record.status) || sameCancel ||\n (record.status === 'cancelled' && record.claim?.eventId === event.id))) {\n candidates.push({ path, record })\n }\n }\n if (candidates.length > 1) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope, {\n outcome: 'ambiguous', candidates: candidates.map((x) => x.record.id).sort(),\n })\n throw new Error(`取消命中多个 Wait,拒绝猜测: ${candidates.map((x) => x.record.id).join(', ')}`)\n }\n if (!candidates.length) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const { path } = candidates[0]\n const bound = withLock(path, () => {\n let current = readJson(path)\n if (!sameEventScope(current.scope, eventScope)) {\n throw new Error(`取消 Wait 作用域漂移: ${current.id}`)\n }\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) {\n return createEventBinding(rootPath, event, 'cancel', current)\n }\n if (!OPEN_CHAIN.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n // 先把 head 置为 pending,再写 ledger。两者之间即使 SIGKILL,重放也会从\n // pending 的 eventId 恢复;Action 无法趁 binding→effect-lock 窗口建立 W2。\n const now = new Date().toISOString()\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n ensureClaimBinding(rootPath, current)\n const pending = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistWait(path, pending)\n const binding = createEventBinding(rootPath, event, 'cancel', pending)\n return binding\n })\n return bound ? cancelBoundWait(root, cfg, event, bound) : null\n}\n\n/** Action 与 cancel 共用这一把锁;先拿到锁的一方定义副作用先后。 */\nexport function acquireSessionEffectLock(root, sessionPath) {\n const dir = resolve(root, '.dingtalk-agent/session-effect-locks')\n mkdirSync(dir, { recursive: true })\n return acquireLock(\n join(dir, `${digest(resolve(sessionPath))}.lock`), 30 * 60_000, 3 * 60_000)\n}\n\n/**\n * incoming Event 在创建新 Session 前调用。显式 sessionKey/correlation 由调用方优先处理。\n * claimed/cancelled + 同 eventId 可重入,覆盖 materialize 过程中崩溃后的恢复窗口。\n */\nexport function claimWait(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'claim', scope)\n if (replay.outcome === 'no-match') return null\n return claimBoundWait(root, cfg, event, replay)\n }\n return withLock(path, () => {\n if (!existsSync(path)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n let current = readJson(path)\n assertScope(current, scope, scopeHash)\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id &&\n current.claim?.cancelRequested !== true) {\n createEventBinding(rootPath, event, 'claim', current)\n return current\n }\n if (expired(current)) {\n ensureClaimBinding(rootPath, current)\n if (OPEN_CHAIN.has(current.status)) {\n const next = { ...current, status: 'expired', updatedAt: new Date().toISOString() }\n persistWait(path, next)\n }\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n if (!RESUMABLE.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id,\n eventKind: event.kind,\n claimedAt: now,\n runId: '',\n cancelRequested: false,\n },\n }\n persistWait(path, next)\n createEventBinding(rootPath, event, 'claim', next)\n return next\n })\n}\n\nexport function attachClaimedRun(root, cfg, wait, eventId, runId) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, wait.id)\n if (!loaded || loaded.record.claim?.eventId !== eventId) {\n throw new Error(`Wait claim 身份冲突: wait=${wait.id}, event=${eventId}`)\n }\n const current = loaded.record\n if (current.claim.runId && current.claim.runId !== runId) {\n throw new Error(`Wait ${wait.id} 已绑定其他 Run: ${current.claim.runId}`)\n }\n if (current.claim.runId === runId) {\n // head 已写而 history 未写时,幂等重试必须顺手补齐历史真值。\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = {\n ...current,\n updatedAt: new Date().toISOString(),\n claim: { ...current.claim, runId },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n}\n\nexport function waitRoot(root, cfg) {\n return resolve(root, cfg.runtime?.waitRoot || '.dingtalk-agent/waits')\n}\n\nexport function readWaitForEvent(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const path = join(waitRoot(root, cfg), `${digest(stableStringify(scope))}.json`)\n return existsSync(path) ? readJson(path) : null\n}\n\nexport function isCancelCommand(text) {\n return /^\\/(?:stop|cancel|停止|取消)$/i.test(String(text || '').trim())\n}\n\n/** eventId 一旦绑定 Wait,重放永远解析原 Wait,不能重新扫描当前 scope head。 */\nfunction createEventBinding(rootPath, event, operation, wait) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: 'matched',\n waitId: wait.id,\n scopeHash: wait.scopeHash,\n scope: wait.scope,\n fieldId: wait.fieldId,\n sessionId: wait.sessionId,\n sessionPath: wait.sessionPath,\n sourceRunId: wait.sourceRunId,\n actionId: wait.actionId,\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 已绑定其他 Wait,拒绝 ABA 重解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction createNoMatchBinding(\n rootPath,\n event,\n operation,\n scope,\n options: Record<string, any> = {},\n) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: options.outcome || 'no-match',\n candidates: options.candidates || [],\n waitId: '',\n scopeHash: digest(stableStringify(scope)),\n scope,\n fieldId: '',\n sessionId: '',\n sessionPath: '',\n sourceRunId: '',\n actionId: '',\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 的 Wait 路由决策已固化,拒绝重新解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction readEventBinding(rootPath, eventId) {\n const path = eventBindingPath(rootPath, eventId)\n return existsSync(path) ? readJson(path) : null\n}\n\nfunction eventBindingPath(rootPath, eventId) {\n return join(rootPath, 'events', `${digest(eventId)}.json`)\n}\n\nfunction bindingIdentity(value) {\n return {\n eventId: value.eventId,\n eventKind: value.eventKind,\n operation: value.operation,\n outcome: value.outcome,\n candidates: value.candidates || [],\n waitId: value.waitId,\n scopeHash: value.scopeHash,\n scope: value.scope,\n fieldId: value.fieldId,\n sessionId: value.sessionId,\n sessionPath: value.sessionPath,\n sourceRunId: value.sourceRunId,\n actionId: value.actionId,\n }\n}\n\nfunction assertEventBinding(binding, event, operation, expectedScope) {\n if (binding.eventId !== event.id || binding.eventKind !== event.kind ||\n binding.operation !== operation) {\n throw new Error(`Event ${event.id} 的 Wait binding 类型冲突`)\n }\n const scopeMatches = operation === 'cancel'\n ? sameEventScope(binding.scope, expectedScope)\n : stableStringify(binding.scope) === stableStringify(expectedScope)\n if (!scopeMatches || binding.scopeHash !== digest(stableStringify(binding.scope))) {\n throw new Error(`Event ${event.id} 的 Wait binding 作用域漂移`)\n }\n}\n\nfunction assertWaitBinding(record, binding) {\n const actual = {\n waitId: record.id,\n scopeHash: record.scopeHash,\n fieldId: record.fieldId,\n sessionId: record.sessionId,\n sessionPath: record.sessionPath,\n sourceRunId: record.sourceRunId,\n actionId: record.actionId,\n }\n const expected = {\n waitId: binding.waitId,\n scopeHash: binding.scopeHash,\n fieldId: binding.fieldId,\n sessionId: binding.sessionId,\n sessionPath: binding.sessionPath,\n sourceRunId: binding.sourceRunId,\n actionId: binding.actionId,\n }\n if (stableStringify(actual) !== stableStringify(expected)) {\n throw new Error(`Wait event binding 身份漂移: ${binding.waitId}`)\n }\n}\n\nfunction cancelBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n let pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) return current\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true && current.claim?.eventId !== event.id) {\n // 两个 stop 同时到达时只让先行者提升 generation;后来者成为同 Session 的安全 no-op。\n return suppressedClaim(current, event.id)\n }\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n if (!OPEN_CHAIN.has(current.status) && !sameCancel) {\n throw new Error(`取消绑定的 Wait 已进入 ${current.status}: ${binding.waitId}`)\n }\n const now = new Date().toISOString()\n ensureClaimBinding(waitRoot(root, cfg), current)\n const next = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n\n if (pending.suppressed) return pending\n applyCancelFence(root, pending, event.id)\n pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消完成时 Wait 丢失: ${binding.waitId}`)\n const current = loaded.record\n assertWaitBinding(current, binding)\n if (current.claim?.eventId !== event.id) {\n throw new Error(`取消 Wait 身份漂移: ${binding.waitId}`)\n }\n if (current.status === 'cancelled') {\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = { ...current, status: 'cancelled', updatedAt: new Date().toISOString() }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n return pending\n}\n\nfunction claimBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`回复绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id) {\n if (!loaded.isHead) throw new Error(`已 claim 的 Wait 不再是 scope head: ${binding.waitId}`)\n return current\n }\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true) {\n return suppressedClaim(current, event.id)\n }\n if (!loaded.isHead || !RESUMABLE.has(current.status) || expired(current)) {\n throw new Error(`回复事件已绑定 Wait ${binding.waitId},但当前状态为 ${current.status};拒绝回退成新事项`)\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: false,\n },\n }\n persistWait(path, next)\n return next\n })\n}\n\nfunction suppressedClaim(record, eventId) {\n const cancelEventId = record.claim?.eventId || ''\n return {\n ...record,\n suppressed: true,\n cancelEventId,\n claim: {\n eventId,\n claimedAt: new Date().toISOString(),\n runId: '',\n cancelRequested: true,\n supersededByEventId: cancelEventId,\n },\n }\n}\n\nfunction ensureClaimBinding(rootPath, record) {\n const claim = record.claim?.cancelRequested !== true\n ? record.claim\n : record.previousClaim?.cancelRequested !== true ? record.previousClaim : null\n if (!claim?.eventId) return null\n if (!claim.eventKind) {\n throw new Error(`Wait ${record.id} 的 claim 缺少 eventKind,无法安全修复 event ledger`)\n }\n return createEventBinding(rootPath, {\n id: claim.eventId,\n kind: claim.eventKind,\n }, 'claim', record)\n}\n\nfunction readBoundWait(scopePath, waitId) {\n if (existsSync(scopePath)) {\n const current = readJson(scopePath)\n if (current.id === waitId) return { record: current, isHead: true }\n }\n const history = join(dirname(scopePath), 'history', `${waitId}.json`)\n return existsSync(history) ? { record: readJson(history), isHead: false } : null\n}\n\nfunction persistBoundWait(scopePath, record, isHead) {\n if (isHead) persistWait(scopePath, record)\n else persistHistory(scopePath, record)\n}\n\nfunction scopeFromTarget(fieldId, event, target) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: target?.tenantId || event.tenant?.id,\n conversationId: target?.conversationId || event.conversation?.id,\n actorId: target?.senderOpenDingTalkId || event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeFromEvent(fieldId, event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeWithoutField(event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction sameEventScope(scope, expected) {\n return scope?.tenantId === expected.tenantId &&\n scope?.conversationId === expected.conversationId &&\n scope?.actorId === expected.actorId\n}\n\nfunction completeScope(value) {\n const scope = Object.fromEntries(Object.entries(value).map(([k, v]) => [k, String(v || '').trim()]))\n return Object.values(scope).every(Boolean) ? scope : null\n}\n\nfunction assertScope(record, scope, scopeHash) {\n if (record.scopeHash !== scopeHash || stableStringify(record.scope) !== stableStringify(scope)) {\n throw new Error(`Wait scope hash 碰撞或内容漂移: ${scopeHash}`)\n }\n}\n\nfunction expired(record) {\n const deadline = Date.parse(record.expiresAt || '')\n return Number.isFinite(deadline) && deadline <= Date.now()\n}\n\nfunction positiveNumber(value, fallback) {\n const n = Number(value)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction applyReceipt(record, receipt) {\n const keepLifecycle = new Set([\n 'claimed', 'cancel-pending', 'cancelled', 'completed', 'continued', 'expired',\n ]).has(record.status)\n const transportAccepted = Boolean(record.delivery?.transportAccepted)\n return {\n ...record,\n status: keepLifecycle\n ? record.status\n : (receipt.outcome === 'uncertain' && !transportAccepted ? 'uncertain' : 'active'),\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt.actionId,\n delivery: {\n ...(record.delivery || {}),\n outcome: receipt.outcome,\n verified: Boolean(receipt.verified),\n verification: receipt.verification || '',\n questionMessageId: findValue(\n receipt, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\nfunction applyTransportResult(record, result) {\n return {\n ...record,\n status: record.status === 'arming' || record.status === 'uncertain'\n ? 'active' : record.status,\n updatedAt: new Date().toISOString(),\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: true,\n questionMessageId: findValue(result,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\n/** 在 incoming Event 路由时修复 Receipt/transport-result 已落盘但 Wait 仍 arming 的窗口。 */\nfunction repairFromReceipt(root, cfg, path, record) {\n if (record.status !== 'arming') return record\n const actionPath = join(\n resolve(root, cfg.runtime?.eventIndexRoot || '.dingtalk-agent/event-index'),\n 'actions', record.sourceRunId, record.actionId)\n const receiptPath = join(actionPath, 'receipt.json')\n const resultPath = join(actionPath, 'transport-result.json')\n if (!existsSync(receiptPath) && !existsSync(resultPath)) return record\n\n const receipt = existsSync(receiptPath) ? readJson(receiptPath) : null\n const result = existsSync(resultPath) ? readJson(resultPath) : null\n const next = {\n ...record,\n status: (result || receipt?.outcome !== 'uncertain') ? 'active' : 'uncertain',\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt?.actionId || record.lastAppliedReceiptActionId,\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: Boolean(result),\n outcome: receipt?.outcome || 'transport-accepted',\n verified: Boolean(receipt?.verified),\n verification: receipt?.verification || '',\n questionMessageId: findValue(receipt,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n findValue(result, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n persistWait(path, next)\n return next\n}\n\nfunction applyCancelFence(root, wait, eventId) {\n const releaseEffect = acquireSessionEffectLock(root, wait.sessionPath)\n try {\n const lockRoot = resolve(root, '.dingtalk-agent/session-locks')\n mkdirSync(lockRoot, { recursive: true })\n const releaseState = acquireLock(\n join(lockRoot, `${digest(resolve(wait.sessionPath))}.lock`), 2 * 60_000)\n try {\n const sessionPath = join(resolve(wait.sessionPath), 'session.json')\n if (!existsSync(sessionPath)) throw new Error(`取消目标 Session 不存在: ${wait.sessionId}`)\n const session = readJson(sessionPath)\n if (session.id !== wait.sessionId || session.fieldId !== wait.fieldId) {\n throw new Error(`取消目标 Session 身份不一致: ${wait.sessionId}`)\n }\n if (session.lastCancelEventId === eventId) return\n const generation = validGeneration(session.generation)\n persist(sessionPath, {\n ...session,\n generation: generation + 1,\n lastCancelEventId: eventId,\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n } finally {\n releaseState()\n }\n } finally {\n releaseEffect()\n }\n}\n\nfunction validGeneration(value) {\n const n = Number(value ?? 1)\n if (!Number.isInteger(n) || n < 1) throw new Error('Session generation 非法,拒绝取消')\n return n\n}\n\nfunction persist(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction writeJsonCreateAtomic(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n try {\n linkSync(temp, path)\n return true\n } catch (e) {\n if (e.code === 'EEXIST') return false\n throw e\n } finally {\n rmSync(temp, { force: true })\n }\n}\n\nfunction persistWait(scopePath, record) {\n persist(scopePath, record)\n persistHistory(scopePath, record)\n}\n\nfunction persistHistory(scopePath, record) {\n persist(join(dirname(scopePath), 'history', `${record.id}.json`), record)\n mirror(record)\n}\n\nfunction mirror(record) {\n try {\n const dir = join(record.sessionPath, 'waits')\n mkdirSync(dir, { recursive: true })\n persist(join(dir, `${record.id}.json`), record)\n } catch (e) {\n console.error(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`)\n }\n}\n\nfunction readJson(path) {\n return JSON.parse(readFileSync(path, 'utf8'))\n}\n\nconst LOCK_HOST = hostname()\nconst sleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n\nfunction withLock(path, fn) {\n const lockPath = `${path}.lock`\n mkdirSync(dirname(path), { recursive: true })\n const release = acquireLock(lockPath)\n try { return fn() } finally { release() }\n}\n\nfunction acquireLock(path, staleAfterMs = 60_000, waitMs = 5_000) {\n const token = randomUUID()\n const deadline = Date.now() + waitMs\n while (true) {\n try {\n mkdirSync(path)\n try {\n persist(join(path, 'owner.json'), {\n token, pid: process.pid, host: LOCK_HOST, acquiredAt: new Date().toISOString(),\n })\n } catch (e) {\n rmSync(path, { recursive: true, force: true })\n throw e\n }\n return () => {\n try {\n const owner = readJson(join(path, 'owner.json'))\n if (owner.token === token) rmSync(path, { recursive: true, force: true })\n } catch {}\n }\n } catch (e) {\n if (e.code !== 'EEXIST') throw e\n if (staleLock(path, staleAfterMs)) {\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 if (moveError.code === 'ENOENT' || moveError.code === 'EEXIST') continue\n throw moveError\n }\n }\n if (Date.now() >= deadline) throw new Error(`Wait 正在被其他事件更新: ${path}`)\n sleep(50)\n }\n }\n}\n\nfunction staleLock(path, staleAfterMs) {\n let age\n try { age = Date.now() - statSync(path).mtimeMs } catch { return true }\n let owner\n try { owner = readJson(join(path, 'owner.json')) } catch {}\n if (!owner) return age >= 2_000\n if (owner.host === LOCK_HOST && Number.isInteger(Number(owner.pid))) {\n try { process.kill(Number(owner.pid), 0); return false }\n catch (e) { if (e.code === 'ESRCH') return true }\n }\n return age >= staleAfterMs\n}\n\nfunction findValue(value, keys) {\n if (!value || typeof value !== 'object') return ''\n for (const key of keys) if (value[key]) return String(value[key])\n for (const child of Object.values(value)) {\n const found = findValue(child, keys)\n if (found) return found\n }\n return ''\n}\n"]}
1
+ {"version":3,"file":"waits.js","sourceRoot":"","sources":["../../src/waits.ts"],"names":[],"mappings":"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","sourcesContent":["// 单链 Durable Wait(TypeScript source)。\n//\n// v1 只解决一件事:ask 之后,下一条来自同一 Field/tenant/conversation/actor\n// 的 DM 或直接 @,恢复原 Session 并创建新 Run。这里不实现通用 workflow/stack。\n\nimport {\n existsSync, linkSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync,\n writeFileSync,\n} from 'node:fs'\nimport { dirname, resolve, join } from 'node:path'\nimport { hostname } from 'node:os'\nimport { randomUUID } from 'node:crypto'\nimport { digest, stableStringify } from './events.js'\n\nconst OPEN_CHAIN = new Set([\n 'arming', 'active', 'uncertain', 'claimed', 'cancel-pending',\n])\nconst RESUMABLE = new Set(['active', 'uncertain'])\nconst DEFAULT_TTL_MS = 7 * 24 * 60 * 60 * 1000\n\nexport function armWait(root, cfg, input) {\n const scope = scopeFromTarget(input.fieldId, input.event, input.target)\n if (!scope) {\n throw new Error('ask 无法建立 Wait:必须有 tenant、conversation、actor,且事件是 DM 或直接 @')\n }\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const waitId = `wait_${digest(`${input.sessionId}\\0${input.actionId}`).slice(0, 20)}`\n const history = join(rootPath, 'history', `${waitId}.json`)\n mkdirSync(rootPath, { recursive: true })\n // 旧 ask 的 Receipt 可能在同一 scope 已进入下一轮 Wait 后重放;历史记录存在时\n // 只返回原 Wait,不能用旧 Receipt 覆盖当前正在等待的新问题。\n if (existsSync(history)) {\n const recorded = readJson(history)\n assertScope(recorded, scope, scopeHash)\n if (recorded.id === waitId && recorded.actionId === input.actionId &&\n recorded.sessionId === input.sessionId) return recorded\n }\n return withLock(path, () => {\n let existing = existsSync(path) ? readJson(path) : null\n if (existing) {\n assertScope(existing, scope, scopeHash)\n existing = repairFromReceipt(root, cfg, path, existing)\n }\n if (existing?.id === waitId && existing.actionId === input.actionId) return existing\n const ownedClaim = existing?.status === 'claimed' &&\n existing.sessionId === input.sessionId &&\n existing.claim?.runId === input.sourceRunId\n if (existing && OPEN_CHAIN.has(existing.status) && !expired(existing) &&\n !ownedClaim) {\n throw new Error(\n `同一人员/会话已有未完成 Wait ${existing.id}(Session ${existing.sessionId});` +\n '单链 v1 拒绝并行追问')\n }\n if (ownedClaim) {\n persistHistory(path, {\n ...existing, status: 'continued', continuedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n }\n const now = new Date().toISOString()\n const ttl = positiveNumber(cfg.runtime?.waitTtlMs, DEFAULT_TTL_MS)\n const record = {\n $schema: 'dingtalk-agent/wait@1',\n id: waitId,\n scopeHash,\n scope,\n fieldId: input.fieldId,\n sessionId: input.sessionId,\n sessionPath: resolve(input.sessionPath),\n sourceRunId: input.sourceRunId,\n actionId: input.actionId,\n questionText: String(input.questionText || ''),\n status: 'arming',\n version: Number(existing?.version || 0) + 1,\n createdAt: now,\n updatedAt: now,\n expiresAt: new Date(Date.now() + ttl).toISOString(),\n delivery: null,\n claim: null,\n }\n persistWait(path, record)\n return record\n })\n}\n\n/** Receipt 是真值;重放 Receipt 也能幂等补齐 active/uncertain Wait。 */\nexport function reconcileWaitFromReceipt(root, cfg, wait, receipt) {\n if (!wait) return null\n if (wait.actionId !== receipt.actionId) {\n throw new Error(`Wait/Receipt actionId 不一致: ${wait.actionId}/${receipt.actionId}`)\n }\n if (wait.lastAppliedReceiptActionId === receipt.actionId) return wait\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id && current.actionId === receipt.actionId) {\n if (current.lastAppliedReceiptActionId === receipt.actionId) return current\n const next = applyReceipt(current, receipt)\n persistWait(path, next)\n return next\n }\n // 该链可能已经进入下一轮 Wait;旧 Receipt 只补自己的历史,不得覆盖 scope head。\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) {\n throw new Error(`Wait/Receipt 身份冲突: wait=${current.id}, action=${receipt.actionId}`)\n }\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== receipt.actionId) {\n throw new Error(`Wait 历史与 Receipt 身份冲突: wait=${wait.id}, action=${receipt.actionId}`)\n }\n if (recorded.lastAppliedReceiptActionId === receipt.actionId) return recorded\n const next = applyReceipt(recorded, receipt)\n persistHistory(path, next)\n return next\n })\n}\n\n/** DWS 已返回可查询结果后立即开放 Wait;平台回读可以随后完成。 */\nexport function markWaitTransportAccepted(root, cfg, wait, result) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n if (!existsSync(path)) throw new Error(`Wait 索引丢失: ${wait.id}`)\n const current = readJson(path)\n if (current.id === wait.id) {\n const next = applyTransportResult(current, result)\n persistWait(path, next)\n return next\n }\n const history = join(waitRoot(root, cfg), 'history', `${wait.id}.json`)\n if (!existsSync(history)) throw new Error(`Wait 已被其他链替换: ${wait.id}`)\n const recorded = readJson(history)\n if (recorded.id !== wait.id || recorded.actionId !== wait.actionId) {\n throw new Error(`Wait 历史与 transport-result 身份冲突: ${wait.id}`)\n }\n const next = applyTransportResult(recorded, result)\n persistHistory(path, next)\n return next\n })\n}\n\n/** resumed Run 给出最终 reply/silence 后,释放单链 scope。 */\nexport function completeWaitFromReceipt(root, cfg, resume, receipt) {\n if (resume?.mode !== 'resume' || !resume.waitId) return null\n const rootPath = waitRoot(root, cfg)\n const historyPath = join(rootPath, 'history', `${resume.waitId}.json`)\n let recorded = existsSync(historyPath) ? readJson(historyPath) : null\n let scopeHash = recorded?.scopeHash || resume.waitScopeHash || ''\n if (!scopeHash && existsSync(rootPath)) {\n const matches = readdirSync(rootPath)\n .filter((name) => name.endsWith('.json'))\n .map((name) => readJson(join(rootPath, name)))\n .filter((candidate) => candidate.id === resume.waitId)\n if (matches.length === 1) {\n recorded = matches[0]\n scopeHash = recorded.scopeHash\n }\n }\n if (!scopeHash) throw new Error(`Wait 历史丢失且无法从 scope head 修复: ${resume.waitId}`)\n const path = join(rootPath, `${scopeHash}.json`)\n return withLock(path, () => {\n if (!recorded) {\n const current = existsSync(path) ? readJson(path) : null\n if (!current || current.id !== resume.waitId) {\n throw new Error(`Wait 历史丢失且 scope head 不匹配: ${resume.waitId}`)\n }\n recorded = current\n persistHistory(path, recorded)\n }\n const now = new Date().toISOString()\n const current = existsSync(path) ? readJson(path) : null\n if (current?.id === recorded.id) {\n if (current.status === 'cancelled') {\n persistHistory(path, current)\n return current\n }\n const next = {\n ...current,\n status: current.status === 'cancel-pending' ? 'cancel-pending' : 'completed',\n updatedAt: now, completedAt: now,\n completedByReceiptActionId: receipt.actionId,\n }\n persistWait(path, next)\n return next\n }\n const next = {\n ...recorded, status: recorded.status === 'cancelled' ? 'cancelled' : 'completed',\n updatedAt: now, completedAt: now, completedByReceiptActionId: receipt.actionId,\n }\n persistHistory(path, next)\n return next\n })\n}\n\n/**\n * 显式 /stop、/cancel 是宿主控制面:不依赖当前 Field/Behavior/Skill。\n * 先写 cancel-pending,再在线性化锁内提升 Session generation,最后写 cancelled。\n */\nexport function cancelWaitForEvent(root, cfg, event) {\n if (!isCancelCommand(event.message?.text)) return null\n const eventScope = scopeWithoutField(event)\n if (!eventScope) return null\n const rootPath = waitRoot(root, cfg)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'cancel', eventScope)\n if (replay.outcome === 'no-match') return null\n if (replay.outcome === 'ambiguous') {\n throw new Error(`取消命中多个 Wait,已固化为 ambiguous: ${(replay.candidates || []).join(', ')}`)\n }\n return cancelBoundWait(root, cfg, event, replay)\n }\n if (!existsSync(rootPath)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const candidates: Array<{ path: string; record: Record<string, any> }> = []\n for (const name of readdirSync(rootPath)) {\n if (!name.endsWith('.json')) continue\n const path = join(rootPath, name)\n const record = readJson(path)\n const sameCancel = record.claim?.eventId === event.id &&\n record.claim?.cancelRequested === true\n if (sameEventScope(record.scope, eventScope) &&\n (OPEN_CHAIN.has(record.status) || sameCancel ||\n (record.status === 'cancelled' && record.claim?.eventId === event.id))) {\n candidates.push({ path, record })\n }\n }\n if (candidates.length > 1) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope, {\n outcome: 'ambiguous', candidates: candidates.map((x) => x.record.id).sort(),\n })\n throw new Error(`取消命中多个 Wait,拒绝猜测: ${candidates.map((x) => x.record.id).join(', ')}`)\n }\n if (!candidates.length) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n const { path } = candidates[0]\n const bound = withLock(path, () => {\n let current = readJson(path)\n if (!sameEventScope(current.scope, eventScope)) {\n throw new Error(`取消 Wait 作用域漂移: ${current.id}`)\n }\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) {\n return createEventBinding(rootPath, event, 'cancel', current)\n }\n if (!OPEN_CHAIN.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'cancel', eventScope)\n return null\n }\n // 先把 head 置为 pending,再写 ledger。两者之间即使 SIGKILL,重放也会从\n // pending 的 eventId 恢复;Action 无法趁 binding→effect-lock 窗口建立 W2。\n const now = new Date().toISOString()\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n ensureClaimBinding(rootPath, current)\n const pending = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistWait(path, pending)\n const binding = createEventBinding(rootPath, event, 'cancel', pending)\n return binding\n })\n return bound ? cancelBoundWait(root, cfg, event, bound) : null\n}\n\n/** Action 与 cancel 共用这一把锁;先拿到锁的一方定义副作用先后。 */\nexport function acquireSessionEffectLock(root, sessionPath) {\n const dir = resolve(root, '.dingtalk-agent/session-effect-locks')\n mkdirSync(dir, { recursive: true })\n return acquireLock(\n join(dir, `${digest(resolve(sessionPath))}.lock`), 30 * 60_000, 3 * 60_000)\n}\n\n/**\n * incoming Event 在创建新 Session 前调用。显式 sessionKey/correlation 由调用方优先处理。\n * claimed/cancelled + 同 eventId 可重入,覆盖 materialize 过程中崩溃后的恢复窗口。\n */\nexport function claimWait(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const rootPath = waitRoot(root, cfg)\n const scopeHash = digest(stableStringify(scope))\n const path = join(rootPath, `${scopeHash}.json`)\n const replay = readEventBinding(rootPath, event.id)\n if (replay) {\n assertEventBinding(replay, event, 'claim', scope)\n if (replay.outcome === 'no-match') return null\n return claimBoundWait(root, cfg, event, replay)\n }\n return withLock(path, () => {\n if (!existsSync(path)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n let current = readJson(path)\n assertScope(current, scope, scopeHash)\n current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id &&\n current.claim?.cancelRequested !== true) {\n createEventBinding(rootPath, event, 'claim', current)\n return current\n }\n if (expired(current)) {\n ensureClaimBinding(rootPath, current)\n if (OPEN_CHAIN.has(current.status)) {\n const next = { ...current, status: 'expired', updatedAt: new Date().toISOString() }\n persistWait(path, next)\n }\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n if (!RESUMABLE.has(current.status)) {\n createNoMatchBinding(rootPath, event, 'claim', scope)\n return null\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id,\n eventKind: event.kind,\n claimedAt: now,\n runId: '',\n cancelRequested: false,\n },\n }\n persistWait(path, next)\n createEventBinding(rootPath, event, 'claim', next)\n return next\n })\n}\n\nexport function attachClaimedRun(root, cfg, wait, eventId, runId) {\n if (!wait) return null\n const path = join(waitRoot(root, cfg), `${wait.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, wait.id)\n if (!loaded || loaded.record.claim?.eventId !== eventId) {\n throw new Error(`Wait claim 身份冲突: wait=${wait.id}, event=${eventId}`)\n }\n const current = loaded.record\n if (current.claim.runId && current.claim.runId !== runId) {\n throw new Error(`Wait ${wait.id} 已绑定其他 Run: ${current.claim.runId}`)\n }\n if (current.claim.runId === runId) {\n // head 已写而 history 未写时,幂等重试必须顺手补齐历史真值。\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = {\n ...current,\n updatedAt: new Date().toISOString(),\n claim: { ...current.claim, runId },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n}\n\nexport function waitRoot(root, cfg) {\n return resolve(root, cfg.runtime?.waitRoot || '.dingtalk-agent/waits')\n}\n\nexport function readWaitForEvent(root, cfg, fieldId, event) {\n const scope = scopeFromEvent(fieldId, event)\n if (!scope) return null\n const path = join(waitRoot(root, cfg), `${digest(stableStringify(scope))}.json`)\n return existsSync(path) ? readJson(path) : null\n}\n\nexport function isCancelCommand(text) {\n // Live canary 的合成入站必须保留唯一 marker;marker 只是证据,不应阻断\n // 随后的显式取消命令。生产消息不带 marker 时仍保持原有严格匹配。\n const value = String(text || '').trim()\n .replace(/^\\[DTA-LAB-[^\\]\\n]+\\]\\s*/u, '')\n return /^\\/(?:stop|cancel|停止|取消)$/i.test(value)\n}\n\n/** eventId 一旦绑定 Wait,重放永远解析原 Wait,不能重新扫描当前 scope head。 */\nfunction createEventBinding(rootPath, event, operation, wait) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: 'matched',\n waitId: wait.id,\n scopeHash: wait.scopeHash,\n scope: wait.scope,\n fieldId: wait.fieldId,\n sessionId: wait.sessionId,\n sessionPath: wait.sessionPath,\n sourceRunId: wait.sourceRunId,\n actionId: wait.actionId,\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 已绑定其他 Wait,拒绝 ABA 重解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction createNoMatchBinding(\n rootPath,\n event,\n operation,\n scope,\n options: Record<string, any> = {},\n) {\n const path = eventBindingPath(rootPath, event.id)\n const binding = {\n $schema: 'dingtalk-agent/wait-event-binding@1',\n eventId: event.id,\n eventKind: event.kind,\n operation,\n outcome: options.outcome || 'no-match',\n candidates: options.candidates || [],\n waitId: '',\n scopeHash: digest(stableStringify(scope)),\n scope,\n fieldId: '',\n sessionId: '',\n sessionPath: '',\n sourceRunId: '',\n actionId: '',\n boundAt: new Date().toISOString(),\n }\n if (!writeJsonCreateAtomic(path, binding)) {\n const existing = readJson(path)\n if (stableStringify(bindingIdentity(existing)) !== stableStringify(bindingIdentity(binding))) {\n throw new Error(`Event ${event.id} 的 Wait 路由决策已固化,拒绝重新解释`)\n }\n return existing\n }\n return binding\n}\n\nfunction readEventBinding(rootPath, eventId) {\n const path = eventBindingPath(rootPath, eventId)\n return existsSync(path) ? readJson(path) : null\n}\n\nfunction eventBindingPath(rootPath, eventId) {\n return join(rootPath, 'events', `${digest(eventId)}.json`)\n}\n\nfunction bindingIdentity(value) {\n return {\n eventId: value.eventId,\n eventKind: value.eventKind,\n operation: value.operation,\n outcome: value.outcome,\n candidates: value.candidates || [],\n waitId: value.waitId,\n scopeHash: value.scopeHash,\n scope: value.scope,\n fieldId: value.fieldId,\n sessionId: value.sessionId,\n sessionPath: value.sessionPath,\n sourceRunId: value.sourceRunId,\n actionId: value.actionId,\n }\n}\n\nfunction assertEventBinding(binding, event, operation, expectedScope) {\n if (binding.eventId !== event.id || binding.eventKind !== event.kind ||\n binding.operation !== operation) {\n throw new Error(`Event ${event.id} 的 Wait binding 类型冲突`)\n }\n const scopeMatches = operation === 'cancel'\n ? sameEventScope(binding.scope, expectedScope)\n : stableStringify(binding.scope) === stableStringify(expectedScope)\n if (!scopeMatches || binding.scopeHash !== digest(stableStringify(binding.scope))) {\n throw new Error(`Event ${event.id} 的 Wait binding 作用域漂移`)\n }\n}\n\nfunction assertWaitBinding(record, binding) {\n const actual = {\n waitId: record.id,\n scopeHash: record.scopeHash,\n fieldId: record.fieldId,\n sessionId: record.sessionId,\n sessionPath: record.sessionPath,\n sourceRunId: record.sourceRunId,\n actionId: record.actionId,\n }\n const expected = {\n waitId: binding.waitId,\n scopeHash: binding.scopeHash,\n fieldId: binding.fieldId,\n sessionId: binding.sessionId,\n sessionPath: binding.sessionPath,\n sourceRunId: binding.sourceRunId,\n actionId: binding.actionId,\n }\n if (stableStringify(actual) !== stableStringify(expected)) {\n throw new Error(`Wait event binding 身份漂移: ${binding.waitId}`)\n }\n}\n\nfunction cancelBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n let pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'cancelled' && current.claim?.eventId === event.id) return current\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true && current.claim?.eventId !== event.id) {\n // 两个 stop 同时到达时只让先行者提升 generation;后来者成为同 Session 的安全 no-op。\n return suppressedClaim(current, event.id)\n }\n const sameCancel = current.claim?.eventId === event.id &&\n current.claim?.cancelRequested === true\n if (!OPEN_CHAIN.has(current.status) && !sameCancel) {\n throw new Error(`取消绑定的 Wait 已进入 ${current.status}: ${binding.waitId}`)\n }\n const now = new Date().toISOString()\n ensureClaimBinding(waitRoot(root, cfg), current)\n const next = {\n ...current,\n status: 'cancel-pending',\n updatedAt: now,\n previousClaim: sameCancel ? current.previousClaim || null : current.claim || null,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: true,\n },\n }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n\n if (pending.suppressed) return pending\n applyCancelFence(root, pending, event.id)\n pending = withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`取消完成时 Wait 丢失: ${binding.waitId}`)\n const current = loaded.record\n assertWaitBinding(current, binding)\n if (current.claim?.eventId !== event.id) {\n throw new Error(`取消 Wait 身份漂移: ${binding.waitId}`)\n }\n if (current.status === 'cancelled') {\n persistBoundWait(path, current, loaded.isHead)\n return current\n }\n const next = { ...current, status: 'cancelled', updatedAt: new Date().toISOString() }\n persistBoundWait(path, next, loaded.isHead)\n return next\n })\n return pending\n}\n\nfunction claimBoundWait(root, cfg, event, binding) {\n const path = join(waitRoot(root, cfg), `${binding.scopeHash}.json`)\n return withLock(path, () => {\n const loaded = readBoundWait(path, binding.waitId)\n if (!loaded) throw new Error(`回复绑定的 Wait 不存在: ${binding.waitId}`)\n let current = loaded.record\n assertWaitBinding(current, binding)\n if (loaded.isHead) current = repairFromReceipt(root, cfg, path, current)\n if (current.status === 'claimed' && current.claim?.eventId === event.id) {\n if (!loaded.isHead) throw new Error(`已 claim 的 Wait 不再是 scope head: ${binding.waitId}`)\n return current\n }\n if (['cancel-pending', 'cancelled'].includes(current.status) &&\n current.claim?.cancelRequested === true) {\n return suppressedClaim(current, event.id)\n }\n if (!loaded.isHead || !RESUMABLE.has(current.status) || expired(current)) {\n throw new Error(`回复事件已绑定 Wait ${binding.waitId},但当前状态为 ${current.status};拒绝回退成新事项`)\n }\n const now = new Date().toISOString()\n const next = {\n ...current,\n status: 'claimed',\n updatedAt: now,\n claim: {\n eventId: event.id, eventKind: event.kind, claimedAt: now,\n runId: '', cancelRequested: false,\n },\n }\n persistWait(path, next)\n return next\n })\n}\n\nfunction suppressedClaim(record, eventId) {\n const cancelEventId = record.claim?.eventId || ''\n return {\n ...record,\n suppressed: true,\n cancelEventId,\n claim: {\n eventId,\n claimedAt: new Date().toISOString(),\n runId: '',\n cancelRequested: true,\n supersededByEventId: cancelEventId,\n },\n }\n}\n\nfunction ensureClaimBinding(rootPath, record) {\n const claim = record.claim?.cancelRequested !== true\n ? record.claim\n : record.previousClaim?.cancelRequested !== true ? record.previousClaim : null\n if (!claim?.eventId) return null\n if (!claim.eventKind) {\n throw new Error(`Wait ${record.id} 的 claim 缺少 eventKind,无法安全修复 event ledger`)\n }\n return createEventBinding(rootPath, {\n id: claim.eventId,\n kind: claim.eventKind,\n }, 'claim', record)\n}\n\nfunction readBoundWait(scopePath, waitId) {\n if (existsSync(scopePath)) {\n const current = readJson(scopePath)\n if (current.id === waitId) return { record: current, isHead: true }\n }\n const history = join(dirname(scopePath), 'history', `${waitId}.json`)\n return existsSync(history) ? { record: readJson(history), isHead: false } : null\n}\n\nfunction persistBoundWait(scopePath, record, isHead) {\n if (isHead) persistWait(scopePath, record)\n else persistHistory(scopePath, record)\n}\n\nfunction scopeFromTarget(fieldId, event, target) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: target?.tenantId || event.tenant?.id,\n conversationId: target?.conversationId || event.conversation?.id,\n actorId: target?.senderOpenDingTalkId || event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeFromEvent(fieldId, event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n fieldId,\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction scopeWithoutField(event) {\n if (!['im.message.dm', 'im.message.mentioned'].includes(event.kind)) return null\n return completeScope({\n tenantId: event.tenant?.id,\n conversationId: event.conversation?.id,\n actorId: event.actor?.openDingTalkId,\n })\n}\n\nfunction sameEventScope(scope, expected) {\n return scope?.tenantId === expected.tenantId &&\n scope?.conversationId === expected.conversationId &&\n scope?.actorId === expected.actorId\n}\n\nfunction completeScope(value) {\n const scope = Object.fromEntries(Object.entries(value).map(([k, v]) => [k, String(v || '').trim()]))\n return Object.values(scope).every(Boolean) ? scope : null\n}\n\nfunction assertScope(record, scope, scopeHash) {\n if (record.scopeHash !== scopeHash || stableStringify(record.scope) !== stableStringify(scope)) {\n throw new Error(`Wait scope hash 碰撞或内容漂移: ${scopeHash}`)\n }\n}\n\nfunction expired(record) {\n const deadline = Date.parse(record.expiresAt || '')\n return Number.isFinite(deadline) && deadline <= Date.now()\n}\n\nfunction positiveNumber(value, fallback) {\n const n = Number(value)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction applyReceipt(record, receipt) {\n const keepLifecycle = new Set([\n 'claimed', 'cancel-pending', 'cancelled', 'completed', 'continued', 'expired',\n ]).has(record.status)\n const transportAccepted = Boolean(record.delivery?.transportAccepted)\n return {\n ...record,\n status: keepLifecycle\n ? record.status\n : (receipt.outcome === 'uncertain' && !transportAccepted ? 'uncertain' : 'active'),\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt.actionId,\n delivery: {\n ...(record.delivery || {}),\n outcome: receipt.outcome,\n verified: Boolean(receipt.verified),\n verification: receipt.verification || '',\n questionMessageId: findValue(\n receipt, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\nfunction applyTransportResult(record, result) {\n return {\n ...record,\n status: record.status === 'arming' || record.status === 'uncertain'\n ? 'active' : record.status,\n updatedAt: new Date().toISOString(),\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: true,\n questionMessageId: findValue(result,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n}\n\n/** 在 incoming Event 路由时修复 Receipt/transport-result 已落盘但 Wait 仍 arming 的窗口。 */\nfunction repairFromReceipt(root, cfg, path, record) {\n if (record.status !== 'arming') return record\n const actionPath = join(\n resolve(root, cfg.runtime?.eventIndexRoot || '.dingtalk-agent/event-index'),\n 'actions', record.sourceRunId, record.actionId)\n const receiptPath = join(actionPath, 'receipt.json')\n const resultPath = join(actionPath, 'transport-result.json')\n if (!existsSync(receiptPath) && !existsSync(resultPath)) return record\n\n const receipt = existsSync(receiptPath) ? readJson(receiptPath) : null\n const result = existsSync(resultPath) ? readJson(resultPath) : null\n const next = {\n ...record,\n status: (result || receipt?.outcome !== 'uncertain') ? 'active' : 'uncertain',\n updatedAt: new Date().toISOString(),\n lastAppliedReceiptActionId: receipt?.actionId || record.lastAppliedReceiptActionId,\n delivery: {\n ...(record.delivery || {}),\n transportAccepted: Boolean(result),\n outcome: receipt?.outcome || 'transport-accepted',\n verified: Boolean(receipt?.verified),\n verification: receipt?.verification || '',\n questionMessageId: findValue(receipt,\n ['openMessageId', 'openMsgId', 'open_message_id']) ||\n findValue(result, ['openMessageId', 'openMsgId', 'open_message_id']) ||\n record.delivery?.questionMessageId || '',\n },\n }\n persistWait(path, next)\n return next\n}\n\nfunction applyCancelFence(root, wait, eventId) {\n const releaseEffect = acquireSessionEffectLock(root, wait.sessionPath)\n try {\n const lockRoot = resolve(root, '.dingtalk-agent/session-locks')\n mkdirSync(lockRoot, { recursive: true })\n const releaseState = acquireLock(\n join(lockRoot, `${digest(resolve(wait.sessionPath))}.lock`), 2 * 60_000)\n try {\n const sessionPath = join(resolve(wait.sessionPath), 'session.json')\n if (!existsSync(sessionPath)) throw new Error(`取消目标 Session 不存在: ${wait.sessionId}`)\n const session = readJson(sessionPath)\n if (session.id !== wait.sessionId || session.fieldId !== wait.fieldId) {\n throw new Error(`取消目标 Session 身份不一致: ${wait.sessionId}`)\n }\n if (session.lastCancelEventId === eventId) return\n const generation = validGeneration(session.generation)\n persist(sessionPath, {\n ...session,\n generation: generation + 1,\n lastCancelEventId: eventId,\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n })\n } finally {\n releaseState()\n }\n } finally {\n releaseEffect()\n }\n}\n\nfunction validGeneration(value) {\n const n = Number(value ?? 1)\n if (!Number.isInteger(n) || n < 1) throw new Error('Session generation 非法,拒绝取消')\n return n\n}\n\nfunction persist(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction writeJsonCreateAtomic(path, value) {\n mkdirSync(dirname(path), { recursive: true })\n const temp = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`\n writeFileSync(temp, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n try {\n linkSync(temp, path)\n return true\n } catch (e) {\n if (e.code === 'EEXIST') return false\n throw e\n } finally {\n rmSync(temp, { force: true })\n }\n}\n\nfunction persistWait(scopePath, record) {\n persist(scopePath, record)\n persistHistory(scopePath, record)\n}\n\nfunction persistHistory(scopePath, record) {\n persist(join(dirname(scopePath), 'history', `${record.id}.json`), record)\n mirror(record)\n}\n\nfunction mirror(record) {\n try {\n const dir = join(record.sessionPath, 'waits')\n mkdirSync(dir, { recursive: true })\n persist(join(dir, `${record.id}.json`), record)\n } catch (e) {\n console.error(` ⚠️ Wait 审计镜像写入失败(waitRoot 权威真值已保留): ${e.message}`)\n }\n}\n\nfunction readJson(path) {\n return JSON.parse(readFileSync(path, 'utf8'))\n}\n\nconst LOCK_HOST = hostname()\nconst sleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)\n\nfunction withLock(path, fn) {\n const lockPath = `${path}.lock`\n mkdirSync(dirname(path), { recursive: true })\n const release = acquireLock(lockPath)\n try { return fn() } finally { release() }\n}\n\nfunction acquireLock(path, staleAfterMs = 60_000, waitMs = 5_000) {\n const token = randomUUID()\n const deadline = Date.now() + waitMs\n while (true) {\n try {\n mkdirSync(path)\n try {\n persist(join(path, 'owner.json'), {\n token, pid: process.pid, host: LOCK_HOST, acquiredAt: new Date().toISOString(),\n })\n } catch (e) {\n rmSync(path, { recursive: true, force: true })\n throw e\n }\n return () => {\n try {\n const owner = readJson(join(path, 'owner.json'))\n if (owner.token === token) rmSync(path, { recursive: true, force: true })\n } catch {}\n }\n } catch (e) {\n if (e.code !== 'EEXIST') throw e\n if (staleLock(path, staleAfterMs)) {\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 if (moveError.code === 'ENOENT' || moveError.code === 'EEXIST') continue\n throw moveError\n }\n }\n if (Date.now() >= deadline) throw new Error(`Wait 正在被其他事件更新: ${path}`)\n sleep(50)\n }\n }\n}\n\nfunction staleLock(path, staleAfterMs) {\n let age\n try { age = Date.now() - statSync(path).mtimeMs } catch { return true }\n let owner\n try { owner = readJson(join(path, 'owner.json')) } catch {}\n if (!owner) return age >= 2_000\n if (owner.host === LOCK_HOST && Number.isInteger(Number(owner.pid))) {\n try { process.kill(Number(owner.pid), 0); return false }\n catch (e) { if (e.code === 'ESRCH') return true }\n }\n return age >= staleAfterMs\n}\n\nfunction findValue(value, keys) {\n if (!value || typeof value !== 'object') return ''\n for (const key of keys) if (value[key]) return String(value[key])\n for (const child of Object.values(value)) {\n const found = findValue(child, keys)\n if (found) return found\n }\n return ''\n}\n"]}