@xdxer/dingtalk-agent 0.1.4-beta.1 → 0.1.4-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 (278) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.en.md +397 -0
  3. package/README.md +500 -47
  4. package/dist/bin/dingtalk-agent.js +1263 -351
  5. package/dist/bin/dingtalk-agent.js.map +1 -1
  6. package/dist/src/actions.js +98 -14
  7. package/dist/src/actions.js.map +1 -1
  8. package/dist/src/agent-audit.js +460 -0
  9. package/dist/src/agent-audit.js.map +1 -0
  10. package/dist/src/agent-bindings.js +132 -0
  11. package/dist/src/agent-bindings.js.map +1 -0
  12. package/dist/src/agent-definition.js +182 -0
  13. package/dist/src/agent-definition.js.map +1 -0
  14. package/dist/src/agent-enhance.js +678 -0
  15. package/dist/src/agent-enhance.js.map +1 -0
  16. package/dist/src/agent-platform.js +158 -0
  17. package/dist/src/agent-platform.js.map +1 -0
  18. package/dist/src/bootstrap.js +125 -17
  19. package/dist/src/bootstrap.js.map +1 -1
  20. package/dist/src/config.js +1 -7
  21. package/dist/src/config.js.map +1 -1
  22. package/dist/src/development-workspace.js +736 -0
  23. package/dist/src/development-workspace.js.map +1 -0
  24. package/dist/src/doctor.js +49 -22
  25. package/dist/src/doctor.js.map +1 -1
  26. package/dist/src/dws.js +145 -0
  27. package/dist/src/dws.js.map +1 -1
  28. package/dist/src/eval-evidence.js +193 -0
  29. package/dist/src/eval-evidence.js.map +1 -0
  30. package/dist/src/init.js +1 -1
  31. package/dist/src/init.js.map +1 -1
  32. package/dist/src/invocation.js +36 -0
  33. package/dist/src/invocation.js.map +1 -0
  34. package/dist/src/lab.js +679 -0
  35. package/dist/src/lab.js.map +1 -0
  36. package/dist/src/lease.js +100 -0
  37. package/dist/src/lease.js.map +1 -0
  38. package/dist/src/map.js +157 -0
  39. package/dist/src/map.js.map +1 -0
  40. package/dist/src/memory/candidates.js +451 -0
  41. package/dist/src/memory/candidates.js.map +1 -0
  42. package/dist/src/memory/completion-evidence.js +536 -0
  43. package/dist/src/memory/completion-evidence.js.map +1 -0
  44. package/dist/src/memory/operational.js +263 -0
  45. package/dist/src/memory/operational.js.map +1 -0
  46. package/dist/src/memory/remote-state.js +478 -0
  47. package/dist/src/memory/remote-state.js.map +1 -0
  48. package/dist/src/memory/task-checkpoints.js +204 -0
  49. package/dist/src/memory/task-checkpoints.js.map +1 -0
  50. package/dist/src/multica-deploy.js +1480 -0
  51. package/dist/src/multica-deploy.js.map +1 -0
  52. package/dist/src/multica-provider.js +685 -0
  53. package/dist/src/multica-provider.js.map +1 -0
  54. package/dist/src/opencode-evals.js +1062 -0
  55. package/dist/src/opencode-evals.js.map +1 -0
  56. package/dist/src/opencode-provider.js +531 -0
  57. package/dist/src/opencode-provider.js.map +1 -0
  58. package/dist/src/opencode-workspace.js +197 -0
  59. package/dist/src/opencode-workspace.js.map +1 -0
  60. package/dist/src/perception.js +225 -0
  61. package/dist/src/perception.js.map +1 -0
  62. package/dist/src/personal-event-evals.js +595 -0
  63. package/dist/src/personal-event-evals.js.map +1 -0
  64. package/dist/src/promotion.js +786 -0
  65. package/dist/src/promotion.js.map +1 -0
  66. package/dist/src/remote-semantic-state-live-evals.js +888 -0
  67. package/dist/src/remote-semantic-state-live-evals.js.map +1 -0
  68. package/dist/src/remote-semantic-state-worker.js +38 -0
  69. package/dist/src/remote-semantic-state-worker.js.map +1 -0
  70. package/dist/src/remote-state-evals.js +501 -0
  71. package/dist/src/remote-state-evals.js.map +1 -0
  72. package/dist/src/response-gate.js +51 -0
  73. package/dist/src/response-gate.js.map +1 -0
  74. package/dist/src/robot-evals.js +770 -0
  75. package/dist/src/robot-evals.js.map +1 -0
  76. package/dist/src/sessions.js +66 -105
  77. package/dist/src/sessions.js.map +1 -1
  78. package/dist/src/setup.js +14 -12
  79. package/dist/src/setup.js.map +1 -1
  80. package/dist/src/skill-manager.js +128 -203
  81. package/dist/src/skill-manager.js.map +1 -1
  82. package/dist/src/skills.js.map +1 -1
  83. package/dist/src/storage-evals.js +26 -0
  84. package/dist/src/storage-evals.js.map +1 -0
  85. package/dist/src/types.js.map +1 -1
  86. package/dist/src/upgrade.js +137 -0
  87. package/dist/src/upgrade.js.map +1 -0
  88. package/dist/src/waits.js +5 -1
  89. package/dist/src/waits.js.map +1 -1
  90. package/dist/src/workspace.js +28 -3
  91. package/dist/src/workspace.js.map +1 -1
  92. package/docs/INSTALLATION.md +119 -14
  93. package/docs/SECOND-AGENT-ACCEPTANCE.md +62 -0
  94. package/docs/architecture/agent-memory-topology.png +0 -0
  95. package/docs/architecture/agent-memory-topology.svg +132 -0
  96. package/docs/architecture/general-agent-kernel-topology.png +0 -0
  97. package/docs/architecture/general-agent-kernel-topology.svg +149 -0
  98. package/docs/architecture/provider-bound-development-workspace.png +0 -0
  99. package/docs/architecture/provider-bound-development-workspace.svg +141 -0
  100. package/docs/architecture/task-completion-gate.png +0 -0
  101. package/docs/architecture/task-completion-gate.svg +191 -0
  102. package/docs/schemas/agent-audit-load-evidence.schema.json +14 -0
  103. package/docs/schemas/agent-audit.schema.json +92 -0
  104. package/docs/schemas/agent-bindings.schema.json +54 -0
  105. package/docs/schemas/agent-definition.schema.json +78 -0
  106. package/docs/schemas/agent-enhancement-plan.schema.json +88 -0
  107. package/docs/schemas/agent-enhancement-receipt.schema.json +37 -0
  108. package/docs/schemas/agent-platform.schema.json +13 -0
  109. package/docs/schemas/enriched-invocation.schema.json +46 -0
  110. package/docs/schemas/eval-candidate-plan.schema.json +28 -0
  111. package/docs/schemas/eval-candidate-result.schema.json +20 -0
  112. package/docs/schemas/eval-candidate.schema.json +30 -0
  113. package/docs/schemas/invocation.schema.json +19 -0
  114. package/docs/schemas/memory-candidate-proposal.schema.json +18 -0
  115. package/docs/schemas/memory-candidate.schema.json +76 -0
  116. package/docs/schemas/memory-publish-target.schema.json +25 -0
  117. package/docs/schemas/multica-deployment-list.schema.json +29 -0
  118. package/docs/schemas/multica-deployment-operation.schema.json +51 -0
  119. package/docs/schemas/multica-deployment-plan.schema.json +70 -0
  120. package/docs/schemas/multica-deployment-receipt.schema.json +87 -0
  121. package/docs/schemas/multica-deployment-status.schema.json +23 -0
  122. package/docs/schemas/multica-workspace-inspection.schema.json +77 -0
  123. package/docs/schemas/multica-workspace-plan.schema.json +68 -0
  124. package/docs/schemas/multica-workspace-resource-list.schema.json +27 -0
  125. package/docs/schemas/multica-workspace-status.schema.json +34 -0
  126. package/docs/schemas/observation.schema.json +21 -0
  127. package/docs/schemas/operational-memory-provider.schema.json +36 -0
  128. package/docs/schemas/operational-memory-record.schema.json +24 -0
  129. package/docs/schemas/perception-input.schema.json +56 -0
  130. package/docs/schemas/project.schema.json +113 -0
  131. package/docs/schemas/promotion-list.schema.json +36 -0
  132. package/docs/schemas/promotion-plan.schema.json +60 -0
  133. package/docs/schemas/promotion-policy.schema.json +29 -0
  134. package/docs/schemas/promotion-receipt.schema.json +43 -0
  135. package/docs/schemas/promotion-status.schema.json +23 -0
  136. package/docs/schemas/release-readiness.schema.json +66 -0
  137. package/docs/schemas/remote-semantic-state-live-eval.schema.json +60 -0
  138. package/docs/schemas/remote-semantic-state-manifest.schema.json +79 -0
  139. package/docs/schemas/remote-semantic-state-provider.schema.json +98 -0
  140. package/docs/schemas/response-gate.schema.json +20 -0
  141. package/docs/schemas/task-checkpoint.schema.json +71 -0
  142. package/docs/schemas/task-completion-evidence.schema.json +154 -0
  143. package/docs/schemas/workspace-doctor.schema.json +56 -0
  144. package/docs/schemas/workspace-state.schema.json +39 -0
  145. package/evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json +123 -0
  146. package/evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json +69 -0
  147. package/evals/baselines/2026-07-16/opencode-multi-surface-summary.json +63 -0
  148. package/evals/baselines/2026-07-16/remote-state-live-summary.json +70 -0
  149. package/evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json +98 -0
  150. package/evals/baselines/2026-07-17/personal-event-live-readiness-summary.json +68 -0
  151. package/examples/agents/fde-coach/AGENTS.md +26 -0
  152. package/examples/agents/fde-coach/MEMORY.md +3 -0
  153. package/examples/agents/fde-coach/fields/default/field.json +24 -0
  154. package/examples/agents/fde-coach/knowledge/INDEX.md +4 -0
  155. package/examples/agents/fde-coach/skills/fde-coach/SKILL.md +13 -0
  156. package/examples/agents/release-manager/AGENTS.md +26 -0
  157. package/examples/agents/release-manager/MEMORY.md +3 -0
  158. package/examples/agents/release-manager/fields/default/field.json +24 -0
  159. package/examples/agents/release-manager/knowledge/INDEX.md +4 -0
  160. package/examples/agents/release-manager/skills/release-manager/SKILL.md +13 -0
  161. package/lab/README.md +109 -0
  162. package/lab/agent-eval/catalog.json +91 -0
  163. package/lab/agent-eval/classic-failures.json +177 -0
  164. package/lab/agent-eval/completion-gate-regression.json +99 -0
  165. package/lab/agent-eval/personal-event-live.example.json +94 -0
  166. package/lab/agent-eval/remote-semantic-state-live.example.json +70 -0
  167. package/lab/agent-eval/remote-semantic-state-provider.fixture.json +47 -0
  168. package/lab/agent-eval/remote-state-workspace/AGENTS.md +8 -0
  169. package/lab/agent-eval/remote-state-workspace/opencode.json +7 -0
  170. package/lab/agent-eval/remote-state-workspace/skills/remote-state-operator/SKILL.md +13 -0
  171. package/lab/agent-eval/remote-state.example.json +31 -0
  172. package/lab/agent-eval/workspace/AGENTS.md +7 -0
  173. package/lab/agent-eval/workspace/MEMORY.md +4 -0
  174. package/lab/agent-eval/workspace/artifacts/pending-review.md +3 -0
  175. package/lab/agent-eval/workspace/knowledge/INDEX.md +4 -0
  176. package/lab/agent-eval/workspace/opencode.json +20 -0
  177. package/lab/manifest.example.json +27 -0
  178. package/lab/manifest.personal-event.example.json +27 -0
  179. package/lab/project-workspace/README.md +11 -0
  180. package/lab/project-workspace/fake-multica-provider.mjs +266 -0
  181. package/lab/project-workspace/multica-deploy.fixture.json +29 -0
  182. package/lab/project-workspace/multica-readonly.fixture.json +69 -0
  183. package/lab/project-workspace/observation.fixture.json +14 -0
  184. package/lab/project-workspace/opencode-provider-suite.json +65 -0
  185. package/lab/project-workspace/project.fixture.json +44 -0
  186. package/lab/project-workspace/promotion-policy.fixture.json +15 -0
  187. package/lab/robot-eval/pool.example.json +30 -0
  188. package/lab/robot-eval/suite.json +123 -0
  189. package/lab/robot-eval/workspace/AGENTS.md +21 -0
  190. package/lab/robot-eval/workspace/MEMORY.md +3 -0
  191. package/lab/robot-eval/workspace/knowledge/INDEX.md +5 -0
  192. package/lab/robot-eval/workspace/opencode.json +22 -0
  193. package/lab/schemas/agent-eval-catalog.schema.json +47 -0
  194. package/lab/schemas/lab-manifest.schema.json +70 -0
  195. package/lab/schemas/personal-event-eval.schema.json +91 -0
  196. package/lab/schemas/remote-state-eval.schema.json +66 -0
  197. package/lab/schemas/robot-eval-suite.schema.json +184 -0
  198. package/lab/schemas/robot-pool.schema.json +56 -0
  199. package/package.json +26 -14
  200. package/skills/dingtalk-agent-boot-multica/SKILL.md +40 -0
  201. package/skills/dingtalk-agent-compose/SKILL.md +110 -0
  202. package/skills/dingtalk-agent-compose/assets/AGENTS.template.md +26 -0
  203. package/skills/dingtalk-agent-compose/assets/agent.bindings.dingtalk-doc.template.json +13 -0
  204. package/skills/dingtalk-agent-compose/assets/agent.bindings.local.template.json +13 -0
  205. package/skills/dingtalk-agent-compose/assets/opencode.template.json +12 -0
  206. package/skills/dingtalk-agent-compose/assets/role-skill.template.md +24 -0
  207. package/skills/dingtalk-agent-compose/evals/evals.json +94 -0
  208. package/skills/dingtalk-agent-compose/references/agent-definition-contract.md +55 -0
  209. package/skills/dingtalk-agent-compose/references/opencode-host-contract.md +65 -0
  210. package/skills/dingtalk-agent-compose/references/storage-routing.md +20 -0
  211. package/skills/dingtalk-agent-deploy/SKILL.md +60 -0
  212. package/skills/dingtalk-agent-deploy/references/multica-deployment-contract.md +49 -0
  213. package/skills/dingtalk-agent-deploy/references/promotion-observation-contract.md +49 -0
  214. package/skills/dingtalk-agent-eval/SKILL.md +116 -0
  215. package/skills/dingtalk-agent-eval/assets/eval-catalog.template.json +18 -0
  216. package/skills/dingtalk-agent-eval/evals/evals.json +61 -0
  217. package/skills/dingtalk-agent-eval/references/eval-topology.md +34 -0
  218. package/skills/dingtalk-agent-eval/references/evidence-contract.md +31 -0
  219. package/skills/dingtalk-agent-eval/references/scenario-taxonomy.md +25 -0
  220. package/skills/dingtalk-agent-eval/references/storage-modes.md +75 -0
  221. package/skills/dingtalk-basic-behavior/SKILL.md +63 -3
  222. package/skills/dingtalk-basic-behavior/assets/memory-candidate-proposal.json +10 -0
  223. package/skills/dingtalk-basic-behavior/assets/{task-checkpoint.md → task-checkpoint.json} +2 -21
  224. package/skills/dingtalk-basic-behavior/references/action-contract.md +2 -0
  225. package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +15 -1
  226. package/skills/dingtalk-basic-behavior/references/perception-and-gates.md +28 -0
  227. package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +32 -7
  228. package/dist/src/boot.js +0 -70
  229. package/dist/src/boot.js.map +0 -1
  230. package/dist/src/duty.js +0 -74
  231. package/dist/src/duty.js.map +0 -1
  232. package/dist/src/kb.js +0 -240
  233. package/dist/src/kb.js.map +0 -1
  234. package/dist/src/runs.js +0 -79
  235. package/dist/src/runs.js.map +0 -1
  236. package/docs/ARCHITECTURE.md +0 -217
  237. package/docs/MINIMAL-WORKSPACE-V1.md +0 -172
  238. package/docs/OPEN-SOURCE-REFERENCES.md +0 -107
  239. package/docs/SELF-TEST.md +0 -252
  240. package/docs//345/206/205/347/275/221/345/256/236/347/233/270.md +0 -77
  241. package/evals/baselines/2026-07-14/behavior-summary.json +0 -28
  242. package/evals/baselines/2026-07-14/contract-summary.json +0 -18
  243. package/evals/baselines/2026-07-14/live-canary-summary.json +0 -25
  244. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/SKILL.md +0 -72
  245. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/action-contract.md +0 -31
  246. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/event-to-behavior.md +0 -22
  247. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/memory-and-evolution.md +0 -25
  248. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/runtime-modes.md +0 -34
  249. package/evals/baselines/2026-07-15/task-lifecycle-summary.json +0 -50
  250. package/evals/evals.json +0 -316
  251. package/evals/fixtures/dm-ambiguous-send.json +0 -4
  252. package/evals/fixtures/dm-blocked.json +0 -4
  253. package/evals/fixtures/dm-clear.json +0 -4
  254. package/evals/fixtures/dm-discussion.json +0 -4
  255. package/evals/fixtures/dm-doc-write-no-tool.json +0 -4
  256. package/evals/fixtures/dm-long-task-ack.json +0 -4
  257. package/evals/fixtures/dm-nonblocking-gap.json +0 -4
  258. package/evals/fixtures/dm-structured-task.json +0 -4
  259. package/evals/fixtures/group.json +0 -10
  260. package/evals/fixtures/mentioned.json +0 -3
  261. package/evals/run-contract-evals.mjs +0 -1106
  262. package/evals/run-shadow-evals.mjs +0 -267
  263. package/evals/runners/README.md +0 -66
  264. package/evals/runners/claude-shadow.mjs +0 -533
  265. package/evals/schemas/action-request.schema.json +0 -77
  266. package/evals/shadow-evals.json +0 -133
  267. package/skills/AGENTS.md +0 -104
  268. package/skills//344/273/273/345/212/241.md +0 -48
  269. package/skills//345/237/272/347/241/200/350/241/214/344/270/272.md +0 -44
  270. package/skills//345/277/203/350/267/263.md +0 -79
  271. package/skills//346/266/210/346/201/257.md +0 -50
  272. package/skills//347/237/245/350/257/206.md +0 -55
  273. package/skills//350/257/204/346/265/213.md +0 -62
  274. package/skills//351/222/211/351/222/211.md +0 -64
  275. package/templates/ontology/index.md +0 -24
  276. package/templates/ontology/self/access.md +0 -38
  277. package/templates/ontology/self/role-spec.md +0 -34
  278. package/templates/ontology/self/workspace.md +0 -41
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-enhance.js","sourceRoot":"","sources":["../../src/agent-enhance.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto'\nimport {\n cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync,\n renameSync, rmSync, statSync, writeFileSync,\n} from 'node:fs'\nimport { basename, dirname, join, relative, resolve } from 'node:path'\nimport { auditAgent } from './agent-audit.js'\nimport { loadAgentBindings, type AgentBindings } from './agent-bindings.js'\nimport { inspectAgentProject } from './development-workspace.js'\nimport { digest, stableStringify } from './events.js'\nimport { resolvePackageRoot } from './package-root.js'\n\nconst NAME = /^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$/\nconst BASIC = 'dingtalk-basic-behavior'\nconst BASIC_INSTRUCTION = '.agents/skills/dingtalk-basic-behavior/SKILL.md'\nconst DIRECTORY_HASH = digest('dingtalk-agent/directory@1')\nconst TEMPLATE_MARKER = /<(?:Agent 名称|岗位\\/角色|人群、团队或工作场域|长期目标|主动负责的事项|可观察的交付物|明确不做或必须升级确认的事项|Role Skill names|role-skill-name|Role Skill 名称|岗位职责或工作流|领域判断、输入与交付物|领域输入|领域方法\\/SOP|可观察结果 [12]|route)>/u\n\nexport interface AgentEnhanceOptions {\n bindings?: string\n projectName?: string\n roleSkills?: string[]\n model?: string\n memory?: string\n knowledge?: string\n artifacts?: string\n stateDir?: string\n profile?: string\n expectedUserId?: string\n cliVersion?: string\n planId?: string\n yes?: boolean\n}\n\nexport interface AgentEnhanceOperation {\n id: string\n kind: 'create-file' | 'update-file' | 'create-directory' | 'replace-directory' | 'preserve'\n path: string\n beforeHash: string\n afterHash: string\n backupRequired: boolean\n reason: string\n}\n\nexport interface AgentEnhancePlan {\n $schema: 'dingtalk-agent/agent-enhancement-plan@1'\n planId: string\n ready: boolean\n status: 'ready' | 'blocked'\n sideEffect: false\n dingtalkSideEffect: false\n triggerSideEffect: false\n root: string\n source: { kind: 'git-checkout' | 'local-folder'; revision: string }\n projectName: string\n roleSkills: string[]\n bindings: string\n baselineHash: string\n desiredHash: string\n operations: AgentEnhanceOperation[]\n blockers: string[]\n warnings: string[]\n semanticReview: {\n required: boolean\n files: string[]\n why: string\n }\n apply: { command: string; requiresCurrentPlanId: true }\n verification: { commands: string[] }\n}\n\nexport interface AgentEnhanceReceipt {\n $schema: 'dingtalk-agent/agent-enhancement-receipt@1'\n status: 'applied'\n operationId: string\n planId: string\n sideEffect: 'local-files-only'\n dingtalkSideEffect: false\n triggerSideEffect: false\n root: string\n backupRoot: string\n idempotent: boolean\n changes: AgentEnhanceOperation[]\n audit: {\n status: 'ready' | 'partial'\n ready: boolean\n missing: string[]\n commands: string[]\n }\n}\n\ninterface TreePayload {\n files: Map<string, Buffer>\n hash: string\n}\n\ninterface BuiltEnhancement {\n plan: AgentEnhancePlan\n files: Map<string, string>\n trees: Map<string, TreePayload>\n directories: Set<string>\n bindingsValue: AgentBindings\n}\n\nexport function planAgentEnhancement(\n root: string, options: AgentEnhanceOptions = {},\n): AgentEnhancePlan {\n return buildEnhancement(root, options).plan\n}\n\nexport function applyAgentEnhancement(\n root: string, options: AgentEnhanceOptions,\n): AgentEnhanceReceipt {\n if (!options.yes) throw new Error('agent enhance apply 必须显式传 --yes')\n if (!String(options.planId || '').trim()) {\n throw new Error('agent enhance apply 必须传当前 dry-run 返回的 --plan-id')\n }\n const built = buildEnhancement(root, options)\n const { plan } = built\n if (!plan.ready) throw new Error(`agent enhance plan 被阻塞: ${plan.blockers.join('; ')}`)\n if (options.planId !== plan.planId) {\n throw new Error(`agent enhance planId 已过期或不匹配: expected=${plan.planId}`)\n }\n const changes = plan.operations.filter((item) => item.kind !== 'preserve')\n const operationId = `agent_enhance_${Date.now()}_${randomUUID().slice(0, 8)}`\n const backupRelative = changes.some((item) => item.backupRequired)\n ? join('.dingtalk-agent', 'backups', 'agent-enhance', operationId) : ''\n const backupRoot = backupRelative ? resolve(plan.root, backupRelative) : ''\n const backedUp = new Set<string>()\n const created = new Set<string>()\n let audit: ReturnType<typeof auditAgent>\n\n try {\n if (backupRoot) {\n for (const operation of changes.filter((item) => item.backupRequired)) {\n const source = safeTarget(plan.root, operation.path)\n const destination = resolve(backupRoot, operation.path)\n copyEntry(source, destination)\n backedUp.add(operation.path)\n }\n writeAtomic(join(backupRoot, 'manifest.json'), JSON.stringify({\n $schema: 'dingtalk-agent/agent-enhancement-backup@1',\n operationId, planId: plan.planId,\n entries: [...backedUp].sort().map((path) => ({\n path,\n hash: stateHash(safeTarget(plan.root, path)),\n })),\n }, null, 2) + '\\n')\n }\n for (const operation of changes) {\n const target = safeTarget(plan.root, operation.path)\n if (!existsSync(target)) created.add(operation.path)\n if (operation.kind === 'create-directory') {\n mkdirSync(target, { recursive: true })\n } else if (operation.kind === 'create-file' || operation.kind === 'update-file') {\n writeAtomic(target, built.files.get(operation.path)!)\n } else if (operation.kind === 'replace-directory') {\n rmSync(target, { recursive: true, force: true })\n writeTree(target, built.trees.get(operation.path)!)\n }\n const actual = operation.kind === 'create-directory'\n ? (existsSync(target) && lstatSync(target).isDirectory() && !lstatSync(target).isSymbolicLink()\n ? DIRECTORY_HASH : '')\n : stateHash(target)\n if (actual !== operation.afterHash) {\n throw new Error(`写后 hash 不一致: ${operation.path}`)\n }\n }\n const bindingsPath = safeTarget(plan.root, plan.bindings)\n const loaded = loadAgentBindings(plan.root, relative(plan.root, bindingsPath))\n audit = auditAgent(plan.root, {\n bootstrap: { context: loaded.context },\n bindings: { path: loaded.path, hash: loaded.hash },\n requiredSkills: plan.roleSkills,\n })\n } catch (error) {\n rollback(plan.root, [...changes].reverse(), backupRoot, backedUp, created)\n throw new Error(`agent enhance 失败,已按备份回滚: ${error.message}`)\n }\n return {\n $schema: 'dingtalk-agent/agent-enhancement-receipt@1',\n status: 'applied', operationId, planId: plan.planId,\n sideEffect: 'local-files-only', dingtalkSideEffect: false, triggerSideEffect: false,\n root: plan.root,\n backupRoot: backupRoot ? relative(plan.root, backupRoot).split('\\\\').join('/') : '',\n idempotent: changes.length === 0,\n changes,\n audit: {\n status: audit.status, ready: audit.ready, missing: audit.missing,\n commands: audit.verification.commands,\n },\n }\n}\n\nfunction buildEnhancement(root: string, options: AgentEnhanceOptions): BuiltEnhancement {\n const rootReal = realpathSync(resolve(root))\n assertDirectory(rootReal, 'Agent root')\n const packageRoot = resolvePackageRoot(import.meta.url)\n const bindingsRef = safeRelative(options.bindings || 'agent.bindings.json', 'bindings')\n const existingProjectPath = join(rootReal, 'dingtalk-agent.json')\n const existingProject = existsSync(existingProjectPath)\n ? readValidatedProject(rootReal, options.cliVersion || '') : null\n const inferredName = normalizeName(basename(rootReal))\n const projectName = String(options.projectName || existingProject?.name || inferredName).trim()\n const blockers: string[] = []\n const warnings: string[] = []\n if (!NAME.test(projectName)) blockers.push('缺少合法 project name;请传 --project-name <stable-name>')\n if (!options.projectName && !existingProject) {\n warnings.push(`project name 由目录名推导为 ${projectName || '(invalid)'}`)\n }\n\n const discovered = discoverRoleSkills(rootReal)\n const requested = (options.roleSkills || []).map((item) => item.trim()).filter(Boolean)\n const roleCandidates = [...new Set([...discovered.names, ...requested])].sort()\n const invalidRoles = roleCandidates.filter((name) => !NAME.test(name) || name === BASIC)\n const roleSkills = roleCandidates.filter((name) => NAME.test(name) && name !== BASIC)\n if (invalidRoles.length) blockers.push(`Role Skill name 非法: ${invalidRoles.join(', ')}`)\n if (!roleSkills.length && !invalidRoles.length) {\n blockers.push('没有发现 Role Skill;请传 --role-skill <name>')\n }\n\n const files = new Map<string, string>()\n const trees = new Map<string, TreePayload>()\n const directories = new Set<string>()\n const semanticFiles: string[] = []\n const bindingsPath = join(rootReal, bindingsRef)\n const existingBindings = existsSync(bindingsPath)\n ? loadAgentBindings(rootReal, bindingsRef).value : null\n const existingLocalWorkspace = existingProject?.workspaces?.['local-dev'] || null\n if (existingLocalWorkspace && existingLocalWorkspace.provider?.kind !== 'opencode') {\n blockers.push('现有 local-dev 不是 OpenCode workspace;拒绝覆盖其 Provider')\n }\n const bindingsValue: AgentBindings = {\n $schema: 'dingtalk-agent/agent-bindings@1',\n agent: existingBindings?.agent || 'local-dir:.',\n skills: existingBindings?.skills || 'local-dir:skills',\n memory: options.memory || existingBindings?.memory ||\n existingLocalWorkspace?.storage?.memory || 'local-md:MEMORY.md',\n knowledge: options.knowledge || existingBindings?.knowledge ||\n existingLocalWorkspace?.storage?.knowledge || 'local-md:knowledge/INDEX.md',\n artifacts: options.artifacts || existingBindings?.artifacts ||\n existingLocalWorkspace?.storage?.artifacts || 'local-dir:.dingtalk-agent/artifacts',\n stateDir: options.stateDir || existingBindings?.stateDir || '.dingtalk-agent',\n authority: {\n profile: options.profile ?? existingBindings?.authority.profile ?? '',\n expectedUserId: options.expectedUserId ?? existingBindings?.authority.expectedUserId ?? '',\n },\n }\n validateBindingsCandidate(rootReal, bindingsValue)\n const remote = [bindingsValue.memory, bindingsValue.knowledge]\n .some((item) => item.startsWith('dingtalk-doc:'))\n if (remote && (!bindingsValue.authority.profile || !bindingsValue.authority.expectedUserId)) {\n blockers.push('远端 memory/knowledge 需要同时提供 --profile 与 --expected-user-id')\n }\n\n const agentsPath = join(rootReal, 'AGENTS.md')\n if (!existsSync(agentsPath)) {\n const body = readAsset(packageRoot, 'AGENTS.template.md')\n .replace('<Agent 名称>', projectName || '<Agent 名称>')\n .replace('<Role Skill names>', roleSkills.join(', ') || '<Role Skill names>')\n files.set('AGENTS.md', body)\n semanticFiles.push('AGENTS.md')\n } else {\n assertRegularFile(agentsPath, 'AGENTS.md')\n const body = readFileSync(agentsPath, 'utf8')\n files.set('AGENTS.md', body)\n if (TEMPLATE_MARKER.test(body)) semanticFiles.push('AGENTS.md')\n }\n\n for (const name of roleSkills) {\n const rolePath = `skills/${name}`\n const source = join(rootReal, rolePath)\n let tree: TreePayload\n if (existsSync(source)) {\n tree = readTree(source, `Role Skill ${name}`)\n const skillBody = tree.files.get('SKILL.md')?.toString('utf8') || ''\n const actualName = frontmatterName(skillBody)\n if (actualName !== name) blockers.push(`Role Skill ${name} frontmatter name=${actualName || '(missing)'}`)\n if (TEMPLATE_MARKER.test(skillBody)) semanticFiles.push(`${rolePath}/SKILL.md`)\n } else {\n const body = readAsset(packageRoot, 'role-skill.template.md')\n .replaceAll('<role-skill-name>', name)\n .replace('<Role Skill 名称>', name)\n tree = treeFromFiles(new Map([['SKILL.md', Buffer.from(body)]]))\n trees.set(rolePath, tree)\n semanticFiles.push(`${rolePath}/SKILL.md`)\n }\n trees.set(`.agents/skills/${name}`, tree)\n }\n\n trees.set(`.agents/skills/${BASIC}`, readTree(\n join(packageRoot, 'skills', BASIC), 'Canonical Basic Skill'))\n files.set(bindingsRef, JSON.stringify(bindingsValue, null, 2) + '\\n')\n\n const project = desiredProject(existingProject, {\n projectName, roleSkills, model: options.model || 'deepseek/deepseek-chat',\n modelExplicit: options.model !== undefined,\n cliVersion: options.cliVersion || '', bindings: bindingsValue,\n })\n files.set('dingtalk-agent.json', JSON.stringify(project, null, 2) + '\\n')\n files.set('opencode.json', JSON.stringify(desiredOpenCode(rootReal, roleSkills), null, 2) + '\\n')\n files.set('.gitignore', desiredGitignore(rootReal, bindingsValue.stateDir))\n\n for (const [label, route] of Object.entries({\n memory: bindingsValue.memory, knowledge: bindingsValue.knowledge,\n })) {\n if (!route.startsWith('local-md:')) continue\n const ref = safeRelative(route.slice('local-md:'.length), `${label} route`)\n const path = join(rootReal, ref)\n if (!existsSync(path)) {\n files.set(ref, `# ${label === 'memory' ? 'Memory' : 'Knowledge'}\\n\\n`)\n } else assertRegularFile(path, `${label} route`)\n }\n const artifactRef = safeLocalRoute(bindingsValue.artifacts, 'local-dir', 'artifacts')\n if (resolve(rootReal, artifactRef) === rootReal) {\n throw new Error('artifacts 必须是 Agent 根目录内的独立目录,不能等于根目录')\n }\n directories.add(artifactRef)\n directories.add(safeRelative(bindingsValue.stateDir, 'stateDir'))\n\n const operations = buildOperations(rootReal, files, trees, directories)\n const baselineHash = digest(stableStringify(operations.map((item) => ({\n path: item.path, beforeHash: item.beforeHash,\n }))))\n const desiredHash = digest(stableStringify(operations.map((item) => ({\n path: item.path, afterHash: item.afterHash,\n }))))\n const source = sourceIdentity(rootReal)\n const planSeed = {\n schema: 'dingtalk-agent/agent-enhancement-plan@1', baselineHash, desiredHash,\n root: rootReal, source, projectName, roleSkills, bindings: bindingsRef,\n options: {\n model: options.model || 'deepseek/deepseek-chat',\n memory: bindingsValue.memory, knowledge: bindingsValue.knowledge,\n artifacts: bindingsValue.artifacts, stateDir: bindingsValue.stateDir,\n profileConfigured: Boolean(bindingsValue.authority.profile),\n expectedUserConfigured: Boolean(bindingsValue.authority.expectedUserId),\n },\n }\n const planId = `aep_${digest(stableStringify(planSeed)).slice(0, 32)}`\n const roleArgument = roleSkills.join(',') || '<role-skill>'\n const common = [\n ...(options.projectName ? ['--project-name', shellArg(options.projectName)] : []),\n ...(roleSkills.length ? ['--role-skill', shellArg(roleSkills.join(','))] : []),\n ...(options.model ? ['--model', shellArg(options.model)] : []),\n ...(options.memory ? ['--memory', shellArg(options.memory)] : []),\n ...(options.knowledge ? ['--knowledge', shellArg(options.knowledge)] : []),\n ...(options.artifacts ? ['--artifacts', shellArg(options.artifacts)] : []),\n ...(options.stateDir ? ['--state-dir', shellArg(options.stateDir)] : []),\n ...(options.profile !== undefined ? ['--profile', '\"$DTA_DWS_PROFILE\"'] : []),\n ...(options.expectedUserId !== undefined\n ? ['--expected-user-id', '\"$DTA_EXPECTED_USER_ID\"'] : []),\n ...(bindingsRef !== 'agent.bindings.json' ? ['--bindings', shellArg(bindingsRef)] : []),\n ].join(' ')\n const applyCommand = `dta agent enhance ${common}${common ? ' ' : ''}--plan-id ${planId} --yes --json`\n const plan: AgentEnhancePlan = {\n $schema: 'dingtalk-agent/agent-enhancement-plan@1', planId,\n ready: blockers.length === 0, status: blockers.length ? 'blocked' : 'ready',\n sideEffect: false, dingtalkSideEffect: false, triggerSideEffect: false,\n root: rootReal,\n source, projectName, roleSkills, bindings: bindingsRef,\n baselineHash, desiredHash, operations, blockers, warnings,\n semanticReview: {\n required: semanticFiles.length > 0,\n files: [...new Set(semanticFiles)].sort(),\n why: semanticFiles.length\n ? 'CLI 只补结构,不替开发者虚构身份、职责、交付物或领域 SOP;请由 compose Skill 完成语义评审。'\n : '现有本体与 Role Skill 未命中模板占位符。',\n },\n apply: { command: applyCommand, requiresCurrentPlanId: true },\n verification: { commands: [\n `dta bootstrap --bindings ${shellArg(bindingsRef)} --json`,\n `dta agent audit --bindings ${shellArg(bindingsRef)} --require-skill ${shellArg(roleArgument)} --json`,\n `dta workspace create local-dev --dry-run --json`,\n ] },\n }\n return { plan, files, trees, directories, bindingsValue }\n}\n\nfunction desiredProject(existing: Record<string, any> | null, input: {\n projectName: string; roleSkills: string[]; model: string; modelExplicit: boolean\n cliVersion: string; bindings: AgentBindings\n}): Record<string, any> {\n if (existing) {\n const next = structuredClone(existing)\n next.name = input.projectName\n next.agent.skills = [...new Set([BASIC, ...(next.agent.skills || []), ...input.roleSkills])]\n const local = next.workspaces['local-dev']\n if (!local) {\n next.workspaces['local-dev'] = localOpenCodeWorkspace(input)\n } else if (local.provider?.kind === 'opencode') {\n if (input.modelExplicit) local.provider.model = input.model\n local.storage = {\n ...local.storage,\n memory: input.bindings.memory,\n knowledge: input.bindings.knowledge,\n artifacts: input.bindings.artifacts,\n }\n if ([input.bindings.memory, input.bindings.knowledge]\n .some((item) => item.startsWith('dingtalk-doc:'))) {\n local.authority = {\n dwsProfileFrom: 'env:DTA_DWS_PROFILE',\n expectedUserIdFrom: 'env:DTA_EXPECTED_USER_ID',\n }\n } else {\n delete local.authority\n }\n }\n return next\n }\n const version = input.cliVersion.match(/^(\\d+\\.\\d+\\.\\d+)/)?.[1] || '0.1.0'\n return {\n $schema: 'dingtalk-agent/project@1', name: input.projectName,\n dtaVersion: `^${version}`,\n agent: { definition: 'AGENTS.md', skills: [BASIC, ...input.roleSkills] },\n workspaces: { 'local-dev': localOpenCodeWorkspace(input) },\n }\n}\n\nfunction localOpenCodeWorkspace(input: {\n model: string\n bindings: AgentBindings\n}): Record<string, any> {\n const workspace: Record<string, any> = {\n stage: 'dev', provider: { kind: 'opencode', model: input.model },\n storage: {\n memory: input.bindings.memory, knowledge: input.bindings.knowledge,\n artifacts: input.bindings.artifacts,\n },\n }\n if ([input.bindings.memory, input.bindings.knowledge]\n .some((item) => item.startsWith('dingtalk-doc:'))) {\n workspace.authority = {\n dwsProfileFrom: 'env:DTA_DWS_PROFILE',\n expectedUserIdFrom: 'env:DTA_EXPECTED_USER_ID',\n }\n }\n return workspace\n}\n\nfunction desiredOpenCode(root: string, roles: string[]): Record<string, any> {\n const path = join(root, 'opencode.json')\n let value: Record<string, any> = { $schema: 'https://opencode.ai/config.json' }\n if (existsSync(path)) {\n assertRegularFile(path, 'opencode.json')\n try { value = JSON.parse(readFileSync(path, 'utf8')) }\n catch (error) { throw new Error(`opencode.json 不是合法 JSON: ${error.message}`) }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('opencode.json 必须是 JSON object')\n }\n }\n if (value.instructions !== undefined && !Array.isArray(value.instructions)) {\n throw new Error('opencode.json#instructions 必须是 array;拒绝覆盖未知结构')\n }\n if ((value.instructions || []).some((item: unknown) => typeof item !== 'string')) {\n throw new Error('opencode.json#instructions 只能包含字符串;拒绝静默删除未知条目')\n }\n const instructions = (value.instructions || []) as string[]\n value.instructions = [...instructions.filter((item: string) => item !== BASIC_INSTRUCTION), BASIC_INSTRUCTION]\n const permission = value.permission === undefined ? {} : value.permission\n if (!permission || typeof permission !== 'object' || Array.isArray(permission)) {\n throw new Error('opencode.json#permission 必须是 object;拒绝覆盖未知结构')\n }\n const skill = permission.skill === undefined ? {} : permission.skill\n if (!skill || typeof skill !== 'object' || Array.isArray(skill)) {\n throw new Error('opencode.json#permission.skill 必须是 object;拒绝覆盖未知结构')\n }\n value.permission = { ...permission, skill: {\n ...skill, [BASIC]: 'allow', ...Object.fromEntries(roles.map((name) => [name, 'allow'])),\n } }\n return value\n}\n\nfunction buildOperations(\n root: string, files: Map<string, string>, trees: Map<string, TreePayload>, directories: Set<string>,\n): AgentEnhanceOperation[] {\n const operations: AgentEnhanceOperation[] = []\n for (const [path, body] of [...files.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n const target = safeTarget(root, path)\n const beforeHash = stateHash(target)\n const afterHash = digest(Buffer.from(body).toString('base64'))\n operations.push({\n id: `file:${path}`,\n kind: !existsSync(target) ? 'create-file' : beforeHash === afterHash ? 'preserve' : 'update-file',\n path, beforeHash, afterHash,\n backupRequired: existsSync(target) && beforeHash !== afterHash,\n reason: fileReason(path),\n })\n }\n for (const [path, tree] of [...trees.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n const target = safeTarget(root, path)\n if (existsSync(target) && (!lstatSync(target).isDirectory() || lstatSync(target).isSymbolicLink())) {\n throw new Error(`受管 Skill exposure 必须是普通目录,拒绝覆盖: ${path}`)\n }\n const beforeHash = stateHash(target)\n operations.push({\n id: `tree:${path}`,\n kind: beforeHash === tree.hash ? 'preserve' : 'replace-directory',\n path, beforeHash, afterHash: tree.hash,\n backupRequired: existsSync(target) && beforeHash !== tree.hash,\n reason: path.startsWith('.agents/') ? '物化目标 Host 的精确 Skill exposure' : '补齐缺失的 Role Skill 模板',\n })\n }\n for (const path of [...directories].sort()) {\n const target = safeTarget(root, path)\n if (existsSync(target) && (!lstatSync(target).isDirectory() || lstatSync(target).isSymbolicLink())) {\n throw new Error(`本地路由必须是普通目录: ${path}`)\n }\n operations.push({\n id: `directory:${path}`, kind: existsSync(target) ? 'preserve' : 'create-directory',\n path, beforeHash: existsSync(target) ? DIRECTORY_HASH : '', afterHash: DIRECTORY_HASH,\n backupRequired: false, reason: '建立本地 state/artifact 路由,不投影控制状态到远端',\n })\n }\n return operations.sort((a, b) => a.path.localeCompare(b.path))\n}\n\nfunction readValidatedProject(root: string, cliVersion: string): Record<string, any> {\n inspectAgentProject(root, cliVersion)\n return JSON.parse(readFileSync(join(root, 'dingtalk-agent.json'), 'utf8'))\n}\n\nfunction discoverRoleSkills(root: string): { names: string[] } {\n const base = join(root, 'skills')\n if (!existsSync(base)) return { names: [] }\n if (!lstatSync(base).isDirectory() || lstatSync(base).isSymbolicLink()) {\n throw new Error('skills 必须是 Agent 根目录内的普通目录')\n }\n const names: string[] = []\n for (const entry of readdirSync(base, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {\n if (!entry.isDirectory() || entry.isSymbolicLink() || entry.name === BASIC) continue\n const file = join(base, entry.name, 'SKILL.md')\n if (!existsSync(file)) continue\n assertRegularFile(file, `Role Skill ${entry.name}`)\n const name = frontmatterName(readFileSync(file, 'utf8'))\n if (name !== entry.name) throw new Error(`Role Skill 目录与 frontmatter name 不一致: ${entry.name}/${name || '(missing)'}`)\n names.push(name)\n }\n return { names }\n}\n\nfunction validateBindingsCandidate(root: string, value: AgentBindings): void {\n for (const [label, route] of Object.entries({\n agent: value.agent, skills: value.skills, memory: value.memory,\n knowledge: value.knowledge, artifacts: value.artifacts,\n })) {\n const separator = route.indexOf(':')\n if (separator < 1 || !route.slice(separator + 1).trim()) throw new Error(`${label} route 非法`)\n if (!route.startsWith('local-')) continue\n safeRelative(route.slice(separator + 1), `${label} route`)\n }\n safeRelative(value.stateDir, 'stateDir')\n if (resolve(root, value.stateDir) === root) throw new Error('stateDir 不能等于 Agent 根目录')\n}\n\nfunction desiredGitignore(root: string, stateDir: string): string {\n const path = join(root, '.gitignore')\n const state = safeRelative(stateDir, 'stateDir')\n const entries = ['.dingtalk-agent/']\n if (state !== '.dingtalk-agent' && !state.startsWith('.dingtalk-agent/')) {\n entries.push(`${state.replace(/\\/+$/, '')}/`)\n }\n if (!existsSync(path)) return `${entries.join('\\n')}\\n`\n assertRegularFile(path, '.gitignore')\n let body = readFileSync(path, 'utf8')\n const lines = new Set(body.split(/\\r?\\n/).map((line) => line.trim().replace(/\\/+$/, '')))\n for (const entry of entries) {\n if (lines.has(entry.replace(/\\/+$/, ''))) continue\n body = `${body}${body && !body.endsWith('\\n') ? '\\n' : ''}${entry}\\n`\n lines.add(entry.replace(/\\/+$/, ''))\n }\n return body\n}\n\nfunction sourceIdentity(root: string): AgentEnhancePlan['source'] {\n const git = join(root, '.git')\n if (!existsSync(git)) return { kind: 'local-folder', revision: '' }\n let gitDirectory = git\n if (!lstatSync(git).isDirectory()) {\n const ref = readFileSync(git, 'utf8').trim().match(/^gitdir:\\s*(.+)$/)?.[1]\n if (!ref) return { kind: 'git-checkout', revision: '' }\n gitDirectory = resolve(root, ref)\n }\n if (!gitDirectory || !existsSync(gitDirectory) || !statSync(gitDirectory).isDirectory()) {\n return { kind: 'git-checkout', revision: '' }\n }\n let revision = ''\n const head = join(gitDirectory, 'HEAD')\n if (existsSync(head) && statSync(head).isFile()) {\n const headValue = readFileSync(head, 'utf8').trim()\n const ref = headValue.match(/^ref:\\s*(.+)$/)?.[1] || ''\n if (!ref) revision = headValue\n else {\n const commonDirFile = join(gitDirectory, 'commondir')\n const commonDir = existsSync(commonDirFile)\n ? resolve(gitDirectory, readFileSync(commonDirFile, 'utf8').trim()) : gitDirectory\n const refPath = join(commonDir, ref)\n if (existsSync(refPath)) revision = readFileSync(refPath, 'utf8').trim()\n else {\n const packed = join(commonDir, 'packed-refs')\n if (existsSync(packed)) {\n revision = readFileSync(packed, 'utf8').split(/\\r?\\n/)\n .find((line) => line.endsWith(` ${ref}`))?.split(' ')[0] || ''\n }\n }\n }\n }\n return { kind: 'git-checkout', revision }\n}\n\nfunction fileReason(path: string): string {\n if (path === 'AGENTS.md') return '补齐本体结构;语义内容仍需开发者评审'\n if (path === 'agent.bindings.json') return '固化本体、语义存储与宿主私有状态路由'\n if (path === 'dingtalk-agent.json') return '把目录升级为可发现、可版本化的 Agent Project'\n if (path === 'opencode.json') return '合并唯一 Basic instruction 与 Role Skill permission'\n if (path === '.gitignore') return '防止私有 state、Receipt 与原始证据进入 Git'\n return '补齐本地语义介质入口'\n}\n\nfunction readAsset(packageRoot: string, name: string): string {\n return readFileSync(join(packageRoot, 'skills', 'dingtalk-agent-compose', 'assets', name), 'utf8')\n}\n\nfunction readTree(path: string, label: string): TreePayload {\n if (!existsSync(path) || !lstatSync(path).isDirectory() || lstatSync(path).isSymbolicLink()) {\n throw new Error(`${label} 必须是普通目录: ${path}`)\n }\n const files = new Map<string, Buffer>()\n const visit = (directory: string) => {\n for (const entry of readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {\n const candidate = join(directory, entry.name)\n if (entry.isSymbolicLink()) throw new Error(`${label} 不允许 symlink: ${candidate}`)\n if (entry.isDirectory()) visit(candidate)\n else if (entry.isFile()) files.set(relative(path, candidate).split('\\\\').join('/'), readFileSync(candidate))\n }\n }\n visit(path)\n if (!files.has('SKILL.md')) throw new Error(`${label} 缺少 SKILL.md`)\n return treeFromFiles(files)\n}\n\nfunction treeFromFiles(files: Map<string, Buffer>): TreePayload {\n const index = [...files.entries()].sort(([a], [b]) => a.localeCompare(b))\n .map(([path, body]) => ({ path, hash: digest(body.toString('base64')) }))\n return { files, hash: digest(stableStringify(index)) }\n}\n\nfunction writeTree(target: string, tree: TreePayload): void {\n mkdirSync(target, { recursive: true })\n for (const [path, body] of tree.files) {\n const out = resolve(target, path)\n if (!isInside(target, out)) throw new Error(`Skill tree path 越界: ${path}`)\n mkdirSync(dirname(out), { recursive: true })\n writeFileSync(out, body, { flag: 'wx' })\n }\n}\n\nfunction copyEntry(source: string, destination: string): void {\n if (!existsSync(source)) throw new Error(`备份源不存在: ${source}`)\n mkdirSync(dirname(destination), { recursive: true })\n cpSync(source, destination, {\n recursive: lstatSync(source).isDirectory(), errorOnExist: true,\n filter: (path) => {\n if (lstatSync(path).isSymbolicLink()) throw new Error(`备份拒绝 symlink: ${path}`)\n return true\n },\n })\n}\n\nfunction rollback(\n root: string, operations: AgentEnhanceOperation[], backupRoot: string,\n backedUp: Set<string>, created: Set<string>,\n): void {\n for (const operation of operations) {\n const target = safeTarget(root, operation.path)\n if (created.has(operation.path)) rmSync(target, { recursive: true, force: true })\n else if (backedUp.has(operation.path)) {\n rmSync(target, { recursive: true, force: true })\n copyEntry(resolve(backupRoot, operation.path), target)\n }\n }\n}\n\nfunction stateHash(path: string): string {\n if (!existsSync(path)) return ''\n const stat = lstatSync(path)\n if (stat.isSymbolicLink()) throw new Error(`受管路径不允许 symlink: ${path}`)\n if (stat.isFile()) return digest(readFileSync(path).toString('base64'))\n if (!stat.isDirectory()) throw new Error(`受管路径类型不支持: ${path}`)\n const files = new Map<string, Buffer>()\n const visit = (directory: string) => {\n for (const entry of readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {\n const candidate = join(directory, entry.name)\n if (entry.isSymbolicLink()) throw new Error(`受管目录不允许 symlink: ${candidate}`)\n if (entry.isDirectory()) visit(candidate)\n else if (entry.isFile()) files.set(relative(path, candidate).split('\\\\').join('/'), readFileSync(candidate))\n }\n }\n visit(path)\n return treeFromFiles(files).hash\n}\n\nfunction writeAtomic(path: string, body: string): void {\n mkdirSync(dirname(path), { recursive: true })\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`\n writeFileSync(temporary, body, { flag: 'wx' })\n renameSync(temporary, path)\n}\n\nfunction assertDirectory(path: string, label: string): void {\n if (!existsSync(path) || !statSync(path).isDirectory()) throw new Error(`${label} 不存在或不是目录`)\n}\n\nfunction assertRegularFile(path: string, label: string): void {\n if (!existsSync(path) || !lstatSync(path).isFile() || lstatSync(path).isSymbolicLink()) {\n throw new Error(`${label} 必须是普通文件`)\n }\n}\n\nfunction safeTarget(root: string, path: string): string {\n const ref = safeRelative(path, 'managed path')\n const target = resolve(root, ref)\n if (!isInside(root, target)) throw new Error(`受管路径越出 Agent root: ${path}`)\n let current = root\n for (const part of ref.split('/').slice(0, -1)) {\n current = join(current, part)\n if (existsSync(current) && lstatSync(current).isSymbolicLink()) {\n throw new Error(`受管路径不能穿过 symlink: ${path}`)\n }\n }\n return target\n}\n\nfunction safeRelative(value: string, label: string): string {\n const text = String(value || '').trim().split('\\\\').join('/')\n if (!text || text.startsWith('/') || text.split('/').some((item) => !item || item === '..')) {\n throw new Error(`${label} 必须是 Agent 根目录内的相对路径: ${value}`)\n }\n return text.replace(/^\\.\\//, '')\n}\n\nfunction safeLocalRoute(route: string, provider: string, label: string): string {\n if (!route.startsWith(`${provider}:`)) throw new Error(`${label} 必须使用 ${provider}`)\n return safeRelative(route.slice(provider.length + 1), label)\n}\n\nfunction frontmatterName(body: string): string {\n const block = body.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/)?.[1] || ''\n return block.match(/^name:\\s*[\"']?([^\"'\\r\\n]+)[\"']?\\s*$/m)?.[1]?.trim() || ''\n}\n\nfunction normalizeName(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 64)\n}\n\nfunction shellArg(value: string): string {\n return /^[A-Za-z0-9_./:=@^+-]+$/.test(value) ? value : `'${value.replaceAll(\"'\", `'\"'\"'`)}'`\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const rel = relative(root, candidate)\n return rel === '' || (rel !== '..' && !rel.startsWith(`..${process.platform === 'win32' ? '\\\\' : '/'}`))\n}\n"]}
@@ -0,0 +1,158 @@
1
+ // Managed Agent Platform 注册表与工作区归属解析。
2
+ //
3
+ // 一个 Agent 工作区归属于至多一个托管平台;归属解析顺序固定:
4
+ // DTA_AGENT_PLATFORM 环境变量 > dingtalk-agent.json#agentPlatform
5
+ // > .dingtalk-agent/agent-platform.json > 按 Provider 声明推断。
6
+ // 平台相关的方法学不写进 CLI——它们随对应平台的 Skill 包分发,只在用户选择该平台时安装。
7
+ // 平台命令(如 deploy/promote/observe)必须先通过归属门禁;coming-soon 平台一律 fail-closed。
8
+ import { existsSync, lstatSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
9
+ import { dirname, join, parse, resolve } from 'node:path';
10
+ import { findAgentProjectRoot } from './development-workspace.js';
11
+ import { installGlobalSkill } from './skill-manager.js';
12
+ export const MANAGED_AGENT_PLATFORMS = [
13
+ {
14
+ name: 'multica-dingtalk',
15
+ label: 'Multica (DingTalk)',
16
+ status: 'supported',
17
+ description: '钉钉 Multica 托管平台:受控部署、晋级与观测回流。',
18
+ skills: ['dingtalk-agent-deploy', 'dingtalk-agent-boot-multica'],
19
+ commands: ['deploy', 'promote', 'observe'],
20
+ },
21
+ {
22
+ name: 'deap',
23
+ label: 'DEAP',
24
+ status: 'coming-soon',
25
+ description: '敬请期待。',
26
+ skills: [],
27
+ commands: [],
28
+ },
29
+ ];
30
+ export const AGENT_PLATFORM_FILE = '.dingtalk-agent/agent-platform.json';
31
+ const PROJECT_FILE = 'dingtalk-agent.json';
32
+ export function agentPlatformDefinition(name) {
33
+ return MANAGED_AGENT_PLATFORMS.find((item) => item.name === name) || null;
34
+ }
35
+ export function resolveAgentPlatform(start = process.cwd(), env = process.env) {
36
+ const fromEnv = String(env.DTA_AGENT_PLATFORM || '').trim();
37
+ if (fromEnv)
38
+ return resolution(fromEnv, 'env', '');
39
+ const projectRoot = findAgentProjectRoot(start);
40
+ if (projectRoot) {
41
+ const manifestPath = join(projectRoot, PROJECT_FILE);
42
+ if (existsSync(manifestPath) && !lstatSync(manifestPath).isSymbolicLink()) {
43
+ const manifest = readJsonOrNull(manifestPath);
44
+ const declared = typeof manifest?.agentPlatform === 'string' ? manifest.agentPlatform.trim() : '';
45
+ if (declared)
46
+ return resolution(declared, 'project-manifest', manifestPath);
47
+ }
48
+ }
49
+ const platformPath = findUp(start, AGENT_PLATFORM_FILE);
50
+ if (platformPath) {
51
+ const stored = readJsonOrNull(platformPath);
52
+ const declared = typeof stored?.agentPlatform === 'string' ? stored.agentPlatform.trim() : '';
53
+ if (declared)
54
+ return resolution(declared, 'platform-file', platformPath);
55
+ }
56
+ if (projectRoot) {
57
+ const manifest = readJsonOrNull(join(projectRoot, PROJECT_FILE));
58
+ const providers = Object.values(manifest?.workspaces || {})
59
+ .map((workspace) => workspace?.provider?.kind);
60
+ if (providers.includes('multica')) {
61
+ return resolution('multica-dingtalk', 'inferred', join(projectRoot, PROJECT_FILE));
62
+ }
63
+ }
64
+ return resolution(null, 'none', '');
65
+ }
66
+ export function useAgentPlatform(start, name, options) {
67
+ const definition = agentPlatformDefinition(name);
68
+ if (!definition) {
69
+ throw new Error(`未知 managed agent platform: ${name}\n` +
70
+ `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => `${item.name}(${statusLabel(item.status)})`).join('、')}`);
71
+ }
72
+ if (definition.status !== 'supported') {
73
+ throw new Error(`${definition.label} 敬请期待——当前版本尚未开放该平台。`);
74
+ }
75
+ const projectRoot = findAgentProjectRoot(start);
76
+ let written;
77
+ if (projectRoot && existsSync(join(projectRoot, PROJECT_FILE))) {
78
+ const manifestPath = join(projectRoot, PROJECT_FILE);
79
+ if (lstatSync(manifestPath).isSymbolicLink()) {
80
+ throw new Error(`${PROJECT_FILE} 不能是符号链接`);
81
+ }
82
+ const manifest = readJsonOrNull(manifestPath);
83
+ if (!manifest || typeof manifest !== 'object') {
84
+ throw new Error(`${PROJECT_FILE} 不是合法 JSON,无法写入 agentPlatform 归属`);
85
+ }
86
+ manifest.agentPlatform = definition.name;
87
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
88
+ written = manifestPath;
89
+ }
90
+ else {
91
+ const target = join(resolve(start), AGENT_PLATFORM_FILE);
92
+ mkdirSync(dirname(target), { recursive: true });
93
+ writeFileSync(target, JSON.stringify({ $schema: 'dingtalk-agent/agent-platform@1', agentPlatform: definition.name }, null, 2) + '\n');
94
+ written = target;
95
+ }
96
+ const skillInstalls = [];
97
+ if (options.installSkills !== false) {
98
+ for (const skill of definition.skills) {
99
+ skillInstalls.push(installGlobalSkill(options.packageRoot, {
100
+ name: skill, home: options.home, env: options.env,
101
+ }));
102
+ }
103
+ }
104
+ return { ...resolveAgentPlatform(start, options.env || process.env), written, skillInstalls };
105
+ }
106
+ /** deploy/promote/observe 等平台命令的归属门禁:未归属、未知或 coming-soon 一律 fail-closed。 */
107
+ export function requireSupportedAgentPlatform(command, start = process.cwd(), env = process.env) {
108
+ const resolved = resolveAgentPlatform(start, env);
109
+ if (!resolved.platform) {
110
+ throw new Error(`当前工作区未声明 managed agent platform,无法执行 \`${command}\`。\n` +
111
+ '先运行 `dta agent-platform use multica-dingtalk`,或设置 DTA_AGENT_PLATFORM 环境变量。');
112
+ }
113
+ if (!resolved.definition) {
114
+ throw new Error(`工作区声明了未知 platform: ${resolved.platform}(来源 ${resolved.source})。\n` +
115
+ `可用: ${MANAGED_AGENT_PLATFORMS.map((item) => item.name).join('、')}`);
116
+ }
117
+ if (resolved.definition.status !== 'supported') {
118
+ throw new Error(`${resolved.definition.label} 敬请期待——\`${command}\` 尚未在该平台开放。`);
119
+ }
120
+ if (!resolved.definition.commands.includes(command)) {
121
+ throw new Error(`${resolved.definition.label} 不承接命令 \`${command}\`。`);
122
+ }
123
+ return resolved;
124
+ }
125
+ export function statusLabel(status) {
126
+ return status === 'supported' ? '已支持' : '敬请期待';
127
+ }
128
+ function resolution(name, source, file) {
129
+ return {
130
+ $schema: 'dingtalk-agent/agent-platform-resolution@1',
131
+ platform: name,
132
+ source,
133
+ file,
134
+ definition: name ? agentPlatformDefinition(name) : null,
135
+ platforms: MANAGED_AGENT_PLATFORMS,
136
+ };
137
+ }
138
+ function readJsonOrNull(path) {
139
+ try {
140
+ return JSON.parse(readFileSync(path, 'utf8'));
141
+ }
142
+ catch {
143
+ return null;
144
+ }
145
+ }
146
+ function findUp(start, relativePath) {
147
+ let dir = resolve(start);
148
+ while (true) {
149
+ const candidate = join(dir, relativePath);
150
+ if (existsSync(candidate) && !lstatSync(candidate).isSymbolicLink())
151
+ return candidate;
152
+ const parent = dirname(dir);
153
+ if (parent === dir || dir === parse(dir).root)
154
+ return null;
155
+ dir = parent;
156
+ }
157
+ }
158
+ //# sourceMappingURL=agent-platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-platform.js","sourceRoot":"","sources":["../../src/agent-platform.ts"],"names":[],"mappings":"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","sourcesContent":["// Managed Agent Platform 注册表与工作区归属解析。\n//\n// 一个 Agent 工作区归属于至多一个托管平台;归属解析顺序固定:\n// DTA_AGENT_PLATFORM 环境变量 > dingtalk-agent.json#agentPlatform\n// > .dingtalk-agent/agent-platform.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 AgentPlatformStatus = 'supported' | 'coming-soon'\n\nexport interface AgentPlatformDefinition {\n name: string\n label: string\n status: AgentPlatformStatus\n description: string\n skills: string[]\n commands: string[]\n}\n\nexport const MANAGED_AGENT_PLATFORMS: AgentPlatformDefinition[] = [\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 AGENT_PLATFORM_FILE = '.dingtalk-agent/agent-platform.json'\nconst PROJECT_FILE = 'dingtalk-agent.json'\n\nexport type AgentPlatformSource = 'env' | 'project-manifest' | 'platform-file' | 'inferred' | 'none'\n\nexport interface AgentPlatformResolution {\n $schema: 'dingtalk-agent/agent-platform-resolution@1'\n platform: string | null\n source: AgentPlatformSource\n file: string\n definition: AgentPlatformDefinition | null\n platforms: AgentPlatformDefinition[]\n}\n\nexport interface AgentPlatformUseResult extends AgentPlatformResolution {\n written: string\n skillInstalls: GlobalSkillStatus[]\n}\n\nexport function agentPlatformDefinition(name: string): AgentPlatformDefinition | null {\n return MANAGED_AGENT_PLATFORMS.find((item) => item.name === name) || null\n}\n\nexport function resolveAgentPlatform(\n start = process.cwd(), env: NodeJS.ProcessEnv = process.env,\n): AgentPlatformResolution {\n const fromEnv = String(env.DTA_AGENT_PLATFORM || '').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?.agentPlatform === 'string' ? manifest.agentPlatform.trim() : ''\n if (declared) return resolution(declared, 'project-manifest', manifestPath)\n }\n }\n\n const platformPath = findUp(start, AGENT_PLATFORM_FILE)\n if (platformPath) {\n const stored = readJsonOrNull(platformPath)\n const declared = typeof stored?.agentPlatform === 'string' ? stored.agentPlatform.trim() : ''\n if (declared) return resolution(declared, 'platform-file', platformPath)\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 AgentPlatformUseOptions {\n packageRoot: string\n home?: string\n env?: NodeJS.ProcessEnv\n installSkills?: boolean\n}\n\nexport function useAgentPlatform(\n start: string, name: string, options: AgentPlatformUseOptions,\n): AgentPlatformUseResult {\n const definition = agentPlatformDefinition(name)\n if (!definition) {\n throw new Error(\n `未知 managed agent 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,无法写入 agentPlatform 归属`)\n }\n manifest.agentPlatform = definition.name\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\\n')\n written = manifestPath\n } else {\n const target = join(resolve(start), AGENT_PLATFORM_FILE)\n mkdirSync(dirname(target), { recursive: true })\n writeFileSync(target, JSON.stringify(\n { $schema: 'dingtalk-agent/agent-platform@1', agentPlatform: 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 { ...resolveAgentPlatform(start, options.env || process.env), written, skillInstalls }\n}\n\n/** deploy/promote/observe 等平台命令的归属门禁:未归属、未知或 coming-soon 一律 fail-closed。 */\nexport function requireSupportedAgentPlatform(\n command: string, start = process.cwd(), env: NodeJS.ProcessEnv = process.env,\n): AgentPlatformResolution {\n const resolved = resolveAgentPlatform(start, env)\n if (!resolved.platform) {\n throw new Error(\n `当前工作区未声明 managed agent platform,无法执行 \\`${command}\\`。\\n` +\n '先运行 `dta agent-platform use multica-dingtalk`,或设置 DTA_AGENT_PLATFORM 环境变量。',\n )\n }\n if (!resolved.definition) {\n throw new Error(\n `工作区声明了未知 platform: ${resolved.platform}(来源 ${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: AgentPlatformStatus): string {\n return status === 'supported' ? '已支持' : '敬请期待'\n}\n\nfunction resolution(\n name: string | null, source: AgentPlatformSource, file: string,\n): AgentPlatformResolution {\n return {\n $schema: 'dingtalk-agent/agent-platform-resolution@1',\n platform: name,\n source,\n file,\n definition: name ? agentPlatformDefinition(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,22 +4,57 @@
4
4
  // - local-dir 直接返回可读的 Markdown 挂载;
5
5
  // - dingtalk-doc 通过 DWS 拉成隐藏的只读快照;
6
6
  // - 已有 workspace@1 时复用其中的 mounts。
7
- import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync, } from 'node:fs';
7
+ import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, writeFileSync, } from 'node:fs';
8
8
  import { basename, dirname, join, relative, resolve } from 'node:path';
