@xdxer/dingtalk-agent 0.1.1 → 0.1.2

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 (99) hide show
  1. package/README.md +81 -80
  2. package/dist/bin/dingtalk-agent.js +685 -0
  3. package/dist/bin/dingtalk-agent.js.map +1 -0
  4. package/dist/src/actions.js +562 -0
  5. package/dist/src/actions.js.map +1 -0
  6. package/dist/src/boot.js +70 -0
  7. package/dist/src/boot.js.map +1 -0
  8. package/dist/src/bootstrap.js +144 -0
  9. package/dist/src/bootstrap.js.map +1 -0
  10. package/dist/src/config.js +86 -0
  11. package/dist/src/config.js.map +1 -0
  12. package/dist/src/driver.js +45 -0
  13. package/dist/src/driver.js.map +1 -0
  14. package/{src → dist/src}/duty.js +42 -44
  15. package/dist/src/duty.js.map +1 -0
  16. package/dist/src/dws.js +270 -0
  17. package/dist/src/dws.js.map +1 -0
  18. package/dist/src/events.js +233 -0
  19. package/dist/src/events.js.map +1 -0
  20. package/dist/src/fields.js +132 -0
  21. package/dist/src/fields.js.map +1 -0
  22. package/dist/src/init.js +41 -0
  23. package/dist/src/init.js.map +1 -0
  24. package/dist/src/kb.js +240 -0
  25. package/dist/src/kb.js.map +1 -0
  26. package/dist/src/package-root.js +17 -0
  27. package/dist/src/package-root.js.map +1 -0
  28. package/dist/src/runs.js +79 -0
  29. package/dist/src/runs.js.map +1 -0
  30. package/dist/src/sessions.js +668 -0
  31. package/dist/src/sessions.js.map +1 -0
  32. package/dist/src/skill-manager.js +273 -0
  33. package/dist/src/skill-manager.js.map +1 -0
  34. package/dist/src/skills.js +200 -0
  35. package/dist/src/skills.js.map +1 -0
  36. package/dist/src/types.js +2 -0
  37. package/dist/src/types.js.map +1 -0
  38. package/dist/src/waits.js +945 -0
  39. package/dist/src/waits.js.map +1 -0
  40. package/dist/src/workspace.js +173 -0
  41. package/dist/src/workspace.js.map +1 -0
  42. package/docs/ARCHITECTURE.md +207 -0
  43. package/docs/MINIMAL-WORKSPACE-V1.md +172 -0
  44. package/docs/OPEN-SOURCE-REFERENCES.md +107 -0
  45. package/docs/SELF-TEST.md +252 -0
  46. package/docs/architecture/dingtalk-agent-blueprint.png +0 -0
  47. package/docs/architecture/dingtalk-agent-blueprint.svg +144 -0
  48. package/docs/architecture/durable-async-agent-runtime.png +0 -0
  49. package/docs/architecture/durable-async-agent-runtime.svg +234 -0
  50. package/docs//345/206/205/347/275/221/345/256/236/347/233/270.md +77 -0
  51. package/evals/baselines/2026-07-14/behavior-summary.json +28 -0
  52. package/evals/baselines/2026-07-14/contract-summary.json +18 -0
  53. package/evals/baselines/2026-07-14/live-canary-summary.json +25 -0
  54. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/SKILL.md +72 -0
  55. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/action-contract.md +31 -0
  56. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/event-to-behavior.md +22 -0
  57. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/memory-and-evolution.md +25 -0
  58. package/evals/baselines/2026-07-15/dingtalk-basic-behavior-0.3.0/references/runtime-modes.md +34 -0
  59. package/evals/baselines/2026-07-15/task-lifecycle-summary.json +50 -0
  60. package/evals/evals.json +293 -0
  61. package/evals/fixtures/dm-ambiguous-send.json +4 -0
  62. package/evals/fixtures/dm-blocked.json +4 -0
  63. package/evals/fixtures/dm-clear.json +4 -0
  64. package/evals/fixtures/dm-discussion.json +4 -0
  65. package/evals/fixtures/dm-doc-write-no-tool.json +4 -0
  66. package/evals/fixtures/dm-long-task-ack.json +4 -0
  67. package/evals/fixtures/dm-nonblocking-gap.json +4 -0
  68. package/evals/fixtures/dm-structured-task.json +4 -0
  69. package/evals/fixtures/group.json +10 -0
  70. package/evals/fixtures/mentioned.json +3 -0
  71. package/evals/run-contract-evals.mjs +1031 -0
  72. package/evals/run-shadow-evals.mjs +267 -0
  73. package/evals/runners/README.md +66 -0
  74. package/evals/runners/claude-shadow.mjs +533 -0
  75. package/evals/schemas/action-request.schema.json +77 -0
  76. package/evals/shadow-evals.json +133 -0
  77. package/package.json +28 -6
  78. package/skills/AGENTS.md +21 -3
  79. package/skills/dingtalk-basic-behavior/SKILL.md +86 -0
  80. package/skills/dingtalk-basic-behavior/assets/task-checkpoint.md +37 -0
  81. package/skills/dingtalk-basic-behavior/references/action-contract.md +31 -0
  82. package/skills/dingtalk-basic-behavior/references/event-to-behavior.md +24 -0
  83. package/skills/dingtalk-basic-behavior/references/memory-and-evolution.md +27 -0
  84. package/skills/dingtalk-basic-behavior/references/runtime-modes.md +34 -0
  85. package/skills/dingtalk-basic-behavior/references/task-lifecycle.md +108 -0
  86. package/skills//345/237/272/347/241/200/350/241/214/344/270/272.md +44 -0
  87. package/skills//345/277/203/350/267/263.md +11 -0
  88. package/skills//346/266/210/346/201/257.md +14 -14
  89. package/skills//350/257/204/346/265/213.md +14 -1
  90. package/skills//351/222/211/351/222/211.md +3 -2
  91. package/templates/behaviors/basic.json +68 -0
  92. package/templates/fields/default/field.json +25 -0
  93. package/bin/dingtalk-agent.js +0 -289
  94. package/src/boot.js +0 -65
  95. package/src/config.js +0 -42
  96. package/src/dws.js +0 -192
  97. package/src/init.js +0 -84
  98. package/src/kb.js +0 -221
  99. package/src/runs.js +0 -77
