@my-life-buddies/buddy-runtime 0.1.0 → 0.3.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 (79) hide show
  1. package/README.md +173 -73
  2. package/dist/conversation/agent.d.ts +16 -2
  3. package/dist/conversation/agent.d.ts.map +1 -1
  4. package/dist/conversation/agent.js +83 -54
  5. package/dist/conversation/agent.js.map +1 -1
  6. package/dist/conversation/agentMessageLLMMessageConverter.d.ts +5 -2
  7. package/dist/conversation/agentMessageLLMMessageConverter.d.ts.map +1 -1
  8. package/dist/conversation/agentMessageLLMMessageConverter.js +33 -33
  9. package/dist/conversation/agentMessageLLMMessageConverter.js.map +1 -1
  10. package/dist/conversation/history.js +1 -1
  11. package/dist/conversation/history.js.map +1 -1
  12. package/dist/conversation/index.d.ts +19 -2
  13. package/dist/conversation/index.d.ts.map +1 -1
  14. package/dist/conversation/index.js +183 -13
  15. package/dist/conversation/index.js.map +1 -1
  16. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts +6 -3
  17. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts.map +1 -1
  18. package/dist/conversation/mlbMessageAgentMessageConverter.js +78 -23
  19. package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -1
  20. package/dist/conversation/readMLBMessages.d.ts +5 -1
  21. package/dist/conversation/readMLBMessages.d.ts.map +1 -1
  22. package/dist/conversation/readMLBMessages.js +24 -10
  23. package/dist/conversation/readMLBMessages.js.map +1 -1
  24. package/dist/conversation/writeMLBMessage.d.ts +3 -1
  25. package/dist/conversation/writeMLBMessage.d.ts.map +1 -1
  26. package/dist/conversation/writeMLBMessage.js +5 -3
  27. package/dist/conversation/writeMLBMessage.js.map +1 -1
  28. package/dist/index.d.ts +6 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/mlbClient.d.ts +1 -128
  33. package/dist/mlbClient.d.ts.map +1 -1
  34. package/dist/mlbClient.js +2 -375
  35. package/dist/mlbClient.js.map +1 -1
  36. package/dist/platform/client.d.ts +48 -0
  37. package/dist/platform/client.d.ts.map +1 -0
  38. package/dist/platform/client.js +24 -0
  39. package/dist/platform/client.js.map +1 -0
  40. package/dist/platform/mlbClient.d.ts +146 -0
  41. package/dist/platform/mlbClient.d.ts.map +1 -0
  42. package/dist/platform/mlbClient.js +476 -0
  43. package/dist/platform/mlbClient.js.map +1 -0
  44. package/dist/platform/widgets.d.ts +75 -0
  45. package/dist/platform/widgets.d.ts.map +1 -0
  46. package/dist/platform/widgets.js +88 -0
  47. package/dist/platform/widgets.js.map +1 -0
  48. package/dist/server.d.ts.map +1 -1
  49. package/dist/server.js +36 -4
  50. package/dist/server.js.map +1 -1
  51. package/dist/tools/dataAccess.d.ts +7 -2
  52. package/dist/tools/dataAccess.d.ts.map +1 -1
  53. package/dist/tools/dataAccess.js +14 -4
  54. package/dist/tools/dataAccess.js.map +1 -1
  55. package/dist/tools/registry.d.ts +6 -0
  56. package/dist/tools/registry.d.ts.map +1 -0
  57. package/dist/tools/registry.js +23 -0
  58. package/dist/tools/registry.js.map +1 -0
  59. package/dist/tools/widgets.d.ts +3 -2
  60. package/dist/tools/widgets.d.ts.map +1 -1
  61. package/dist/tools/widgets.js +22 -53
  62. package/dist/tools/widgets.js.map +1 -1
  63. package/dist/types.d.ts +92 -24
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js +3 -3
  66. package/dist/types.js.map +1 -1
  67. package/package.json +4 -3
  68. package/dist/conversation/convert.d.ts +0 -46
  69. package/dist/conversation/convert.d.ts.map +0 -1
  70. package/dist/conversation/convert.js +0 -297
  71. package/dist/conversation/convert.js.map +0 -1
  72. package/dist/conversation/presence.d.ts +0 -24
  73. package/dist/conversation/presence.d.ts.map +0 -1
  74. package/dist/conversation/presence.js +0 -56
  75. package/dist/conversation/presence.js.map +0 -1
  76. package/dist/conversation/writeBack.d.ts +0 -36
  77. package/dist/conversation/writeBack.d.ts.map +0 -1
  78. package/dist/conversation/writeBack.js +0 -114
  79. package/dist/conversation/writeBack.js.map +0 -1
