@my-life-buddies/buddy-runtime 0.4.1 → 0.5.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 (43) hide show
  1. package/README.md +3 -3
  2. package/dist/conversation/agent.d.ts +3 -3
  3. package/dist/conversation/agent.d.ts.map +1 -1
  4. package/dist/conversation/agent.js +9 -15
  5. package/dist/conversation/agent.js.map +1 -1
  6. package/dist/conversation/agentMessageLLMMessageConverter.d.ts +3 -2
  7. package/dist/conversation/agentMessageLLMMessageConverter.d.ts.map +1 -1
  8. package/dist/conversation/agentMessageLLMMessageConverter.js +15 -6
  9. package/dist/conversation/agentMessageLLMMessageConverter.js.map +1 -1
  10. package/dist/conversation/compaction.d.ts +73 -0
  11. package/dist/conversation/compaction.d.ts.map +1 -0
  12. package/dist/conversation/compaction.js +178 -0
  13. package/dist/conversation/compaction.js.map +1 -0
  14. package/dist/conversation/history.d.ts +14 -0
  15. package/dist/conversation/history.d.ts.map +1 -1
  16. package/dist/conversation/history.js +24 -1
  17. package/dist/conversation/history.js.map +1 -1
  18. package/dist/conversation/index.d.ts +8 -2
  19. package/dist/conversation/index.d.ts.map +1 -1
  20. package/dist/conversation/index.js +32 -16
  21. package/dist/conversation/index.js.map +1 -1
  22. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts +17 -8
  23. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts.map +1 -1
  24. package/dist/conversation/mlbMessageAgentMessageConverter.js +36 -24
  25. package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -1
  26. package/dist/conversation/readMLBMessages.d.ts +8 -1
  27. package/dist/conversation/readMLBMessages.d.ts.map +1 -1
  28. package/dist/conversation/readMLBMessages.js +55 -9
  29. package/dist/conversation/readMLBMessages.js.map +1 -1
  30. package/dist/conversation/writeMLBMessage.d.ts +3 -5
  31. package/dist/conversation/writeMLBMessage.d.ts.map +1 -1
  32. package/dist/conversation/writeMLBMessage.js +3 -7
  33. package/dist/conversation/writeMLBMessage.js.map +1 -1
  34. package/dist/platform/mlbClient.d.ts +5 -0
  35. package/dist/platform/mlbClient.d.ts.map +1 -1
  36. package/dist/platform/mlbClient.js +13 -0
  37. package/dist/platform/mlbClient.js.map +1 -1
  38. package/dist/server.d.ts.map +1 -1
  39. package/dist/server.js +26 -4
  40. package/dist/server.js.map +1 -1
  41. package/dist/types.d.ts +7 -16
  42. package/dist/types.d.ts.map +1 -1
  43. package/package.json +1 -1
