@my-life-buddies/buddy-runtime 0.1.0 → 0.2.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 +148 -73
  2. package/dist/conversation/agent.d.ts +6 -1
  3. package/dist/conversation/agent.d.ts.map +1 -1
  4. package/dist/conversation/agent.js +58 -51
  5. package/dist/conversation/agent.js.map +1 -1
  6. package/dist/conversation/agentMessageLLMMessageConverter.d.ts +2 -2
  7. package/dist/conversation/agentMessageLLMMessageConverter.d.ts.map +1 -1
  8. package/dist/conversation/agentMessageLLMMessageConverter.js +8 -32
  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 +11 -1
  13. package/dist/conversation/index.d.ts.map +1 -1
  14. package/dist/conversation/index.js +60 -8
  15. package/dist/conversation/index.js.map +1 -1
  16. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts +5 -2
  17. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts.map +1 -1
  18. package/dist/conversation/mlbMessageAgentMessageConverter.js +77 -22
  19. package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -1
  20. package/dist/conversation/readMLBMessages.d.ts +3 -1
  21. package/dist/conversation/readMLBMessages.d.ts.map +1 -1
  22. package/dist/conversation/readMLBMessages.js +9 -5
  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 +5 -0
  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 +29 -0
  37. package/dist/platform/client.d.ts.map +1 -0
  38. package/dist/platform/client.js +22 -0
  39. package/dist/platform/client.js.map +1 -0
  40. package/dist/platform/mlbClient.d.ts +133 -0
  41. package/dist/platform/mlbClient.d.ts.map +1 -0
  42. package/dist/platform/mlbClient.js +420 -0
  43. package/dist/platform/mlbClient.js.map +1 -0
  44. package/dist/platform/widgets.d.ts +74 -0
  45. package/dist/platform/widgets.d.ts.map +1 -0
  46. package/dist/platform/widgets.js +85 -0
  47. package/dist/platform/widgets.js.map +1 -0
  48. package/dist/server.d.ts.map +1 -1
  49. package/dist/server.js +8 -4
  50. package/dist/server.js.map +1 -1
  51. package/dist/tools/dataAccess.d.ts +2 -2
  52. package/dist/tools/dataAccess.d.ts.map +1 -1
  53. package/dist/tools/dataAccess.js +4 -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 +37 -7
  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,46 +0,0 @@