package/README.md CHANGED
@@ -1,124 +1,125 @@
1
1
  # dingtalk-agent
2
2
 
3
- **钉钉数字员工的标准范式:CLI(拦)+ Skill(劝)。**
3
+ Claude Code、Codex 或其他 Agent 在获得一个全局 Skill 后,像钉钉里的真实同事一样处理消息和协作事项。
4
4
 
5
- 零运行时依赖。任何 Coding Agent(Claude Code / Codex / …)`init` 即用。
5
+ 它不内置模型,也不复制 DWS:
6
6
 
7
- ```bash
8
- npm i -g dingtalk-agent
7
+ - Basic Behavior Skill 判断何时响应、追问、沉默,以及如何使用记忆;
8
+ - `dingtalk-agent` 包装需要目标冻结、幂等、回读和状态迁移的员工级动作;
9
+ - DWS 负责钉钉消息、文档、待办、日历等具体产品能力。
9
10
 
10
- mkdir my-agent && cd my-agent
11
- dingtalk-agent init # 铺出工作区
12
- # 填 ontology/self/ 的三件套
13
- dingtalk-agent boot # 真去摸一遍工位,拉不到就 BOOT FAIL
14
- ```
11
+ ![Skill-first 架构](docs/architecture/dingtalk-agent-blueprint.png)
15
12
 
16
- ---
13
+ ## 两步开始
17
14
 
18
- ## 范式
15
+ ```bash
16
+ npm i -g @xdxer/dingtalk-agent
17
+ dingtalk-agent skill install
18
+ ```
19
19
 
20
- | | | |
21
- |---|---|---|
22
- | **CLI** | **拦** | 标准动作:可程序化、可强制、可验证。**撞上去没得商量** |
23
- | **Skill** | **劝** | 判断:只有 LLM 能做的——该不该答、话题归属、怎么写点评 |
24
- | **本体** | **记** | 我是谁 + 我知道什么。`git clone` 就带走 |
20
+ 这会安装一个 canonical Skill:
25
21
 
26
- **分界线:凡是能程序化的,收进 CLI;凡是需要判断的,留在 Skill。**
22
+ ```text
23
+ ~/.agents/skills/dingtalk-basic-behavior/ # Codex 直接发现
24
+ ~/.claude/skills/dingtalk-basic-behavior # 相对 symlink → canonical
25
+ ```
27
26
 
28
- 因为文档会被漏读、误读、自我说服;**撞到闸门上就没得商量。**
27
+ 它不会初始化当前目录,也不会修改项目的 `AGENTS.md`、`CLAUDE.md` 或 `.gitignore`。新 Agent 会话会自动发现 Skill;检查状态:
29
28
 
30
- ## 三个判定(现场可测)
29
+ ```bash
30
+ dingtalk-agent skill status
31
+ ```
31
32
 
32
- 1. **不喊它,它自己会动吗?** **事件**。答否,只是聊天框。
33
- 2. **昨天教它的,今天还记得吗?** → **存储**。答否,永远是新来的。
34
- 3. **它干的事,能查、能撤、能追责吗?** → **身份**。答否,没人敢让它真干活。
33
+ ## 每个 Agent Session
35
34
 
