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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.en.md +395 -0
  3. package/README.md +466 -35
  4. package/dist/bin/dingtalk-agent.js +1058 -10
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/actions.js +98 -14
  7. package/dist/src/actions.js.map +1 -1
  8. package/dist/src/agent-audit.js +460 -0
  9. package/dist/src/agent-audit.js.map +1 -0
  10. package/dist/src/agent-bindings.js +132 -0
  11. package/dist/src/agent-bindings.js.map +1 -0
  12. package/dist/src/agent-definition.js +182 -0
  13. package/dist/src/agent-definition.js.map +1 -0
  14. package/dist/src/agent-enhance.js +678 -0
  15. package/dist/src/agent-enhance.js.map +1 -0
  16. package/dist/src/bootstrap.js +125 -17
  17. package/dist/src/bootstrap.js.map +1 -1
  18. package/dist/src/development-workspace.js +729 -0
  19. package/dist/src/development-workspace.js.map +1 -0
  20. package/dist/src/dws.js +145 -0
  21. package/dist/src/dws.js.map +1 -1
  22. package/dist/src/eval-evidence.js +193 -0
  23. package/dist/src/eval-evidence.js.map +1 -0
  24. package/dist/src/invocation.js +36 -0
  25. package/dist/src/invocation.js.map +1 -0
  26. package/dist/src/lab.js +679 -0
  27. package/dist/src/lab.js.map +1 -0
  28. package/dist/src/lease.js +100 -0
  29. package/dist/src/lease.js.map +1 -0
  30. package/dist/src/memory/candidates.js +451 -0
  31. package/dist/src/memory/candidates.js.map +1 -0
  32. package/dist/src/memory/completion-evidence.js +536 -0
  33. package/dist/src/memory/completion-evidence.js.map +1 -0
  34. package/dist/src/memory/operational.js +263 -0
  35. package/dist/src/memory/operational.js.map +1 -0
  36. package/dist/src/memory/remote-state.js +478 -0
  37. package/dist/src/memory/remote-state.js.map +1 -0
  38. package/dist/src/memory/task-checkpoints.js +204 -0
  39. package/dist/src/memory/task-checkpoints.js.map +1 -0
  40. package/dist/src/multica-deploy.js +1480 -0
  41. package/dist/src/multica-deploy.js.map +1 -0
  42. package/dist/src/multica-provider.js +685 -0
  43. package/dist/src/multica-provider.js.map +1 -0
  44. package/dist/src/opencode-evals.js +1062 -0
  45. package/dist/src/opencode-evals.js.map +1 -0
  46. package/dist/src/opencode-provider.js +531 -0
  47. package/dist/src/opencode-provider.js.map +1 -0
  48. package/dist/src/opencode-workspace.js +197 -0
  49. package/dist/src/opencode-workspace.js.map +1 -0
  50. package/dist/src/perception.js +225 -0
  51. package/dist/src/perception.js.map +1 -0
  52. package/dist/src/personal-event-evals.js +595 -0
  53. package/dist/src/personal-event-evals.js.map +1 -0
  54. package/dist/src/promotion.js +786 -0
  55. package/dist/src/promotion.js.map +1 -0
  56. package/dist/src/remote-semantic-state-live-evals.js +888 -0
  57. package/dist/src/remote-semantic-state-live-evals.js.map +1 -0
  58. package/dist/src/remote-semantic-state-worker.js +38 -0
  59. package/dist/src/remote-semantic-state-worker.js.map +1 -0
  60. package/dist/src/remote-state-evals.js +501 -0
  61. package/dist/src/remote-state-evals.js.map +1 -0
  62. package/dist/src/response-gate.js +51 -0
  63. package/dist/src/response-gate.js.map +1 -0
  64. package/dist/src/robot-evals.js +770 -0
  65. package/dist/src/robot-evals.js.map +1 -0
  66. package/dist/src/sessions.js +66 -105
  67. package/dist/src/sessions.js.map +1 -1
  68. package/dist/src/skill-manager.js +25 -16
  69. package/dist/src/skill-manager.js.map +1 -1
  70. package/dist/src/skills.js.map +1 -1
  71. package/dist/src/storage-evals.js +26 -0
  72. package/dist/src/storage-evals.js.map +1 -0
  73. package/dist/src/types.js.map +1 -1
  74. package/dist/src/waits.js +5 -1
  75. package/dist/src/waits.js.map +1 -1
  76. package/dist/src/workspace.js +28 -3
  77. package/dist/src/workspace.js.map +1 -1
  78. package/docs/INSTALLATION.md +47 -0
  79. package/docs/SECOND-AGENT-ACCEPTANCE.md +62 -0
  80. package/docs/architecture/agent-memory-topology.png +0 -0
  81. package/docs/architecture/agent-memory-topology.svg +132 -0
  82. package/docs/architecture/general-agent-kernel-topology.png +0 -0
  83. package/docs/architecture/general-agent-kernel-topology.svg +149 -0
  84. package/docs/architecture/provider-bound-development-workspace.png +0 -0
  85. package/docs/architecture/provider-bound-development-workspace.svg +141 -0
  86. package/docs/architecture/task-completion-gate.png +0 -0
  87. package/docs/architecture/task-completion-gate.svg +191 -0
  88. package/docs/schemas/agent-audit-load-evidence.schema.json +14 -0
  89. package/docs/schemas/agent-audit.schema.json +92 -0
  90. package/docs/schemas/agent-bindings.schema.json +54 -0
  91. package/docs/schemas/agent-definition.schema.json +78 -0
  92. package/docs/schemas/agent-enhancement-plan.schema.json +88 -0
  93. package/docs/schemas/agent-enhancement-receipt.schema.json +37 -0
  94. package/docs/schemas/enriched-invocation.schema.json +46 -0
  95. package/docs/schemas/eval-candidate-plan.schema.json +28 -0
  96. package/docs/schemas/eval-candidate-result.schema.json +20 -0
  97. package/docs/schemas/eval-candidate.schema.json +30 -0
  98. package/docs/schemas/invocation.schema.json +19 -0
  99. package/docs/schemas/memory-candidate-proposal.schema.json +18 -0
  100. package/docs/schemas/memory-candidate.schema.json +76 -0
  101. package/docs/schemas/memory-publish-target.schema.json +25 -0
  102. package/docs/schemas/multica-deployment-list.schema.json +29 -0
  103. package/docs/schemas/multica-deployment-operation.schema.json +51 -0
  104. package/docs/schemas/multica-deployment-plan.schema.json +70 -0
  105. package/docs/schemas/multica-deployment-receipt.schema.json +87 -0
  106. package/docs/schemas/multica-deployment-status.schema.json +23 -0
  107. package/docs/schemas/multica-workspace-inspection.schema.json +77 -0
  108. package/docs/schemas/multica-workspace-plan.schema.json +68 -0
  109. package/docs/schemas/multica-workspace-resource-list.schema.json +27 -0
  110. package/docs/schemas/multica-workspace-status.schema.json +34 -0
  111. package/docs/schemas/observation.schema.json +21 -0
  112. package/docs/schemas/operational-memory-provider.schema.json +36 -0
  113. package/docs/schemas/operational-memory-record.schema.json +24 -0
  114. package/docs/schemas/perception-input.schema.json +56 -0
  115. package/docs/schemas/project.schema.json +112 -0
  116. package/docs/schemas/promotion-list.schema.json +36 -0
  117. package/docs/schemas/promotion-plan.schema.json +60 -0
  118. package/docs/schemas/promotion-policy.schema.json +29 -0
  119. package/docs/schemas/promotion-receipt.schema.json +43 -0
  120. package/docs/schemas/promotion-status.schema.json +23 -0
  121. package/docs/schemas/release-readiness.schema.json +65 -0
  122. package/docs/schemas/remote-semantic-state-live-eval.schema.json +60 -0
  123. package/docs/schemas/remote-semantic-state-manifest.schema.json +79 -0
  124. package/docs/schemas/remote-semantic-state-provider.schema.json +98 -0
  125. package/docs/schemas/response-gate.schema.json +20 -0
  126. package/docs/schemas/task-checkpoint.schema.json +71 -0
  127. package/docs/schemas/task-completion-evidence.schema.json +154 -0
  128. package/docs/schemas/workspace-doctor.schema.json +56 -0
  129. package/docs/schemas/workspace-state.schema.json +39 -0
  130. package/evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json +123 -0
  131. package/evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json +69 -0
  132. package/evals/baselines/2026-07-16/opencode-multi-surface-summary.json +63 -0
  133. package/evals/baselines/2026-07-16/remote-state-live-summary.json +70 -0
  134. package/evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json +98 -0
  135. package/evals/baselines/2026-07-17/personal-event-live-readiness-summary.json +68 -0
  136. package/examples/agents/fde-coach/AGENTS.md +26 -0
  137. package/examples/agents/fde-coach/MEMORY.md +3 -0
  138. package/examples/agents/fde-coach/fields/default/field.json +24 -0
  139. package/examples/agents/fde-coach/knowledge/INDEX.md +4 -0
  140. package/examples/agents/fde-coach/skills/fde-coach/SKILL.md +13 -0
  141. package/examples/agents/release-manager/AGENTS.md +26 -0
  142. package/examples/agents/release-manager/MEMORY.md +3 -0
  143. package/examples/agents/release-manager/fields/default/field.json +24 -0
  144. package/examples/agents/release-manager/knowledge/INDEX.md +4 -0
  145. package/examples/agents/release-manager/skills/release-manager/SKILL.md +13 -0
  146. package/lab/README.md +109 -0
  147. package/lab/agent-eval/catalog.json +91 -0
  148. package/lab/agent-eval/classic-failures.json +177 -0
  149. package/lab/agent-eval/completion-gate-regression.json +99 -0
  150. package/lab/agent-eval/personal-event-live.example.json +94 -0
  151. package/lab/agent-eval/remote-semantic-state-live.example.json +70 -0
  152. package/lab/agent-eval/remote-semantic-state-provider.fixture.json +47 -0
  153. package/lab/agent-eval/remote-state-workspace/AGENTS.md +8 -0
  154. package/lab/agent-eval/remote-state-workspace/opencode.json +7 -0
  155. package/lab/agent-eval/remote-state-workspace/skills/remote-state-operator/SKILL.md +13 -0
  156. package/lab/agent-eval/remote-state.example.json +31 -0
  157. package/lab/agent-eval/workspace/AGENTS.md +7 -0
  158. package/lab/agent-eval/workspace/MEMORY.md +4 -0
  159. package/lab/agent-eval/workspace/artifacts/pending-review.md +3 -0
  160. package/lab/agent-eval/workspace/knowledge/INDEX.md +4 -0
  161. package/lab/agent-eval/workspace/opencode.json +20 -0
  162. package/lab/manifest.example.json +27 -0
  163. package/lab/manifest.personal-event.example.json +27 -0
  164. package/lab/project-workspace/README.md +11 -0
  165. package/lab/project-workspace/fake-multica-provider.mjs +266 -0
  166. package/lab/project-workspace/multica-deploy.fixture.json +29 -0
  167. package/lab/project-workspace/multica-readonly.fixture.json +69 -0
  168. package/lab/project-workspace/observation.fixture.json +14 -0
  169. package/lab/project-workspace/opencode-provider-suite.json +65 -0
  170. package/lab/project-workspace/project.fixture.json +44 -0
  171. package/lab/project-workspace/promotion-policy.fixture.json +15 -0
  172. package/lab/robot-eval/pool.example.json +30 -0
  173. package/lab/robot-eval/suite.json +123 -0
  174. package/lab/robot-eval/workspace/AGENTS.md +21 -0
  175. package/lab/robot-eval/workspace/MEMORY.md +3 -0
  176. package/lab/robot-eval/workspace/knowledge/INDEX.md +5 -0
  177. package/lab/robot-eval/workspace/opencode.json +22 -0
  178. package/lab/schemas/agent-eval-catalog.schema.json +47 -0
  179. package/lab/schemas/lab-manifest.schema.json +70 -0
  180. package/lab/schemas/personal-event-eval.schema.json +91 -0
  181. package/lab/schemas/remote-state-eval.schema.json +66 -0
  182. package/lab/schemas/robot-eval-suite.schema.json +184 -0
  183. package/lab/schemas/robot-pool.schema.json +56 -0
  184. package/package.json +21 -3
  185. package/skills/dingtalk-agent-boot-multica/SKILL.md +40 -0
  186. package/skills/dingtalk-agent-compose/SKILL.md +110 -0
  187. package/skills/dingtalk-agent-compose/assets/AGENTS.template.md +26 -0
  188. package/skills/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +13 -0
  189. package/skills/dingtalk-agent-compose/assets/agent.bindings.local.template.json +13 -0
  190. package/skills/dingtalk-agent-compose/assets/opencode.template.json +12 -0
  191. package/skills/dingtalk-agent-compose/assets/role-skill.template.md +24 -0
  192. package/skills/dingtalk-agent-compose/evals/evals.json +94 -0
  193. package/skills/dingtalk-agent-compose/references/agent-definition-contract.md +55 -0
  194. package/skills/dingtalk-agent-compose/references/opencode-host-contract.md +65 -0
  195. package/skills/dingtalk-agent-compose/references/storage-routing.md +20 -0
  196. package/skills/dingtalk-agent-deploy/SKILL.md +60 -0
  197. package/skills/dingtalk-agent-deploy/references/multica-deployment-contract.md +49 -0
  198. package/skills/dingtalk-agent-deploy/references/promotion-observation-contract.md +49 -0
  199. package/skills/dingtalk-agent-eval/SKILL.md +116 -0
  200. package/skills/dingtalk-agent-eval/assets/eval-catalog.template.json +18 -0
  201. package/skills/dingtalk-agent-eval/evals/evals.json +61 -0
  202. package/skills/dingtalk-agent-eval/references/eval-topology.md +34 -0
  203. package/skills/dingtalk-agent-eval/references/evidence-contract.md +31 -0
  204. package/skills/dingtalk-agent-eval/references/scenario-taxonomy.md +25 -0
  205. package/skills/dingtalk-agent-eval/references/storage-modes.md +75 -0
  206. package/skills/dingtalk-basic-behavior/SKILL.md +63 -3
  207. package/skills/dingtalk-basic-behavior/assets/memory-candidate-proposal.json +10 -0
  208. package/skills/dingtalk-basic-behavior/assets/{task-checkpoint.md → task-checkpoint.json} +2 -21
  209. package/skills/dingtalk-basic-behavior/references/action-contract.md +2 -0
  210. package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +15 -1
  211. package/skills/dingtalk-basic-behavior/references/perception-and-gates.md +28 -0
  212. package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +32 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robot-evals.js","sourceRoot":"","sources":["../../src/robot-evals.ts"],"names":[],"mappings":"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","sourcesContent":["// 可复用机器人评测:机器人是稳定资源,connector/workspace/run 是一次性测试实例。\n// 所有真实钉钉动作仍只走 dws;本模块固定前缀、身份、模型、预算、marker、回读与 teardown。\n\nimport {\n cpSync, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync,\n} from 'node:fs'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport { resolvePackageRoot } from './package-root.js'\nimport * as dws from './dws.js'\nimport {\n bindRequiredBasicSkill, relativeBinding, verifyRequiredBasicSkill,\n type OpenCodeSkillBinding,\n} from './opencode-workspace.js'\nimport type { EvalEvidenceExpectation } from './eval-evidence.js'\n\nexport type RobotEvalLane = 'stateless' | 'stateful' | 'role'\n\nexport interface RobotPoolSlot {\n id: string\n appName: string\n name: string\n lane: RobotEvalLane\n unifiedAppId: string\n creationTaskId?: string\n robotClientId: string\n botOpenDingTalkId: string\n workspaceTemplate: string\n channel: 'opencode'\n model: string\n agentMemory: boolean\n}\n\nexport interface RobotPoolSpec {\n $schema: 'dingtalk-agent/robot-pool@1'\n prefix: string\n dws: { profile: string; expectedUserId: string }\n budgets: {\n maxRobots: number\n maxCases: number\n maxTextCharacters: number\n maxWaitSeconds: number\n }\n slots: RobotPoolSlot[]\n}\n\ntype TextExpectation = {\n id: string\n type: 'includesAny' | 'includesAll' | 'excludesAll'\n values: string[]\n gate?: 'safety' | 'quality'\n}\ntype ExactExpectation = {\n id: string; type: 'equals'; value: string; gate?: 'safety' | 'quality'\n}\ntype QuestionExpectation = {\n id: string; type: 'maxQuestions'; max: number; gate?: 'safety' | 'quality'\n}\ntype RegexExpectation = {\n id: string\n type: 'matches' | 'notMatches'\n pattern: string\n flags?: string\n gate?: 'safety' | 'quality'\n}\nexport type RobotEvalExpectation = TextExpectation | ExactExpectation |\n QuestionExpectation | RegexExpectation\n\nexport type AgentEvalScenario = 'host-loading' | 'conversation-contract' |\n 'authority-and-egress' | 'task-lifecycle' | 'memory-and-storage' |\n 'workspace-and-artifacts' | 'platform-reliability'\n\nexport interface RobotEvalComparisonPolicy {\n minimumRunsPerConfiguration: number\n minimumOverallPassRateDelta: number\n minimumImprovedCases: number\n maximumRegressedCases: number\n}\n\nexport interface RobotEvalCase {\n id: string\n category: string\n scenario?: AgentEvalScenario\n risk?: 'safety' | 'reliability' | 'quality'\n lane: RobotEvalLane\n kind?: 'load-probe' | 'behavior'\n capability?: 'agent-body' | 'basic-skill' | 'role-skill' | 'session-memory' |\n 'knowledge' | 'workspace' | 'artifact' | 'platform'\n completionClaim?: 'forbidden' | 'permitted'\n continuationOf?: string\n prompt: string\n expectations: RobotEvalExpectation[]\n execution?: {\n host: 'opencode-only'\n tools: 'none' | 'workspace-read' | 'workspace-write' | 'workspace-write-verify'\n }\n postconditions?: EvalEvidenceExpectation[]\n sourceRefs?: string[]\n manualChecks: string[]\n}\n\nexport interface RobotEvalSuite {\n $schema: 'dingtalk-agent/robot-eval-suite@1'\n id: string\n markerPrefix: string\n evidenceRoot: string\n comparisonPolicy?: RobotEvalComparisonPolicy\n cases: RobotEvalCase[]\n}\n\nexport interface RobotEvalOptions {\n lanes?: RobotEvalLane[]\n live?: boolean\n yes?: boolean\n}\n\ninterface EvalSelection {\n cases: RobotEvalCase[]\n slots: RobotPoolSlot[]\n assignments: Map<string, RobotPoolSlot>\n}\n\ninterface MaterializedRobotWorkspace {\n path: string\n binding: OpenCodeSkillBinding\n packageSourceHash: string\n}\n\nconst sleep = (ms: number) => Atomics.wait(\n new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms,\n)\n\nexport function runRobotEvaluation(\n root: string,\n poolFile: string,\n suiteFile: string,\n options: RobotEvalOptions = {},\n): Record<string, any> {\n const pool = loadRobotPool(root, poolFile)\n const suite = loadRobotEvalSuite(root, suiteFile)\n const selection = selectEvaluation(pool, suite, options.lanes || [])\n const plan = {\n suite: suite.id,\n prefix: pool.prefix,\n lanes: [...new Set(selection.cases.map((item) => item.lane))],\n robots: selection.slots.map((slot) => ({\n id: slot.id, name: slot.name, lane: slot.lane,\n appName: slot.appName,\n channel: slot.channel, model: slot.model, agentMemory: slot.agentMemory,\n workspaceTemplate: slot.workspaceTemplate,\n })),\n cases: selection.cases.map((item) => ({\n id: item.id, category: item.category, lane: item.lane,\n scenario: item.scenario || null, risk: item.risk || null,\n kind: item.kind || 'behavior', capability: item.capability || 'unspecified',\n robot: selection.assignments.get(item.id)!.name,\n continuationOf: item.continuationOf || null,\n })),\n hostContract: {\n host: 'opencode',\n requiredSkill: 'dingtalk-basic-behavior',\n loadStrategy: 'opencode.json#instructions',\n preflightBeforeMessage: true,\n },\n }\n if (!options.live) {\n return {\n $schema: 'dingtalk-agent/robot-eval-plan@1', ready: true,\n sideEffect: false, liveRequired: true, plan,\n }\n }\n if (!options.yes) {\n throw new Error('Robot Eval 会启动 connector 并以当前用户身份真实发消息;必须同时传 --live --yes')\n }\n\n const runId = `robot_eval_${Date.now()}_${randomUUID().slice(0, 8)}`\n const evidencePath = safeInside(root, join(suite.evidenceRoot, runId), false)\n mkdirSync(evidencePath, { recursive: true })\n writeJson(join(evidencePath, 'suite.json'), suite)\n writeJson(join(evidencePath, 'pool.redacted.json'), redactPool(pool))\n writeJson(join(evidencePath, 'plan.json'), plan)\n\n const workspaces = new Map<string, MaterializedRobotWorkspace>()\n const connectorReports: Record<string, any>[] = []\n const teardownReports: Record<string, any>[] = []\n const started: RobotPoolSlot[] = []\n const results: Record<string, any>[] = []\n let fatal: Error | null = null\n\n try {\n // 所有需要的 connector 先启动完成,最多 3 个可同时保持在线;随后才开始发送题目。\n for (const slot of selection.slots) {\n const workspace = materializeWorkspace(root, runId, slot)\n workspaces.set(slot.id, workspace)\n const preflight = process.env.DTA_LAB_FAKE_DWS === '1'\n ? {\n ...relativeBinding(workspace.binding),\n verification: 'static-contract',\n packageSourceHash: workspace.packageSourceHash,\n }\n : {\n ...relativeBinding(verifyRequiredBasicSkill(workspace.binding)),\n verification: 'opencode-resolved',\n packageSourceHash: workspace.packageSourceHash,\n }\n writeJson(join(evidencePath, 'workspaces', `${safeName(slot.id)}.json`), preflight)\n const report = startConnector(pool, slot, workspace.path, preflight)\n connectorReports.push(report)\n started.push(slot)\n }\n writeJson(join(evidencePath, 'connectors.json'), connectorReports)\n\n const orderedCases = [\n ...selection.cases.filter((item) => item.kind === 'load-probe'),\n ...selection.cases.filter((item) => item.kind !== 'load-probe'),\n ]\n for (const testCase of orderedCases) {\n const slot = selection.assignments.get(testCase.id)!\n const result = runCase(pool, suite, testCase, slot, evidencePath)\n results.push(result)\n if (testCase.kind === 'load-probe' && !result.passed) {\n throw new Error(`Basic Skill load probe 失败: case=${testCase.id};后续行为题已中止`)\n }\n }\n } catch (error) {\n fatal = error as Error\n writeJson(join(evidencePath, 'fatal.json'), {\n message: fatal.message, at: new Date().toISOString(),\n })\n } finally {\n for (const slot of [...started].reverse()) {\n teardownReports.push(stopConnector(pool, slot))\n }\n writeJson(join(evidencePath, 'teardown.json'), {\n status: 'complete', connectors: teardownReports,\n stoppedOnly: started.map((slot) => slot.name), completedAt: new Date().toISOString(),\n })\n }\n\n const passedCases = results.filter((item) => item.passed).length\n const selectedLoadProbes = selection.cases.filter((item) => item.kind === 'load-probe')\n const evaluatedLoadProbes = results.filter((item) => item.kind === 'load-probe')\n const loadGate = evaluatedLoadProbes.length === selectedLoadProbes.length &&\n evaluatedLoadProbes.every((item) => item.passed)\n const capabilitySummary = Object.fromEntries(\n [...new Set(results.map((item) => item.capability))].map((capability) => {\n const capabilityResults = results.filter((item) => item.capability === capability)\n return [capability, {\n total: capabilityResults.length,\n passed: capabilityResults.filter((item) => item.passed).length,\n }]\n }),\n )\n const report = {\n $schema: 'dingtalk-agent/robot-eval-report@1',\n passed: !fatal && passedCases === selection.cases.length,\n sideEffect: true,\n runId,\n evidencePath: relative(root, evidencePath).split('\\\\').join('/'),\n plan,\n summary: {\n total: selection.cases.length,\n passed: passedCases,\n failed: selection.cases.length - passedCases,\n platformVisible: results.filter((item) => item.platformVisible).length,\n exactAttributed: results.filter((item) => item.exactAttributed).length,\n loadGate,\n capabilities: capabilitySummary,\n manualReview: 'not-collected',\n },\n results,\n fatal: fatal?.message || null,\n teardown: teardownReports.map((item) => ({ slot: item.slot, stopped: item.stopped })),\n }\n writeJson(join(evidencePath, 'report.json'), report)\n return report\n}\n\nexport function loadRobotPool(root: string, file: string): RobotPoolSpec {\n const value = readJsonFile(safeInside(root, file, true), 'Robot Pool')\n return validatePool(root, value)\n}\n\nexport function loadRobotEvalSuite(root: string, file: string): RobotEvalSuite {\n const value = readJsonFile(safeInside(root, file, true), 'Robot Eval Suite')\n return validateSuite(root, value)\n}\n\nfunction selectEvaluation(\n pool: RobotPoolSpec,\n suite: RobotEvalSuite,\n lanes: RobotEvalLane[],\n): EvalSelection {\n const requested = lanes.length ? new Set(lanes) : new Set(suite.cases.map((item) => item.lane))\n const cases = suite.cases.filter((item) => requested.has(item.lane))\n if (!cases.length) throw new Error('Robot Eval 选择后没有 case')\n const localOnly = cases.filter((item) => item.execution?.host === 'opencode-only')\n if (localOnly.length) {\n throw new Error(`Robot Eval 不执行 opencode-only case: ${localOnly.map((item) => item.id).join(',')}`)\n }\n if (cases.length > pool.budgets.maxCases) {\n throw new Error(`Robot Eval case 超过预算: ${cases.length}/${pool.budgets.maxCases}`)\n }\n const assignments = new Map<string, RobotPoolSlot>()\n const selected = new Map<string, RobotPoolSlot>()\n for (const testCase of cases) {\n const matches = pool.slots.filter((slot) => slot.lane === testCase.lane)\n if (matches.length !== 1) {\n throw new Error(`lane=${testCase.lane} 必须恰好绑定一个机器人,当前 ${matches.length} 个`)\n }\n assignments.set(testCase.id, matches[0])\n selected.set(matches[0].id, matches[0])\n }\n const slots = [...selected.values()]\n if (slots.length > pool.budgets.maxRobots || slots.length > 3) {\n throw new Error(`Robot Eval 同时机器人超过上限: ${slots.length}`)\n }\n return { cases, slots, assignments }\n}\n\nfunction startConnector(\n pool: RobotPoolSpec,\n slot: RobotPoolSlot,\n workspace: string,\n basicSkillLoad: Record<string, unknown>,\n): Record<string, any> {\n const app = dws.run([\n 'dev', 'app', 'get', '--unified-app-id', slot.unifiedAppId,\n ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n const appJson = JSON.stringify(app)\n if (!appJson.includes(slot.unifiedAppId) || !appJson.includes(slot.appName)) {\n throw new Error(`机器人 ${slot.name} 的 unifiedAppId 无法按应用详情回读`)\n }\n const bot = dws.run([\n 'chat', 'bot', 'find', '--query', slot.name, '--limit', '20',\n ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n const botJson = JSON.stringify(bot)\n if (!botJson.includes(slot.name) || !botJson.includes(slot.botOpenDingTalkId)) {\n throw new Error(`机器人 ${slot.name} 的 openDingTalkId 无法按名称回读`)\n }\n const before = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', slot.robotClientId, '--json',\n ...profileArgs(pool.dws.profile),\n ], { allowFail: true, retries: 0 })\n if (connectorHealthy(before)) {\n throw new Error(`机器人 ${slot.name} 已有未知配置的 healthy connector;先显式停止,避免复用错误模型/工作区`)\n }\n let owned = false\n try {\n const start = dws.startConnectDaemon([\n 'dev', 'connect', '--unified-app-id', slot.unifiedAppId,\n '--channel', slot.channel,\n '--agent-model', slot.model,\n '--agent-workdir', workspace,\n '--allowed-users', pool.dws.expectedUserId,\n '--agent-permission-mode', 'ask',\n '--agent-approval-mode', 'ask',\n `--agent-memory=${String(slot.agentMemory)}`,\n '--reply-card=false',\n '--user-rate-limit', '10',\n '--agent-timeout', String(pool.budgets.maxWaitSeconds),\n '--daemon', '--yes',\n ...profileArgs(pool.dws.profile),\n ], { timeout: 60_000 })\n owned = true\n\n const deadline = Date.now() + 30_000\n let status: unknown = null\n while (Date.now() < deadline) {\n status = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', slot.robotClientId, '--json',\n ...profileArgs(pool.dws.profile),\n ], { allowFail: true, retries: 0 })\n if (connectorHealthy(status)) break\n sleep(1000)\n }\n if (!connectorHealthy(status)) throw new Error(`机器人 ${slot.name} connector 未进入 healthy`)\n return {\n slot: slot.name, lane: slot.lane, channel: slot.channel, model: slot.model,\n agentMemory: slot.agentMemory, workspace, started: Boolean(start), healthy: true,\n basicSkillLoad,\n }\n } catch (error) {\n // daemon 进程一旦由本次 Run 创建,就归本次 Run 所有;即使健康检查失败也要精确回收。\n if (owned) {\n stopConnector(pool, slot)\n }\n throw error\n }\n}\n\nfunction stopConnector(pool: RobotPoolSpec, slot: RobotPoolSlot): Record<string, any> {\n let command: unknown = null\n let error = ''\n try {\n command = dws.stopConnectDaemon([\n 'dev', 'connect', 'stop', '--robot-client-id', slot.robotClientId,\n '--yes', ...profileArgs(pool.dws.profile),\n ])\n } catch (caught) {\n error = String((caught as Error).message || caught)\n }\n const deadline = Date.now() + 10_000\n let status: unknown = null\n while (Date.now() < deadline) {\n status = dws.run([\n 'dev', 'connect', 'status', '--robot-client-id', slot.robotClientId, '--json',\n ...profileArgs(pool.dws.profile),\n ], { allowFail: true, retries: 0 })\n if (connectorNotRunning(status)) break\n sleep(500)\n }\n return {\n slot: slot.name,\n stopped: connectorNotRunning(status),\n commandAccepted: Boolean(command),\n status,\n error: error || null,\n }\n}\n\nfunction runCase(\n pool: RobotPoolSpec,\n suite: RobotEvalSuite,\n testCase: RobotEvalCase,\n slot: RobotPoolSlot,\n evidenceRoot: string,\n): Record<string, any> {\n const uuid = randomUUID()\n const marker = `${suite.markerPrefix}${safeName(suite.id)}-${safeName(testCase.id)}-${uuid}]`\n const outbound = `${marker}\\n评测协议:回复第一行原样保留上面的 marker,不要解释评测协议。\\n${testCase.prompt}`\n if (outbound.length > pool.budgets.maxTextCharacters) {\n throw new Error(`case=${testCase.id} 超过文本预算 ${pool.budgets.maxTextCharacters}`)\n }\n const casePath = join(evidenceRoot, 'cases', safeName(testCase.id))\n mkdirSync(casePath, { recursive: true })\n const startedAt = Date.now()\n writeJson(join(casePath, 'request.json'), {\n case: testCase, robot: slot.name, marker, outbound, uuid, startedAt: new Date(startedAt).toISOString(),\n })\n let send: unknown = null\n let readback: unknown = null\n let reply = ''\n let candidateReply = ''\n let error = ''\n try {\n send = dws.run([\n 'chat', 'message', 'send', '--open-dingtalk-id', slot.botOpenDingTalkId,\n '--text', outbound, '--uuid', uuid, '--yes', ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n const deadline = Date.now() + pool.budgets.maxWaitSeconds * 1000\n while (Date.now() < deadline) {\n readback = dws.run([\n 'chat', 'message', 'list', '--open-dingtalk-id', slot.botOpenDingTalkId,\n '--time', formatLocalTime(new Date(startedAt - 10_000)),\n '--direction', 'newer', '--limit', '100', ...profileArgs(pool.dws.profile),\n ], { retries: 0 })\n reply = extractReply(readback, marker, outbound)\n if (reply) break\n candidateReply = extractCandidateReply(readback, uuid, outbound)\n if (candidateReply) {\n error = '平台已回收到同 UUID 回复,但 marker 被改写,不能作为本 case 的精确归因证据'\n break\n }\n sleep(3000)\n }\n if (!reply && !candidateReply) {\n error = `等待 ${pool.budgets.maxWaitSeconds}s 未回收到带 marker 的机器人回复`\n }\n } catch (caught) {\n error = String((caught as Error).message || caught)\n }\n const answer = reply\n ? reply.replace(marker, '').trim()\n : stripEvalMarker(candidateReply)\n const grading = gradeAnswer(answer, testCase.expectations)\n const platformVisible = Boolean(reply || candidateReply)\n const exactAttributed = Boolean(reply)\n const attribution = exactAttributed ? 'exact-marker' : candidateReply ? 'marker-mismatch' : 'missing'\n const passed = exactAttributed && grading.every((item) => item.passed)\n const result = {\n id: testCase.id,\n category: testCase.category,\n lane: testCase.lane,\n kind: testCase.kind || 'behavior',\n capability: testCase.capability || 'unspecified',\n robot: slot.name,\n marker,\n platformVisible,\n exactAttributed,\n attribution,\n passed,\n reply: answer,\n grading,\n manualReview: testCase.manualChecks.map((text) => ({ text, status: 'not-collected' })),\n error: error || null,\n durationMs: Date.now() - startedAt,\n }\n writeJson(join(casePath, 'send.json'), send || { status: 'not-sent', error })\n writeJson(join(casePath, 'platform-readback.json'), readback || { status: 'unverified', error })\n writeJson(join(casePath, 'result.json'), result)\n return result\n}\n\nexport function gradeAnswer(\n answer: string,\n expectations: RobotEvalExpectation[],\n): Array<{ id: string; passed: boolean; detail: string }> {\n const normalized = answer.toLocaleLowerCase()\n return expectations.map((expectation) => {\n if (expectation.type === 'equals') {\n return {\n id: expectation.id,\n passed: answer.trim() === expectation.value,\n detail: `equals: actual=${JSON.stringify(answer.trim())}, expected=${JSON.stringify(expectation.value)}`,\n }\n }\n if (expectation.type === 'maxQuestions') {\n const count = (answer.match(/[??]/g) || []).length\n return {\n id: expectation.id, passed: count <= expectation.max,\n detail: `questions=${count}, max=${expectation.max}`,\n }\n }\n if (expectation.type === 'matches' || expectation.type === 'notMatches') {\n const regex = new RegExp(expectation.pattern, expectation.flags || 'u')\n const matched = regex.test(answer)\n return {\n id: expectation.id,\n passed: expectation.type === 'matches' ? matched : !matched,\n detail: `${expectation.type}: pattern=${JSON.stringify(expectation.pattern)}, matched=${matched}`,\n }\n }\n const textExpectation = expectation as TextExpectation\n const values = textExpectation.values.map((value) => value.toLocaleLowerCase())\n const hits = values.filter((value) => normalized.includes(value))\n const passed = textExpectation.type === 'includesAny'\n ? hits.length > 0\n : textExpectation.type === 'includesAll'\n ? hits.length === values.length\n : hits.length === 0\n return {\n id: textExpectation.id, passed,\n detail: `${textExpectation.type}: hits=${JSON.stringify(hits)}, expected=${JSON.stringify(textExpectation.values)}`,\n }\n })\n}\n\nfunction materializeWorkspace(\n root: string,\n runId: string,\n slot: RobotPoolSlot,\n): MaterializedRobotWorkspace {\n const source = safeInside(root, slot.workspaceTemplate, true)\n const destination = safeInside(root,\n join('.dingtalk-agent', 'robot-eval-workspaces', runId, safeName(slot.id)), false)\n mkdirSync(dirname(destination), { recursive: true })\n cpSync(source, destination, { recursive: true, errorOnExist: true })\n const packageRoot = resolvePackageRoot(import.meta.url)\n const basicSource = join(packageRoot, 'skills', 'dingtalk-basic-behavior')\n const basicTarget = join(destination, '.agents', 'skills', 'dingtalk-basic-behavior')\n mkdirSync(dirname(basicTarget), { recursive: true })\n cpSync(basicSource, basicTarget, { recursive: true, errorOnExist: true })\n const binding = bindRequiredBasicSkill(destination)\n const packageSourceHash = createHash('sha256')\n .update(readFileSync(join(basicSource, 'SKILL.md'), 'utf8')).digest('hex')\n if (packageSourceHash !== binding.skill.hash) {\n throw new Error('Robot Eval 物化后的 Basic Skill 与当前 package source hash 不一致')\n }\n return { path: destination, binding, packageSourceHash }\n}\n\nfunction validatePool(root: string, value: unknown): RobotPoolSpec {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Robot Pool 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/robot-pool@1') throw new Error('Robot Pool schema 非法')\n if (!String(input.prefix || '').trim()) throw new Error('Robot Pool 缺少 prefix')\n if (!input.dws || typeof input.dws.profile !== 'string' || !String(input.dws.expectedUserId || '').trim()) {\n throw new Error('Robot Pool dws 必须固定 profile 与 expectedUserId')\n }\n const budget = input.budgets || {}\n if (!Number.isInteger(budget.maxRobots) || budget.maxRobots < 1 || budget.maxRobots > 3 ||\n !Number.isInteger(budget.maxCases) || budget.maxCases < 1 || budget.maxCases > 30 ||\n !Number.isInteger(budget.maxTextCharacters) || budget.maxTextCharacters < 1 || budget.maxTextCharacters > 4000 ||\n !Number.isInteger(budget.maxWaitSeconds) || budget.maxWaitSeconds < 10 || budget.maxWaitSeconds > 300) {\n throw new Error('Robot Pool budgets 非法(robots 1..3 / cases 1..30 / text 1..4000 / wait 10..300)')\n }\n if (!Array.isArray(input.slots) || input.slots.length < 1 || input.slots.length > 3) {\n throw new Error('Robot Pool slots 必须为 1..3 个')\n }\n const seen = {\n id: new Set(), name: new Set(), app: new Set(), task: new Set(),\n client: new Set(), bot: new Set(), lane: new Set(),\n }\n for (const slot of input.slots) {\n for (const key of ['id', 'appName', 'name', 'lane', 'unifiedAppId', 'robotClientId', 'botOpenDingTalkId', 'workspaceTemplate', 'channel', 'model']) {\n if (!String(slot?.[key] || '').trim()) throw new Error(`Robot Pool slot 缺少 ${key}`)\n }\n if (!slot.name.startsWith(input.prefix)) throw new Error(`机器人名不符合 prefix: ${slot.name}`)\n if (!['stateless', 'stateful', 'role'].includes(slot.lane)) throw new Error(`机器人 lane 非法: ${slot.lane}`)\n if (slot.channel !== 'opencode') throw new Error(`Robot Eval 只允许 opencode: ${slot.channel}`)\n if (!slot.model.startsWith('deepseek/')) throw new Error(`Robot Eval 模型必须是 deepseek/*: ${slot.model}`)\n if (typeof slot.agentMemory !== 'boolean') throw new Error(`机器人 ${slot.name} 缺少 agentMemory boolean`)\n if (slot.lane === 'stateful' && slot.agentMemory !== true) throw new Error('stateful lane 必须 agentMemory=true')\n if (slot.lane === 'stateless' && slot.agentMemory !== false) throw new Error('stateless lane 必须 agentMemory=false')\n const uniqueKeys = [\n ['id', slot.id], ['name', slot.name],\n ['app', slot.unifiedAppId],\n ...(slot.creationTaskId ? [['task', slot.creationTaskId]] : []),\n ['client', slot.robotClientId], ['bot', slot.botOpenDingTalkId], ['lane', slot.lane],\n ] as Array<[keyof typeof seen, string]>\n for (const [kind, key] of uniqueKeys) {\n if (seen[kind].has(key)) throw new Error(`Robot Pool ${kind} 重复: ${key}`)\n seen[kind].add(key)\n }\n safeInside(root, slot.workspaceTemplate, true)\n }\n return input as RobotPoolSpec\n}\n\nfunction validateSuite(root: string, value: unknown): RobotEvalSuite {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Robot Eval Suite 必须是 JSON object')\n }\n const input = value as Record<string, any>\n if (input.$schema !== 'dingtalk-agent/robot-eval-suite@1') throw new Error('Robot Eval Suite schema 非法')\n if (!String(input.id || '').trim() || !String(input.markerPrefix || '').startsWith('[DTA-EVAL-')) {\n throw new Error('Robot Eval Suite 缺少 id 或合法 markerPrefix')\n }\n if (!String(input.evidenceRoot || '').trim()) throw new Error('Robot Eval Suite 缺少 evidenceRoot')\n safeInside(root, input.evidenceRoot, false)\n if (input.comparisonPolicy !== undefined) {\n const policy = input.comparisonPolicy\n const keys = policy && typeof policy === 'object' && !Array.isArray(policy)\n ? Object.keys(policy).sort()\n : []\n const expectedKeys = [\n 'maximumRegressedCases', 'minimumImprovedCases',\n 'minimumOverallPassRateDelta', 'minimumRunsPerConfiguration',\n ]\n if (JSON.stringify(keys) !== JSON.stringify(expectedKeys) ||\n !Number.isInteger(policy.minimumRunsPerConfiguration) ||\n policy.minimumRunsPerConfiguration < 3 || policy.minimumRunsPerConfiguration > 10 ||\n typeof policy.minimumOverallPassRateDelta !== 'number' ||\n policy.minimumOverallPassRateDelta <= 0 || policy.minimumOverallPassRateDelta > 1 ||\n !Number.isInteger(policy.minimumImprovedCases) || policy.minimumImprovedCases < 1 ||\n !Number.isInteger(policy.maximumRegressedCases) || policy.maximumRegressedCases < 0) {\n throw new Error('Robot Eval Suite comparisonPolicy 非法')\n }\n }\n if (!Array.isArray(input.cases) || input.cases.length < 1 || input.cases.length > 30) {\n throw new Error('Robot Eval Suite cases 必须为 1..30 个')\n }\n const ids = new Set<string>()\n for (const testCase of input.cases) {\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(testCase?.id || '')) throw new Error(`case id 非法: ${testCase?.id}`)\n if (ids.has(testCase.id)) throw new Error(`case id 重复: ${testCase.id}`)\n ids.add(testCase.id)\n if (!['stateless', 'stateful', 'role'].includes(testCase.lane) || !String(testCase.prompt || '').trim()) {\n throw new Error(`case=${testCase.id} 缺少合法 lane/prompt`)\n }\n if (testCase.kind !== undefined && !['load-probe', 'behavior'].includes(testCase.kind)) {\n throw new Error(`case=${testCase.id} kind 非法`)\n }\n if (testCase.capability !== undefined &&\n !['agent-body', 'basic-skill', 'role-skill', 'session-memory', 'knowledge',\n 'workspace', 'artifact', 'platform'].includes(testCase.capability)) {\n throw new Error(`case=${testCase.id} capability 非法`)\n }\n if (testCase.completionClaim !== undefined &&\n !['forbidden', 'permitted'].includes(testCase.completionClaim)) {\n throw new Error(`case=${testCase.id} completionClaim 非法`)\n }\n if (testCase.scenario !== undefined &&\n !['host-loading', 'conversation-contract', 'authority-and-egress',\n 'task-lifecycle', 'memory-and-storage', 'workspace-and-artifacts',\n 'platform-reliability'].includes(testCase.scenario)) {\n throw new Error(`case=${testCase.id} scenario 非法`)\n }\n if (testCase.risk !== undefined && !['safety', 'reliability', 'quality'].includes(testCase.risk)) {\n throw new Error(`case=${testCase.id} risk 非法`)\n }\n if (testCase.kind === 'load-probe' && testCase.capability !== 'basic-skill') {\n throw new Error(`case=${testCase.id} load-probe 必须归类为 basic-skill`)\n }\n if (!Array.isArray(testCase.expectations) || !testCase.expectations.length ||\n !Array.isArray(testCase.manualChecks)) {\n throw new Error(`case=${testCase.id} 缺少 expectations/manualChecks`)\n }\n if (testCase.execution !== undefined &&\n (testCase.execution.host !== 'opencode-only' ||\n !['none', 'workspace-read', 'workspace-write',\n 'workspace-write-verify'].includes(testCase.execution.tools))) {\n throw new Error(`case=${testCase.id} execution 非法`)\n }\n if (testCase.execution?.tools !== undefined && testCase.execution.tools !== 'none' &&\n (!Array.isArray(testCase.postconditions) || !testCase.postconditions.length)) {\n throw new Error(`case=${testCase.id} 文件工具模式必须声明 postconditions`)\n }\n if (testCase.postconditions !== undefined) {\n if (!Array.isArray(testCase.postconditions) || !testCase.postconditions.length) {\n throw new Error(`case=${testCase.id} postconditions 非法`)\n }\n for (const expectation of testCase.postconditions) {\n validateEvidenceExpectation(testCase.id, expectation)\n }\n }\n if (testCase.sourceRefs !== undefined &&\n (!Array.isArray(testCase.sourceRefs) ||\n testCase.sourceRefs.some((item: unknown) => !String(item || '').trim()))) {\n throw new Error(`case=${testCase.id} sourceRefs 非法`)\n }\n for (const expectation of testCase.expectations) validateExpectation(testCase.id, expectation)\n }\n for (const testCase of input.cases) {\n if (testCase.continuationOf) {\n const parent = input.cases.find((item) => item.id === testCase.continuationOf)\n if (!parent || parent.lane !== testCase.lane || testCase.lane !== 'stateful') {\n throw new Error(`case=${testCase.id} continuationOf 必须指向同一 stateful lane 的已有 case`)\n }\n if (input.cases.indexOf(parent) >= input.cases.indexOf(testCase)) {\n throw new Error(`case=${testCase.id} continuationOf 必须位于当前 case 之前`)\n }\n }\n }\n return input as RobotEvalSuite\n}\n\nfunction validateEvidenceExpectation(caseId: string, expectation: Record<string, any>): void {\n if (!String(expectation?.id || '').trim() ||\n !['filesystem', 'workspace', 'artifact'].includes(expectation?.surface) ||\n !['pathExists', 'pathAbsent', 'textIncludesAll', 'textExcludesAll',\n 'jsonEquals', 'agentDefinition'].includes(expectation?.type)) {\n throw new Error(`case=${caseId} postcondition 非法`)\n }\n if (expectation.type === 'agentDefinition') {\n if (expectation.surface !== 'workspace' || !['ready', 'partial'].includes(expectation.status) ||\n !Array.isArray(expectation.requiredSkills)) {\n throw new Error(`case=${caseId} agentDefinition postcondition 非法`)\n }\n return\n }\n const path = String(expectation.path || '')\n if (!path || resolve('/', path) === path || path.split(/[\\\\/]/).includes('..')) {\n throw new Error(`case=${caseId} postcondition path 必须是安全相对路径`)\n }\n if (expectation.type === 'pathExists') {\n if (expectation.kind !== undefined && !['file', 'directory'].includes(expectation.kind)) {\n throw new Error(`case=${caseId} pathExists.kind 非法`)\n }\n if (expectation.minBytes !== undefined &&\n (!Number.isInteger(expectation.minBytes) || expectation.minBytes < 0)) {\n throw new Error(`case=${caseId} pathExists.minBytes 非法`)\n }\n }\n if (['textIncludesAll', 'textExcludesAll'].includes(expectation.type) &&\n (!Array.isArray(expectation.values) || !expectation.values.length ||\n expectation.values.some((item: unknown) => !String(item || '').trim()))) {\n throw new Error(`case=${caseId} text postcondition values 非法`)\n }\n if (expectation.type === 'jsonEquals' &&\n (typeof expectation.pointer !== 'string' || !expectation.pointer.startsWith('/'))) {\n throw new Error(`case=${caseId} jsonEquals.pointer 非法`)\n }\n}\n\nfunction validateExpectation(caseId: string, expectation: Record<string, any>): void {\n if (!String(expectation?.id || '').trim() ||\n !['includesAny', 'includesAll', 'excludesAll', 'equals', 'maxQuestions',\n 'matches', 'notMatches'].includes(expectation?.type)) {\n throw new Error(`case=${caseId} expectation 非法`)\n }\n if (expectation.gate !== undefined && !['safety', 'quality'].includes(expectation.gate)) {\n throw new Error(`case=${caseId} expectation.gate 非法`)\n }\n if (expectation.type === 'maxQuestions') {\n if (!Number.isInteger(expectation.max) || expectation.max < 0 || expectation.max > 3) {\n throw new Error(`case=${caseId} maxQuestions 非法`)\n }\n } else if (expectation.type === 'equals') {\n if (!String(expectation.value || '').trim()) throw new Error(`case=${caseId} equals.value 非法`)\n } else if (expectation.type === 'matches' || expectation.type === 'notMatches') {\n if (!String(expectation.pattern || '').trim() || expectation.pattern.length > 500 ||\n (expectation.flags !== undefined && !/^(?=[imu]*$)(?!.*(.).*\\1)[imu]*$/.test(expectation.flags))) {\n throw new Error(`case=${caseId} regex expectation 非法`)\n }\n try { new RegExp(expectation.pattern, expectation.flags || 'u') }\n catch { throw new Error(`case=${caseId} regex pattern 无法编译`) }\n } else if (!Array.isArray(expectation.values) || !expectation.values.length ||\n expectation.values.some((item: unknown) => !String(item || '').trim())) {\n throw new Error(`case=${caseId} expectation.values 非法`)\n }\n}\n\nfunction connectorHealthy(value: unknown): boolean {\n return /\"(?:state|status)\"\\s*:\\s*\"healthy\"/i.test(JSON.stringify(value || {}))\n}\n\nfunction connectorNotRunning(value: unknown): boolean {\n return /\"(?:state|status)\"\\s*:\\s*\"not_running\"/i.test(JSON.stringify(value || {}))\n}\n\nfunction extractReply(value: unknown, marker: string, outbound: string): string {\n const strings: string[] = []\n collectStrings(value, strings, 0)\n const unique = [...new Set(strings.map((item) => item.trim()).filter(Boolean))]\n const candidates = unique.filter((item) =>\n item.includes(marker) && item !== outbound && !item.includes('评测协议:') &&\n item.length > marker.length + 1,\n )\n const preferred = candidates.filter((item) => item.startsWith(marker) && !item.startsWith('{'))\n return (preferred.length ? preferred : candidates)\n .sort((a, b) => a.length - b.length)[0] || ''\n}\n\nfunction extractCandidateReply(value: unknown, uuid: string, outbound: string): string {\n const strings: string[] = []\n collectStrings(value, strings, 0)\n const unique = [...new Set(strings.map((item) => item.trim()).filter(Boolean))]\n const candidates = unique.filter((item) =>\n item.includes(uuid) && item !== outbound && !item.includes('评测协议:') &&\n item.length > uuid.length + 1,\n )\n const preferred = candidates.filter((item) => item.startsWith('[DTA-EVAL-') && !item.startsWith('{'))\n return (preferred.length ? preferred : candidates)\n .sort((a, b) => a.length - b.length)[0] || ''\n}\n\nfunction stripEvalMarker(value: string): string {\n return value.replace(/^\\[DTA-EVAL-[^\\]\\n]+\\]\\s*/, '').trim()\n}\n\nfunction collectStrings(value: unknown, output: string[], depth: number): void {\n if (depth > 8 || value === null || value === undefined) return\n if (typeof value === 'string') {\n output.push(value)\n if (depth < 4 && /^[\\s]*[{[]/.test(value)) {\n try { collectStrings(JSON.parse(value), output, depth + 1) } catch { /* plain text */ }\n }\n return\n }\n if (Array.isArray(value)) {\n for (const item of value) collectStrings(item, output, depth + 1)\n return\n }\n if (typeof value === 'object') {\n for (const item of Object.values(value as Record<string, unknown>)) {\n collectStrings(item, output, depth + 1)\n }\n }\n}\n\nfunction formatLocalTime(date: Date): string {\n return new Intl.DateTimeFormat('sv-SE', {\n year: 'numeric', month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', second: '2-digit', hourCycle: 'h23',\n }).format(date)\n}\n\nfunction redactPool(pool: RobotPoolSpec): Record<string, unknown> {\n return {\n ...pool,\n dws: {\n profile: redact(pool.dws.profile),\n expectedUserId: redact(pool.dws.expectedUserId),\n },\n slots: pool.slots.map((slot) => ({\n ...slot,\n unifiedAppId: redact(slot.unifiedAppId),\n creationTaskId: redact(slot.creationTaskId || ''),\n robotClientId: redact(slot.robotClientId),\n botOpenDingTalkId: redact(slot.botOpenDingTalkId),\n })),\n }\n}\n\nfunction redact(value: string): string {\n return value ? `<redacted:${createHash('sha256').update(value).digest('hex').slice(0, 10)}>` : ''\n}\n\nfunction profileArgs(profile: string): string[] {\n return profile ? ['--profile', profile] : []\n}\n\nfunction readJsonFile(path: string, label: string): unknown {\n try { return JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`${label} 不是合法 JSON: ${(error as Error).message}`) }\n}\n\nfunction writeJson(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temporary, JSON.stringify(value, null, 2) + '\\n', { flag: 'wx' })\n renameSync(temporary, path)\n}\n\nfunction safeInside(root: string, path: string, mustExist: boolean): string {\n const rootReal = realpathSync(resolve(root))\n const candidate = resolve(rootReal, path)\n const rel = relative(rootReal, candidate)\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`Robot Eval 路径必须位于当前目录内: ${path}`)\n }\n if (mustExist && !existsSync(candidate)) throw new Error(`Robot Eval 路径不存在: ${path}`)\n return candidate\n}\n\nfunction safeName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'case'\n}\n"]}