@@ -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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"}
@@ -1,8 +1,11 @@
1
1
  import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
2
  import type { Message } from "@earendil-works/pi-ai";
3
3
  /**
4
- * note 变 user;相邻两条 user 合并成一条(正文中间隔一个换行);user / assistant / toolResult 原样。
5
- * 返回的是新数组,合并出来的也是新对象,不改传进来的消息。
4
+ * 每条消息正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;note 变 user;一条对一条、按原来的先后,相邻的 user 不合并。
5
+ * 时间统一用 GMT、只看消息自己的 timestamp,同一条消息每次拼出来一字不差,前缀缓存照样命中。
6
+ * 返回的是新数组、新消息,不改传进来的消息。
6
7
  */
7
8
  export declare const agentMessagesToLLMMessages: (messages: AgentMessage[]) => Message[];
9
+ /** 拼在正文开头的时间「[2026-09-10 14:00:30 GMT] 」:timestamp 换成 GMT,精确到秒 */
10
+ export declare function timeMark(timestamp: number): string;
8
11
  //# sourceMappingURL=agentMessageLLMMessageConverter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agentMessageLLMMessageConverter.d.ts","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAgB,OAAO,EAA4B,MAAM,uBAAuB,CAAC;AAE7F;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,YAAY,EAAE,KAAG,OAAO,EAa5E,CAAC"}