36
- ---
35
+ 普通会话不要求 init:
37
36
 
38
- ## 知识库:所有权决定真值方向
37
+ ```bash
38
+ dingtalk-agent bootstrap --json
39
+ ```
39
40
 
40
- | | **owned**(我的本体) | **external**(别人维护的) |
41
- |---|---|---|
42
- | 真值在 | **Git**(本地) | **钉钉**(远端) |
43
- | 同步 | `push` 本地 → 钉钉(**给人看**) | `pull` 钉钉 → 本地(**给我 grep**) |
44
- | 冲突了 | 远端被人改过 → **停下来问** | 远端赢,本地缓存**可丢弃** |
41
+ 如果当前目录存在 `WORKSPACE.md`、`MEMORY.md`、`knowledge/INDEX.md`,bootstrap 会直接挂载;都不存在也不是错误,不会自动创建文件。
45
42
 
46
- **Git 是常量层,钉钉是可替换的暴露层。**
43
+ 也可显式选择存储:
47
44
 
48
45
  ```bash
49
- dingtalk-agent kb mount --name 公司知识库 --from dingtalk:doc:<folderId> --own external
50
- dingtalk-agent kb mount --name 本体 --from dingtalk:doc:<folderId> --own owned --local ontology
51
- dingtalk-agent kb mount --name 团队wiki --from local:/path/to/wiki --sync none
52
-
53
- dingtalk-agent kb sync # 同步(漂移检测,绝不盲覆盖)
54
- dingtalk-agent kb search "<关键词>" # 跨所有挂载点搜(过期缓存会警告)
46
+ # 本地开发:直接挂载,不复制
47
+ dingtalk-agent bootstrap --storage local-dir:/path/to/workspace --json
48
+
49
+ # 远端员工:DWS probe 后拉成隐藏只读快照
50
+ dingtalk-agent bootstrap \
51
+ --storage 'dingtalk-doc:<nodeId-or-url>' \
52
+ --state-dir /path/to/session-state \
53
+ --json
55
54
  ```
56
55
 
57
- 三种源:`dingtalk:doc:<folderId>`(最常见——很多组织根本没建"知识库")·
58
- `dingtalk:wiki:<spaceId>` · `local:<路径>`
56
+ ## 三种模式
59
57
 
60
- **三个硬约束**(全是踩出来的):
58
+ | 模式 | 是否需要 init | 用途 |
59
+ |---|---:|---|
60
+ | Direct Session | 否 | 普通 Claude Code/Codex 会话;应用同事行为,按需使用 DWS |
61
+ | Mounted Session | 否 | 读取已有本地或钉钉文档中的身份、记忆、知识 |
62
+ | Prepared Run | 是,一次 | 可信事件宿主冻结目标、身份、Session/Run、Wait、预算和回执 |
61
63
 
62
- 1. **绝不双向自动 merge。** 一个方向是真值,另一个是投影。
63
- 2. **重排版不是漂移。** 钉钉会重写 markdown——用行级 diff 判漂移会**每次都误报**,
64
- 然后你就会开始无脑 `--force`,**真漂移也一起覆盖掉**。判据是"剥掉符号后的文字流"。
65
- 3. **缓存不新鲜就不许用。** *拿着过期快照回答,比说"我不知道"危险得多。*
66
-
67
- ---
68
-
69
- ## 命令面
64
+ 只有第三种模式需要显式初始化:
70
65
 
66
+ ```bash
67
+ mkdir fde-coach && cd fde-coach
68
+ dingtalk-agent init # contextId 可省略,由目录名稳定派生
69
+ dingtalk-agent prepare --event-file event.json --json
71
70
  ```
72
- init 铺出工作区
73
- boot 冷启动:真去摸工位,拉不到就 BOOT FAIL
74
71
 
75
- kb mount / list / sync / search
72
+ 重复 `init` 只检查现有 Workspace,不重绑 Context、不复制 Skill、不覆盖用户内容。
76
73
 
77
- duty --check 一拍两问之一(无事静默,退出码 0)
78
- duty --run <值班>
79
- todo 把待办【拉全】(翻页,不漏循环件)
74
+ ## 员工级原子行为
80
75
 
81
- log --did … --asked … --conv X --issue X --msg X 答完落一行
82
- feedback --kind 纠正|追问|认可 --text … --conv X 主人的下一句话
83
- runs --conv <会话> 拉出整条对话流(训练素材)
84
- evolve 这周该改什么
76
+ Prepared Run 目前只开放四个消息行为:
77
+
78
+ ```bash
79
+ dingtalk-agent act ack
80
+ dingtalk-agent act reply --text-file reply.txt
81
+ dingtalk-agent act ask --text "一个真正阻塞的问题"
82
+ dingtalk-agent act silence --reason unmentioned
85
83
  ```
