@xdxer/dingtalk-agent 0.1.4 → 0.1.5-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/CHANGELOG.md +232 -0
  2. package/README.en.md +115 -89
  3. package/README.md +111 -86
  4. package/dist/bin/dingtalk-agent.js +742 -152
  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-definition.js +7 -3
  11. package/dist/src/agent-definition.js.map +1 -1
  12. package/dist/src/agent-enhance.js +51 -32
  13. package/dist/src/agent-enhance.js.map +1 -1
  14. package/dist/src/agent-platform.js +4 -4
  15. package/dist/src/agent-platform.js.map +1 -1
  16. package/dist/src/bootstrap.js +6 -2
  17. package/dist/src/bootstrap.js.map +1 -1
  18. package/dist/src/development-workspace.js +210 -34
  19. package/dist/src/development-workspace.js.map +1 -1
  20. package/dist/src/doctor.js +65 -9
  21. package/dist/src/doctor.js.map +1 -1
  22. package/dist/src/dws.js +67 -3
  23. package/dist/src/dws.js.map +1 -1
  24. package/dist/src/init.js +2 -1
  25. package/dist/src/init.js.map +1 -1
  26. package/dist/src/memory/noop-receipt.js +306 -0
  27. package/dist/src/memory/noop-receipt.js.map +1 -0
  28. package/dist/src/memory/operational.js +27 -3
  29. package/dist/src/memory/operational.js.map +1 -1
  30. package/dist/src/memory/remote-state.js +2 -1
  31. package/dist/src/memory/remote-state.js.map +1 -1
  32. package/dist/src/multica-deploy.js +692 -125
  33. package/dist/src/multica-deploy.js.map +1 -1
  34. package/dist/src/multica-provider.js +303 -25
  35. package/dist/src/multica-provider.js.map +1 -1
  36. package/dist/src/multica-runtime-vocabulary.js +110 -0
  37. package/dist/src/multica-runtime-vocabulary.js.map +1 -0
  38. package/dist/src/opencode-evals.js +6 -6
  39. package/dist/src/opencode-evals.js.map +1 -1
  40. package/dist/src/opencode-provider.js +21 -7
  41. package/dist/src/opencode-provider.js.map +1 -1
  42. package/dist/src/opencode-workspace.js +3 -3
  43. package/dist/src/opencode-workspace.js.map +1 -1
  44. package/dist/src/personal-event-evals.js +4 -2
  45. package/dist/src/personal-event-evals.js.map +1 -1
  46. package/dist/src/promotion.js +2 -1
  47. package/dist/src/promotion.js.map +1 -1
  48. package/dist/src/remote-semantic-state-live-evals.js +14 -8
  49. package/dist/src/remote-semantic-state-live-evals.js.map +1 -1
  50. package/dist/src/remote-state-evals.js +2 -2
  51. package/dist/src/remote-state-evals.js.map +1 -1
  52. package/dist/src/robot-evals.js +3 -3
  53. package/dist/src/robot-evals.js.map +1 -1
  54. package/dist/src/schedule-plan.js +380 -0
  55. package/dist/src/schedule-plan.js.map +1 -0
  56. package/dist/src/sessions.js +1 -1
  57. package/dist/src/sessions.js.map +1 -1
  58. package/dist/src/skill-manager.js +145 -13
  59. package/dist/src/skill-manager.js.map +1 -1
  60. package/dist/src/skills.js +2 -0
  61. package/dist/src/skills.js.map +1 -1
  62. package/dist/src/tui.js +369 -0
  63. package/dist/src/tui.js.map +1 -0
  64. package/dist/src/upgrade.js +113 -33
  65. package/dist/src/upgrade.js.map +1 -1
  66. package/dist/src/waits.js +2 -1
  67. package/dist/src/waits.js.map +1 -1
  68. package/dist/src/workspace.js +12 -7
  69. package/dist/src/workspace.js.map +1 -1
  70. package/docs/AGENT-IN-PRODUCTION.md +255 -0
  71. package/docs/ARCHITECTURE.md +366 -0
  72. package/docs/INSTALLATION.md +8 -8
  73. package/docs/PLATFORM-GUARDRAILS.md +188 -0
  74. package/docs/PRIOR-ART.md +126 -0
  75. package/docs/SELF-TEST.md +182 -0
  76. package/docs/architecture/agent-platform-connection-layer.svg +120 -0
  77. package/docs/architecture/digital-employee-composition.svg +92 -0
  78. package/docs/architecture/dingtalk-agent-architecture.svg +125 -0
  79. package/docs/assets/digital-employee-at-work.svg +77 -0
  80. package/docs/schemas/multica-deployment-plan.schema.json +3 -1
  81. package/docs/schemas/multica-deployment-receipt.schema.json +17 -3
  82. package/docs/schemas/multica-deployment-status.schema.json +6 -2
  83. package/docs/schemas/multica-workspace-inspection.schema.json +16 -0
  84. package/docs/schemas/multica-workspace-run-plan.schema.json +31 -0
  85. package/docs/schemas/multica-workspace-run.schema.json +161 -0
  86. package/docs/schemas/multica-workspace-status.schema.json +2 -0
  87. package/docs/schemas/project.schema.json +54 -3
  88. package/docs/schemas/workspace-scaffold.schema.json +38 -0
  89. package/examples/agents/README.md +45 -0
  90. package/examples/agents/fde-coach/AGENTS.md +2 -25
  91. package/examples/agents/fde-coach/agent/AGENTS.md +35 -0
  92. package/examples/agents/fde-coach/agent.bindings.json +10 -0
  93. package/examples/agents/release-manager/AGENTS.md +2 -25
  94. package/examples/agents/release-manager/agent/AGENTS.md +35 -0
  95. package/examples/agents/release-manager/agent.bindings.json +10 -0
  96. package/lab/agent-eval/catalog.json +5 -5
  97. package/lab/agent-eval/classic-failures.json +4 -4
  98. package/lab/agent-eval/completion-gate-regression.json +9 -9
  99. package/lab/agent-eval/personal-event-live.example.json +3 -3
  100. package/lab/agent-eval/remote-semantic-state-live.example.json +1 -1
  101. package/lab/agent-eval/workspace/opencode.json +2 -2
  102. package/lab/project-workspace/fake-multica-provider.mjs +171 -17
  103. package/lab/project-workspace/multica-deploy.fixture.json +2 -2
  104. package/lab/project-workspace/multica-readonly.fixture.json +4 -16
  105. package/lab/project-workspace/opencode-provider-suite.json +3 -3
  106. package/lab/project-workspace/project.fixture.json +2 -6
  107. package/lab/robot-eval/suite.json +1 -1
  108. package/lab/robot-eval/workspace/AGENTS.md +1 -1
  109. package/lab/robot-eval/workspace/opencode.json +2 -2
  110. package/lab/schemas/personal-event-eval.schema.json +1 -1
  111. package/package.json +18 -11
  112. package/skills/README.md +10 -8
  113. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/SKILL.md +49 -24
  114. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/AGENTS.template.md +1 -1
  115. package/skills/core/dta-agent-compose/assets/REPOSITORY.template.md +10 -0
  116. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.dingtalk-doc.template.json +2 -2
  117. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/agent.bindings.local.template.json +2 -2
  118. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/hosts/opencode/opencode.template.json +3 -2
  119. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/evals/evals.json +4 -4
  120. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/agent-definition-contract.md +7 -7
  121. package/skills/core/dta-agent-compose/references/drive-and-schedules.md +166 -0
  122. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/host-loading-contract.md +11 -13
  123. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/claude-code.md +13 -12
  124. package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/hosts/opencode.md +14 -13
  125. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/SKILL.md +28 -3
  126. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/assets/eval-catalog.template.json +1 -1
  127. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/evals/evals.json +1 -1
  128. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/eval-topology.md +3 -3
  129. package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/interactive-debug-channels.md +10 -4
  130. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/SKILL.md +21 -5
  131. package/skills/core/dta-basic-behavior/references/event-to-behavior.md +38 -0
  132. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/memory-and-evolution.md +3 -1
  133. package/skills/core/dta-basic-behavior/references/perception-and-gates.md +87 -0
  134. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/risk-authority-and-privacy.md +12 -0
  135. package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/truth-and-recovery.md +4 -2
  136. package/skills/core/dta-people-group-memory/COMPLETENESS.md +36 -0
  137. package/skills/core/dta-people-group-memory/SKILL.md +69 -0
  138. package/skills/core/dta-people-group-memory/references/adapters.md +273 -0
  139. package/skills/core/dta-people-group-memory/references/assembly-guidance.md +40 -0
  140. package/skills/core/dta-people-group-memory/references/binding.md +110 -0
  141. package/skills/core/dta-people-group-memory/references/cold-start.md +70 -0
  142. package/skills/core/dta-people-group-memory/references/config-binding.md +89 -0
  143. package/skills/core/dta-people-group-memory/references/consent-and-visibility.md +83 -0
  144. package/skills/core/dta-people-group-memory/references/consolidation.md +162 -0
  145. package/skills/core/dta-people-group-memory/references/event-ingest.md +103 -0
  146. package/skills/core/dta-people-group-memory/references/guided-setup.md +70 -0
  147. package/skills/core/dta-people-group-memory/references/model.md +148 -0
  148. package/skills/core/dta-people-group-memory/references/storage-port.md +107 -0
  149. package/skills/platforms/deap/PLATFORM.md +30 -1
  150. package/skills/platforms/multica-dingtalk/PLATFORM.md +35 -9
  151. package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/SKILL.md +10 -8
  152. package/skills/platforms/multica-dingtalk/dta-deploy-multica/references/multica-deployment-contract.md +67 -0
  153. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/SKILL.md +81 -11
  154. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/bootstrap.sh +2 -2
  155. package/skills/platforms/multica-dingtalk/{multica-external → dta-ops-multica}/scripts/multica_ext.py +264 -16
  156. package/dist/src/map.js +0 -157
  157. package/dist/src/map.js.map +0 -1
  158. package/docs/SECOND-AGENT-ACCEPTANCE.md +0 -62
  159. package/docs/architecture/agent-memory-topology.png +0 -0
  160. package/docs/architecture/agent-memory-topology.svg +0 -132
  161. package/docs/architecture/dingtalk-agent-blueprint.png +0 -0
  162. package/docs/architecture/durable-async-agent-runtime.png +0 -0
  163. package/docs/architecture/general-agent-kernel-topology.png +0 -0
  164. package/docs/architecture/provider-bound-development-workspace.png +0 -0
  165. package/docs/architecture/task-completion-gate.png +0 -0
  166. package/docs/assets/agent-delivery-lifecycle.svg +0 -103
  167. package/skills/core/dingtalk-basic-behavior/references/event-to-behavior.md +0 -24
  168. package/skills/core/dingtalk-basic-behavior/references/perception-and-gates.md +0 -28
  169. package/skills/platforms/deap/README.md +0 -3
  170. package/skills/platforms/multica-dingtalk/dingtalk-agent-boot-multica/SKILL.md +0 -40
  171. package/skills/platforms/multica-dingtalk/dingtalk-agent-deploy-multica/references/multica-deployment-contract.md +0 -49
  172. /package/examples/agents/fde-coach/{skills → agent/skills}/fde-coach/SKILL.md +0 -0
  173. /package/examples/agents/release-manager/{skills → agent/skills}/release-manager/SKILL.md +0 -0
  174. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/assets/role-skill.template.md +0 -0
  175. /package/skills/core/{dingtalk-agent-compose → dta-agent-compose}/references/storage-routing.md +0 -0
  176. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/evidence-contract.md +0 -0
  177. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/failure-to-case.md +0 -0
  178. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/local-connector-smoke.md +0 -0
  179. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/scenario-taxonomy.md +0 -0
  180. /package/skills/core/{dingtalk-agent-eval → dta-agent-eval}/references/storage-modes.md +0 -0
  181. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/memory-candidate-proposal.json +0 -0
  182. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/assets/task-checkpoint.json +0 -0
  183. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/action-contract.md +0 -0
  184. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/runtime-modes.md +0 -0
  185. /package/skills/core/{dingtalk-basic-behavior → dta-basic-behavior}/references/task-lifecycle.md +0 -0
  186. /package/skills/platforms/multica-dingtalk/{dingtalk-agent-deploy-multica → dta-deploy-multica}/references/promotion-observation-contract.md +0 -0
