@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.
- package/README.md +209 -45
- package/dist/conversation/agent.d.ts +6 -1
- package/dist/conversation/agent.d.ts.map +1 -1
- package/dist/conversation/agent.js +60 -53
- package/dist/conversation/agent.js.map +1 -1
- package/dist/conversation/agentMessageLLMMessageConverter.d.ts +8 -0
- package/dist/conversation/agentMessageLLMMessageConverter.d.ts.map +1 -0
- package/dist/conversation/agentMessageLLMMessageConverter.js +24 -0
- package/dist/conversation/agentMessageLLMMessageConverter.js.map +1 -0
- package/dist/conversation/history.d.ts +0 -7
- package/dist/conversation/history.d.ts.map +1 -1
- package/dist/conversation/history.js +3 -16
- package/dist/conversation/history.js.map +1 -1
- package/dist/conversation/index.d.ts +25 -22
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js +141 -116
- package/dist/conversation/index.js.map +1 -1
- package/dist/conversation/mlbMessageAgentMessageConverter.d.ts +39 -0
- package/dist/conversation/mlbMessageAgentMessageConverter.d.ts.map +1 -0
- package/dist/conversation/{convert.js → mlbMessageAgentMessageConverter.js} +95 -113
- package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -0
- package/dist/conversation/readMLBMessages.d.ts +31 -0
- package/dist/conversation/readMLBMessages.d.ts.map +1 -0
- package/dist/conversation/readMLBMessages.js +90 -0
- package/dist/conversation/readMLBMessages.js.map +1 -0
- package/dist/conversation/writeMLBMessage.d.ts +64 -0
- package/dist/conversation/writeMLBMessage.d.ts.map +1 -0
- package/dist/conversation/writeMLBMessage.js +214 -0
- package/dist/conversation/writeMLBMessage.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mlbClient.d.ts +1 -126
- package/dist/mlbClient.d.ts.map +1 -1
- package/dist/mlbClient.js +2 -364
- package/dist/mlbClient.js.map +1 -1
- package/dist/platform/client.d.ts +29 -0
- package/dist/platform/client.d.ts.map +1 -0
- package/dist/platform/client.js +22 -0
- package/dist/platform/client.js.map +1 -0
- package/dist/platform/mlbClient.d.ts +133 -0
- package/dist/platform/mlbClient.d.ts.map +1 -0
- package/dist/platform/mlbClient.js +420 -0
- package/dist/platform/mlbClient.js.map +1 -0
- package/dist/platform/widgets.d.ts +74 -0
- package/dist/platform/widgets.d.ts.map +1 -0
- package/dist/platform/widgets.js +85 -0
- package/dist/platform/widgets.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +8 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/dataAccess.d.ts +8 -3
- package/dist/tools/dataAccess.d.ts.map +1 -1
- package/dist/tools/dataAccess.js +33 -5
- package/dist/tools/dataAccess.js.map +1 -1
- package/dist/tools/registry.d.ts +6 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +23 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/widgets.d.ts +3 -2
- package/dist/tools/widgets.d.ts.map +1 -1
- package/dist/tools/widgets.js +22 -53
- package/dist/tools/widgets.js.map +1 -1
- package/dist/types.d.ts +41 -13
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -3
- package/dist/types.js.map +1 -1
- package/package.json +4 -3
- package/dist/conversation/convert.d.ts +0 -46
- package/dist/conversation/convert.d.ts.map +0 -1
- package/dist/conversation/convert.js.map +0 -1
- package/dist/conversation/presence.d.ts +0 -24
- package/dist/conversation/presence.d.ts.map +0 -1
- package/dist/conversation/presence.js +0 -56
- package/dist/conversation/presence.js.map +0 -1
- package/dist/conversation/writeBack.d.ts +0 -36
- package/dist/conversation/writeBack.d.ts.map +0 -1
- package/dist/conversation/writeBack.js +0 -114
- package/dist/conversation/writeBack.js.map +0 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// 一场会话往平台发的所有东西排在一条队列里按顺序发:「正在回复」开关与工具状态行、生成中的正文碎片(delta)、写回的消息。
|
|
2
|
+
// 为什么一条队列(REDoc《【技术设计】搭子消息的时间与顺序》):平台把搭子消息的时间记成它第一个字到达平台的时刻——
|
|
3
|
+
// 上一次写回之后收到的第一段 delta,由下一条模型消息的写回领走。字和写回排在一条队列里,平台收到的先后就是模型出字的先后;
|
|
4
|
+
// 一条写回在重发,后面的字跟着等,领不错。
|
|
5
|
+
// 管:delta 每 120 毫秒攒一帧,写回与开关之前先把攒着的发掉;入参是 pi 消息,mlbMessageAgentMessageConverter.ts 换成写口 body;入队那一刻分配幂等键(之后重发一字不变);
|
|
6
|
+
// POST /internal/v1/messages 成功后把平台回的时间写进内存里那条消息的 timestamp(回合收尾按它排);4xx 丢弃并 warn(平台明确拒绝,重发没用);
|
|
7
|
+
// 网络错误 / 5xx 留队退避重发(1 秒起步、翻倍、封顶 10 秒);等队列清空;退役时丢掉没发的字与写回、打断重发等待,开关照发(收尾要把三个圆点熄掉)。
|
|
8
|
+
// 不管:什么时候开关、什么时候写(index.ts 按 Agent 事件调这里)、HTTP 请求本身(mlbClient.ts)。
|
|
9
|
+
import { assistantMessageToMLBMessage, noteMessageToMLBMessage, toolStepToMLBMessage } from "./mlbMessageAgentMessageConverter.js";
|
|
10
|
+
import { errorText } from "../log.js";
|
|
11
|
+
/** 生成中的正文碎片攒多久发一帧 delta */
|
|
12
|
+
const DELTA_THROTTLE_MS = 120;
|
|
13
|
+
/** 写平台遇到网络错误 / 5xx 的重发间隔 */
|
|
14
|
+
const WRITE_RETRY_MIN_MS = 1_000;
|
|
15
|
+
const WRITE_RETRY_MAX_MS = 10_000;
|
|
16
|
+
export class WriteMLBMessage {
|
|
17
|
+
deps;
|
|
18
|
+
queue = [];
|
|
19
|
+
/** 串行链正在跑:它在跑时队头那项正在发 */
|
|
20
|
+
sending = false;
|
|
21
|
+
/** 幂等键里的自增号 */
|
|
22
|
+
sent = 0;
|
|
23
|
+
retryDelay = WRITE_RETRY_MIN_MS;
|
|
24
|
+
/** close 时打断重发等待 */
|
|
25
|
+
abort = new AbortController();
|
|
26
|
+
/** 等队列清空的人 */
|
|
27
|
+
waiters = [];
|
|
28
|
+
deltaBuffer = "";
|
|
29
|
+
deltaTimer;
|
|
30
|
+
closed = false;
|
|
31
|
+
constructor(deps) {
|
|
32
|
+
this.deps = deps;
|
|
33
|
+
}
|
|
34
|
+
/** 业务消息与 delta、模型写回共用同一队列。 */
|
|
35
|
+
enqueueMessage(message) { this.write(message); }
|
|
36
|
+
/** 回合开始 on、收尾 off;工具跑起来时带 status 更新状态行。退役后照收 */
|
|
37
|
+
replying(data) {
|
|
38
|
+
this.flushDelta();
|
|
39
|
+
this.enqueue({ kind: "replying", data });
|
|
40
|
+
}
|
|
41
|
+
/** 正文碎片先攒着,120 毫秒内攒到的一起发 */
|
|
42
|
+
delta(text) {
|
|
43
|
+
if (text === "" || this.closed)
|
|
44
|
+
return;
|
|
45
|
+
this.deltaBuffer += text;
|
|
46
|
+
if (this.deltaTimer === undefined) {
|
|
47
|
+
this.deltaTimer = setTimeout(() => {
|
|
48
|
+
this.deltaTimer = undefined;
|
|
49
|
+
this.flushDelta();
|
|
50
|
+
}, DELTA_THROTTLE_MS);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** 不带工具调用的 assistant 消息写成 message 记录(mlbMessageAgentMessageConverter.ts 判定不写的不写) */
|
|
54
|
+
assistant(m, omitThinking) {
|
|
55
|
+
const out = assistantMessageToMLBMessage(m, omitThinking);
|
|
56
|
+
if (out !== null)
|
|
57
|
+
this.write(out, m);
|
|
58
|
+
}
|
|
59
|
+
/** 带工具调用的一步连同工具结果写成一条 tool 记录;平台回的时间写在这一步的 assistant 消息上,工具结果跟着它排 */
|
|
60
|
+
toolStep(m, toolResults, tools, dataAccessDetailsOf, sensitiveRun) {
|
|
61
|
+
const out = toolStepToMLBMessage(m, toolResults, tools, dataAccessDetailsOf, sensitiveRun);
|
|
62
|
+
if (out !== null)
|
|
63
|
+
this.write(out, m);
|
|
64
|
+
}
|
|
65
|
+
/** 运行时补给模型的 note 写成 note 记录 */
|
|
66
|
+
note(n) {
|
|
67
|
+
this.write(noteMessageToMLBMessage(n), n);
|
|
68
|
+
}
|
|
69
|
+
/** DataAccess 脱敏把这一轮的消息换成了副本(old → new):还没写完的,平台回的时间改写到副本上 */
|
|
70
|
+
retarget(replaced) {
|
|
71
|
+
if (replaced.size === 0)
|
|
72
|
+
return;
|
|
73
|
+
for (const item of this.queue) {
|
|
74
|
+
if (item.kind !== "write")
|
|
75
|
+
continue;
|
|
76
|
+
const next = item.target && replaced.get(item.target);
|
|
77
|
+
if (next !== undefined)
|
|
78
|
+
item.target = next;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** 攒着的字发出去,等队列清空(退役后只剩开关要发) */
|
|
82
|
+
flush() {
|
|
83
|
+
this.flushDelta();
|
|
84
|
+
if (!this.sending && this.queue.length === 0)
|
|
85
|
+
return Promise.resolve();
|
|
86
|
+
return new Promise((resolve) => {
|
|
87
|
+
this.waiters.push(resolve);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/** 退役:攒着的字扔掉,正在退避等重发的立刻醒来;队列里没发的字与写回在串行链上丢掉,开关照发 */
|
|
91
|
+
close() {
|
|
92
|
+
this.closed = true;
|
|
93
|
+
this.abort.abort();
|
|
94
|
+
this.clearTimer();
|
|
95
|
+
this.deltaBuffer = "";
|
|
96
|
+
}
|
|
97
|
+
/** 入队即分配幂等键;先把攒着的字发掉,字排在写回前面。退役后不收 */
|
|
98
|
+
write(message, target) {
|
|
99
|
+
if (this.closed)
|
|
100
|
+
return;
|
|
101
|
+
this.flushDelta();
|
|
102
|
+
this.sent += 1;
|
|
103
|
+
const idempotencyKey = message.idempotencyKey ?? `buddy:${this.deps.buddyId}:${this.deps.key}:${this.deps.runId}:${this.sent}`;
|
|
104
|
+
this.enqueue({ kind: "write", message: { ...message, idempotencyKey }, target });
|
|
105
|
+
}
|
|
106
|
+
/** 攒下的碎片立刻排进队列;队尾正好是一帧还没发的 delta 就并进去(写回在重发时,后面的字攒成一帧) */
|
|
107
|
+
flushDelta() {
|
|
108
|
+
this.clearTimer();
|
|
109
|
+
const text = this.deltaBuffer;
|
|
110
|
+
this.deltaBuffer = "";
|
|
111
|
+
if (text === "" || this.closed)
|
|
112
|
+
return;
|
|
113
|
+
const tail = this.queue[this.queue.length - 1];
|
|
114
|
+
const tailInFlight = this.sending && this.queue.length === 1;
|
|
115
|
+
if (tail !== undefined && tail.kind === "delta" && !tailInFlight)
|
|
116
|
+
tail.text += text;
|
|
117
|
+
else
|
|
118
|
+
this.enqueue({ kind: "delta", text });
|
|
119
|
+
}
|
|
120
|
+
enqueue(item) {
|
|
121
|
+
this.queue.push(item);
|
|
122
|
+
void this.drain();
|
|
123
|
+
}
|
|
124
|
+
/** 串行链:一次发队头一项,发完(或退役丢掉)才出队;写回遇到网络错误留在队头,退避后带同一个键重发 */
|
|
125
|
+
async drain() {
|
|
126
|
+
if (this.sending)
|
|
127
|
+
return;
|
|
128
|
+
this.sending = true;
|
|
129
|
+
try {
|
|
130
|
+
while (this.queue.length > 0) {
|
|
131
|
+
const head = this.queue[0];
|
|
132
|
+
if (head.kind === "replying") {
|
|
133
|
+
await this.deps.client.push(this.deps.key, "replying", head.data);
|
|
134
|
+
}
|
|
135
|
+
else if (this.closed) {
|
|
136
|
+
// 退役了:没发的字与写回丢掉
|
|
137
|
+
}
|
|
138
|
+
else if (head.kind === "delta") {
|
|
139
|
+
await this.deps.client.push(this.deps.key, "delta", { text: head.text });
|
|
140
|
+
}
|
|
141
|
+
else if (!(await this.send(head))) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
this.queue.shift();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
this.sending = false;
|
|
149
|
+
const waiters = this.waiters;
|
|
150
|
+
this.waiters = [];
|
|
151
|
+
for (const resolve of waiters)
|
|
152
|
+
resolve();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** 写一条:delivered → 平台回的时间写进内存那条消息;rejected(4xx)→ warn;都算发完回 true。throw(网络 / 5xx)→ 退避后回 false,留队重发 */
|
|
156
|
+
async send(item) {
|
|
157
|
+
const head = item.message;
|
|
158
|
+
let result;
|
|
159
|
+
try {
|
|
160
|
+
result = await this.deps.client.writeMessages(this.deps.key, [head]);
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
this.deps.log.warn("写消息失败,稍后重发", {
|
|
164
|
+
convoKey: this.deps.key,
|
|
165
|
+
idempotencyKey: head.idempotencyKey,
|
|
166
|
+
delayMs: this.retryDelay,
|
|
167
|
+
error: errorText(e),
|
|
168
|
+
});
|
|
169
|
+
await waitMs(this.retryDelay, this.abort.signal);
|
|
170
|
+
this.retryDelay = Math.min(this.retryDelay * 2, WRITE_RETRY_MAX_MS);
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
this.retryDelay = WRITE_RETRY_MIN_MS;
|
|
174
|
+
if (result.kind === "delivered") {
|
|
175
|
+
const timestamp = result.timestamps[0];
|
|
176
|
+
if (typeof timestamp === "number" && item.target)
|
|
177
|
+
item.target.timestamp = timestamp;
|
|
178
|
+
this.deps.log.info("写回一条", { convoKey: this.deps.key, type: head.type, chars: head.text?.length ?? 0, idempotencyKey: head.idempotencyKey, timestamp });
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
this.deps.log.warn("写消息被平台拒绝,丢弃", {
|
|
182
|
+
convoKey: this.deps.key,
|
|
183
|
+
idempotencyKey: head.idempotencyKey,
|
|
184
|
+
type: head.type,
|
|
185
|
+
status: result.status,
|
|
186
|
+
body: result.body,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
clearTimer() {
|
|
192
|
+
if (this.deltaTimer === undefined)
|
|
193
|
+
return;
|
|
194
|
+
clearTimeout(this.deltaTimer);
|
|
195
|
+
this.deltaTimer = undefined;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** 等 ms 毫秒;signal 触发就提前返回(不 reject) */
|
|
199
|
+
function waitMs(ms, signal) {
|
|
200
|
+
return new Promise((resolve) => {
|
|
201
|
+
if (signal.aborted) {
|
|
202
|
+
resolve();
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const finish = () => {
|
|
206
|
+
clearTimeout(timer);
|
|
207
|
+
signal.removeEventListener("abort", finish);
|
|
208
|
+
resolve();
|
|
209
|
+
};
|
|
210
|
+
const timer = setTimeout(finish, ms);
|
|
211
|
+
signal.addEventListener("abort", finish, { once: true });
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=writeMLBMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeMLBMessage.js","sourceRoot":"","sources":["../../src/conversation/writeMLBMessage.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
export { BuddyServer } from "./server.ts";
|
|
2
2
|
export type { BuddyFactory, BuddyLogger, BuddyOptions, BuddyServerHandle, Conversation, DataAccessQuery, DataRequirement, DatasetAccessResult, MemoryEntry, StartOptions, } from "./types.ts";
|
|
3
|
+
export { WidgetClient } from "./platform/widgets.ts";
|
|
4
|
+
export { PlatformRequestError } from "./platform/mlbClient.ts";
|
|
5
|
+
export type { PlatformClient } from "./platform/client.ts";
|
|
6
|
+
export type { PlatformToolName } from "./tools/registry.ts";
|
|
7
|
+
export type { Widget, WidgetSummary, WidgetRecord, WidgetWriteResult, WidgetClientOptions, WidgetCreateInput, WidgetWriteInput, WidgetPresentation, PlatformRequest, RequestOptions } from "./platform/widgets.ts";
|
|
3
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,YAAY,GACZ,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,YAAY,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAc1C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/mlbClient.d.ts
CHANGED
|
@@ -1,127 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export interface MLBClientOptions {
|
|
3
|
-
/** 网关地址,如 http://localhost:8788;末尾带不带斜杠都行 */
|
|
4
|
-
gatewayUrl: string;
|
|
5
|
-
/** 搭子令牌,放进每个请求的 Authorization: Bearer */
|
|
6
|
-
token: string;
|
|
7
|
-
log: BuddyLogger;
|
|
8
|
-
}
|
|
9
|
-
/** 写消息的结果:4xx 是平台明确拒绝(调用方丢弃不重发);网络错误 / 5xx 直接 throw(调用方重发) */
|
|
10
|
-
export type WriteResult = {
|
|
11
|
-
kind: "delivered";
|
|
12
|
-
} | {
|
|
13
|
-
kind: "rejected";
|
|
14
|
-
status: number;
|
|
15
|
-
body: string;
|
|
16
|
-
};
|
|
17
|
-
/** widget 类型目录里一个模块的声明 */
|
|
18
|
-
export interface WidgetModuleDecl {
|
|
19
|
-
description?: string;
|
|
20
|
-
record?: {
|
|
21
|
-
properties?: Record<string, {
|
|
22
|
-
type?: string;
|
|
23
|
-
description?: string;
|
|
24
|
-
}>;
|
|
25
|
-
required?: string[];
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
/** GET /internal/v1/widget-types 回的一个类型 */
|
|
29
|
-
export interface WidgetType {
|
|
30
|
-
id: string;
|
|
31
|
-
description?: string;
|
|
32
|
-
modules?: Record<string, WidgetModuleDecl>;
|
|
33
|
-
}
|
|
34
|
-
/** widget 各接口的结果:ok 时 body 是响应体 JSON;不 ok 时 error 是平台错误体里的 error 字段或网络错误文案 */
|
|
35
|
-
export type WidgetReply = {
|
|
36
|
-
ok: true;
|
|
37
|
-
body: any;
|
|
38
|
-
} | {
|
|
39
|
-
ok: false;
|
|
40
|
-
error: string;
|
|
41
|
-
};
|
|
42
|
-
export declare const MAX_DATASETS_PER_QUERY = 8;
|
|
43
|
-
export declare const MAX_DATA_ACCESS_RESPONSE_BYTES: number;
|
|
44
|
-
export declare class MLBClient {
|
|
45
|
-
private readonly base;
|
|
46
|
-
private readonly token;
|
|
47
|
-
private readonly log;
|
|
48
|
-
constructor(options: MLBClientOptions);
|
|
49
|
-
/**
|
|
50
|
-
* GET /internal/v1/messages?convoKey=&after=&limit=。
|
|
51
|
-
* 网络错误与非 2xx 都 throw,交给调用方等下次通知再拉;2xx 原样回响应体。
|
|
52
|
-
*/
|
|
53
|
-
pullMessages(convoKey: string, after: number, limit?: number): Promise<PullResponse>;
|
|
54
|
-
/**
|
|
55
|
-
* POST /internal/v1/messages { convoKey, messages }。
|
|
56
|
-
* 2xx → delivered;4xx → rejected(带 status 与响应体,调用方丢弃);网络错误 / 5xx → throw(调用方带同一幂等键重发)。
|
|
57
|
-
*/
|
|
58
|
-
writeMessages(convoKey: string, messages: OutgoingMessage[]): Promise<WriteResult>;
|
|
59
|
-
/** POST /internal/v1/push。只管发,失败(网络错误或非 2xx)只记 warn,不 throw */
|
|
60
|
-
push(convoKey: string, event: "replying", data: {
|
|
61
|
-
on: boolean;
|
|
62
|
-
status?: string;
|
|
63
|
-
}): Promise<void>;
|
|
64
|
-
push(convoKey: string, event: "delta", data: {
|
|
65
|
-
text: string;
|
|
66
|
-
}): Promise<void>;
|
|
67
|
-
/** GET /internal/v1/widget-types → types 数组。非 2xx、网络错误、响应体解析不了都回 [] 并记 warn */
|
|
68
|
-
widgetTypes(): Promise<WidgetType[]>;
|
|
69
|
-
/** POST /internal/v1/widgets { convoKey, type, title } → { id } */
|
|
70
|
-
widgetCreate(convoKey: string, type: string, title: string): Promise<WidgetReply>;
|
|
71
|
-
/** PUT /internal/v1/widgets/:widgetId/:module/:recordId { convoKey, data } → { ok, revision } */
|
|
72
|
-
widgetWrite(convoKey: string, widgetId: string, module: string, recordId: string, data: unknown): Promise<WidgetReply>;
|
|
73
|
-
/**
|
|
74
|
-
* 不带 module:GET /internal/v1/widgets/:widgetId?convoKey= → 整个 widget(含各模块记录);
|
|
75
|
-
* 带 module:GET /internal/v1/widgets/:widgetId/:module?convoKey= → { records }
|
|
76
|
-
*/
|
|
77
|
-
widgetRead(convoKey: string, widgetId: string, module?: string): Promise<WidgetReply>;
|
|
78
|
-
/** DELETE /internal/v1/widgets/:widgetId/:module/:recordId?convoKey= → { ok } */
|
|
79
|
-
widgetDelete(convoKey: string, widgetId: string, module: string, recordId: string): Promise<WidgetReply>;
|
|
80
|
-
/** widget 接口共用:2xx 回解析后的响应体;非 2xx 取错误体的 error 字段;网络错误取异常文案。都不 throw,让模型看到原因后改参数重试 */
|
|
81
|
-
private widgetCall;
|
|
82
|
-
/** GET /internal/v1/memory?convoKey= → entries(全量,按 key 字典序)。会话键作废时平台回空表 */
|
|
83
|
-
memoryList(convoKey: string): Promise<MemoryEntry[]>;
|
|
84
|
-
/** PUT /internal/v1/memory/:key { convoKey, text }:覆盖写一条(后写赢) */
|
|
85
|
-
memoryWrite(convoKey: string, key: string, text: string): Promise<void>;
|
|
86
|
-
/** DELETE /internal/v1/memory/:key?convoKey=:删一条,删不存在的也回 ok */
|
|
87
|
-
memoryDelete(convoKey: string, key: string): Promise<void>;
|
|
88
|
-
/**
|
|
89
|
-
* POST /internal/v1/data-access/query:按当前会话读取用户已授权的 Dataset。
|
|
90
|
-
* 私聊不传 memberId;群聊传消息前缀里的稳定 memberId。非 2xx、坏 JSON 或响应缺 datasets 都 throw。
|
|
91
|
-
*/
|
|
92
|
-
queryDataAccess(convoKey: string, datasets: string[], memberId?: string): Promise<DatasetAccessResult[]>;
|
|
93
|
-
/** GET /internal/v1/data-access/requirements:当前搭子声明的 Dataset;失败由调用方决定是否降级。 */
|
|
94
|
-
dataRequirements(): Promise<DataRequirement[]>;
|
|
95
|
-
/** memory 接口共用:2xx 回解析后的响应体;非 2xx throw 平台错误体的 error 字段(超配额、key 不合法都在这);网络错误、超时原样 throw */
|
|
96
|
-
private memoryCall;
|
|
97
|
-
/** 发一个请求并把响应体读完。网络错误、超时直接 throw;HTTP 状态不在这里判 */
|
|
98
|
-
private call;
|
|
99
|
-
}
|
|
100
|
-
export declare class EventStream {
|
|
101
|
-
private readonly base;
|
|
102
|
-
private readonly token;
|
|
103
|
-
private readonly log;
|
|
104
|
-
private readonly onEvent;
|
|
105
|
-
private run;
|
|
106
|
-
constructor(options: MLBClientOptions & {
|
|
107
|
-
onEvent: (event: BuddyEvent) => void;
|
|
108
|
-
});
|
|
109
|
-
/** 连上 GET /internal/v1/events 并一直保持;已经在跑就不重复起。不会 throw,连不上在后台退避重连 */
|
|
110
|
-
start(): void;
|
|
111
|
-
/** 断开当前连接、取消等待中的重连,之后不再连。再调 start() 会重新起一轮 */
|
|
112
|
-
stop(): void;
|
|
113
|
-
/**
|
|
114
|
-
* 连接循环:连上就一直读,读到服务端关流或出错就按退避等一会再连。
|
|
115
|
-
* 退避只针对「连不上」:这次连上过(流打开了)的,不论后来怎么断,下次都从 1 秒重新算——
|
|
116
|
-
* 健康连接被服务端掐掉(网关重启、顶号)不该被当成连不上而越等越久。
|
|
117
|
-
*/
|
|
118
|
-
private loop;
|
|
119
|
-
/** 连一次并读到流结束。流一打开就把 attempt.opened 置真;非 2xx、网络错误、被 abort 都 throw */
|
|
120
|
-
private connectOnce;
|
|
121
|
-
/**
|
|
122
|
-
* 解一帧:取 event: 与 data: 行(多行 data 用 \n 拼),其余字段和 : 开头的注释行不管。
|
|
123
|
-
* 没有 data 的帧不算事件;ping / welcome / data-access 丢掉;只把 message / delete 分发出去,且 convoKey 必须合法。
|
|
124
|
-
*/
|
|
125
|
-
private handleFrame;
|
|
126
|
-
}
|
|
1
|
+
export * from "./platform/mlbClient.ts";
|
|
127
2
|
//# sourceMappingURL=mlbClient.d.ts.map
|
package/dist/mlbClient.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mlbClient.d.ts","sourceRoot":"","sources":["../src/mlbClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mlbClient.d.ts","sourceRoot":"","sources":["../src/mlbClient.ts"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAC"}
|