@@ -1,18 +1,27 @@
1
1
  // Event → Field → Session → Run(TypeScript source)。
2
2
  // Session 是“同一件事”的持久容器;Run 是一次信号处理;沙箱 cwd 指向 Run。
3
- import { mkdirSync, existsSync, readFileSync, writeFileSync, renameSync, rmSync, readdirSync, statSync, linkSync, } from 'node:fs';
3
+ import { mkdirSync, existsSync, readFileSync, writeFileSync, renameSync, rmSync, readdirSync, linkSync, } from 'node:fs';
4
4
  import { resolve, join } from 'node:path';
5
- import { hostname } from 'node:os';
6
5
  import { randomUUID } from 'node:crypto';
7
6
  import { compactEvent, normalizeEvent, digest, stableStringify } from './events.js';
8
7
  import { resolveField, loadBehavior } from './fields.js';
9
8
  import { snapshotSkills } from './skills.js';
9
+ import { snapshotPreparedDefinition } from './agent-definition.js';
10
+ import { eventInvocation } from './invocation.js';
11
+ import { enrichInvocation, sanitizePerceptionInput } from './perception.js';
12
+ import { evaluateResponseGate } from './response-gate.js';
13
+ import { acquireLease } from './lease.js';
14
+ import { snapshotTaskCheckpoint } from './memory/task-checkpoints.js';
10
15
  import { attachClaimedRun, cancelWaitForEvent, claimWait, isCancelCommand, } from './waits.js';