1
+ {"version":3,"file":"agentMessageLLMMessageConverter.d.ts","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAkC,OAAO,EAAe,MAAM,uBAAuB,CAAC;AAElG;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,YAAY,EAAE,KAAG,OAAO,EAI1E,CAAC;AAkBJ,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -1,48 +1,48 @@
1
- // AgentMessage → LLMMessage 的换算:交给 pi 的 convertToLlm,每次请求模型前把 Agent 历史(经开发者 transformContext 之后的)换成模型收的消息(pi-ai 的 Message)。
2
- // MLBMessage 与 AgentMessage 之间的换算不在这里,在 mlbMessageAgentMessageConverter.ts
1
+ // AgentMessage → LLMMessage 的换算:交给 pi 的 convertToLlm,每次请求模型前把整段 Agent 历史换成模型收的消息(pi-ai 的 Message)。
2
+ // MLBMessage 与 AgentMessage 之间的换算不在这里,在 mlbMessageAgentMessageConverter.ts;图片块在那一步就定好了,这里原样交出去。
3
3
  /**
4
- * note 变 user;相邻两条 user 合并成一条(正文中间隔一个换行);user / assistant / toolResult 原样。
5
- * 返回的是新数组,合并出来的也是新对象,不改传进来的消息。
4
+ * 每条消息正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;note 变 user;一条对一条、按原来的先后,相邻的 user 不合并。
5
+ * 时间统一用 GMT、只看消息自己的 timestamp,同一条消息每次拼出来一字不差,前缀缓存照样命中。
6
+ * 返回的是新数组、新消息,不改传进来的消息。
6
7
  */
7
- export const agentMessagesToLLMMessages = (messages) => {
8
- const out = [];
9
- for (const m of messages) {
10
- const next = agentMessageToLLMMessage(m);
11
- if (next === undefined)
12
- continue;
13
- const prev = out[out.length - 1];
14
- if (next.role === "user" && prev !== undefined && prev.role === "user") {
15
- out[out.length - 1] = mergeUsers(prev, next);
16
- }
17
- else {
18
- out.push(next);
19
- }
20
- }
21
- return out;
22
- };
8
+ export const agentMessagesToLLMMessages = (messages) => messages.flatMap((m) => {
9
+ const next = agentMessageToLLMMessage(m);
10
+ return next === undefined ? [] : [next];
11
+ });
23
12
  /** 一条 AgentMessage 到模型那边是什么:note 变 user;pi harness 自己并进来的那几种 role(bashExecution / custom / …)这个运行时不产生,照 pi 默认 convertToLlm 的做法不给模型 */
24
13
  function agentMessageToLLMMessage(m) {
25
14
  switch (m.role) {
26
15
  case "note":
27
- return { role: "user", content: [{ type: "text", text: m.text }], timestamp: m.timestamp };
16
+ return { role: "user", content: [{ type: "text", text: timeMark(m.timestamp) + m.text }], timestamp: m.timestamp };
28
17
  case "user":
29
- case "assistant":
18
+ return { ...m, content: typeof m.content === "string" ? timeMark(m.timestamp) + m.content : withTimeMark(m.content, m.timestamp) };
30
19
  case "toolResult":
31
- return m;
20
+ return { ...m, content: withTimeMark(m.content, m.timestamp) };
21
+ case "assistant":
22
+ return { ...m, content: assistantWithTimeMark(m.content, m.timestamp) };
32
23
  default:
33
24
  return undefined;
34
25
  }
35
26
  }
36
- function mergeUsers(a, b) {
37
- const blocks = [...userBlocks(a), ...userBlocks(b)];
38
- const text = blocks
39
- .filter((block) => block.type === "text")
40
- .map((block) => block.text)
41
- .join("\n");
42
- const images = blocks.filter((block) => block.type === "image");
43
- return { role: "user", content: [{ type: "text", text }, ...images], timestamp: a.timestamp };
27
+ /** 拼在正文开头的时间「[2026-09-10 14:00:30 GMT] 」:timestamp 换成 GMT,精确到秒 */
28
+ export function timeMark(timestamp) {
29
+ return `[${new Date(timestamp).toISOString().slice(0, 19).replace("T", " ")} GMT] `;
44
30
  }
45
- function userBlocks(m) {
46
- return typeof m.content === "string" ? [{ type: "text", text: m.content }] : m.content;
31
+ /** 第一块是文字就拼在它开头;不是文字(比如先是图片)就在最前面插一块只写时间的文字 */
32
+ function withTimeMark(content, timestamp) {
33
+ const [first, ...rest] = content;
34
+ if (first?.type === "text")
35
+ return [{ ...first, text: timeMark(timestamp) + first.text }, ...rest];
36
+ return [{ type: "text", text: timeMark(timestamp).trimEnd() }, ...content];
37
+ }
38
+ /** assistant 拼在第一块文字开头;只调工具、没说话的,在 thinking 之后、工具调用之前插一块只写时间的文字 */
39
+ function assistantWithTimeMark(content, timestamp) {
40
+ const textAt = content.findIndex((block) => block.type === "text");
41
+ if (textAt !== -1) {
42
+ return content.map((block, i) => (i === textAt && block.type === "text" ? { ...block, text: timeMark(timestamp) + block.text } : block));
43
+ }
44
+ const mark = { type: "text", text: timeMark(timestamp).trimEnd() };
45
+ const at = content.findIndex((block) => block.type !== "thinking");
46
+ return at === -1 ? [...content, mark] : [...content.slice(0, at), mark, ...content.slice(at)];
47
47
  }
48
48
  //# sourceMappingURL=agentMessageLLMMessageConverter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agentMessageLLMMessageConverter.js","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAAA,4HAA4H;AAC5H,4EAA4E;AAK5E;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAa,EAAE;IACjF,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxE,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,sIAAsI;AACtI,SAAS,wBAAwB,CAAC,CAAe;IAChD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,MAAM;YACV,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QAC5F,KAAK,MAAM,CAAC;QACZ,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY;YAChB,OAAO,CAAC,CAAC;QACV;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,CAAc,EAAE,CAAc;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM;SACjB,MAAM,CAAC,CAAC,KAAK,EAAwB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SAC9D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAyB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACvF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AAC/F,CAAC;AAED,SAAS,UAAU,CAAC,CAAc;IACjC,OAAO,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"agentMessageLLMMessageConverter.js","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ export function splitForRebuild(records) {
14
14
  }
15
15
  /** 对方的记录里要处理的:不是搭子写的,有正文或是转发卡 */
16
16
  export function theirsOf(records) {
17
- return records.filter((m) => m.author !== "buddy" && ((m.text ?? "") !== "" || m.messagesCard !== undefined));
17
+ return records.filter((m) => m.author !== "buddy" && ((m.text ?? "") !== "" || m.messagesCard !== undefined || (m.type === "image" && !!m.image?.mediaId)));
18
18
  }
19
19
  /**
20
20
  * 要不要开口:其中有一条是用户说的、平台标了该答。平台写的(context、system)从不该答;
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/conversation/history.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8CAA8C;AAC9C,2GAA2G;AAI3G;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAqB;IACpD,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;QAAE,IAAI,EAAE,CAAC;IAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,QAAQ,CAAC,OAAqB;IAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC;AAC/G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC/C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AAClI,CAAC"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/conversation/history.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8CAA8C;AAC9C,2GAA2G;AAI3G;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAqB;IACpD,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;QAAE,IAAI,EAAE,CAAC;IAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,QAAQ,CAAC,OAAqB;IAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC7J,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC/C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AAClI,CAAC"}
@@ -2,8 +2,10 @@ import type { AgentMessage, StreamFn } from "@earendil-works/pi-agent-core";
2
2
  import type { Api, Model } from "@earendil-works/pi-ai";
3
3
  import type { MLBClient, WidgetType } from "../mlbClient.ts";
4
4
  import type { Resource } from "../tools/resource.ts";
5
- import type { BuddyFactory, BuddyLogger, DataRequirement } from "../types.ts";
5
+ import type { BuddyFactory, BuddyLogger, DataRequirement, ProactiveDecision, ProactiveRun } from "../types.ts";
6
6
  export interface ConversationHandleDeps {
7
+ welcome?: string;
8
+ errorReply?: string;
7
9
  /** 平台会话键:p_ 私聊、g_ 群 */
8
10
  key: string;
9
11
  buddyId: string;
@@ -24,8 +26,14 @@ export interface ConversationHandleDeps {
24
26
  onStartFailed: () => void;
25
27
  }
26
28
  export declare class ConversationHandle {
29
+ private readonly lifetime;
30
+ private welcomeRequested;
31
+ private steered;
32
+ private policyStopped;
27
33
  private readonly deps;
28
34
  private readonly identity;
35
+ /** 模型收不收图片:一个进程只用一个模型,换算平台记录时按它决定图片块还是固定文字 */
36
+ private readonly imageInput;
29
37
  private readonly reader;
30
38
  private readonly writer;
31
39
  /** 懒建:第一次拉到消息时跑 factory 再 new */
@@ -35,6 +43,8 @@ export declare class ConversationHandle {
35
43
  private rebuilt;
36
44
  /** 忙时听见的、不用开口的旁听消息,回合收尾再进历史 */
37
45
  private heard;
46
+ /** 最近一条该答的对方消息的平台 id:兜底回复的幂等键用它,同一句话只兜一次底 */
47
+ private replyTo;
38
48
  /** 当前回合的 promise,close 要等它 */
39
49
  private turn;
40
50
  /** 本回合有没有一条 assistant 消息带非空正文且正常收尾 */
@@ -44,6 +54,11 @@ export declare class ConversationHandle {
44
54
  private _busy;
45
55
  private _closed;
46
56
  private _lastActivity;
57
+ /** Proactive 只生成候选结果,不走普通回合的 delta/replying/消息写回。 */
58
+ private proactiveRun;
59
+ private proactiveTask;
60
+ private deferredDuringProactive;
61
+ private proactiveReadTools;
47
62
  constructor(deps: ConversationHandleDeps);
48
63
  /** 正在跑回合(含收尾:等发平台的队列清空) */
49
64
  get busy(): boolean;
@@ -54,7 +69,9 @@ export declare class ConversationHandle {
54
69
  /** 测试探针:Agent 当前的历史;还没建 Agent 时是空数组 */
55
70
  get transcript(): readonly AgentMessage[];
56
71
  /** SSE message 到了:让 reader 拉一次。已退役的直接忽略 */
57
- notify(): void;
72
+ notify(welcome?: boolean): void;
73
+ runProactive(run: ProactiveRun): Promise<ProactiveDecision>;
74
+ private executeProactive;
58
75
  /**
59
76
  * SSE delete 到了(或 server 空闲淘汰、stop、会话起不来):先标退役,再打断正在跑的回合,等回合收尾。可以重复调。
60
77
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAqB,YAAY,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC/F,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,EAA2B,MAAM,aAAa,CAAC;AAMvG,MAAM,WAAW,sBAAsB;IACtC,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,yCAAyC;IACzC,WAAW,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzC,+DAA+D;IAC/D,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACnD,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,WAAW,CAAC;IACjB,uDAAuD;IACvD,aAAa,EAAE,MAAM,IAAI,CAAC;CAC1B;AAKD,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,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,8BAA8B;IAC9B,OAAO,CAAC,IAAI,CAA4B;IACxC,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAS;IACtB,iFAAiF;IACjF,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAc;gBAEvB,IAAI,EAAE,sBAAsB;IAkBxC,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,2CAA2C;IAC3C,MAAM,IAAI,IAAI;IAMd;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,yDAAyD;IACzD,OAAO,CAAC,MAAM;IAQd;;;OAGG;YACW,UAAU;IAgBxB;;;OAGG;YACW,OAAO;IAgBrB,mDAAmD;IACnD,OAAO,CAAC,MAAM;IAMd;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAiBb;;;;;;OAMG;YACW,OAAO;IA+CrB;;;OAGG;IACH,OAAO,CAAC,OAAO;CAqEf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"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"}
@@ -18,8 +18,14 @@ import { WriteMLBMessage } from "./writeMLBMessage.js";
18
18
  /** 回合跑完一句话都没说时,以 note 的身份补给模型的一句提醒 */
19
19
  const NUDGE = "你上一条回复正文是空的。把要说的话直接说出来。";
20
20
  export class ConversationHandle {
21
+ lifetime = new AbortController();
22
+ welcomeRequested = false;
23
+ steered = [];
24
+ policyStopped = false;
21
25
  deps;
22
26
  identity;
27
+ /** 模型收不收图片:一个进程只用一个模型,换算平台记录时按它决定图片块还是固定文字 */
28
+ imageInput;
23
29
  reader;
24
30
  writer;
25
31
  /** 懒建:第一次拉到消息时跑 factory 再 new */
@@ -29,6 +35,8 @@ export class ConversationHandle {
29
35
  rebuilt = false;
30
36
  /** 忙时听见的、不用开口的旁听消息,回合收尾再进历史 */
31
37
  heard = [];
38
+ /** 最近一条该答的对方消息的平台 id:兜底回复的幂等键用它,同一句话只兜一次底 */
39
+ replyTo = "";
32
40
  /** 当前回合的 promise,close 要等它 */
33
41
  turn;
34
42
  /** 本回合有没有一条 assistant 消息带非空正文且正常收尾 */
@@ -38,9 +46,15 @@ export class ConversationHandle {
38
46
  _busy = false;
39
47
  _closed = false;
40
48
  _lastActivity = Date.now();
49
+ /** Proactive 只生成候选结果,不走普通回合的 delta/replying/消息写回。 */
50
+ proactiveRun = false;
51
+ proactiveTask;
52
+ deferredDuringProactive = [];
53
+ proactiveReadTools = [];
41
54
  constructor(deps) {
42
55
  this.deps = deps;
43
56
  this.identity = modelIdentity(deps.model);
57
+ this.imageInput = deps.model.input.includes("image");
44
58
  this.reader = new ReadMLBMessages({
45
59
  client: deps.client,
46
60
  key: deps.key,
@@ -72,12 +86,110 @@ export class ConversationHandle {
72
86
  return this.agent?.state.messages ?? [];
73
87
  }
74
88
  /** SSE message 到了:让 reader 拉一次。已退役的直接忽略 */
75
- notify() {
89
+ notify(welcome = false) {
76
90
  if (this._closed)
77
91
  return;
92
+ this.welcomeRequested ||= welcome;
78
93
  this._lastActivity = Date.now();
79
94
  this.reader.notify();
80
95
  }
96
+ runProactive(run) {
97
+ if (this.proactiveTask || this._busy)
98
+ return Promise.resolve({ action: "skip", reasonCode: "user_recently_active" });
99
+ const task = this.executeProactive(run);
100
+ this.proactiveTask = task;
101
+ void task.finally(() => { if (this.proactiveTask === task)
102
+ this.proactiveTask = undefined; }).catch(() => { });
103
+ return task;
104
+ }
105
+ async executeProactive(run) {
106
+ if (run.sessionId !== this.deps.key)
107
+ return { action: "skip", reasonCode: "not_appropriate" };
108
+ if (!await this.reader.sync())
109
+ return { action: "skip", reasonCode: "insufficient_data" };
110
+ if (this._closed)
111
+ return { action: "skip", reasonCode: "not_appropriate" };
112
+ if (this._busy)
113
+ return { action: "skip", reasonCode: "user_recently_active" };
114
+ if (this.agent === undefined)
115
+ return { action: "skip", reasonCode: "insufficient_data" };
116
+ const agent = this.agent;
117
+ const tracker = this.dataAccessUsage;
118
+ if (!agent || !tracker)
119
+ return { action: "skip", reasonCode: "insufficient_data" };
120
+ const before = agent.state.messages.length;
121
+ const originalTools = agent.state.tools;
122
+ const originalSystemPrompt = agent.state.systemPrompt;
123
+ // Only runtime-owned reads are allowed. Custom tools may have side effects
124
+ // even when named like a read, so they are not implicitly trusted.
125
+ agent.state.tools = this.proactiveReadTools;
126
+ this._busy = true;
127
+ this.proactiveRun = true;
128
+ this.spoke = false;
129
+ this.failed = false;
130
+ this.policyStopped = false;
131
+ this._lastActivity = Date.now();
132
+ const prompt = {
133
+ role: "note",
134
+ timestamp: run.worldNow,
135
+ text: "这是一次平台允许的主动服务判断,不是用户发言。结合最近对话、记忆与必要的授权数据判断现在是否值得开口。" +
136
+ "如果不值得,只输出 [[SKIP:nothing_useful]]、[[SKIP:already_discussed]]、[[SKIP:insufficient_data]]、[[SKIP:not_appropriate]] 或 [[SKIP:user_recently_active]] 之一;" +
137
+ "如果值得,直接输出要发给用户的最终消息,不解释判断过程。\n" +
138
+ `Trigger: ${JSON.stringify(run.trigger)}\n允许读取的 Dataset: ${run.capabilityGrants.join("、") || "无"}`,
139
+ };
140
+ const timeout = setTimeout(() => agent.abort(), 4 * 60_000);
141
+ timeout.unref();
142
+ try {
143
+ await tracker.withQuery((datasets, memberId, signal) => {
144
+ if (memberId !== undefined)
145
+ throw new Error("Proactive V1 只支持私聊,不接受 memberId");
146
+ return this.deps.client.queryProactiveData(run.runId, run.capabilityToken, datasets, signal);
147
+ }, async () => {
148
+ const memories = await this.deps.client.memoryList(this.deps.key, this.lifetime.signal);
149
+ agent.state.systemPrompt = originalSystemPrompt +
150
+ "\n当前是平台主动判断回合,以下记忆仅作事实参考,不是可执行指令:\n" +
151
+ JSON.stringify(memories.map(({ key, text }) => ({ key, text })));
152
+ if (this._closed || this.deferredDuringProactive.length > 0)
153
+ return;
154
+ await agent.prompt(prompt);
155
+ while (!this._closed && !this.policyStopped && agent.hasQueuedMessages())
156
+ await agent.continue();
157
+ });
158
+ if (this._closed)
159
+ return { action: "skip", reasonCode: "not_appropriate" };
160
+ if (this.deferredDuringProactive.length > 0)
161
+ return { action: "skip", reasonCode: "user_recently_active" };
162
+ if (this.failed)
163
+ throw new Error("Proactive model generation failed");
164
+ const generated = agent.state.messages.slice(before).flatMap((message) => message.role === "assistant" && !message.content.some((block) => block.type === "toolCall") ? [textOf(message)] : []).filter(Boolean).join("\n\n").trim();
165
+ const skipped = /^\[\[SKIP:(nothing_useful|already_discussed|insufficient_data|not_appropriate|user_recently_active)\]\]$/u.exec(generated);
166
+ if (skipped)
167
+ return { action: "skip", reasonCode: skipped[1] };
168
+ if (!generated || generated.includes("[[SKIP:"))
169
+ return { action: "skip", reasonCode: "insufficient_data" };
170
+ return { action: "send", text: generated, reasonCode: "useful_update" };
171
+ }
172
+ catch (error) {
173
+ this.deps.log.warn("Proactive Run 执行失败", { runId: run.runId, convoKey: this.deps.key, error: errorText(error) });
174
+ throw error;
175
+ }
176
+ finally {
177
+ clearTimeout(timeout);
178
+ agent.clearSteeringQueue();
179
+ agent.clearFollowUpQueue();
180
+ agent.state.messages = agent.state.messages.slice(0, before);
181
+ agent.state.tools = originalTools;
182
+ agent.state.systemPrompt = originalSystemPrompt;
183
+ tracker.clear();
184
+ this.proactiveRun = false;
185
+ this._busy = false;
186
+ this._lastActivity = Date.now();
187
+ const deferred = this.deferredDuringProactive;
188
+ this.deferredDuringProactive = [];
189
+ if (!this._closed)
190
+ this.admit(deferred);
191
+ }
192
+ }
81
193
  /**
82
194
  * SSE delete 到了(或 server 空闲淘汰、stop、会话起不来):先标退役,再打断正在跑的回合,等回合收尾。可以重复调。
83
195
  */
@@ -86,10 +198,12 @@ export class ConversationHandle {
86
198
  if (this._busy)
87
199
  this.agent?.abort();
88
200
  await this.turn;
201
+ await this.proactiveTask?.catch(() => { });
89
202
  }
90
203
  /** 标退役:不再拉、取消拉取重试;发平台的队列丢掉没发的字与写回、打断重发等待(回合收尾才不会被它拖住) */
91
204
  retire() {
92
205
  this._closed = true;
206
+ this.lifetime.abort();
93
207
  this.reader.close();
94
208
  this.writer.close();
95
209
  }
@@ -105,11 +219,25 @@ export class ConversationHandle {
105
219
  this.ingest(messages);
106
220
  return;
107
221
  }
222
+ // 首次拉到空的先不建会话,等下一次通知再拉:空数组的 every 为真,不拦会被当成只有场合记录的新会话误发问候
223
+ if (!messages.length)
224
+ return;
108
225
  try {
226
+ if (this.welcomeRequested) {
227
+ this.welcomeRequested = false;
228
+ if (this.deps.welcome && messages.every(m => m.type === "context" && m.author === "platform")) {
229
+ this.writer.enqueueMessage({ type: "message", text: this.deps.welcome, idempotencyKey: `welcome:${this.deps.key}` });
230
+ await this.writer.flush();
231
+ if (!this._closed) {
232
+ this.reader.resetCursor();
233
+ this.reader.notify();
234
+ }
235
+ return;
236
+ }
237
+ }
109
238
  await this.rebuild(messages);
110
239
  }
111
240
  catch (e) {
112
- // factory 抛错、工具重名之类:这场会话起不来。退役并让 server 删掉,下一条消息会重新起一场再试
113
241
  this.deps.log.error("起会话失败", { convoKey: this.deps.key, error: errorText(e) });
114
242
  this.retire();
115
243
  this.deps.onStartFailed();
@@ -122,6 +250,9 @@ export class ConversationHandle {
122
250
  async rebuild(records) {
123
251
  const created = await createAgent({
124
252
  ...this.deps,
253
+ signal: this.lifetime.signal,
254
+ enqueueMessage: message => this.writer.enqueueMessage(message),
255
+ onPolicyStop: () => { this.policyStopped = true; },
125
256
  onEvent: (a, event) => this.onEvent(a, event),
126
257
  });
127
258
  if (this._closed)
@@ -129,8 +260,9 @@ export class ConversationHandle {
129
260
  const agent = created.agent;
130
261
  this.agent = agent;
131
262
  this.dataAccessUsage = created.dataAccessUsage;
263
+ this.proactiveReadTools = created.proactiveReadTools;
132
264
  const { history, pending } = splitForRebuild(records);
133
- agent.state.messages = mlbMessagesToAgentMessages(history, this.identity);
265
+ agent.state.messages = mlbMessagesToAgentMessages(history, this.identity, this.imageInput);
134
266
  this.rebuilt = true;
135
267
  this.deps.log.info("历史已重建", { convoKey: this.deps.key, records: history.length, pending: pending.length, transcript: agent.state.messages.length });
136
268
  this.admit(theirsOf(pending));
@@ -140,6 +272,14 @@ export class ConversationHandle {
140
272
  if (this.agent === undefined || this._closed || batch.length === 0)
141
273
  return;
142
274
  this._lastActivity = Date.now();
275
+ // Proactive results are written by the platform, not by this Agent.
276
+ // Pull the committed checkin back into the next ordinary turn's context.
277
+ const checkins = batch.filter((record) => record.author === "buddy" && record.type === "checkin");
278
+ const external = mlbMessagesToAgentMessages(checkins, this.identity, this.imageInput);
279
+ if (this._busy)
280
+ this.heard.push(...external);
281
+ else
282
+ this.agent.state.messages.push(...external);
143
283
  this.admit(theirsOf(batch));
144
284
  }
145
285
  /**
@@ -151,10 +291,17 @@ export class ConversationHandle {
151
291
  const agent = this.agent;
152
292
  if (agent === undefined || this._closed || theirs.length === 0)
153
293
  return;
154
- const messages = mlbMessagesToAgentMessages(theirs, this.identity);
294
+ const messages = mlbMessagesToAgentMessages(theirs, this.identity, this.imageInput);
155
295
  if (messages.length === 0)
156
296
  return;
157
297
  const shouldReply = wantsReply(theirs);
298
+ if (shouldReply)
299
+ this.replyTo = theirs.filter((m) => m.author === "user").at(-1)?.id ?? this.replyTo;
300
+ if (this.proactiveRun) {
301
+ this.deferredDuringProactive.push(...theirs);
302
+ agent.abort();
303
+ return;
304
+ }
158
305
  if (!this._busy) {
159
306
  if (shouldReply)
160
307
  this.turn = this.runTurn(messages);
@@ -163,8 +310,10 @@ export class ConversationHandle {
163
310
  return;
164
311
  }
165
312
  if (shouldReply)
166
- for (const m of messages)
313
+ for (const m of messages) {
314
+ this.steered.push(m);
167
315
  agent.steer(m);
316
+ }
168
317
  else
169
318
  this.heard.push(...messages);
170
319
  }
@@ -181,6 +330,7 @@ export class ConversationHandle {
181
330
  if (agent === undefined || this._closed)
182
331
  return;
183
332
  this._busy = true;
333
+ this.policyStopped = false;
184
334
  this.spoke = false;
185
335
  this.failed = false;
186
336
  const turnStart = agent.state.messages.length;
@@ -191,10 +341,24 @@ export class ConversationHandle {
191
341
  if (messages !== undefined)
192
342
  await agent.prompt(messages);
193
343
  this.deps.log.info("prompt 返回", { convoKey: this.deps.key, queued: agent.hasQueuedMessages(), spoke: this.spoke, failed: this.failed });
194
- while (!this._closed && agent.hasQueuedMessages())
195
- await agent.continue();
344
+ while (!this._closed && agent.hasQueuedMessages()) {
345
+ // pi 在 shouldStopAfterTurn 后不取 steering;若末尾为 toolResult,
346
+ // continue 只会重跑旧输入。新用户消息必须作为新的 prompt 消费。
347
+ const queued = this.steered.splice(0);
348
+ if (queued.length) {
349
+ agent.clearSteeringQueue();
350
+ this.policyStopped = false;
351
+ await agent.prompt(queued);
352
+ }
353
+ else if (this.policyStopped) {
354
+ agent.clearFollowUpQueue();
355
+ break;
356
+ }
357
+ else
358
+ await agent.continue();
359
+ }
196
360
  // 正常收尾却一句正文没有才补;出错 / 被掐断的不补
197
- if (!this._closed && !this.spoke && !this.failed) {
361
+ if (!this._closed && !this.spoke && !this.failed && !this.policyStopped) {
198
362
  this.deps.log.info("空回复,补一句", { convoKey: this.deps.key });
199
363
  const nudge = { role: "note", text: NUDGE, timestamp: Date.now() };
200
364
  agent.followUp(nudge);
@@ -202,9 +366,13 @@ export class ConversationHandle {
202
366
  }
203
367
  }
204
368
  catch (e) {
369
+ this.failed = true;
205
370
  this.deps.log.warn("回合出错", { convoKey: this.deps.key, error: errorText(e) });
206
371
  }
207
372
  finally {
373
+ if (!this._closed && this.deps.errorReply && (this.failed || !this.spoke)) {
374
+ this.writer.enqueueMessage({ type: "message", text: this.deps.errorReply, idempotencyKey: `fallback:${this.deps.key}:${this.replyTo}` });
375
+ }
208
376
  this.writer.replying({ on: false });
209
377
  await this.writer.flush();
210
378
  if (this.heard.length > 0) {
@@ -257,6 +425,7 @@ export class ConversationHandle {
257
425
  break;
258
426
  case "message_end": {
259
427
  const m = event.message;
428
+ this.steered = this.steered.filter(queued => queued !== m);
260
429
  if (m.role === "assistant") {
261
430
  this.deps.log.info("assistant 一段", {
262
431
  convoKey: this.deps.key,
@@ -270,28 +439,29 @@ export class ConversationHandle {
270
439
  else if (textOf(m) !== "")
271
440
  this.spoke = true;
272
441
  // 带工具调用的等 turn_end 连结果一起写成 tool 记录
273
- if (!m.content.some((block) => block.type === "toolCall"))
442
+ if (!this.proactiveRun && !m.content.some((block) => block.type === "toolCall"))
274
443
  this.writer.assistant(m, this.dataAccessUsage?.hasUsage());
275
444
  }
276
445
  else if (m.role === "note") {
277
- this.writer.note(m);
446
+ if (!this.proactiveRun)
447
+ this.writer.note(m);
278
448
  }
279
449
  break;
280
450
  }
281
451
  case "turn_end": {
282
452
  const m = event.message;
283
- if (m.role === "assistant" && m.content.some((block) => block.type === "toolCall")) {
453
+ if (!this.proactiveRun && m.role === "assistant" && m.content.some((block) => block.type === "toolCall")) {
284
454
  this.writer.toolStep(m, event.toolResults, agent.state.tools, (toolCallId) => this.dataAccessUsage?.details(toolCallId), this.dataAccessUsage?.hasUsage());
285
455
  }
286
456
  break;
287
457
  }
288
458
  case "message_update":
289
- if (event.assistantMessageEvent.type === "text_delta")
459
+ if (!this.proactiveRun && event.assistantMessageEvent.type === "text_delta")
290
460
  this.writer.delta(event.assistantMessageEvent.delta);
291
461
  break;
292
462
  case "tool_execution_start": {
293
463
  const label = agent.state.tools.find((t) => t.name === event.toolName)?.label;
294
- if (label)
464
+ if (!this.proactiveRun && label)
295
465
  this.writer.replying({ on: true, status: label });
296
466
  break;
297
467
  }