@my-life-buddies/buddy-runtime 0.7.0 → 0.9.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 (45) hide show
  1. package/README.md +83 -49
  2. package/dist/conversation/agent.d.ts +4 -2
  3. package/dist/conversation/agent.d.ts.map +1 -1
  4. package/dist/conversation/agent.js +40 -8
  5. package/dist/conversation/agent.js.map +1 -1
  6. package/dist/conversation/index.d.ts +8 -7
  7. package/dist/conversation/index.d.ts.map +1 -1
  8. package/dist/conversation/index.js +22 -25
  9. package/dist/conversation/index.js.map +1 -1
  10. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts +1 -1
  11. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts.map +1 -1
  12. package/dist/conversation/mlbMessageAgentMessageConverter.js +3 -2
  13. package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -1
  14. package/dist/conversation/readMLBMessages.d.ts +0 -2
  15. package/dist/conversation/readMLBMessages.d.ts.map +1 -1
  16. package/dist/conversation/readMLBMessages.js +0 -2
  17. package/dist/conversation/readMLBMessages.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/mlbClient.d.ts +6 -6
  21. package/dist/mlbClient.d.ts.map +1 -1
  22. package/dist/mlbClient.js +13 -8
  23. package/dist/mlbClient.js.map +1 -1
  24. package/dist/server.d.ts.map +1 -1
  25. package/dist/server.js +34 -16
  26. package/dist/server.js.map +1 -1
  27. package/dist/tools/askQuestion.d.ts +15 -0
  28. package/dist/tools/askQuestion.d.ts.map +1 -0
  29. package/dist/tools/askQuestion.js +47 -0
  30. package/dist/tools/askQuestion.js.map +1 -0
  31. package/dist/tools/dataAccess.d.ts +2 -1
  32. package/dist/tools/dataAccess.d.ts.map +1 -1
  33. package/dist/tools/dataAccess.js +3 -0
  34. package/dist/tools/dataAccess.js.map +1 -1
  35. package/dist/tools/permissions.d.ts +7 -0
  36. package/dist/tools/permissions.d.ts.map +1 -0
  37. package/dist/tools/permissions.js +67 -0
  38. package/dist/tools/permissions.js.map +1 -0
  39. package/dist/tools/registry.d.ts +1 -1
  40. package/dist/tools/registry.d.ts.map +1 -1
  41. package/dist/tools/registry.js +1 -1
  42. package/dist/tools/registry.js.map +1 -1
  43. package/dist/types.d.ts +40 -5
  44. package/dist/types.d.ts.map +1 -1
  45. package/package.json +1 -1
package/README.md CHANGED
@@ -14,7 +14,7 @@ npm install @my-life-buddies/buddy-runtime typebox
14
14
 
15
15
  ### 1.2 注册搭子
16
16
 
17
- 通过平台开发者接口 `POST /cli/buddies` 注册,提交名称、头像、简介,平台分配搭子 id 与令牌;之后改档案用 `PUT /cli/buddies/:id/meta`。可选的模型 id 查 `GET /cli/models`。
17
+ 通过平台开发者接口 `POST /cli/buddies` 注册,提交名称、头像、简介,平台分配搭子 id 与令牌;之后改档案用 `PUT /cli/buddies/:id/meta`。可选的模型 id 查 `GET /cli/models`,可声明的数据能力查 `GET /cli/data-access/capabilities`。
18
18
 
19
19
  ### 1.3 搭子工程框架
20
20
 