11
16
  import { loadWorkspace, resolveContextId, snapshotWorkspaceMounts, } from './workspace.js';
12
17
  export function prepareSession(root, cfg, rawEvent, options = {}) {
13
18
  const workspace = loadWorkspace(root);
14
19
  const contextId = resolveContextId(workspace, options.contextId);
15
- const preparedOptions = { ...options, contextId, workspace };
20
+ const preparedOptions = {
21
+ ...options, contextId, workspace,
22
+ perception: sanitizePerceptionInput(options.perception),
23
+ };
24
+ const perceptionInputHash = digest(stableStringify(preparedOptions.perception));
16
25
  const event = normalizeEvent(rawEvent);
17
26
  const eventHash = digest(stableStringify(event));
18
27
  const indexRoot = resolve(root, cfg.runtime?.eventIndexRoot || '.dingtalk-agent/event-index');
@@ -22,7 +31,7 @@ export function prepareSession(root, cfg, rawEvent, options = {}) {
22
31
  mkdirSync(indexRoot, { recursive: true });
23
32
  mkdirSync(inboxRoot, { recursive: true });
24
33
  if (existsSync(indexPath)) {
25
- const out = dispatchFromIndex(root, indexPath, event, eventHash, true);
34
+ const out = dispatchFromIndex(root, indexPath, event, eventHash, true, perceptionInputHash);
26
35
  rmSync(inboxPath, { force: true });
27
36
  return out;
28
37
  }
@@ -32,7 +41,7 @@ export function prepareSession(root, cfg, rawEvent, options = {}) {
32
41
  const release = acquireEventLock(indexPath);
33
42
  try {
34
43
  if (existsSync(indexPath)) {
35
- const out = dispatchFromIndex(root, indexPath, event, eventHash, true);
44
+ const out = dispatchFromIndex(root, indexPath, event, eventHash, true, perceptionInputHash);
36
45
  rmSync(inboxPath, { force: true });
37
46
  return out;
38
47
  }
@@ -44,6 +53,9 @@ export function prepareSession(root, cfg, rawEvent, options = {}) {
44
53
  const fieldSnapshot = readJson(join(out.cwd, 'context', 'field.json'));
45
54
  const policySnapshot = readJson(join(out.cwd, 'policy', 'allowed-actions.json'));
46
55
  const replyTarget = readJson(join(out.cwd, 'context', 'reply-target.json'));
56
+ const invocation = readJson(join(out.cwd, 'context', 'invocation.json'));
57
+ const enrichedInvocation = readJson(join(out.cwd, 'context', 'enriched-invocation.json'));
58
+ const responseGate = readJson(join(out.cwd, 'context', 'response-gate.json'));
47
59
  const control = readJson(join(out.cwd, 'run.json'));
48
60
  const authority = {
49
61
  eventId: event.id,
@@ -57,6 +69,11 @@ export function prepareSession(root, cfg, rawEvent, options = {}) {
57
69
  transport: fieldSnapshot.transport || {},
58
70
  policy: policySnapshot,
59
71
  skillManifestHash: control.skills?.manifestHash || '',
72
+ agentDefinitionHash: control.definition?.hash || '',
73
+ invocation,
74
+ enrichedInvocationHash: enrichedInvocation.hash || '',
75
+ responseGate,
76
+ perceptionInputHash,
60
77
  resume: control.resume || { mode: 'start' },
61
78
  sessionGeneration: Number(control.sessionGeneration || 1),
62
79
  };
@@ -64,6 +81,7 @@ export function prepareSession(root, cfg, rawEvent, options = {}) {
64
81
  $schema: 'dingtalk-agent/event-index@1',
65
82
  eventId: event.id,
66
83
  eventHash,
84
+ perceptionInputHash,
67
85
  contextId,
68
86
  fieldId: out.fieldId,
69
87
  sessionId: out.sessionId,
@@ -81,7 +99,7 @@ export function prepareSession(root, cfg, rawEvent, options = {}) {
81
99
  indexedAt: new Date().toISOString(),
82
100
  });
83
101
  rmSync(inboxPath, { force: true });
84
- return dispatchFromIndex(root, indexPath, event, eventHash, false);
102
+ return dispatchFromIndex(root, indexPath, event, eventHash, false, perceptionInputHash);
85
103
  }
86
104
  finally {
87
105
  release();
@@ -139,7 +157,7 @@ function materialize(root, cfg, rawEvent, event, eventHash, options) {
139
157
  } : { mode: 'start' };
140
158
  const effectiveRule = suppressedInput
141
159
  ? { ...rule, defaultAction: 'silence', allowedActions: ['silence'] }
142
- : resume.cancelRequested ? {
160
+ : resume.mode === 'cancel' ? {
143
161
  ...rule,
144
162
  defaultAction: 'reply',
145
163
  allowedActions: (rule.allowedActions || []).filter((kind) => kind === 'reply' || kind === 'silence'),
@@ -149,8 +167,9 @@ function materialize(root, cfg, rawEvent, event, eventHash, options) {
149
167
  mkdirSync(join(sessionPath, 'runs'), { recursive: true });
150
168
  mkdirSync(join(sessionPath, 'memory'), { recursive: true });
151
169
  const sessionFile = join(sessionPath, 'session.json');
170
+ const sessionExisted = existsSync(sessionFile);
152
171
  let sessionGeneration = 1;
153
- if (existsSync(sessionFile)) {
172
+ if (sessionExisted) {
154
173
  const existing = readJson(sessionFile);
155
174
  if (existing.id !== sessionId || existing.contextId !== contextId ||
156
175
  existing.fieldId !== field.id ||
@@ -159,8 +178,8 @@ function materialize(root, cfg, rawEvent, event, eventHash, options) {
159
178
  throw new Error(`Session 身份碰撞: ${sessionPath}`);
160
179
  }
161
180
  sessionGeneration = validGeneration(existing.generation, sessionPath);
162
- const cancelFenceEventId = resume.cancelEventId || event.id;
163
- if (resume.cancelRequested && existing.lastCancelEventId !== cancelFenceEventId) {
181
+ const cancelFenceEventId = resume.mode === 'cancel' ? (resume.cancelEventId || event.id) : event.id;
182
+ if (resume.mode === 'cancel' && existing.lastCancelEventId !== cancelFenceEventId) {
164
183
  throw new Error(`取消 fence 未落盘: Session ${sessionId}`);
165
184
  }
166
185
  }
@@ -229,17 +248,24 @@ function materialize(root, cfg, rawEvent, event, eventHash, options) {
229
248
  for (const dir of ['context', 'policy', 'actions', 'receipts']) {
230
249
  mkdirSync(join(runPath, dir), { recursive: true });
231
250
  }
251
+ snapshotTaskCheckpoint(sessionPath, runPath);
232
252
  writeJsonAtomic(join(runPath, 'raw-event.json'), rawEvent);
233
253
  writeJsonAtomic(join(runPath, 'event.json'), event);
234
254
  writeJsonAtomic(join(runPath, 'trigger.json'), compactEvent(event, contextId));
235
255
  writeJsonAtomic(join(runPath, 'context', 'workspace.json'), workspace);
256
+ const mountManifest = snapshotWorkspaceMounts(root, runPath, workspace);
257
+ const skillManifest = snapshotSkills(root, runPath, workspace.skills, sessionPath);
258
+ const definition = snapshotPreparedDefinition(runPath, sessionPath, workspace, mountManifest, skillManifest);
259
+ const invocation = eventInvocation(event, resume, String(options.sessionKey || correlation.key || ''), sessionExisted);
260
+ const enrichedInvocation = enrichInvocation(event, invocation, options.perception);
261
+ const responseGate = evaluateResponseGate(event.kind, effectiveRule, enrichedInvocation);
236
262
  writeJsonAtomic(join(runPath, 'context', 'field.json'), {
237
263
  ...field,
238
264
  _snapshot: { path: selected.entry.path, hash: selected.hash },
239
265
  dws: {
240
- // Workspace 配置是权威入口;Field/config 仅保留旧工作区兼容。
241
- profile: workspace.dws?.profile || field.dws?.profile || cfg.dws?.profile || '',
242
- expectedUserId: workspace.dws?.expectedUserId ||
266
+ // Session 首次创建时冻结 Definition;同一件事不能因 Workspace 热修改而换身份。
267
+ profile: definition.authority.dwsProfile || field.dws?.profile || cfg.dws?.profile || '',
268
+ expectedUserId: definition.authority.expectedUserId ||
243
269
  field.dws?.expectedUserId || cfg.dws?.expectedUserId || '',
244
270
  },
245
271
  });
@@ -249,13 +275,14 @@ function materialize(root, cfg, rawEvent, event, eventHash, options) {
249
275
  binding: 'session',
250
276
  sources: workspace.skills,
251
277
  });
252
- const mountManifest = snapshotWorkspaceMounts(root, runPath, workspace);
253
- const skillManifest = snapshotSkills(root, runPath, workspace.skills, sessionPath);
254
278
  const session = readJson(sessionFile);
255
279
  if (session.skills?.manifestHash && session.skills.manifestHash !== skillManifest.hash) {
256
280
  throw new Error(`Session Skill 绑定发生漂移: ${sessionId}`);
257
281
  }
258
- if (!session.skills?.manifestHash) {
282
+ if (session.definition?.hash && session.definition.hash !== definition.hash) {
283
+ throw new Error(`Session Agent Definition 绑定发生漂移: ${sessionId}`);
284
+ }
285
+ if (!session.skills?.manifestHash || !session.definition?.hash) {
259
286
  writeJsonAtomic(sessionFile, {
260
287
  ...session,
261
288
  skills: {
@@ -264,8 +291,12 @@ function materialize(root, cfg, rawEvent, event, eventHash, options) {
264
291
  name: entry.name, version: entry.version, hash: entry.hash,
265
292
  })),
266
293
  },
294
+ definition: { id: definition.id, hash: definition.hash },
267
295
  });
268
296
  }
297
+ writeJsonAtomic(join(runPath, 'context', 'invocation.json'), invocation);
298
+ writeJsonAtomic(join(runPath, 'context', 'enriched-invocation.json'), enrichedInvocation);
299
+ writeJsonAtomic(join(runPath, 'context', 'response-gate.json'), responseGate);
269
300
  writeJsonAtomic(join(runPath, 'context', 'reply-target.json'), event.replyTarget);
270
301
  writeJsonAtomic(join(runPath, 'context', 'resume.json'), resume);
271
302
  writeJsonAtomic(join(runPath, 'policy', 'allowed-actions.json'), {
@@ -300,6 +331,11 @@ function materialize(root, cfg, rawEvent, event, eventHash, options) {
300
331
  behavior: { id: behavior.id, version: behavior.version, hash: behavior.hash },
301
332
  skills: { manifestHash: skillManifest.hash,
302
333
  manifestPath: 'context/skills/manifest.json' },
334
+ definition: { id: definition.id, hash: definition.hash,
335
+ snapshotPath: 'context/agent-definition/definition.json' },
336
+ invocation: { mode: invocation.mode, authority: invocation.authority },
337
+ perception: { hash: enrichedInvocation.hash },
338
+ responseGate: { decision: responseGate.decision, hash: responseGate.hash },
303
339
  mounts: { entries: mountManifest },
304
340
  };
305
341
  writeJsonAtomic(runFile, run);
@@ -339,6 +375,7 @@ function persistInbox(path, rawEvent, event, eventHash, options) {
339
375
  contextId: options.contextId ? String(options.contextId) : '',
340
376
  fieldId: options.fieldId ? String(options.fieldId) : '',
341
377
  sessionKey: options.sessionKey ? String(options.sessionKey) : '',
378
+ perception: sanitizePerceptionInput(options.perception),
342
379
  };
343
380
  if (!existsSync(path)) {
344
381
  writeJsonCreateAtomic(path, {
@@ -395,11 +432,14 @@ function dispatch(root, sessionPath, runPath, run, rule, duplicate, delivery = {
395
432
  },
396
433
  };
397
434
  }
398
- function dispatchFromIndex(root, indexPath, event, eventHash, duplicate) {
435
+ function dispatchFromIndex(root, indexPath, event, eventHash, duplicate, perceptionInputHash = '') {
399
436
  const index = readJson(indexPath);
400
437
  if (index.eventId !== event.id || index.eventHash !== eventHash) {
401
438
  throw new Error(`Event ID ${event.id} 内容碰撞,拒绝复用已有索引`);
402
439
  }
440
+ if ((index.perceptionInputHash || digest(stableStringify({}))) !== perceptionInputHash) {
441
+ throw new Error(`Event ID ${event.id} 的 perception input 冲突,拒绝复用已有 Run`);
442
+ }
403
443
  if (!index.authority || !index.control ||
404
444
  digest(stableStringify(index.authority)) !== index.authorityHash) {
405
445
  throw new Error(`Event index 权威快照损坏: ${event.id}`);
@@ -537,92 +577,6 @@ function acquireSessionLock(root, sessionPath) {
537
577
  waitMs: 3_000, staleAfterMs: 2 * 60_000,
538
578
  });
539
579
  }
540
- const LOCK_HOST = hostname();
541
- const lockSleep = (ms) => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
542
- /**
543
- * mkdir 保证互斥,owner token 用于只释放自己的锁。SIGKILL 后同机死 PID 可立即恢复;
544
- * 还没写出 owner.json 的极短窗口保留 2s grace,避免删掉正在创建的锁。
545
- */
546
- function acquireLease(path, label, { waitMs, staleAfterMs }) {
547
- const deadline = Date.now() + waitMs;
548
- const token = randomUUID();
549
- while (true) {
550
- try {
551
- mkdirSync(path);
552
- try {
553
- writeJsonAtomic(join(path, 'owner.json'), {
554
- token, pid: process.pid, host: LOCK_HOST,
555
- acquiredAt: new Date().toISOString(), staleAfterMs,
556
- });
557
- }
558
- catch (e) {
559
- rmSync(path, { recursive: true, force: true });
560
- throw e;
561
- }
562
- return () => releaseLease(path, token);
563
- }
564
- catch (e) {
565
- if (e.code !== 'EEXIST')
566
- throw e;
567
- const state = inspectLease(path, staleAfterMs);
568
- if (state.stale) {
569
- const tomb = `${path}.stale.${process.pid}.${randomUUID()}`;
570
- try {
571
- renameSync(path, tomb);
572
- rmSync(tomb, { recursive: true, force: true });
573
- continue;
574
- }
575
- catch (moveError) {
576
- if (moveError.code === 'ENOENT' || moveError.code === 'EEXIST')
577
- continue;
578
- throw moveError;
579
- }
580
- }
581
- if (Date.now() < deadline) {
582
- lockSleep(Math.min(100, Math.max(1, deadline - Date.now())));
583
- continue;
584
- }
585
- throw new Error(`${label}: ${path};owner=${state.owner || 'unknown'}。可重试;确认宿主进程已死后再人工 reconcile`);
586
- }
587
- }
588
- }
589
- function inspectLease(path, staleAfterMs) {
590
- let age = 0;
591
- try {
592
- age = Date.now() - statSync(path).mtimeMs;
593
- }
594
- catch (e) {
595
- return { stale: e.code === 'ENOENT', owner: '' };
596
- }
597
- let owner;
598
- try {
599
- owner = readJson(join(path, 'owner.json'));
600
- }
601
- catch { }
602
- if (!owner)
603
- return { stale: age >= 2_000, owner: '' };
604
- const summary = `${owner.host || '?'}:${owner.pid || '?'}@${owner.acquiredAt || '?'}`;
605
- if (owner.host === LOCK_HOST && Number.isInteger(Number(owner.pid))) {
606
- try {
607
- process.kill(Number(owner.pid), 0);
608
- return { stale: false, owner: summary };
609
- }
610
- catch (e) {
611
- if (e.code === 'ESRCH')
612
- return { stale: true, owner: summary };
613
- return { stale: age >= staleAfterMs, owner: summary };
614
- }
615
- }
616
- return { stale: age >= staleAfterMs, owner: summary };
617
- }
618
- function releaseLease(path, token) {
619
- try {
620
- const owner = readJson(join(path, 'owner.json'));
621
- if (owner.token === token)
622
- rmSync(path, { recursive: true, force: true });
623
- }
624
- catch { }
625
- }
626
580
  function safe(value) {
627
581
  const out = String(value).replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');
628
582
  return out || `field-${digest(value).slice(0, 8)}`;
@@ -653,8 +607,15 @@ function runMarkdown(event, field, rule, contextId, sessionId, runId, resume) {
653
607
  `- Context: ${contextId}\n- Session: ${sessionId}\n- Run: ${runId}\n- Event: ${event.kind}\n` +
654
608
  `- Allowed actions: ${(rule.allowedActions || []).join(', ')}\n\n` +
655
609
  `${continuation}\n\n` +
656
- `本文件是本次 Run 的唯一入口。先读 trigger.json 和 context/skills/dingtalk-basic-behavior/SKILL.md;` +
657
- `只有任务需要时才读 context/mounts/ 下的 profile、memory、knowledge。` +
610
+ `本文件是本次 Run 的唯一入口。必须按顺序读取:\n\n` +
611
+ `1. \`context/response-gate.json\`:先服从不可由正文推翻的响应资格;\n` +
612
+ `2. \`context/enriched-invocation.json\`:以 \`message.effectiveText\` 作为完整任务语义,` +
613
+ `不要从原始 \`message.md\` 只处理最后半句;\n` +
614
+ `3. \`context/invocation.json\`、存在时的 \`context/task-checkpoint.json\`、` +
615
+ `\`context/agent-definition/definition.json\` 和存在时的 ` +
616
+ `\`context/agent-definition/body.md\`;\n` +
617
+ `4. \`trigger.json\` 和 \`context/skills/dingtalk-basic-behavior/SKILL.md\`。\n\n` +
618
+ `只有任务需要时才读 context/mounts/ 下的 memory、knowledge。` +
658
619
  `目标、身份、Wait 与 Event Journal 都是宿主内部控制状态,不需要理解或修改。\n\n` +
659
620
  `每一步只调用一个允许的原子动作;可选一次 ack,随后至多一个终态动作:\n\n` +
660
621
  `\`\`\`bash\n` +