@xdxer/dingtalk-agent 0.1.5-beta.1 → 0.1.5-beta.11

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 (183) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/README.en.md +99 -66
  3. package/README.md +99 -66
  4. package/dist/bin/dingtalk-agent.js +735 -149
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/actions.js +3 -2
  7. package/dist/src/actions.js.map +1 -1
  8. package/dist/src/agent-audit.js +202 -85
  9. package/dist/src/agent-audit.js.map +1 -1
  10. package/dist/src/agent-bindings.js +4 -8
  11. package/dist/src/agent-bindings.js.map +1 -1
  12. package/dist/src/agent-definition.js +7 -3
  13. package/dist/src/agent-definition.js.map +1 -1
  14. package/dist/src/agent-enhance.js +51 -32
  15. package/dist/src/agent-enhance.js.map +1 -1
  16. package/dist/src/agent-platform.js +3 -3
  17. package/dist/src/agent-platform.js.map +1 -1
  18. package/dist/src/bootstrap.js +6 -2
  19. package/dist/src/bootstrap.js.map +1 -1
  20. package/dist/src/development-workspace.js +210 -34
  21. package/dist/src/development-workspace.js.map +1 -1
  22. package/dist/src/doctor.js +65 -9
  23. package/dist/src/doctor.js.map +1 -1
  24. package/dist/src/dws.js +67 -3
  25. package/dist/src/dws.js.map +1 -1
  26. package/dist/src/init.js +2 -1
  27. package/dist/src/init.js.map +1 -1
  28. package/dist/src/map.js +157 -0
  29. package/dist/src/map.js.map +1 -0
  30. package/dist/src/memory/candidates.js +8 -0
  31. package/dist/src/memory/candidates.js.map +1 -1
  32. package/dist/src/memory/noop-receipt.js +320 -0
  33. package/dist/src/memory/noop-receipt.js.map +1 -0
  34. package/dist/src/memory/operational.js +27 -3
  35. package/dist/src/memory/operational.js.map +1 -1
  36. package/dist/src/memory/remote-state.js +2 -1
  37. package/dist/src/memory/remote-state.js.map +1 -1
  38. package/dist/src/multica-deploy.js +692 -125
  39. package/dist/src/multica-deploy.js.map +1 -1
  40. package/dist/src/multica-provider.js +303 -25
  41. package/dist/src/multica-provider.js.map +1 -1
  42. package/dist/src/multica-runtime-vocabulary.js +110 -0
  43. package/dist/src/multica-runtime-vocabulary.js.map +1 -0
  44. package/dist/src/opencode-evals.js +6 -6
  45. package/dist/src/opencode-evals.js.map +1 -1
  46. package/dist/src/opencode-provider.js +21 -7
  47. package/dist/src/opencode-provider.js.map +1 -1
  48. package/dist/src/opencode-workspace.js +3 -3
  49. package/dist/src/opencode-workspace.js.map +1 -1
  50. package/dist/src/personal-event-evals.js +4 -2
  51. package/dist/src/personal-event-evals.js.map +1 -1
  52. package/dist/src/promotion.js +2 -1
  53. package/dist/src/promotion.js.map +1 -1
  54. package/dist/src/remote-semantic-state-live-evals.js +14 -8
  55. package/dist/src/remote-semantic-state-live-evals.js.map +1 -1
  56. package/dist/src/remote-state-evals.js +2 -2
  57. package/dist/src/remote-state-evals.js.map +1 -1
  58. package/dist/src/robot-evals.js +3 -3
  59. package/dist/src/robot-evals.js.map +1 -1
  60. package/dist/src/schedule-plan.js +380 -0
  61. package/dist/src/schedule-plan.js.map +1 -0
  62. package/dist/src/sessions.js +1 -1
  63. package/dist/src/sessions.js.map +1 -1
  64. package/dist/src/skill-manager.js +145 -13
  65. package/dist/src/skill-manager.js.map +1 -1
  66. package/dist/src/skills.js +2 -0
  67. package/dist/src/skills.js.map +1 -1
  68. package/dist/src/state-dir.js +120 -0
  69. package/dist/src/state-dir.js.map +1 -0
  70. package/dist/src/tui.js +369 -0
  71. package/dist/src/tui.js.map +1 -0
  72. package/dist/src/upgrade.js +113 -33
  73. package/dist/src/upgrade.js.map +1 -1
  74. package/dist/src/waits.js +2 -1
  75. package/dist/src/waits.js.map +1 -1
  76. package/dist/src/workspace.js +12 -7
  77. package/dist/src/workspace.js.map +1 -1
  78. package/docs/AGENT-IN-PRODUCTION.md +255 -0
  79. package/docs/ARCHITECTURE.md +165 -31
  80. package/docs/INSTALLATION.md +7 -7
  81. package/docs/PLATFORM-GUARDRAILS.md +188 -0
  82. package/docs/PRIOR-ART.md +4 -0
  83. package/docs/SELF-TEST.md +4 -4
  84. package/docs/architecture/agent-platform-connection-layer.svg +120 -0
  85. package/docs/architecture/digital-employee-composition.svg +92 -0
  86. package/docs/architecture/dingtalk-agent-architecture.svg +125 -0
  87. package/docs/assets/digital-employee-at-work.svg +77 -0
  88. package/docs/schemas/multica-deployment-plan.schema.json +3 -1
  89. package/docs/schemas/multica-deployment-receipt.schema.json +17 -3
  90. package/docs/schemas/multica-deployment-status.schema.json +6 -2
  91. package/docs/schemas/multica-workspace-inspection.schema.json +16 -0
  92. package/docs/schemas/multica-workspace-run-plan.schema.json +31 -0
  93. package/docs/schemas/multica-workspace-run.schema.json +161 -0
  94. package/docs/schemas/multica-workspace-status.schema.json +2 -0
  95. package/docs/schemas/project.schema.json +54 -3
  96. package/docs/schemas/workspace-scaffold.schema.json +38 -0
  97. package/examples/agents/README.md +10 -8
  98. package/examples/agents/fde-coach/AGENTS.md +2 -34
  99. package/examples/agents/fde-coach/agent/AGENTS.md +35 -0
  100. package/examples/agents/fde-coach/agent.bindings.json +10 -0
  101. package/examples/agents/release-manager/AGENTS.md +2 -34
  102. package/examples/agents/release-manager/agent/AGENTS.md +35 -0
  103. package/examples/agents/release-manager/agent.bindings.json +10 -0
  104. package/lab/agent-eval/catalog.json +5 -5
  105. package/lab/agent-eval/classic-failures.json +4 -4
  106. package/lab/agent-eval/completion-gate-regression.json +9 -9
  107. package/lab/agent-eval/personal-event-live.example.json +3 -3
  108. package/lab/agent-eval/remote-semantic-state-live.example.json +1 -1
  109. package/lab/agent-eval/workspace/opencode.json +2 -2
  110. package/lab/project-workspace/fake-multica-provider.mjs +171 -17
  111. package/lab/project-workspace/multica-deploy.fixture.json +2 -2
  112. package/lab/project-workspace/multica-readonly.fixture.json +4 -16
  113. package/lab/project-workspace/opencode-provider-suite.json +3 -3
  114. package/lab/project-workspace/project.fixture.json +2 -6
  115. package/lab/robot-eval/suite.json +1 -1
  116. package/lab/robot-eval/workspace/AGENTS.md +1 -1
  117. package/lab/robot-eval/workspace/opencode.json +2 -2
  118. package/lab/schemas/personal-event-eval.schema.json +1 -1
  119. package/package.json +12 -9
  120. package/skills/README.md +10 -8
  121. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/SKILL.md +48 -23
  122. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/AGENTS.template.md +1 -1
  123. package/skills/core/dta-agent-compose/assets/REPOSITORY.template.md +10 -0
  124. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +2 -2
  125. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.local.template.json +2 -2
  126. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/hosts/opencode/opencode.template.json +3 -2
  127. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/evals/evals.json +4 -4
  128. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/agent-definition-contract.md +7 -7
  129. package/skills/core/dta-agent-compose/references/drive-and-schedules.md +166 -0
  130. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/host-loading-contract.md +11 -13
  131. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/claude-code.md +13 -12
  132. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/opencode.md +14 -13
  133. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/SKILL.md +2 -2
  134. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/assets/eval-catalog.template.json +1 -1
  135. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/evals/evals.json +1 -1
  136. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/eval-topology.md +3 -3
  137. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/interactive-debug-channels.md +10 -4
  138. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/SKILL.md +21 -5
  139. package/skills/core/dta-basic-behavior/references/event-to-behavior.md +38 -0
  140. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/memory-and-evolution.md +3 -1
  141. package/skills/core/dta-basic-behavior/references/perception-and-gates.md +87 -0
  142. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/risk-authority-and-privacy.md +12 -0
  143. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/truth-and-recovery.md +4 -2
  144. package/skills/core/dta-people-group-memory/COMPLETENESS.md +36 -0
  145. package/skills/core/dta-people-group-memory/SKILL.md +69 -0
  146. package/skills/core/dta-people-group-memory/references/adapters.md +273 -0
  147. package/skills/core/dta-people-group-memory/references/assembly-guidance.md +40 -0
  148. package/skills/core/dta-people-group-memory/references/binding.md +110 -0
  149. package/skills/core/dta-people-group-memory/references/cold-start.md +70 -0
  150. package/skills/core/dta-people-group-memory/references/config-binding.md +89 -0
  151. package/skills/core/dta-people-group-memory/references/consent-and-visibility.md +83 -0
  152. package/skills/core/dta-people-group-memory/references/consolidation.md +162 -0
  153. package/skills/core/dta-people-group-memory/references/event-ingest.md +103 -0
  154. package/skills/core/dta-people-group-memory/references/guided-setup.md +70 -0
  155. package/skills/core/dta-people-group-memory/references/model.md +148 -0
  156. package/skills/core/dta-people-group-memory/references/storage-port.md +107 -0
  157. package/skills/platforms/deap/PLATFORM.md +30 -1
  158. package/skills/platforms/multica-dingtalk/PLATFORM.md +34 -8
  159. package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/SKILL.md +10 -8
  160. package/skills/platforms/multica-dingtalk/dta-deploy-multica/references/multica-deployment-contract.md +67 -0
  161. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/SKILL.md +81 -11
  162. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/bootstrap.sh +2 -2
  163. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/multica_ext.py +264 -16
  164. package/docs/assets/agent-delivery-lifecycle.svg +0 -103
  165. package/skills/core/dingtalk-basic-behavior/references/event-to-behavior.md +0 -24
  166. package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +0 -28
  167. package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +0 -40
  168. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/references/multica-deployment-contract.md +0 -49
  169. /package/examples/agents/fde-coach/{skills → agent/skills}/fde-coach/SKILL.md +0 -0
  170. /package/examples/agents/release-manager/{skills → agent/skills}/release-manager/SKILL.md +0 -0
  171. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/role-skill.template.md +0 -0
  172. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/storage-routing.md +0 -0
  173. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/evidence-contract.md +0 -0
  174. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/failure-to-case.md +0 -0
  175. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/local-connector-smoke.md +0 -0
  176. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/scenario-taxonomy.md +0 -0
  177. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/storage-modes.md +0 -0
  178. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
  179. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/task-checkpoint.json +0 -0
  180. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/action-contract.md +0 -0
  181. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/runtime-modes.md +0 -0
  182. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/task-lifecycle.md +0 -0
  183. /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/promotion-observation-contract.md +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,gEAAgE;AAEhE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EACL,eAAe,EAAE,aAAa,GAC/B,MAAM,gBAAgB,CAAA;AAEvB,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE/C,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,UAAgC,EAAE;IACnE,MAAM,cAAc,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;IACtD,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAEhD,kDAAkD;IAClD,8CAA8C;IAC9C,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;IACzE,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACnE,KAAK,MAAM,GAAG,IAAI;QAChB,0BAA0B,EAAE,6BAA6B;QACzD,uBAAuB,EAAE,uBAAuB;KACjD;QAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,IAAI,CAAC,cAAc;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAEhD,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,0BAA0B;;aAE/E,SAAS,CAAC,SAAS;;aAEnB,SAAS,CAAC,MAAM,CAAC,MAAM,MAAM,SAAS,CAAC,MAAM,CAAC,SAAS;aACvD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;;;;mBAIrB,CAAC,CAAA;IAClB,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,EAAU;IAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAM;IAC7B,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAA;AAC1E,CAAC","sourcesContent":["// init 只为“需要持久 Workspace / Prepared Run runtime”的目录建立最小骨架。\n// 普通 Claude Code/Codex Session 只需全局 Skill + bootstrap,不需要 init。\n\nimport { cpSync, existsSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as cfg from './config.js'\nimport { resolvePackageRoot } from './package-root.js'\nimport {\n ensureWorkspace, workspacePath, type WorkspaceInitOptions,\n} from './workspace.js'\n\nconst PKG = resolvePackageRoot(import.meta.url)\n\nexport function init(root: string, options: WorkspaceInitOptions = {}) {\n const wasInitialized = existsSync(workspacePath(root))\n const existingConfig = cfg.load(root)\n const workspace = ensureWorkspace(root, options)\n\n // Runtime 的机器策略仍需本地存在;只补缺失项,不复制全局 Skill、Ontology,\n // 也不修改项目的 AGENTS.md / CLAUDE.md / .gitignore。\n copyMissing(join(PKG, 'templates', 'behaviors'), join(root, 'behaviors'))\n copyMissing(join(PKG, 'templates', 'fields'), join(root, 'fields'))\n for (const dir of [\n '.dingtalk-agent/sessions', '.dingtalk-agent/event-index',\n '.dingtalk-agent/waits', '.dingtalk-agent/cache',\n ]) mkdirSync(join(root, dir), { recursive: true })\n if (!existingConfig) cfg.save(root, cfg.DEFAULT)\n\n console.log(`${wasInitialized ? '✅ Workspace 已存在;检查完成,未重新初始化' : '✅ 已初始化最小 Agent Workspace'}\n\n Context: ${workspace.contextId}(未显式指定时由目录名稳定派生)\n 配置: .dingtalk-agent/workspace.json\n Storage: ${workspace.mounts.memory} / ${workspace.mounts.knowledge}\n Skill: ${workspace.skills.join(', ')}(按名称解析;不复制进当前项目)\n\n 会话水合: dingtalk-agent bootstrap\n 事件运行时: dingtalk-agent prepare --event-file <event.json>\n 环境检查: dta doctor`)\n return workspace\n}\n\nfunction copyMissing(from: string, to: string): void {\n if (!existsSync(from)) return\n cpSync(from, to, { recursive: true, force: false, errorOnExist: false })\n}\n"]}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,gEAAgE;AAEhE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EACL,eAAe,EAAE,aAAa,GAC/B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE/C,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,UAAgC,EAAE;IACnE,MAAM,cAAc,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;IACtD,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAEhD,kDAAkD;IAClD,8CAA8C;IAC9C,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;IACzE,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACnE,KAAK,MAAM,GAAG,IAAI;QAChB,0BAA0B,EAAE,6BAA6B;QACzD,uBAAuB,EAAE,uBAAuB;KACjD;QAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,IAAI,CAAC,cAAc;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAEhD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,0BAA0B,CAAC;;aAEpG,SAAS,CAAC,SAAS;;aAEnB,SAAS,CAAC,MAAM,CAAC,MAAM,MAAM,SAAS,CAAC,MAAM,CAAC,SAAS;aACvD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;;;;mBAIrB,CAAC,CAAA;IAClB,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,EAAU;IAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAM;IAC7B,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAA;AAC1E,CAAC","sourcesContent":["// init 只为“需要持久 Workspace / Prepared Run runtime”的目录建立最小骨架。\n// 普通 Claude Code/Codex Session 只需全局 Skill + bootstrap,不需要 init。\n\nimport { cpSync, existsSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as cfg from './config.js'\nimport { resolvePackageRoot } from './package-root.js'\nimport {\n ensureWorkspace, workspacePath, type WorkspaceInitOptions,\n} from './workspace.js'\nimport { out } from './tui.js'\n\nconst PKG = resolvePackageRoot(import.meta.url)\n\nexport function init(root: string, options: WorkspaceInitOptions = {}) {\n const wasInitialized = existsSync(workspacePath(root))\n const existingConfig = cfg.load(root)\n const workspace = ensureWorkspace(root, options)\n\n // Runtime 的机器策略仍需本地存在;只补缺失项,不复制全局 Skill、Ontology,\n // 也不修改项目的 AGENTS.md / CLAUDE.md / .gitignore。\n copyMissing(join(PKG, 'templates', 'behaviors'), join(root, 'behaviors'))\n copyMissing(join(PKG, 'templates', 'fields'), join(root, 'fields'))\n for (const dir of [\n '.dingtalk-agent/sessions', '.dingtalk-agent/event-index',\n '.dingtalk-agent/waits', '.dingtalk-agent/cache',\n ]) mkdirSync(join(root, dir), { recursive: true })\n if (!existingConfig) cfg.save(root, cfg.DEFAULT)\n\n console.log(`${out().theme.success(wasInitialized ? '✅ Workspace 已存在;检查完成,未重新初始化' : '✅ 已初始化最小 Agent Workspace')}\n\n Context: ${workspace.contextId}(未显式指定时由目录名稳定派生)\n 配置: .dingtalk-agent/workspace.json\n Storage: ${workspace.mounts.memory} / ${workspace.mounts.knowledge}\n Skill: ${workspace.skills.join(', ')}(按名称解析;不复制进当前项目)\n\n 会话水合: dingtalk-agent bootstrap\n 事件运行时: dingtalk-agent prepare --event-file <event.json>\n 环境检查: dta doctor`)\n return workspace\n}\n\nfunction copyMissing(from: string, to: string): void {\n if (!existsSync(from)) return\n cpSync(from, to, { recursive: true, force: false, errorOnExist: false })\n}\n"]}
