@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
package/dist/mlbClient.js CHANGED
@@ -1,365 +1,3 @@
1
- // 平台 面的 HTTP 客户端与事件流。
2
- // 管:拼请求路径与 query、每个请求带 Authorization: Bearer 令牌、解响应体、把非 2xx 分成「拒绝」与「该重试」;
3
- // GET /internal/v1/events 的 SSE 长连——手工切帧解析、过滤掉心跳与 welcome / data-access、校验 convoKey、断线退避重连。
4
- // 不管:会话纪律(什么时候拉、拉到怎么办)、消息形状转换、幂等键分配、模型调用——那些在 conversation/ 目录 / model.ts。
5
- import { errorText } from "./log.js";
6
- /** 除事件流以外的请求都限时 30 秒:卡死的请求超时后按网络错误处理,调用方决定重不重发 */
7
- const REQUEST_TIMEOUT_MS = 30_000;
8
- export const MAX_DATASETS_PER_QUERY = 8;
9
- export const MAX_DATA_ACCESS_RESPONSE_BYTES = 512 * 1024;
10
- /** 会话键:p_ 私聊、g_ 群,后面 24 位十六进制 */
11
- const CONVO_KEY = /^[gp]_[0-9a-f]{24}$/;
12
- /** 事件流重连退避:1 秒起步,每次翻倍,封顶 30 秒,再加 0–500 毫秒抖动 */
13
- const RETRY_MIN_MS = 1_000;
14
- const RETRY_MAX_MS = 30_000;
15
- const RETRY_JITTER_MS = 500;
16
- function baseUrlOf(gatewayUrl) {
17
- return `${gatewayUrl.replace(/\/+$/, "")}/internal/v1`;
18
- }
19
- export class MLBClient {
20
- base;
21
- token;
22
- log;
23
- constructor(options) {
24
- this.base = baseUrlOf(options.gatewayUrl);
25
- this.token = options.token;
26
- this.log = options.log;
27
- }
28
- /**
29
- * GET /internal/v1/messages?convoKey=&after=&limit=。
30
- * 网络错误与非 2xx 都 throw,交给调用方等下次通知再拉;2xx 原样回响应体。
31
- */
32
- async pullMessages(convoKey, after, limit = 200) {
33
- const query = new URLSearchParams({ convoKey, after: String(after), limit: String(limit) });
34
- const reply = await this.call("GET", `/messages?${query}`);
35
- if (!reply.ok)
36
- throw new Error(`GET /internal/v1/messages 回 ${reply.status}:${reply.text}`);
37
- return JSON.parse(reply.text);
38
- }
39
- /**
40
- * POST /internal/v1/messages { convoKey, messages }。
41
- * 2xx → delivered;4xx → rejected(带 status 与响应体,调用方丢弃);网络错误 / 5xx → throw(调用方带同一幂等键重发)。
42
- */
43
- async writeMessages(convoKey, messages) {
44
- const reply = await this.call("POST", "/messages", { convoKey, messages });
45
- if (reply.ok)
46
- return { kind: "delivered" };
47
- if (reply.status >= 400 && reply.status < 500)
48
- return { kind: "rejected", status: reply.status, body: reply.text };
49
- throw new Error(`POST /internal/v1/messages 回 ${reply.status}:${reply.text}`);
50
- }
51
- async push(convoKey, event, data) {
52
- try {
53
- const reply = await this.call("POST", "/push", { convoKey, event, data });
54
- if (!reply.ok)
55
- this.log.warn("POST /internal/v1/push 非 2xx", { convoKey, event, status: reply.status, body: reply.text });
56
- }
57
- catch (e) {
58
- this.log.warn("POST /internal/v1/push 失败", { convoKey, event, error: errorText(e) });
59
- }
60
- }
61
- /** GET /internal/v1/widget-types → types 数组。非 2xx、网络错误、响应体解析不了都回 [] 并记 warn */
62
- async widgetTypes() {
63
- try {
64
- const reply = await this.call("GET", "/widget-types");
65
- if (!reply.ok) {
66
- this.log.warn("GET /internal/v1/widget-types 非 2xx", { status: reply.status, body: reply.text });
67
- return [];
68
- }
69
- const body = JSON.parse(reply.text);
70
- if (!Array.isArray(body.types)) {
71
- this.log.warn("GET /internal/v1/widget-types 响应体里没有 types 数组", { body: reply.text });
72
- return [];
73
- }
74
- return body.types;
75
- }
76
- catch (e) {
77
- this.log.warn("GET /internal/v1/widget-types 失败", { error: errorText(e) });
78
- return [];
79
- }
80
- }
81
- /** POST /internal/v1/widgets { convoKey, type, title } → { id } */
82
- widgetCreate(convoKey, type, title) {
83
- return this.widgetCall("POST", "/widgets", { convoKey, type, title });
84
- }
85
- /** PUT /internal/v1/widgets/:widgetId/:module/:recordId { convoKey, data } → { ok, revision } */
86
- widgetWrite(convoKey, widgetId, module, recordId, data) {
87
- return this.widgetCall("PUT", `/widgets/${seg(widgetId)}/${seg(module)}/${seg(recordId)}`, { convoKey, data });
88
- }
89
- /**
90
- * 不带 module:GET /internal/v1/widgets/:widgetId?convoKey= → 整个 widget(含各模块记录);
91
- * 带 module:GET /internal/v1/widgets/:widgetId/:module?convoKey= → { records }
92
- */
93
- widgetRead(convoKey, widgetId, module) {
94
- const path = module === undefined ? `/widgets/${seg(widgetId)}` : `/widgets/${seg(widgetId)}/${seg(module)}`;
95
- return this.widgetCall("GET", `${path}?${new URLSearchParams({ convoKey })}`);
96
- }
97
- /** DELETE /internal/v1/widgets/:widgetId/:module/:recordId?convoKey= → { ok } */
98
- widgetDelete(convoKey, widgetId, module, recordId) {
99
- const path = `/widgets/${seg(widgetId)}/${seg(module)}/${seg(recordId)}`;
100
- return this.widgetCall("DELETE", `${path}?${new URLSearchParams({ convoKey })}`);
101
- }
102
- /** widget 接口共用:2xx 回解析后的响应体;非 2xx 取错误体的 error 字段;网络错误取异常文案。都不 throw,让模型看到原因后改参数重试 */
103
- async widgetCall(method, path, body) {
104
- let reply;
105
- try {
106
- reply = await this.call(method, path, body);
107
- }
108
- catch (e) {
109
- return { ok: false, error: errorText(e) };
110
- }
111
- if (reply.ok) {
112
- try {
113
- return { ok: true, body: reply.text === "" ? undefined : JSON.parse(reply.text) };
114
- }
115
- catch {
116
- return { ok: false, error: `${method} /internal/v1${path} 响应体不是 JSON:${reply.text}` };
117
- }
118
- }
119
- return { ok: false, error: errorOf(reply) };
120
- }
121
- /** GET /internal/v1/memory?convoKey= → entries(全量,按 key 字典序)。会话键作废时平台回空表 */
122
- async memoryList(convoKey) {
123
- const body = (await this.memoryCall("GET", `/memory?${new URLSearchParams({ convoKey })}`));
124
- return body.entries;
125
- }
126
- /** PUT /internal/v1/memory/:key { convoKey, text }:覆盖写一条(后写赢) */
127
- async memoryWrite(convoKey, key, text) {
128
- await this.memoryCall("PUT", `/memory/${seg(key)}`, { convoKey, text });
129
- }
130
- /** DELETE /internal/v1/memory/:key?convoKey=:删一条,删不存在的也回 ok */
131
- async memoryDelete(convoKey, key) {
132
- await this.memoryCall("DELETE", `/memory/${seg(key)}?${new URLSearchParams({ convoKey })}`);
133
- }
134
- /**
135
- * POST /internal/v1/data-access/query:按当前会话读取用户已授权的 Dataset。
136
- * 私聊不传 memberId;群聊传消息前缀里的稳定 memberId。非 2xx、坏 JSON 或响应缺 datasets 都 throw。
137
- */
138
- async queryDataAccess(convoKey, datasets, memberId) {
139
- const unique = [...new Set(datasets)];
140
- if (unique.length === 0)
141
- throw new Error("DataAccess 至少需要一个 Dataset");
142
- if (unique.length > MAX_DATASETS_PER_QUERY)
143
- throw new Error(`DataAccess 一次最多查询 ${MAX_DATASETS_PER_QUERY} 个 Dataset`);
144
- const body = { convoKey, datasets: unique };
145
- if (memberId !== undefined)
146
- body.memberId = memberId;
147
- const reply = await this.call("POST", "/data-access/query", body);
148
- if (!reply.ok)
149
- throw new Error(errorOf(reply));
150
- if (Buffer.byteLength(reply.text, "utf8") > MAX_DATA_ACCESS_RESPONSE_BYTES) {
151
- throw new Error(`DataAccess 响应超过 ${MAX_DATA_ACCESS_RESPONSE_BYTES} 字节,请减少 Dataset 后重试`);
152
- }
153
- let parsed;
154
- try {
155
- parsed = JSON.parse(reply.text);
156
- }
157
- catch {
158
- throw new Error("DataAccess 响应体不是 JSON");
159
- }
160
- const result = typeof parsed === "object" && parsed !== null ? parsed.datasets : undefined;
161
- if (!Array.isArray(result))
162
- throw new Error("DataAccess 响应体里没有 datasets 数组");
163
- return result;
164
- }
165
- /** GET /internal/v1/data-access/requirements:当前搭子声明的 Dataset;失败由调用方决定是否降级。 */
166
- async dataRequirements() {
167
- const reply = await this.call("GET", "/data-access/requirements");
168
- if (!reply.ok)
169
- throw new Error(errorOf(reply));
170
- const parsed = JSON.parse(reply.text);
171
- if (!Array.isArray(parsed.datasets))
172
- throw new Error("DataAccess 声明响应体里没有 datasets 数组");
173
- return parsed.datasets;
174
- }
175
- /** memory 接口共用:2xx 回解析后的响应体;非 2xx throw 平台错误体的 error 字段(超配额、key 不合法都在这);网络错误、超时原样 throw */
176
- async memoryCall(method, path, body) {
177
- const reply = await this.call(method, path, body);
178
- if (!reply.ok)
179
- throw new Error(errorOf(reply));
180
- return JSON.parse(reply.text);
181
- }
182
- /** 发一个请求并把响应体读完。网络错误、超时直接 throw;HTTP 状态不在这里判 */
183
- async call(method, path, body) {
184
- const headers = { Authorization: `Bearer ${this.token}` };
185
- if (body !== undefined)
186
- headers["Content-Type"] = "application/json";
187
- const res = await fetch(`${this.base}${path}`, {
188
- method,
189
- headers,
190
- body: body === undefined ? undefined : JSON.stringify(body),
191
- signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
192
- });
193
- const text = await res.text();
194
- return { status: res.status, ok: res.ok, text };
195
- }
196
- }
197
- function seg(value) {
198
- return encodeURIComponent(value);
199
- }
200
- /** 非 2xx 的错误文案:取平台错误体的 error 字段;错误体不是 JSON 或没有这个字段,退回状态码加原文 */
201
- function errorOf(reply) {
202
- try {
203
- const parsed = JSON.parse(reply.text);
204
- if (typeof parsed.error === "string")
205
- return parsed.error;
206
- }
207
- catch {
208
- // 错误体不是 JSON,下面退回用原文
209
- }
210
- return `HTTP ${reply.status}${reply.text === "" ? "" : `:${reply.text}`}`;
211
- }
212
- export class EventStream {
213
- base;
214
- token;
215
- log;
216
- onEvent;
217
- run;
218
- constructor(options) {
219
- this.base = baseUrlOf(options.gatewayUrl);
220
- this.token = options.token;
221
- this.log = options.log;
222
- this.onEvent = options.onEvent;
223
- }
224
- /** 连上 GET /internal/v1/events 并一直保持;已经在跑就不重复起。不会 throw,连不上在后台退避重连 */
225
- start() {
226
- if (this.run !== undefined)
227
- return;
228
- const run = { stopped: false, controller: new AbortController() };
229
- this.run = run;
230
- void this.loop(run);
231
- }
232
- /** 断开当前连接、取消等待中的重连,之后不再连。再调 start() 会重新起一轮 */
233
- stop() {
234
- const run = this.run;
235
- if (run === undefined)
236
- return;
237
- this.run = undefined;
238
- run.stopped = true;
239
- run.controller.abort();
240
- }
241
- /**
242
- * 连接循环:连上就一直读,读到服务端关流或出错就按退避等一会再连。
243
- * 退避只针对「连不上」:这次连上过(流打开了)的,不论后来怎么断,下次都从 1 秒重新算——
244
- * 健康连接被服务端掐掉(网关重启、顶号)不该被当成连不上而越等越久。
245
- */
246
- async loop(run) {
247
- let delay = RETRY_MIN_MS;
248
- while (!run.stopped) {
249
- const attempt = { opened: false };
250
- try {
251
- await this.connectOnce(run, attempt);
252
- if (run.stopped)
253
- return;
254
- this.log.warn("事件流被服务端关闭,准备重连", { delayMs: attempt.opened ? RETRY_MIN_MS : delay });
255
- }
256
- catch (e) {
257
- if (run.stopped)
258
- return;
259
- this.log.warn("事件流断开,准备重连", { delayMs: attempt.opened ? RETRY_MIN_MS : delay, error: errorText(e) });
260
- }
261
- if (attempt.opened)
262
- delay = RETRY_MIN_MS;
263
- await sleep(delay + Math.floor(Math.random() * RETRY_JITTER_MS), run.controller.signal);
264
- delay = Math.min(delay * 2, RETRY_MAX_MS);
265
- }
266
- }
267
- /** 连一次并读到流结束。流一打开就把 attempt.opened 置真;非 2xx、网络错误、被 abort 都 throw */
268
- async connectOnce(run, attempt) {
269
- const res = await fetch(`${this.base}/events`, {
270
- headers: { Authorization: `Bearer ${this.token}`, Accept: "text/event-stream" },
271
- signal: run.controller.signal,
272
- });
273
- if (!res.ok || res.body === null) {
274
- const text = await res.text().catch(() => "");
275
- throw new Error(`GET /internal/v1/events 回 ${res.status}:${text}`);
276
- }
277
- attempt.opened = true;
278
- this.log.info("事件流已连上");
279
- const reader = res.body.getReader();
280
- const decoder = new TextDecoder();
281
- let buffer = "";
282
- for (;;) {
283
- const { value, done } = await reader.read();
284
- if (done)
285
- return;
286
- // 帧之间以空行分隔;把 \r\n 统一成 \n 后按 \n\n 切,切不下来的半截留在 buffer 等下一块
287
- buffer = (buffer + decoder.decode(value, { stream: true })).replace(/\r\n/g, "\n");
288
- let cut = buffer.indexOf("\n\n");
289
- while (cut !== -1) {
290
- const frame = buffer.slice(0, cut);
291
- buffer = buffer.slice(cut + 2);
292
- if (run.stopped)
293
- return;
294
- this.handleFrame(frame);
295
- cut = buffer.indexOf("\n\n");
296
- }
297
- }
298
- }
299
- /**
300
- * 解一帧:取 event: 与 data: 行(多行 data 用 \n 拼),其余字段和 : 开头的注释行不管。
301
- * 没有 data 的帧不算事件;ping / welcome / data-access 丢掉;只把 message / delete 分发出去,且 convoKey 必须合法。
302
- */
303
- handleFrame(frame) {
304
- // SSE 规定没写 event: 行时事件名就是 message
305
- let name = "message";
306
- const data = [];
307
- for (const line of frame.split("\n")) {
308
- if (line === "" || line.startsWith(":"))
309
- continue;
310
- const colon = line.indexOf(":");
311
- const field = colon === -1 ? line : line.slice(0, colon);
312
- let value = colon === -1 ? "" : line.slice(colon + 1);
313
- if (value.startsWith(" "))
314
- value = value.slice(1);
315
- if (field === "event")
316
- name = value;
317
- else if (field === "data")
318
- data.push(value);
319
- }
320
- if (data.length === 0)
321
- return;
322
- if (name === "ping" || name === "welcome" || name === "data-access")
323
- return;
324
- if (name !== "message" && name !== "delete") {
325
- this.log.warn("事件流收到不认识的事件,丢弃", { event: name });
326
- return;
327
- }
328
- let payload;
329
- try {
330
- payload = JSON.parse(data.join("\n"));
331
- }
332
- catch {
333
- this.log.warn("事件的 data 不是 JSON,丢弃", { event: name, data: data.join("\n") });
334
- return;
335
- }
336
- const convoKey = typeof payload === "object" && payload !== null ? payload.convoKey : undefined;
337
- if (typeof convoKey !== "string" || !CONVO_KEY.test(convoKey)) {
338
- this.log.warn("事件里的 convoKey 不合法,丢弃", { event: name, convoKey });
339
- return;
340
- }
341
- try {
342
- this.onEvent({ type: name, convoKey });
343
- }
344
- catch (e) {
345
- this.log.warn("onEvent 抛错", { event: name, convoKey, error: errorText(e) });
346
- }
347
- }
348
- }
349
- /** 等 ms 毫秒;signal 触发就提前返回(不 reject) */
350
- function sleep(ms, signal) {
351
- return new Promise((resolve) => {
352
- if (signal.aborted) {
353
- resolve();
354
- return;
355
- }
356
- const finish = () => {
357
- clearTimeout(timer);
358
- signal.removeEventListener("abort", finish);
359
- resolve();
360
- };
361
- const timer = setTimeout(finish, ms);
362
- signal.addEventListener("abort", finish, { once: true });
363
- });
364
- }
1
+ // Internal compatibility path. Platform protocol implementation lives in platform/.
2
+ export * from "./platform/mlbClient.js";
365
3
  //# sourceMappingURL=mlbClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mlbClient.js","sourceRoot":"","sources":["../src/mlbClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mlbClient.js","sourceRoot":"","sources":["../src/mlbClient.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { DataAccessQuery, DatasetAccessResult, MemoryEntry, MLBMessageToWrite } from "../types.ts";