1
- import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
- import type { AssistantMessage, Message, ToolResultMessage } from "@earendil-works/pi-ai";
3
- import type { MLBMessage, NoteMessage, OutgoingMessage } from "../types.ts";
4
- /** 重建 assistant 消息时抄的模型身份(model.ts 的 modelIdentity 给) */
5
- export interface ModelIdentity {
6
- api: string;
7
- provider: string;
8
- model: string;
9
- }
10
- /**
11
- * 把一批平台记录换成 pi 的历史。跳过的:interrupted 的半截话、question / widget、空正文又没工具调用的搭子记录。
12
- * 对方的 message 变 user(群里带成员前缀)、system 变 user(带「群里发生了一件事」)、messagesCard 拍平成 user、
13
- * 平台的场合交代 context 原样变 user(开头自带「平台交代给你的情况」那句用法,不套前缀);
14
- * 搭子的 message / checkin 变 assistant,tool 变 assistant + 每个调用一条 toolResult,note 变 note。
15
- */
16
- export declare function toAgentMessages(records: MLBMessage[], identity: ModelIdentity): AgentMessage[];
17
- /**
18
- * 不带工具调用的 assistant 消息写成 message 记录。
19
- * 正常收尾的照写(带 thinking);error / aborted 收尾但已经说了半截的写成 interrupted;其余不写。
20
- */
21
- export declare function outboundFromAssistant(m: AssistantMessage, omitThinking?: boolean): OutgoingMessage | null;
22
- /**
23
- * 带工具调用的 assistant 消息连同它的结果写成一条 tool 记录;每个调用的 summary 取工具的 label,没有 label 用名字。
24
- * 没有工具调用的返回 null(那种走 outboundFromAssistant)。
25
- */
26
- export declare function outboundFromTurn(m: AssistantMessage, toolResults: ToolResultMessage[], tools: {
27
- name: string;
28
- label: string;
29
- }[], dataAccessDetailsOf?: (toolCallId: string) => unknown, sensitiveRun?: boolean): OutgoingMessage | null;
30
- /**
31
- * Agent run 完成后,把内存 transcript 里的 DataAccess 原始结果换成状态摘要。
32
- * run 内不能提前替换:模型在 Tool 后续一轮还需要读取真实数据。
33
- */
34
- export declare function redactSensitiveRun(messages: AgentMessage[], runMessages: AgentMessage[], dataAccessDetailsOf?: (toolCallId: string) => unknown): AgentMessage[];
35
- /** note 消息写成 note 记录 */
36
- export declare function outboundFromNote(n: NoteMessage): OutgoingMessage;
37
- /** assistant 消息里所有 thinking 块的推理原文拼起来;一个字都没有返回 undefined */
38
- export declare function thinkingOf(m: AssistantMessage): string | undefined;
39
- /** assistant 消息里所有 text 块的正文拼起来 */
40
- export declare function textOf(m: AssistantMessage): string;
41
- /**
42
- * 交给 pi 的 convertToLlm:note 变 user;相邻两条 user 合并成一条(正文中间隔一个换行);user / assistant / toolResult 原样。
43
- * 返回的是新数组,合并出来的也是新对象,不改传进来的消息。
44
- */
45
- export declare const convertToLlm: (messages: AgentMessage[]) => Message[];
46
- //# sourceMappingURL=convert.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/conversation/convert.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EACX,gBAAgB,EAEhB,OAAO,EAIP,iBAAiB,EAGjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAgB,UAAU,EAAe,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGvG,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACd;AA6BD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,aAAa,GAAG,YAAY,EAAE,CAmC9F;AAgFD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,gBAAgB,EAAE,YAAY,UAAQ,GAAG,eAAe,GAAG,IAAI,CAQvG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,CAAC,EAAE,gBAAgB,EACnB,WAAW,EAAE,iBAAiB,EAAE,EAChC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EACxC,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,EACrD,YAAY,UAAQ,GAClB,eAAe,GAAG,IAAI,CAqBxB;AASD;;;GAGG;AAEH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,YAAY,EAAE,EACxB,WAAW,EAAE,YAAY,EAAE,EAC3B,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,GACnD,YAAY,EAAE,CAqBhB;AAED,wBAAwB;AACxB,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,eAAe,CAEhE;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAMlE;AAED,mCAAmC;AACnC,wBAAgB,MAAM,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAKlD;AAYD;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,UAAU,YAAY,EAAE,KAAG,OAAO,EAa9D,CAAC"}
@@ -1,297 +0,0 @@
1
- // 平台记录与 pi 消息之间的换算。只管形状换算,不碰网络、不碰 Agent、不管游标和幂等键。
2
- // 入站:把 GET /internal/v1/messages 拉回来的记录换成 pi 的 AgentMessage(重建历史、灌对方的话都用它)。
3
- // 出站:把 pi 跑出来的 assistant / toolResult / note 换成 POST /internal/v1/messages 的每条 body。
4
- // 另外给 Agent 用的 convertToLlm 也在这:note 变 user、相邻 user 合并。
5
- import { DATA_ACCESS_TOOL_NAME, SENSITIVE_RUN_TOOL_SUMMARY, dataAccessSummary, isDataAccessDetails } from "../tools/dataAccess.js";
6
- /** 工具结果没回来(回合被中断)时,写给模型和平台的占位文本 */
7
- const MISSING_TOOL_RESULT = "(工具结果未返回:回合被中断)";
8
- /** system 记录换成 user 消息时加在正文前的说明 */
9
- const SYSTEM_EVENT_PREFIX = "(群里发生了一件事)";
10
- /** 转发卡最多展开几层,再深的一层写成一句省略 */
11
- const CARD_MAX_DEPTH = 3;
12
- const CARD_TOO_DEEP = "(更深的转发略)";
13
- /** 重建出来的 thinking 块用的签名:pi 的 openai-completions 回放时按它把推理原文写回 reasoning_content 字段 */
14
- const THINKING_SIGNATURE = "reasoning_content";
15
- /** 重建的 assistant 消息没有真实用量,全零;形状照 pi-agent-core 的 EMPTY_USAGE */
16
- function emptyUsage() {
17
- return {
18
- input: 0,
19
- output: 0,
20
- cacheRead: 0,
21
- cacheWrite: 0,
22
- totalTokens: 0,
23
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
24
- };
25
- }
26
- // —— 入站:平台记录 → pi AgentMessage
27
- /**
28
- * 把一批平台记录换成 pi 的历史。跳过的:interrupted 的半截话、question / widget、空正文又没工具调用的搭子记录。
29
- * 对方的 message 变 user(群里带成员前缀)、system 变 user(带「群里发生了一件事」)、messagesCard 拍平成 user、
30
- * 平台的场合交代 context 原样变 user(开头自带「平台交代给你的情况」那句用法,不套前缀);
31
- * 搭子的 message / checkin 变 assistant,tool 变 assistant + 每个调用一条 toolResult,note 变 note。
32
- */
33
- export function toAgentMessages(records, identity) {
34
- const out = [];
35
- for (const record of records) {
36
- if (record.interrupted)
37
- continue;
38
- const text = record.text ?? "";
39
- switch (record.type) {
40
- case "system":
41
- out.push(userMessage(SYSTEM_EVENT_PREFIX + text, record.timestamp));
42
- break;
43
- case "context":
44
- if (text)
45
- out.push(userMessage(text, record.timestamp));
46
- break;
47
- case "messagesCard":
48
- if (record.messagesCard)
49
- out.push(userMessage(flattenCard(record.messagesCard, 1).join("\n"), record.timestamp));
50
- break;
51
- case "message":
52
- case "checkin":
53
- if (record.author === "buddy") {
54
- if (text)
55
- out.push(assistantMessage(record, [...thinkingBlocks(record.thinking), { type: "text", text }], "stop", identity));
56
- }
57
- else if (record.type === "message" && text) {
58
- out.push(userMessage(memberPrefix(record) + text, record.timestamp));
59
- }
60
- break;
61
- case "tool":
62
- if (record.author === "buddy")
63
- out.push(...toolTurn(record, text, identity));
64
- break;
65
- case "note":
66
- if (record.author === "buddy" && text)
67
- out.push({ role: "note", text, timestamp: record.timestamp });
68
- break;
69
- default:
70
- // question / widget 和别的类型:模型不需要
71
- break;
72
- }
73
- }
74
- return out;
75
- }
76
- /** 搭子的 tool 记录:一条带 toolCall 块的 assistant,后面每个调用跟一条 toolResult */
77
- function toolTurn(record, text, identity) {
78
- const calls = record.toolCalls ?? [];
79
- if (!text && calls.length === 0)
80
- return [];
81
- const content = [...thinkingBlocks(record.thinking)];
82
- if (text)
83
- content.push({ type: "text", text });
84
- for (const call of calls)
85
- content.push({ type: "toolCall", id: call.callId, name: call.name, arguments: argumentsOf(call) });
86
- const assistant = assistantMessage(record, content, calls.length > 0 ? "toolUse" : "stop", identity);
87
- const results = calls.map((call) => ({
88
- role: "toolResult",
89
- toolCallId: call.callId,
90
- toolName: call.name,
91
- content: [{ type: "text", text: call.result ?? MISSING_TOOL_RESULT }],
92
- isError: call.result === undefined,
93
- timestamp: record.timestamp,
94
- }));
95
- return [assistant, ...results];
96
- }
97
- function assistantMessage(record, content, stopReason, identity) {
98
- return {
99
- role: "assistant",
100
- content,
101
- api: identity.api,
102
- provider: identity.provider,
103
- model: identity.model,
104
- usage: emptyUsage(),
105
- stopReason,
106
- timestamp: record.timestamp,
107
- };
108
- }
109
- function userMessage(text, timestamp) {
110
- return { role: "user", content: [{ type: "text", text }], timestamp };
111
- }
112
- /** 有推理原文才放 thinking 块,没有就一个不放 */
113
- function thinkingBlocks(thinking) {
114
- return thinking ? [{ type: "thinking", thinking, thinkingSignature: THINKING_SIGNATURE }] : [];
115
- }
116
- /** pi 的 toolCall 块要 arguments 是对象;平台存的不是对象就当空参数 */
117
- function argumentsOf(call) {
118
- const value = call.arguments;
119
- return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
120
- }
121
- /** 群成员说的话前面标谁说的:有成员号写 `[名字 #m_…] `,没成员号只写 `[名字] `;私聊没名字不标 */
122
- function memberPrefix(record) {
123
- const name = record.name;
124
- const memberId = record.memberId;
125
- if (name && memberId)
126
- return `[${name} #${memberId}] `;
127
- if (name)
128
- return `[${name}] `;
129
- if (memberId)
130
- return `[#${memberId}] `;
131
- return "";
132
- }
133
- /** 转发卡拍平成行:每条先一行 `【名字】`,正文原样跟一行;嵌套卡接着展开,超过层数上限写一句省略 */
134
- function flattenCard(card, depth) {
135
- const lines = [];
136
- for (const item of card.items ?? []) {
137
- lines.push(`【${item.name ?? ""}】`);
138
- if (item.text)
139
- lines.push(item.text);
140
- if (item.messagesCard) {
141
- if (depth >= CARD_MAX_DEPTH)
142
- lines.push(CARD_TOO_DEEP);
143
- else
144
- lines.push(...flattenCard(item.messagesCard, depth + 1));
145
- }
146
- }
147
- return lines;
148
- }
149
- // —— 出站:pi 消息 → 平台写口的每条 body
150
- /**
151
- * 不带工具调用的 assistant 消息写成 message 记录。
152
- * 正常收尾的照写(带 thinking);error / aborted 收尾但已经说了半截的写成 interrupted;其余不写。
153
- */
154
- export function outboundFromAssistant(m, omitThinking = false) {
155
- if (m.content.some((block) => block.type === "toolCall"))
156
- return null;
157
- const text = textOf(m);
158
- if (m.stopReason === "error" || m.stopReason === "aborted") {
159
- return text ? { type: "message", text, interrupted: true } : null;
160
- }
161
- const thinking = omitThinking ? undefined : thinkingOf(m);
162
- return thinking === undefined ? { type: "message", text } : { type: "message", text, thinking };
163
- }
164
- /**
165
- * 带工具调用的 assistant 消息连同它的结果写成一条 tool 记录;每个调用的 summary 取工具的 label,没有 label 用名字。
166
- * 没有工具调用的返回 null(那种走 outboundFromAssistant)。
167
- */
168
- export function outboundFromTurn(m, toolResults, tools, dataAccessDetailsOf, sensitiveRun = false) {
169
- const calls = m.content.filter((block) => block.type === "toolCall");
170
- if (calls.length === 0)
171
- return null;
172
- const toolCalls = calls.map((call) => {
173
- const result = toolResults.find((r) => r.toolCallId === call.id);
174
- const label = tools.find((t) => t.name === call.name)?.label;
175
- return {
176
- callId: call.id,
177
- name: call.name,
178
- summary: label || call.name,
179
- arguments: sensitiveRun ? undefined : call.arguments,
180
- result: result === undefined
181
- ? MISSING_TOOL_RESULT
182
- : persistedToolResult(call.name, result, dataAccessDetailsOf?.(call.id), sensitiveRun),
183
- };
184
- });
185
- const thinking = sensitiveRun ? undefined : thinkingOf(m);
186
- const record = { type: "tool", text: sensitiveRun ? "" : textOf(m), toolCalls };
187
- if (thinking !== undefined)
188
- record.thinking = thinking;
189
- return record;
190
- }
191
- /** DataAccess 的真实 Tool 结果只给当前模型回合看;写平台时只留 Dataset ID 与状态。 */
192
- function persistedToolResult(toolName, result, trackedDetails, sensitiveRun) {
193
- const details = trackedDetails ?? result.details;
194
- if (toolName === DATA_ACCESS_TOOL_NAME || isDataAccessDetails(details))
195
- return dataAccessSummary(details);
196
- return sensitiveRun ? SENSITIVE_RUN_TOOL_SUMMARY : resultText(result);
197
- }
198
- /**
199
- * Agent run 完成后,把内存 transcript 里的 DataAccess 原始结果换成状态摘要。
200
- * run 内不能提前替换:模型在 Tool 后续一轮还需要读取真实数据。
201
- */
202
- export function redactSensitiveRun(messages, runMessages, dataAccessDetailsOf) {
203
- const currentRun = new Set(runMessages);
204
- return messages.map((message) => {
205
- if (message.role === "assistant" && currentRun.has(message)) {
206
- const hasToolCall = message.content.some((block) => block.type === "toolCall");
207
- return {
208
- ...message,
209
- content: message.content
210
- .filter((block) => block.type !== "thinking" && (!hasToolCall || block.type === "toolCall"))
211
- .map((block) => (block.type === "toolCall" ? { ...block, arguments: {} } : block)),
212
- };
213
- }
214
- if (message.role !== "toolResult" || !currentRun.has(message))
215
- return message;
216
- const trackedDetails = dataAccessDetailsOf?.(message.toolCallId);
217
- const details = isDataAccessDetails(trackedDetails) ? trackedDetails : isDataAccessDetails(message.details) ? message.details : undefined;
218
- return {
219
- ...message,
220
- content: [{ type: "text", text: details === undefined ? SENSITIVE_RUN_TOOL_SUMMARY : dataAccessSummary(details) }],
221
- details,
222
- };
223
- });
224
- }
225
- /** note 消息写成 note 记录 */
226
- export function outboundFromNote(n) {
227
- return { type: "note", text: n.text };
228
- }
229
- /** assistant 消息里所有 thinking 块的推理原文拼起来;一个字都没有返回 undefined */
230
- export function thinkingOf(m) {
231
- const thinking = m.content
232
- .filter((block) => block.type === "thinking")
233
- .map((block) => block.thinking)
234
- .join("");
235
- return thinking === "" ? undefined : thinking;
236
- }
237
- /** assistant 消息里所有 text 块的正文拼起来 */
238
- export function textOf(m) {
239
- return m.content
240
- .filter((block) => block.type === "text")
241
- .map((block) => block.text)
242
- .join("");
243
- }
244
- /** 工具结果的文本:多个 text 块用换行接起来(跟 pi 的 openai-completions 回放时一样) */
245
- function resultText(result) {
246
- return result.content
247
- .filter((block) => block.type === "text")
248
- .map((block) => block.text)
249
- .join("\n");
250
- }
251
- // —— 给 Agent 用的两个钩子
252
- /**
253
- * 交给 pi 的 convertToLlm:note 变 user;相邻两条 user 合并成一条(正文中间隔一个换行);user / assistant / toolResult 原样。
254
- * 返回的是新数组,合并出来的也是新对象,不改传进来的消息。
255
- */
256
- export const convertToLlm = (messages) => {
257
- const out = [];
258
- for (const m of messages) {
259
- const next = toLlmMessage(m);
260
- if (next === undefined)
261
- continue;
262
- const prev = out[out.length - 1];
263
- if (next.role === "user" && prev !== undefined && prev.role === "user") {
264
- out[out.length - 1] = mergeUsers(prev, next);
265
- }
266
- else {
267
- out.push(next);
268
- }
269
- }
270
- return out;
271
- };
272
- /** 一条 AgentMessage 到模型那边是什么:note 变 user;pi harness 自己并进来的那几种 role(bashExecution / custom / …)这个运行时不产生,照 pi 默认 convertToLlm 的做法不给模型 */
273
- function toLlmMessage(m) {
274
- switch (m.role) {
275
- case "note":
276
- return userMessage(m.text, m.timestamp);
277
- case "user":
278
- case "assistant":
279
- case "toolResult":
280
- return m;
281
- default:
282
- return undefined;
283
- }
284
- }
285
- function mergeUsers(a, b) {
286
- const blocks = [...userBlocks(a), ...userBlocks(b)];
287
- const text = blocks
288
- .filter((block) => block.type === "text")
289
- .map((block) => block.text)
290
- .join("\n");
291
- const images = blocks.filter((block) => block.type === "image");
292
- return { role: "user", content: [{ type: "text", text }, ...images], timestamp: a.timestamp };
293
- }
294
- function userBlocks(m) {
295
- return typeof m.content === "string" ? [{ type: "text", text: m.content }] : m.content;
296
- }
297
- //# sourceMappingURL=convert.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/conversation/convert.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- import type { MLBClient } from "../mlbClient.ts";
2
- export declare class Presence {
3
- private readonly client;
4
- private readonly key;
5
- /** 推送串行链:只保证顺序,不等它 */
6
- private chain;
7
- private deltaBuffer;
8
- private deltaTimer;
9
- private closed;
10
- constructor(client: MLBClient, key: string);
11
- /** 回合开始 on、收尾 off;工具跑起来时带 status 更新状态行 */
12
- replying(data: {
13
- on: boolean;
14
- status?: string;
15
- }): void;
16
- /** 正文碎片先攒着,120 毫秒内攒到的一起发 */
17
- delta(text: string): void;
18
- /** 把攒下的碎片立刻发出去;退役了就扔掉。写平台前、回合收尾前各叫一次,预览不落在正文后面 */
19
- flushDelta(): void;
20
- /** 退役:攒着的碎片扔掉,定时器清掉。replying off 仍然放行——收尾要把三个圆点熄掉 */
21
- close(): void;
22
- private clearTimer;
23
- }
24
- //# sourceMappingURL=presence.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/conversation/presence.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAKjD,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,sBAAsB;IACtB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;IAK1C,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAItD,4BAA4B;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWzB,kDAAkD;IAClD,UAAU,IAAI,IAAI;IAQlB,qDAAqD;IACrD,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,UAAU;CAKlB"}
@@ -1,56 +0,0 @@
1
- // 一场会话的在线态:replying 开关与工具状态行、生成中的正文碎片(delta)。
2
- // 管:把 replying / delta 按顺序推给平台(POST /internal/v1/push),只保证顺序、不等结果;delta 每 120 毫秒攒一帧。
3
- // 不管:什么时候该开关 replying、碎片从哪来(index.ts 按 Agent 事件调这里)。
4
- /** 生成中的正文碎片攒多久发一帧 delta */
5
- const DELTA_THROTTLE_MS = 120;
6
- export class Presence {
7
- client;
8
- key;
9
- /** 推送串行链:只保证顺序,不等它 */
10
- chain = Promise.resolve();
11
- deltaBuffer = "";
12
- deltaTimer;
13
- closed = false;
14
- constructor(client, key) {
15
- this.client = client;
16
- this.key = key;
17
- }
18
- /** 回合开始 on、收尾 off;工具跑起来时带 status 更新状态行 */
19
- replying(data) {
20
- this.chain = this.chain.then(() => this.client.push(this.key, "replying", data)).catch(() => { });
21
- }
22
- /** 正文碎片先攒着,120 毫秒内攒到的一起发 */
23
- delta(text) {
24
- if (text === "" || this.closed)
25
- return;
26
- this.deltaBuffer += text;
27
- if (this.deltaTimer === undefined) {
28
- this.deltaTimer = setTimeout(() => {
29
- this.deltaTimer = undefined;
30
- this.flushDelta();
31
- }, DELTA_THROTTLE_MS);
32
- }
33
- }
34
- /** 把攒下的碎片立刻发出去;退役了就扔掉。写平台前、回合收尾前各叫一次,预览不落在正文后面 */
35
- flushDelta() {
36
- this.clearTimer();
37
- const text = this.deltaBuffer;
38
- this.deltaBuffer = "";
39
- if (text === "" || this.closed)
40
- return;
41
- this.chain = this.chain.then(() => this.client.push(this.key, "delta", { text })).catch(() => { });
42
- }
43
- /** 退役:攒着的碎片扔掉,定时器清掉。replying off 仍然放行——收尾要把三个圆点熄掉 */
44
- close() {
45
- this.closed = true;
46
- this.clearTimer();
47
- this.deltaBuffer = "";
48
- }
49
- clearTimer() {
50
- if (this.deltaTimer === undefined)
51
- return;
52
- clearTimeout(this.deltaTimer);
53
- this.deltaTimer = undefined;
54
- }
55
- }
56
- //# sourceMappingURL=presence.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"presence.js","sourceRoot":"","sources":["../../src/conversation/presence.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,qFAAqF;AACrF,qDAAqD;AAIrD,2BAA2B;AAC3B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,OAAO,QAAQ;IACH,MAAM,CAAY;IAClB,GAAG,CAAS;IAC7B,sBAAsB;IACd,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IACzC,WAAW,GAAG,EAAE,CAAC;IACjB,UAAU,CAA4C;IACtD,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,MAAiB,EAAE,GAAW;QACzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC;IAED,0CAA0C;IAC1C,QAAQ,CAAC,IAAsC;QAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,IAAY;QACjB,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACvC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;gBACjC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IAED,kDAAkD;IAClD,UAAU;QACT,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACnG,CAAC;IAED,qDAAqD;IACrD,KAAK;QACJ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACvB,CAAC;IAEO,UAAU;QACjB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO;QAC1C,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC7B,CAAC;CACD"}
@@ -1,36 +0,0 @@
1
- import type { MLBClient } from "../mlbClient.ts";
2
- import type { BuddyLogger, OutgoingMessage } from "../types.ts";
3
- export interface WriteBackDeps {
4
- client: MLBClient;
5
- key: string;
6
- buddyId: string;
7
- /** 本进程里这场会话的一次生命周期标识,进幂等键;重启后换一个,旧键不会撞新键 */
8
- runId: string;
9
- log: BuddyLogger;
10
- /** 每次真正写平台之前先调一下(把攒着的 delta 发完,预览不落在正文后面) */
11
- beforeSend: () => void;
12
- }
13
- export declare class WriteBack {
14
- private readonly deps;
15
- private queue;
16
- /** 串行链正在跑 */
17
- private sending;
18
- /** 幂等键里的自增号 */
19
- private sent;
20
- private retryDelay;
21
- /** close 时打断重发等待 */
22
- private readonly abort;
23
- /** 等队列清空的人 */
24
- private waiters;
25
- private closed;
26
- constructor(deps: WriteBackDeps);
27
- /** 入队即分配幂等键;退役后不收 */
28
- enqueue(message: OutgoingMessage): void;
29
- /** 等队列清空(或退役) */
30
- flush(): Promise<void>;
31
- /** 退役:正在退避等重发的立刻醒来并退出,队列清空 */
32
- close(): void;
33
- /** 一次发队头一条:delivered → 出队;rejected(4xx)→ warn 出队;throw(网络 / 5xx)→ 留队退避后带同一个键重发 */
34
- private drain;
35
- }
36
- //# sourceMappingURL=writeBack.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"writeBack.d.ts","sourceRoot":"","sources":["../../src/conversation/writeBack.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMhE,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,WAAW,CAAC;IACjB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,KAAK,CAAyB;IACtC,aAAa;IACb,OAAO,CAAC,OAAO,CAAS;IACxB,eAAe;IACf,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,UAAU,CAAsB;IACxC,oBAAoB;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,cAAc;IACd,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,aAAa;IAI/B,qBAAqB;IACrB,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAOvC,iBAAiB;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IAMb,kFAAkF;YACpE,KAAK;CA2CnB"}
@@ -1,114 +0,0 @@
1
- // 一场会话的写回:模型说的话怎么写回平台。
2
- // 管:入队那一刻分配幂等键(之后重发一字不变);串行 POST /internal/v1/messages;4xx 丢弃并 warn(平台明确拒绝,重发没用);
3
- // 网络错误 / 5xx 留队退避重发(1 秒起步、翻倍、封顶 10 秒);等队列清空;退役时清空并打断等待。
4
- // 不管:记录长什么样(convert.ts 产出、index.ts 交进来)、写之前要先把 delta 发完(调用方通过 beforeSend 挂进来)。
5
- import { errorText } from "../log.js";
6
- /** 写平台遇到网络错误 / 5xx 的重发间隔 */
7
- const WRITE_RETRY_MIN_MS = 1_000;
8
- const WRITE_RETRY_MAX_MS = 10_000;
9
- export class WriteBack {
10
- deps;
11
- queue = [];
12
- /** 串行链正在跑 */
13
- sending = false;
14
- /** 幂等键里的自增号 */
15
- sent = 0;
16
- retryDelay = WRITE_RETRY_MIN_MS;
17
- /** close 时打断重发等待 */
18
- abort = new AbortController();
19
- /** 等队列清空的人 */
20
- waiters = [];
21
- closed = false;
22
- constructor(deps) {
23
- this.deps = deps;
24
- }
25
- /** 入队即分配幂等键;退役后不收 */
26
- enqueue(message) {
27
- if (this.closed)
28
- return;
29
- this.sent += 1;
30
- this.queue.push({ ...message, idempotencyKey: `buddy:${this.deps.buddyId}:${this.deps.key}:${this.deps.runId}:${this.sent}` });
31
- void this.drain();
32
- }
33
- /** 等队列清空(或退役) */
34
- flush() {
35
- if (!this.sending && this.queue.length === 0)
36
- return Promise.resolve();
37
- return new Promise((resolve) => {
38
- this.waiters.push(resolve);
39
- });
40
- }
41
- /** 退役:正在退避等重发的立刻醒来并退出,队列清空 */
42
- close() {
43
- this.closed = true;
44
- this.abort.abort();
45
- this.queue = [];
46
- }
47
- /** 一次发队头一条:delivered → 出队;rejected(4xx)→ warn 出队;throw(网络 / 5xx)→ 留队退避后带同一个键重发 */
48
- async drain() {
49
- if (this.sending)
50
- return;
51
- this.sending = true;
52
- try {
53
- while (!this.closed && this.queue.length > 0) {
54
- const head = this.queue[0];
55
- this.deps.beforeSend();
56
- let result;
57
- try {
58
- result = await this.deps.client.writeMessages(this.deps.key, [head]);
59
- }
60
- catch (e) {
61
- this.deps.log.warn("写消息失败,稍后重发", {
62
- convoKey: this.deps.key,
63
- idempotencyKey: head.idempotencyKey,
64
- delayMs: this.retryDelay,
65
- error: errorText(e),
66
- });
67
- await waitMs(this.retryDelay, this.abort.signal);
68
- this.retryDelay = Math.min(this.retryDelay * 2, WRITE_RETRY_MAX_MS);
69
- continue;
70
- }
71
- this.retryDelay = WRITE_RETRY_MIN_MS;
72
- if (result.kind === "delivered") {
73
- this.deps.log.info("写回一条", { convoKey: this.deps.key, type: head.type, chars: head.text?.length ?? 0, idempotencyKey: head.idempotencyKey });
74
- }
75
- else {
76
- this.deps.log.warn("写消息被平台拒绝,丢弃", {
77
- convoKey: this.deps.key,
78
- idempotencyKey: head.idempotencyKey,
79
- type: head.type,
80
- status: result.status,
81
- body: result.body,
82
- });
83
- }
84
- this.queue.shift();
85
- }
86
- if (this.closed)
87
- this.queue = [];
88
- }
89
- finally {
90
- this.sending = false;
91
- const waiters = this.waiters;
92
- this.waiters = [];
93
- for (const resolve of waiters)
94
- resolve();
95
- }
96
- }
97
- }
98
- /** 等 ms 毫秒;signal 触发就提前返回(不 reject) */
99
- function waitMs(ms, signal) {
100
- return new Promise((resolve) => {
101
- if (signal.aborted) {
102
- resolve();
103
- return;
104
- }
105
- const finish = () => {
106
- clearTimeout(timer);
107
- signal.removeEventListener("abort", finish);
108
- resolve();
109
- };
110
- const timer = setTimeout(finish, ms);
111
- signal.addEventListener("abort", finish, { once: true });
112
- });
113
- }
114
- //# sourceMappingURL=writeBack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"writeBack.js","sourceRoot":"","sources":["../../src/conversation/writeBack.ts"],"names":[],"mappings":"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"}