@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.
- package/CHANGELOG.md +3 -0
- package/LICENSE +184 -0
- package/README.md +230 -231
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +2 -19
- package/dist/agent.js.map +1 -1
- package/dist/command-extension.d.ts.map +1 -1
- package/dist/command-extension.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js.map +1 -1
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +0 -2
- package/dist/context.js.map +1 -1
- package/dist/delivery.d.ts.map +1 -1
- package/dist/delivery.js +11 -14
- package/dist/delivery.js.map +1 -1
- package/dist/dingtalk.d.ts.map +1 -1
- package/dist/dingtalk.js +26 -26
- package/dist/dingtalk.js.map +1 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +5 -8
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js.map +1 -1
- package/dist/memory-consolidation.d.ts.map +1 -1
- package/dist/memory-consolidation.js.map +1 -1
- package/dist/memory-files.d.ts.map +1 -1
- package/dist/memory-files.js.map +1 -1
- package/dist/memory-lifecycle.d.ts.map +1 -1
- package/dist/memory-lifecycle.js +1 -2
- package/dist/memory-lifecycle.js.map +1 -1
- package/dist/model-utils.d.ts.map +1 -1
- package/dist/model-utils.js.map +1 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/prompt-builder.d.ts.map +1 -1
- package/dist/prompt-builder.js.map +1 -1
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +0 -1
- package/dist/sandbox.js.map +1 -1
- package/dist/shell-escape.d.ts.map +1 -1
- package/dist/shell-escape.js.map +1 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +2 -3
- package/dist/store.js.map +1 -1
- package/dist/sub-agents.d.ts.map +1 -1
- package/dist/sub-agents.js +42 -10
- package/dist/sub-agents.js.map +1 -1
- package/dist/tools/attach.d.ts.map +1 -1
- package/dist/tools/attach.js.map +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/truncate.d.ts.map +1 -1
- package/dist/tools/truncate.js.map +1 -1
- package/dist/tools/write-content.d.ts.map +1 -1
- package/dist/tools/write-content.js.map +1 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js.map +1 -1
- package/docs/memory-rfc.md +291 -0
- package/docs/subagent/pi-subagent-analyse.txt +190 -0
- package/docs/subagent/pi-subagent-design.txt +266 -0
- package/docs/subagent/pi-subagent-phase1-plan.txt +529 -0
- package/package.json +69 -53
package/README.md
CHANGED
|
@@ -1,75 +1,90 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Pipiclaw
|
|
2
2
|
|
|
3
|
-
Pipiclaw
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
74
|
+
如果 `channel.json` 还是占位模板,程序会提示你先填配置,然后退出。这是预期行为。
|
|
60
75
|
|
|
61
|
-
|
|
76
|
+
### 4. Create A DingTalk App
|
|
62
77
|
|
|
63
|
-
-
|
|
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
|
-
|
|
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
|
-
- `
|
|
88
|
-
- `
|
|
89
|
-
- `allowFrom` 设为 `[]` 或删除时允许所有人
|
|
102
|
+
- `clientId`
|
|
103
|
+
- `clientSecret`
|
|
90
104
|
|
|
91
|
-
|
|
105
|
+
常见可选项:
|
|
92
106
|
|
|
93
|
-
|
|
107
|
+
- `robotCode`
|
|
108
|
+
留空时会回退到 `clientId`
|
|
109
|
+
- `cardTemplateId`
|
|
110
|
+
留空时不启用 AI Card 流式输出
|
|
111
|
+
- `allowFrom`
|
|
112
|
+
设置为 `[]` 或删除时表示允许所有人
|
|
94
113
|
|
|
95
|
-
|
|
114
|
+
### 6. Provide Model Credentials
|
|
96
115
|
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
140
|
+
```bash
|
|
141
|
+
pipiclaw
|
|
142
|
+
```
|
|
124
143
|
|
|
125
|
-
|
|
144
|
+
如果你希望工具运行在 Docker 容器里:
|
|
126
145
|
|
|
127
|
-
|
|
146
|
+
```bash
|
|
147
|
+
pipiclaw --sandbox=docker:your-container
|
|
148
|
+
```
|
|
128
149
|
|
|
129
|
-
|
|
130
|
-
|
|
150
|
+
### 8. Send The First Message
|
|
151
|
+
|
|
152
|
+
给机器人发一条普通消息,例如:
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
请介绍一下你自己,并说明你现在能做什么
|
|
131
156
|
```
|
|
132
157
|
|
|
133
|
-
|
|
158
|
+
如果一切正常:
|
|
134
159
|
|
|
135
|
-
|
|
160
|
+
- 你会在钉钉里看到 AI Card 的过程更新,或普通文本回退
|
|
161
|
+
- Pipiclaw 会在本地创建对应 channel 目录
|
|
162
|
+
- 后续会话会复用该 channel 的工作空间与记忆文件
|
|
136
163
|
|
|
137
|
-
|
|
164
|
+
## Configuration
|
|
138
165
|
|
|
139
|
-
|
|
140
|
-
pipiclaw
|
|
141
|
-
```
|
|
166
|
+
### Config Files
|
|
142
167
|
|
|
143
|
-
|
|
168
|
+
Pipiclaw 默认使用下面这些文件:
|
|
144
169
|
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
177
|
+
### Environment Variables
|
|
150
178
|
|
|
151
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
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
|
-
|
|
244
|
+
默认直接进入 session 上下文的内容:
|
|
274
245
|
|
|
275
|
-
- pi
|
|
246
|
+
- pi 默认 system prompt
|
|
276
247
|
- workspace 级 `SOUL.md`
|
|
277
248
|
- workspace 级 `AGENTS.md`
|
|
278
|
-
- workspace 级
|
|
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
|
-
|
|
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
|
-
|
|
301
|
-
|
|
302
|
-
- `
|
|
303
|
-
|
|
304
|
-
- `
|
|
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
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
|
323
|
-
-
|
|
284
|
+
- 预定义 sub-agent:放到 `~/.pi/pipiclaw/workspace/sub-agents/*.md`
|
|
285
|
+
- 临时 inline sub-agent:由主代理在一次 `subagent` 工具调用里直接构造
|
|
324
286
|
|
|
325
|
-
|
|
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
|
-
- `
|
|
353
|
-
-
|
|
354
|
-
-
|
|
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
|
-
|
|
364
|
-
- `researcher`:大范围读文件、查日志、收集事实
|
|
365
|
-
- `planner`:先整理范围、再给主 Agent 输出执行计划
|
|
320
|
+
在 `~/.pi/pipiclaw/workspace/events/` 放置 JSON 文件,可以创建三类事件:
|
|
366
321
|
|
|
367
|
-
|
|
322
|
+
- `immediate`
|
|
323
|
+
- `one-shot`
|
|
324
|
+
- `periodic`
|
|
368
325
|
|
|
369
|
-
|
|
326
|
+
示例:
|
|
370
327
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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).
|