2
+ import type { MLBClient } from "./mlbClient.ts";
3
+ import { WidgetClient } from "./widgets.ts";
4
+ /** 应用拿到的是已绑定当前会话的能力,不接触平台 Token,也不重复实现 HTTP。 */
5
+ export interface PlatformClient {
6
+ readonly widgets: WidgetClient;
7
+ readonly messages: {
8
+ send(message: MLBMessageToWrite & {
9
+ idempotencyKey: string;
10
+ }): void;
11
+ };
12
+ readonly memory: {
13
+ list(): Promise<MemoryEntry[]>;
14
+ write(key: string, text: string): Promise<void>;
15
+ delete(key: string): Promise<void>;
16
+ };
17
+ readonly dataAccess: {
18
+ query(request: DataAccessQuery): Promise<DatasetAccessResult[]>;
19
+ };
20
+ }
21
+ export declare function createPlatformClient(options: {
22
+ client: MLBClient;
23
+ key: string;
24
+ signal: AbortSignal;
25
+ enqueueMessage: (message: MLBMessageToWrite) => void;
26
+ /** 注入敏感数据使用追踪;不是绕过 DataAccess 校验的另一条读口。 */
27
+ queryDataAccess: (request: DataAccessQuery) => Promise<DatasetAccessResult[]>;
28
+ }): PlatformClient;
29
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/platform/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG;YAAE,cAAc,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,CAAC;IAC3F,QAAQ,CAAC,MAAM,EAAE;QAChB,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACnC,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE;QAAE,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAA;KAAE,CAAC;CACzF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IACpD,cAAc,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrD,2CAA2C;IAC3C,eAAe,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;CAC9E,GAAG,cAAc,CAkBjB"}
@@ -0,0 +1,22 @@
1
+ import { WidgetClient } from "./widgets.js";
2
+ export function createPlatformClient(options) {
3
+ const { client, key, signal } = options;
4
+ const send = (message) => {
5
+ signal.throwIfAborted();
6
+ if (!message.idempotencyKey)
7
+ throw new Error("消息幂等键不能为空");
8
+ options.enqueueMessage(message);
9
+ };
10
+ let widgets;
11
+ return {
12
+ get widgets() { return widgets ??= client.widgets(key, { signal, enqueueMessage: send }); },
13
+ messages: { send },
14
+ memory: {
15
+ list: () => client.memoryList(key, signal),
16
+ write: (name, text) => client.memoryWrite(key, name, text, signal),
17
+ delete: name => client.memoryDelete(key, name, signal),
18
+ },
19
+ dataAccess: { query: async (request) => { signal.throwIfAborted(); const result = await options.queryDataAccess(request); signal.throwIfAborted(); return result; } },
20
+ };
21
+ }
22
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/platform/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAc5C,MAAM,UAAU,oBAAoB,CAAC,OAKpC;IACA,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACxC,MAAM,IAAI,GAAG,CAAC,OAAuD,EAAQ,EAAE;QAC9E,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1D,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC;IACF,IAAI,OAAiC,CAAC;IACtC,OAAO;QACN,IAAI,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3F,QAAQ,EAAE,EAAE,IAAI,EAAE;QAClB,MAAM,EAAE;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;YAC1C,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;YAClE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;SACtD;QACD,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE;KACnK,CAAC;AACH,CAAC"}
@@ -0,0 +1,133 @@
1
+ import { WidgetClient } from "./widgets.ts";
2
+ import type { WidgetClientOptions } from "./widgets.ts";
3
+ import type { BuddyEvent, BuddyLogger, DataRequirement, DatasetAccessResult, MemoryEntry, MLBMessageToWrite, PullResponse } from "../types.ts";
4
+ export interface MLBClientOptions {
5
+ /** 网关地址,如 http://localhost:8788;末尾带不带斜杠都行 */
6
+ gatewayUrl: string;
7
+ /** 搭子令牌,放进每个请求的 Authorization: Bearer */
8
+ token: string;
9
+ log: BuddyLogger;
10
+ }
11
+ /** 写消息的结果:4xx 是平台明确拒绝(调用方丢弃不重发);网络错误 / 5xx 直接 throw(调用方重发) */
12
+ export type WriteResult = {
13
+ kind: "delivered";
14
+ timestamps: number[];
15
+ } | {
16
+ kind: "rejected";
17
+ status: number;
18
+ body: string;
19
+ };
20
+ /** widget 类型目录里一个模块的声明 */
21
+ export interface WidgetModuleDecl {
22
+ description?: string;
23
+ record?: {
24
+ properties?: Record<string, {
25
+ type?: string;
26
+ description?: string;
27
+ }>;
28
+ required?: string[];
29
+ };
30
+ }
31
+ /** GET /internal/v1/widget-types 回的一个类型 */
32
+ export interface WidgetType {
33
+ id: string;
34
+ description?: string;
35
+ modules?: Record<string, WidgetModuleDecl>;
36
+ }
37
+ /** widget 各接口的结果:ok 时 body 是响应体 JSON;不 ok 时 error 是平台错误体里的 error 字段或网络错误文案 */
38
+ export type WidgetReply = {
39
+ ok: true;
40
+ body: any;
41
+ } | {
42
+ ok: false;
43
+ error: string;
44
+ };
45
+ export declare const MAX_DATASETS_PER_QUERY = 8;
46
+ export declare const MAX_DATA_ACCESS_RESPONSE_BYTES: number;
47
+ /** 不向模型暴露服务端原文、凭据或临时媒体地址。写入失败不自动重试。 */
48
+ export declare class PlatformRequestError extends Error {
49
+ readonly status?: number;
50
+ constructor(status?: number);
51
+ }
52
+ export declare class MLBClient {
53
+ private readonly base;
54
+ private readonly token;
55
+ private readonly log;
56
+ constructor(options: MLBClientOptions);
57
+ /**
58
+ * GET /internal/v1/messages?convoKey=&after=&limit=。after 为平台消息时间(毫秒),不是 seq。
59
+ * 网络错误与非 2xx 都 throw,交给调用方等下次通知再拉;2xx 原样回响应体:messages 里图片记录带图片内容,hasMore 说这一页之外还有没有;
60
+ * 上下文是流内 type=context 的平台消息。
61
+ */
62
+ pullMessages(convoKey: string, after: number, limit?: number): Promise<PullResponse>;
63
+ /**
64
+ * POST /internal/v1/messages { convoKey, messages }。
65
+ * 2xx → delivered;4xx → rejected(带 status 与响应体,调用方丢弃);网络错误 / 5xx → throw(调用方带同一幂等键重发)。
66
+ */
67
+ writeMessages(convoKey: string, messages: MLBMessageToWrite[]): Promise<WriteResult>;
68
+ /** POST /internal/v1/push。只管发,失败(网络错误或非 2xx)只记 warn,不 throw */
69
+ push(convoKey: string, event: "replying", data: {
70
+ on: boolean;
71
+ status?: string;
72
+ }): Promise<void>;
73
+ push(convoKey: string, event: "delta", data: {
74
+ text: string;
75
+ }): Promise<void>;
76
+ /** GET /internal/v1/widget-types → types 数组。非 2xx、网络错误、响应体解析不了都回 [] 并记 warn */
77
+ widgetTypes(): Promise<WidgetType[]>;
78
+ /** 共用会话级 Client;业务工具和通用工具均经此处执行平台协议。 */
79
+ widgets(convoKey: string, options?: Pick<WidgetClientOptions, "signal" | "enqueueMessage">): WidgetClient;
80
+ private widgetRequest;
81
+ widgetCreate(convoKey: string, type: string, title: string): Promise<WidgetReply>;
82
+ widgetWrite(convoKey: string, widgetId: string, module: string, recordId: string, data: unknown): Promise<WidgetReply>;
83
+ widgetRead(convoKey: string, widgetId: string, module?: string): Promise<WidgetReply>;
84
+ widgetDelete(convoKey: string, widgetId: string, module: string, recordId: string): Promise<WidgetReply>;
85
+ private widgetReply;
86
+ /** GET /internal/v1/memory?convoKey= → entries(全量,按 key 字典序)。会话键作废时平台回空表 */
87
+ memoryList(convoKey: string, signal?: AbortSignal): Promise<MemoryEntry[]>;
88
+ /** PUT /internal/v1/memory/:key { convoKey, text }:覆盖写一条(后写赢) */
89
+ memoryWrite(convoKey: string, key: string, text: string, signal?: AbortSignal): Promise<void>;
90
+ /** DELETE /internal/v1/memory/:key?convoKey=:删一条,删不存在的也回 ok */
91
+ memoryDelete(convoKey: string, key: string, signal?: AbortSignal): Promise<void>;
92
+ /**
93
+ * POST /internal/v1/data-access/query:按当前会话读取用户已授权的 Dataset。
94
+ * 私聊不传 memberId;群聊传消息前缀里的稳定 memberId。非 2xx、坏 JSON 或响应缺 datasets 都 throw。
95
+ */
96
+ queryDataAccess(convoKey: string, datasets: string[], memberId?: string, signal?: AbortSignal): Promise<DatasetAccessResult[]>;
97
+ /** GET /internal/v1/data-access/requirements:当前搭子声明的 Dataset;失败由调用方决定是否降级。 */
98
+ dataRequirements(): Promise<DataRequirement[]>;
99
+ /** memory 接口共用:2xx 回解析后的响应体;非 2xx throw 平台错误体的 error 字段(超配额、key 不合法都在这);网络错误、超时原样 throw */
100
+ private memoryCall;
101
+ /** 发一个请求并把响应体读完。网络错误、超时直接 throw;HTTP 状态不在这里判 */
102
+ private call;
103
+ }
104
+ export declare class EventStream {
105
+ private readonly includeWelcome;
106
+ private readonly base;
107
+ private readonly token;
108
+ private readonly log;
109
+ private readonly onEvent;
110
+ private run;
111
+ constructor(options: MLBClientOptions & {
112
+ onEvent: (event: BuddyEvent) => void;
113
+ includeWelcome?: boolean;
114
+ });
115
+ /** 连上 GET /internal/v1/events 并一直保持;已经在跑就不重复起。不会 throw,连不上在后台退避重连 */
116
+ start(): void;
117
+ /** 断开当前连接、取消等待中的重连,之后不再连。再调 start() 会重新起一轮 */
118
+ stop(): void;
119
+ /**
120
+ * 连接循环:连上就一直读,读到服务端关流或出错就按退避等一会再连。
121
+ * 退避只针对「连不上」:这次连上过(流打开了)的,不论后来怎么断,下次都从 1 秒重新算——
122
+ * 健康连接被服务端掐掉(网关重启、顶号)不该被当成连不上而越等越久。
123
+ */
124
+ private loop;
125
+ /** 连一次并读到流结束。流一打开就把 attempt.opened 置真;非 2xx、网络错误、被 abort 都 throw */
126
+ private connectOnce;
127
+ /**
128
+ * 解一帧:取 event: 与 data: 行(多行 data 用 \n 拼),其余字段和 : 开头的注释行不管。
129
+ * 没有 data 的帧不算事件;ping / welcome / data-access 丢掉;只把 message / delete 分发出去,且 convoKey 必须合法。
130
+ */
131
+ private handleFrame;
132
+ }
133
+ //# sourceMappingURL=mlbClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlbClient.d.ts","sourceRoot":"","sources":["../../src/platform/mlbClient.ts"],"names":[],"mappings":"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"}