@my-life-buddies/buddy-runtime 0.0.3 → 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 (80) hide show
  1. package/README.md +209 -45
  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 +60 -53
  5. package/dist/conversation/agent.js.map +1 -1
  6. package/dist/conversation/agentMessageLLMMessageConverter.d.ts +8 -0
  7. package/dist/conversation/agentMessageLLMMessageConverter.d.ts.map +1 -0
  8. package/dist/conversation/agentMessageLLMMessageConverter.js +24 -0
  9. package/dist/conversation/agentMessageLLMMessageConverter.js.map +1 -0
  10. package/dist/conversation/history.d.ts +0 -7
  11. package/dist/conversation/history.d.ts.map +1 -1
  12. package/dist/conversation/history.js +3 -16
  13. package/dist/conversation/history.js.map +1 -1
  14. package/dist/conversation/index.d.ts +25 -22
  15. package/dist/conversation/index.d.ts.map +1 -1
  16. package/dist/conversation/index.js +141 -116
  17. package/dist/conversation/index.js.map +1 -1
  18. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts +39 -0
  19. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts.map +1 -0
  20. package/dist/conversation/{convert.js → mlbMessageAgentMessageConverter.js} +95 -113
  21. package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -0
  22. package/dist/conversation/readMLBMessages.d.ts +31 -0
  23. package/dist/conversation/readMLBMessages.d.ts.map +1 -0
  24. package/dist/conversation/readMLBMessages.js +90 -0
  25. package/dist/conversation/readMLBMessages.js.map +1 -0
  26. package/dist/conversation/writeMLBMessage.d.ts +64 -0
  27. package/dist/conversation/writeMLBMessage.d.ts.map +1 -0
  28. package/dist/conversation/writeMLBMessage.js +214 -0
  29. package/dist/conversation/writeMLBMessage.js.map +1 -0
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +2 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/mlbClient.d.ts +1 -126
  35. package/dist/mlbClient.d.ts.map +1 -1
  36. package/dist/mlbClient.js +2 -364
  37. package/dist/mlbClient.js.map +1 -1
  38. package/dist/platform/client.d.ts +29 -0
  39. package/dist/platform/client.d.ts.map +1 -0
  40. package/dist/platform/client.js +22 -0
  41. package/dist/platform/client.js.map +1 -0
  42. package/dist/platform/mlbClient.d.ts +133 -0
  43. package/dist/platform/mlbClient.d.ts.map +1 -0
  44. package/dist/platform/mlbClient.js +420 -0
  45. package/dist/platform/mlbClient.js.map +1 -0
  46. package/dist/platform/widgets.d.ts +74 -0
  47. package/dist/platform/widgets.d.ts.map +1 -0
  48. package/dist/platform/widgets.js +85 -0
  49. package/dist/platform/widgets.js.map +1 -0
  50. package/dist/server.d.ts.map +1 -1
  51. package/dist/server.js +8 -4
  52. package/dist/server.js.map +1 -1
  53. package/dist/tools/dataAccess.d.ts +8 -3
  54. package/dist/tools/dataAccess.d.ts.map +1 -1
  55. package/dist/tools/dataAccess.js +33 -5
  56. package/dist/tools/dataAccess.js.map +1 -1
  57. package/dist/tools/registry.d.ts +6 -0
  58. package/dist/tools/registry.d.ts.map +1 -0
  59. package/dist/tools/registry.js +23 -0
  60. package/dist/tools/registry.js.map +1 -0
  61. package/dist/tools/widgets.d.ts +3 -2
  62. package/dist/tools/widgets.d.ts.map +1 -1
  63. package/dist/tools/widgets.js +22 -53
  64. package/dist/tools/widgets.js.map +1 -1
  65. package/dist/types.d.ts +41 -13
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/types.js +3 -3
  68. package/dist/types.js.map +1 -1
  69. package/package.json +4 -3
  70. package/dist/conversation/convert.d.ts +0 -46
  71. package/dist/conversation/convert.d.ts.map +0 -1
  72. package/dist/conversation/convert.js.map +0 -1
  73. package/dist/conversation/presence.d.ts +0 -24
  74. package/dist/conversation/presence.d.ts.map +0 -1
  75. package/dist/conversation/presence.js +0 -56
  76. package/dist/conversation/presence.js.map +0 -1
  77. package/dist/conversation/writeBack.d.ts +0 -36
  78. package/dist/conversation/writeBack.d.ts.map +0 -1
  79. package/dist/conversation/writeBack.js +0 -114
  80. package/dist/conversation/writeBack.js.map +0 -1