9
9
  import { digest } from './events.js';
10
10
  import * as dws from './dws.js';
11
+ import { buildBootstrapDefinition } from './agent-definition.js';
12
+ import { directInvocation } from './invocation.js';
11
13
  import { loadWorkspace, workspacePath } from './workspace.js';
12
14
  export function bootstrap(root, options = {}) {
13
- const cwd = resolve(root);
15
+ // Canonicalize aliases such as macOS /var -> /private/var so bootstrap,
16
+ // agent audit, evidence fingerprints, and later Session snapshots hash the
17
+ // same Agent root.
18
+ const cwd = realpathSync(resolve(root));
14
19
  const hasWorkspace = existsSync(workspacePath(cwd));
15
20
  const workspace = hasWorkspace ? loadWorkspace(cwd) : null;
16
- const storage = options.storage?.trim() || (workspace ? 'workspace-manifest' : `local-dir:${cwd}`);
17
- const stateDir = resolve(cwd, options.stateDir || process.env.DTA_STATE_DIR || '.dingtalk-agent');
18
- const mounts = workspace && !options.storage
19
- ? hydrateWorkspace(cwd, workspace, stateDir, options.profile)
20
- : hydrateStorage(cwd, storage, stateDir, options.profile, 'workspace');
21
+ const agent = select(options.agent || options.storage, options.context?.agent, process.env.DTA_AGENT_SOURCE, workspace ? 'workspace-manifest' : '', `local-dir:${cwd}`);
22
+ const memory = select(options.memory, options.context?.memory, process.env.DTA_MEMORY_STORAGE, workspace?.mounts.memory || '', existsSync(join(cwd, 'MEMORY.md')) ? 'local-md:MEMORY.md' : '');
23
+ const knowledge = select(options.knowledge, options.context?.knowledge, process.env.DTA_KNOWLEDGE_STORAGE, workspace?.mounts.knowledge || '', existsSync(join(cwd, 'knowledge', 'INDEX.md')) ? 'local-md:knowledge/INDEX.md' : '');
24
+ const skills = select(options.skills, options.context?.skills, process.env.DTA_SKILLS_SOURCE, workspace?.mounts.skills || '', existsSync(join(cwd, 'skills')) ? 'local-dir:skills' : '');
25
+ const state = select(options.stateDir, options.context?.stateDir, process.env.DTA_STATE_DIR, '', '.dingtalk-agent');
26
+ const artifacts = select(options.artifacts, options.context?.artifacts, process.env.DTA_ARTIFACTS_STORAGE, '', `local-dir:${resolve(cwd, state.value, 'artifacts')}`);
27
+ const dwsProfile = select(options.profile, options.context?.profile, process.env.DTA_DWS_PROFILE, workspace?.dws.profile || '', '');
28
+ const expectedUserId = select(options.expectedUserId, options.context?.expectedUserId, process.env.DTA_EXPECTED_USER_ID, workspace?.dws.expectedUserId || '', '');
29
+ const storage = agent.value;
30
+ const stateDir = resolve(cwd, state.value);
31
+ let mounts = workspace && agent.value === 'workspace-manifest'
32
+ ? hydrateWorkspace(cwd, workspace, stateDir, dwsProfile.value, options.deferRemote)
33
+ : hydrateStorage(cwd, agent.value, stateDir, dwsProfile.value, 'body', options.deferRemote);
34
+ mounts = mergeMounts(mounts, hydrateOptional(cwd, memory.value, stateDir, dwsProfile.value, 'memory', options.deferRemote));
35
+ mounts = mergeMounts(mounts, hydrateOptional(cwd, knowledge.value, stateDir, dwsProfile.value, 'knowledge', options.deferRemote));
36
+ mounts = mergeMounts(mounts, hydrateOptional(cwd, skills.value, stateDir, dwsProfile.value, 'skills', options.deferRemote));
21
37
  const contextId = workspace?.contextId || '';
22
- const scopeSeed = contextId || canonicalStorageSeed(storage, cwd);
38
+ const scopeSeed = agent.value === 'workspace-manifest' && contextId
39
+ ? contextId : canonicalStorageSeed(storage, cwd);
40
+ const sourcePath = storage.startsWith('local-dir:')
41
+ ? safeLocalPath(cwd, parseStorage(storage).ref, true) : '';
42
+ const origins = {
43
+ agent: agent.origin, memory: memory.origin, knowledge: knowledge.origin,
44
+ skills: skills.origin, artifacts: artifacts.origin, state: state.origin,
45
+ dwsProfile: dwsProfile.origin, expectedUserId: expectedUserId.origin,
46
+ };
47
+ const definition = buildBootstrapDefinition(mounts, {
48
+ source: storage,
49
+ sourcePath,
50
+ memory: memory.value,
51
+ knowledge: knowledge.value,
52
+ artifacts: artifacts.value,
53
+ state: stateDir,
54
+ dwsProfile: dwsProfile.value,
55
+ expectedUserId: expectedUserId.value,
56
+ origins,
57
+ }, agent.value === 'workspace-manifest' ? workspace : null);
23
58
  return {
24
59
  $schema: 'dingtalk-agent/bootstrap@1',
25
60
  mode: workspace ? 'workspace' : 'direct',
@@ -29,29 +64,42 @@ export function bootstrap(root, options = {}) {
29
64
  storage,
30
65
  stateDir: mounts.some((item) => item.provider === 'dingtalk-doc') ? stateDir : '',
31
66
  mounts,
67
+ definition,
68
+ invocation: directInvocation(),
32
69
  note: hasWorkspace
33
70
  ? '已读取现有 Workspace;init 不是每次 Session 的前置动作。'
34
71
  : '未初始化 Workspace;已按直接会话模式工作,不会自动修改当前目录。',
35
72
  };
36
73
  }
37
- function hydrateWorkspace(root, workspace, stateDir, profile = '') {
74
+ function hydrateWorkspace(root, workspace, stateDir, profile = '', deferRemote = false) {
38
75
  const out = [];
39
76
  for (const slot of ['profile', 'memory', 'knowledge']) {
40
- out.push(...hydrateStorage(root, workspace.mounts[slot], stateDir, profile || workspace.dws.profile, slot));
77
+ out.push(...hydrateStorage(root, workspace.mounts[slot], stateDir, profile || workspace.dws.profile, slot, deferRemote));
41
78
  }
42
79
  return out;
43
80
  }
44
- function hydrateStorage(root, uri, stateDir, profile = '', slot = 'workspace') {
81
+ function hydrateStorage(root, uri, stateDir, profile = '', slot = 'workspace', deferRemote = false) {
45
82
  const mount = parseStorage(uri);
46
- if (mount.provider === 'local-dir')
47
- return discoverLocalDirectory(root, mount.ref);
83
+ if (mount.provider === 'local-dir') {
84
+ if (slot === 'skills') {
85
+ return discoverSkillDirectory(root, mount.ref);
86
+ }
87
+ const discovered = discoverLocalDirectory(root, mount.ref);
88
+ return slot === 'body' || slot === 'workspace'
89
+ ? discovered
90
+ : discovered.filter((item) => item.slot === slot);
91
+ }
48
92
  if (mount.provider === 'local-md') {
49
93
  const path = safeLocalPath(root, mount.ref, false);
50
94
  if (!path)
51
95
  return [];
52
96
  const markdown = readFileSync(path, 'utf8');
53
- return [{ slot, provider: mount.provider, source: uri, path, hash: digest(markdown) }];
97
+ const effectiveSlot = slot === 'skills'
98
+ ? `skill:${readSkillName(markdown) || safeName(path)}` : slot;
99
+ return [{ slot: effectiveSlot, provider: mount.provider, source: uri, path, hash: digest(markdown) }];
54
100
  }
101
+ if (deferRemote)
102
+ return [];
55
103
  // /i/nodes URL 是多产品统一入口;先 probe,只有在线文档 adoc 才能作为 Markdown Storage。
56
104
  const info = dws.docInfo(mount.ref, profile);
57
105
  const contentType = String(info?.contentType || '').toUpperCase();
@@ -61,8 +109,14 @@ function hydrateStorage(root, uri, stateDir, profile = '', slot = 'workspace') {
61
109
  }
62
110
  const markdown = String(dws.readDoc(mount.ref, profile));
63
111
  const scope = digest(uri).slice(0, 20);
64
- const path = join(stateDir, 'cache', 'bootstrap', scope, `${safeName(slot)}.md`);
65
- writeAtomic(path, markdown.endsWith('\n') ? markdown : `${markdown}\n`);
112
+ const effectiveSlot = slot === 'skills'
113
+ ? `skill:${readSkillName(markdown) || safeName(mount.ref)}` : slot;
114
+ // A single remote document may intentionally back more than one semantic slot.
115
+ // Give each slot its own directory so its manifest cannot overwrite another slot.
116
+ const path = join(stateDir, 'cache', 'bootstrap', scope, safeName(effectiveSlot), 'snapshot.md');
117
+ // Cache bytes must be identical to the independently read remote bytes. Adding
118
+ // formatting here would make the manifest hash describe data that is not on disk.
119
+ writeAtomic(path, markdown);
66
120
  const manifest = join(dirname(path), 'manifest.json');
67
121
  writeAtomic(manifest, JSON.stringify({
68
122
  $schema: 'dingtalk-agent/bootstrap-cache@1',
@@ -72,7 +126,7 @@ function hydrateStorage(root, uri, stateDir, profile = '', slot = 'workspace') {
72
126
  hash: digest(markdown),
73
127
  path,
74
128
  }, null, 2) + '\n');
75
- return [{ slot, provider: mount.provider, source: uri, path, hash: digest(markdown) }];
129
+ return [{ slot: effectiveSlot, provider: mount.provider, source: uri, path, hash: digest(markdown) }];
76
130
  }
77
131
  function discoverLocalDirectory(root, ref) {
78
132
  const directory = safeLocalPath(root, ref, true);
@@ -80,6 +134,7 @@ function discoverLocalDirectory(root, ref) {
80
134
  throw new Error(`local-dir 不是目录: ${ref}`);
81
135
  }
82
136
  const candidates = [
137
+ ['body', 'AGENTS.md'],
83
138
  ['profile', 'WORKSPACE.md'],
84
139
  ['memory', 'MEMORY.md'],
85
140
  ['knowledge', join('knowledge', 'INDEX.md')],
@@ -98,8 +153,61 @@ function discoverLocalDirectory(root, ref) {
98
153
  hash: digest(markdown),
99
154
  });
100
155
  }
156
+ out.push(...discoverSkillDirectory(root, join(directory, 'skills'), true));
101
157
  return out;
102
158
  }
159
+ function discoverSkillDirectory(root, ref, optional = false) {
160
+ const candidate = resolve(root, ref);
161
+ if (!existsSync(candidate)) {
162
+ if (optional)
163
+ return [];
164
+ throw new Error(`Skill Storage 不存在: ${ref}`);
165
+ }
166
+ const directory = realpathSync(candidate);
167
+ if (!lstatSync(directory).isDirectory())
168
+ throw new Error(`Skill Storage 不是目录: ${ref}`);
169
+ const roots = existsSync(join(directory, 'SKILL.md'))
170
+ ? [directory]
171
+ : readdirSync(directory).sort().map((name) => join(directory, name))
172
+ .filter((path) => existsSync(join(path, 'SKILL.md')) && lstatSync(path).isDirectory());
173
+ return roots.map((path) => {
174
+ const markdown = readFileSync(join(path, 'SKILL.md'), 'utf8');
175
+ const name = readSkillName(markdown) || basename(path);
176
+ return {
177
+ slot: `skill:${name}`, provider: 'local-dir',
178
+ source: `local-dir:${directory}`, path: join(path, 'SKILL.md'), hash: digest(markdown),
179
+ };
180
+ });
181
+ }
182
+ function hydrateOptional(root, uri, stateDir, profile, slot, deferRemote = false) {
183
+ return uri ? hydrateStorage(root, uri, stateDir, profile, slot, deferRemote) : [];
184
+ }
185
+ function mergeMounts(current, additions) {
186
+ const out = [...current];
187
+ for (const addition of additions) {
188
+ const index = out.findIndex((item) => item.slot === addition.slot);
189
+ if (index >= 0)
190
+ out[index] = addition;
191
+ else
192
+ out.push(addition);
193
+ }
194
+ return out;
195
+ }
196
+ function readSkillName(markdown) {
197
+ const frontmatter = markdown.match(/^---\r?\n([\s\S]*?)\r?\n---/);
198
+ return frontmatter?.[1].match(/^name:\s*['"]?([^'"\r\n]+)['"]?\s*$/m)?.[1]?.trim() || '';
199
+ }
200
+ function select(explicit, context, environment, workspace, convention) {
201
+ const choices = [
202
+ [explicit, 'explicit'], [context, 'context'], [environment, 'environment'],
203
+ [workspace, 'workspace'], [convention, 'convention'],
204
+ ];
205
+ for (const [value, origin] of choices) {
206
+ if (typeof value === 'string' && value.trim())
207
+ return { value: value.trim(), origin };
208
+ }
209
+ return { value: '', origin: 'convention' };
210
+ }
103
211
  function parseStorage(uri) {
104
212
  const separator = uri.indexOf(':');
105
213
  const provider = separator < 0 ? '' : uri.slice(0, separator);