@@ -45,6 +45,7 @@ const planMenu: AgentTool<typeof PLAN_MENU_PARAMS, undefined> = {
45
45
 
46
46
  await BuddyServer.start({
47
47
  model: "kimi-k3",
48
+ dataRequirements: [],
48
49
  buddy: () => ({
49
50
  initialState: {
50
51
  systemPrompt: "你是「小涂阿姨」——一位管做饭的阿姨……",
@@ -74,7 +75,7 @@ await BuddyServer.start({
74
75
  - 在自己电脑上连测试网关时,平台把这个进程当作 `<id>-dev` 分身,会话与正式搭子分开。
75
76
  - 改完代码想自动重启,在启动命令里加 `--watch`。
76
77
 
77
- 完整示例:[examples/aunt-tu/](examples/aunt-tu/)(记忆、小挂件)、[examples/stacy-sims/](examples/stacy-sims/)(资料)。
78
+ 完整示例:[examples/aunt-tu/](examples/aunt-tu/)(提问、记忆、小挂件)、[examples/stacy-sims/](examples/stacy-sims/)(资料)。
78
79
 
79
80
  ## 2. 配置
80
81
 
@@ -85,11 +86,15 @@ await BuddyServer.start({
85
86
  | 参数 | 说明 |
86
87
  |---|---|
87
88
  | `model` | 必填,模型 id,取值见 `GET /cli/models`,进程内所有会话共用。没填或运行时不认识这个 id 时启动失败 |
89
+ | `dataRequirements` | 必填,这只搭子需要的用户数据及用途;不需要时传 `[]`。Runtime 启动时整份上传平台,失败则不启动 |
88
90
  | `buddy` | 必填,`(conversation: Conversation) => BuddyOptions \| Promise<BuddyOptions>`,见 2.2、2.3 |
89
- | `welcome` | 可选,用户打开一场还没聊过的会话时发的问候,不经过模型 |
90
91
  | `errorReply` | 可选,模型出错或空回复时发的兜底回复 |
91
92
 
92
- `buddy` 在每场会话收到第一条消息时调用一次。会话空闲 30 分钟被回收、或进程重启后,下一条消息会重新调用,所以闭包里的变量不能当长期存储,要记住的东西写进记忆(3.2)。
93
+ Runtime 启动时先校验 `dataRequirements`,再凭搭子令牌把整份声明上传平台;平台补齐 Dataset 的标题、来源、Schema 版本和声明版本。上传失败时启动直接失败,不连接事件流,也不会出现“进程在线但没有正确数据权限”的半成品状态。
94
+
95
+ 用户新加搭子、新建群时,搭子会先开口打个招呼,跟平时回复一样调模型、逐字出现。开场白怎么说,写在 system prompt 里。
96
+
97
+ `buddy` 在每场会话收到第一条消息时调用一次。会话空闲 30 分钟被回收、或进程重启后,下一条消息会重新调用,所以闭包里的变量不能当长期存储,要记住的东西写进记忆(3.3)。
93
98
 
94
99
  会话历史长到一定程度(超过 128K token,窗口小的模型按窗口的四分之一算)时,运行时在会话被回收后把早先的对话压成一份摘要写回平台,下次重建时模型看到的是「摘要 + 最近的原文」。开发者不用做任何事,也没有开关。
95
100
 
@@ -115,7 +120,7 @@ type BuddyOptions = Pick<AgentOptions,
115
120
  | `initialState.tools` | 可选,pi 的 `AgentTool` 数组 |
116
121
  | `initialState.thinkingLevel` | 可选,默认 `off`。模型不支持的级别在请求时就近换成支持的一档,建会话时打一条 warn |
117
122
  | `platformTools` | 可选,给模型注册哪些平台工具,默认 `[]`,见第 3 节 |
118
- | `proactiveTools` | 可选,主动回合里还能用哪些工具,默认 `[]`(一个都不给)。写工具名,`platformTools` 选中的和 `initialState.tools` 里自己的都行;写了没注册的名字建会话时抛异常。见 3.5 |
123
+ | `proactiveTools` | 可选,主动回合里还能用哪些工具,默认 `[]`(一个都不给)。写工具名,`platformTools` 选中的和 `initialState.tools` 里自己的都行;写了没注册的名字建会话时抛异常。见 3.6 |
119
124
  | 其余字段 | 原样交给 pi;`beforeToolCall` 抛异常时按放行处理 |
120
125
 
121
126
  写工具时注意:
@@ -145,19 +150,19 @@ interface Conversation {
145
150
  read(file: string): string;
146
151
  };
147
152
 
148
- // 记忆,见 3.2:这场会话的长期记忆,存在平台上
153
+ // 记忆,见 3.3:这场会话的长期记忆,存在平台上
149
154
  memory: {
150
155
  list(): Promise<MemoryEntry[]>;
151
156
  write(key: string, text: string): Promise<void>;
152
157
  delete(key: string): Promise<void>;
153
158
  };
154
159
 
155
- // 授权数据,见 3.3:私聊不传 memberId,群聊传消息前缀里的 m_…
160
+ // 授权数据,见 3.4:私聊不传 memberId,群聊传消息前缀里的 m_…
156
161
  dataAccess: {
157
162
  query(request: { datasets: string[]; memberId?: string }): Promise<DatasetAccessResult[]>;
158
163
  };
159
164
 
160
- // 小挂件,见 3.4
165
+ // 小挂件,见 3.5
161
166
  widgets: {
162
167
  list(): Promise<WidgetSummary[]>;
163
168
  create(input: { type: string; title: string; idempotencyKey?: string }): Promise<{ id: string }>;
@@ -174,7 +179,7 @@ interface Conversation {
174
179
  send(id: string, options: { idempotencyKey: string }): void;
175
180
  };
176
181
 
177
- // 主动服务,见 3.5:提订阅建议,用户在 App 里确认后才生效
182
+ // 主动服务,见 3.6:提订阅建议,用户在 App 里确认后才生效
178
183
  proactive: {
179
184
  propose(request: ProactiveSubscriptionRequest): Promise<{ id: string; status: "pending" }>;
180
185
  };
@@ -188,8 +193,10 @@ interface Conversation {
188
193
  | 能力 | `conversation` 对象方法 | 默认注册成的模型工具 | 默认注册成模型工具的条件 |
189
194
  |---|---|---|---|
190
195
  | 资料 | `conversation.resources.list` / `conversation.resources.read` | `resource_read` | platformTools 声明 && `resources/` 下有 `.md` |
196
+ | 提问 | 无 | `ask_question` | platformTools 声明 |
191
197
  | 记忆 | `conversation.memory` | 无,默认不注册成模型工具,开发者可以根据具体场景,注册成适合场景需要的模型工具 | — |
192
198
  | 授权数据 | `conversation.dataAccess.query` | `data_access_query` | platformTools 声明 && 声明过至少一个 Dataset |
199
+ | 会话内权限 | `conversation.permissions.request` / `conversation.permissions.readResult` | `permission_request` / `permission_result_read` | platformTools 声明;第一期仅私聊 |
193
200
  | 小挂件 | `conversation.widgets.list` / `conversation.widgets.create` / `conversation.widgets.read` / `conversation.widgets.readModule` / `conversation.widgets.rename` / `conversation.widgets.write` / `conversation.widgets.deleteRecord` / `conversation.widgets.delete` / `conversation.widgets.setPresentation` / `conversation.widgets.send` | `widget_create` / `widget_write` / `widget_read` / `widget_delete` / `widget_send` | platformTools 声明 && `widgets/` 下有小挂件 |
194
201
  | 主动服务 | `conversation.proactive.propose` | 无 | — |
195
202
 
@@ -228,7 +235,19 @@ const notes = conversation.resources.read("research/01-writings.md");
228
235
 
229
236
  完整示例见 [examples/stacy-sims/](examples/stacy-sims/)。
230
237
 
231
- ### 3.2 记忆
238
+ ### 3.2 提问
239
+
240
+ 让模型发一张题卡请用户选:一个问题加 2 到 4 个可以直接点的选项。私聊、群聊都能用。
241
+
242
+ 把 `ask_question` 写进 `platformTools`,模型就能发题卡。
243
+
244
+ - 参数是 `question`(题目,不超过 500 字)和 `options`(2 到 4 个,每个不超过 30 字,不能重复);不合规时模型会看到错误,改了再调。
245
+ - 用户点选项,就是用选项原文发一条消息,跟自己打字一样;也可以不点,直接打字。
246
+ - `conversation` 对象不提供发题卡的方法,题卡只由模型发。
247
+
248
+ 用法见 [examples/aunt-tu/](examples/aunt-tu/)。
249
+
250
+ ### 3.3 记忆
232
251
 
233
252
  这场会话的长期记忆,存在平台上,只在本会话内可见,会话删除时一并清除。
234
253
 
@@ -253,6 +272,7 @@ const REMEMBER_PARAMS = Type.Object({ topic: Type.String(), text: Type.String()
253
272
 
254
273
  await BuddyServer.start({
255
274
  model: "kimi-k3",
275
+ dataRequirements: [],
256
276
  buddy: (conversation) => {
257
277
  const remember: AgentTool<typeof REMEMBER_PARAMS, undefined> = {
258
278
  name: "remember",
@@ -269,26 +289,67 @@ await BuddyServer.start({
269
289
  });
270
290
  ```
271
291
 
272
- ### 3.3 授权数据
292
+ ### 3.4 授权数据
273
293
 
274
294
  用户同意后,搭子可以读用户的睡眠、运动等数据。数据按 Dataset 分项,用户逐项同意。搭子拿不到用户的真实 id。
275
295
 
276
- **声明需要哪些数据**
296
+ 这里有三层不同概念:
277
297
 
278
- `PUT /cli/buddies/:id/data-requirements` 提交完整清单,每次覆盖上一次:
298
+ 1. **平台能力目录**:平台目前能提供哪些 Dataset,由 `GET /cli/data-access/capabilities` 返回。
299
+ 2. **搭子数据声明**:这只搭子实际需要其中哪些 Dataset,以及各自用途,写在 `BuddyServer.start.dataRequirements`。
300
+ 3. **用户 Grant**:用户是否同意这只搭子读取某个已声明 Dataset,由客户端授权流程管理,搭子不能代替用户授予。
301
+
302
+ `platformTools` 只决定模型能不能调用 `data_access_query`、`permission_request` 等工具,不等于声明 Dataset,也不等于获得用户授权。
303
+
304
+ 位置和日历是当前会话的一次性权限结果,通过 `permission_request` 请求,不属于 Dataset,也不写进 `dataRequirements`。HealthKit 数据会形成可重复查询的 Dataset,因此必须先在 `dataRequirements` 中声明。
305
+
306
+ **查看平台能力目录**
307
+
308
+ 开发者凭 CLI 用户令牌请求:
309
+
310
+ ```http
311
+ GET /cli/data-access/capabilities
312
+ Authorization: Bearer <用户 token>
313
+ ```
314
+
315
+ 响应示例:
279
316
 
280
317
  ```json
281
318
  {
282
319
  "datasets": [
283
- { "id": "health.sleep", "purpose": "根据你最近的睡眠调整作息建议" }
320
+ {
321
+ "id": "health.sleep",
322
+ "title": "睡眠",
323
+ "source": "healthkit",
324
+ "schemaVersion": 1
325
+ }
284
326
  ]
285
327
  }
286
328
  ```
287
329
 
288
- - `id`:从下表选。
330
+ 这份目录是可选 `id` 的权威来源。表格仅用于阅读,新增能力时以接口返回为准。
331
+
332
+ **声明需要哪些数据**
333
+
334
+ 声明写在 `BuddyServer.start` 的初始化参数里,Runtime 每次启动时整份上传平台:
335
+
336
+ ```ts
337
+ await BuddyServer.start({
338
+ model: "kimi-k3",
339
+ dataRequirements: [
340
+ { id: "health.sleep", purpose: "根据你最近的睡眠调整作息建议" },
341
+ ],
342
+ buddy: () => ({ /* ... */ }),
343
+ });
344
+ ```
345
+
346
+ - `id`:从下表选,也可以调用 `GET /cli/data-access/capabilities` 获取平台当前的完整能力目录。
289
347
  - `purpose`:用途,1~200 字。用户看到这句话再决定是否同意。
290
- - 改了某项的 `purpose`,用户要重新同意;从清单里删掉的,搭子立即读不到。
291
- - 改完清单要重启搭子进程,模型才能看到新清单。
348
+ - 每次启动都是整份覆盖:新增项进入待授权,删除项立即停止访问并撤销对应 Grant。
349
+ - `id` 与 `purpose` 都没变化时保留声明版本和已有 Grant;修改 `purpose` 会提升声明版本,已有 Grant 变成 `reconsentRequired`,需要用户重新确认。
350
+ - 声明不再通过 `PUT /cli/buddies/:id/data-requirements` 修改;改代码并重启或发布搭子即可生效。
351
+ - 本地进程连接线上网关时使用 `<buddyId>-dev` 身份,其声明和用户授权与正式搭子隔离,不会覆盖线上版本。
352
+ - 可用 `GET /cli/buddies/:id/data-requirements` 查看某搭子当前已经上传并生效的声明;这个接口只读。
292
353
 
293
354
  | Dataset | 内容 | `data.items` 每条的字段 |
294
355
  |---|---|---|
@@ -306,6 +367,7 @@ await BuddyServer.start({
306
367
  **查询**
307
368
 
308
369
  - 让模型查:`platformTools` 写上 `data_access_query`,工具说明里会列出声明过的 Dataset 与用途。可以在系统提示里写明什么时候查,比如「聊到作息时,先用 data_access_query 查 health.sleep」。
370
+ - 要在聊天中申请位置、日历或 HealthKit 权限,把 `permission_request` 加进 `platformTools`。HealthKit 先查询,收到 `notGranted` / `reconsentRequired` 后再发卡;位置和日历授权完成后,以卡片消息 ID 调 `permission_result_read` 读取一次性结果。用户拒绝后不要在同一任务里反复申请。
309
371
  - 在工具里查:调用 `conversation.dataAccess.query`。
310
372
 
311
373
  ```ts
@@ -339,7 +401,7 @@ if (sleep.status === "available") {
339
401
  - **想让某个结论以后还在场,就在回复里说出来**(用户也会看到)。模型对这些数据的记忆只能活在它说过的话里——下次它读到的是「查了 health.sleep,可用」,不是具体数字。
340
402
  - **别把查到的数据写进记忆、小挂件或别的工具的参数**。那些地方不脱敏,写进去就永久留下了。
341
403
 
342
- ### 3.4 小挂件
404
+ ### 3.5 小挂件
343
405
 
344
406
  小挂件是会话里一块给用户看的结构化面板,比如一份菜单。模型通过平台工具、开发者通过 `conversation.widgets`,都能建小挂件、写记录、读记录、删记录,并把它发进聊天。
345
407
 
@@ -395,11 +457,11 @@ execute: async (toolCallId, params) => {
395
457
  - `list` 和 `read` 回的 `canEdit` 为 `false` 的,是别的会话转发来的引用,只能读;改名、写记录、删除、设卡片时平台回 403。
396
458
  - `data` 要符合 `schema.json` 里这个模块的 `record`,不符合时平台回 400。
397
459
  - 平台回非 2xx、网络出错、超过 30 秒或响应超过 4 MiB 时抛异常,异常的 `status` 是 HTTP 状态码,不带平台给的原因。写操作不自动重试,失败后先读一遍真实状态再决定。
398
- - 主动服务回合里,除了 `list`、`read`、`readModule`,其余方法都会抛异常,见 3.5
460
+ - 主动服务回合里,除了 `list`、`read`、`readModule`,其余方法都会抛异常,见 3.6
399
461
 
400
462
  用法见 [examples/aunt-tu/](examples/aunt-tu/)。
401
463
 
402
- ### 3.5 主动服务
464
+ ### 3.6 主动服务
403
465
 
404
466
  让搭子在约定的时机主动找用户说话,比如每周一次复盘。只支持私聊。
405
467
 
@@ -438,32 +500,4 @@ await conversation.proactive.propose({
438
500
  - 系统提示和普通回合一字不差,记忆不会被附上去。要让模型用记忆,自己把 `conversation.memory.list` 包成工具注册进来,再写进 `proactiveTools`。
439
501
  - 调用 `memory.write`、`memory.delete`、`proactive.propose`,以及 `widgets` 上除 `list`、`read`、`readModule` 以外的方法,会抛异常;开发者的钩子照常执行。
440
502
  - 用户这时发来消息,主动回合中止,先回复用户;超过 4 分钟也中止。
441
- - 主动回合的过程不下发给用户:平台在会话流里记两条不可见的记录(叫你判断了什么、你判断的结果),中间的工具步照常写回但也不下发。**开口的那条消息才是用户看得到的**,之后作为搭子说过的话出现在会话历史里。
442
-
443
- ## 4. 模型收到什么
444
-
445
- 开发者不用保存会话历史,也不用自己拼模型消息。每场会话的消息存在平台上,进程重启后运行时从平台取回。每次请求模型时,运行时组出以下内容。
446
-
447
- **系统提示**,按顺序拼接,段间空一行:
448
-
449
- 1. 平台的系统提示:对每场会话都一样的规则,比如消息开头的时间怎么读、用户所在时区去哪看。
450
- 2. `initialState.systemPrompt`。
451
- 3. 资料清单:选了 `resource_read` 且有资料时才有。
452
-
453
- **工具**:选中的平台工具在前,`initialState.tools` 在后。
454
-
455
- **消息**:这场会话的完整历史,按时间先后排列。一轮回复里模型可能请求多次,比如调完工具接着说,每次都带上当时的完整历史。
456
-
457
- - 用户消息、工具结果的开头带 GMT 时间,如「[2026-09-10 14:00:30 GMT] 」;搭子自己说的话不带。
458
- - 历史末尾多一条「现在的时间(平台附注,不是谁说的话)」,时间是请求时刻,只在这一次请求里。
459
- - 群聊里成员说的话开头标「[名字 #m_…] 」。
460
- - 平台交代的情况(比如这场会话里已有哪些小挂件)是一条以「平台交代的情况:」开头的消息,情况有变化才追加新的一份。
461
- - 引用了别的消息时,开头加一行「[引用 发言人:原话]」,引用图片写「[引用 发言人的图片 #被引消息 id]」。
462
- - 转发的聊天记录卡按条目展开,每条先写「【名字】」再写正文。
463
- - 查过授权数据的那一轮,结束后按 3.3 替换。
464
-
465
- **图片**:用户发的图不用开发者处理。
466
-
467
- - 平台在上传时统一处理成 JPEG,最长边不超过 2048 px、不超过 5 MiB。
468
- - 图片消息是一条 user 消息:先是「[图片 #消息 id]」和用户配的文字,再跟图片本身;聊天记录卡里的图跟在所在条目的正文后面。
469
- - 图片读不到时换成「[图片无法读取]」;`model` 不支持看图时换成「[图片:当前模型不支持看图]」。
503
+ - 主动回合的过程不下发给用户:平台在会话流里记两条不可见的记录(叫你判断了什么、你判断的结果),中间的工具步照常写回但也不下发。**开口的那条消息才是用户看得到的**,之后作为搭子说过的话出现在会话历史里。
@@ -6,8 +6,10 @@ import { DataAccessUsageTracker } from "../tools/dataAccess.ts";
6
6
  import type { Resource } from "../tools/resource.ts";
7
7
  import type { BuddyFactory, BuddyLogger, DataRequirement, MLBMessageToWrite } from "../types.ts";
8
8
  export interface AgentDeps {
9
- /** 这场会话的发送队列:widget_send 与 conversation.widgets.send 把小挂件引用放进来 */
9
+ /** 这场会话的发送队列:小挂件引用、权限请求卡、题卡都放进来 */
10
10
  enqueueMessage: (message: MLBMessageToWrite) => void;
11
+ /** 发了一张等用户操作的卡(权限请求卡、题卡):这张卡算这一轮说过的话 */
12
+ onWaitingForUser?: () => void;
11
13
  onPolicyStop?: () => void;
12
14
  key: string;
13
15
  buddyId: string;
@@ -20,7 +22,7 @@ export interface AgentDeps {
20
22
  widgetTypes: WidgetType[];
21
23
  /** 搭子目录下 resources/ 里的资料;空数组就不装 resource_read、不接清单 */
22
24
  resources: Resource[];
23
- dataRequirements: () => Promise<DataRequirement[]>;
25
+ dataRequirements: readonly DataRequirement[];
24
26
  factory: BuddyFactory;
25
27
  log: BuddyLogger;
26
28
  /** Agent 事件的去处。pi 会等它返回,所以只能同步做事 */
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/conversation/agent.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAa,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEnG,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAkB,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAA8B,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE7H,MAAM,WAAW,SAAS;IACzB,kEAAkE;IAClE,cAAc,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,sDAAsD;IACtD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACnD,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,WAAW,CAAC;IACjB,oCAAoC;IACpC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD;AAED,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,EAAE,sBAAsB,CAAC;CACxC;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAsIxE;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,iHAAuB,CAAC;AAEtD,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAErF;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUxD"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/conversation/agent.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAa,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEnG,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAkB,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIrD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAA8B,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE7H,MAAM,WAAW,SAAS;IACzB,mCAAmC;IACnC,cAAc,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrD,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,sDAAsD;IACtD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,gBAAgB,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,WAAW,CAAC;IACjB,oCAAoC;IACpC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD;AAED,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,EAAE,sBAAsB,CAAC;CACxC;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAmKxE;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,iHAAuB,CAAC;AAEtD,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAErF;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUxD"}
@@ -3,7 +3,7 @@
3
3
  // systemPrompt 按 平台的(GET /internal/v1/system-prompt,每场会话建 Agent 时拉一次)→ 开发者的 → 资料清单 拼,段间空一行;
4
4
  // 显式选中的平台工具排在开发者工具前面并查重名;选择 resource_read 时才追加资料清单;
5
5
  // 开发者显式设的 thinkingLevel 这个模型不支持时打一条 warn,写明支持哪几档、实际会怎么发;
6
- // 钩子叠加——开发者的 beforeToolCall 包 try/catch 抛了按放行;其余直通;
6
+ // 钩子叠加——开发者的 beforeToolCall 包 try/catch 抛了按放行;发了等用户操作的卡(权限请求卡、题卡)的那一轮,shouldStopAfterTurn 在这一步收尾后停下;其余直通;
7
7
  // transformContext 由运行时自己装、不开放给开发者:每次请求模型在历史末尾接一条写当前时间的 user 消息,不进会话历史;
8
8
  // 每回合的模型输入和请求体全量打日志,主动回合也一样,图片换成字节数。
9
9
  // 不管:Agent 建好之后的事(回合、事件分发在 index.ts)。
@@ -11,12 +11,20 @@ import { Agent } from "@earendil-works/pi-agent-core";
11
11
  import { clampThinkingLevel, getSupportedThinkingLevels } from "@earendil-works/pi-ai";
12
12
  import { agentMessagesToLLMMessages } from "./agentMessageLLMMessageConverter.js";
13
13
  import { errorText } from "../log.js";
14
+ import { askQuestionTool } from "../tools/askQuestion.js";
14
15
  import { dataAccessTool, DataAccessUsageTracker } from "../tools/dataAccess.js";
15
16
  import { resourceReadTool, resourceCatalog } from "../tools/resource.js";
16
17
  import { validatePlatformTools, registerTools } from "../tools/registry.js";
17
18
  import { widgetTools } from "../tools/widgets.js";
19
+ import { permissionTools, validatePermissionRequest } from "../tools/permissions.js";
18
20
  export async function createAgent(deps) {
19
21
  const dataAccessUsage = new DataAccessUsageTracker();
22
+ /** 这一轮发了等用户操作的卡(权限请求卡、题卡):shouldStopAfterTurn 在这一步收尾后停下,不再请求模型 */
23
+ let waitingForUser = false;
24
+ const waitForUser = () => {
25
+ waitingForUser = true;
26
+ deps.onWaitingForUser?.();
27
+ };
20
28
  const { client } = deps;
21
29
  // 写操作前先 assertWritable:主动服务回合里(开发者的钩子在这时被调)只许读,写记忆、提订阅建议、改小挂件、发小挂件直接 throw
22
30
  const conversation = {
@@ -39,6 +47,20 @@ export async function createAgent(deps) {
39
47
  },
40
48
  // 经 dataAccessUsage 查:开发者工具里查过的那一轮,写回平台和留在历史里的内容也会脱敏;主动服务回合里改走执行令牌
41
49
  dataAccess: { query: ({ datasets, memberId }) => dataAccessUsage.query(client, deps.key, datasets, memberId) },
50
+ permissions: {
51
+ request: async (input) => {
52
+ dataAccessUsage.assertWritable();
53
+ const validated = validatePermissionRequest(input, deps.key, deps.dataRequirements);
54
+ deps.enqueueMessage({ type: "permissionRequest", permissionRequest: validated, text: validated.reason, idempotencyKey: input.idempotencyKey });
55
+ waitForUser();
56
+ },
57
+ readResult: async (requestId) => {
58
+ dataAccessUsage.assertWritable();
59
+ const result = await client.readPermissionResult(deps.key, requestId);
60
+ dataAccessUsage.markSensitive();
61
+ return result;
62
+ },
63
+ },
42
64
  proactive: { propose: (request) => { dataAccessUsage.assertWritable(); return client.proposeProactiveSubscription(deps.key, request); } },
43
65
  widgets: {
44
66
  list: () => client.widgetList(deps.key),
@@ -57,16 +79,19 @@ export async function createAgent(deps) {
57
79
  const options = await deps.factory(conversation);
58
80
  const selected = validatePlatformTools(options.platformTools);
59
81
  // 平台的 system prompt 拉失败就 throw:这场会话起不来,等下一条消息再重建
60
- const [platformPrompt, requirements] = await Promise.all([
61
- deps.client.systemPrompt(deps.key),
62
- selected.has("data_access_query") ? deps.dataRequirements() : [],
63
- ]);
82
+ const platformPrompt = await deps.client.systemPrompt(deps.key);
83
+ const requirements = selected.has("data_access_query") || selected.has("permission_request") ? [...deps.dataRequirements] : [];
64
84
  const resources = selected.has("resource_read") ? deps.resources : [];
65
85
  const readTools = [
66
86
  ...(requirements.length ? [dataAccessTool(client, deps.key, dataAccessUsage, requirements)] : []),
67
87
  ...(resources.length ? [resourceReadTool(resources)] : []),
68
88
  ];
69
- const available = [...readTools, ...widgetTools(client, deps.key, deps.widgetTypes, deps.enqueueMessage)];
89
+ const available = [
90
+ ...readTools,
91
+ ...permissionTools(client, deps.key, deps.enqueueMessage, dataAccessUsage, requirements, waitForUser),
92
+ ...widgetTools(client, deps.key, deps.widgetTypes, deps.enqueueMessage),
93
+ askQuestionTool(deps.enqueueMessage, dataAccessUsage, waitForUser),
94
+ ];
70
95
  const tools = registerTools(selected, available, options.initialState.tools ?? []).map(tool => dataAccessUsage.track(tool));
71
96
  const { log, key } = deps;
72
97
  const thinkingLevel = options.initialState.thinkingLevel;
@@ -141,12 +166,19 @@ export async function createAgent(deps) {
141
166
  afterToolCall: devAfter === undefined
142
167
  ? undefined
143
168
  : (context, signal) => dataAccessUsage.runForTool(context.toolCall.id, () => devAfter(context, signal)),
144
- shouldStopAfterTurn: options.shouldStopAfterTurn ? async (context, signal) => {
169
+ shouldStopAfterTurn: async (context, signal) => {
170
+ if (waitingForUser) {
171
+ waitingForUser = false;
172
+ deps.onPolicyStop?.();
173
+ return true;
174
+ }
175
+ if (options.shouldStopAfterTurn === undefined)
176
+ return false;
145
177
  const stop = await options.shouldStopAfterTurn(context, signal);
146
178
  if (stop)
147
179
  deps.onPolicyStop?.();
148
180
  return stop;
149
- } : undefined,
181
+ },
150
182
  prepareNextTurnWithContext: options.prepareNextTurnWithContext,
151
183
  thinkingBudgets: options.thinkingBudgets,
152
184
  toolExecution: options.toolExecution,
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/conversation/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/conversation/agent.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,6 @@ import type { Resource } from "../tools/resource.ts";
5
5
  import type { BuddyFactory, BuddyLogger, DataRequirement, ProactiveDecision, ProactiveRun } from "../types.ts";
6
6
  import type { CompactionSnapshot } from "./compaction.ts";
7
7
  export interface ConversationHandleDeps {
8
- welcome?: string;
9
8
  errorReply?: string;
10
9
  /** 平台会话键:p_ 私聊、g_ 群 */
11
10
  key: string;
@@ -19,14 +18,15 @@ export interface ConversationHandleDeps {
19
18
  widgetTypes: WidgetType[];
20
19
  /** 搭子目录下 resources/ 里的资料,server 启动时读一次;空数组就不装 resource_read */
21
20
  resources: Resource[];
22
- /** 搭子已声明的用户数据需求,进程级懒加载并复用 */
23
- dataRequirements: () => Promise<DataRequirement[]>;
21
+ /** 搭子启动时已上传并由平台补全的用户数据需求,进程内所有会话共用。 */
22
+ dataRequirements: readonly DataRequirement[];
24
23
  factory: BuddyFactory;
25
24
  log: BuddyLogger;
26
25
  /** 这场会话起不来(工厂抛错、工具重名)时通知 server 把它从表里删掉,下一条消息会重新起一场 */
27
26
  onStartFailed: () => void;
28
27
  }
29
28
  export declare class ConversationHandle {
29
+ /** 收到过 welcome 事件(会话刚建好):首次拉到的只有场合交代时,重建完从它接着起回合开口 */
30
30
  private welcomeRequested;
31
31
  private steered;
32
32
  private policyStopped;
@@ -47,7 +47,7 @@ export declare class ConversationHandle {
47
47
  private replyTo;
48
48
  /** 当前回合的 promise,close 要等它 */
49
49
  private turn;
50
- /** 本回合有没有一条 assistant 消息带非空正文且正常收尾 */
50
+ /** 本回合说过话没有:有一条 assistant 消息带非空正文且正常收尾,或者发了一张等用户操作的卡(权限请求卡、题卡) */
51
51
  private spoke;
52
52
  /** 本回合有没有一条 assistant 消息是出错 / 被掐断收尾的:普通回合收尾时按它发 errorReply 兜底,主动回合按它判失败 */
53
53
  private failed;
@@ -72,7 +72,7 @@ export declare class ConversationHandle {
72
72
  * 回收后拿它在后台压缩;没超、还没建会话、正忙都回 undefined。压缩从不碰这场会话的内存历史
73
73
  */
74
74
  snapshotForCompaction(): CompactionSnapshot | undefined;
75
- /** SSE message 到了:让 reader 拉一次。已退役的直接忽略 */
75
+ /** SSE message / welcome 到了:让 reader 拉一次,welcome 另记下会话刚建好。已退役的直接忽略 */
76
76
  notify(welcome?: boolean): void;
77
77
  runProactive(run: ProactiveRun): Promise<ProactiveDecision>;
78
78
  private executeProactive;
@@ -101,8 +101,9 @@ export declare class ConversationHandle {
101
101
  */
102
102
  private admit;
103
103
  /**
104
- * 跑一个回合。messages 有值就 prompt 它们;没值(收尾时发现队列里还有消息)就直接 continue
105
- * prompt 完把回合中 steer 进来的消化完;出错或一句话没说,收尾时发一条 errorReply 兜底(没配 errorReply 就不发)。
104
+ * 跑一个回合。start 是这一回合的第一步:prompt 拉到的该答消息,或者新会话从场合交代接着 continue
105
+ * 没给(收尾时发现队列里还有消息)就直接消化队列。
106
+ * 第一步跑完把回合中 steer 进来的消化完;出错或一句话没说,收尾时发一条 errorReply 兜底(没配 errorReply 就不发)。
106
107
  * 收尾:replying 关掉、等发平台的队列清空(每条写回的消息都拿到了平台定的时间)、heard 进历史、
107
108
  * 这一轮进历史的消息按时间排好,才算不忙——排完的顺序跟手机上、跟重建出来的一样。
108
109
  * 收尾期间又有人 steer(busy 还是 true,走不了 prompt),就接着再跑一个回合把它消化掉。
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAqB,YAAY,EAAa,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC1G,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAIxD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAc,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3H,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAK1D,MAAM,WAAW,sBAAsB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,+DAA+D;IAC/D,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,uCAAuC;IACvC,gBAAgB,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,WAAW,CAAC;IACjB,uDAAuD;IACvD,aAAa,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,qBAAa,kBAAkB;IAC9B,sDAAsD;IACtD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,iCAAiC;IACjC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,eAAe,CAAqC;IAC5D,0BAA0B;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,+BAA+B;IAC/B,OAAO,CAAC,KAAK,CAAsB;IACnC,6CAA6C;IAC7C,OAAO,CAAC,OAAO,CAAM;IACrB,8BAA8B;IAC9B,OAAO,CAAC,IAAI,CAA4B;IACxC,kEAAkE;IAClE,OAAO,CAAC,KAAK,CAAS;IACtB,2EAA2E;IAC3E,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAc;IACnC,qDAAqD;IACrD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,uBAAuB,CAAoB;gBAEvC,IAAI,EAAE,sBAAsB;IAmBxC,2BAA2B;IAC3B,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,uCAAuC;IACvC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,uBAAuB;IACvB,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,uCAAuC;IACvC,IAAI,UAAU,IAAI,SAAS,YAAY,EAAE,CAExC;IAED;;;OAGG;IACH,qBAAqB,IAAI,kBAAkB,GAAG,SAAS;IAOvD,sEAAsE;IACtE,MAAM,CAAC,OAAO,UAAQ,GAAG,IAAI;IAO7B,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAQ7C,gBAAgB;IAkE9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,yDAAyD;IACzD,OAAO,CAAC,MAAM;IAQd;;;OAGG;YACW,UAAU;IAmBxB;;;OAGG;YACW,OAAO;IAoBrB,mDAAmD;IACnD,OAAO,CAAC,MAAM;IAYd;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAuBb;;;;;;;OAOG;YACW,OAAO;IA6DrB;;;OAGG;IACH,OAAO,CAAC,OAAO;CAuEf"}
@@ -1,7 +1,7 @@
1
1
  // 一场会话的纪律:拉到消息怎么办、什么时候起回合、Agent 事件往哪送、怎么退役。
2
- // 管:首次拉到的整批灌进 Agent(重建),搭子最后一次说话之后有该答的就起回合;
2
+ // 管:首次拉到的整批灌进 Agent(重建),搭子最后一次说话之后有该答的就起回合;会话刚建好(收到过 welcome)、只拉到场合交代的,重建完从它接着开口;
3
3
  // 之后每批按空闲 / 忙碌 × 要不要开口四路分发;
4
- // 回合(prompt → 把回合中排进队列的消息消化完 → 出错或一句话没说就发 errorReply 兜底、兜底话也进历史 → 收尾把这一轮的历史按消息时间排好);
4
+ // 回合(prompt 该答的消息、或从场合交代接着 continue → 把回合中排进队列的消息消化完 → 出错或一句话没说(发了等用户操作的卡算说过)就发 errorReply 兜底、兜底话也进历史 → 收尾把这一轮的历史按消息时间排好);
5
5
  // Agent 事件交给发平台的队列;close(先标退役、再打断回合、等它收尾)。
6
6
  // 不管:什么时候拉、游标、翻页与重试(readMLBMessages.ts)、Agent 怎么建(agent.ts)、拉回来的记录怎么分拣(history.ts)、压缩本身(compaction.ts)、
7
7
  // replying / delta / 写回怎么发(writeMLBMessage.ts)、HTTP 请求本身(mlbClient.ts)、
@@ -17,6 +17,7 @@ import { splitForRebuild, theirsOf, wantsReply } from "./history.js";
17
17
  import { ReadMLBMessages } from "./readMLBMessages.js";
18
18
  import { WriteMLBMessage } from "./writeMLBMessage.js";
19
19
  export class ConversationHandle {
20
+ /** 收到过 welcome 事件(会话刚建好):首次拉到的只有场合交代时,重建完从它接着起回合开口 */
20
21
  welcomeRequested = false;
21
22
  steered = [];
22
23
  policyStopped = false;
@@ -37,7 +38,7 @@ export class ConversationHandle {
37
38
  replyTo = "";
38
39
  /** 当前回合的 promise,close 要等它 */
39
40
  turn;
40
- /** 本回合有没有一条 assistant 消息带非空正文且正常收尾 */
41
+ /** 本回合说过话没有:有一条 assistant 消息带非空正文且正常收尾,或者发了一张等用户操作的卡(权限请求卡、题卡) */
41
42
  spoke = false;
42
43
  /** 本回合有没有一条 assistant 消息是出错 / 被掐断收尾的:普通回合收尾时按它发 errorReply 兜底,主动回合按它判失败 */
43
44
  failed = false;
@@ -94,7 +95,7 @@ export class ConversationHandle {
94
95
  return undefined;
95
96
  return { systemPrompt: agent.state.systemPrompt, tools: agent.state.tools, messages: [...agent.state.messages] };
96
97
  }
97
- /** SSE message 到了:让 reader 拉一次。已退役的直接忽略 */
98
+ /** SSE message / welcome 到了:让 reader 拉一次,welcome 另记下会话刚建好。已退役的直接忽略 */
98
99
  notify(welcome = false) {
99
100
  if (this._closed)
100
101
  return;
@@ -217,23 +218,17 @@ export class ConversationHandle {
217
218
  this.ingest(messages);
218
219
  return;
219
220
  }
220
- // 首次拉到空的先不建会话,等下一次通知再拉:空数组的 every 为真,不拦会被当成只有场合记录的新会话误发问候
221
+ // 首次拉到空的先不建会话,等下一次通知再拉:空数组的 every 为真,不拦会被当成只有场合交代的新会话去开口
221
222
  if (!messages.length)
222
223
  return;
223
224
  try {
224
- if (this.welcomeRequested) {
225
- this.welcomeRequested = false;
226
- if (this.deps.welcome && messages.every(m => m.type === "situation" && m.author === "platform")) {
227
- this.writer.enqueueMessage({ type: "message", text: this.deps.welcome, idempotencyKey: `welcome:${this.deps.key}` });
228
- await this.writer.flush();
229
- if (!this._closed) {
230
- this.reader.resetCursor();
231
- this.reader.notify();
232
- }
233
- return;
234
- }
235
- }
225
+ // 会话刚建好(收到过 welcome)、拉到的只有平台写的场合交代:场合交代里写着该搭子先开口,重建完从它接着起回合。
226
+ // 拉到的有别人的记录(用户抢先说了话)就不单独开口,按平时的规矩重建、回答
227
+ const opening = this.welcomeRequested && messages.every((m) => m.type === "situation" && m.author === "platform");
228
+ this.welcomeRequested = false;
236
229
  await this.rebuild(messages);
230
+ if (opening && !this._closed && !this._busy)
231
+ this.turn = this.runTurn((agent) => agent.continue());
237
232
  }
238
233
  catch (e) {
239
234
  this.deps.log.error("起会话失败", { convoKey: this.deps.key, error: errorText(e) });
@@ -249,6 +244,7 @@ export class ConversationHandle {
249
244
  const created = await createAgent({
250
245
  ...this.deps,
251
246
  enqueueMessage: message => this.writer.enqueueMessage(message),
247
+ onWaitingForUser: () => { this.spoke = true; },
252
248
  onPolicyStop: () => { this.policyStopped = true; },
253
249
  onEvent: (a, event) => this.onEvent(a, event),
254
250
  });
@@ -301,7 +297,7 @@ export class ConversationHandle {
301
297
  }
302
298
  if (!this._busy) {
303
299
  if (shouldReply)
304
- this.turn = this.runTurn(messages);
300
+ this.turn = this.runTurn((agent) => agent.prompt(messages));
305
301
  else
306
302
  agent.state.messages.push(...messages);
307
303
  return;
@@ -316,13 +312,14 @@ export class ConversationHandle {
316
312
  }
317
313
  // —— 回合
318
314
  /**
319
- * 跑一个回合。messages 有值就 prompt 它们;没值(收尾时发现队列里还有消息)就直接 continue
320
- * prompt 完把回合中 steer 进来的消化完;出错或一句话没说,收尾时发一条 errorReply 兜底(没配 errorReply 就不发)。
315
+ * 跑一个回合。start 是这一回合的第一步:prompt 拉到的该答消息,或者新会话从场合交代接着 continue
316
+ * 没给(收尾时发现队列里还有消息)就直接消化队列。
317
+ * 第一步跑完把回合中 steer 进来的消化完;出错或一句话没说,收尾时发一条 errorReply 兜底(没配 errorReply 就不发)。
321
318
  * 收尾:replying 关掉、等发平台的队列清空(每条写回的消息都拿到了平台定的时间)、heard 进历史、
322
319
  * 这一轮进历史的消息按时间排好,才算不忙——排完的顺序跟手机上、跟重建出来的一样。
323
320
  * 收尾期间又有人 steer(busy 还是 true,走不了 prompt),就接着再跑一个回合把它消化掉。
324
321
  */
325
- async runTurn(messages) {
322
+ async runTurn(start) {
326
323
  const agent = this.agent;
327
324
  if (agent === undefined || this._closed)
328
325
  return;
@@ -333,11 +330,11 @@ export class ConversationHandle {
333
330
  const turnStart = agent.state.messages.length;
334
331
  this.writer.replying({ on: true });
335
332
  const startedAt = Date.now();
336
- this.deps.log.info("回合开始", { convoKey: this.deps.key, prompt: messages?.length ?? 0, transcript: turnStart });
333
+ this.deps.log.info("回合开始", { convoKey: this.deps.key, transcript: turnStart });
337
334
  try {
338
- if (messages !== undefined)
339
- await agent.prompt(messages);
340
- this.deps.log.info("prompt 返回", { convoKey: this.deps.key, queued: agent.hasQueuedMessages(), spoke: this.spoke, failed: this.failed });
335
+ if (start !== undefined)
336
+ await start(agent);
337
+ this.deps.log.info("回合第一步返回", { convoKey: this.deps.key, queued: agent.hasQueuedMessages(), spoke: this.spoke, failed: this.failed });
341
338
  while (!this._closed && agent.hasQueuedMessages()) {
342
339
  // pi 在 shouldStopAfterTurn 后不取 steering;若末尾为 toolResult,
343
340
  // continue 只会重跑旧输入。新用户消息必须作为新的 prompt 消费。