@@ -0,0 +1,125 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 880" width="1200" height="880" role="img" aria-labelledby="title desc">
2
+ <title id="title">dingtalk-agent 架构:五个部件,五个权威</title>
3
+ <desc id="desc">一个数字员工由五个部件构成,编号一到五:部件一 Agent 本体由本仓库拥有,内含可信事件、响应闸门、Session Run Wait、动作闸门与 Receipt 回读的处理链,以及本体装配、状态记忆、评测证据三块支撑;部件二组织身份与场域授权、部件三感知通道由钉钉数字员工平台提供,当前尚未接入;部件四平台执行能力由 DWS 提供,执行全部真实钉钉操作并回读 Receipt;部件五运行位置由 Managed Agent Platform 或本地 Agent Host 提供,Multica 已支持、DEAP 敬请期待、更多平台需先在注册表登记并提供平台 Skill 包。最底层是钉钉组织。</desc>
4
+ <style>
5
+ text { font-family: 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif; }
6
+ .title { fill:#111827;font-size:22px;font-weight:700; }
7
+ .subtitle { fill:#6b7280;font-size:13px; }
8
+ .lane { fill:#475569;font-size:12px;font-weight:700;letter-spacing:.08em; }
9
+ .node-title { fill:#111827;font-size:15px;font-weight:700; }
10
+ .node-sub { fill:#4b5563;font-size:12px; }
11
+ .small { fill:#64748b;font-size:11px; }
12
+ .label { fill:#475569;font-size:11px;font-weight:600; }
13
+ .footer { fill:#ffffff;font-size:11px;font-weight:600; }
14
+ .badge-on { fill:#ffffff;font-size:12px;font-weight:700; }
15
+ </style>
16
+ <defs>
17
+ <marker id="arrow-blue" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto"><polygon points="0 0, 10 3.5, 0 7" fill="#2563eb"/></marker>
18
+ <marker id="arrow-gray" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto"><polygon points="0 0, 10 3.5, 0 7" fill="#64748b"/></marker>
19
+ <marker id="arrow-purple" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto"><polygon points="0 0, 10 3.5, 0 7" fill="#7c3aed"/></marker>
20
+ <marker id="arrow-teal" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto"><polygon points="0 0, 10 3.5, 0 7" fill="#0d9488"/></marker>
21
+ </defs>
22
+ <rect width="1200" height="880" fill="#ffffff"/>
23
+ <text x="40" y="46" class="title">dingtalk-agent 架构:五个部件,五个权威,本仓库只拥有一个</text>
24
+ <text x="40" y="70" class="subtitle">把 Agent 装配成合格的钉钉数字员工,并连接更广阔的 Agent 运行平台。实心编号 = 本仓库拥有;空心编号 = 外部提供。</text>
25
+ <rect x="40" y="92" width="1120" height="122" rx="8" fill="#f9fafb" stroke="#d1d5db" stroke-width="1.5" stroke-dasharray="7 5"/>
26
+ <circle cx="62" cy="110" r="11" fill="#ffffff" stroke="#64748b" stroke-width="1.6"/>
27
+ <text x="62" y="114" text-anchor="middle" fill="#64748b" font-size="12" font-weight="700">5</text>
28
+ <text x="82" y="115" class="lane">RUNTIME LOCATION · 运行位置(可替换)—— Agent 在哪里执行,本仓库不自建 Runtime</text>
29
+ <rect x="64" y="128" width="247" height="70" rx="8" fill="#f0fdf4" stroke="#86efac" stroke-width="1.5"/>
30
+ <text x="187" y="156" text-anchor="middle" class="node-title">Multica</text>
31
+ <text x="187" y="178" text-anchor="middle" class="node-sub">已支持</text>
32
+ <rect x="339" y="128" width="247" height="70" rx="8" fill="#faf5ff" stroke="#c084fc" stroke-width="1.5" stroke-dasharray="6 4"/>
33
+ <text x="462" y="156" text-anchor="middle" class="node-title">DEAP</text>
34
+ <text x="462" y="178" text-anchor="middle" class="node-sub">敬请期待 · 是否内建运行平台待确认</text>
35
+ <rect x="614" y="128" width="247" height="70" rx="8" fill="#f9fafb" stroke="#d1d5db" stroke-width="1.5" stroke-dasharray="6 4"/>
36
+ <text x="737" y="156" text-anchor="middle" class="node-title">更多平台</text>
37
+ <text x="737" y="178" text-anchor="middle" class="node-sub">注册表 + 平台 Skill 包</text>
38
+ <rect x="889" y="128" width="247" height="70" rx="8" fill="#ffffff" stroke="#d1d5db" stroke-width="1.5"/>
39
+ <text x="1012" y="156" text-anchor="middle" class="node-title">本地 Agent Host</text>
40
+ <text x="1012" y="178" text-anchor="middle" class="node-sub">Claude Code · Codex · OpenCode</text>
41
+ <path d="M 600,268 L 600,220" fill="none" stroke="#64748b" stroke-width="1.5" stroke-dasharray="5 4" marker-end="url(#arrow-gray)"/>
42
+ <rect x="610" y="232" width="190" height="19" rx="4" fill="#ffffff" opacity="0.95"/>
43
+ <text x="704" y="246" text-anchor="middle" class="label">部署 · Definition 与 Skill 树</text>
44
+ <rect x="40" y="268" width="1120" height="292" rx="8" fill="#f8fafc" stroke="#0f766e" stroke-width="2"/>
45
+ <circle cx="62" cy="288" r="11" fill="#0f766e"/>
46
+ <text x="62" y="292" text-anchor="middle" class="badge-on">1</text>
47
+ <text x="82" y="292" fill="#0f766e" font-size="12" font-weight="700" letter-spacing=".08em">DINGTALK-AGENT · 本仓库唯一拥有的一项:Agent 本体 · 公共行为 · 状态 · 效果证据</text>
48
+ <text x="82" y="312" class="small">Skill 劝(该不该做)· CLI 拦(身份 / 目标 / 预算 / 幂等 / 回读)· DWS 做(执行)</text>
49
+ <rect x="64" y="326" width="187" height="92" rx="8" fill="#eff6ff" stroke="#60a5fa" stroke-width="1.8"/>
50
+ <text x="157" y="356" text-anchor="middle" class="node-title">可信事件</text>
51
+ <text x="157" y="378" text-anchor="middle" class="node-sub">Invocation</text>
52
+ <text x="157" y="397" text-anchor="middle" class="small">谁 · 在哪 · 说了什么</text>
53
+ <rect x="285" y="326" width="187" height="92" rx="8" fill="#eff6ff" stroke="#60a5fa" stroke-width="1.8"/>
54
+ <text x="378" y="356" text-anchor="middle" class="node-title">Response Gate</text>
55
+ <text x="378" y="378" text-anchor="middle" class="node-sub">mention/DM 才处理</text>
56
+ <text x="378" y="397" text-anchor="middle" class="small">群聊未 @ 默认沉默</text>
57
+ <rect x="506" y="326" width="187" height="92" rx="8" fill="#eff6ff" stroke="#60a5fa" stroke-width="1.8"/>
58
+ <text x="599" y="356" text-anchor="middle" class="node-title">Session·Run·Wait</text>
59
+ <text x="599" y="378" text-anchor="middle" class="node-sub">一件事 · 一次唤醒</text>
60
+ <text x="599" y="397" text-anchor="middle" class="small">沙箱可丢弃,事情接着做</text>
61
+ <rect x="727" y="326" width="187" height="92" rx="8" fill="#eff6ff" stroke="#60a5fa" stroke-width="1.8"/>
62
+ <text x="820" y="356" text-anchor="middle" class="node-title">Action Gate</text>
63
+ <text x="820" y="378" text-anchor="middle" class="node-sub">冻结身份 · 目标 · 预算</text>
64
+ <text x="820" y="397" text-anchor="middle" class="small">幂等,不盲重试</text>
65
+ <rect x="948" y="326" width="187" height="92" rx="8" fill="#eff6ff" stroke="#60a5fa" stroke-width="1.8"/>
66
+ <text x="1041" y="356" text-anchor="middle" class="node-title">Receipt</text>
67
+ <text x="1041" y="378" text-anchor="middle" class="node-sub">独立回读</text>
68
+ <text x="1041" y="397" text-anchor="middle" class="small">无证据不声称完成</text>
69
+ <path d="M 251,372 L 285,372" fill="none" stroke="#2563eb" stroke-width="2" marker-end="url(#arrow-blue)"/>
70
+ <path d="M 472,372 L 506,372" fill="none" stroke="#2563eb" stroke-width="2" marker-end="url(#arrow-blue)"/>
71
+ <path d="M 693,372 L 727,372" fill="none" stroke="#2563eb" stroke-width="2" marker-end="url(#arrow-blue)"/>
72
+ <path d="M 914,372 L 948,372" fill="none" stroke="#2563eb" stroke-width="2" marker-end="url(#arrow-blue)"/>
73
+ <rect x="64" y="440" width="337" height="92" rx="8" fill="#ffffff" stroke="#93c5fd" stroke-width="1.5"/>
74
+ <text x="232" y="468" text-anchor="middle" class="node-title">本体与装配</text>
75
+ <text x="232" y="490" text-anchor="middle" class="node-sub">Definition + Basic Behavior + Role Skills</text>
76
+ <text x="232" y="509" text-anchor="middle" class="small">agent enhance · agent audit --verify-load</text>
77
+ <rect x="431" y="440" width="337" height="92" rx="8" fill="#ffffff" stroke="#93c5fd" stroke-width="1.5"/>
78
+ <text x="599" y="468" text-anchor="middle" class="node-title">状态与记忆</text>
79
+ <text x="599" y="490" text-anchor="middle" class="node-sub">语义内容与控制状态分开</text>
80
+ <text x="599" y="509" text-anchor="middle" class="small">锁 · 幂等 · Receipt 不进 Markdown</text>
81
+ <rect x="798" y="440" width="337" height="92" rx="8" fill="#ffffff" stroke="#93c5fd" stroke-width="1.5"/>
82
+ <text x="966" y="468" text-anchor="middle" class="node-title">评测与证据</text>
83
+ <text x="966" y="490" text-anchor="middle" class="node-sub">上线前用最低成本证明它真会做事</text>
84
+ <text x="966" y="509" text-anchor="middle" class="small">lab · workspace eval · observe</text>
85
+ <path d="M 158,606 L 158,564" fill="none" stroke="#7c3aed" stroke-width="1.8" stroke-dasharray="6 4" marker-end="url(#arrow-purple)"/>
86
+ <rect x="169" y="572" width="136" height="19" rx="4" fill="#ffffff" opacity="0.95"/>
87
+ <text x="237" y="586" text-anchor="middle" class="label">签发的身份 · 可信事件</text>
88
+ <path d="M 821,564 L 821,606" fill="none" stroke="#0d9488" stroke-width="2" marker-end="url(#arrow-teal)"/>
89
+ <rect x="837" y="572" width="56" height="19" rx="4" fill="#ffffff" opacity="0.95"/>
90
+ <text x="865" y="586" text-anchor="middle" class="label">执行动作</text>
91
+ <path d="M 1042,606 L 1042,564" fill="none" stroke="#0d9488" stroke-width="2" marker-end="url(#arrow-teal)"/>
92
+ <rect x="1058" y="572" width="82" height="19" rx="4" fill="#ffffff" opacity="0.95"/>
93
+ <text x="1099" y="586" text-anchor="middle" class="label">Receipt 回读</text>
94
+ <rect x="40" y="606" width="540" height="140" rx="8" fill="#faf5ff" stroke="#c084fc" stroke-width="1.8" stroke-dasharray="7 5"/>
95
+ <text x="58" y="630" fill="#7c3aed" font-size="12" font-weight="700" letter-spacing=".08em">IDENTITY &amp; PERCEPTION · 钉钉数字员工平台</text>
96
+ <rect x="60" y="646" width="245" height="64" rx="8" fill="#ffffff" stroke="#d8b4fe" stroke-width="1.5"/>
97
+ <circle cx="80" cy="666" r="11" fill="#ffffff" stroke="#7c3aed" stroke-width="1.6"/>
98
+ <text x="80" y="670" text-anchor="middle" fill="#7c3aed" font-size="12" font-weight="700">2</text>
99
+ <text x="183" y="673" text-anchor="middle" class="node-title">身份权限管控</text>
100
+ <text x="183" y="694" text-anchor="middle" class="node-sub">创建 · UID · 场域边界 · 生命周期</text>
101
+ <rect x="320" y="646" width="245" height="64" rx="8" fill="#ffffff" stroke="#d8b4fe" stroke-width="1.5"/>
102
+ <circle cx="340" cy="666" r="11" fill="#ffffff" stroke="#7c3aed" stroke-width="1.6"/>
103
+ <text x="340" y="670" text-anchor="middle" fill="#7c3aed" font-size="12" font-weight="700">3</text>
104
+ <text x="443" y="673" text-anchor="middle" class="node-title">感知与人机交互</text>
105
+ <text x="443" y="694" text-anchor="middle" class="node-sub">事件送达 · 统一展示</text>
106
+ <text x="60" y="730" class="small">DEAP 敬请期待,平台命令一律 fail-closed;事件信封的权威是钉钉事件中心与 DWS。</text>
107
+ <rect x="620" y="606" width="540" height="140" rx="8" fill="#f0fdfa" stroke="#0f766e" stroke-width="1.8"/>
108
+ <text x="638" y="630" fill="#0f766e" font-size="12" font-weight="700" letter-spacing=".08em">PLATFORM EXECUTION · DWS</text>
109
+ <rect x="640" y="646" width="500" height="64" rx="8" fill="#ffffff" stroke="#5eead4" stroke-width="1.5"/>
110
+ <circle cx="660" cy="666" r="11" fill="#ffffff" stroke="#0d9488" stroke-width="1.6"/>
111
+ <text x="660" y="670" text-anchor="middle" fill="#0d9488" font-size="12" font-weight="700">4</text>
112
+ <text x="890" y="673" text-anchor="middle" class="node-title">钉钉全部产品能力</text>
113
+ <text x="890" y="694" text-anchor="middle" class="node-sub">消息 · 文档 · 表格 · 日程 · 审批 · 通讯录</text>
114
+ <text x="640" y="730" class="small">所有真实钉钉操作最终都由 DWS 执行;src/dws.ts 是全仓库唯一 spawn dws 的地方。</text>
115
+ <rect x="40" y="764" width="1120" height="28" rx="6" fill="#0f172a"/>
116
+ <text x="600" y="783" text-anchor="middle" class="footer">钉钉组织 · 真实的人、群、日程、审批与文档 —— 身份与事件由钉钉签发,本仓库只冻结、审计和引用,不发证、不改写、不扩权</text>
117
+ <line x1="40" y1="828" x2="74" y2="828" stroke="#2563eb" stroke-width="1.8" marker-end="url(#arrow-blue)"/>
118
+ <text x="82" y="832" class="small">主处理流:事件 → 资格 → 动作</text>
119
+ <line x1="300" y1="828" x2="334" y2="828" stroke="#64748b" stroke-width="1.8" stroke-dasharray="5 4" marker-end="url(#arrow-gray)"/>
120
+ <text x="342" y="832" class="small">装配与部署(本仓库 → 运行平台)</text>
121
+ <line x1="560" y1="828" x2="594" y2="828" stroke="#7c3aed" stroke-width="1.8" stroke-dasharray="6 4" marker-end="url(#arrow-purple)"/>
122
+ <text x="602" y="832" class="small">钉钉签发的身份与可信事件(DEAP 待接入)</text>
123
+ <line x1="860" y1="828" x2="894" y2="828" stroke="#0d9488" stroke-width="1.8" marker-end="url(#arrow-teal)"/>
124
+ <text x="902" y="832" class="small">DWS 执行与 Receipt 回读</text>
125
+ </svg>
@@ -0,0 +1,77 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 430" width="1200" height="430" role="img" aria-labelledby="title desc">
2
+ <title id="title">一个钉钉数字员工的一次协作</title>
3
+ <desc id="desc">群里有同事 @ 数字员工提出请求;它先确认自己是谁、被授权对谁做事;然后经 DWS 执行真实的钉钉操作;最后拿出可独立回读的回执与产物,才声称完成。全过程留在原来的群里,和真人同事走同一套协作界面。</desc>
4
+ <defs>
5
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#0a1020"/><stop offset="1" stop-color="#111a31"/></linearGradient>
6
+ <linearGradient id="accent" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="#39c6f4"/><stop offset="1" stop-color="#7777ff"/></linearGradient>
7
+ <filter id="shadow" x="-20%" y="-30%" width="140%" height="160%"><feDropShadow dx="0" dy="8" stdDeviation="12" flood-color="#020617" flood-opacity=".34"/></filter>
8
+ <style>
9
+ text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; }
10
+ .eyebrow { font-size:13px;font-weight:600;letter-spacing:1.6px;fill:#7dd3fc; }
11
+ .title { font-size:22px;font-weight:700;fill:#f8fafc; }
12
+ .step { font-size:17px;font-weight:700;fill:#f8fafc; }
13
+ .body { font-size:14px;font-weight:500;fill:#cbd5e1; }
14
+ .small { font-size:12px;font-weight:500;fill:#94a3b8; }
15
+ .bubble { font-size:14px;font-weight:600;fill:#dbeafe; }
16
+ .num { font-size:13px;font-weight:700;fill:#08111f; }
17
+ </style>
18
+ </defs>
19
+ <rect width="1200" height="430" rx="28" fill="url(#bg)"/>
20
+ <path d="M52 96H1148" stroke="#23304a"/>
21
+ <text x="52" y="56" class="eyebrow">A DIGITAL EMPLOYEE AT WORK</text>
22
+ <text x="52" y="86" class="title">群里 @ 它一句话,它像同事一样把事办完——而且每一步都留得下痕迹</text>
23
+ <g filter="url(#shadow)">
24
+ <rect x="52" y="116" width="250" height="188" rx="22" fill="#111c33" stroke="#2b3b59"/>
25
+ <circle cx="84" cy="150" r="15" fill="#67e8f9"/>
26
+ <text x="84" y="155" text-anchor="middle" class="num">1</text>
27
+ <text x="110" y="156" class="step">有人在群里 @ 它</text>
28
+ <rect x="74" y="184" width="206" height="46" rx="10" fill="#172643"/>
29
+ <text x="90" y="204" class="body">真人同事,在原来的群里</text>
30
+ <text x="90" y="222" class="small">不用换工具、不用开新系统</text>
31
+ </g>
32
+ <g filter="url(#shadow)">
33
+ <rect x="340" y="116" width="250" height="188" rx="22" fill="#111c33" stroke="#2b3b59"/>
34
+ <circle cx="372" cy="150" r="15" fill="#67e8f9"/>
35
+ <text x="372" y="155" text-anchor="middle" class="num">2</text>
36
+ <text x="398" y="156" class="step">它先确认自己是谁</text>
37
+ <rect x="362" y="184" width="206" height="46" rx="10" fill="#172643"/>
38
+ <text x="378" y="204" class="body">工号 · 岗位 · 能对谁做事</text>
39
+ <text x="378" y="222" class="small">身份由钉钉签发,不看正文说什么</text>
40
+ </g>
41
+ <g filter="url(#shadow)">
42
+ <rect x="628" y="116" width="250" height="188" rx="22" fill="#111c33" stroke="#2b3b59"/>
43
+ <circle cx="660" cy="150" r="15" fill="#67e8f9"/>
44
+ <text x="660" y="155" text-anchor="middle" class="num">3</text>
45
+ <text x="686" y="156" class="step">它去把事情办了</text>
46
+ <rect x="650" y="184" width="206" height="46" rx="10" fill="#172643"/>
47
+ <text x="666" y="204" class="body">查状态 · 发通知 · 写文档</text>
48
+ <text x="666" y="222" class="small">每个动作都过一道闸门</text>
49
+ </g>
50
+ <g filter="url(#shadow)">
51
+ <rect x="916" y="116" width="232" height="188" rx="22" fill="#111c33" stroke="#2b3b59"/>
52
+ <circle cx="948" cy="150" r="15" fill="#67e8f9"/>
53
+ <text x="948" y="155" text-anchor="middle" class="num">4</text>
54
+ <text x="974" y="156" class="step">它拿得出做完的证据</text>
55
+ <rect x="938" y="184" width="188" height="46" rx="10" fill="#172643"/>
56
+ <text x="954" y="204" class="body">回执 · 产物 · 可独立回读</text>
57
+ <text x="954" y="222" class="small">没有证据,就不说「做完了」</text>
58
+ </g>
59
+ <rect x="74" y="248" width="206" height="40" rx="12" fill="#17314b" stroke="#275779"/>
60
+ <text x="90" y="273" class="bubble">「@发布助手 3.2 能发了吗」</text>
61
+ <rect x="362" y="248" width="206" height="40" rx="12" fill="#1c2a4d" stroke="#3a4f7a"/>
62
+ <text x="378" y="273" class="small" fill="#cbd5e1">授权范围外的人和群,不响应</text>
63
+ <rect x="650" y="248" width="206" height="40" rx="12" fill="#1c2a4d" stroke="#3a4f7a"/>
64
+ <text x="666" y="273" class="small" fill="#cbd5e1">回复目标只能来自这条消息</text>
65
+ <rect x="938" y="248" width="188" height="40" rx="12" fill="#14322a" stroke="#2f6b52"/>
66
+ <circle cx="958" cy="268" r="6" fill="#4ade80"/>
67
+ <text x="972" y="273" class="small" fill="#cbd5e1">回读通过才算完成</text>
68
+ <path d="M302 210H330" stroke="url(#accent)" stroke-width="3" stroke-linecap="round"/>
69
+ <path d="m320 202 10 8-10 8" fill="none" stroke="#7777ff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
70
+ <path d="M590 210H618" stroke="url(#accent)" stroke-width="3" stroke-linecap="round"/>
71
+ <path d="m608 202 10 8-10 8" fill="none" stroke="#7777ff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
72
+ <path d="M878 210H906" stroke="url(#accent)" stroke-width="3" stroke-linecap="round"/>
73
+ <path d="m896 202 10 8-10 8" fill="none" stroke="#7777ff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
74
+ <rect x="52" y="336" width="1096" height="1" fill="#23304a"/>
75
+ <text x="52" y="370" class="body">和真人同事走同一套协作界面——区别是,它的身份、边界和每一次副作用都可以被审计。</text>
76
+ <text x="52" y="398" class="small">未 @ 的群消息默认沉默 · 命令行不提供「发给谁」这个参数 · 说「完成」必须有宿主签发的证据——这三条由合同评测锁定。</text>
77
+ </svg>
@@ -40,9 +40,11 @@
40
40
  }
41
41
  },
42
42
  "definitionHash": { "$ref": "#/$defs/hash" },
43
- "instructionsHash": { "$ref": "#/$defs/hash" }
43
+ "instructionsHash": { "$ref": "#/$defs/hash" },
44
+ "previousRuntimeId": { "type": "string" }
44
45
  }
45
46
  },
47
+ "rebindRuntime": { "type": "boolean" },
46
48
  "operations": { "type": "array", "items": { "type": "string", "minLength": 1 } },
47
49
  "writeBudget": {
48
50
  "type": "object",
@@ -49,17 +49,23 @@
49
49
  "calls": { "$ref": "multica-deployment-operation.schema.json#/$defs/calls" },
50
50
  "smoke": {
51
51
  "type": "object", "additionalProperties": false,
52
- "required": ["status", "marker", "markerHash", "issueId", "taskId", "taskStatus", "requiredSkills", "loadedSkills", "toolTracePassed", "responsePassed", "responseHash", "failures"],
52
+ "required": ["status", "marker", "markerHash", "issueId", "taskId", "taskStatus", "taskDiagnostic", "requiredSkills", "loadedSkills", "toolTracePassed", "responsePassed", "responseHash", "failures"],
53
53
  "properties": {
54
54
  "status": { "enum": ["not-run", "pending", "passed", "failed"] },
55
55
  "marker": { "type": "string" }, "markerHash": { "type": "string" },
56
56
  "issueId": { "type": "string" }, "taskId": { "type": "string" },
57
- "taskStatus": { "type": "string" },
57
+ "taskStatus": { "type": "string" }, "taskDiagnostic": { "type": "string" },
58
58
  "requiredSkills": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/name" } },
59
59
  "loadedSkills": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/name" } },
60
60
  "toolTracePassed": { "type": "boolean" }, "responsePassed": { "type": "boolean" },
61
61
  "responseHash": { "type": "string" },
62
- "failures": { "type": "array", "items": { "type": "string" } }
62
+ "failures": { "type": "array", "items": { "type": "string" } },
63
+ "runtimeProvider": { "type": "string" },
64
+ "vocabularyIds": { "type": "array", "items": { "type": "string" } },
65
+ "toolNames": { "type": "array", "items": { "type": "string" } },
66
+ "unrecognizedTools": { "type": "array", "items": { "type": "string" } },
67
+ "classification": { "enum": ["", "skills-not-visible"] },
68
+ "failureDetails": { "$ref": "multica-workspace-inspection.schema.json#/$defs/failureDetails" }
63
69
  }
64
70
  },
65
71
  "rollback": {
@@ -72,6 +78,14 @@
72
78
  }
73
79
  },
74
80
  "failures": { "type": "array", "items": { "type": "string" } },
81
+ "failureDetails": { "$ref": "multica-workspace-inspection.schema.json#/$defs/failureDetails" },
82
+ "rebind": {
83
+ "type": "object", "additionalProperties": false,
84
+ "required": ["fromRuntimeId", "toRuntimeId"],
85
+ "properties": {
86
+ "fromRuntimeId": { "type": "string" }, "toRuntimeId": { "type": "string" }
87
+ }
88
+ },
75
89
  "evidencePath": { "type": "string", "minLength": 1 },
76
90
  "remoteRead": { "const": true }, "remoteWrite": { "type": "boolean" },
77
91
  "triggerWrite": { "const": false },
@@ -14,10 +14,14 @@
14
14
  "passed": { "type": "boolean" }, "providerReady": { "type": "boolean" },
15
15
  "operationIntegrity": { "type": "boolean" }, "receiptIntegrity": { "type": "boolean" },
16
16
  "reconciled": { "type": "boolean" },
17
+ "receiptFrozen": { "type": "boolean" },
18
+ "smokeStale": { "type": "boolean" },
19
+ "nextAction": { "type": "string" },
17
20
  "failures": { "type": "array", "items": { "type": "string" } },
18
21
  "receipt": { "oneOf": [{ "type": "null" }, { "$ref": "multica-deployment-receipt.schema.json" }] },
19
- "remoteRead": { "type": "boolean" }, "remoteWrite": { "const": false },
20
- "triggerWrite": { "const": false }, "sideEffect": { "enum": [false, "multica-read"] },
22
+ "remoteRead": { "type": "boolean" }, "remoteWrite": { "type": "boolean" },
23
+ "triggerWrite": { "const": false },
24
+ "sideEffect": { "enum": [false, "multica-read", "multica-read-write"] },
21
25
  "dingtalkSideEffect": { "const": false }
22
26
  }
23
27
  }
@@ -36,6 +36,8 @@
36
36
  "resources": { "$ref": "#/$defs/resources" },
37
37
  "diff": { "type": "array", "items": { "type": "string" } },
38
38
  "failures": { "type": "array", "items": { "type": "string" } },
39
+ "failureDetails": { "$ref": "#/$defs/failureDetails" },
40
+ "envSanitized": { "type": "array", "items": { "type": "string" } },
39
41
  "calls": {
40
42
  "type": "array",
41
43
  "items": {
@@ -60,6 +62,20 @@
60
62
  },
61
63
  "$defs": {
62
64
  "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
65
+ "failureDetails": {
66
+ "type": "array",
67
+ "items": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "required": ["code"],
71
+ "properties": {
72
+ "code": { "type": "string", "minLength": 1 },
73
+ "expected": { "oneOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
74
+ "actual": { "oneOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
75
+ "hint": { "type": "string" }
76
+ }
77
+ }
78
+ },
63
79
  "resources": {
64
80
  "type": "object",
65
81
  "additionalProperties": false,
@@ -0,0 +1,31 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/D1-2004/dingtalk-agent/docs/schemas/multica-workspace-run-plan.schema.json",
4
+ "title": "dingtalk-agent Multica Workspace Run Plan",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["$schema", "workspace", "provider", "profile", "workspaceId", "runtimeId", "agentId", "promptHash", "operations", "blocking", "requiresExecute", "requiresExplicitYes", "remoteRead", "remoteWrite", "triggerWrite", "sideEffect", "dingtalkSideEffect"],
8
+ "properties": {
9
+ "$schema": { "const": "dingtalk-agent/multica-workspace-run-plan@1" },
10
+ "workspace": { "$ref": "#/$defs/name" },
11
+ "provider": { "const": "multica" },
12
+ "profile": { "type": "string", "minLength": 1 },
13
+ "workspaceId": { "type": "string", "minLength": 1 },
14
+ "runtimeId": { "type": "string", "minLength": 1 },
15
+ "agentId": { "type": "string", "minLength": 1 },
16
+ "promptHash": { "$ref": "#/$defs/hash" },
17
+ "operations": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
18
+ "blocking": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
19
+ "requiresExecute": { "const": true },
20
+ "requiresExplicitYes": { "const": true },
21
+ "remoteRead": { "const": false },
22
+ "remoteWrite": { "const": false },
23
+ "triggerWrite": { "const": false },
24
+ "sideEffect": { "const": false },
25
+ "dingtalkSideEffect": { "const": false }
26
+ },
27
+ "$defs": {
28
+ "name": { "type": "string", "pattern": "^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$" },
29
+ "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
30
+ }
31
+ }
@@ -0,0 +1,161 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/D1-2004/dingtalk-agent/docs/schemas/multica-workspace-run.schema.json",
4
+ "title": "dingtalk-agent Multica Workspace Run Report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "$schema",
9
+ "passed",
10
+ "runId",
11
+ "workspace",
12
+ "provider",
13
+ "profile",
14
+ "workspaceId",
15
+ "runtimeId",
16
+ "agentId",
17
+ "promptHash",
18
+ "issueId",
19
+ "issueStatus",
20
+ "taskId",
21
+ "taskStatus",
22
+ "taskDiagnostic",
23
+ "pollAttempts",
24
+ "pollIntervalMs",
25
+ "answer",
26
+ "answerHash",
27
+ "toolNames",
28
+ "loadedSkills",
29
+ "failures",
30
+ "calls",
31
+ "evidencePath",
32
+ "remoteRead",
33
+ "remoteWrite",
34
+ "triggerWrite",
35
+ "sideEffect",
36
+ "dingtalkSideEffect"
37
+ ],
38
+ "properties": {
39
+ "$schema": {
40
+ "const": "dingtalk-agent/multica-workspace-run@1"
41
+ },
42
+ "passed": {
43
+ "type": "boolean"
44
+ },
45
+ "runId": {
46
+ "$ref": "#/$defs/id"
47
+ },
48
+ "workspace": {
49
+ "$ref": "#/$defs/name"
50
+ },
51
+ "provider": {
52
+ "const": "multica"
53
+ },
54
+ "profile": {
55
+ "type": "string",
56
+ "minLength": 1
57
+ },
58
+ "workspaceId": {
59
+ "type": "string",
60
+ "minLength": 1
61
+ },
62
+ "runtimeId": {
63
+ "type": "string",
64
+ "minLength": 1
65
+ },
66
+ "agentId": {
67
+ "type": "string",
68
+ "minLength": 1
69
+ },
70
+ "promptHash": {
71
+ "$ref": "#/$defs/hash"
72
+ },
73
+ "issueId": {
74
+ "type": "string",
75
+ "minLength": 1
76
+ },
77
+ "issueStatus": {
78
+ "type": "string"
79
+ },
80
+ "taskId": {
81
+ "type": "string"
82
+ },
83
+ "taskStatus": {
84
+ "type": "string",
85
+ "minLength": 1
86
+ },
87
+ "taskDiagnostic": {
88
+ "type": "string"
89
+ },
90
+ "pollAttempts": {
91
+ "type": "integer",
92
+ "minimum": 1
93
+ },
94
+ "pollIntervalMs": {
95
+ "type": "integer",
96
+ "minimum": 100
97
+ },
98
+ "answer": {
99
+ "type": "string"
100
+ },
101
+ "answerHash": {
102
+ "$ref": "#/$defs/hash"
103
+ },
104
+ "toolNames": {
105
+ "type": "array",
106
+ "items": {
107
+ "type": "string",
108
+ "minLength": 1
109
+ }
110
+ },
111
+ "loadedSkills": {
112
+ "type": "array",
113
+ "items": {
114
+ "$ref": "#/$defs/name"
115
+ }
116
+ },
117
+ "failures": {
118
+ "type": "array",
119
+ "items": {
120
+ "type": "string",
121
+ "minLength": 1
122
+ }
123
+ },
124
+ "calls": {
125
+ "$ref": "multica-deployment-operation.schema.json#/$defs/calls"
126
+ },
127
+ "evidencePath": {
128
+ "type": "string",
129
+ "minLength": 1
130
+ },
131
+ "remoteRead": {
132
+ "const": true
133
+ },
134
+ "remoteWrite": {
135
+ "type": "boolean"
136
+ },
137
+ "triggerWrite": {
138
+ "const": false
139
+ },
140
+ "sideEffect": {
141
+ "const": "multica-issue-read-write"
142
+ },
143
+ "dingtalkSideEffect": {
144
+ "const": false
145
+ }
146
+ },
147
+ "$defs": {
148
+ "id": {
149
+ "type": "string",
150
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{1,127}$"
151
+ },
152
+ "name": {
153
+ "type": "string",
154
+ "pattern": "^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$"
155
+ },
156
+ "hash": {
157
+ "type": "string",
158
+ "pattern": "^[a-f0-9]{64}$"
159
+ }
160
+ }
161
+ }
@@ -26,6 +26,8 @@
26
26
  "observedHash": { "type": "string" },
27
27
  "diff": { "type": "array", "items": { "type": "string" } },
28
28
  "failures": { "type": "array", "items": { "type": "string" } },
29
+ "failureDetails": { "$ref": "multica-workspace-inspection.schema.json#/$defs/failureDetails" },
30
+ "observedAgentRuntimeId": { "type": "string" },
29
31
  "remoteRead": { "const": false },
30
32
  "remoteWrite": { "const": false },
31
33
  "sideEffect": { "const": false },
@@ -17,16 +17,42 @@
17
17
  "required": ["definition", "skills"],
18
18
  "properties": {
19
19
  "definition": { "type": "string", "minLength": 1 },
20
+ "skillsRoot": {
21
+ "type": "string",
22
+ "minLength": 1,
23
+ "description": "全部 Agent Skills 的单一版本化源码根;新项目默认 agent/skills,旧项目省略时沿用历史兼容布局"
24
+ },
20
25
  "displayName": { "type": "string", "minLength": 1, "maxLength": 128 },
21
26
  "skills": {
22
27
  "type": "array",
23
28
  "minItems": 1,
24
29
  "uniqueItems": true,
25
- "contains": { "const": "dingtalk-basic-behavior" },
30
+ "contains": { "const": "dta-basic-behavior" },
26
31
  "items": { "$ref": "#/$defs/name" }
27
32
  }
28
33
  }
29
34
  },
35
+ "predicates": {
36
+ "type": "object",
37
+ "description": "完成判据注册表:id → 判据。声明侧 completion 用 predicate:<id> 引用,运行路径(autopilot description 标记、Receipt)引用同一 id——两个求值方无法静默分叉。跨语言合同:注册表就在本 manifest JSON 里,Python 引擎读同一份文件引用同一 id。一旦声明注册表(包括显式空对象——那是「已进入引用模式」,不是未声明),所有 completion 必须是引用(自由文本判据可被一句话注入绕过)。",
38
+ "additionalProperties": false,
39
+ "patternProperties": {
40
+ "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": ["description"],
44
+ "properties": {
45
+ "description": { "type": "string", "minLength": 1, "description": "人读判据:完成 = 数据里哪个可查状态" },
46
+ "source": { "type": "string", "minLength": 1, "description": "判据的数据来源/查询提示(表、字段、查询方式)" }
47
+ }
48
+ }
49
+ }
50
+ },
51
+ "schedules": {
52
+ "type": "array",
53
+ "description": "Agent 内化的常驻节律(internalized cron),声明式、版本化。clock 只开窗,作用域/完成判据由 Skill 状态驱动。部署由 provider adapter 映射(Multica→autopilot)。见 dta-agent-compose/references/drive-and-schedules.md",
54
+ "items": { "$ref": "#/$defs/schedule" }
55
+ },
30
56
  "workspaces": {
31
57
  "type": "object",
32
58
  "propertyNames": {
@@ -39,6 +65,23 @@
39
65
  }
40
66
  },
41
67
  "$defs": {
68
+ "schedule": {
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "required": ["name", "cron", "timezone", "mode"],
72
+ "properties": {
73
+ "name": { "type": "string", "minLength": 1, "maxLength": 128, "description": "人类标签,也作平台侧标题;同一 Project 内唯一" },
74
+ "cron": { "type": "string", "pattern": "^\\s*\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s*$", "description": "标准 5 段 cron(分 时 日 月 周),无秒、无 @macro" },
75
+ "timezone": { "type": "string", "minLength": 1, "description": "IANA 时区,如 Asia/Shanghai" },
76
+ "mode": { "enum": ["ephemeral", "work-item"], "description": "ephemeral=run-only;work-item=每次触发产生一个工作项(Multica create_issue)" },
77
+ "wake": { "type": "string", "minLength": 1, "description": "① 唤醒词/类别;Agent 读它给本拍定作用域,clock 不带工作清单" },
78
+ "purpose": { "type": "string", "minLength": 1 },
79
+ "completion": { "type": "string", "minLength": 1, "description": "② 从数据推得出的完成判据(level-triggered),不是「那一拍跑了没」。推荐 predicate:<id> 引用顶层 predicates 注册表(声明了注册表则强制引用)" },
80
+ "unit": { "type": "string", "minLength": 1, "description": "③ 每次触发的增量工作单元(折 delta,不重建)" },
81
+ "evidence": { "type": "string", "minLength": 1, "description": "④ 什么效果证明真做了(write/receipt/水位),不认自述" },
82
+ "supervision": { "type": "string", "minLength": 1, "description": "⑤ 谁盯这个循环收敛" }
83
+ }
84
+ },
42
85
  "name": {
43
86
  "type": "string",
44
87
  "pattern": "^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$"
@@ -50,7 +93,6 @@
50
93
  "storage": {
51
94
  "type": "object",
52
95
  "additionalProperties": false,
53
- "required": ["memory", "knowledge"],
54
96
  "properties": {
55
97
  "memory": { "type": "string", "pattern": "^(local-md|dingtalk-doc):.+$" },
56
98
  "knowledge": { "type": "string", "pattern": "^(local-md|dingtalk-doc):.+$" },
@@ -90,7 +132,7 @@
90
132
  "workspace": {
91
133
  "type": "object",
92
134
  "additionalProperties": false,
93
- "required": ["stage", "provider", "storage"],
135
+ "required": ["stage", "provider"],
94
136
  "properties": {
95
137
  "stage": { "enum": ["dev", "test", "staging", "prod"] },
96
138
  "provider": {
@@ -103,6 +145,15 @@
103
145
  "authority": { "$ref": "#/$defs/authority" }
104
146
  },
105
147
  "allOf": [
148
+ {
149
+ "if": {
150
+ "properties": { "provider": { "properties": { "kind": { "const": "opencode" } } } }
151
+ },
152
+ "then": {
153
+ "required": ["storage"],
154
+ "properties": { "storage": { "required": ["memory", "knowledge"] } }
155
+ }
156
+ },
106
157
  {
107
158
  "if": {
108
159
  "properties": { "provider": { "properties": { "kind": { "const": "multica" } } } }