@xdxer/dingtalk-agent 0.1.4-beta.0 → 0.1.4-beta.10
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.
- package/CHANGELOG.md +50 -0
- package/README.en.md +397 -0
- package/README.md +497 -46
- package/dist/bin/dingtalk-agent.js +1162 -340
- package/dist/bin/dingtalk-agent.js.map +1 -1
- package/dist/src/actions.js +98 -14
- package/dist/src/actions.js.map +1 -1
- package/dist/src/agent-audit.js +460 -0
- package/dist/src/agent-audit.js.map +1 -0
- package/dist/src/agent-bindings.js +132 -0
- package/dist/src/agent-bindings.js.map +1 -0
- package/dist/src/agent-definition.js +182 -0
- package/dist/src/agent-definition.js.map +1 -0
- package/dist/src/agent-enhance.js +678 -0
- package/dist/src/agent-enhance.js.map +1 -0
- package/dist/src/bootstrap.js +125 -17
- package/dist/src/bootstrap.js.map +1 -1
- package/dist/src/config.js +1 -7
- package/dist/src/config.js.map +1 -1
- package/dist/src/development-workspace.js +729 -0
- package/dist/src/development-workspace.js.map +1 -0
- package/dist/src/doctor.js +20 -9
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/dws.js +145 -0
- package/dist/src/dws.js.map +1 -1
- package/dist/src/eval-evidence.js +193 -0
- package/dist/src/eval-evidence.js.map +1 -0
- package/dist/src/init.js +1 -1
- package/dist/src/init.js.map +1 -1
- package/dist/src/invocation.js +36 -0
- package/dist/src/invocation.js.map +1 -0
- package/dist/src/lab.js +679 -0
- package/dist/src/lab.js.map +1 -0
- package/dist/src/lease.js +100 -0
- package/dist/src/lease.js.map +1 -0
- package/dist/src/memory/candidates.js +451 -0
- package/dist/src/memory/candidates.js.map +1 -0
- package/dist/src/memory/completion-evidence.js +536 -0
- package/dist/src/memory/completion-evidence.js.map +1 -0
- package/dist/src/memory/operational.js +263 -0
- package/dist/src/memory/operational.js.map +1 -0
- package/dist/src/memory/remote-state.js +478 -0
- package/dist/src/memory/remote-state.js.map +1 -0
- package/dist/src/memory/task-checkpoints.js +204 -0
- package/dist/src/memory/task-checkpoints.js.map +1 -0
- package/dist/src/multica-deploy.js +1480 -0
- package/dist/src/multica-deploy.js.map +1 -0
- package/dist/src/multica-provider.js +685 -0
- package/dist/src/multica-provider.js.map +1 -0
- package/dist/src/opencode-evals.js +1062 -0
- package/dist/src/opencode-evals.js.map +1 -0
- package/dist/src/opencode-provider.js +531 -0
- package/dist/src/opencode-provider.js.map +1 -0
- package/dist/src/opencode-workspace.js +197 -0
- package/dist/src/opencode-workspace.js.map +1 -0
- package/dist/src/perception.js +225 -0
- package/dist/src/perception.js.map +1 -0
- package/dist/src/personal-event-evals.js +595 -0
- package/dist/src/personal-event-evals.js.map +1 -0
- package/dist/src/promotion.js +786 -0
- package/dist/src/promotion.js.map +1 -0
- package/dist/src/remote-semantic-state-live-evals.js +888 -0
- package/dist/src/remote-semantic-state-live-evals.js.map +1 -0
- package/dist/src/remote-semantic-state-worker.js +38 -0
- package/dist/src/remote-semantic-state-worker.js.map +1 -0
- package/dist/src/remote-state-evals.js +501 -0
- package/dist/src/remote-state-evals.js.map +1 -0
- package/dist/src/response-gate.js +51 -0
- package/dist/src/response-gate.js.map +1 -0
- package/dist/src/robot-evals.js +770 -0
- package/dist/src/robot-evals.js.map +1 -0
- package/dist/src/sessions.js +66 -105
- package/dist/src/sessions.js.map +1 -1
- package/dist/src/setup.js +10 -9
- package/dist/src/setup.js.map +1 -1
- package/dist/src/skill-manager.js +102 -203
- package/dist/src/skill-manager.js.map +1 -1
- package/dist/src/skills.js.map +1 -1
- package/dist/src/storage-evals.js +26 -0
- package/dist/src/storage-evals.js.map +1 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/upgrade.js +137 -0
- package/dist/src/upgrade.js.map +1 -0
- package/dist/src/waits.js +5 -1
- package/dist/src/waits.js.map +1 -1
- package/dist/src/workspace.js +28 -3
- package/dist/src/workspace.js.map +1 -1
- package/docs/INSTALLATION.md +118 -13
- package/docs/SECOND-AGENT-ACCEPTANCE.md +62 -0
- package/docs/architecture/agent-memory-topology.png +0 -0
- package/docs/architecture/agent-memory-topology.svg +132 -0
- package/docs/architecture/general-agent-kernel-topology.png +0 -0
- package/docs/architecture/general-agent-kernel-topology.svg +149 -0
- package/docs/architecture/provider-bound-development-workspace.png +0 -0
- package/docs/architecture/provider-bound-development-workspace.svg +141 -0
- package/docs/architecture/task-completion-gate.png +0 -0
- package/docs/architecture/task-completion-gate.svg +191 -0
- package/docs/schemas/agent-audit-load-evidence.schema.json +14 -0
- package/docs/schemas/agent-audit.schema.json +92 -0
- package/docs/schemas/agent-bindings.schema.json +54 -0
- package/docs/schemas/agent-definition.schema.json +78 -0
- package/docs/schemas/agent-enhancement-plan.schema.json +88 -0
- package/docs/schemas/agent-enhancement-receipt.schema.json +37 -0
- package/docs/schemas/enriched-invocation.schema.json +46 -0
- package/docs/schemas/eval-candidate-plan.schema.json +28 -0
- package/docs/schemas/eval-candidate-result.schema.json +20 -0
- package/docs/schemas/eval-candidate.schema.json +30 -0
- package/docs/schemas/invocation.schema.json +19 -0
- package/docs/schemas/memory-candidate-proposal.schema.json +18 -0
- package/docs/schemas/memory-candidate.schema.json +76 -0
- package/docs/schemas/memory-publish-target.schema.json +25 -0
- package/docs/schemas/multica-deployment-list.schema.json +29 -0
- package/docs/schemas/multica-deployment-operation.schema.json +51 -0
- package/docs/schemas/multica-deployment-plan.schema.json +70 -0
- package/docs/schemas/multica-deployment-receipt.schema.json +87 -0
- package/docs/schemas/multica-deployment-status.schema.json +23 -0
- package/docs/schemas/multica-workspace-inspection.schema.json +77 -0
- package/docs/schemas/multica-workspace-plan.schema.json +68 -0
- package/docs/schemas/multica-workspace-resource-list.schema.json +27 -0
- package/docs/schemas/multica-workspace-status.schema.json +34 -0
- package/docs/schemas/observation.schema.json +21 -0
- package/docs/schemas/operational-memory-provider.schema.json +36 -0
- package/docs/schemas/operational-memory-record.schema.json +24 -0
- package/docs/schemas/perception-input.schema.json +56 -0
- package/docs/schemas/project.schema.json +112 -0
- package/docs/schemas/promotion-list.schema.json +36 -0
- package/docs/schemas/promotion-plan.schema.json +60 -0
- package/docs/schemas/promotion-policy.schema.json +29 -0
- package/docs/schemas/promotion-receipt.schema.json +43 -0
- package/docs/schemas/promotion-status.schema.json +23 -0
- package/docs/schemas/release-readiness.schema.json +65 -0
- package/docs/schemas/remote-semantic-state-live-eval.schema.json +60 -0
- package/docs/schemas/remote-semantic-state-manifest.schema.json +79 -0
- package/docs/schemas/remote-semantic-state-provider.schema.json +98 -0
- package/docs/schemas/response-gate.schema.json +20 -0
- package/docs/schemas/task-checkpoint.schema.json +71 -0
- package/docs/schemas/task-completion-evidence.schema.json +154 -0
- package/docs/schemas/workspace-doctor.schema.json +56 -0
- package/docs/schemas/workspace-state.schema.json +39 -0
- package/evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json +123 -0
- package/evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json +69 -0
- package/evals/baselines/2026-07-16/opencode-multi-surface-summary.json +63 -0
- package/evals/baselines/2026-07-16/remote-state-live-summary.json +70 -0
- package/evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json +98 -0
- package/evals/baselines/2026-07-17/personal-event-live-readiness-summary.json +68 -0
- package/examples/agents/fde-coach/AGENTS.md +26 -0
- package/examples/agents/fde-coach/MEMORY.md +3 -0
- package/examples/agents/fde-coach/fields/default/field.json +24 -0
- package/examples/agents/fde-coach/knowledge/INDEX.md +4 -0
- package/examples/agents/fde-coach/skills/fde-coach/SKILL.md +13 -0
- package/examples/agents/release-manager/AGENTS.md +26 -0
- package/examples/agents/release-manager/MEMORY.md +3 -0
- package/examples/agents/release-manager/fields/default/field.json +24 -0
- package/examples/agents/release-manager/knowledge/INDEX.md +4 -0
- package/examples/agents/release-manager/skills/release-manager/SKILL.md +13 -0
- package/lab/README.md +109 -0
- package/lab/agent-eval/catalog.json +91 -0
- package/lab/agent-eval/classic-failures.json +177 -0
- package/lab/agent-eval/completion-gate-regression.json +99 -0
- package/lab/agent-eval/personal-event-live.example.json +94 -0
- package/lab/agent-eval/remote-semantic-state-live.example.json +70 -0
- package/lab/agent-eval/remote-semantic-state-provider.fixture.json +47 -0
- package/lab/agent-eval/remote-state-workspace/AGENTS.md +8 -0
- package/lab/agent-eval/remote-state-workspace/opencode.json +7 -0
- package/lab/agent-eval/remote-state-workspace/skills/remote-state-operator/SKILL.md +13 -0
- package/lab/agent-eval/remote-state.example.json +31 -0
- package/lab/agent-eval/workspace/AGENTS.md +7 -0
- package/lab/agent-eval/workspace/MEMORY.md +4 -0
- package/lab/agent-eval/workspace/artifacts/pending-review.md +3 -0
- package/lab/agent-eval/workspace/knowledge/INDEX.md +4 -0
- package/lab/agent-eval/workspace/opencode.json +20 -0
- package/lab/manifest.example.json +27 -0
- package/lab/manifest.personal-event.example.json +27 -0
- package/lab/project-workspace/README.md +11 -0
- package/lab/project-workspace/fake-multica-provider.mjs +266 -0
- package/lab/project-workspace/multica-deploy.fixture.json +29 -0
- package/lab/project-workspace/multica-readonly.fixture.json +69 -0
- package/lab/project-workspace/observation.fixture.json +14 -0
- package/lab/project-workspace/opencode-provider-suite.json +65 -0
- package/lab/project-workspace/project.fixture.json +44 -0
- package/lab/project-workspace/promotion-policy.fixture.json +15 -0
- package/lab/robot-eval/pool.example.json +30 -0
- package/lab/robot-eval/suite.json +123 -0
- package/lab/robot-eval/workspace/AGENTS.md +21 -0
- package/lab/robot-eval/workspace/MEMORY.md +3 -0
- package/lab/robot-eval/workspace/knowledge/INDEX.md +5 -0
- package/lab/robot-eval/workspace/opencode.json +22 -0
- package/lab/schemas/agent-eval-catalog.schema.json +47 -0
- package/lab/schemas/lab-manifest.schema.json +70 -0
- package/lab/schemas/personal-event-eval.schema.json +91 -0
- package/lab/schemas/remote-state-eval.schema.json +66 -0
- package/lab/schemas/robot-eval-suite.schema.json +184 -0
- package/lab/schemas/robot-pool.schema.json +56 -0
- package/package.json +26 -14
- package/skills/dingtalk-agent-boot-multica/SKILL.md +40 -0
- package/skills/dingtalk-agent-compose/SKILL.md +110 -0
- package/skills/dingtalk-agent-compose/assets/AGENTS.template.md +26 -0
- package/skills/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +13 -0
- package/skills/dingtalk-agent-compose/assets/agent.bindings.local.template.json +13 -0
- package/skills/dingtalk-agent-compose/assets/opencode.template.json +12 -0
- package/skills/dingtalk-agent-compose/assets/role-skill.template.md +24 -0
- package/skills/dingtalk-agent-compose/evals/evals.json +94 -0
- package/skills/dingtalk-agent-compose/references/agent-definition-contract.md +55 -0
- package/skills/dingtalk-agent-compose/references/opencode-host-contract.md +65 -0
- package/skills/dingtalk-agent-compose/references/storage-routing.md +20 -0
- package/skills/dingtalk-agent-deploy/SKILL.md +60 -0
- package/skills/dingtalk-agent-deploy/references/multica-deployment-contract.md +49 -0
- package/skills/dingtalk-agent-deploy/references/promotion-observation-contract.md +49 -0
- package/skills/dingtalk-agent-eval/SKILL.md +116 -0
- package/skills/dingtalk-agent-eval/assets/eval-catalog.template.json +18 -0
- package/skills/dingtalk-agent-eval/evals/evals.json +61 -0
- package/skills/dingtalk-agent-eval/references/eval-topology.md +34 -0
- package/skills/dingtalk-agent-eval/references/evidence-contract.md +31 -0
- package/skills/dingtalk-agent-eval/references/scenario-taxonomy.md +25 -0
- package/skills/dingtalk-agent-eval/references/storage-modes.md +75 -0
- package/skills/dingtalk-basic-behavior/SKILL.md +63 -3
- package/skills/dingtalk-basic-behavior/assets/memory-candidate-proposal.json +10 -0
- package/skills/dingtalk-basic-behavior/assets/{task-checkpoint.md → task-checkpoint.json} +2 -21
- package/skills/dingtalk-basic-behavior/references/action-contract.md +2 -0
- package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +15 -1
- package/skills/dingtalk-basic-behavior/references/perception-and-gates.md +28 -0
- package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +32 -7
- package/dist/src/boot.js +0 -70
- package/dist/src/boot.js.map +0 -1
- package/dist/src/duty.js +0 -74
- package/dist/src/duty.js.map +0 -1
- package/dist/src/kb.js +0 -240
- package/dist/src/kb.js.map +0 -1
- package/dist/src/runs.js +0 -79
- package/dist/src/runs.js.map +0 -1
- package/docs/ARCHITECTURE.md +0 -217
- package/docs/MINIMAL-WORKSPACE-V1.md +0 -172
- package/docs/OPEN-SOURCE-REFERENCES.md +0 -107
- package/docs/SELF-TEST.md +0 -252
- package/docs//345/206/205/347/275/221/345/256/236/347/233/270.md +0 -77
- package/evals/baselines/2026-07-14/behavior-summary.json +0 -28
- package/evals/baselines/2026-07-14/contract-summary.json +0 -18
- package/evals/baselines/2026-07-14/live-canary-summary.json +0 -25
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/SKILL.md +0 -72
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/action-contract.md +0 -31
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/event-to-behavior.md +0 -22
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/memory-and-evolution.md +0 -25
- package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/runtime-modes.md +0 -34
- package/evals/baselines/2026-07-15/task-lifecycle-summary.json +0 -50
- package/evals/evals.json +0 -316
- package/evals/fixtures/dm-ambiguous-send.json +0 -4
- package/evals/fixtures/dm-blocked.json +0 -4
- package/evals/fixtures/dm-clear.json +0 -4
- package/evals/fixtures/dm-discussion.json +0 -4
- package/evals/fixtures/dm-doc-write-no-tool.json +0 -4
- package/evals/fixtures/dm-long-task-ack.json +0 -4
- package/evals/fixtures/dm-nonblocking-gap.json +0 -4
- package/evals/fixtures/dm-structured-task.json +0 -4
- package/evals/fixtures/group.json +0 -10
- package/evals/fixtures/mentioned.json +0 -3
- package/evals/run-contract-evals.mjs +0 -1106
- package/evals/run-shadow-evals.mjs +0 -267
- package/evals/runners/README.md +0 -66
- package/evals/runners/claude-shadow.mjs +0 -533
- package/evals/schemas/action-request.schema.json +0 -77
- package/evals/shadow-evals.json +0 -133
- package/skills/AGENTS.md +0 -104
- package/skills//344/273/273/345/212/241.md +0 -48
- package/skills//345/237/272/347/241/200/350/241/214/344/270/272.md +0 -44
- package/skills//345/277/203/350/267/263.md +0 -79
- package/skills//346/266/210/346/201/257.md +0 -50
- package/skills//347/237/245/350/257/206.md +0 -55
- package/skills//350/257/204/346/265/213.md +0 -62
- package/skills//351/222/211/351/222/211.md +0 -64
- package/templates/ontology/index.md +0 -24
- package/templates/ontology/self/access.md +0 -38
- package/templates/ontology/self/role-spec.md +0 -34
- package/templates/ontology/self/workspace.md +0 -41
|
@@ -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"]}
|
package/dist/src/sessions.js
CHANGED
|
@@ -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,
|
|
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 = {
|
|
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.
|
|
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 (
|
|
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.
|
|
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
|
-
//
|
|
241
|
-
profile:
|
|
242
|
-
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 (
|
|
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
|
|
657
|
-
|
|
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` +
|