@@ -0,0 +1,420 @@
1
+ // 平台 ③ 面的 HTTP 客户端与事件流。
2
+ // 管:拼请求路径与 query、每个请求带 Authorization: Bearer 令牌、解响应体、把非 2xx 分成「拒绝」与「该重试」;
3
+ // GET /internal/v1/events 的 SSE 长连——手工切帧解析、过滤掉心跳与 welcome / data-access、校验 convoKey、断线退避重连。
4
+ // 不管:会话纪律(什么时候拉、拉到怎么办)、消息形状转换、幂等键分配、模型调用——那些在 conversation/ 目录 / model.ts。
5
+ import { WidgetClient } from "./widgets.js";
6
+ import { errorText } from "../log.js";
7
+ /** 除事件流以外的请求都限时 30 秒:卡死的请求超时后按网络错误处理,调用方决定重不重发 */
8
+ const REQUEST_TIMEOUT_MS = 30_000;
9
+ export const MAX_DATASETS_PER_QUERY = 8;
10
+ export const MAX_DATA_ACCESS_RESPONSE_BYTES = 512 * 1024;
11
+ /** 会话键:p_ 私聊、g_ 群,后面 24 位十六进制 */
12
+ const CONVO_KEY = /^[gp]_[0-9a-f]{24}$/;
13
+ /** 事件流重连退避:1 秒起步,每次翻倍,封顶 30 秒,再加 0–500 毫秒抖动 */
14
+ const RETRY_MIN_MS = 1_000;
15
+ const RETRY_MAX_MS = 30_000;
16
+ const RETRY_JITTER_MS = 500;
17
+ function baseUrlOf(gatewayUrl) {
18
+ return `${gatewayUrl.replace(/\/+$/, "")}/internal/v1`;
19
+ }
20
+ /** 不向模型暴露服务端原文、凭据或临时媒体地址。写入失败不自动重试。 */
21
+ export class PlatformRequestError extends Error {
22
+ status;
23
+ constructor(status) {
24
+ super(status === undefined ? "平台请求未完成,请查询最新状态后再操作" : `平台请求失败(HTTP ${status}),请查询最新状态后再操作`);
25
+ this.name = "PlatformRequestError";
26
+ this.status = status;
27
+ }
28
+ }
29
+ export class MLBClient {
30
+ base;
31
+ token;
32
+ log;
33
+ constructor(options) {
34
+ this.base = baseUrlOf(options.gatewayUrl);
35
+ this.token = options.token;
36
+ this.log = options.log;
37
+ }
38
+ /**
39
+ * GET /internal/v1/messages?convoKey=&after=&limit=。after 为平台消息时间(毫秒),不是 seq。
40
+ * 网络错误与非 2xx 都 throw,交给调用方等下次通知再拉;2xx 原样回响应体:messages 里图片记录带图片内容,hasMore 说这一页之外还有没有;
41
+ * 上下文是流内 type=context 的平台消息。
42
+ */
43
+ async pullMessages(convoKey, after, limit = 200) {
44
+ const query = new URLSearchParams({ convoKey, after: String(after), limit: String(limit) });
45
+ const reply = await this.call("GET", `/messages?${query}`);
46
+ if (!reply.ok)
47
+ throw new Error(`GET /internal/v1/messages 回 ${reply.status}:${reply.text}`);
48
+ return JSON.parse(reply.text);
49
+ }
50
+ /**
51
+ * POST /internal/v1/messages { convoKey, messages }。
52
+ * 2xx → delivered;4xx → rejected(带 status 与响应体,调用方丢弃);网络错误 / 5xx → throw(调用方带同一幂等键重发)。
53
+ */
54
+ async writeMessages(convoKey, messages) {
55
+ const reply = await this.call("POST", "/messages", { convoKey, messages });
56
+ if (reply.ok)
57
+ return { kind: "delivered", timestamps: timestampsOf(reply.text) };
58
+ if (reply.status >= 400 && reply.status < 500)
59
+ return { kind: "rejected", status: reply.status, body: reply.text };
60
+ throw new Error(`POST /internal/v1/messages 回 ${reply.status}:${reply.text}`);
61
+ }
62
+ async push(convoKey, event, data) {
63
+ try {
64
+ const reply = await this.call("POST", "/push", { convoKey, event, data });
65
+ if (!reply.ok)
66
+ this.log.warn("POST /internal/v1/push 非 2xx", { convoKey, event, status: reply.status, body: reply.text });
67
+ }
68
+ catch (e) {
69
+ this.log.warn("POST /internal/v1/push 失败", { convoKey, event, error: errorText(e) });
70
+ }
71
+ }
72
+ /** GET /internal/v1/widget-types → types 数组。非 2xx、网络错误、响应体解析不了都回 [] 并记 warn */
73
+ async widgetTypes() {
74
+ try {
75
+ const reply = await this.call("GET", "/widget-types");
76
+ if (!reply.ok) {
77
+ this.log.warn("GET /internal/v1/widget-types 非 2xx", { status: reply.status, body: reply.text });
78
+ return [];
79
+ }
80
+ const body = JSON.parse(reply.text);
81
+ if (!Array.isArray(body.types)) {
82
+ this.log.warn("GET /internal/v1/widget-types 响应体里没有 types 数组", { body: reply.text });
83
+ return [];
84
+ }
85
+ return body.types;
86
+ }
87
+ catch (e) {
88
+ this.log.warn("GET /internal/v1/widget-types 失败", { error: errorText(e) });
89
+ return [];
90
+ }
91
+ }
92
+ /** 共用会话级 Client;业务工具和通用工具均经此处执行平台协议。 */
93
+ widgets(convoKey, options = {}) {
94
+ return new WidgetClient({ ...options, convoKey, request: (method, path, body, request) => this.widgetRequest(method, path, body, request) });
95
+ }
96
+ async widgetRequest(method, path, body, options) {
97
+ const signal = AbortSignal.any([AbortSignal.timeout(REQUEST_TIMEOUT_MS), ...(options?.signal ? [options.signal] : [])]);
98
+ try {
99
+ signal.throwIfAborted();
100
+ const response = await fetch(`${this.base}${path}`, {
101
+ method, headers: { Authorization: `Bearer ${this.token}`, "Content-Type": "application/json" },
102
+ body: body === undefined ? undefined : JSON.stringify(body), signal, redirect: "error",
103
+ });
104
+ if (!response.ok) {
105
+ await response.body?.cancel();
106
+ throw new PlatformRequestError(response.status);
107
+ }
108
+ const bytes = await readLimited(response, 4 * 1024 * 1024);
109
+ signal.throwIfAborted();
110
+ return JSON.parse(Buffer.from(bytes).toString("utf8"));
111
+ }
112
+ catch (error) {
113
+ options?.signal?.throwIfAborted();
114
+ throw error instanceof PlatformRequestError ? error : new PlatformRequestError();
115
+ }
116
+ }
117
+ // 内部旧路径兼容,路由和范围组装只在 WidgetClient 中实现。
118
+ widgetCreate(convoKey, type, title) {
119
+ return this.widgetReply(() => this.widgets(convoKey).create({ type, title }));
120
+ }
121
+ widgetWrite(convoKey, widgetId, module, recordId, data) {
122
+ return this.widgetReply(() => this.widgets(convoKey).write(widgetId, { module, recordId, data: data }));
123
+ }
124
+ widgetRead(convoKey, widgetId, module) {
125
+ return this.widgetReply(() => module === undefined ? this.widgets(convoKey).read(widgetId) : this.widgets(convoKey).readModule(widgetId, module));
126
+ }
127
+ widgetDelete(convoKey, widgetId, module, recordId) {
128
+ return this.widgetReply(() => this.widgets(convoKey).deleteRecord(widgetId, module, recordId));
129
+ }
130
+ async widgetReply(operation) {
131
+ try {
132
+ return { ok: true, body: await operation() };
133
+ }
134
+ catch (error) {
135
+ return { ok: false, error: errorText(error) };
136
+ }
137
+ }
138
+ /** GET /internal/v1/memory?convoKey= → entries(全量,按 key 字典序)。会话键作废时平台回空表 */
139
+ async memoryList(convoKey, signal) {
140
+ const body = (await this.memoryCall("GET", `/memory?${new URLSearchParams({ convoKey })}`, undefined, signal));
141
+ return body.entries;
142
+ }
143
+ /** PUT /internal/v1/memory/:key { convoKey, text }:覆盖写一条(后写赢) */
144
+ async memoryWrite(convoKey, key, text, signal) {
145
+ await this.memoryCall("PUT", `/memory/${seg(key)}`, { convoKey, text }, signal);
146
+ }
147
+ /** DELETE /internal/v1/memory/:key?convoKey=:删一条,删不存在的也回 ok */
148
+ async memoryDelete(convoKey, key, signal) {
149
+ await this.memoryCall("DELETE", `/memory/${seg(key)}?${new URLSearchParams({ convoKey })}`, undefined, signal);
150
+ }
151
+ /**
152
+ * POST /internal/v1/data-access/query:按当前会话读取用户已授权的 Dataset。
153
+ * 私聊不传 memberId;群聊传消息前缀里的稳定 memberId。非 2xx、坏 JSON 或响应缺 datasets 都 throw。
154
+ */
155
+ async queryDataAccess(convoKey, datasets, memberId, signal) {
156
+ const unique = [...new Set(datasets)];
157
+ if (unique.length === 0)
158
+ throw new Error("DataAccess 至少需要一个 Dataset");
159
+ if (unique.length > MAX_DATASETS_PER_QUERY)
160
+ throw new Error(`DataAccess 一次最多查询 ${MAX_DATASETS_PER_QUERY} 个 Dataset`);
161
+ const body = { convoKey, datasets: unique };
162
+ if (memberId !== undefined)
163
+ body.memberId = memberId;
164
+ const reply = await this.call("POST", "/data-access/query", body, signal);
165
+ if (!reply.ok)
166
+ throw new Error(errorOf(reply));
167
+ if (Buffer.byteLength(reply.text, "utf8") > MAX_DATA_ACCESS_RESPONSE_BYTES) {
168
+ throw new Error(`DataAccess 响应超过 ${MAX_DATA_ACCESS_RESPONSE_BYTES} 字节,请减少 Dataset 后重试`);
169
+ }
170
+ let parsed;
171
+ try {
172
+ parsed = JSON.parse(reply.text);
173
+ }
174
+ catch {
175
+ throw new Error("DataAccess 响应体不是 JSON");
176
+ }
177
+ const result = typeof parsed === "object" && parsed !== null ? parsed.datasets : undefined;
178
+ if (!Array.isArray(result))
179
+ throw new Error("DataAccess 响应体里没有 datasets 数组");
180
+ return result;
181
+ }
182
+ /** GET /internal/v1/data-access/requirements:当前搭子声明的 Dataset;失败由调用方决定是否降级。 */
183
+ async dataRequirements() {
184
+ const reply = await this.call("GET", "/data-access/requirements");
185
+ if (!reply.ok)
186
+ throw new Error(errorOf(reply));
187
+ const parsed = JSON.parse(reply.text);
188
+ if (!Array.isArray(parsed.datasets))
189
+ throw new Error("DataAccess 声明响应体里没有 datasets 数组");
190
+ return parsed.datasets;
191
+ }
192
+ /** memory 接口共用:2xx 回解析后的响应体;非 2xx throw 平台错误体的 error 字段(超配额、key 不合法都在这);网络错误、超时原样 throw */
193
+ async memoryCall(method, path, body, signal) {
194
+ const reply = await this.call(method, path, body, signal);
195
+ if (!reply.ok)
196
+ throw new Error(errorOf(reply));
197
+ return JSON.parse(reply.text);
198
+ }
199
+ /** 发一个请求并把响应体读完。网络错误、超时直接 throw;HTTP 状态不在这里判 */
200
+ async call(method, path, body, signal) {
201
+ const headers = { Authorization: `Bearer ${this.token}` };
202
+ if (body !== undefined)
203
+ headers["Content-Type"] = "application/json";
204
+ const res = await fetch(`${this.base}${path}`, {
205
+ method,
206
+ headers,
207
+ body: body === undefined ? undefined : JSON.stringify(body),
208
+ signal: AbortSignal.any([AbortSignal.timeout(REQUEST_TIMEOUT_MS), ...(signal ? [signal] : [])]),
209
+ redirect: "error",
210
+ });
211
+ const text = await res.text();
212
+ return { status: res.status, ok: res.ok, text };
213
+ }
214
+ }
215
+ function timestampsOf(text) {
216
+ try {
217
+ const parsed = JSON.parse(text);
218
+ return Array.isArray(parsed.timestamps) ? parsed.timestamps.filter((t) => typeof t === "number") : [];
219
+ }
220
+ catch {
221
+ return [];
222
+ }
223
+ }
224
+ function seg(value) {
225
+ return encodeURIComponent(value);
226
+ }
227
+ /** 读完响应体,超过 limit 字节就中止并 throw */
228
+ async function readLimited(response, limit) {
229
+ if (!response.body || Number(response.headers.get("content-length") || 0) > limit) {
230
+ await response.body?.cancel();
231
+ throw new Error(`响应超过 ${limit} 字节`);
232
+ }
233
+ const reader = response.body.getReader();
234
+ const chunks = [];
235
+ let size = 0;
236
+ try {
237
+ for (;;) {
238
+ const { done, value } = await reader.read();
239
+ if (done)
240
+ break;
241
+ size += value.length;
242
+ if (size > limit)
243
+ throw new Error(`响应超过 ${limit} 字节`);
244
+ chunks.push(value);
245
+ }
246
+ }
247
+ finally {
248
+ await reader.cancel().catch(() => { });
249
+ reader.releaseLock();
250
+ }
251
+ return Buffer.concat(chunks);
252
+ }
253
+ /** 非 2xx 的错误文案:取平台错误体的 error 字段;错误体不是 JSON 或没有这个字段,退回状态码加原文 */
254
+ function errorOf(reply) {
255
+ try {
256
+ const parsed = JSON.parse(reply.text);
257
+ if (typeof parsed.error === "string")
258
+ return parsed.error;
259
+ }
260
+ catch {
261
+ // 错误体不是 JSON,下面退回用原文
262
+ }
263
+ return `HTTP ${reply.status}${reply.text === "" ? "" : `:${reply.text}`}`;
264
+ }
265
+ export class EventStream {
266
+ includeWelcome;
267
+ base;
268
+ token;
269
+ log;
270
+ onEvent;
271
+ run;
272
+ constructor(options) {
273
+ this.includeWelcome = options.includeWelcome === true;
274
+ this.base = baseUrlOf(options.gatewayUrl);
275
+ this.token = options.token;
276
+ this.log = options.log;
277
+ this.onEvent = options.onEvent;
278
+ }
279
+ /** 连上 GET /internal/v1/events 并一直保持;已经在跑就不重复起。不会 throw,连不上在后台退避重连 */
280
+ start() {
281
+ if (this.run !== undefined)
282
+ return;
283
+ const run = { stopped: false, controller: new AbortController() };
284
+ this.run = run;
285
+ void this.loop(run);
286
+ }
287
+ /** 断开当前连接、取消等待中的重连,之后不再连。再调 start() 会重新起一轮 */
288
+ stop() {
289
+ const run = this.run;
290
+ if (run === undefined)
291
+ return;
292
+ this.run = undefined;
293
+ run.stopped = true;
294
+ run.controller.abort();
295
+ }
296
+ /**
297
+ * 连接循环:连上就一直读,读到服务端关流或出错就按退避等一会再连。
298
+ * 退避只针对「连不上」:这次连上过(流打开了)的,不论后来怎么断,下次都从 1 秒重新算——
299
+ * 健康连接被服务端掐掉(网关重启、顶号)不该被当成连不上而越等越久。
300
+ */
301
+ async loop(run) {
302
+ let delay = RETRY_MIN_MS;
303
+ while (!run.stopped) {
304
+ const attempt = { opened: false };
305
+ try {
306
+ await this.connectOnce(run, attempt);
307
+ if (run.stopped)
308
+ return;
309
+ this.log.warn("事件流被服务端关闭,准备重连", { delayMs: attempt.opened ? RETRY_MIN_MS : delay });
310
+ }
311
+ catch (e) {
312
+ if (run.stopped)
313
+ return;
314
+ this.log.warn("事件流断开,准备重连", { delayMs: attempt.opened ? RETRY_MIN_MS : delay, error: errorText(e) });
315
+ }
316
+ if (attempt.opened)
317
+ delay = RETRY_MIN_MS;
318
+ await sleep(delay + Math.floor(Math.random() * RETRY_JITTER_MS), run.controller.signal);
319
+ delay = Math.min(delay * 2, RETRY_MAX_MS);
320
+ }
321
+ }
322
+ /** 连一次并读到流结束。流一打开就把 attempt.opened 置真;非 2xx、网络错误、被 abort 都 throw */
323
+ async connectOnce(run, attempt) {
324
+ const res = await fetch(`${this.base}/events`, {
325
+ headers: { Authorization: `Bearer ${this.token}`, Accept: "text/event-stream" },
326
+ signal: run.controller.signal,
327
+ });
328
+ if (!res.ok || res.body === null) {
329
+ const text = await res.text().catch(() => "");
330
+ throw new Error(`GET /internal/v1/events 回 ${res.status}:${text}`);
331
+ }
332
+ attempt.opened = true;
333
+ this.log.info("事件流已连上");
334
+ const reader = res.body.getReader();
335
+ const decoder = new TextDecoder();
336
+ let buffer = "";
337
+ for (;;) {
338
+ const { value, done } = await reader.read();
339
+ if (done)
340
+ return;
341
+ // 帧之间以空行分隔;把 \r\n 统一成 \n 后按 \n\n 切,切不下来的半截留在 buffer 等下一块
342
+ buffer = (buffer + decoder.decode(value, { stream: true })).replace(/\r\n/g, "\n");
343
+ let cut = buffer.indexOf("\n\n");
344
+ while (cut !== -1) {
345
+ const frame = buffer.slice(0, cut);
346
+ buffer = buffer.slice(cut + 2);
347
+ if (run.stopped)
348
+ return;
349
+ this.handleFrame(frame);
350
+ cut = buffer.indexOf("\n\n");
351
+ }
352
+ }
353
+ }
354
+ /**
355
+ * 解一帧:取 event: 与 data: 行(多行 data 用 \n 拼),其余字段和 : 开头的注释行不管。
356
+ * 没有 data 的帧不算事件;ping / welcome / data-access 丢掉;只把 message / delete 分发出去,且 convoKey 必须合法。
357
+ */
358
+ handleFrame(frame) {
359
+ // SSE 规定没写 event: 行时事件名就是 message
360
+ let name = "message";
361
+ const data = [];
362
+ for (const line of frame.split("\n")) {
363
+ if (line === "" || line.startsWith(":"))
364
+ continue;
365
+ const colon = line.indexOf(":");
366
+ const field = colon === -1 ? line : line.slice(0, colon);
367
+ let value = colon === -1 ? "" : line.slice(colon + 1);
368
+ if (value.startsWith(" "))
369
+ value = value.slice(1);
370
+ if (field === "event")
371
+ name = value;
372
+ else if (field === "data")
373
+ data.push(value);
374
+ }
375
+ if (data.length === 0)
376
+ return;
377
+ if (name === "ping" || (name === "welcome" && !this.includeWelcome) || name === "data-access")
378
+ return;
379
+ if (name !== "message" && name !== "delete" && name !== "welcome") {
380
+ this.log.warn("事件流收到不认识的事件,丢弃", { event: name });
381
+ return;
382
+ }
383
+ let payload;
384
+ try {
385
+ payload = JSON.parse(data.join("\n"));
386
+ }
387
+ catch {
388
+ this.log.warn("事件的 data 不是 JSON,丢弃", { event: name, data: data.join("\n") });
389
+ return;
390
+ }
391
+ const convoKey = typeof payload === "object" && payload !== null ? payload.convoKey : undefined;
392
+ if (typeof convoKey !== "string" || !CONVO_KEY.test(convoKey)) {
393
+ this.log.warn("事件里的 convoKey 不合法,丢弃", { event: name, convoKey });
394
+ return;
395
+ }
396
+ try {
397
+ this.onEvent({ type: name, convoKey });
398
+ }
399
+ catch (e) {
400
+ this.log.warn("onEvent 抛错", { event: name, convoKey, error: errorText(e) });
401
+ }
402
+ }
403
+ }
404
+ /** 等 ms 毫秒;signal 触发就提前返回(不 reject) */
405
+ function sleep(ms, signal) {
406
+ return new Promise((resolve) => {
407
+ if (signal.aborted) {
408
+ resolve();
409
+ return;
410
+ }
411
+ const finish = () => {
412
+ clearTimeout(timer);
413
+ signal.removeEventListener("abort", finish);
414
+ resolve();
415
+ };
416
+ const timer = setTimeout(finish, ms);
417
+ signal.addEventListener("abort", finish, { once: true });
418
+ });
419
+ }
420
+ //# sourceMappingURL=mlbClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlbClient.js","sourceRoot":"","sources":["../../src/platform/mlbClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { MLBMessageToWrite } from "../types.ts";
2
+ export interface RequestOptions {
3
+ signal?: AbortSignal;
4
+ }
5
+ export type PlatformRequest = <T>(method: string, path: string, body?: unknown, options?: RequestOptions) => Promise<T>;
6
+ export interface WidgetSummary {
7
+ id: string;
8
+ type: string;
9
+ title: string;
10
+ updatedAt?: number;
11
+ }
12
+ export interface WidgetRecord<T = Record<string, unknown>> {
13
+ id: string;
14
+ data: T;
15
+ revision: number;
16
+ }
17
+ export interface Widget<T = Record<string, unknown>> extends WidgetSummary {
18
+ modules: Record<string, WidgetRecord<T>[]>;
19
+ }
20
+ export interface WidgetWriteResult {
21
+ ok: boolean;
22
+ revision?: number;
23
+ }
24
+ export interface WidgetCreateInput {
25
+ type: string;
26
+ title: string;
27
+ idempotencyKey?: string;
28
+ }
29
+ export interface WidgetWriteInput {
30
+ module: string;
31
+ recordId: string;
32
+ data: Record<string, unknown>;
33
+ expectedRevision?: number;
34
+ }
35
+ export interface WidgetPresentation {
36
+ summary: string;
37
+ imageMediaId: string;
38
+ }
39
+ export interface WidgetClientOptions {
40
+ convoKey: string;
41
+ request: PlatformRequest;
42
+ signal?: AbortSignal;
43
+ /** 注入 Runtime 的可靠消息队列;Client 不自行另开消息发送通道。 */
44
+ enqueueMessage?: (message: MLBMessageToWrite & {
45
+ idempotencyKey: string;
46
+ }) => void;
47
+ }
48
+ export declare class WidgetClient {
49
+ private readonly options;
50
+ constructor(options: WidgetClientOptions);
51
+ /** 派生本次操作的取消范围,保留原会话取消信号。 */
52
+ withSignal(signal?: AbortSignal): WidgetClient;
53
+ private signal;
54
+ private call;
55
+ list(options?: RequestOptions): Promise<WidgetSummary[]>;
56
+ create(input: WidgetCreateInput, options?: RequestOptions): Promise<{
57
+ id: string;
58
+ }>;
59
+ read<T = Record<string, unknown>>(id: string, options?: RequestOptions): Promise<Widget<T>>;
60
+ readModule<T = Record<string, unknown>>(id: string, module: string, options?: RequestOptions): Promise<{
61
+ records: WidgetRecord<T>[];
62
+ }>;
63
+ private mutation;
64
+ rename(id: string, title: string, options?: RequestOptions): Promise<WidgetWriteResult>;
65
+ write(id: string, input: WidgetWriteInput, options?: RequestOptions): Promise<WidgetWriteResult>;
66
+ deleteRecord(id: string, module: string, recordId: string, options?: RequestOptions): Promise<WidgetWriteResult>;
67
+ setPresentation(id: string, input: WidgetPresentation, options?: RequestOptions): Promise<WidgetWriteResult>;
68
+ /** 入队,不等同于平台已确认送达;复用 Runtime 的幂等/重试/恢复机制。 */
69
+ send(id: string, options: {
70
+ idempotencyKey: string;
71
+ signal?: AbortSignal;
72
+ }): void;
73
+ }
74
+ //# sourceMappingURL=widgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.d.ts","sourceRoot":"","sources":["../../src/platform/widgets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ function segment(value) {
2
+ if (typeof value !== "string" || !value || value === "." || value === "..")
3
+ throw new Error("Widget 标识无效");
4
+ return encodeURIComponent(value);
5
+ }
6
+ export class WidgetClient {
7
+ options;
8
+ constructor(options) {
9
+ if (!/^[pg]_[0-9a-f]{24}$/.test(options.convoKey))
10
+ throw new Error("会话键无效");
11
+ this.options = { ...options };
12
+ }
13
+ /** 派生本次操作的取消范围,保留原会话取消信号。 */
14
+ withSignal(signal) {
15
+ return new WidgetClient({ ...this.options, signal: this.signal(signal) });
16
+ }
17
+ signal(signal) {
18
+ return AbortSignal.any([...(this.options.signal ? [this.options.signal] : []), ...(signal ? [signal] : [])]);
19
+ }
20
+ async call(method, path, body, options) {
21
+ const signal = this.signal(options?.signal);
22
+ signal.throwIfAborted();
23
+ const scope = { convoKey: this.options.convoKey };
24
+ const result = await this.options.request(method, body === undefined ? `${path}?${new URLSearchParams(scope)}` : path, body === undefined ? undefined : { ...body, ...scope }, { signal });
25
+ signal.throwIfAborted();
26
+ return result;
27
+ }
28
+ async list(options) {
29
+ const body = await this.call("GET", "/widgets", undefined, options);
30
+ if (!Array.isArray(body?.widgets))
31
+ throw new Error("Widget 列表响应无效");
32
+ return body.widgets;
33
+ }
34
+ async create(input, options) {
35
+ const result = await this.call("POST", "/widgets", {
36
+ type: input.type, title: input.title, ...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}),
37
+ }, options);
38
+ if (typeof result?.id !== "string" || !result.id)
39
+ throw new Error("Widget 未创建:会话无效或响应缺少 id");
40
+ return result;
41
+ }
42
+ read(id, options) {
43
+ return this.call("GET", `/widgets/${segment(id)}`, undefined, options).then(widget => {
44
+ if (!widget || widget.id !== id || typeof widget.type !== "string" || !widget.modules || typeof widget.modules !== "object" || Array.isArray(widget.modules))
45
+ throw new Error("Widget 读取响应无效");
46
+ return widget;
47
+ });
48
+ }
49
+ readModule(id, module, options) {
50
+ return this.call("GET", `/widgets/${segment(id)}/${segment(module)}`, undefined, options).then(body => {
51
+ if (!Array.isArray(body?.records))
52
+ throw new Error("Widget 模块响应无效");
53
+ return body;
54
+ });
55
+ }
56
+ async mutation(method, path, body, options) {
57
+ const result = await this.call(method, path, body, options);
58
+ if (result?.ok !== true)
59
+ throw new Error("Widget 操作未被平台确认");
60
+ return result;
61
+ }
62
+ rename(id, title, options) {
63
+ return this.mutation("PUT", `/widgets/${segment(id)}`, { title }, options);
64
+ }
65
+ write(id, input, options) {
66
+ return this.mutation("PUT", `/widgets/${segment(id)}/${segment(input.module)}/${segment(input.recordId)}`, {
67
+ data: input.data, ...(input.expectedRevision === undefined ? {} : { expectedRevision: input.expectedRevision }),
68
+ }, options);
69
+ }
70
+ deleteRecord(id, module, recordId, options) {
71
+ return this.mutation("DELETE", `/widgets/${segment(id)}/${segment(module)}/${segment(recordId)}`, undefined, options);
72
+ }
73
+ setPresentation(id, input, options) {
74
+ return this.mutation("PUT", `/widgets/${segment(id)}/presentation`, { summary: input.summary, imageMediaId: input.imageMediaId }, options);
75
+ }
76
+ /** 入队,不等同于平台已确认送达;复用 Runtime 的幂等/重试/恢复机制。 */
77
+ send(id, options) {
78
+ this.signal(options.signal).throwIfAborted();
79
+ segment(id);
80
+ if (!options.idempotencyKey || !this.options.enqueueMessage)
81
+ throw new Error("缺少 Widget 发送队列或幂等键");
82
+ this.options.enqueueMessage({ type: "widget", widget: { id }, idempotencyKey: options.idempotencyKey });
83
+ }
84
+ }
85
+ //# sourceMappingURL=widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../src/platform/widgets.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAc,iBAAiB,EAAmB,YAAY,EAAE,MAAM,YAAY,CAAC;AAoC/F,qBAAa,WAAW;IACvB,iDAAiD;WACpC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAkGrE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAc,iBAAiB,EAAmB,YAAY,EAAE,MAAM,YAAY,CAAC;AAoC/F,qBAAa,WAAW;IACvB,iDAAiD;WACpC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAqGrE"}