package/README.md CHANGED
@@ -91,6 +91,8 @@ await BuddyServer.start({
91
91
 
92
92
  `buddy` 在每场会话收到第一条消息时调用一次。会话空闲 30 分钟被回收、或进程重启后,下一条消息会重新调用,所以闭包里的变量不能当长期存储,要记住的东西写进记忆(3.2)。
93
93
 
94
+ 会话历史长到一定程度(超过 128K token,窗口小的模型按窗口的四分之一算)时,运行时在会话被回收后把早先的对话压成一份摘要写回平台,下次重建时模型看到的是「摘要 + 最近的原文」。开发者不用做任何事,也没有开关。
95
+
94
96
  ### 2.2 `BuddyOptions`
95
97
 
96
98
  `buddy` 的返回值。字段名和签名取自 pi-agent-core 的 `AgentOptions` / `AgentState`,详见 pi 的文档。
@@ -443,7 +445,7 @@ await conversation.proactive.propose({
443
445
 
444
446
  **消息**:这场会话的完整历史,按时间先后排列。一轮回复里模型可能请求多次,比如调完工具接着说,每次都带上当时的完整历史。
445
447
 
446
- - 用户消息、工具结果、运行时提醒的开头带 GMT 时间,如「[2026-09-10 14:00:30 GMT] 」;搭子自己说的话不带。
448
+ - 用户消息、工具结果的开头带 GMT 时间,如「[2026-09-10 14:00:30 GMT] 」;搭子自己说的话不带。
447
449
  - 历史末尾多一条「现在的时间(平台附注,不是谁说的话)」,时间是请求时刻,只在这一次请求里。
448
450
  - 群聊里成员说的话开头标「[名字 #m_…] 」。
449
451
  - 平台交代的情况(比如这场会话里已有哪些小挂件)是一条以「平台交代的情况:」开头的消息,情况有变化才追加新的一份。
@@ -456,5 +458,3 @@ await conversation.proactive.propose({
456
458
  - 平台在上传时统一处理成 JPEG,最长边不超过 2048 px、不超过 5 MiB。
457
459
  - 图片消息是一条 user 消息:先是「[图片 #消息 id]」和用户配的文字,再跟图片本身;聊天记录卡里的图跟在所在条目的正文后面。
458
460
  - 图片读不到时换成「[图片无法读取]」;`model` 不支持看图时换成「[图片:当前模型不支持看图]」。
459
-
460
- 在钩子里读会话历史时,除了 pi 的 `user` / `assistant` / `toolResult`,还会遇到 `role` 为 `note` 的消息:运行时补给模型的提醒,比如一轮回复没说出话时的提示,发给模型时换成 user 消息。
@@ -32,12 +32,12 @@ export interface CreatedAgent {
32
32
  }
33
33
  export declare function createAgent(deps: AgentDeps): Promise<CreatedAgent>;
34
34
  /**
35
- * 每次请求模型时接在历史末尾那条 note 的正文;现在的时间由 convertToLlm 按这条 note 的 timestamp 拼在开头。
35
+ * 每次请求模型时接在历史末尾那条 user 消息的正文;现在的时间由 convertToLlm 按这条消息的 timestamp 拼在开头。
36
36
  * 方括号时间怎么读、回复里别写,交代在平台的 system prompt 里(my-life-buddies-server 的 src/messages/systemPrompt.ts),
37
37
  * 那边按「现在的时间」这几个字指认这条;改这里的正文或时间格式,那边一起改。
38
38
  */
39
- export declare const CURRENT_TIME_NOTE = "\u73B0\u5728\u7684\u65F6\u95F4\uFF08\u5E73\u53F0\u9644\u6CE8\uFF0C\u4E0D\u662F\u8C01\u8BF4\u7684\u8BDD\uFF09";
40
- /** 历史副本:末尾接一条 now 时刻的 note,传进来的数组不改 */
39
+ export declare const CURRENT_TIME_TEXT = "\u73B0\u5728\u7684\u65F6\u95F4\uFF08\u5E73\u53F0\u9644\u6CE8\uFF0C\u4E0D\u662F\u8C01\u8BF4\u7684\u8BDD\uFF09";
40
+ /** 历史副本:末尾接一条 now 时刻、正文是 CURRENT_TIME_TEXT 的 user 消息,传进来的数组不改 */
41
41
  export declare function withCurrentTime(messages: AgentMessage[], now: number): AgentMessage[];
42
42
  /** 打日志用的副本:图片块的 data、请求体里 base64 的 data URL 换成字节数,其余原样 */
43
43
  export declare function withoutImageData(value: unknown): unknown;
@@ -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,WAAW,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzC,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,CAyIxE;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,iHAAuB,CAAC;AAEtD,uCAAuC;AACvC,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;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,WAAW,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzC,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,CAuIxE;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"}
@@ -4,8 +4,8 @@
4
4
  // 显式选中的平台工具排在开发者工具前面并查重名;选择 resource_read 时才追加资料清单;
5
5
  // 开发者显式设的 thinkingLevel 这个模型不支持时打一条 warn,写明支持哪几档、实际会怎么发;
6
6
  // 钩子叠加——开发者的 beforeToolCall 包 try/catch 抛了按放行;其余直通;
7
- // transformContext 由运行时自己装、不开放给开发者:每次请求模型在历史末尾接一条写当前时间的 note,不进会话历史;
8
- // 普通回合沿用模型输入日志,图片换成字节数;主动回合只记规模,临时 Trigger、Memory 和查询结果不入日志。
7
+ // transformContext 由运行时自己装、不开放给开发者:每次请求模型在历史末尾接一条写当前时间的 user 消息,不进会话历史;
8
+ // 每回合的模型输入和请求体全量打日志,主动回合也一样,图片换成字节数。
9
9
  // 不管:Agent 建好之后的事(回合、事件分发在 index.ts)。
10
10
  import { Agent } from "@earendil-works/pi-agent-core";
11
11
  import { clampThinkingLevel, getSupportedThinkingLevels } from "@earendil-works/pi-ai";
@@ -107,23 +107,17 @@ export async function createAgent(deps) {
107
107
  },
108
108
  steeringMode: "all",
109
109
  followUpMode: "all",
110
- // 下面三个钩子按 pi 每次请求模型时的调用顺序排:transformContext → convertToLlm → onPayload;普通回合出参和请求体全量打日志,主动回合只记规模。
110
+ // 下面三个钩子按 pi 每次请求模型时的调用顺序排:transformContext → convertToLlm → onPayload;出参和请求体每回合全量打日志,主动回合也一样。
111
111
  // transformContext 的返回值只交给这一次请求,不写回会话历史;场合交代和图片本来就是历史里的记录,不在这里加
112
112
  transformContext: async (messages) => withCurrentTime(messages, Date.now()),
113
113
  convertToLlm: (messages) => {
114
114
  const llmMessages = agentMessagesToLLMMessages(messages);
115
- if (dataAccessUsage.isProactive())
116
- log.info("Proactive 模型输入已构建", { convoKey: key, messageCount: llmMessages.length });
117
- else
118
- log.info("convertToLlm 出参", { convoKey: key, messages: withoutImageData(llmMessages) });
115
+ log.info("convertToLlm 出参", { convoKey: key, messages: withoutImageData(llmMessages) });
119
116
  return llmMessages;
120
117
  },
121
118
  // 只打日志、返回 undefined:返回别的值 pi-ai 会拿它顶替请求体发出去
122
119
  onPayload: (payload) => {
123
- if (dataAccessUsage.isProactive())
124
- log.info("Proactive 模型请求已构建", { convoKey: key });
125
- else
126
- log.info("模型请求体", { convoKey: key, payload: withoutImageData(payload) });
120
+ log.info("模型请求体", { convoKey: key, payload: withoutImageData(payload) });
127
121
  return undefined;
128
122
  },
129
123
  // 运行时的拦截包在开发者钩子外面:先判这一轮能不能用这个工具,再交给开发者。
@@ -162,14 +156,14 @@ export async function createAgent(deps) {
162
156
  return { agent, dataAccessUsage };
163
157
  }
164
158
  /**
165
- * 每次请求模型时接在历史末尾那条 note 的正文;现在的时间由 convertToLlm 按这条 note 的 timestamp 拼在开头。
159
+ * 每次请求模型时接在历史末尾那条 user 消息的正文;现在的时间由 convertToLlm 按这条消息的 timestamp 拼在开头。
166
160
  * 方括号时间怎么读、回复里别写,交代在平台的 system prompt 里(my-life-buddies-server 的 src/messages/systemPrompt.ts),
167
161
  * 那边按「现在的时间」这几个字指认这条;改这里的正文或时间格式,那边一起改。
168
162
  */
169
- export const CURRENT_TIME_NOTE = "现在的时间(平台附注,不是谁说的话)";
170
- /** 历史副本:末尾接一条 now 时刻的 note,传进来的数组不改 */
163
+ export const CURRENT_TIME_TEXT = "现在的时间(平台附注,不是谁说的话)";
164
+ /** 历史副本:末尾接一条 now 时刻、正文是 CURRENT_TIME_TEXT 的 user 消息,传进来的数组不改 */
171
165
  export function withCurrentTime(messages, now) {
172
- return [...messages, { role: "note", text: CURRENT_TIME_NOTE, timestamp: now }];
166
+ return [...messages, { role: "user", content: [{ type: "text", text: CURRENT_TIME_TEXT }], timestamp: now }];
173
167
  }
174
168
  /** 打日志用的副本:图片块的 data、请求体里 base64 的 data URL 换成字节数,其余原样 */
175
169
  export function withoutImageData(value) {
@@ -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,9 +1,10 @@
1
1
  import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
2
  import type { Message } from "@earendil-works/pi-ai";
3
3
  /**
4
- * user、toolResult、note 的正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;搭子自己说的(assistant)原样不拼,
5
- * 拼了模型会照着历史里自己的样子,在回复开头也写上方括号时间。note user;一条对一条、按原来的先后,相邻的 user 不合并。
4
+ * user、toolResult 的正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;搭子自己说的(assistant)不拼,
5
+ * 拼了模型会照着历史里自己的样子,在回复开头也写上方括号时间。一条对一条、按原来的先后,相邻的 user 不合并。
6
6
  * 时间统一用 GMT、只看消息自己的 timestamp,同一条消息每次拼出来一字不差,前缀缓存照样命中。
7
+ * 说到一半断掉的 assistant 换成只有正文的一条(见 stoppedAssistantToLLMMessage)。
7
8
  * 返回的是新数组,不改传进来的消息。
8
9
  */
9
10
  export declare const agentMessagesToLLMMessages: (messages: AgentMessage[]) => Message[];
@@ -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,EAAe,MAAM,uBAAuB,CAAC;AAEhF;;;;;GAKG;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
+ {"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;AAGlG;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,YAAY,EAAE,KAAG,OAAO,EAI1E,CAAC;AA0BJ,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -1,30 +1,39 @@
1
1
  // AgentMessage → LLMMessage 的换算:交给 pi 的 convertToLlm,每次请求模型前把整段 Agent 历史换成模型收的消息(pi-ai 的 Message)。
2
2
  // MLBMessage 与 AgentMessage 之间的换算不在这里,在 mlbMessageAgentMessageConverter.ts;图片块在那一步就定好了,这里原样交出去。
3
+ import { stoppedByErrorOrAbort } from "./mlbMessageAgentMessageConverter.js";
3
4
  /**
4
- * user、toolResult、note 的正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;搭子自己说的(assistant)原样不拼,
5
- * 拼了模型会照着历史里自己的样子,在回复开头也写上方括号时间。note user;一条对一条、按原来的先后,相邻的 user 不合并。
5
+ * user、toolResult 的正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;搭子自己说的(assistant)不拼,
6
+ * 拼了模型会照着历史里自己的样子,在回复开头也写上方括号时间。一条对一条、按原来的先后,相邻的 user 不合并。
6
7
  * 时间统一用 GMT、只看消息自己的 timestamp,同一条消息每次拼出来一字不差,前缀缓存照样命中。
8
+ * 说到一半断掉的 assistant 换成只有正文的一条(见 stoppedAssistantToLLMMessage)。
7
9
  * 返回的是新数组,不改传进来的消息。
8
10
  */
9
11
  export const agentMessagesToLLMMessages = (messages) => messages.flatMap((m) => {
10
12
  const next = agentMessageToLLMMessage(m);
11
13
  return next === undefined ? [] : [next];
12
14
  });
13
- /** 一条 AgentMessage 到模型那边是什么:note 变 user;assistant 原样;pi harness 自己并进来的那几种 role(bashExecution / custom / …)这个运行时不产生,照 pi 默认 convertToLlm 的做法不给模型 */
15
+ /** 一条 AgentMessage 到模型那边是什么:正常收尾的 assistant 原样;pi harness 自己并进来的那几种 role(bashExecution / custom / …)这个运行时不产生,照 pi 默认 convertToLlm 的做法不给模型 */
14
16
  function agentMessageToLLMMessage(m) {
15
17
  switch (m.role) {
16
- case "note":
17
- return { role: "user", content: [{ type: "text", text: timeMark(m.timestamp) + m.text }], timestamp: m.timestamp };
18
18
  case "user":
19
19
  return { ...m, content: typeof m.content === "string" ? timeMark(m.timestamp) + m.content : withTimeMark(m.content, m.timestamp) };
20
20
  case "toolResult":
21
21
  return { ...m, content: withTimeMark(m.content, m.timestamp) };
22
22
  case "assistant":
23
- return m;
23
+ return stoppedByErrorOrAbort(m) ? stoppedAssistantToLLMMessage(m) : m;
24
24
  default:
25
25
  return undefined;
26
26
  }
27
27
  }
28
+ /**
29
+ * 以 error / aborted 收尾的 assistant(这一步说到一半断了):pi-ai 发请求前会把它整条跳过,模型就不知道用户已经看见了这半句。
30
+ * 换成只留正文、stopReason 为 stop 的一条,跟用户屏上看到的、重建时这条记录还原出来的一样;
31
+ * 心声和没流完的工具调用不给(用户看不见,工具调用的参数也不完整、没有结果);没正文的不给模型
32
+ */
33
+ function stoppedAssistantToLLMMessage(m) {
34
+ const content = m.content.filter((block) => block.type === "text" && block.text !== "");
35
+ return content.length === 0 ? undefined : { ...m, content, stopReason: "stop" };
36
+ }
28
37
  /** 拼在正文开头的时间「[2026-09-10 14:00:30 GMT] 」:timestamp 换成 GMT,精确到秒 */
29
38
  export function timeMark(timestamp) {
30
39
  return `[${new Date(timestamp).toISOString().slice(0, 19).replace("T", " ")} GMT] `;
@@ -1 +1 @@
1
- {"version":3,"file":"agentMessageLLMMessageConverter.js","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,gGAAgG;AAKhG;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAa,EAAE,CACjF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;IACtB,MAAM,IAAI,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEJ,mJAAmJ;AACnJ,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,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QACpH,KAAK,MAAM;YACV,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QACpI,KAAK,YAAY;YAChB,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QAChE,KAAK,WAAW;YACf,OAAO,CAAC,CAAC;QACV;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,QAAQ,CAAC,SAAiB;IACzC,OAAO,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC;AACrF,CAAC;AAED,+CAA+C;AAC/C,SAAS,YAAY,CAAC,OAAuC,EAAE,SAAiB;IAC/E,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;IACjC,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACnG,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;AAC5E,CAAC"}
1
+ {"version":3,"file":"agentMessageLLMMessageConverter.js","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,gGAAgG;AAIhG,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAE7E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAa,EAAE,CACjF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;IACtB,MAAM,IAAI,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEJ,6IAA6I;AAC7I,SAAS,wBAAwB,CAAC,CAAe;IAChD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,MAAM;YACV,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QACpI,KAAK,YAAY;YAChB,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QAChE,KAAK,WAAW;YACf,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,SAAS,4BAA4B,CAAC,CAAmB;IACxD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AACjF,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,QAAQ,CAAC,SAAiB;IACzC,OAAO,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC;AACrF,CAAC;AAED,+CAA+C;AAC/C,SAAS,YAAY,CAAC,OAAuC,EAAE,SAAiB;IAC/E,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;IACjC,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACnG,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,73 @@
1
+ import type { AgentMessage, AgentTool, StreamFn } from "@earendil-works/pi-agent-core";
2
+ import type { Api, Message, Model, ThinkingLevel } from "@earendil-works/pi-ai";
3
+ import type { MLBClient } from "../mlbClient.ts";
4
+ import type { BuddyLogger } from "../types.ts";
5
+ /** 触发线:min(TRIGGER_CAP_TOKENS, 模型窗口 × TRIGGER_WINDOW_RATIO)。1M 窗口是 128K,256K 窗口是 64K:一场从触发线起聊,一晚上也撑不到窗口 */
6
+ export declare const TRIGGER_CAP_TOKENS = 128000;
7
+ export declare const TRIGGER_WINDOW_RATIO = 0.25;
8
+ /** 保留尾部大约多少 token 的原文(最近两三天),再往前的靠摘要 */
9
+ export declare const KEEP_TOKENS = 32000;
10
+ /** 摘要本身的输出上限 */
11
+ export declare const SUMMARY_MAX_TOKENS = 4096;
12
+ /** 摘要记录正文的第一行;平台 system prompt 按这句指认它(my-life-buddies-server 的 src/messages/systemPrompt.ts),改这里那边一起改 */
13
+ export declare const COMPACTION_HEADER = "\u66F4\u65E9\u7684\u5BF9\u8BDD\u5DF2\u538B\u7F29\u6210\u6458\u8981\uFF08\u5E73\u53F0\u9644\u6CE8\uFF0C\u4E0D\u662F\u8C01\u8BF4\u7684\u8BDD\uFF09\uFF1A";
14
+ /** 平台场合交代记录的第一行(my-life-buddies-server 的 contextOf 写的);被盖住那段里最新的一条要原样接在摘要后面 */
15
+ export declare const CONTEXT_HEADER = "\u5E73\u53F0\u4EA4\u4EE3\u7684\u60C5\u51B5\uFF1A";
16
+ /** 接在切点之前那段历史末尾的指令。固定分节,逼模型每次都过一遍每个格子,多轮压缩才不会越压越丢 */
17
+ export declare const SUMMARY_INSTRUCTION: string;
18
+ /** 会话被回收那一刻拍下的快照:摘要请求要跟平时的请求同一前缀,所以 system prompt 与工具清单一起带上 */
19
+ export interface CompactionSnapshot {
20
+ systemPrompt: string;
21
+ tools: AgentTool[];
22
+ messages: AgentMessage[];
23
+ }
24
+ /** 切点算出来的东西:切点之前的那段、它盖到哪一刻、要原样接在摘要后面的场合交代 */
25
+ export interface CompactionPlan {
26
+ toSummarize: AgentMessage[];
27
+ coversUntil: number;
28
+ context: string | undefined;
29
+ }
30
+ /** 这个模型的触发线 */
31
+ export declare function triggerTokens(model: Pick<Model<Api>, "contextWindow">): number;
32
+ /**
33
+ * 历史超没超触发线。上下文大小用 pi 的估法:最后一条真实回复带回的用量(输入 + 缓存命中 + 输出)就是那次请求的上下文,
34
+ * 再把它之后的消息按字符数除 4 估上;刚重建完还没回过话时所有回复都没有用量,全按字符估,偏保守
35
+ */
36
+ export declare function overTrigger(messages: AgentMessage[], model: Pick<Model<Api>, "contextWindow">): boolean;
37
+ /**
38
+ * 切点:从尾往前数够 keepTokens,停在哪条就再往前挪到最近一条 user 角色消息,保留的尾部从它开始——尾部只会比保留量多、不会少,
39
+ * 一步的 assistant 和它的工具结果永远不拆。切点之前的全部进摘要,包括开头那份旧摘要。
40
+ * coversUntil 取切点前那条记录的时间:工具结果跟着它那一步的 assistant,取那一步的时间。
41
+ * 历史不够长(数够保留量已经到头)、或者往前找不到 user、切点前没东西,都回 undefined
42
+ */
43
+ export declare function planCompaction(messages: AgentMessage[], keepTokens?: number): CompactionPlan | undefined;
44
+ /** 摘要记录正文里带的那段场合交代(compactionText 接上去的);没带回 undefined */
45
+ export declare function embeddedContext(text: string): string | undefined;
46
+ /** 摘要记录的正文:第一行固定说明,接摘要,再原样接上被盖住那段里最新一条场合交代 */
47
+ export declare function compactionText(summary: string, context: string | undefined): string;
48
+ /**
49
+ * 摘要请求的 messages:切点之前那段照平时的换算(user、工具结果开头拼时间),末尾接一条指令。
50
+ * 前缀跟平时的请求逐字相同,上游的前缀缓存还在就整段命中
51
+ */
52
+ export declare function summaryRequestMessages(plan: CompactionPlan, now: number): Message[];
53
+ /** 这个模型最低的思考档:关得掉就关(不带思考参数),关不掉(kimi-k3)就最低那档 */
54
+ export declare function lowestThinkingLevel(model: Model<Api>): ThinkingLevel | undefined;
55
+ export interface CompactionDeps {
56
+ client: MLBClient;
57
+ key: string;
58
+ buddyId: string;
59
+ model: Model<Api>;
60
+ streamFn: StreamFn;
61
+ /** 搭子令牌:摘要请求也经网关,同一把 */
62
+ token: string;
63
+ log: BuddyLogger;
64
+ /** 进程停止时打断:正在生成的请求取消,没写完的不写 */
65
+ signal?: AbortSignal;
66
+ }
67
+ /**
68
+ * 后台压一次:算切点 → 请求模型生成摘要 → 写回一条 compaction 记录。
69
+ * 回 true 表示摘要已交给发送队列并等到了队列清空;生成失败、模型没按要求输出、写被拒都回 false 且什么都不动。
70
+ * 幂等键按会话键加 coversUntil 拼,重发不会写重
71
+ */
72
+ export declare function compactConversation(deps: CompactionDeps, snapshot: CompactionSnapshot): Promise<boolean>;
73
+ //# sourceMappingURL=compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/conversation/compaction.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEvF,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAKhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,2GAA2G;AAC3G,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAC1C,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,wCAAwC;AACxC,eAAO,MAAM,WAAW,QAAS,CAAC;AAClC,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AAIxC,yGAAyG;AACzG,eAAO,MAAM,iBAAiB,2JAA8B,CAAC;AAC7D,+EAA+E;AAC/E,eAAO,MAAM,cAAc,qDAAa,CAAC;AAEzC,qDAAqD;AACrD,eAAO,MAAM,mBAAmB,QAepB,CAAC;AAEb,+DAA+D;AAC/D,MAAM,WAAW,kBAAkB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC9B,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,eAAe;AACf,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,GAAG,MAAM,CAE9E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,GAAG,OAAO,CAEvG;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,UAAU,SAAc,GAAG,cAAc,GAAG,SAAS,CAe7G;AAcD,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGhE;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGnF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CAEnF;AAED,iDAAiD;AACjD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,SAAS,CAGhF;AAED,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,WAAW,CAAC;IACjB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAgD9G"}
@@ -0,0 +1,178 @@
1
+ // 会话压缩:会话空闲被回收那一刻,历史超过触发线就拍一份快照,后台压成一份摘要写回平台,下次重建生效
2
+ //(REDoc《【技术设计】搭子会话压缩 Compaction》)。压缩从头到尾不碰活会话的内存历史。
3
+ // 管:触发线(min(128K, 模型窗口的 25%))与上下文大小的估算;切点(从尾数够保留量、再往前挪到最近一条 user,一步不拆)与 coversUntil;
4
+ // 被盖住那段里最新一条场合交代原样接在摘要后面;摘要请求(跟平时同一前缀 + 末尾一条指令,思考最低档);
5
+ // 摘要记录的正文;后台跑一次:生成 → 经 WriteMLBMessage 写回;生成失败、写被拒都什么都不动,下次回收再来。
6
+ // 不管:什么时候回收、后台任务怎么管(server.ts);重建时怎么用这条记录(readMLBMessages.ts / history.ts / mlbMessageAgentMessageConverter.ts)。
7
+ import { estimateContextTokens, estimateTokens } from "@earendil-works/pi-agent-core";
8
+ import { getSupportedThinkingLevels } from "@earendil-works/pi-ai";
9
+ import { agentMessagesToLLMMessages } from "./agentMessageLLMMessageConverter.js";
10
+ import { textOf } from "./mlbMessageAgentMessageConverter.js";
11
+ import { WriteMLBMessage } from "./writeMLBMessage.js";
12
+ import { errorText } from "../log.js";
13
+ /** 触发线:min(TRIGGER_CAP_TOKENS, 模型窗口 × TRIGGER_WINDOW_RATIO)。1M 窗口是 128K,256K 窗口是 64K:一场从触发线起聊,一晚上也撑不到窗口 */
14
+ export const TRIGGER_CAP_TOKENS = 128_000;
15
+ export const TRIGGER_WINDOW_RATIO = 0.25;
16
+ /** 保留尾部大约多少 token 的原文(最近两三天),再往前的靠摘要 */
17
+ export const KEEP_TOKENS = 32_000;
18
+ /** 摘要本身的输出上限 */
19
+ export const SUMMARY_MAX_TOKENS = 4_096;
20
+ /** 写回平台最多等多久:网络一直不通就不等了,这次当没压过 */
21
+ const WRITE_WAIT_MS = 2 * 60_000;
22
+ /** 摘要记录正文的第一行;平台 system prompt 按这句指认它(my-life-buddies-server 的 src/messages/systemPrompt.ts),改这里那边一起改 */
23
+ export const COMPACTION_HEADER = "更早的对话已压缩成摘要(平台附注,不是谁说的话):";
24
+ /** 平台场合交代记录的第一行(my-life-buddies-server 的 contextOf 写的);被盖住那段里最新的一条要原样接在摘要后面 */
25
+ export const CONTEXT_HEADER = "平台交代的情况:";
26
+ /** 接在切点之前那段历史末尾的指令。固定分节,逼模型每次都过一遍每个格子,多轮压缩才不会越压越丢 */
27
+ export const SUMMARY_INSTRUCTION = [
28
+ "把以上对话压成一份摘要,交给以后的你接着聊。只输出摘要本身:不回应上面任何人的话,不加开场白和结尾,不调用工具。",
29
+ `上面的对话开头如果已经有一段「${COMPACTION_HEADER.slice(0, -1)}」,把它的内容合并进来,任何时刻只有一份摘要。`,
30
+ "按下面九节写,每节写不出就写「无」,不要漏节,节名照抄:",
31
+ "## 用户的事实与身边的人",
32
+ "## 用户的偏好与明确要求",
33
+ "## 用户明确说过要记住的事",
34
+ "## 承诺过的、没做完的事",
35
+ "## 正在进行的话题和最近的结论",
36
+ "## 你自己表过的态、给过的建议",
37
+ "## 哪些事已经说过了",
38
+ "## 时间线",
39
+ "## 编号",
40
+ "要求:每条事实带上是哪天,消息开头方括号里是 GMT 时间,按它写日期;widget 的 id、图片的「#消息 id」、群成员的「#m_ 编号」原样抄,不要改写;" +
41
+ `以「${CONTEXT_HEADER}」开头的那几段不用写进摘要;图片只记「[图片 #消息 id]」和当时说了什么;不写你在想什么,只写事实和结论;总长不超过两千字。`,
42
+ ].join("\n");
43
+ /** 这个模型的触发线 */
44
+ export function triggerTokens(model) {
45
+ return Math.min(TRIGGER_CAP_TOKENS, Math.floor(model.contextWindow * TRIGGER_WINDOW_RATIO));
46
+ }
47
+ /**
48
+ * 历史超没超触发线。上下文大小用 pi 的估法:最后一条真实回复带回的用量(输入 + 缓存命中 + 输出)就是那次请求的上下文,
49
+ * 再把它之后的消息按字符数除 4 估上;刚重建完还没回过话时所有回复都没有用量,全按字符估,偏保守
50
+ */
51
+ export function overTrigger(messages, model) {
52
+ return estimateContextTokens(messages).tokens > triggerTokens(model);
53
+ }
54
+ /**
55
+ * 切点:从尾往前数够 keepTokens,停在哪条就再往前挪到最近一条 user 角色消息,保留的尾部从它开始——尾部只会比保留量多、不会少,
56
+ * 一步的 assistant 和它的工具结果永远不拆。切点之前的全部进摘要,包括开头那份旧摘要。
57
+ * coversUntil 取切点前那条记录的时间:工具结果跟着它那一步的 assistant,取那一步的时间。
58
+ * 历史不够长(数够保留量已经到头)、或者往前找不到 user、切点前没东西,都回 undefined
59
+ */
60
+ export function planCompaction(messages, keepTokens = KEEP_TOKENS) {
61
+ let kept = 0;
62
+ let i = messages.length;
63
+ while (i > 0 && kept < keepTokens) {
64
+ i -= 1;
65
+ kept += estimateTokens(messages[i]);
66
+ }
67
+ if (kept < keepTokens)
68
+ return undefined;
69
+ let cut = i;
70
+ while (cut > 0 && messages[cut].role !== "user")
71
+ cut -= 1;
72
+ if (cut <= 0)
73
+ return undefined;
74
+ let head = cut - 1;
75
+ while (head > 0 && messages[head].role === "toolResult")
76
+ head -= 1;
77
+ const toSummarize = messages.slice(0, cut);
78
+ return { toSummarize, coversUntil: messages[head].timestamp, context: latestContextIn(toSummarize) };
79
+ }
80
+ /** 切点之前那段里最新一条场合交代的正文:先找 context 记录换算出来的 user 消息,找不到再看开头那份旧摘要末尾带的那段 */
81
+ function latestContextIn(messages) {
82
+ for (let i = messages.length - 1; i >= 0; i--) {
83
+ const m = messages[i];
84
+ if (m.role !== "user")
85
+ continue;
86
+ const text = userText(m);
87
+ if (text.startsWith(CONTEXT_HEADER))
88
+ return text;
89
+ if (i === 0 && text.startsWith(COMPACTION_HEADER))
90
+ return embeddedContext(text);
91
+ }
92
+ return undefined;
93
+ }
94
+ /** 摘要记录正文里带的那段场合交代(compactionText 接上去的);没带回 undefined */
95
+ export function embeddedContext(text) {
96
+ const at = text.lastIndexOf(`\n\n${CONTEXT_HEADER}`);
97
+ return at === -1 ? undefined : text.slice(at + 2);
98
+ }
99
+ /** 摘要记录的正文:第一行固定说明,接摘要,再原样接上被盖住那段里最新一条场合交代 */
100
+ export function compactionText(summary, context) {
101
+ const body = `${COMPACTION_HEADER}\n${summary.trim()}`;
102
+ return context === undefined ? body : `${body}\n\n${context}`;
103
+ }
104
+ /**
105
+ * 摘要请求的 messages:切点之前那段照平时的换算(user、工具结果开头拼时间),末尾接一条指令。
106
+ * 前缀跟平时的请求逐字相同,上游的前缀缓存还在就整段命中
107
+ */
108
+ export function summaryRequestMessages(plan, now) {
109
+ return agentMessagesToLLMMessages([...plan.toSummarize, { role: "user", content: [{ type: "text", text: SUMMARY_INSTRUCTION }], timestamp: now }]);
110
+ }
111
+ /** 这个模型最低的思考档:关得掉就关(不带思考参数),关不掉(kimi-k3)就最低那档 */
112
+ export function lowestThinkingLevel(model) {
113
+ const lowest = getSupportedThinkingLevels(model)[0];
114
+ return lowest === undefined || lowest === "off" ? undefined : lowest;
115
+ }
116
+ /**
117
+ * 后台压一次:算切点 → 请求模型生成摘要 → 写回一条 compaction 记录。
118
+ * 回 true 表示摘要已交给发送队列并等到了队列清空;生成失败、模型没按要求输出、写被拒都回 false 且什么都不动。
119
+ * 幂等键按会话键加 coversUntil 拼,重发不会写重
120
+ */
121
+ export async function compactConversation(deps, snapshot) {
122
+ const { log, key } = deps;
123
+ if (deps.signal?.aborted)
124
+ return false;
125
+ const plan = planCompaction(snapshot.messages);
126
+ if (plan === undefined) {
127
+ log.info("压缩:历史还不够长,没有可压的", { convoKey: key, messages: snapshot.messages.length });
128
+ return false;
129
+ }
130
+ const messages = summaryRequestMessages(plan, Date.now());
131
+ log.info("压缩:请求摘要", { convoKey: key, summarized: plan.toSummarize.length, kept: snapshot.messages.length - plan.toSummarize.length, coversUntil: plan.coversUntil });
132
+ let summary;
133
+ try {
134
+ const stream = await deps.streamFn(deps.model, { systemPrompt: snapshot.systemPrompt, messages, tools: snapshot.tools }, { apiKey: deps.token, maxTokens: SUMMARY_MAX_TOKENS, reasoning: lowestThinkingLevel(deps.model), signal: deps.signal });
135
+ const result = await stream.result();
136
+ if (result.stopReason !== "stop")
137
+ throw new Error(`模型以 ${result.stopReason} 收尾:${result.errorMessage ?? ""}`);
138
+ if (result.content.some((block) => block.type === "toolCall"))
139
+ throw new Error("模型没写摘要,调了工具");
140
+ summary = textOf(result).trim();
141
+ if (summary === "")
142
+ throw new Error("模型回了空正文");
143
+ }
144
+ catch (e) {
145
+ log.warn("压缩:摘要没生成,这次不压,下次回收再试", { convoKey: key, error: errorText(e) });
146
+ return false;
147
+ }
148
+ // 进程正在停:没写的不写,这次当没压过
149
+ if (deps.signal?.aborted)
150
+ return false;
151
+ const writer = new WriteMLBMessage({ client: deps.client, key, buddyId: deps.buddyId, runId: "compaction", log });
152
+ const stop = () => writer.close();
153
+ deps.signal?.addEventListener("abort", stop, { once: true });
154
+ const timeout = setTimeout(stop, WRITE_WAIT_MS);
155
+ timeout.unref();
156
+ try {
157
+ writer.enqueueMessage({
158
+ type: "compaction",
159
+ text: compactionText(summary, plan.context),
160
+ coversUntil: plan.coversUntil,
161
+ idempotencyKey: `compaction:${deps.buddyId}:${key}:${plan.coversUntil}`,
162
+ });
163
+ await writer.flush();
164
+ }
165
+ finally {
166
+ clearTimeout(timeout);
167
+ deps.signal?.removeEventListener("abort", stop);
168
+ writer.close();
169
+ }
170
+ log.info("压缩:摘要已写回", { convoKey: key, coversUntil: plan.coversUntil, chars: summary.length });
171
+ return true;
172
+ }
173
+ function userText(m) {
174
+ if (m.role !== "user")
175
+ return "";
176
+ return typeof m.content === "string" ? m.content : m.content.map((block) => (block.type === "text" ? block.text : "")).join("");
177
+ }
178
+ //# sourceMappingURL=compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/conversation/compaction.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,oDAAoD;AACpD,qFAAqF;AACrF,2DAA2D;AAC3D,qEAAqE;AACrE,iHAAiH;AAEjH,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEtF,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,2GAA2G;AAC3G,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,wCAAwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAClC,gBAAgB;AAChB,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,kCAAkC;AAClC,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC;AAEjC,yGAAyG;AACzG,MAAM,CAAC,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AAC7D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAEzC,qDAAqD;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,0DAA0D;IAC1D,kBAAkB,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB;IACzE,8BAA8B;IAC9B,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,kBAAkB;IAClB,kBAAkB;IAClB,aAAa;IACb,QAAQ;IACR,OAAO;IACP,mFAAmF;QAClF,KAAK,cAAc,kEAAkE;CACtF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAgBb,eAAe;AACf,MAAM,UAAU,aAAa,CAAC,KAAwC;IACrE,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,oBAAoB,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAwB,EAAE,KAAwC;IAC7F,OAAO,qBAAqB,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,QAAwB,EAAE,UAAU,GAAG,WAAW;IAChF,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;QACnC,CAAC,IAAI,CAAC,CAAC;QACP,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,GAAG,UAAU;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,GAAG,IAAI,CAAC,CAAC;IAC1D,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IACnB,OAAO,IAAI,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;QAAE,IAAI,IAAI,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;AACtG,CAAC;AAED,uEAAuE;AACvE,SAAS,eAAe,CAAC,QAAwB;IAChD,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;YAAE,OAAO,IAAI,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAAE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,cAAc,EAAE,CAAC,CAAC;IACrD,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,OAA2B;IAC1E,MAAM,IAAI,GAAG,GAAG,iBAAiB,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IACvD,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,OAAO,EAAE,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAoB,EAAE,GAAW;IACvE,OAAO,0BAA0B,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACpJ,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,mBAAmB,CAAC,KAAiB;IACpD,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AACtE,CAAC;AAeD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAoB,EAAE,QAA4B;IAC3F,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1B,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrK,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CACjC,IAAI,CAAC,KAAK,EACV,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EACxE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CACtH,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,CAAC,UAAU,OAAO,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9G,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9F,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,KAAK,CAAC;IACd,CAAC;IACD,qBAAqB;IACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAClH,MAAM,IAAI,GAAG,GAAS,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAChD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,IAAI,CAAC;QACJ,MAAM,CAAC,cAAc,CAAC;YACrB,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;YAC3C,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,cAAc,EAAE,cAAc,IAAI,CAAC,OAAO,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE;SACvE,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACV,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9F,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,CAAe;IAChC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjI,CAAC"}
@@ -1,4 +1,18 @@
1
1
  import type { MLBMessage } from "../types.ts";
2
+ /** 一条压缩记录(运行时自己写回的摘要,见 compaction.ts):type compaction、搭子写的、带 coversUntil */
3
+ export declare function isCompaction(record: MLBMessage): record is MLBMessage & {
4
+ coversUntil: number;
5
+ };
6
+ /** 这批记录里最新的一条压缩记录(按时间),没有回 undefined */
7
+ export declare function latestCompaction(records: MLBMessage[]): (MLBMessage & {
8
+ coversUntil: number;
9
+ }) | undefined;
10
+ /**
11
+ * 重建时按压缩记录裁:只认最新一条,时间不晚于它 coversUntil 的记录一律扔掉,更早的压缩记录也扔掉;
12
+ * 那条记录本身留着,在流里的位置不动(换算时它变成一条时间为 coversUntil 的 user 消息,回合收尾那套按时间排会把它排到开头)。
13
+ * 没有压缩记录原样返回
14
+ */
15
+ export declare function applyCompaction(records: MLBMessage[]): MLBMessage[];
2
16
  /**
3
17
  * 首次拉取(重建):以搭子最后一次写的记录为界。之前的整段是历史,照原样灌;之后的是搭子还没回应过的,
4
18
  * 交给回合按平时同一条规矩处理(wantsReply)。不看「最后一条」:拉取时平台追加的 context、
@@ -1 +1 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/conversation/history.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG;IAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,CAIvG;AAED,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAE5D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAEzD"}
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/conversation/history.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,UAAU,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAE/F;AAED,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,CAI1G;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAInE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG;IAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,CAIvG;AAED,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAE5D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAEzD"}
@@ -1,6 +1,29 @@
1
1
  // 拉回来的平台记录怎么分拣:哪些灌进历史、哪些是搭子还没回应过的、哪些是对方的、要不要开口。纯函数,不碰 Agent。
2
- // 管:首次拉取(重建)的切分;挑出对方的记录;「要不要开口」的判定(重建与平时同一条)。
2
+ // 管:压缩记录怎么认、盖住的记录怎么扔(只认最新一条);首次拉取(重建)的切分;挑出对方的记录;「要不要开口」的判定(重建与平时同一条)。
3
3
  // 不管:拉取、游标与只交新消息(readMLBMessages.ts)、记录换成 pi 消息的形状(mlbMessageAgentMessageConverter.ts)、分拣之后怎么处理(index.ts)。
4
+ /** 一条压缩记录(运行时自己写回的摘要,见 compaction.ts):type compaction、搭子写的、带 coversUntil */
5
+ export function isCompaction(record) {
6
+ return record.type === "compaction" && record.author === "buddy" && typeof record.coversUntil === "number";
7
+ }
8
+ /** 这批记录里最新的一条压缩记录(按时间),没有回 undefined */
9
+ export function latestCompaction(records) {
10
+ let found;
11
+ for (const record of records)
12
+ if (isCompaction(record) && (found === undefined || record.timestamp > found.timestamp))
13
+ found = record;
14
+ return found;
15
+ }
16
+ /**
17
+ * 重建时按压缩记录裁:只认最新一条,时间不晚于它 coversUntil 的记录一律扔掉,更早的压缩记录也扔掉;
18
+ * 那条记录本身留着,在流里的位置不动(换算时它变成一条时间为 coversUntil 的 user 消息,回合收尾那套按时间排会把它排到开头)。
19
+ * 没有压缩记录原样返回
20
+ */
21
+ export function applyCompaction(records) {
22
+ const latest = latestCompaction(records);
23
+ if (latest === undefined)
24
+ return records;
25
+ return records.filter((record) => record === latest || (!isCompaction(record) && record.timestamp > latest.coversUntil));
26
+ }
4
27
  /**
5
28
  * 首次拉取(重建):以搭子最后一次写的记录为界。之前的整段是历史,照原样灌;之后的是搭子还没回应过的,
6
29
  * 交给回合按平时同一条规矩处理(wantsReply)。不看「最后一条」:拉取时平台追加的 context、
@@ -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,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"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/conversation/history.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,uEAAuE;AACvE,2GAA2G;AAI3G,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC9C,OAAO,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC;AAC5G,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,gBAAgB,CAAC,OAAqB;IACrD,IAAI,KAAyD,CAAC;IAC9D,KAAK,MAAM,MAAM,IAAI,OAAO;QAAE,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YAAE,KAAK,GAAG,MAAM,CAAC;IACtI,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAqB;IACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACzC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AAC1H,CAAC;AAED;;;;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"}