@@ -0,0 +1,157 @@
1
+ // Managed Agents Platform(MAP)注册表与工作区归属解析。
2
+ //
3
+ // 一个 Agent 工作区归属于至多一个托管平台;归属解析顺序固定:
4
+ // DTA_MAP 环境变量 > dingtalk-agent.json#map > .dingtalk-agent/map.json > 按 Provider 声明推断。
5
+ // 平台相关的方法学不写进 CLI——它们随对应平台的 Skill 包分发,只在用户选择该平台时安装。
6
+ // 平台命令(如 deploy/promote/observe)必须先通过归属门禁;coming-soon 平台一律 fail-closed。
7
+ import { existsSync, lstatSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import { dirname, join, parse, resolve } from 'node:path';
9
+ import { findAgentProjectRoot } from './development-workspace.js';
10
+ import { installGlobalSkill } from './skill-manager.js';
11
+ export const MANAGED_AGENT_PLATFORMS = [
12
+ {
13
+ name: 'multica-dingtalk',
14
+ label: 'Multica (DingTalk)',
15
+ status: 'supported',
16
+ description: '钉钉 Multica 托管平台:受控部署、晋级与观测回流。',
17
+ skills: ['dingtalk-agent-deploy', 'dingtalk-agent-boot-multica'],
18
+ commands: ['deploy', 'promote', 'observe'],
19
+ },
20
+ {
21
+ name: 'deap',
22
+ label: 'DEAP',
23
+ status: 'coming-soon',
24
+ description: '敬请期待。',
25
+ skills: [],
26
+ commands: [],
27
+ },
28
+ ];
29
+ export const MAP_FILE = '.dingtalk-agent/map.json';
30
+ const PROJECT_FILE = 'dingtalk-agent.json';
31
+ export function mapDefinition(name) {
32
+ return MANAGED_AGENT_PLATFORMS.find((item) => item.name === name) || null;
33
+ }
34
+ export function resolveMap(start = process.cwd(), env = process.env) {
35
+ const fromEnv = String(env.DTA_MAP || '').trim();
36
+ if (fromEnv)
37
+ return resolution(fromEnv, 'env', '');
38
+ const projectRoot = findAgentProjectRoot(start);
39
+ if (projectRoot) {
40
+ const manifestPath = join(projectRoot, PROJECT_FILE);
41
+ if (existsSync(manifestPath) && !lstatSync(manifestPath).isSymbolicLink()) {
42
+ const manifest = readJsonOrNull(manifestPath);
43
+ const declared = typeof manifest?.map === 'string' ? manifest.map.trim() : '';
44
+ if (declared)
45
+ return resolution(declared, 'project-manifest', manifestPath);
46
+ }
47
+ }
48
+ const mapPath = findUp(start, MAP_FILE);
49
+ if (mapPath) {
50
+ const stored = readJsonOrNull(mapPath);
51
+ const declared = typeof stored?.map === 'string' ? stored.map.trim() : '';
52
+ if (declared)
53
+ return resolution(declared, 'map-file', mapPath);
54
+ }
55
+ if (projectRoot) {
56
+ const manifest = readJsonOrNull(join(projectRoot, PROJECT_FILE));
57
+ const providers = Object.values(manifest?.workspaces || {})
58
+ .map((workspace) => workspace?.provider?.kind);
59
+ if (providers.includes('multica')) {
60
+ return resolution('multica-dingtalk', 'inferred', join(projectRoot, PROJECT_FILE));
61
+ }
62
+ }
63
+ return resolution(null, 'none', '');
64
+ }
65
+ export function useMap(start, name, options) {
66
+ const definition = mapDefinition(name);
67
+ if (!definition) {
68
+ throw new Error(`未知 managed agents platform: ${name}\n` +
69
+ `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => `${item.name}(${statusLabel(item.status)})`).join('、')}`);
70
+ }
71
+ if (definition.status !== 'supported') {
72
+ throw new Error(`${definition.label} 敬请期待——当前版本尚未开放该平台。`);
73
+ }
74
+ const projectRoot = findAgentProjectRoot(start);
75
+ let written;
76
+ if (projectRoot && existsSync(join(projectRoot, PROJECT_FILE))) {
77
+ const manifestPath = join(projectRoot, PROJECT_FILE);
78
+ if (lstatSync(manifestPath).isSymbolicLink()) {
79
+ throw new Error(`${PROJECT_FILE} 不能是符号链接`);
80
+ }
81
+ const manifest = readJsonOrNull(manifestPath);
82
+ if (!manifest || typeof manifest !== 'object') {
83
+ throw new Error(`${PROJECT_FILE} 不是合法 JSON,无法写入 map 归属`);
84
+ }
85
+ manifest.map = definition.name;
86
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
87
+ written = manifestPath;
88
+ }
89
+ else {
90
+ const target = join(resolve(start), MAP_FILE);
91
+ mkdirSync(dirname(target), { recursive: true });
92
+ writeFileSync(target, JSON.stringify({ $schema: 'dingtalk-agent/map@1', map: definition.name }, null, 2) + '\n');
93
+ written = target;
94
+ }
95
+ const skillInstalls = [];
96
+ if (options.installSkills !== false) {
97
+ for (const skill of definition.skills) {
98
+ skillInstalls.push(installGlobalSkill(options.packageRoot, {
99
+ name: skill, home: options.home, env: options.env,
100
+ }));
101
+ }
102
+ }
103
+ return { ...resolveMap(start, options.env || process.env), written, skillInstalls };
104
+ }
105
+ /** deploy/promote/observe 等平台命令的归属门禁:未归属、未知或 coming-soon 一律 fail-closed。 */
106
+ export function requireSupportedMap(command, start = process.cwd(), env = process.env) {
107
+ const resolved = resolveMap(start, env);
108
+ if (!resolved.map) {
109
+ throw new Error(`当前工作区未声明 managed agents platform,无法执行 \`${command}\`。\n` +
110
+ '先运行 `dta map use multica-dingtalk`,或设置 DTA_MAP 环境变量。');
111
+ }
112
+ if (!resolved.definition) {
113
+ throw new Error(`工作区声明了未知 platform: ${resolved.map}(来源 ${resolved.source})。\n` +
114
+ `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => item.name).join('、')}`);
115
+ }
116
+ if (resolved.definition.status !== 'supported') {
117
+ throw new Error(`${resolved.definition.label} 敬请期待——\`${command}\` 尚未在该平台开放。`);
118
+ }
119
+ if (!resolved.definition.commands.includes(command)) {
120
+ throw new Error(`${resolved.definition.label} 不承接命令 \`${command}\`。`);
121
+ }
122
+ return resolved;
123
+ }
124
+ export function statusLabel(status) {
125
+ return status === 'supported' ? '已支持' : '敬请期待';
126
+ }
127
+ function resolution(name, source, file) {
128
+ return {
129
+ $schema: 'dingtalk-agent/map-resolution@1',
130
+ map: name,
131
+ source,
132
+ file,
133
+ definition: name ? mapDefinition(name) : null,
134
+ platforms: MANAGED_AGENT_PLATFORMS,
135
+ };
136
+ }
137
+ function readJsonOrNull(path) {
138
+ try {
139
+ return JSON.parse(readFileSync(path, 'utf8'));
140
+ }
141
+ catch {
142
+ return null;
143
+ }
144
+ }
145
+ function findUp(start, relativePath) {
146
+ let dir = resolve(start);
147
+ while (true) {
148
+ const candidate = join(dir, relativePath);
149
+ if (existsSync(candidate) && !lstatSync(candidate).isSymbolicLink())
150
+ return candidate;
151
+ const parent = dirname(dir);
152
+ if (parent === dir || dir === parse(dir).root)
153
+ return null;
154
+ dir = parent;
155
+ }
156
+ }
157
+ //# sourceMappingURL=map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/map.ts"],"names":[],"mappings":"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","sourcesContent":["// Managed Agents Platform(MAP)注册表与工作区归属解析。\n//\n// 一个 Agent 工作区归属于至多一个托管平台;归属解析顺序固定:\n// DTA_MAP 环境变量 > dingtalk-agent.json#map > .dingtalk-agent/map.json > 按 Provider 声明推断。\n// 平台相关的方法学不写进 CLI——它们随对应平台的 Skill 包分发,只在用户选择该平台时安装。\n// 平台命令(如 deploy/promote/observe)必须先通过归属门禁;coming-soon 平台一律 fail-closed。\n\nimport { existsSync, lstatSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join, parse, resolve } from 'node:path'\n\nimport { findAgentProjectRoot } from './development-workspace.js'\nimport { installGlobalSkill, type GlobalSkillStatus } from './skill-manager.js'\n\nexport type MapStatus = 'supported' | 'coming-soon'\n\nexport interface MapDefinition {\n name: string\n label: string\n status: MapStatus\n description: string\n skills: string[]\n commands: string[]\n}\n\nexport const MANAGED_AGENT_PLATFORMS: MapDefinition[] = [\n {\n name: 'multica-dingtalk',\n label: 'Multica (DingTalk)',\n status: 'supported',\n description: '钉钉 Multica 托管平台:受控部署、晋级与观测回流。',\n skills: ['dingtalk-agent-deploy', 'dingtalk-agent-boot-multica'],\n commands: ['deploy', 'promote', 'observe'],\n },\n {\n name: 'deap',\n label: 'DEAP',\n status: 'coming-soon',\n description: '敬请期待。',\n skills: [],\n commands: [],\n },\n]\n\nexport const MAP_FILE = '.dingtalk-agent/map.json'\nconst PROJECT_FILE = 'dingtalk-agent.json'\n\nexport type MapSource = 'env' | 'project-manifest' | 'map-file' | 'inferred' | 'none'\n\nexport interface MapResolution {\n $schema: 'dingtalk-agent/map-resolution@1'\n map: string | null\n source: MapSource\n file: string\n definition: MapDefinition | null\n platforms: MapDefinition[]\n}\n\nexport interface MapUseResult extends MapResolution {\n written: string\n skillInstalls: GlobalSkillStatus[]\n}\n\nexport function mapDefinition(name: string): MapDefinition | null {\n return MANAGED_AGENT_PLATFORMS.find((item) => item.name === name) || null\n}\n\nexport function resolveMap(start = process.cwd(), env: NodeJS.ProcessEnv = process.env): MapResolution {\n const fromEnv = String(env.DTA_MAP || '').trim()\n if (fromEnv) return resolution(fromEnv, 'env', '')\n\n const projectRoot = findAgentProjectRoot(start)\n if (projectRoot) {\n const manifestPath = join(projectRoot, PROJECT_FILE)\n if (existsSync(manifestPath) && !lstatSync(manifestPath).isSymbolicLink()) {\n const manifest = readJsonOrNull(manifestPath)\n const declared = typeof manifest?.map === 'string' ? manifest.map.trim() : ''\n if (declared) return resolution(declared, 'project-manifest', manifestPath)\n }\n }\n\n const mapPath = findUp(start, MAP_FILE)\n if (mapPath) {\n const stored = readJsonOrNull(mapPath)\n const declared = typeof stored?.map === 'string' ? stored.map.trim() : ''\n if (declared) return resolution(declared, 'map-file', mapPath)\n }\n\n if (projectRoot) {\n const manifest = readJsonOrNull(join(projectRoot, PROJECT_FILE))\n const providers = Object.values(manifest?.workspaces || {})\n .map((workspace: any) => workspace?.provider?.kind)\n if (providers.includes('multica')) {\n return resolution('multica-dingtalk', 'inferred', join(projectRoot, PROJECT_FILE))\n }\n }\n\n return resolution(null, 'none', '')\n}\n\nexport interface MapUseOptions {\n packageRoot: string\n home?: string\n env?: NodeJS.ProcessEnv\n installSkills?: boolean\n}\n\nexport function useMap(start: string, name: string, options: MapUseOptions): MapUseResult {\n const definition = mapDefinition(name)\n if (!definition) {\n throw new Error(\n `未知 managed agents platform: ${name}\\n` +\n `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => `${item.name}(${statusLabel(item.status)})`).join('、')}`,\n )\n }\n if (definition.status !== 'supported') {\n throw new Error(`${definition.label} 敬请期待——当前版本尚未开放该平台。`)\n }\n\n const projectRoot = findAgentProjectRoot(start)\n let written: string\n if (projectRoot && existsSync(join(projectRoot, PROJECT_FILE))) {\n const manifestPath = join(projectRoot, PROJECT_FILE)\n if (lstatSync(manifestPath).isSymbolicLink()) {\n throw new Error(`${PROJECT_FILE} 不能是符号链接`)\n }\n const manifest = readJsonOrNull(manifestPath)\n if (!manifest || typeof manifest !== 'object') {\n throw new Error(`${PROJECT_FILE} 不是合法 JSON,无法写入 map 归属`)\n }\n manifest.map = definition.name\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\\n')\n written = manifestPath\n } else {\n const target = join(resolve(start), MAP_FILE)\n mkdirSync(dirname(target), { recursive: true })\n writeFileSync(target, JSON.stringify(\n { $schema: 'dingtalk-agent/map@1', map: definition.name }, null, 2,\n ) + '\\n')\n written = target\n }\n\n const skillInstalls: GlobalSkillStatus[] = []\n if (options.installSkills !== false) {\n for (const skill of definition.skills) {\n skillInstalls.push(installGlobalSkill(options.packageRoot, {\n name: skill, home: options.home, env: options.env,\n }))\n }\n }\n\n return { ...resolveMap(start, options.env || process.env), written, skillInstalls }\n}\n\n/** deploy/promote/observe 等平台命令的归属门禁:未归属、未知或 coming-soon 一律 fail-closed。 */\nexport function requireSupportedMap(\n command: string, start = process.cwd(), env: NodeJS.ProcessEnv = process.env,\n): MapResolution {\n const resolved = resolveMap(start, env)\n if (!resolved.map) {\n throw new Error(\n `当前工作区未声明 managed agents platform,无法执行 \\`${command}\\`。\\n` +\n '先运行 `dta map use multica-dingtalk`,或设置 DTA_MAP 环境变量。',\n )\n }\n if (!resolved.definition) {\n throw new Error(\n `工作区声明了未知 platform: ${resolved.map}(来源 ${resolved.source})。\\n` +\n `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => item.name).join('、')}`,\n )\n }\n if (resolved.definition.status !== 'supported') {\n throw new Error(`${resolved.definition.label} 敬请期待——\\`${command}\\` 尚未在该平台开放。`)\n }\n if (!resolved.definition.commands.includes(command)) {\n throw new Error(`${resolved.definition.label} 不承接命令 \\`${command}\\`。`)\n }\n return resolved\n}\n\nexport function statusLabel(status: MapStatus): string {\n return status === 'supported' ? '已支持' : '敬请期待'\n}\n\nfunction resolution(name: string | null, source: MapSource, file: string): MapResolution {\n return {\n $schema: 'dingtalk-agent/map-resolution@1',\n map: name,\n source,\n file,\n definition: name ? mapDefinition(name) : null,\n platforms: MANAGED_AGENT_PLATFORMS,\n }\n}\n\nfunction readJsonOrNull(path: string): any {\n try { return JSON.parse(readFileSync(path, 'utf8')) } catch { return null }\n}\n\nfunction findUp(start: string, relativePath: string): string | null {\n let dir = resolve(start)\n while (true) {\n const candidate = join(dir, relativePath)\n if (existsSync(candidate) && !lstatSync(candidate).isSymbolicLink()) return candidate\n const parent = dirname(dir)\n if (parent === dir || dir === parse(dir).root) return null\n dir = parent\n }\n}\n"]}
@@ -4,6 +4,7 @@ import { dirname, join, relative, resolve } from 'node:path';
4
4
  import { spawnSync } from 'node:child_process';
5
5
  import { digest, stableStringify } from '../events.js';
6
6
  import { acquireLease } from '../lease.js';
7
+ import { assertNoSymlinkEscape, assertRealpathInsideRoot } from '../state-dir.js';
7
8
  import * as dws from '../dws.js';
8
9
  export function proposeMemoryCandidate(root, value, options = {}) {
9
10
  const proposal = validateProposal(value);
@@ -362,7 +363,14 @@ function candidateRoot(root, stateDir = '', prepared = false) {
362
363
  if (prepared)
363
364
  assertInside(resolve(root, '.dingtalk-agent'), base, 'Prepared candidate stateDir');
364
365
  const path = join(base, 'memory', 'candidates');
366
+ // 词法 containment 挡不住 symlink:root 内指向外部的目录 symlink 会让上面的检查通过,
367
+ // 再沿 symlink 把 Candidate 写出 Agent root(issue #52 在 no-op Receipt 上的同一条逃逸)。
368
+ const guard = prepared
369
+ ? () => assertRealpathInsideRoot(root, path, 'Prepared candidate 目录')
370
+ : () => assertNoSymlinkEscape(root, path, 'Candidate 目录');
371
+ guard();
365
372
  mkdirSync(path, { recursive: true });
373
+ guard();
366
374
  return path;
367
375
  }
368
376
  function candidatePath(root, id, stateDir = '') {
@@ -1 +1 @@
1
- {"version":3,"file":"candidates.js","sourceRoot":"","sources":["../../../src/memory/candidates.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n existsSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, renameSync, rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { digest, stableStringify } from '../events.js'\nimport { acquireLease } from '../lease.js'\nimport * as dws from '../dws.js'\n\nexport interface MemoryCandidateProposal {\n $schema: 'dingtalk-agent/memory-candidate-proposal@1'\n kind: 'semantic' | 'procedural'\n scopeId: string\n title: string\n content: string\n sourceRefs: string[]\n confidence: number\n supersedes: string[]\n}\n\nexport interface MemoryCandidate {\n $schema: 'dingtalk-agent/memory-candidate@1'\n id: string\n revision: number\n kind: 'semantic' | 'procedural'\n scopeId: string\n title: string\n content: string\n sourceRefs: string[]\n confidence: number\n supersedes: string[]\n status: 'proposed' | 'approved' | 'rejected' | 'published'\n proposedAt: string\n proposer: {\n mode: 'prepared' | 'direct'\n runId: string\n eventId: string\n definitionHash: string\n }\n review: null | {\n decision: 'approve' | 'reject'\n reviewer: string\n reason: string\n reviewedAt: string\n }\n publication: null | {\n provider: 'local-md' | 'dingtalk-doc'\n uri: string\n targetHashBefore: string\n targetHashAfter: string\n verification: string\n concurrency: 'atomic-local-cas' | 'best-effort-read-check-append'\n publishedAt: string\n gitHead: string\n }\n hash: string\n}\n\nexport interface MemoryPublishTarget {\n $schema: 'dingtalk-agent/memory-publish-target@1'\n provider: 'local-md' | 'dingtalk-doc'\n uri: string\n profile?: string\n expectedUserId?: string\n}\n\nexport interface CandidateOptions {\n stateDir?: string\n runPath?: string\n}\n\nexport interface CandidateResult {\n $schema: 'dingtalk-agent/memory-candidate-result@1'\n duplicate: boolean\n path: string\n candidate: MemoryCandidate\n}\n\nexport interface CandidatePublishResult {\n $schema: 'dingtalk-agent/memory-publish-result@1'\n mode: 'dry-run' | 'published' | 'uncertain'\n sideEffect: boolean\n verified: boolean\n duplicate: boolean\n candidateId: string\n candidateRevision: number\n provider: 'local-md' | 'dingtalk-doc'\n uri: string\n currentTargetHash: string\n targetHashAfter: string\n markerCount: number\n verification: string\n concurrency: 'atomic-local-cas' | 'best-effort-read-check-append'\n candidate: MemoryCandidate\n}\n\nexport function proposeMemoryCandidate(\n root: string,\n value: unknown,\n options: CandidateOptions = {},\n): CandidateResult {\n const proposal = validateProposal(value)\n const run = proposerContext(root, options.runPath)\n if (run && proposal.scopeId !== run.contextId) {\n throw new Error(\n `Memory Candidate scopeId=${proposal.scopeId} 与 Prepared Run contextId=${run.contextId} 不一致`,\n )\n }\n const id = `memcand_${digest(stableStringify(proposal)).slice(0, 24)}`\n const rootPath = candidateRoot(root, options.stateDir, Boolean(run))\n const path = join(rootPath, `${id}.json`)\n const release = acquireLease(`${path}.lock`, `Memory Candidate ${id} 正在创建`, {\n waitMs: 3_000, staleAfterMs: 2 * 60_000,\n })\n try {\n if (existsSync(path)) {\n const existing = readCandidate(path)\n return { $schema: 'dingtalk-agent/memory-candidate-result@1', duplicate: true,\n path, candidate: existing }\n }\n const now = new Date().toISOString()\n const unsigned: Omit<MemoryCandidate, 'hash'> = {\n $schema: 'dingtalk-agent/memory-candidate@1',\n id,\n revision: 1,\n kind: proposal.kind,\n scopeId: proposal.scopeId,\n title: proposal.title,\n content: proposal.content,\n sourceRefs: proposal.sourceRefs,\n confidence: proposal.confidence,\n supersedes: proposal.supersedes,\n status: 'proposed',\n proposedAt: now,\n proposer: run ? {\n mode: 'prepared', runId: run.id, eventId: run.eventId,\n definitionHash: run.definition?.hash || '',\n } : { mode: 'direct', runId: '', eventId: '', definitionHash: '' },\n review: null,\n publication: null,\n }\n const candidate = signCandidate(unsigned)\n writeJsonAtomic(path, candidate)\n return { $schema: 'dingtalk-agent/memory-candidate-result@1', duplicate: false,\n path, candidate: readCandidate(path) }\n } finally {\n release()\n }\n}\n\nexport function showMemoryCandidate(\n root: string,\n id: string,\n options: CandidateOptions = {},\n): CandidateResult {\n const path = candidatePath(root, id, options.stateDir)\n if (!existsSync(path)) throw new Error(`找不到 Memory Candidate: ${id}`)\n return { $schema: 'dingtalk-agent/memory-candidate-result@1', duplicate: false,\n path, candidate: readCandidate(path) }\n}\n\nexport function reviewMemoryCandidate(\n root: string,\n id: string,\n decision: 'approve' | 'reject',\n reviewer: string,\n reason: string,\n expectedRevision: number,\n options: CandidateOptions = {},\n): CandidateResult {\n assertOffline('review', options.runPath)\n if (!['approve', 'reject'].includes(decision)) throw new Error('review decision 只能是 approve/reject')\n if (!clean(reviewer) || !clean(reason)) throw new Error('review 需要 reviewer 和 reason')\n const path = candidatePath(root, id, options.stateDir)\n const release = acquireLease(`${path}.lock`, `Memory Candidate ${id} 正在评审`, {\n waitMs: 3_000, staleAfterMs: 2 * 60_000,\n })\n try {\n const current = readCandidate(path)\n assertCandidateRevision(current, expectedRevision)\n if (current.status !== 'proposed') {\n throw new Error(`Memory Candidate ${id} 当前状态是 ${current.status},不能再次评审`)\n }\n const unsigned: Omit<MemoryCandidate, 'hash'> = {\n ...withoutHash(current),\n revision: current.revision + 1,\n status: decision === 'approve' ? 'approved' : 'rejected',\n review: {\n decision,\n reviewer: clean(reviewer),\n reason: clean(reason),\n reviewedAt: new Date().toISOString(),\n },\n }\n const candidate = signCandidate(unsigned)\n writeJsonAtomic(path, candidate)\n return { $schema: 'dingtalk-agent/memory-candidate-result@1', duplicate: false,\n path, candidate: readCandidate(path) }\n } finally {\n release()\n }\n}\n\nexport function publishMemoryCandidate(\n root: string,\n id: string,\n targetValue: unknown,\n expectedRevision: number,\n expectedTargetHash = '',\n options: CandidateOptions & { execute?: boolean; yes?: boolean; live?: boolean } = {},\n): CandidatePublishResult {\n if (options.execute) assertOffline('publish', options.runPath)\n const target = validateTarget(targetValue)\n const path = candidatePath(root, id, options.stateDir)\n const release = acquireLease(`${path}.lock`, `Memory Candidate ${id} 正在发布`, {\n waitMs: 3_000, staleAfterMs: 10 * 60_000,\n })\n try {\n const current = readCandidate(path)\n assertCandidateRevision(current, expectedRevision)\n if (!['approved', 'published'].includes(current.status)) {\n throw new Error(`Memory Candidate ${id} 状态为 ${current.status},必须先 approve`)\n }\n if (current.status === 'published' && current.publication?.uri !== target.uri) {\n throw new Error(\n `Memory Candidate ${id} 已发布到 ${current.publication?.uri || '-'},不能静默换目标`,\n )\n }\n const targetContext = readPublishTarget(root, target)\n const block = renderCandidate(current)\n const markerCount = countMarker(targetContext.content, current.id)\n const concurrency = target.provider === 'local-md'\n ? 'atomic-local-cas' as const : 'best-effort-read-check-append' as const\n const base = {\n $schema: 'dingtalk-agent/memory-publish-result@1' as const,\n sideEffect: false,\n verified: false,\n duplicate: false,\n candidateId: current.id,\n candidateRevision: current.revision,\n provider: target.provider,\n uri: target.uri,\n currentTargetHash: targetContext.hash,\n targetHashAfter: '',\n markerCount,\n verification: 'dry-run-target-inspected',\n concurrency,\n candidate: current,\n }\n if (!options.execute) return { ...base, mode: 'dry-run' }\n if (!options.yes) throw new Error('Memory Candidate 发布必须显式 --yes')\n if (!expectedTargetHash || expectedTargetHash !== targetContext.hash) {\n throw new Error(\n `发布目标 hash 冲突:expected=${expectedTargetHash || '-'}, actual=${targetContext.hash};` +\n '请重新 dry-run 并人工检查差异',\n )\n }\n if (markerCount > 1) {\n return { ...base, mode: 'uncertain', verification: 'duplicate-candidate-markers' }\n }\n let published\n if (target.provider === 'local-md') {\n published = publishLocal(targetContext.path, targetContext.content, block, current.id)\n } else {\n if (!options.live) throw new Error('钉钉文档发布必须显式 --live --yes')\n published = publishDingTalkDoc(target, targetContext.content, block, current.id)\n }\n if (!published.verified) {\n return {\n ...base,\n mode: 'uncertain',\n sideEffect: published.sideEffect,\n duplicate: published.duplicate,\n targetHashAfter: published.hash,\n markerCount: published.markerCount,\n verification: published.verification,\n }\n }\n const publication = {\n provider: target.provider,\n uri: target.uri,\n targetHashBefore: targetContext.hash,\n targetHashAfter: published.hash,\n verification: published.verification,\n concurrency,\n publishedAt: new Date().toISOString(),\n gitHead: target.provider === 'local-md' ? readGitHead(root) : '',\n }\n const candidate = current.status === 'published'\n ? current\n : signCandidate({\n ...withoutHash(current),\n revision: current.revision + 1,\n status: 'published',\n publication,\n })\n if (current.status !== 'published') writeJsonAtomic(path, candidate)\n return {\n ...base,\n mode: 'published',\n sideEffect: published.sideEffect,\n verified: true,\n duplicate: published.duplicate,\n candidateRevision: candidate.revision,\n targetHashAfter: published.hash,\n markerCount: published.markerCount,\n verification: published.verification,\n candidate: readCandidate(path),\n }\n } finally {\n release()\n }\n}\n\nfunction publishLocal(\n path: string,\n content: string,\n block: string,\n candidateId: string,\n): { verified: boolean; sideEffect: boolean; duplicate: boolean; hash: string;\n markerCount: number; verification: string } {\n const release = acquireLease(`${path}.dta-publish.lock`, `发布目标 ${path} 正在更新`, {\n waitMs: 3_000, staleAfterMs: 10 * 60_000,\n })\n try {\n const latest = readFileSync(path, 'utf8')\n if (latest !== content) throw new Error('本地发布目标在加锁前发生漂移,请重新 dry-run')\n const existing = countMarker(latest, candidateId)\n const next = existing === 1 ? latest : appendBlock(latest, block)\n if (!existing) writeTextAtomic(path, next)\n const readback = readFileSync(path, 'utf8')\n const markerCount = countMarker(readback, candidateId)\n const verified = markerCount === 1 && readback.includes(block.trim())\n return {\n verified,\n sideEffect: !existing,\n duplicate: existing === 1,\n hash: digest(readback),\n markerCount,\n verification: verified ? 'local-atomic-write-readback' : 'local-readback-mismatch',\n }\n } finally {\n release()\n }\n}\n\nfunction publishDingTalkDoc(\n target: MemoryPublishTarget,\n content: string,\n block: string,\n candidateId: string,\n): { verified: boolean; sideEffect: boolean; duplicate: boolean; hash: string;\n markerCount: number; verification: string } {\n const profile = clean(target.profile || process.env.DTA_DWS_PROFILE)\n const expectedUserId = clean(target.expectedUserId || process.env.DTA_EXPECTED_USER_ID)\n if (!profile || profile.includes(',') || !expectedUserId) {\n throw new Error('dingtalk-doc 发布必须固定单一 profile 和 expectedUserId')\n }\n const identity = dws.getSelf(profile)\n const actualUserId = String(findValue(identity, ['userId', 'user_id', 'userid']) || '')\n if (!actualUserId || actualUserId !== expectedUserId) {\n throw new Error(`DWS 执行身份不符:expected=${expectedUserId}, actual=${actualUserId || '-'}`)\n }\n const existing = countMarker(content, candidateId)\n let sideEffect = false\n if (!existing) {\n const directory = mkdtempSync(join(tmpdir(), 'dta-memory-publish-'))\n const file = join(directory, 'candidate.md')\n try {\n writeFileSync(file, block)\n dws.appendDoc(target.uri.slice('dingtalk-doc:'.length), file, profile)\n sideEffect = true\n } finally {\n rmSync(directory, { recursive: true, force: true })\n }\n }\n const readback = String(dws.readDoc(target.uri.slice('dingtalk-doc:'.length), profile))\n const markerCount = countMarker(readback, candidateId)\n const verified = markerCount === 1 && dws.words(readback).includes(dws.words(block))\n return {\n verified,\n sideEffect,\n duplicate: existing === 1,\n hash: digest(readback),\n markerCount,\n verification: verified\n ? 'dingtalk-doc-append-full-readback' : 'dingtalk-doc-readback-mismatch',\n }\n}\n\nfunction readPublishTarget(\n root: string,\n target: MemoryPublishTarget,\n): { path: string; content: string; hash: string } {\n if (target.provider === 'local-md') {\n const ref = target.uri.slice('local-md:'.length)\n const rootReal = realpathSync(resolve(root))\n const path = realpathSync(resolve(rootReal, ref))\n assertInside(rootReal, path, 'local-md 发布目标')\n const content = readFileSync(path, 'utf8')\n return { path, content, hash: digest(content) }\n }\n const ref = target.uri.slice('dingtalk-doc:'.length)\n const profile = clean(target.profile || process.env.DTA_DWS_PROFILE)\n if (!ref) throw new Error('dingtalk-doc 发布目标缺少 node/url')\n const info = dws.docInfo(ref, profile)\n if (String(info?.contentType || '').toUpperCase() !== 'ALIDOC' ||\n String(info?.extension || '').toLowerCase() !== 'adoc') {\n throw new Error('dingtalk-doc 发布目标必须是在线文档 adoc')\n }\n const content = String(dws.readDoc(ref, profile))\n return { path: '', content, hash: digest(content) }\n}\n\nfunction renderCandidate(candidate: MemoryCandidate): string {\n return `\\n> DTA Candidate: \\`${candidate.id}\\`\\n\\n` +\n `## ${candidate.title}\\n\\n` +\n `- Kind: ${candidate.kind}\\n` +\n `- Scope: ${candidate.scopeId}\\n` +\n `- Confidence: ${candidate.confidence}\\n` +\n `- Sources: ${candidate.sourceRefs.join(', ')}\\n` +\n `- Supersedes: ${candidate.supersedes.join(', ') || '-'}\\n\\n` +\n `${candidate.content.trim()}\\n`\n}\n\nfunction appendBlock(content: string, block: string): string {\n return `${content.trimEnd()}\\n${block.startsWith('\\n') ? block : `\\n${block}`}`\n}\n\nfunction countMarker(content: string, candidateId: string): number {\n return content.split(candidateId).length - 1\n}\n\nfunction validateProposal(value: unknown): MemoryCandidateProposal {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Memory Candidate proposal 必须是 JSON object')\n }\n const input = value as Record<string, any>\n const allowed = new Set([\n '$schema', 'kind', 'scopeId', 'title', 'content', 'sourceRefs', 'confidence', 'supersedes',\n ])\n const extra = Object.keys(input).filter((key) => !allowed.has(key))\n if (extra.length) throw new Error(`Memory Candidate proposal 含未知字段: ${extra.join(', ')}`)\n if (input.$schema !== 'dingtalk-agent/memory-candidate-proposal@1' ||\n !['semantic', 'procedural'].includes(input.kind)) {\n throw new Error('Memory Candidate proposal schema/kind 非法')\n }\n for (const key of ['scopeId', 'title', 'content']) {\n if (!clean(input[key])) throw new Error(`Memory Candidate proposal 缺少 ${key}`)\n }\n if (Buffer.byteLength(input.content, 'utf8') > 32 * 1024) {\n throw new Error('Memory Candidate content 超过 32 KiB')\n }\n for (const key of ['sourceRefs', 'supersedes']) {\n if (!Array.isArray(input[key]) || input[key].some((item: unknown) => !clean(item))) {\n throw new Error(`Memory Candidate ${key} 必须是非空字符串数组`)\n }\n }\n if (!input.sourceRefs.length) throw new Error('Memory Candidate 至少需要一条 sourceRef')\n if (typeof input.confidence !== 'number' || input.confidence < 0 || input.confidence > 1) {\n throw new Error('Memory Candidate confidence 必须在 0..1')\n }\n return JSON.parse(JSON.stringify(input)) as MemoryCandidateProposal\n}\n\nfunction validateTarget(value: unknown): MemoryPublishTarget {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Memory publish target 必须是 JSON object')\n }\n const input = value as Record<string, any>\n const allowed = new Set(['$schema', 'provider', 'uri', 'profile', 'expectedUserId'])\n const extra = Object.keys(input).filter((key) => !allowed.has(key))\n if (extra.length) throw new Error(`Memory publish target 含未知字段: ${extra.join(', ')}`)\n if (input.$schema !== 'dingtalk-agent/memory-publish-target@1' ||\n !['local-md', 'dingtalk-doc'].includes(input.provider)) {\n throw new Error('Memory publish target schema/provider 非法')\n }\n if (!clean(input.uri) || !input.uri.startsWith(`${input.provider}:`)) {\n throw new Error(`Memory publish target uri 必须以 ${input.provider}: 开头`)\n }\n return JSON.parse(JSON.stringify(input)) as MemoryPublishTarget\n}\n\nfunction candidateRoot(root: string, stateDir = '', prepared = false): string {\n const base = resolve(root, stateDir || process.env.DTA_STATE_DIR || '.dingtalk-agent')\n if (prepared) assertInside(resolve(root, '.dingtalk-agent'), base, 'Prepared candidate stateDir')\n const path = join(base, 'memory', 'candidates')\n mkdirSync(path, { recursive: true })\n return path\n}\n\nfunction candidatePath(root: string, id: string, stateDir = ''): string {\n if (!/^memcand_[a-f0-9]{24}$/.test(id)) throw new Error(`Memory Candidate ID 非法: ${id}`)\n return join(candidateRoot(root, stateDir, false), `${id}.json`)\n}\n\nfunction proposerContext(root: string, runInput = ''): Record<string, any> | null {\n const value = clean(runInput || process.env.DTA_RUN)\n if (!value) return null\n const rootReal = realpathSync(resolve(root))\n const runPath = realpathSync(resolve(value))\n assertInside(rootReal, runPath, 'Prepared Run')\n const run = JSON.parse(readFileSync(join(runPath, 'run.json'), 'utf8'))\n if (!run.id || !run.contextId || !run.definition?.hash) {\n throw new Error('Prepared Run 缺少 id/contextId/definition hash')\n }\n return run\n}\n\nfunction readCandidate(path: string): MemoryCandidate {\n if (!existsSync(path)) throw new Error(`找不到 Memory Candidate: ${path}`)\n const value = JSON.parse(readFileSync(path, 'utf8')) as MemoryCandidate\n const { hash, ...unsigned } = value\n if (!hash || hash !== digest(stableStringify(unsigned))) {\n throw new Error(`Memory Candidate hash 不一致: ${value.id || path}`)\n }\n return value\n}\n\nfunction signCandidate(unsigned: Omit<MemoryCandidate, 'hash'>): MemoryCandidate {\n return { ...unsigned, hash: digest(stableStringify(unsigned)) }\n}\n\nfunction withoutHash(candidate: MemoryCandidate): Omit<MemoryCandidate, 'hash'> {\n const { hash: _hash, ...unsigned } = candidate\n return unsigned\n}\n\nfunction assertCandidateRevision(candidate: MemoryCandidate, expected: number): void {\n if (!Number.isInteger(expected) || expected < 1 || candidate.revision !== expected) {\n throw new Error(\n `Memory Candidate revision 冲突:expected=${expected}, actual=${candidate.revision}`,\n )\n }\n}\n\nfunction assertOffline(action: string, runPath = ''): void {\n if (process.env.DTA_RUN || runPath) {\n throw new Error(`在线 Prepared Run 只能 propose,不能 ${action} Memory Candidate`)\n }\n}\n\nfunction assertInside(root: string, path: string, label: string): void {\n const rel = relative(resolve(root), resolve(path))\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`${label} 必须位于允许的 root 内`)\n }\n}\n\nfunction readGitHead(root: string): string {\n const run = spawnSync('git', ['-C', root, 'rev-parse', 'HEAD'], {\n encoding: 'utf8', timeout: 2_000,\n })\n return run.status === 0 ? String(run.stdout || '').trim() : ''\n}\n\nfunction findValue(value: unknown, keys: string[]): unknown {\n if (!value || typeof value !== 'object') return null\n for (const [key, child] of Object.entries(value)) {\n if (keys.includes(key) && child !== undefined && child !== null && child !== '') return child\n }\n for (const child of Object.values(value)) {\n const found = findValue(child, keys)\n if (found !== null) return found\n }\n return null\n}\n\nfunction writeJsonAtomic(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n writeTextAtomic(path, JSON.stringify(value, null, 2) + '\\n')\n}\n\nfunction writeTextAtomic(path: string, value: string): void {\n const temp = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temp, value, { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction clean(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n"]}
1
+ {"version":3,"file":"candidates.js","sourceRoot":"","sources":["../../../src/memory/candidates.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n existsSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, renameSync, rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport { spawnSync } from 'node:child_process'\nimport { digest, stableStringify } from '../events.js'\nimport { acquireLease } from '../lease.js'\nimport { assertNoSymlinkEscape, assertRealpathInsideRoot } from '../state-dir.js'\nimport * as dws from '../dws.js'\n\nexport interface MemoryCandidateProposal {\n $schema: 'dingtalk-agent/memory-candidate-proposal@1'\n kind: 'semantic' | 'procedural'\n scopeId: string\n title: string\n content: string\n sourceRefs: string[]\n confidence: number\n supersedes: string[]\n}\n\nexport interface MemoryCandidate {\n $schema: 'dingtalk-agent/memory-candidate@1'\n id: string\n revision: number\n kind: 'semantic' | 'procedural'\n scopeId: string\n title: string\n content: string\n sourceRefs: string[]\n confidence: number\n supersedes: string[]\n status: 'proposed' | 'approved' | 'rejected' | 'published'\n proposedAt: string\n proposer: {\n mode: 'prepared' | 'direct'\n runId: string\n eventId: string\n definitionHash: string\n }\n review: null | {\n decision: 'approve' | 'reject'\n reviewer: string\n reason: string\n reviewedAt: string\n }\n publication: null | {\n provider: 'local-md' | 'dingtalk-doc'\n uri: string\n targetHashBefore: string\n targetHashAfter: string\n verification: string\n concurrency: 'atomic-local-cas' | 'best-effort-read-check-append'\n publishedAt: string\n gitHead: string\n }\n hash: string\n}\n\nexport interface MemoryPublishTarget {\n $schema: 'dingtalk-agent/memory-publish-target@1'\n provider: 'local-md' | 'dingtalk-doc'\n uri: string\n profile?: string\n expectedUserId?: string\n}\n\nexport interface CandidateOptions {\n stateDir?: string\n runPath?: string\n}\n\nexport interface CandidateResult {\n $schema: 'dingtalk-agent/memory-candidate-result@1'\n duplicate: boolean\n path: string\n candidate: MemoryCandidate\n}\n\nexport interface CandidatePublishResult {\n $schema: 'dingtalk-agent/memory-publish-result@1'\n mode: 'dry-run' | 'published' | 'uncertain'\n sideEffect: boolean\n verified: boolean\n duplicate: boolean\n candidateId: string\n candidateRevision: number\n provider: 'local-md' | 'dingtalk-doc'\n uri: string\n currentTargetHash: string\n targetHashAfter: string\n markerCount: number\n verification: string\n concurrency: 'atomic-local-cas' | 'best-effort-read-check-append'\n candidate: MemoryCandidate\n}\n\nexport function proposeMemoryCandidate(\n root: string,\n value: unknown,\n options: CandidateOptions = {},\n): CandidateResult {\n const proposal = validateProposal(value)\n const run = proposerContext(root, options.runPath)\n if (run && proposal.scopeId !== run.contextId) {\n throw new Error(\n `Memory Candidate scopeId=${proposal.scopeId} 与 Prepared Run contextId=${run.contextId} 不一致`,\n )\n }\n const id = `memcand_${digest(stableStringify(proposal)).slice(0, 24)}`\n const rootPath = candidateRoot(root, options.stateDir, Boolean(run))\n const path = join(rootPath, `${id}.json`)\n const release = acquireLease(`${path}.lock`, `Memory Candidate ${id} 正在创建`, {\n waitMs: 3_000, staleAfterMs: 2 * 60_000,\n })\n try {\n if (existsSync(path)) {\n const existing = readCandidate(path)\n return { $schema: 'dingtalk-agent/memory-candidate-result@1', duplicate: true,\n path, candidate: existing }\n }\n const now = new Date().toISOString()\n const unsigned: Omit<MemoryCandidate, 'hash'> = {\n $schema: 'dingtalk-agent/memory-candidate@1',\n id,\n revision: 1,\n kind: proposal.kind,\n scopeId: proposal.scopeId,\n title: proposal.title,\n content: proposal.content,\n sourceRefs: proposal.sourceRefs,\n confidence: proposal.confidence,\n supersedes: proposal.supersedes,\n status: 'proposed',\n proposedAt: now,\n proposer: run ? {\n mode: 'prepared', runId: run.id, eventId: run.eventId,\n definitionHash: run.definition?.hash || '',\n } : { mode: 'direct', runId: '', eventId: '', definitionHash: '' },\n review: null,\n publication: null,\n }\n const candidate = signCandidate(unsigned)\n writeJsonAtomic(path, candidate)\n return { $schema: 'dingtalk-agent/memory-candidate-result@1', duplicate: false,\n path, candidate: readCandidate(path) }\n } finally {\n release()\n }\n}\n\nexport function showMemoryCandidate(\n root: string,\n id: string,\n options: CandidateOptions = {},\n): CandidateResult {\n const path = candidatePath(root, id, options.stateDir)\n if (!existsSync(path)) throw new Error(`找不到 Memory Candidate: ${id}`)\n return { $schema: 'dingtalk-agent/memory-candidate-result@1', duplicate: false,\n path, candidate: readCandidate(path) }\n}\n\nexport function reviewMemoryCandidate(\n root: string,\n id: string,\n decision: 'approve' | 'reject',\n reviewer: string,\n reason: string,\n expectedRevision: number,\n options: CandidateOptions = {},\n): CandidateResult {\n assertOffline('review', options.runPath)\n if (!['approve', 'reject'].includes(decision)) throw new Error('review decision 只能是 approve/reject')\n if (!clean(reviewer) || !clean(reason)) throw new Error('review 需要 reviewer 和 reason')\n const path = candidatePath(root, id, options.stateDir)\n const release = acquireLease(`${path}.lock`, `Memory Candidate ${id} 正在评审`, {\n waitMs: 3_000, staleAfterMs: 2 * 60_000,\n })\n try {\n const current = readCandidate(path)\n assertCandidateRevision(current, expectedRevision)\n if (current.status !== 'proposed') {\n throw new Error(`Memory Candidate ${id} 当前状态是 ${current.status},不能再次评审`)\n }\n const unsigned: Omit<MemoryCandidate, 'hash'> = {\n ...withoutHash(current),\n revision: current.revision + 1,\n status: decision === 'approve' ? 'approved' : 'rejected',\n review: {\n decision,\n reviewer: clean(reviewer),\n reason: clean(reason),\n reviewedAt: new Date().toISOString(),\n },\n }\n const candidate = signCandidate(unsigned)\n writeJsonAtomic(path, candidate)\n return { $schema: 'dingtalk-agent/memory-candidate-result@1', duplicate: false,\n path, candidate: readCandidate(path) }\n } finally {\n release()\n }\n}\n\nexport function publishMemoryCandidate(\n root: string,\n id: string,\n targetValue: unknown,\n expectedRevision: number,\n expectedTargetHash = '',\n options: CandidateOptions & { execute?: boolean; yes?: boolean; live?: boolean } = {},\n): CandidatePublishResult {\n if (options.execute) assertOffline('publish', options.runPath)\n const target = validateTarget(targetValue)\n const path = candidatePath(root, id, options.stateDir)\n const release = acquireLease(`${path}.lock`, `Memory Candidate ${id} 正在发布`, {\n waitMs: 3_000, staleAfterMs: 10 * 60_000,\n })\n try {\n const current = readCandidate(path)\n assertCandidateRevision(current, expectedRevision)\n if (!['approved', 'published'].includes(current.status)) {\n throw new Error(`Memory Candidate ${id} 状态为 ${current.status},必须先 approve`)\n }\n if (current.status === 'published' && current.publication?.uri !== target.uri) {\n throw new Error(\n `Memory Candidate ${id} 已发布到 ${current.publication?.uri || '-'},不能静默换目标`,\n )\n }\n const targetContext = readPublishTarget(root, target)\n const block = renderCandidate(current)\n const markerCount = countMarker(targetContext.content, current.id)\n const concurrency = target.provider === 'local-md'\n ? 'atomic-local-cas' as const : 'best-effort-read-check-append' as const\n const base = {\n $schema: 'dingtalk-agent/memory-publish-result@1' as const,\n sideEffect: false,\n verified: false,\n duplicate: false,\n candidateId: current.id,\n candidateRevision: current.revision,\n provider: target.provider,\n uri: target.uri,\n currentTargetHash: targetContext.hash,\n targetHashAfter: '',\n markerCount,\n verification: 'dry-run-target-inspected',\n concurrency,\n candidate: current,\n }\n if (!options.execute) return { ...base, mode: 'dry-run' }\n if (!options.yes) throw new Error('Memory Candidate 发布必须显式 --yes')\n if (!expectedTargetHash || expectedTargetHash !== targetContext.hash) {\n throw new Error(\n `发布目标 hash 冲突:expected=${expectedTargetHash || '-'}, actual=${targetContext.hash};` +\n '请重新 dry-run 并人工检查差异',\n )\n }\n if (markerCount > 1) {\n return { ...base, mode: 'uncertain', verification: 'duplicate-candidate-markers' }\n }\n let published\n if (target.provider === 'local-md') {\n published = publishLocal(targetContext.path, targetContext.content, block, current.id)\n } else {\n if (!options.live) throw new Error('钉钉文档发布必须显式 --live --yes')\n published = publishDingTalkDoc(target, targetContext.content, block, current.id)\n }\n if (!published.verified) {\n return {\n ...base,\n mode: 'uncertain',\n sideEffect: published.sideEffect,\n duplicate: published.duplicate,\n targetHashAfter: published.hash,\n markerCount: published.markerCount,\n verification: published.verification,\n }\n }\n const publication = {\n provider: target.provider,\n uri: target.uri,\n targetHashBefore: targetContext.hash,\n targetHashAfter: published.hash,\n verification: published.verification,\n concurrency,\n publishedAt: new Date().toISOString(),\n gitHead: target.provider === 'local-md' ? readGitHead(root) : '',\n }\n const candidate = current.status === 'published'\n ? current\n : signCandidate({\n ...withoutHash(current),\n revision: current.revision + 1,\n status: 'published',\n publication,\n })\n if (current.status !== 'published') writeJsonAtomic(path, candidate)\n return {\n ...base,\n mode: 'published',\n sideEffect: published.sideEffect,\n verified: true,\n duplicate: published.duplicate,\n candidateRevision: candidate.revision,\n targetHashAfter: published.hash,\n markerCount: published.markerCount,\n verification: published.verification,\n candidate: readCandidate(path),\n }\n } finally {\n release()\n }\n}\n\nfunction publishLocal(\n path: string,\n content: string,\n block: string,\n candidateId: string,\n): { verified: boolean; sideEffect: boolean; duplicate: boolean; hash: string;\n markerCount: number; verification: string } {\n const release = acquireLease(`${path}.dta-publish.lock`, `发布目标 ${path} 正在更新`, {\n waitMs: 3_000, staleAfterMs: 10 * 60_000,\n })\n try {\n const latest = readFileSync(path, 'utf8')\n if (latest !== content) throw new Error('本地发布目标在加锁前发生漂移,请重新 dry-run')\n const existing = countMarker(latest, candidateId)\n const next = existing === 1 ? latest : appendBlock(latest, block)\n if (!existing) writeTextAtomic(path, next)\n const readback = readFileSync(path, 'utf8')\n const markerCount = countMarker(readback, candidateId)\n const verified = markerCount === 1 && readback.includes(block.trim())\n return {\n verified,\n sideEffect: !existing,\n duplicate: existing === 1,\n hash: digest(readback),\n markerCount,\n verification: verified ? 'local-atomic-write-readback' : 'local-readback-mismatch',\n }\n } finally {\n release()\n }\n}\n\nfunction publishDingTalkDoc(\n target: MemoryPublishTarget,\n content: string,\n block: string,\n candidateId: string,\n): { verified: boolean; sideEffect: boolean; duplicate: boolean; hash: string;\n markerCount: number; verification: string } {\n const profile = clean(target.profile || process.env.DTA_DWS_PROFILE)\n const expectedUserId = clean(target.expectedUserId || process.env.DTA_EXPECTED_USER_ID)\n if (!profile || profile.includes(',') || !expectedUserId) {\n throw new Error('dingtalk-doc 发布必须固定单一 profile 和 expectedUserId')\n }\n const identity = dws.getSelf(profile)\n const actualUserId = String(findValue(identity, ['userId', 'user_id', 'userid']) || '')\n if (!actualUserId || actualUserId !== expectedUserId) {\n throw new Error(`DWS 执行身份不符:expected=${expectedUserId}, actual=${actualUserId || '-'}`)\n }\n const existing = countMarker(content, candidateId)\n let sideEffect = false\n if (!existing) {\n const directory = mkdtempSync(join(tmpdir(), 'dta-memory-publish-'))\n const file = join(directory, 'candidate.md')\n try {\n writeFileSync(file, block)\n dws.appendDoc(target.uri.slice('dingtalk-doc:'.length), file, profile)\n sideEffect = true\n } finally {\n rmSync(directory, { recursive: true, force: true })\n }\n }\n const readback = String(dws.readDoc(target.uri.slice('dingtalk-doc:'.length), profile))\n const markerCount = countMarker(readback, candidateId)\n const verified = markerCount === 1 && dws.words(readback).includes(dws.words(block))\n return {\n verified,\n sideEffect,\n duplicate: existing === 1,\n hash: digest(readback),\n markerCount,\n verification: verified\n ? 'dingtalk-doc-append-full-readback' : 'dingtalk-doc-readback-mismatch',\n }\n}\n\nfunction readPublishTarget(\n root: string,\n target: MemoryPublishTarget,\n): { path: string; content: string; hash: string } {\n if (target.provider === 'local-md') {\n const ref = target.uri.slice('local-md:'.length)\n const rootReal = realpathSync(resolve(root))\n const path = realpathSync(resolve(rootReal, ref))\n assertInside(rootReal, path, 'local-md 发布目标')\n const content = readFileSync(path, 'utf8')\n return { path, content, hash: digest(content) }\n }\n const ref = target.uri.slice('dingtalk-doc:'.length)\n const profile = clean(target.profile || process.env.DTA_DWS_PROFILE)\n if (!ref) throw new Error('dingtalk-doc 发布目标缺少 node/url')\n const info = dws.docInfo(ref, profile)\n if (String(info?.contentType || '').toUpperCase() !== 'ALIDOC' ||\n String(info?.extension || '').toLowerCase() !== 'adoc') {\n throw new Error('dingtalk-doc 发布目标必须是在线文档 adoc')\n }\n const content = String(dws.readDoc(ref, profile))\n return { path: '', content, hash: digest(content) }\n}\n\nfunction renderCandidate(candidate: MemoryCandidate): string {\n return `\\n> DTA Candidate: \\`${candidate.id}\\`\\n\\n` +\n `## ${candidate.title}\\n\\n` +\n `- Kind: ${candidate.kind}\\n` +\n `- Scope: ${candidate.scopeId}\\n` +\n `- Confidence: ${candidate.confidence}\\n` +\n `- Sources: ${candidate.sourceRefs.join(', ')}\\n` +\n `- Supersedes: ${candidate.supersedes.join(', ') || '-'}\\n\\n` +\n `${candidate.content.trim()}\\n`\n}\n\nfunction appendBlock(content: string, block: string): string {\n return `${content.trimEnd()}\\n${block.startsWith('\\n') ? block : `\\n${block}`}`\n}\n\nfunction countMarker(content: string, candidateId: string): number {\n return content.split(candidateId).length - 1\n}\n\nfunction validateProposal(value: unknown): MemoryCandidateProposal {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Memory Candidate proposal 必须是 JSON object')\n }\n const input = value as Record<string, any>\n const allowed = new Set([\n '$schema', 'kind', 'scopeId', 'title', 'content', 'sourceRefs', 'confidence', 'supersedes',\n ])\n const extra = Object.keys(input).filter((key) => !allowed.has(key))\n if (extra.length) throw new Error(`Memory Candidate proposal 含未知字段: ${extra.join(', ')}`)\n if (input.$schema !== 'dingtalk-agent/memory-candidate-proposal@1' ||\n !['semantic', 'procedural'].includes(input.kind)) {\n throw new Error('Memory Candidate proposal schema/kind 非法')\n }\n for (const key of ['scopeId', 'title', 'content']) {\n if (!clean(input[key])) throw new Error(`Memory Candidate proposal 缺少 ${key}`)\n }\n if (Buffer.byteLength(input.content, 'utf8') > 32 * 1024) {\n throw new Error('Memory Candidate content 超过 32 KiB')\n }\n for (const key of ['sourceRefs', 'supersedes']) {\n if (!Array.isArray(input[key]) || input[key].some((item: unknown) => !clean(item))) {\n throw new Error(`Memory Candidate ${key} 必须是非空字符串数组`)\n }\n }\n if (!input.sourceRefs.length) throw new Error('Memory Candidate 至少需要一条 sourceRef')\n if (typeof input.confidence !== 'number' || input.confidence < 0 || input.confidence > 1) {\n throw new Error('Memory Candidate confidence 必须在 0..1')\n }\n return JSON.parse(JSON.stringify(input)) as MemoryCandidateProposal\n}\n\nfunction validateTarget(value: unknown): MemoryPublishTarget {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Memory publish target 必须是 JSON object')\n }\n const input = value as Record<string, any>\n const allowed = new Set(['$schema', 'provider', 'uri', 'profile', 'expectedUserId'])\n const extra = Object.keys(input).filter((key) => !allowed.has(key))\n if (extra.length) throw new Error(`Memory publish target 含未知字段: ${extra.join(', ')}`)\n if (input.$schema !== 'dingtalk-agent/memory-publish-target@1' ||\n !['local-md', 'dingtalk-doc'].includes(input.provider)) {\n throw new Error('Memory publish target schema/provider 非法')\n }\n if (!clean(input.uri) || !input.uri.startsWith(`${input.provider}:`)) {\n throw new Error(`Memory publish target uri 必须以 ${input.provider}: 开头`)\n }\n return JSON.parse(JSON.stringify(input)) as MemoryPublishTarget\n}\n\nfunction candidateRoot(root: string, stateDir = '', prepared = false): string {\n const base = resolve(root, stateDir || process.env.DTA_STATE_DIR || '.dingtalk-agent')\n if (prepared) assertInside(resolve(root, '.dingtalk-agent'), base, 'Prepared candidate stateDir')\n const path = join(base, 'memory', 'candidates')\n // 词法 containment 挡不住 symlink:root 内指向外部的目录 symlink 会让上面的检查通过,\n // 再沿 symlink 把 Candidate 写出 Agent root(issue #52 在 no-op Receipt 上的同一条逃逸)。\n const guard = prepared\n ? () => assertRealpathInsideRoot(root, path, 'Prepared candidate 目录')\n : () => assertNoSymlinkEscape(root, path, 'Candidate 目录')\n guard()\n mkdirSync(path, { recursive: true })\n guard()\n return path\n}\n\nfunction candidatePath(root: string, id: string, stateDir = ''): string {\n if (!/^memcand_[a-f0-9]{24}$/.test(id)) throw new Error(`Memory Candidate ID 非法: ${id}`)\n return join(candidateRoot(root, stateDir, false), `${id}.json`)\n}\n\nfunction proposerContext(root: string, runInput = ''): Record<string, any> | null {\n const value = clean(runInput || process.env.DTA_RUN)\n if (!value) return null\n const rootReal = realpathSync(resolve(root))\n const runPath = realpathSync(resolve(value))\n assertInside(rootReal, runPath, 'Prepared Run')\n const run = JSON.parse(readFileSync(join(runPath, 'run.json'), 'utf8'))\n if (!run.id || !run.contextId || !run.definition?.hash) {\n throw new Error('Prepared Run 缺少 id/contextId/definition hash')\n }\n return run\n}\n\nfunction readCandidate(path: string): MemoryCandidate {\n if (!existsSync(path)) throw new Error(`找不到 Memory Candidate: ${path}`)\n const value = JSON.parse(readFileSync(path, 'utf8')) as MemoryCandidate\n const { hash, ...unsigned } = value\n if (!hash || hash !== digest(stableStringify(unsigned))) {\n throw new Error(`Memory Candidate hash 不一致: ${value.id || path}`)\n }\n return value\n}\n\nfunction signCandidate(unsigned: Omit<MemoryCandidate, 'hash'>): MemoryCandidate {\n return { ...unsigned, hash: digest(stableStringify(unsigned)) }\n}\n\nfunction withoutHash(candidate: MemoryCandidate): Omit<MemoryCandidate, 'hash'> {\n const { hash: _hash, ...unsigned } = candidate\n return unsigned\n}\n\nfunction assertCandidateRevision(candidate: MemoryCandidate, expected: number): void {\n if (!Number.isInteger(expected) || expected < 1 || candidate.revision !== expected) {\n throw new Error(\n `Memory Candidate revision 冲突:expected=${expected}, actual=${candidate.revision}`,\n )\n }\n}\n\nfunction assertOffline(action: string, runPath = ''): void {\n if (process.env.DTA_RUN || runPath) {\n throw new Error(`在线 Prepared Run 只能 propose,不能 ${action} Memory Candidate`)\n }\n}\n\nfunction assertInside(root: string, path: string, label: string): void {\n const rel = relative(resolve(root), resolve(path))\n if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`)) {\n throw new Error(`${label} 必须位于允许的 root 内`)\n }\n}\n\nfunction readGitHead(root: string): string {\n const run = spawnSync('git', ['-C', root, 'rev-parse', 'HEAD'], {\n encoding: 'utf8', timeout: 2_000,\n })\n return run.status === 0 ? String(run.stdout || '').trim() : ''\n}\n\nfunction findValue(value: unknown, keys: string[]): unknown {\n if (!value || typeof value !== 'object') return null\n for (const [key, child] of Object.entries(value)) {\n if (keys.includes(key) && child !== undefined && child !== null && child !== '') return child\n }\n for (const child of Object.values(value)) {\n const found = findValue(child, keys)\n if (found !== null) return found\n }\n return null\n}\n\nfunction writeJsonAtomic(path: string, value: unknown): void {\n mkdirSync(dirname(path), { recursive: true })\n writeTextAtomic(path, JSON.stringify(value, null, 2) + '\\n')\n}\n\nfunction writeTextAtomic(path: string, value: string): void {\n const temp = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temp, value, { flag: 'wx' })\n renameSync(temp, path)\n}\n\nfunction clean(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n"]}