@oyasmi/pipiclaw 0.3.5 → 0.4.0

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 (78) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/LICENSE +184 -0
  3. package/README.md +230 -231
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +2 -19
  6. package/dist/agent.js.map +1 -1
  7. package/dist/command-extension.d.ts.map +1 -1
  8. package/dist/command-extension.js.map +1 -1
  9. package/dist/commands.d.ts.map +1 -1
  10. package/dist/commands.js.map +1 -1
  11. package/dist/config-loader.d.ts.map +1 -1
  12. package/dist/config-loader.js.map +1 -1
  13. package/dist/context.d.ts.map +1 -1
  14. package/dist/context.js +0 -2
  15. package/dist/context.js.map +1 -1
  16. package/dist/delivery.d.ts.map +1 -1
  17. package/dist/delivery.js +11 -14
  18. package/dist/delivery.js.map +1 -1
  19. package/dist/dingtalk.d.ts.map +1 -1
  20. package/dist/dingtalk.js +26 -26
  21. package/dist/dingtalk.js.map +1 -1
  22. package/dist/events.d.ts.map +1 -1
  23. package/dist/events.js +5 -8
  24. package/dist/events.js.map +1 -1
  25. package/dist/index.d.ts +20 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +20 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/log.d.ts.map +1 -1
  30. package/dist/log.js.map +1 -1
  31. package/dist/main.d.ts.map +1 -1
  32. package/dist/main.js.map +1 -1
  33. package/dist/memory-consolidation.d.ts.map +1 -1
  34. package/dist/memory-consolidation.js.map +1 -1
  35. package/dist/memory-files.d.ts.map +1 -1
  36. package/dist/memory-files.js.map +1 -1
  37. package/dist/memory-lifecycle.d.ts.map +1 -1
  38. package/dist/memory-lifecycle.js +1 -2
  39. package/dist/memory-lifecycle.js.map +1 -1
  40. package/dist/model-utils.d.ts.map +1 -1
  41. package/dist/model-utils.js.map +1 -1
  42. package/dist/paths.d.ts.map +1 -1
  43. package/dist/prompt-builder.d.ts.map +1 -1
  44. package/dist/prompt-builder.js.map +1 -1
  45. package/dist/sandbox.d.ts.map +1 -1
  46. package/dist/sandbox.js +0 -1
  47. package/dist/sandbox.js.map +1 -1
  48. package/dist/shell-escape.d.ts.map +1 -1
  49. package/dist/shell-escape.js.map +1 -1
  50. package/dist/store.d.ts.map +1 -1
  51. package/dist/store.js +2 -3
  52. package/dist/store.js.map +1 -1
  53. package/dist/sub-agents.d.ts.map +1 -1
  54. package/dist/sub-agents.js +42 -10
  55. package/dist/sub-agents.js.map +1 -1
  56. package/dist/tools/attach.d.ts.map +1 -1
  57. package/dist/tools/attach.js.map +1 -1
  58. package/dist/tools/bash.d.ts.map +1 -1
  59. package/dist/tools/bash.js.map +1 -1
  60. package/dist/tools/edit.d.ts.map +1 -1
  61. package/dist/tools/edit.js.map +1 -1
  62. package/dist/tools/index.d.ts.map +1 -1
  63. package/dist/tools/index.js.map +1 -1
  64. package/dist/tools/read.d.ts.map +1 -1
  65. package/dist/tools/read.js.map +1 -1
  66. package/dist/tools/subagent.d.ts.map +1 -1
  67. package/dist/tools/subagent.js.map +1 -1
  68. package/dist/tools/truncate.d.ts.map +1 -1
  69. package/dist/tools/truncate.js.map +1 -1
  70. package/dist/tools/write-content.d.ts.map +1 -1
  71. package/dist/tools/write-content.js.map +1 -1
  72. package/dist/tools/write.d.ts.map +1 -1
  73. package/dist/tools/write.js.map +1 -1
  74. package/docs/memory-rfc.md +291 -0
  75. package/docs/subagent/pi-subagent-analyse.txt +190 -0
  76. package/docs/subagent/pi-subagent-design.txt +266 -0
  77. package/docs/subagent/pi-subagent-phase1-plan.txt +529 -0
  78. package/package.json +69 -53
