@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,126 @@
1
+ # 开源蓝本的差异、共同点与迁移决策
2
+
3
+ **这不是一次性调研,而是一份持续维护的观察账本。** 本项目的定位是把 Agent 装配成钉钉数字员工并连接各类 Agent 运行平台(见 [Architecture §3](ARCHITECTURE.md#3-每件事谁说了算模型-b)),因此**持续观察各 Managed Agent Platform 与开源 Agent 工具链的最佳实践、把可迁移的部分变成本项目的开源能力**,本身就是工作的一部分。每次接入新平台或发现新蓝本,结论回填到本文。
4
+
5
+ 调研最初基于 2026-07-14 各仓库源码,并在 2026-07-16 增补 `google/agents-cli`。结论不是 fork 某一个项目,而是 clean-room 组合:agents-cli 作为开发生命周期和 Coding-Agent-first CLI 的主要蓝本;其它项目分别提供社交行为、记忆、运行内核、人格或 Skill 包装。没有一个项目可以原样解决钉钉真实事件、DWS 权限和员工行为。
6
+
7
+ 观察什么、吸收什么,有一条固定判据:**只吸收可验证的结构与合同**(生命周期分相、manifest、eval 闭环、行为规则),不吸收无法验证的隐藏提示词,也不因为某个平台流行就把它宣称为已接入——支持状态一律以 `dta agent-platform list` 的注册表为准。
8
+
9
+ ## 开发生命周期的主要蓝本:google/agents-cli
10
+
11
+ [`google/agents-cli`](https://github.com/google/agents-cli) 是 dta 后续 Project、Workspace、Eval、Deploy 和 Provider 设计的首要参考。重点迁移的不是 Google Cloud 产品命令,而是这些结构:
12
+
13
+ 1. **Coding Agent first**:Skill 负责阶段判断和领域指导,CLI 同时可以被人或 Coding Agent 稳定调用;
14
+ 2. **生命周期分相**:spec/workflow、scaffold/enhance、build、eval、deploy、publish、observe 各有清晰边界;
15
+ 3. **项目 Manifest + `info --json`**:从任意子目录解析项目,报告 CLI/项目版本、目标和已安装 Skill;
16
+ 4. **保护已有项目**:`scaffold enhance` 先预览、备份和 smart merge,不把生成模板覆盖到用户代码上;
17
+ 5. **部署控制面**:`--dry-run`、显式确认、`--list`、`--status`、`--no-wait`、远端回读和部署 metadata;
18
+ 6. **认证分层**:Coding Agent、模型和部署身份彼此独立。dta 在此基础上再增加 DWS 执行身份;
19
+ 7. **闭环而非一次发布**:评测结果约束部署,线上 trace/反馈再进入下一轮评测候选。
20
+
21
+ dta 不迁移 ADK、Terraform、Cloud Run、GKE 或 Gemini Enterprise 的产品实现。对应关系是:Agent Project 保存可移植本体,Development Workspace 绑定一个 OpenCode/Multica Host Provider,Storage Provider 继续独立,Trigger Adapter 继续留在核心之外。详细推演见 [Provider-bound Development Workspace](roadmap/provider-bound-development-workspace.md)。
22
+
23
+ ## 哪份提示词最值得参考
24
+
25
+ - **行为事实的第一基线**:Claude Tag 官方的 [How it works](https://claude.com/docs/claude-tag/concepts/how-it-works) 与 [Good habits](https://claude.com/docs/claude-tag/users/good-habits)。官方没有公开完整 system prompt,但明确了 thread=session、sandbox 可丢弃、长任务 checklist、原 thread 交付、definition of done 和 durable artifact。
26
+ - **只选一份“完整开源同事 Prompt”基线**:[`open-tag/src/daemon/prompt.ts`](https://github.com/fancyboi999/open-tag/blob/main/src/daemon/prompt.ts)。它覆盖原频道/线程回复、task claim、避免重复汇报、freshness hold、私密范围、长任务提醒、睡眠/唤醒和压缩前记忆。
27
+ - **最接近中文 IM 数字同事、最便于迁移内容**:AWS 样例的 [`prompts.py`](https://github.com/aws-samples/sample-claude-tag-in-lark/blob/main/larkclaudetag/app/larktag/prompts.py)。它对“当前消息与背景分离、工具成功后才能宣称完成、两阶段遗忘、定时任务确认、文件交付”写得最具体。
28
+ - **最好的单一事件剧本**:用户提供的 [Claude Tag onboarding gist](https://gist.github.com/coco98/c8ef8e2f02b1ef82dea0cd0e95283b97)。它只描述 `agent.joined` 一次 wake,不是完整系统提示词。
29
+
30
+ 所以不会复制一段“万能 Prompt”:官方资料约束真实产品行为,`open-tag` 提供社交协议,gist 提供事件剧本写法,AWS 提供工具诚实性与记忆规则;目标、权限、幂等和回执全部下沉到 CLI/宿主。
31
+
32
+ ## 核心差异
33
+
34
+ | 项目 | 核心抽象 | 强项 | 不能直接照搬 | 本项目迁移 |
35
+ |---|---|---|---|---|
36
+ | [google/agents-cli](https://github.com/google/agents-cli) | Coding Agent + lifecycle Skills + project manifest + CLI | spec→scaffold/enhance→eval→deploy→publish→observe;dry-run/status;认证和部署目标分层 | 绑定 ADK/Google Cloud,Terraform 与容器不是 dta 的核心;事件触发可与运行时同体 | Project/Workspace/Provider、`info`、enhance、Eval gate、可选 deploy 与 observed-state Receipt |
37
+ | [Claude Tag 官方行为](https://claude.com/docs/claude-tag/concepts/how-it-works) | 一个 thread 一个 working session;每次活跃期构建 sandbox | 五步生命周期、可编辑 checklist、原 thread steer/交付、显式 definition of done、sandbox 与 durable state 分离 | 没有公开完整 Prompt 或运行源码;Slack 的 thread/权限模型不能直接等同钉钉 | Session/Run 映射、任务承接协议、checkpoint 与长期记忆分离 |
38
+ | [AWS Claude Tag in Lark](https://github.com/aws-samples/sample-claude-tag-in-lark) | 一个群一个共享上下文;薄 webhook + AgentCore runtime | 可运行的飞书链路;按群记忆、显式/自动记忆、两阶段遗忘、Skill、定时任务、旁听 | 仓库明确是 sample;Agent 使用 `bypassPermissions`;全局 Skill 当场生效不符合强治理 | 当前消息/背景分离、工具结果诚实、记忆分层、候选式进化 |
39
+ | [Anil Open Claude Tag](https://github.com/Anil-matcha/open-claude-tag) | `(workspace_id, channel_id)` 一个 Agent;`CHANNEL.md + MEMORY.md + skills + tools.toml` | Workspace 文件结构、共享频道上下文、记忆整理 turn | 当前 README 中多项记忆/Skill/ambient 能力仍在 roadmap;进程内锁和直接工具循环不足以做可靠运行内核 | Workspace 目录、按需 Skill、记忆 curation 思路,不以其 roadmap 当现成功能 |
40
+ | [TagIt](https://github.com/liliang-cn/tagit) | IM → daemon/queue → coding agent → Git worktree | CLI、事件存储、lease、恢复/重放、worktree、策略 broker、多 Agent 执行 | 本质是代码任务编排,不是通用社交员工;部分危险信号是事后文本分类;不迁移其高权限默认 | durable inbox/outbox、Run 管理、执行闸门和沙箱思想 |
41
+ | [open-tag](https://github.com/fancyboi999/open-tag) | 自建完整协作平台;持久 Agent workspace + wake/sleep + channels/DM/tasks | 最完整的同事协议、task claim、freshness hold、原线程汇报、prepare→human commit | 它替代 Slack/钉钉,而本项目必须适配真实钉钉;prompt 暴露通用消息 target,不适合作为 DWS 安全边界 | 社交协议、任务状态、忙时通知、freshness 再判断;目标改由宿主冻结 |
42
+ | [ElizaOS](https://github.com/elizaOS/eliza/blob/develop/packages/core/src/schemas/character.ts) | Character + room/world + action/provider | `bio/messageExamples/postExamples/style/topics` 人格建模;结构化 should-respond/action | Character 不能承担 ACL、目标、幂等和审批 | Identity/Voice/Examples 层,可作为 Field 的人格插件 |
43
+ | [Agent Skills](https://agentskills.io/specification) | `SKILL.md + scripts/references/assets` | 便携能力包、渐进披露、跨 Agent 复用 | 不定义事件、Session、记忆、权限或 Receipt | 标准 Skill 目录;Session 绑定 snapshot/hash,每个 Run 使用其投影 |
44
+
45
+ 需要特别注意:此前所说 `CHANNEL.md + MEMORY.md + tools.toml` 指的是
46
+ [`Anil-matcha/open-claude-tag`](https://github.com/Anil-matcha/open-claude-tag),不要与其它同名仓库混淆。
47
+
48
+ ## gist 里真正可迁移的内容
49
+
50
+ 该 gist 的结构是 `<wake reason="dispatch">` + `<channel …>` + 带 `trust="principal"` 的系统消息。最有价值的不是具体英文文案,而是:
51
+
52
+ 1. **信号与正文分层**:可信 wake 元数据决定当前是什么事件,普通消息不能升级权限。
53
+ 2. **先分类协作场域**:PERSONAL / TEAM / BROADCAST 对应不同 response eligibility;广播场域默认安静。
54
+ 3. **动作序列与预算显式化**:先做什么、最多读几次、错误是否重试、何时退出都写进事件合同。
55
+ 4. **建议必须有证据**:主动提出的 pickup 要指向真的看过且仍未关闭的工作,不虚构待办或 permalink。
56
+ 5. **offer 不等于 commitment**:先说“我可以接”,获得授权后才承诺执行。
57
+ 6. **观察不等于插话**:默认在后台,只有被点名或配置的主动信号才发言。
58
+
59
+ 不能迁移的是“TEAM/PERSONAL 永远发三条消息”。它是 onboarding 的产品剧本,放到普通钉钉消息会制造噪声。gist 也没有证明事件持久化、Session、身份核验、工具审批、幂等、送达回读或 Skill 发布治理。
60
+
61
+ ## 新任务协议的来源组合
62
+
63
+ ```text
64
+ UNDERSTAND / PLAN / checklist / original-thread delivery
65
+ ← Claude Tag 官方公开生命周期
66
+
67
+ 当前消息与背景分离 / 工具成功后才宣称完成
68
+ ← AWS Lark sample prompts.py
69
+
70
+ task claim / freshness hold / 阶段更新 / 人工验收
71
+ ← open-tag prompt.ts
72
+
73
+ Field 分类 / offer 不等于 commitment / 工具预算
74
+ ← onboarding gist(仅作为未验证的逆向样本)
75
+ ```
76
+
77
+ 最终落成 `UNDERSTAND → CLARIFY → PLAN → EXECUTE → WAIT → VERIFY → COMPLETE`。其中 CLARIFY 是内部缺口判断,不是固定先问人;简单任务直接完成,多步或跨 Run 的任务才建立 checklist/checkpoint。
78
+
79
+ ## 所有有效实现的共同点
80
+
81
+ 1. 稳定作用域绑定频道、房间或 workspace,不绑定一次模型会话。
82
+ 2. “感知到”与“应该发言”分离,先做 response eligibility。
83
+ 3. 回复回到原频道/线程/DM,并区分确认、进度和结果。
84
+ 4. 当前运行可以短暂,事件、任务、记忆、Skill 和审计必须外部持久化。
85
+ 5. 上下文分层加载:身份/政策 → 当前事件 → 当前线程/任务 → 记忆 → 相关 Skill。
86
+ 6. 记忆选择性写入并带作用域;旁听不等于自动记忆,更不等于自动插话。
87
+ 7. 长任务需要队列、lease、恢复、重放、提醒和审计。
88
+ 8. ID、ACL、审批、预算、幂等、外发和 Receipt 应由宿主强制,而不是要求模型“自觉”。
89
+ 9. 新 Skill 先做 candidate,经评测和审批再发布;不能在当前 Run 热改规则。
90
+ 10. 多个事件级行为合同,比一个超长 System Prompt 更可靠。
91
+
92
+ ## dingtalk-agent 与它们的本质差异
93
+
94
+ ```text
95
+ 它们常见的抽象:一个频道 = 一个长期 Agent / 模型会话
96
+
97
+ dingtalk-agent:
98
+ Workspace(稳定 Context / 权限 / 知识 / 人格边界)
99
+ └── Session(同一件事,tenant + conversation + causal key)
100
+ └── Run(一次信号,可启动一次可丢弃沙箱)
101
+ └── ActionRequest(无 target)
102
+ └── Host Gate + DWS + Receipt
103
+ ```
104
+
105
+ P0 中 Workspace 与 Field 一对一,可以对应一个群、一个 DM、一个项目或一组明确 selector,但不强制等于频道。Session 也不等于 conversation:同一个钉钉群里可以同时有多件事。沙箱只是一次 Run 的执行尝试,长期记忆和权限不放在里面。
106
+
107
+ 最终组合是:
108
+
109
+ ```text
110
+ Behavior Contract
111
+ = open-tag 社交协议
112
+ + gist 事件剧本
113
+ + AWS 工具诚实性/记忆规则
114
+ + ElizaOS 人格与结构化响应
115
+
116
+ Runtime Kernel
117
+ = Workspace / Session / Run / Action
118
+ + 宿主私有 Event Journal / Continuation / Receipt
119
+ + TagIt 的队列、恢复、重放思想
120
+ + open-tag 的 freshness hold 与 prepare/commit
121
+
122
+ Capability Package
123
+ = Agent Skills 规范
124
+ + Session 级 Skill snapshot/hash + Run 投影
125
+ + candidate → eval → approval → publish
126
+ ```
@@ -0,0 +1,182 @@
1
+ # dingtalk-agent 自测与持续进化
2
+
3
+ 本文件记录**本仓库自己的**评测证据、基线与历史结论。可复用的测试方法——层级选择、证据面与硬门禁、交付后联调通道、本机 connector 烟测、失败如何进入迭代——全部由 `skills/core/dta-agent-eval/` 承载并随 npm 包发布,这里不重复。
4
+
5
+ ## 目标
6
+
7
+ 自测不是证明“模型能聊天”,而是逐级证明一个数字员工:
8
+
9
+ 1. 在没有 Workspace 时也能发现全局 Skill,并保持不猜身份/目标;
10
+ 2. 从本地或钉钉文档按需水合语义上下文;
11
+ 3. 在可信事件模式中把同一件事续进正确的 Session;
12
+ 4. 选择合适的行为原语,只以固定身份、固定目标做一次动作;
13
+ 5. 能从平台回读证据;
14
+ 6. 把失败沉淀成回归场景,而不是现场改 Prompt 后忘掉。
15
+
16
+ ![dingtalk-agent 蓝本架构](architecture/dingtalk-agent-blueprint.svg)
17
+
18
+ 整体架构与仓库分工见 [Architecture](ARCHITECTURE.md);本文只讲怎么证明它是对的。
19
+
20
+ ## 从本地历史事故迁移出的硬约束
21
+
22
+ | 过去暴露的问题 | 现在进入哪里 | Why |
23
+ |---|---|---|
24
+ | 一句“把评测发给我”曾被解释成批量外发,产生多条误发 | 目标只能来自触发事件;CLI 不提供 `--to`;Workspace 固定 profile、真实 userId 和 allowlist | “发给谁”不能由正文或模型猜 |
25
+ | 数天内出现多次事件未进入处理链路 | durable inbox + dispatch outbox;controller 先按 `runId` 幂等入队,再 ack | 长连接收到不等于 Run 已被可靠接管 |
26
+ | 依靠 Agent 自己补日志,经常漏记正文、回执或关联 ID | 宿主自动保存原事件、Intent、Attempt、Receipt、平台回读 | 审计不能依赖模型记得“顺手记录” |
27
+ | 按群名、人名或整个 conversation 组织上下文,容易串事和选错目标 | tenant + immutable conversation ID + causal key 组成 Session scope;名称只展示 | 同一会话里可以同时发生多件事,名字也不唯一 |
28
+ | 用户纠正或要求停止后,Agent 仍继续原计划或边复盘边行动 | 显式 `/stop`、`/cancel` 取消 Wait 并提升 Session generation | 纠正改变的是当前授权,不只是新增聊天内容 |
29
+ | 把沙箱或模型隐藏会话当长期状态 | 一个 Run 一个可丢弃沙箱;记忆、Skill、事件和 Receipt 全在外部持久层 | 沙箱重启不应让员工失忆,也不应改变权限 |
30
+ | 本地命令成功就宣称任务完成 | engine result 与 user feedback 分开;Live 必须从钉钉回读 | “调用成功”“送达”“对方认可”是三个不同事实 |
31
+
32
+ 当前已能阻止显式取消之后的旧 Run 新动作,但不能抢占一个已经进入 DWS 的在途调用,也没有实现平台撤回;自然语言停止/纠正仍只是 Skill 候选,不应冒充完整 hard interrupt。
33
+
34
+ ## 怎么加一个场景
35
+
36
+ 合同评测有 64 个场景、约 8100 行 runner。加一个新场景是四步:
37
+
38
+ 1. **在 `evals/evals.json` 追加一条**:`id`(顺延)、`prompt`(这个场景在测什么)、`expected_output`、`files`、`expectations`(逐条断言的自然语言描述),以及 **`tier`**。
39
+ 2. **在 `evals/run-contract-evals.mjs` 写同名实现函数** `eval<Name>()`,返回 `{ output, checks: [...] }`。runner 会硬断言 `checks.length === expectations.length`——两边对不上直接失败,这是防止"加了断言忘了写说明"的闸门。
40
+ 3. **把函数加进 `cases` 数组**,顺序必须与 `evals.json` 一致;数量不一致会在启动时抛错。
41
+ 4. **定 tier**:先量耗时。单场景 >1.5 秒,或要装 CLI、打 tarball、起 Multica/OpenCode 模拟,就标 `extended`;否则 `core`。**core 的总预算是 30 秒**——超了先想能不能拆细或下沉,不要放宽预算。
42
+
43
+ ```bash
44
+ node evals/run-contract-evals.mjs --list # 查现有场景目录与 id
45
+ node evals/run-contract-evals.mjs --only=<新 id> # 只跑新场景
46
+ npm run eval:contract # core 回归,确认没拖慢预算
47
+ ```
48
+
49
+ 新场景应该来自**真实失败**,而不是想象的边界。事故 → 最小化 fixture → 判断该进 CLI 还是进 Skill → 才写成场景;这条路径见 eval 技能的 `references/failure-to-case.md`。
50
+
51
+ ## 每个合同证明了什么、没证明什么
52
+
53
+ 场景目录见 `node evals/run-contract-evals.mjs --list`。下表只记录本仓库交付链合同的结论边界——层级选择与证据面判据属于可复用方法,由 eval 技能承载。
54
+
55
+ | 合同 | 证明什么 | 明确不证明什么 |
56
+ |---|---|---|
57
+ | 51 Provider-bound Workspace | 四个只读 CLI 前后文件树不变;fake OpenCode 一旦执行即失败,证明 doctor 只查 PATH 不调模型;平台环境缺失只进 `multica-dev.missing`;state provider / desiredHash / 凭据字段篡改均 fail closed 且报错不含凭据值 | OpenCode 真加载;Multica 远端状态 |
58
+ | 52 OpenCode Workspace | 默认 plan 零写文件;Artifact route 与 managed Workspace 分离;随机 Basic probe;导出的 Session directory;零工具 run;一个 Workspace 漂移时另一个仍 ready;原子重建与幂等 create;fake DWS 零调用 | 真实模型的表达质量;任何 Multica 能力 |
59
+ | 53 Multica 只读 | plan 阶段 fake Multica 零调用;只允许 version/config/auth/workspace/runtime/agent/skill 固定读命令;ID 链一致与唯一 assignment;脱敏 evidence;未登录、scope 串线、Skill 重名、无可信 agentId、evidence 篡改、越界 symlink 分别 fail closed | 真实 Multica 账号可读;Basic 已在远端加载;deploy 可用 |
60
+ | 54 Multica Apply | dry-run 零调用;当前 planId + 显式确认;完整 Boot/Basic/Role Skill tree 与精确 assignment;写后独立回读;Issue load smoke 的 tool trace 与 JSON response 同时匹配才 ready;同源重放零远端写;超时进 `reconciling` 而不回滚或重试;retire | 真实 Multica API / 账号的 Live 兼容性 |
61
+ | 55 Promotion / Observation | policy 必须匹配指定 suite/runs/cases/surfaces;dry-run 不调 Provider 不写文件;缺 Eval、gate 失败、source/suite/report 漂移、降级或 prod 目标、过期 plan 都在业务调用前关闭;status/list 精确回读自身 Receipt 与三份 Eval evidence;observe 只产生 gitignored、proposed、不可发布的候选 | 真实 Multica Live promotion |
62
+ | 56 Release Readiness | 生成真实 npm tarball 并检查白名单内容与禁止路径;`npm install --offline` 装入全新 HOME;双 CLI 入口、唯一 canonical Basic copy、三 Host discovery、空目录 direct bootstrap、包内 plan-only lab eval、强制升级与上一 beta 回滚 dry-run | 真实 Live 兼容性;也不等于已经发布 |
63
+ | 57 Completion grader | 分类器区分真实完成、否定、条件、转述否定与同一回复内的矛盾声明;`completionClaim=forbidden` 时未被否定的正向声明进 safety hard gate;至少三轮的 `comparisonPolicy` 同时看 pass-rate delta、改进场景数与退化上限 | 统计显著性;跨模型的稳定增益 |
64
+ | 58 远端语义状态 runner | 默认零副作用只出 plan;`liveAuthorized=yes` 且 `--execute --live --yes` 才允许 DWS;四次写预算覆盖 L1/L3 文档与固定 L2 record;每次写独立回读;两进程空 state-dir 冷启动逐项一致;identity/type/drift/slot/cache/scope/control-state fail closed | 真实钉钉文档或 AI 表格的 Live 已通过 |
65
+ | 59 personal-event runner | 八个 case 覆盖 mention→reply、ambient→silence、重复事件、ask→continuation、ask→`/stop`、quote/burst/identity;7 个物理 Run 冻结同一 Definition 与 Skill manifest;五次外发均从同一 messageId 独立回读精确正文;重复事件复用同一 Run/Action/Attempt 且不产生第六条消息;全部完成 teardown | 拥有事件订阅;真实同事消息已到达;用户认可了回复 |
66
+ | 60 Agent enhance | 默认零本地写、零 DWS、零 Trigger;apply 绑定当前 planId,先备份再语义合并并按 hash 回读;保留原 Host 未知键与权限;幂等重复执行、AGENTS 源漂移、远端路由缺身份、symlink 均 fail closed;模板刚落盘时语义占位符与 load probe 保持 partial | "文件已创建"等于 Agent ready |
67
+
68
+ 每一行的右列是本项目的核心纪律:**一个通过的合同必须同时说清它没有证明什么。**
69
+
70
+ ### 多岗位 Agent 的隔离检查
71
+
72
+ 同一个内核复制出第二个岗位 Agent 时(`examples/agents/` 有两份已通过同一合同的实例,做法见 [Compose Skill](../skills/core/dta-agent-compose/SKILL.md)),合同 42 从两份 example 分别创建临时 Workspace,逐项检查:
73
+
74
+ 1. 初始化前 Direct bootstrap 可工作,且没有可信 target;
75
+ 2. 初始化后 `AGENTS.md`、Role Skill 与显式 Field 被正确采用;
76
+ 3. 两个 Definition、DWS profile、Session ID 互不相同,但共享同一份 Basic Behavior hash;
77
+ 4. 一方的 Task Checkpoint 与 Memory Candidate 在另一方的 state root 中不可见;
78
+ 5. 两者都通过同一 fake-DWS Lab 的 Action / Receipt / 平台回读合同。
79
+
80
+ 它证明模板化装配与状态隔离可自动验证;不代表真实账号、专用群、AI 表格和钉钉文档已接通。每个 Agent 的真实 L4 仍需各自的专用测试对象、allowlist 和明确 `--live --yes` 授权。
81
+
82
+ 合同之外另有一次真实本地 dogfood:把 `examples/agents/release-manager` 复制到仓库外临时目录,执行 enhance plan/apply 后,静态 audit 只缺 `host.load-probe`;OpenCode 1.17.14 + `deepseek/deepseek-chat` 的 with-skill 随机加载与 without-skill 防猜对照均为 1/1,绑定证据后的 audit 为 `ready`、缺口为 0。模型共调用 4 次、工具调用为 0、钉钉副作用为 0;脱敏摘要见 [`agent-enhance-opencode-dogfood-summary.json`](../evals/baselines/2026-07-17/agent-enhance-opencode-dogfood-summary.json)。单 case smoke 不用于宣称行为增益。
83
+
84
+ ## 本地合同与 Claude 对照评测
85
+
86
+ ```bash
87
+ # 确定性合同,不调用模型、不写钉钉
88
+ npm run eval:contract
89
+
90
+ # 常规改动只跑与链路相关的子集;--list 查场景目录,--only 接 id 或名称
91
+ node evals/run-contract-evals.mjs --list
92
+ node evals/run-contract-evals.mjs --only=20,CliErrorHints
93
+
94
+ # 同一个 Prepared Run 做 with_skill / without_skill 对照
95
+ npm run eval:behavior -- \
96
+ --runs 3 \
97
+ --out evals/results/behavior-iteration-002
98
+
99
+ # 只回归指定场景
100
+ npm run eval:behavior -- --eval 101,102 --runs 3
101
+
102
+ # 迭代已有 Skill:当前工作树对上一版快照
103
+ npm run eval:behavior -- \
104
+ --baseline-skill /path/to/previous/dta-basic-behavior \
105
+ --model '<固定的完整模型 ID>' --runs 3
106
+ ```
107
+
108
+ 合同 runner 的 stdout 是稳定的机器接口(默认 JSON、`--smoke` 四行),进度与失败展示全部走 stderr:每个场景一行结果;失败场景当场列出未通过的期望、截断证据,以及复跑命令、实现函数、判分文件和相关 fixture 的提示;场景抛异常按全部期望未通过计入并继续,让一次运行暴露所有失败。展示层只有 `evals/lib/tui.mjs` 一个模块,没有自己的合同场景,不增加回归负担。
109
+
110
+ Shadow runner 固定使用 `claude --bare --disable-slash-commands --tools Read`,每个 Run 新开会话。它没有写、Bash、DWS、MCP 或网络工具;runner 要求读取 `CONTEXT.md`、本 Run 冻结的 Skill、消息和 policy,并把所有 Run 外 `Read` 判为失败。但 `--tools Read` 不是操作系统文件沙箱,不能阻止 Claude 尝试读取同一用户可见的绝对路径;涉及敏感 fixture 时仍应把 runner 放进真正的容器/沙箱。结果目录保留:
111
+
112
+ ```text
113
+ eval-<id>/<with_skill|without_skill>/run-<n>/
114
+ ├── transcript.md
115
+ ├── grading.json
116
+ ├── timing.json
117
+ └── outputs/
118
+ ├── runner-config.json
119
+ ├── prompt.txt
120
+ ├── claude.stdout.ndjson
121
+ ├── claude.stderr.log
122
+ ├── tool-calls.json
123
+ ├── final-action-request.json
124
+ └── metrics.json
125
+ ```
126
+
127
+ OpenCode 评测不依赖模型主动调用 Skill:compose 先把项目 Basic Skill 加入 `opencode.json#instructions`,runner 再为本 Run 快照加入随机 probe。with-skill 必须精确回显,without-skill 不得猜中;每个 Session 还要由 `opencode export` 证明 directory 等于隔离 Workspace。之后才计算行为分数:
128
+
129
+ ```bash
130
+ dta lab eval --engine opencode \
131
+ --workspace lab/robot-eval/workspace \
132
+ --suite lab/robot-eval/suite.json --lanes stateless \
133
+ --runs 3 --execute --yes --json
134
+ ```
135
+
136
+ case 可用 `--cases id1,id2` 精确回归。默认题目工具全关;只有 suite 显式声明 `execution.tools=workspace-write` 时才开放隔离工作区的 `read/write/edit`。可写沙箱必须建在仓库外的系统临时根目录;runner 会把工具报告的绝对路径规范化后与该根目录做 containment 审计,防止 Host 沿父级 `.git` 把相对路径落到真实工作树。runner 在沙箱清理前执行 response + filesystem + workspace + artifact 断言并复制声明文件;回复声称完成但文件缺失、JSON 不符、Definition 不 ready、路径越界或出现非白名单工具时整例失败。经典事故与多证据 case 见 [`lab/agent-eval/classic-failures.json`](../lab/agent-eval/classic-failures.json)。
137
+
138
+ 这层会调用模型并产生 OpenCode Session/费用,但不开放工具、不连接 DWS。`AGENTS.md` 只保留身份和边界,禁止复制 Basic Skill 的预期答案;目录发现、正文加载、行为正确和 Skill 相对 baseline 的增益是四个不同结论。
139
+
140
+ ### 本地 Definition + 钉钉文档状态
141
+
142
+ `storage` engine 把 Agent 本体固定为本地 `AGENTS.md + Role Skills`,memory/knowledge 固定为两条显式 `dingtalk-doc:` URI。默认只生成计划;`--execute --yes` 才读取 DWS 并调用 OpenCode,`--execute --live --yes` 还会向唯一 `writeProbe` 专用文档追加一次随机 marker:
143
+
144
+ ```bash
145
+ dta lab eval --engine storage \
146
+ --workspace lab/agent-eval/remote-state-workspace \
147
+ --suite .dingtalk-agent/remote-state.local.json \
148
+ --execute --live --yes --json
149
+ ```
150
+
151
+ 硬门禁依次检查固定 profile/expectedUserId、`ALIDOC/adoc` 类型、本地 Definition/Role Skill、Basic Skill 强制 instruction、远端回读 = mount hash = cache bytes = slot 独立 manifest,再让 OpenCode 零工具回答只存在于远端文档且未出现在 Prompt/本地 Definition 的探针。钉钉会重排/转义 Markdown,因此写 marker 按规范化文字流计数;命令返回 success 仍不算通过。错误身份、文档类型、回读漂移或 marker 不是恰好一次都会使整例失败。控制状态仍在本地原子存储,原始远端快照只进入被 Git 忽略的证据目录。
152
+
153
+ 真实 DWS 脱敏结果见 [`evals/baselines/2026-07-16/remote-state-live-summary.json`](../evals/baselines/2026-07-16/remote-state-live-summary.json)。专用合成文档不会自动删除,因为写入授权不等于删除授权。
154
+
155
+ 三层远端语义状态使用 `remote-semantic-state-live-eval@1`。它不调用模型,也不替代 OpenCode Basic load gate;目标是独立证明 L1 文档、L2 固定 AI 表格记录、L3 文档在写后回读和全新本地 state-dir 中可恢复一致。占位配置见 [`remote-semantic-state-live.example.json`](../lab/agent-eval/remote-semantic-state-live.example.json):
156
+
157
+ ```bash
158
+ # 默认只验证本地 Definition、scope、Role/Basic Skill 发现、Provider、allowlist 与预算;零 DWS
159
+ dta lab eval --engine storage \
160
+ --workspace <agent-workspace> \
161
+ --suite .dingtalk-agent/remote-semantic-state-live.local.json --json
162
+
163
+ # 仅当 local suite 已填写专用资源并设置 liveAuthorized=yes
164
+ dta lab eval --engine storage \
165
+ --workspace <agent-workspace> \
166
+ --suite .dingtalk-agent/remote-semantic-state-live.local.json \
167
+ --execute --live --yes --json
168
+ ```
169
+
170
+ Live runner 的写预算精确为四次:L1 marker、L3 marker、固定 L2 record update、L1 drift marker。每次写都独立回读;L2 同时按 recordId 与 key+scope 查询,必须仍唯一命中同一记录。写后进程 A 退出并归档 state-dir,进程 B 在同一逻辑路径的空目录重新 bootstrap/rehydrate;Definition、Provider、L1/L2/L3、聚合 state hash 与 nextAction 必须逐项一致。原始身份、资源 ID、正文和 worker 输出只保存在 Workspace 的 `.dingtalk-agent/remote-semantic-state-live-results/`。
171
+
172
+ 历史三轮脱敏基线见 [`evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json`](../evals/baselines/2026-07-16/opencode-basic-skill-required-summary.json):随机正文加载和 Session 目录门禁均通过,Basic 0.9.2 with-skill 为 17/18、baseline 为 14/18;唯一失败是普通拒绝答复出现“回读路径”。
173
+
174
+ Basic 0.10.0 的脱敏基线见 [`evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json`](../evals/baselines/2026-07-16/opencode-basic-010-completion-summary.json)。OpenCode 1.17.14 / `deepseek/deepseek-chat` 下,current 与从 `bb8b95e` 冻结的 previous 均 3/3 精确加载;主验收记录的安全、Filesystem、Workspace、Artifact 硬门禁均为 100%,且已记录结果中没有“文件缺失但 completed”。但文本行为分数为 current 3/9、previous 4/9,同协议复跑方向相反,18 次聚合为 7/18 对 7/18。独立复核随后发现,旧分类器可能漏掉“先说未完成、后又说工作已完成”的矛盾回复,旧 `effectivenessProven` 也可能被单个正 delta 触发;因此这一轮只证明该批已记录样本按当时合同通过,不证明旧 grader 完备,也不证明 Basic 0.10.0 有稳定模型增益。grader 加固的修复和脱敏 L0 证据见 [`completion-grader-hardening-summary.json`](../evals/baselines/2026-07-17/completion-grader-hardening-summary.json),历史 baseline 与分数保持原样。
175
+
176
+ ## 硬门禁自动化现状
177
+
178
+ 当前程序已经判断动作合法性、payload 结构、Run 外读取尝试、权威目标 ID 复制、工具类型和 shadow 副作用;跨私聊泄漏、纠正中断、Live Receipt 等是下一批待建场景,尚不能笼统声称全部硬门禁已自动化。门禁清单本身见 eval 技能的 `references/evidence-contract.md`。
179
+
180
+ ## 历史基线
181
+
182
+ 脱敏、可随 npm 包发布的证据摘要按日期保存在 `evals/baselines/<date>/`;含完整模型轨迹和平台 ID 的原始证据只留在被 Git 忽略的 `evals/results/`。逐版本的变更与发布记录见 [CHANGELOG](../CHANGELOG.md)。
@@ -0,0 +1,120 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 840" width="1440" height="840" role="img" aria-labelledby="title desc">
2
+ <title id="title">dingtalk-agent 作为连接层在运行平台与钉钉之间的位置</title>
3
+ <desc id="desc">运行位置层列出 Agent 可以执行的 Managed Agent Platform,Multica 已支持,DEAP 敬请期待,更多平台需先在注册表登记并提供平台 Skill 包;中间是 dingtalk-agent,提供接入与装配、行为壳子、受控交付、评测与观测四类能力,并拥有 Agent 本体、公共行为、状态与效果证据;下方左侧是钉钉数字员工平台,签发身份、划定场域并送来可信事件,当前尚未接入所以画成虚线;下方右侧是 DWS,所有真实钉钉操作最终由它执行并回读 Receipt;最底部是钉钉组织。</desc>
4
+ <style>
5
+ text { font-family:'Helvetica Neue',Helvetica,Arial,'PingFang SC','Microsoft YaHei',sans-serif; }
6
+ .title { fill:#111827;font-size:28px;font-weight:700; }
7
+ .subtitle { fill:#6b7280;font-size:14px; }
8
+ .lane { fill:#475569;font-size:12px;font-weight:700;letter-spacing:.08em; }
9
+ .node-title { fill:#111827;font-size:16px;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
+ </style>
15
+ <defs>
16
+ <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>
17
+ <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>
18
+ <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>
19
+ <filter id="shadow" x="-20%" y="-20%" width="140%" height="140%"><feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#0f172a" flood-opacity=".10"/></filter>
20
+ </defs>
21
+
22
+ <rect width="1440" height="840" fill="#ffffff"/>
23
+
24
+ <text x="40" y="48" class="title">把 Agent 接进钉钉,并连接更广阔的运行平台</text>
25
+ <text x="40" y="75" class="subtitle">本仓库是连接层:不发身份、不建 Runtime、不复制 DWS 命令面——只把 Agent 装配成合格的钉钉数字员工。</text>
26
+
27
+ <!-- ── 泳道 1:运行位置 ───────────────────────────────── -->
28
+ <rect x="30" y="100" width="1380" height="152" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.2" stroke-dasharray="7 5"/>
29
+ <text x="48" y="124" class="lane">RUNTIME LOCATION · 运行位置:Agent 在哪里执行——可替换,且是本仓库的连接面</text>
30
+
31
+ <rect x="55" y="144" width="300" height="80" rx="9" fill="#f0fdf4" stroke="#86efac" stroke-width="1.6"/>
32
+ <text x="205" y="176" text-anchor="middle" class="node-title">Multica</text>
33
+ <text x="205" y="199" text-anchor="middle" class="node-sub">已支持</text>
34
+
35
+ <rect x="385" y="144" width="300" height="80" rx="9" fill="#f9fafb" stroke="#d1d5db" stroke-width="1.6" stroke-dasharray="6 4"/>
36
+ <text x="535" y="176" text-anchor="middle" class="node-title">DEAP</text>
37
+ <text x="535" y="199" text-anchor="middle" class="node-sub">敬请期待 · 是否内建运行平台待确认</text>
38
+
39
+ <rect x="715" y="144" width="300" height="80" rx="9" fill="#f9fafb" stroke="#d1d5db" stroke-width="1.6" stroke-dasharray="6 4"/>
40
+ <text x="865" y="176" text-anchor="middle" class="node-title">更多平台</text>
41
+ <text x="865" y="199" text-anchor="middle" class="node-sub">注册表 + 平台 Skill 包</text>
42
+
43
+ <text x="1045" y="176" class="node-sub">接入一个平台 =</text>
44
+ <text x="1045" y="199" class="node-sub">一个平台 Skill 包 + 注册表一条记录</text>
45
+
46
+ <!-- 装配箭头 -->
47
+ <path d="M720 252 L720 296" fill="none" stroke="#2563eb" stroke-width="2" marker-end="url(#arrow-blue)"/>
48
+ <rect x="734" y="262" width="204" height="21" rx="5" fill="#ffffff" opacity=".96"/>
49
+ <text x="836" y="277" text-anchor="middle" class="label">装配 · 加载 Definition 与 Skills</text>
50
+
51
+ <!-- ── 泳道 2:dingtalk-agent(高亮)───────────────────── -->
52
+ <rect x="30" y="306" width="1380" height="242" rx="14" fill="#f8fafc" stroke="#0f766e" stroke-width="2"/>
53
+ <text x="48" y="332" fill="#0f766e" font-size="13" font-weight="700" letter-spacing=".08em">DINGTALK-AGENT · 本仓库:行为内核与连接层</text>
54
+ <text x="48" y="354" class="small">五个部件里唯一由本仓库拥有的一项——Agent 本体、公共行为、状态与效果证据</text>
55
+
56
+ <rect x="55" y="370" width="315" height="152" rx="10" fill="#eff6ff" stroke="#60a5fa" stroke-width="2" filter="url(#shadow)"/>
57
+ <text x="75" y="400" class="node-title">接入与装配</text>
58
+ <text x="75" y="424" class="node-sub">把 Agent 变成可 hash、</text>
59
+ <text x="75" y="444" class="node-sub">可继承、可审计的本体</text>
60
+ <rect x="75" y="466" width="275" height="28" rx="7" fill="#ffffff" stroke="#93c5fd"/>
61
+ <text x="212" y="485" text-anchor="middle" class="small" fill="#1d4ed8">agent enhance · agent audit</text>
62
+
63
+ <rect x="390" y="370" width="315" height="152" rx="10" fill="#eff6ff" stroke="#60a5fa" stroke-width="2" filter="url(#shadow)"/>
64
+ <text x="410" y="400" class="node-title">行为壳子</text>
65
+ <text x="410" y="424" class="node-sub">何时响应 · 何时追问</text>
66
+ <text x="410" y="444" class="node-sub">何时沉默 · 如何收口</text>
67
+ <rect x="410" y="466" width="275" height="28" rx="7" fill="#ffffff" stroke="#93c5fd"/>
68
+ <text x="547" y="485" text-anchor="middle" class="small" fill="#1d4ed8">Basic Behavior + 标准模板</text>
69
+
70
+ <rect x="725" y="370" width="315" height="152" rx="10" fill="#eff6ff" stroke="#60a5fa" stroke-width="2" filter="url(#shadow)"/>
71
+ <text x="745" y="400" class="node-title">受控交付</text>
72
+ <text x="745" y="424" class="node-sub">零写入计划 · 显式确认</text>
73
+ <text x="745" y="444" class="node-sub">每步独立回读</text>
74
+ <rect x="745" y="466" width="275" height="28" rx="7" fill="#ffffff" stroke="#93c5fd"/>
75
+ <text x="882" y="485" text-anchor="middle" class="small" fill="#1d4ed8">deploy · promote · Receipt</text>
76
+
77
+ <rect x="1060" y="370" width="315" height="152" rx="10" fill="#eff6ff" stroke="#60a5fa" stroke-width="2" filter="url(#shadow)"/>
78
+ <text x="1080" y="400" class="node-title">评测与观测</text>
79
+ <text x="1080" y="424" class="node-sub">上线前证明它真会做事</text>
80
+ <text x="1080" y="444" class="node-sub">失败沉淀成可复跑场景</text>
81
+ <rect x="1080" y="466" width="275" height="28" rx="7" fill="#ffffff" stroke="#93c5fd"/>
82
+ <text x="1217" y="485" text-anchor="middle" class="small" fill="#1d4ed8">lab · workspace eval · observe</text>
83
+
84
+ <!-- 身份与事件向上(虚线=尚未接入);动作经 DWS 向下(实线=已在用) -->
85
+ <path d="M365 600 L365 556" fill="none" stroke="#7c3aed" stroke-width="1.8" stroke-dasharray="6 4" marker-end="url(#arrow-purple)"/>
86
+ <rect x="373" y="566" width="186" height="21" rx="5" fill="#ffffff" opacity=".96"/>
87
+ <text x="466" y="581" text-anchor="middle" class="label">签发的身份 · 可信事件(待接入)</text>
88
+
89
+ <path d="M1075 556 L1075 600" fill="none" stroke="#0d9488" stroke-width="2" marker-end="url(#arrow-teal)"/>
90
+ <rect x="1084" y="566" width="166" height="21" rx="5" fill="#ffffff" opacity=".96"/>
91
+ <text x="1167" y="581" text-anchor="middle" class="label">动作 · 执行 · Receipt 回读</text>
92
+
93
+ <!-- ── 下层左:钉钉数字员工平台(虚线=尚未接入)─────── -->
94
+ <rect x="30" y="600" width="670" height="160" rx="12" fill="#faf5ff" stroke="#c084fc" stroke-width="1.8" stroke-dasharray="7 5"/>
95
+ <text x="48" y="626" fill="#7c3aed" font-size="12" font-weight="700" letter-spacing=".08em">IDENTITY &amp; PERCEPTION · 钉钉数字员工平台</text>
96
+
97
+ <rect x="55" y="644" width="300" height="76" rx="9" fill="#ffffff" stroke="#d8b4fe" stroke-width="1.6"/>
98
+ <text x="205" y="674" text-anchor="middle" class="node-title">身份权限管控</text>
99
+ <text x="205" y="697" text-anchor="middle" class="node-sub">创建 · UID · 场域边界 · 生命周期</text>
100
+
101
+ <rect x="375" y="644" width="300" height="76" rx="9" fill="#ffffff" stroke="#d8b4fe" stroke-width="1.6"/>
102
+ <text x="525" y="674" text-anchor="middle" class="node-title">感知与人机交互</text>
103
+ <text x="525" y="697" text-anchor="middle" class="node-sub">事件送达 · 统一展示</text>
104
+
105
+ <text x="55" y="744" class="small">DEAP 敬请期待,平台命令一律 fail-closed;当前身份不经过 DEAP。事件信封的权威是钉钉事件中心与 DWS。</text>
106
+
107
+ <!-- ── 下层右:DWS(实线=已在用)────────────────────── -->
108
+ <rect x="740" y="600" width="670" height="160" rx="12" fill="#f0fdfa" stroke="#0f766e" stroke-width="1.8"/>
109
+ <text x="758" y="626" fill="#0f766e" font-size="12" font-weight="700" letter-spacing=".08em">PLATFORM EXECUTION · DWS</text>
110
+
111
+ <rect x="765" y="644" width="620" height="76" rx="9" fill="#ffffff" stroke="#5eead4" stroke-width="1.6"/>
112
+ <text x="1075" y="674" text-anchor="middle" class="node-title">消息 · 文档 · 表格 · 日程 · 审批 · 通讯录</text>
113
+ <text x="1075" y="697" text-anchor="middle" class="node-sub">所有真实钉钉操作最终都由 DWS 执行</text>
114
+
115
+ <text x="765" y="744" class="small">src/dws.ts 是全仓库唯一 spawn dws 的地方;本仓库不复制它的命令面。</text>
116
+
117
+ <!-- 钉钉组织 -->
118
+ <rect x="30" y="790" width="1380" height="26" rx="6" fill="#0f172a"/>
119
+ <text x="720" y="807" text-anchor="middle" class="footer">钉钉组织 · 真实的人、群、日程、审批与文档 —— 身份与事件由钉钉签发,本仓库只冻结、审计和引用,不发证、不改写、不扩权</text>
120
+ </svg>
@@ -0,0 +1,92 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 550" width="1440" height="550" role="img" aria-labelledby="title desc">
2
+ <title id="title">dingtalk-agent 数字员工的五个部件与各自的权威</title>
3
+ <desc id="desc">一个数字员工由五个部件构成:Agent 本体由本仓库拥有;组织身份与场域授权由钉钉数字员工平台签发;感知通道由钉钉事件中心与 DWS 提供;平台执行能力由 DWS 提供;运行位置由 Managed Agent Platform 或 Agent Host 提供。本仓库只拥有第一项,其余四项不实现也不替代,但必须逐一显式建模。</desc>
4
+ <style>
5
+ text { font-family:'Helvetica Neue',Helvetica,Arial,'PingFang SC','Microsoft YaHei',sans-serif; }
6
+ .title { fill:#111827;font-size:28px;font-weight:700; }
7
+ .subtitle { fill:#6b7280;font-size:14px; }
8
+ .lane { fill:#475569;font-size:12px;font-weight:700;letter-spacing:.08em; }
9
+ .node-title { fill:#111827;font-size:16px;font-weight:700; }
10
+ .node-sub { fill:#4b5563;font-size:12px; }
11
+ .small { fill:#64748b;font-size:11px; }
12
+ .own { fill:#1d4ed8;font-size:13px;font-weight:700; }
13
+ .ext { fill:#475569;font-size:13px;font-weight:600; }
14
+ .formula { fill:#334155;font-size:15px; }
15
+ </style>
16
+ <defs>
17
+ <filter id="shadow" x="-20%" y="-20%" width="140%" height="140%"><feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#0f172a" flood-opacity=".10"/></filter>
18
+ </defs>
19
+
20
+ <rect width="1440" height="550" fill="#ffffff"/>
21
+
22
+ <text x="40" y="48" class="title">数字员工不等于 Agent</text>
23
+ <text x="40" y="75" class="subtitle">它是一个 Agent 装配上组织语境之后的结果——五个部件,五个权威,本仓库只拥有第一项。</text>
24
+
25
+ <rect x="30" y="100" width="1380" height="250" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.2" stroke-dasharray="7 5"/>
26
+ <text x="48" y="124" class="lane">DIGITAL EMPLOYEE · 一个数字员工由五个部件构成</text>
27
+
28
+ <!-- 1. Agent 本体 —— 本仓库唯一拥有 -->
29
+ <rect x="55" y="145" width="234" height="180" rx="10" fill="#eff6ff" stroke="#60a5fa" stroke-width="2" filter="url(#shadow)"/>
30
+ <text x="75" y="175" class="node-title">Agent 本体</text>
31
+ <text x="75" y="198" class="node-sub">Definition · Skills</text>
32
+ <text x="75" y="218" class="node-sub">行为 · 状态 · 效果证据</text>
33
+ <text x="75" y="252" class="small">谁说了算</text>
34
+ <rect x="75" y="262" width="194" height="30" rx="7" fill="#ffffff" stroke="#93c5fd"/>
35
+ <text x="172" y="282" text-anchor="middle" class="node-sub" fill="#1d4ed8">本仓库 + Git</text>
36
+
37
+ <text x="309" y="245" text-anchor="middle" fill="#94a3b8" font-size="24">+</text>
38
+
39
+ <!-- 2. 组织身份与场域授权 -->
40
+ <rect x="329" y="145" width="234" height="180" rx="9" fill="#faf5ff" stroke="#c084fc" stroke-width="1.6"/>
41
+ <text x="349" y="175" class="node-title">组织身份与场域</text>
42
+ <text x="349" y="198" class="node-sub">发证 · 权限 · 边界</text>
43
+ <text x="349" y="218" class="node-sub">入转调离 · 生命周期</text>
44
+ <text x="349" y="252" class="small">谁说了算</text>
45
+ <rect x="349" y="262" width="194" height="30" rx="7" fill="#ffffff" stroke="#d8b4fe"/>
46
+ <text x="446" y="282" text-anchor="middle" class="node-sub" fill="#7c3aed">钉钉数字员工平台</text>
47
+
48
+ <text x="583" y="245" text-anchor="middle" fill="#94a3b8" font-size="24">+</text>
49
+
50
+ <!-- 3. 感知通道 -->
51
+ <rect x="603" y="145" width="234" height="180" rx="9" fill="#fff7ed" stroke="#fdba74" stroke-width="1.6"/>
52
+ <text x="623" y="175" class="node-title">感知通道</text>
53
+ <text x="623" y="198" class="node-sub">可信事件信封</text>
54
+ <text x="623" y="218" class="node-sub">谁 · 在哪 · 说了什么</text>
55
+ <text x="623" y="252" class="small">谁说了算</text>
56
+ <rect x="623" y="262" width="194" height="30" rx="7" fill="#ffffff" stroke="#fdba74"/>
57
+ <text x="720" y="282" text-anchor="middle" class="node-sub" fill="#c2410c">钉钉事件中心 / DWS</text>
58
+
59
+ <text x="857" y="245" text-anchor="middle" fill="#94a3b8" font-size="24">+</text>
60
+
61
+ <!-- 4. 平台执行能力 -->
62
+ <rect x="877" y="145" width="234" height="180" rx="9" fill="#f0fdfa" stroke="#5eead4" stroke-width="1.6"/>
63
+ <text x="897" y="175" class="node-title">平台执行能力</text>
64
+ <text x="897" y="198" class="node-sub">消息 · 文档 · 表格</text>
65
+ <text x="897" y="218" class="node-sub">日程 · 审批 · 通讯录</text>
66
+ <text x="897" y="252" class="small">谁说了算</text>
67
+ <rect x="897" y="262" width="194" height="30" rx="7" fill="#ffffff" stroke="#5eead4"/>
68
+ <text x="994" y="282" text-anchor="middle" class="node-sub" fill="#0f766e">DWS</text>
69
+
70
+ <text x="1131" y="245" text-anchor="middle" fill="#94a3b8" font-size="24">+</text>
71
+
72
+ <!-- 5. 运行位置 -->
73
+ <rect x="1151" y="145" width="234" height="180" rx="9" fill="#f9fafb" stroke="#d1d5db" stroke-width="1.6"/>
74
+ <text x="1171" y="175" class="node-title">运行位置</text>
75
+ <text x="1171" y="198" class="node-sub">模型 · 工具循环</text>
76
+ <text x="1171" y="218" class="node-sub">沙箱 · Session 生命周期</text>
77
+ <text x="1171" y="252" class="small">谁说了算</text>
78
+ <rect x="1171" y="262" width="194" height="30" rx="7" fill="#ffffff" stroke="#d1d5db"/>
79
+ <text x="1268" y="282" text-anchor="middle" class="node-sub">Managed Platform / Host</text>
80
+
81
+ <!-- 归属带 -->
82
+ <rect x="55" y="368" width="234" height="4" rx="2" fill="#2563eb"/>
83
+ <rect x="329" y="368" width="1056" height="4" rx="2" fill="#cbd5e1"/>
84
+ <text x="55" y="394" class="own">本仓库拥有</text>
85
+ <text x="329" y="394" class="ext">由外部签发或提供——本仓库不实现、不替代,但逐一显式建模,否则边界会悄悄溜走</text>
86
+
87
+ <!-- 公式条 -->
88
+ <rect x="30" y="418" width="1380" height="94" rx="10" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1"/>
89
+ <text x="50" y="444" fill="#111827" font-size="13" font-weight="700">可叠加公式</text>
90
+ <text x="50" y="472" class="formula">Agent 本体 + 组织身份与场域授权 + 感知通道 + 平台执行能力 + 运行位置 = 一个可工作的钉钉数字员工</text>
91
+ <text x="50" y="496" class="small">外部签发的身份、场域与事件信封只能被冻结、审计和引用,永远不能从正文、显示名或模型记忆推断。</text>
92
+ </svg>