86
84
 
87
- ## 留痕:三个硬 ID
85
+ - `ack` 是“看到了且需要时间”,不等于接单或完成;
86
+ - `reply` 只交付给原消息;CLI 没有 `--to`;
87
+ - `ask` 一次只问一个阻塞问题,并由宿主建立等待;
88
+ - `silence` 是有意识地不打扰,也有本地回执。
88
89
 
89
- 每行运行记录钉住 `issue`(翻得出运行过程)· `conv`(**拉得出整条对话流**)· `msg`(定位到那一句)。
90
+ 文档写、待办创建等裸 API 不在这里重复包装。只有当一个员工意图需要固定作用域、权限、幂等、回读、状态迁移或跨产品组合时,才值得成为新的 `dingtalk-agent` 动作。
90
91
 
91
- **缺了这三个,记录就只是一堆"我做了什么",出了问题什么也追不到。**
92
+ ## 新任务承接
92
93
 
93
- 而且两个成败必须**分开**:
94
+ Basic Behavior 使用一条极简协议:`UNDERSTAND → CLARIFY → PLAN → EXECUTE → WAIT → VERIFY → COMPLETE`。“澄清”先在内部检查目标、交付物、完成条件和权限;信息完整就直接做,只有阻塞才向人问一个问题。
94
95
 
95
- - `r` = **引擎层**(命令跑通没有)
96
- - `fb` = **用户层**(主人认不认)
96
+ 跨消息、等待依赖或已经产生副作用的事项才写 task checkpoint;单轮问答不建状态。Prepared Run 使用 `$DTA_SESSION/memory/task.md`,本地 Mounted Session 只写显式配置的 state root,远端钉钉文档必须通过授权 Provider 写入并回读。控制面的 Wait、锁、幂等和 Receipt 不进入 Markdown。详见 [任务承接与 Checkpoint](skills/dingtalk-basic-behavior/references/task-lifecycle.md)。
97
97
 
98
- **引擎跑通 ≠ 答对 ≠ 主人满意。只看 `r`,你会看到一片绿,然后什么也进化不了。**
98
+ ## 可选事件宿主
99
99
 
100
- ---
100
+ `listen` 只是开发联调适配器,不是 Agent 的主入口:
101
101
 
102
- ## 六条铁律
102
+ ```bash
103
+ dingtalk-agent help runtime
104
+ dingtalk-agent help adapters
105
+ ```
103
106
 
104
- 1. **人能读。** ID 必须紧跟中文名。*技能不是私有格式,是人和 Agent 的共同契约。*
105
- 2. **渐进披露。** 上下文是成本,步数是延迟。*"能不能做到"只是及格线,"几步做到"才是分数。*
106
- 3. **本体不乱动。** 骨骼可以长,但不能天天重接。
107
- 4. **驱动靠心跳,不靠待办。** *待办是给人的,心跳是 Agent 的生理。*
108
- 把"永远做不完的义务"塞进"有终态的待办",链一断就**静默漏执行且不自知**。
109
- 5. **不许本地自证。** 回平台真派一次,**而且要看执行过程**。
110
- 6. **环境正面修,不绕过。**
107
+ 云端 Driver、Claude Code 插件或本地 DWS 都可以提供事件;它们从标准化事件以后共享同一 Session/Run/Action 内核和唯一外发 owner。
111
108
 
112
- > **一条例外**:当一条自定的约束成了阻塞,先解阻塞。
113
- > **规矩是为了让事情成立,不是为了守规矩。**
109
+ ## 自测
114
110
 
115
- ---
111
+ ```bash
112
+ npm ci
113
+ npm run typecheck
114
+ npm run eval:contract
115
+ ```
116
116
 
117
- ## 依赖
117
+ 当前确定性合同包含 26 个场景,覆盖全局 Skill 安装与生命周期、无 init bootstrap、本地/远端 Storage、类型闸门、Direct Session 外发闸门,以及原有的 Session、Wait、幂等、目标防篡改和 Skill 冻结。评测页面见 [review.html](evals/results/contract/review.html)。
118
118
 
119
- - `node >= 18.3`
120
- - `dws` —— 钉钉的 CLI(Agent 在钉钉上的行动界面)
121
- - **零 npm 运行时依赖**
119
+ - [代码与运行架构](docs/ARCHITECTURE.md)
120
+ - [最小 Workspace 决策记录](docs/MINIMAL-WORKSPACE-V1.md)
121
+ - [自测与持续进化](docs/SELF-TEST.md)
122
+ - [开源项目差异与共同范式](docs/OPEN-SOURCE-REFERENCES.md)
122
123
 
123
124
  ## License
124
125