package/README.md CHANGED
@@ -1,75 +1,90 @@
1
- # pipiclaw
1
+ # Pipiclaw
2
2
 
3
- Pipiclaw 是一个 AI 智能体,把 [pi-coding-agent](../coding-agent) 带到钉钉对话里,支持过程性 AI 卡片、最终 Markdown 回复、内置 Slash 命令、技能扩展和定时事件。
3
+ Pipiclaw 是一个面向钉钉的 AI coding assistant runtime。它基于 [`@mariozechner/pi-coding-agent`](https://www.npmjs.com/package/@mariozechner/pi-coding-agent) SDK,补上了实际团队环境里更关键的几层能力:钉钉渠道、过程性 AI Card、子代理、分层记忆、定时事件和可持续运行的 channel workspace。
4
4
 
5
- ## 功能
5
+ 如果你想要的是一个能在钉钉里长期工作的工程助手,而不是一个只能单轮问答的机器人,Pipiclaw 的设计目标就是这个。
6
6
 
7
- - 钉钉 Stream 模式接收消息,自动重连
8
- - 过程性思考和执行信息通过 AI Card 展示,最终答复独立快速返回
9
- - 内置 Slash 命令:`/help`、`/new`、`/compact`、`/session`、`/model`
10
- - 忙碌时默认将普通新消息作为 steer 送入当前任务,也支持显式 `/steer`、`/followup`、`/stop`
11
- - 每个 DM / 群聊独立工作空间
12
- - 支持 workspace 级 `SOUL.md`、`AGENTS.md`、`MEMORY.md`
13
- - 支持 workspace 级 `sub-agents/` 预定义子代理目录
14
- - 支持全局和频道级技能目录
15
- - 支持 runtime-managed 的频道级 `MEMORY.md` / `HISTORY.md`
16
- - 支持 immediate / one-shot / periodic 定时事件
17
- - 支持自定义模型配置和模型切换
7
+ npm package: [`@oyasmi/pipiclaw`](https://www.npmjs.com/package/@oyasmi/pipiclaw)
18
8
 
19
- ## 安装
9
+ ## Why Pipiclaw
10
+
11
+ - 钉钉优先:原生支持 DingTalk Stream Mode,不需要自己再包一层消息桥
12
+ - 过程可见:思考、工具执行和状态更新可以持续流式展示到 AI Card
13
+ - 任务不中断:忙碌时支持 steer、follow-up 和 stop,而不是简单丢弃新消息
14
+ - 有记忆,但不过载:`MEMORY.md` / `HISTORY.md` 分层管理,避免上下文无限膨胀
15
+ - 支持子代理:主代理可以把 review、research、planning 等任务委派给独立上下文的 sub-agent
16
+ - 适合长期运行:每个私聊和群聊都有稳定的 channel workspace、日志和事件目录
17
+ - 保持可编排:模型、技能、workspace 文件和事件都可以通过普通文件管理
18
+
19
+ ## Highlights
20
+
21
+ - DingTalk AI Card 流式过程输出,最终答复独立发送
22
+ - 内置 slash commands:`/help`、`/new`、`/compact`、`/session`、`/model`
23
+ - 忙碌时普通消息默认作为 steer 注入当前任务,也支持显式 `/steer`、`/followup`、`/stop`
24
+ - workspace 级 `SOUL.md`、`AGENTS.md`、`MEMORY.md`
25
+ - channel 级 `MEMORY.md`、`HISTORY.md`、`skills/`
26
+ - 预定义 sub-agent 和临时 inline sub-agent
27
+ - immediate / one-shot / periodic 事件调度
28
+ - 自定义 provider / model 配置
29
+ - host / docker 两种工具执行环境
30
+
31
+ ## Quickstart
32
+
33
+ 下面这套流程的目标是:从零开始,让 Pipiclaw 在你的钉钉里成功回复第一条消息。
34
+
35
+ ### 1. Requirements
36
+
37
+ - Node.js `>= 22`
38
+ - 一个可用的钉钉企业内部应用
39
+ - 至少一个可用的模型认证方式
40
+ - 环境变量,例如 `ANTHROPIC_API_KEY`
41
+ - 或 `~/.pi/pipiclaw/auth.json`
42
+
43
+ ### 2. Install
20
44
 
21
45
  ```bash
22
46
  npm install -g @oyasmi/pipiclaw
23
47
  ```
24
48
 
25
- ## 首次运行
49
+ ### 3. First Run
50
+
51
+ 第一次运行会自动初始化配置目录:
26
52
 
27
53
  ```bash
28
54
  pipiclaw
29
55
  ```
30
56
 
31
- 首次运行时,Pipiclaw 会自动创建 `~/.pi/pipiclaw/`,并生成这些文件和目录:
32
-
33
- - `channel.json`
34
- - `auth.json`
35
- - `models.json`
36
- - `settings.json`
37
- - `workspace/`
38
- - `workspace/events/`
39
- - `workspace/sub-agents/`
40
- - `workspace/skills/`
41
- - `workspace/SOUL.md`
42
- - `workspace/AGENTS.md`
43
- - `workspace/MEMORY.md`
44
-
45
- 如果 `channel.json` 还是示例占位符,程序会提示你先填写真实配置,然后退出。
46
-
47
- ## 钉钉应用配置
57
+ 程序会创建:
48
58
 
49
- 在 [钉钉开放平台](https://open-dev.dingtalk.com/) 创建企业内部应用:
50
-
51
- 1. 创建应用并获取 `Client ID` 和 `Client Secret`
52
- 2. 开启机器人能力并启用 Stream 模式
53
- 3. 如需 AI Card 流式输出,创建 AI 卡片模板并获取 `Card Template ID`
54
-
55
- ## 配置文件
56
-
57
- ### channel.json
59
+ ```text
60
+ ~/.pi/pipiclaw/
61
+ ├── channel.json
62
+ ├── auth.json
63
+ ├── models.json
64
+ ├── settings.json
65
+ └── workspace/
66
+ ├── SOUL.md
67
+ ├── AGENTS.md
68
+ ├── MEMORY.md
69
+ ├── events/
70
+ ├── skills/
71
+ └── sub-agents/
72
+ ```
58
73
 
59
- `~/.pi/pipiclaw/channel.json`
74
+ 如果 `channel.json` 还是占位模板,程序会提示你先填配置,然后退出。这是预期行为。
60
75
 
61
- 程序会自动生成一个模板文件。你需要至少填写:
76
+ ### 4. Create A DingTalk App
62
77
 
63
- - `clientId`
64
- - `clientSecret`
78
+ 在 [钉钉开放平台](https://open-dev.dingtalk.com/) 创建企业内部应用,并完成这些步骤:
65
79
 
66
- 通常还会填写:
80
+ 1. 创建应用,拿到 `Client ID` 和 `Client Secret`
81
+ 2. 开启机器人能力
82
+ 3. 启用 Stream Mode
83
+ 4. 如果你要过程性流式展示,再创建一个 AI Card 模板并拿到 `Card Template ID`
67
84
 
68
- - `robotCode`
69
- - `cardTemplateId`
70
- - `allowFrom`
85
+ ### 5. Fill `channel.json`
71
86
 
72
- 模板示例:
87
+ 编辑 `~/.pi/pipiclaw/channel.json`:
73
88
 
74
89
  ```json
75
90
  {
@@ -82,23 +97,29 @@ pipiclaw
82
97
  }
83
98
  ```
84
99
 
85
- 说明:
100
+ 最少只需要:
86
101
 
87
- - `robotCode` 留空时默认回退到 `clientId`
88
- - `cardTemplateId` 留空时不使用 AI Card 流式输出
89
- - `allowFrom` 设为 `[]` 或删除时允许所有人
102
+ - `clientId`
103
+ - `clientSecret`
90
104
 
91
- ### auth.json
105
+ 常见可选项:
92
106
 
93
- `~/.pi/pipiclaw/auth.json`
107
+ - `robotCode`
108
+ 留空时会回退到 `clientId`
109
+ - `cardTemplateId`
110
+ 留空时不启用 AI Card 流式输出
111
+ - `allowFrom`
112
+ 设置为 `[]` 或删除时表示允许所有人
94
113
 
95
- 首次运行会自动生成空对象:
114
+ ### 6. Provide Model Credentials
96
115
 
97
- ```json
98
- {}
116
+ 最简单的方式是直接用环境变量:
117
+
118
+ ```bash
119
+ export ANTHROPIC_API_KEY=sk-ant-...
99
120
  ```
100
121
 
101
- 如果你使用环境变量提供模型密钥,可以一直保持为空。也可以手工写成:
122
+ 也可以写到 `~/.pi/pipiclaw/auth.json`:
102
123
 
103
124
  ```json
104
125
  {
@@ -106,11 +127,7 @@ pipiclaw
106
127
  }
107
128
  ```
108
129
 
109
- ### models.json
110
-
111
- `~/.pi/pipiclaw/models.json`
112
-
113
- 首次运行会自动生成最小合法空配置。你需要在 `providers` 下面自己添加自定义 provider 和模型定义:
130
+ 如果你需要自定义 provider / model,可以编辑 `~/.pi/pipiclaw/models.json`。如果不需要,这个文件可以保持:
114
131
 
115
132
  ```json
116
133
  {
@@ -118,133 +135,84 @@ pipiclaw
118
135
  }
119
136
  ```
120
137
 
121
- 如果你不需要自定义模型,可以一直保持这个空配置。
138
+ ### 7. Start Pipiclaw
122
139
 
123
- ### settings.json
140
+ ```bash
141
+ pipiclaw
142
+ ```
124
143
 
125
- `~/.pi/pipiclaw/settings.json`
144
+ 如果你希望工具运行在 Docker 容器里:
126
145
 
127
- 首次运行会自动生成:
146
+ ```bash
147
+ pipiclaw --sandbox=docker:your-container
148
+ ```
128
149
 
129
- ```json
130
- {}
150
+ ### 8. Send The First Message
151
+
152
+ 给机器人发一条普通消息,例如:
153
+
154
+ ```text
155
+ 请介绍一下你自己,并说明你现在能做什么
131
156
  ```
132
157
 
133
- `/model` 等命令写入的默认模型会保存在这里,并在重启后继续生效。
158
+ 如果一切正常:
134
159
 
135
- ## 运行
160
+ - 你会在钉钉里看到 AI Card 的过程更新,或普通文本回退
161
+ - Pipiclaw 会在本地创建对应 channel 目录
162
+ - 后续会话会复用该 channel 的工作空间与记忆文件
136
163
 
137
- 填写好 `channel.json` 和模型认证信息后,再次启动:
164
+ ## Configuration
138
165
 
139
- ```bash
140
- pipiclaw
141
- ```
166
+ ### Config Files
142
167
 
143
- 如需 Docker sandbox,可以显式指定:
168
+ Pipiclaw 默认使用下面这些文件:
144
169
 
145
- ```bash
146
- pipiclaw --sandbox=docker:your-container
147
- ```
170
+ | File | Purpose |
171
+ |------|---------|
172
+ | `~/.pi/pipiclaw/channel.json` | 钉钉应用配置 |
173
+ | `~/.pi/pipiclaw/auth.json` | 模型认证信息 |
174
+ | `~/.pi/pipiclaw/models.json` | 自定义 provider 和 model |
175
+ | `~/.pi/pipiclaw/settings.json` | 默认模型和运行时设置 |
148
176
 
149
- ## 内置 Slash 命令
177
+ ### Environment Variables
150
178
 
151
- Pipiclaw 暴露两层命令:
179
+ | Variable | Purpose |
180
+ |----------|---------|
181
+ | `ANTHROPIC_API_KEY` | Anthropic API key |
182
+ | `PIPICLAW_DEBUG` | 打开调试模式,把上下文写到 `last_prompt.json` |
183
+ | `DINGTALK_FORCE_PROXY` | 设为 `true` 时保留 axios 代理设置 |
152
184
 
153
- - transport 层命令:由 DingTalk runtime 直接处理
154
- - session 层命令:由 `AgentSession` extension command 立即执行,不作为普通 prompt 发给模型
185
+ ## Commands
155
186
 
156
- ### 空闲时可用
187
+ Pipiclaw 有两层命令。
188
+
189
+ ### Transport Commands
190
+
191
+ 这些命令由 DingTalk runtime 直接处理:
157
192
 
158
193
  - `/help`
159
- 显示帮助
194
+ - `/stop`
195
+ - `/steer <message>`
196
+ - `/followup <message>`
197
+
198
+ 忙碌时,普通消息默认等价于 `/steer <message>`。
199
+
200
+ ### Session Commands
201
+
202
+ 这些命令由 `AgentSession` extension command 立即执行,不作为普通 prompt 发给模型:
203
+
160
204
  - `/new`
161
- 开启新会话
162
205
  - `/compact [instructions]`
163
- 手动压缩当前会话上下文
164
206
  - `/session`
165
- 查看当前会话状态、消息统计、token 使用和模型信息
166
207
  - `/model [provider/modelId|modelId]`
167
- 查看当前模型,或用精确匹配切换模型
168
208
 
169
- 说明:
209
+ `/model` 只支持精确匹配切换。
170
210
 
171
- - `/model` 无参数时返回当前模型和可用模型列表
172
- - `/model <ref>` 只支持精确匹配
211
+ ## Workspace Model
173
212
 
174
- ### 忙碌时可用
213
+ Pipiclaw 的核心不是“一个机器人实例”,而是一组长期存在的 workspace 文件。
175
214
 
176
- - 普通消息
177
- 默认按 `steer` 处理,在当前工具步骤结束后尽快转向
178
- - `/help`
179
- 显示帮助
180
- - `/stop`
181
- 停止当前任务
182
- - `/steer <message>`
183
- 显式指定一次 steer,改变当前任务方向
184
- - `/followup <message>`
185
- 将一条新请求排到当前任务完成之后再执行
186
-
187
- 说明:
188
-
189
- - busy 时普通消息默认等价于 `/steer <message>`
190
- - `/steer` 更适合纠偏、补充限制条件、修改当前任务方向
191
- - `/followup` 更适合“等这件事做完,再继续做下一件事”
192
- - busy 时,其他 slash 输入不会执行;只允许 `/help`、`/stop`、`/steer`、`/followup`
193
-
194
- ## Workspace Files
195
-
196
- Pipiclaw 只会自动识别并使用下面这些 workspace 文件或目录:
197
-
198
- - `SOUL.md`
199
- - `AGENTS.md`
200
- - `MEMORY.md`
201
- - `sub-agents/`
202
- - `skills/`
203
- - `events/`
204
-
205
- `TOOLS.md` 当前不受支持。即使你手工创建了它,也不会被自动加载或生效。
206
-
207
- ### Global And Channel Scope
208
-
209
- Pipiclaw 同时支持:
210
-
211
- - 全局 workspace 文件:`~/.pi/pipiclaw/workspace/`
212
- - 渠道级文件:`~/.pi/pipiclaw/workspace/dm_xxxx/` 或 `group_xxxx/`
213
-
214
- 它们的关系如下:
215
-
216
- | 名称 | 全局位置 | 渠道级位置 | 生效方式 |
217
- |------|----------|------------|----------|
218
- | `SOUL.md` | `workspace/SOUL.md` | 不支持 | 仅在 session 开始时加载全局文件。渠道级 `SOUL.md` 不会被读取。 |
219
- | `AGENTS.md` | `workspace/AGENTS.md` | 不支持 | 仅在 session 开始时加载全局文件。渠道级 `AGENTS.md` 不会被读取。 |
220
- | `MEMORY.md` | `workspace/MEMORY.md` | `<channel>/MEMORY.md` | 默认都不会直接加载进上下文。workspace 文件稳定且由管理员维护;channel 文件由 runtime consolidation 自动更新,也允许 agent 主动读写。 |
221
- | `sub-agents/` | `workspace/sub-agents/` | 不支持 | 预定义 sub-agent 目录。主 Agent 可按需调用其中的定义,也可以在单次任务里临时内联定义一个 sub-agent。 |
222
- | `HISTORY.md` | 不支持 | `<channel>/HISTORY.md` | 默认不会直接加载进上下文。由 runtime consolidation 自动维护,用于按需读取旧摘要。 |
223
- | `skills/` | `workspace/skills/` | `<channel>/skills/` | 两边的 skill 摘要会在 session 开始时进入上下文;如果同名,渠道级覆盖全局。具体 skill 内容仍由 agent 按需读取。 |
224
- | `events/` | `workspace/events/` | 不支持 | 仅支持全局事件目录。 |
225
- | `.channel-meta.json` | 不支持 | `<channel>/.channel-meta.json` | 运行时自动维护,用于主动发送和重启恢复,不建议手工编辑。 |
226
- | `context.jsonl` | 不支持 | `<channel>/context.jsonl` | 原始 session 存储,冷文件,不主动加载或扫描。 |
227
- | `log.jsonl` | 不支持 | `<channel>/log.jsonl` | 原始消息存储,冷文件,不主动加载或扫描。 |
228
- | `subagent-runs.jsonl` | 不支持 | `<channel>/subagent-runs.jsonl` | sub-agent 运行摘要日志。记录其输出摘要、预算停止原因和 usage,便于事后审查。 |
229
-
230
- ### File Intent
231
-
232
- - `SOUL.md`
233
- 定义 Pipiclaw 的身份、语气、默认语言和回复风格。它会追加到 pi 默认底座 prompt 之后。首次运行生成的只是说明模板,你需要替换成真实内容。
234
- - `AGENTS.md`
235
- 定义行为规则、工具使用策略、安全约束和项目工作流。只读取 workspace 级文件。不要把 runtime 内建的记忆系统细节完整复制到这里。
236
- - `MEMORY.md`
237
- 定义持久记忆。workspace 级文件适合存稳定共享背景,由管理员维护;channel 级文件适合存 durable facts、ongoing work、decisions、open loops,并由 runtime consolidation 自动维护。
238
- - `sub-agents/`
239
- 存放预定义 sub-agent Markdown 文件。适合放 reviewer、researcher、planner 之类可复用的专项角色。主 Agent 在需要时也可以不依赖该目录,直接临时内联定义一个 sub-agent。
240
- - `HISTORY.md`
241
- 仅存在于 channel 目录。保存旧上下文的摘要历史,由 runtime consolidation 自动维护。
242
- - `skills/`
243
- 存放自定义技能。适合放可复用的 CLI 工具、脚本和 skill 说明。
244
- - `events/`
245
- 存放定时事件定义。只支持全局目录,不支持放到单个 channel 目录里。
246
-
247
- ## 工作空间布局
215
+ ### Workspace Layout
248
216
 
249
217
  ```text
250
218
  ~/.pi/pipiclaw/
@@ -256,30 +224,33 @@ Pipiclaw 同时支持:
256
224
  ├── SOUL.md
257
225
  ├── AGENTS.md
258
226
  ├── MEMORY.md
259
- ├── sub-agents/
260
- ├── skills/
261
227
  ├── events/
262
- └── dm_{userId}/
263
- ├── MEMORY.md
264
- ├── HISTORY.md
265
- ├── .channel-meta.json
266
- ├── context.jsonl
267
- ├── log.jsonl
268
- └── skills/
228
+ ├── skills/
229
+ ├── sub-agents/
230
+ ├── dm_{userId}/
231
+ ├── MEMORY.md
232
+ ├── HISTORY.md
233
+ ├── .channel-meta.json
234
+ │ ├── context.jsonl
235
+ │ ├── log.jsonl
236
+ │ ├── subagent-runs.jsonl
237
+ │ └── skills/
238
+ └── group_{conversationId}/
239
+ └── ...
269
240
  ```
270
241
 
271
- ## 记忆模型
242
+ ### What Gets Loaded Into Context
272
243
 
273
- Pipiclaw 的默认 session 上下文只直接加载这些内容:
244
+ 默认直接进入 session 上下文的内容:
274
245
 
275
- - pi 默认底座 system prompt
246
+ - pi 默认 system prompt
276
247
  - workspace 级 `SOUL.md`
277
248
  - workspace 级 `AGENTS.md`
278
- - workspace 级 `sub-agents/` 中可用 sub-agent 的摘要
279
- - 内置工具说明
280
- - workspace 和 channel 两层 skills 的摘要
249
+ - workspace 级 sub-agent 摘要
250
+ - 工具说明
251
+ - workspace 和 channel 两层 skills 摘要
281
252
 
282
- 这些文件不会默认直接进入上下文:
253
+ 默认不会直接注入上下文的内容:
283
254
 
284
255
  - `workspace/MEMORY.md`
285
256
  - `<channel>/MEMORY.md`
@@ -287,44 +258,35 @@ Pipiclaw 的默认 session 上下文只直接加载这些内容:
287
258
  - `<channel>/log.jsonl`
288
259
  - `<channel>/context.jsonl`
289
260
 
290
- 说明:
261
+ 这意味着 Pipiclaw 的记忆策略是“按需读取”,而不是把所有历史永远塞进 prompt。
291
262
 
292
- - `workspace/MEMORY.md` 是稳定共享背景,由管理员维护,runtime 不会自动改写。
293
- - `<channel>/MEMORY.md` 和 `<channel>/HISTORY.md` 由 runtime 在 compaction 或 session trimming 前自动 consolidation。
294
- - agent 被鼓励在需要时主动读取 channel memory/history。
295
- - `log.jsonl` 和 `context.jsonl` 是冷存储,只做原始归档,不承担记忆角色。
296
- - channel 目录首次初始化时会立即创建 `MEMORY.md` 和 `HISTORY.md`,而不是等到首次 consolidation 再懒创建。
263
+ ## Memory Model
297
264
 
298
- ## 定时事件
265
+ Pipiclaw 把记忆分成三层:
299
266
 
300
- `~/.pi/pipiclaw/workspace/events/` 中创建 JSON 文件来触发定时任务:
301
-
302
- - `immediate`
303
- - `one-shot`
304
- - `periodic`
267
+ - `workspace/MEMORY.md`
268
+ 稳定的全局背景,适合放团队长期约定和共享知识
269
+ - `<channel>/MEMORY.md`
270
+ channel 级 durable facts、ongoing work、decisions、open loops
271
+ - `<channel>/HISTORY.md`
272
+ 更老上下文的摘要历史
305
273
 
306
- 示例:
274
+ 运行时会在 compaction 或 session trimming 前自动做 consolidation:
307
275
 
308
- ```json
309
- {
310
- "type": "periodic",
311
- "channelId": "dm_your-staff-id",
312
- "text": "Review your MEMORY.md files. Remove outdated entries, merge duplicates, ensure well-organized.",
313
- "schedule": "0 3 * * 0",
314
- "timezone": "Asia/Shanghai"
315
- }
316
- ```
276
+ - 从对话中提取值得保留的 memory entries
277
+ - 把旧对话块折叠进 `HISTORY.md`
278
+ - 在必要时压缩过长的 memory/history 文件
317
279
 
318
280
  ## Sub-Agents
319
281
 
320
282
  Pipiclaw 支持两种 sub-agent 用法:
321
283
 
322
- - 预定义 sub-agent:放在 `~/.pi/pipiclaw/workspace/sub-agents/*.md`
323
- - 临时内联 sub-agent:主 Agent 在一次 `subagent` 工具调用里直接组织参数定义
284
+ - 预定义 sub-agent:放到 `~/.pi/pipiclaw/workspace/sub-agents/*.md`
285
+ - 临时 inline sub-agent:由主代理在一次 `subagent` 工具调用里直接构造
324
286
 
325
- 推荐先从预定义 sub-agent 开始,因为更容易复用,也更容易调试。
287
+ 推荐先使用预定义 sub-agent,因为更容易复用、审查和调试。
326
288
 
327
- ### 定义文件示例
289
+ ### Example
328
290
 
329
291
  文件:`~/.pi/pipiclaw/workspace/sub-agents/reviewer.md`
330
292
 
@@ -347,36 +309,73 @@ Prioritize correctness issues, regressions, risky assumptions, and missing tests
347
309
  Keep findings concise and actionable.
348
310
  ```
349
311
 
350
- 说明:
312
+ 几个关键规则:
351
313
 
352
- - `model` 可省略;省略时默认使用主 Agent 当前模型
353
- - `tools` 可省略;省略时默认使用 `read,bash`
354
- - 各预算字段都可省略;省略时会使用 runtime 默认值
355
- - 默认预算值的设计目标是优先防止失控和成本失真,而不是追求“一个 sub-agent 包办整件大任务”;如果任务明显更重,应该显式调大预算
356
- - sub-agent 不会拿到 `subagent` 工具,因此不能再创建孙 agent
357
- - sub-agent 只隔离 LLM 对话上下文,不隔离文件系统和 executor;它读写的 workspace 文件对主 Agent 后续同样可见
358
- - runtime 会自动给 sub-agent 注入一小段固定运行上下文,例如 workspace 根目录、channel id 和 sandbox 类型;主 Agent 仍然需要把任务本身所需的业务上下文写进 `task`
359
- - 如果 sub-agent 已经产出可用结果,但因预算耗尽或中途停止未完整完成,runtime 会保留这部分结果返回给主 Agent,并在 channel 目录的 `subagent-runs.jsonl` 中记录执行摘要
314
+ - sub-agent 没有 `subagent` 工具,所以不能继续创建孙代理
315
+ - sub-agent 隔离的是 LLM 对话上下文,不隔离文件系统
316
+ - 运行摘要会记录到 `<channel>/subagent-runs.jsonl`
360
317
 
361
- ### 使用建议
318
+ ## Scheduled Events
362
319
 
363
- - `reviewer`:代码审查、回归风险检查、测试缺口检查
364
- - `researcher`:大范围读文件、查日志、收集事实
365
- - `planner`:先整理范围、再给主 Agent 输出执行计划
320
+ `~/.pi/pipiclaw/workspace/events/` 放置 JSON 文件,可以创建三类事件:
366
321
 
367
- Agent 会在 prompt 指导下自行决定何时调用 sub-agent;不需要用户每次手工指定。
322
+ - `immediate`
323
+ - `one-shot`
324
+ - `periodic`
368
325
 
369
- ## 环境变量
326
+ 示例:
370
327
 
371
- | 变量 | 说明 |
372
- |------|------|
373
- | `ANTHROPIC_API_KEY` | Anthropic API 密钥 |
374
- | `PIPICLAW_DEBUG` | 设为任意值启用调试模式,将完整上下文写入 `last_prompt.json` |
375
- | `DINGTALK_FORCE_PROXY` | 设为 `true` 保留 axios 代理设置 |
328
+ ```json
329
+ {
330
+ "type": "periodic",
331
+ "channelId": "dm_your-staff-id",
332
+ "text": "Review your MEMORY.md files. Remove outdated entries, merge duplicates, ensure well-organized.",
333
+ "schedule": "0 3 * * 0",
334
+ "timezone": "Asia/Shanghai"
335
+ }
336
+ ```
337
+
338
+ 一个典型用法是让 Pipiclaw 每周回顾自己的记忆文件,或者做固定时间的巡检和提醒。
376
339
 
377
- ## 开发
340
+ ## Development
378
341
 
379
342
  ```bash
380
343
  npm install
344
+ npm run build
381
345
  npm run check
382
346
  ```
347
+
348
+ 常用脚本:
349
+
350
+ - `npm run build`
351
+ - `npm run test`
352
+ - `npm run check`
353
+
354
+ ## Troubleshooting
355
+
356
+ ### First run exits immediately
357
+
358
+ 通常是因为 `channel.json` 还停留在模板占位符状态。把真实的 `clientId` / `clientSecret` 填进去即可。
359
+
360
+ ### Bot receives messages but does not answer
361
+
362
+ 优先检查:
363
+
364
+ - 模型认证是否可用
365
+ - `allowFrom` 是否把你的账号挡住了
366
+ - 钉钉机器人 Stream Mode 是否已开启
367
+ - `cardTemplateId` 是否有效;如果无效,先留空验证普通文本回退链路
368
+
369
+ ### Need to inspect the exact prompt
370
+
371
+ 设置:
372
+
373
+ ```bash
374
+ export PIPICLAW_DEBUG=1
375
+ ```
376
+
377
+ 之后运行时会在 channel 目录下写出 `last_prompt.json`。
378
+
379
+ ## License
380
+
381
+ Apache License 2.0. See [LICENSE](./LICENSE).