@hypercli.com/sdk 2026.3.13-2 → 2026.3.18

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/dist/gateway.d.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * Protocol: OpenClaw Gateway v3
8
8
  */
9
9
  export interface GatewayOptions {
10
- /** WebSocket URL (wss://openclaw-{agent}.hypercli.com) */
10
+ /** WebSocket URL for the agent gateway (typically wss://{agent-host}) */
11
11
  url: string;
12
12
  /** Optional legacy query token for edge/proxy auth. Gateway auth uses `gatewayToken`. */
13
13
  token?: string;
@@ -21,9 +21,9 @@ export interface GatewayOptions {
21
21
  apiBase?: string;
22
22
  /** Automatically approve first-time browser pairing using trusted agent exec. */
23
23
  autoApprovePairing?: boolean;
24
- /** Client ID (default: "openclaw-control-ui") */
24
+ /** Client ID (default: "cli") */
25
25
  clientId?: string;
26
- /** Client mode (default: "webchat") */
26
+ /** Client mode (default: "cli") */
27
27
  clientMode?: string;
28
28
  /** Optional client display name */
29
29
  clientDisplayName?: string;
@@ -35,7 +35,7 @@ export interface GatewayOptions {
35
35
  instanceId?: string;
36
36
  /** Optional gateway capability list */
37
37
  caps?: string[];
38
- /** Origin header (default: "https://hypercli.com") */
38
+ /** Origin header (default: omitted for non-browser SDK clients) */
39
39
  origin?: string;
40
40
  /** Default RPC timeout in ms (default: 15000) */
41
41
  timeout?: number;
@@ -73,6 +73,10 @@ export interface GatewayCloseInfo {
73
73
  reason: string;
74
74
  error?: GatewayErrorShape | null;
75
75
  }
76
+ export interface GatewayWaitReadyOptions {
77
+ retryIntervalMs?: number;
78
+ probe?: "config" | "status";
79
+ }
76
80
  export interface GatewayPairingState {
77
81
  requestId: string;
78
82
  role: string;
@@ -136,7 +140,7 @@ export declare class GatewayClient {
136
140
  private clientPlatform;
137
141
  private clientInstanceId?;
138
142
  private caps;
139
- private origin;
143
+ private origin?;
140
144
  private defaultTimeout;
141
145
  private ws;
142
146
  private pending;
@@ -192,8 +196,22 @@ export declare class GatewayClient {
192
196
  configGet(): Promise<Record<string, any>>;
193
197
  configSchema(): Promise<OpenClawConfigSchemaResponse>;
194
198
  configPatch(patch: Record<string, any>): Promise<void>;
199
+ configApply(config: Record<string, any>): Promise<void>;
195
200
  configSet(config: Record<string, any>): Promise<void>;
196
201
  modelsList(): Promise<any[]>;
202
+ waitReady(timeoutMs?: number, options?: GatewayWaitReadyOptions): Promise<Record<string, any>>;
203
+ channelsStatus(probe?: boolean, timeoutMs?: number): Promise<Record<string, any>>;
204
+ channelsLogout(channel: string, accountId?: string): Promise<Record<string, any>>;
205
+ webLoginStart(options?: {
206
+ force?: boolean;
207
+ timeoutMs?: number;
208
+ verbose?: boolean;
209
+ accountId?: string;
210
+ }): Promise<Record<string, any>>;
211
+ webLoginWait(options?: {
212
+ timeoutMs?: number;
213
+ accountId?: string;
214
+ }): Promise<Record<string, any>>;
197
215
  sessionsList(): Promise<any[]>;
198
216
  sessionsPreview(sessionKey: string, limit?: number): Promise<any[]>;
199
217
  chatHistory(sessionKey?: string, limit?: number): Promise<any[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
package/dist/gateway.js CHANGED
@@ -7,6 +7,7 @@
7
7
  * Protocol: OpenClaw Gateway v3
8
8
  */
9
9
  import { getPublicKeyAsync, signAsync, utils as edUtils } from "@noble/ed25519";
10
+ import NodeWebSocket from "ws";
10
11
  class GatewayRequestError extends Error {
11
12
  gatewayCode;
12
13
  details;
@@ -21,8 +22,8 @@ const PROTOCOL_VERSION = 3;
21
22
  const DEFAULT_TIMEOUT = 15_000;
22
23
  const CHAT_TIMEOUT = 120_000;
23
24
  const RECONNECT_CLOSE_CODE = 4008;
24
- const DEFAULT_CLIENT_ID = "openclaw-control-ui";
25
- const DEFAULT_CLIENT_MODE = "webchat";
25
+ const DEFAULT_CLIENT_ID = "cli";
26
+ const DEFAULT_CLIENT_MODE = "cli";
26
27
  const DEFAULT_CLIENT_VERSION = "@hypercli/sdk";
27
28
  const DEFAULT_CAPS = ["tool-events"];
28
29
  const CONNECT_TIMER_MS = 750;
@@ -72,6 +73,122 @@ function asRecord(value) {
72
73
  ? value
73
74
  : null;
74
75
  }
76
+ function extractMessageText(message) {
77
+ if (typeof message === "string") {
78
+ return message;
79
+ }
80
+ const record = asRecord(message);
81
+ if (!record) {
82
+ return null;
83
+ }
84
+ const content = record.content;
85
+ if (typeof content === "string") {
86
+ return content;
87
+ }
88
+ if (Array.isArray(content)) {
89
+ const parts = content
90
+ .map((entry) => {
91
+ const item = asRecord(entry);
92
+ if (!item || item.type !== "text" || typeof item.text !== "string" || !item.text) {
93
+ return null;
94
+ }
95
+ return item.text;
96
+ })
97
+ .filter((value) => typeof value === "string");
98
+ if (parts.length > 0) {
99
+ return parts.join("\n");
100
+ }
101
+ }
102
+ return typeof record.text === "string" ? record.text : null;
103
+ }
104
+ function extractMessageRunId(message) {
105
+ const record = asRecord(message);
106
+ if (!record) {
107
+ return null;
108
+ }
109
+ const directRunId = typeof record.runId === "string" ? record.runId.trim() : "";
110
+ if (directRunId) {
111
+ return directRunId;
112
+ }
113
+ const agentRunId = typeof record.agentRunId === "string" ? record.agentRunId.trim() : "";
114
+ if (agentRunId) {
115
+ return agentRunId;
116
+ }
117
+ const meta = asRecord(record.meta);
118
+ const metaRunId = typeof meta?.runId === "string" ? meta.runId.trim() : "";
119
+ return metaRunId || null;
120
+ }
121
+ function latestHistoryAssistantText(messages, acceptedRunIds) {
122
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
123
+ const message = asRecord(messages[index]);
124
+ if (!message) {
125
+ continue;
126
+ }
127
+ const role = typeof message.role === "string" ? message.role.trim().toLowerCase() : "";
128
+ if (role !== "assistant") {
129
+ continue;
130
+ }
131
+ const messageRunId = extractMessageRunId(message);
132
+ if (messageRunId && acceptedRunIds.size > 0 && !acceptedRunIds.has(messageRunId)) {
133
+ continue;
134
+ }
135
+ const text = extractMessageText(message)?.trim();
136
+ if (text) {
137
+ return text;
138
+ }
139
+ }
140
+ return null;
141
+ }
142
+ function streamDelta(previousText, nextText) {
143
+ if (!nextText) {
144
+ return { delta: "", nextText: previousText };
145
+ }
146
+ if (previousText && nextText.startsWith(previousText)) {
147
+ return { delta: nextText.slice(previousText.length), nextText };
148
+ }
149
+ if (nextText === previousText) {
150
+ return { delta: "", nextText: previousText };
151
+ }
152
+ return { delta: nextText, nextText };
153
+ }
154
+ function parseAgentSessionKey(sessionKey) {
155
+ const normalized = (sessionKey ?? "").trim().toLowerCase();
156
+ if (!normalized) {
157
+ return null;
158
+ }
159
+ const parts = normalized.split(":").filter(Boolean);
160
+ if (parts.length < 3 || parts[0] !== "agent") {
161
+ return null;
162
+ }
163
+ const agentId = parts[1]?.trim();
164
+ const rest = parts.slice(2).join(":").trim();
165
+ if (!agentId || !rest) {
166
+ return null;
167
+ }
168
+ return { agentId, rest };
169
+ }
170
+ function sameSessionKey(left, right) {
171
+ const normalizedLeft = (left ?? "").trim().toLowerCase();
172
+ const normalizedRight = (right ?? "").trim().toLowerCase();
173
+ if (!normalizedLeft || !normalizedRight) {
174
+ return false;
175
+ }
176
+ if (normalizedLeft === normalizedRight) {
177
+ return true;
178
+ }
179
+ const parsedLeft = parseAgentSessionKey(normalizedLeft);
180
+ const parsedRight = parseAgentSessionKey(normalizedRight);
181
+ if (parsedLeft && parsedRight) {
182
+ return parsedLeft.agentId === parsedRight.agentId && parsedLeft.rest === parsedRight.rest;
183
+ }
184
+ if (parsedLeft) {
185
+ return parsedLeft.rest === normalizedRight;
186
+ }
187
+ if (parsedRight) {
188
+ return normalizedLeft === parsedRight.rest;
189
+ }
190
+ return false;
191
+ }
75
192
  function splitConfigPath(path) {
76
193
  return path
77
194
  .split(".")
@@ -641,7 +758,12 @@ export class GatewayClient {
641
758
  this.caps = Array.isArray(options.caps)
642
759
  ? options.caps.map((cap) => cap.trim()).filter(Boolean)
643
760
  : [...DEFAULT_CAPS];
644
- this.origin = options.origin ?? "https://hypercli.com";
761
+ // Non-browser SDK clients should not send Origin by default. OpenClaw
762
+ // treats any Origin header as browser-originated and applies browser
763
+ // origin checks to the connection.
764
+ this.origin = typeof options.origin === "string" && options.origin.trim()
765
+ ? options.origin.trim()
766
+ : undefined;
645
767
  this.defaultTimeout = options.timeout ?? DEFAULT_TIMEOUT;
646
768
  this.onHello = options.onHello;
647
769
  this.onClose = options.onClose;
@@ -766,7 +888,8 @@ export class GatewayClient {
766
888
  openSocket() {
767
889
  if (this.closed || this.ws)
768
890
  return;
769
- if (typeof WebSocket === "undefined") {
891
+ const useBrowserSocket = "localStorage" in globalThis && typeof WebSocket !== "undefined";
892
+ if (!useBrowserSocket && typeof NodeWebSocket === "undefined") {
770
893
  throw new Error("WebSocket is not available in this environment");
771
894
  }
772
895
  if (this.reconnectTimer) {
@@ -776,20 +899,38 @@ export class GatewayClient {
776
899
  const wsUrl = this.token
777
900
  ? `${this.url}${this.url.includes("?") ? "&" : "?"}token=${encodeURIComponent(this.token)}`
778
901
  : this.url;
779
- const ws = new WebSocket(wsUrl);
902
+ const ws = useBrowserSocket
903
+ ? new WebSocket(wsUrl)
904
+ : new NodeWebSocket(wsUrl, this.origin ? { headers: { Origin: this.origin } } : undefined);
780
905
  this.ws = ws;
781
- ws.onopen = () => {
906
+ if (useBrowserSocket) {
907
+ ws.onopen = () => {
908
+ this.queueConnect();
909
+ };
910
+ ws.onmessage = (event) => {
911
+ this.handleMessage(String(event.data ?? ""));
912
+ };
913
+ ws.onerror = () => {
914
+ // Close handling covers retries and surfaced errors.
915
+ };
916
+ ws.onclose = (event) => {
917
+ this.handleClose(ws, event.code ?? 1006, String(event.reason ?? ""));
918
+ };
919
+ return;
920
+ }
921
+ const nodeWs = ws;
922
+ nodeWs.on("open", () => {
782
923
  this.queueConnect();
783
- };
784
- ws.onmessage = (event) => {
785
- this.handleMessage(String(event.data ?? ""));
786
- };
787
- ws.onerror = () => {
924
+ });
925
+ nodeWs.on("message", (data) => {
926
+ this.handleMessage(typeof data === "string" ? data : data.toString());
927
+ });
928
+ nodeWs.on("error", () => {
788
929
  // Close handling covers retries and surfaced errors.
789
- };
790
- ws.onclose = (event) => {
791
- this.handleClose(ws, event.code ?? 1006, String(event.reason ?? ""));
792
- };
930
+ });
931
+ nodeWs.on("close", (code, reason) => {
932
+ this.handleClose(ws, code ?? 1006, reason?.toString() ?? "");
933
+ });
793
934
  }
794
935
  queueConnect() {
795
936
  this.connectNonce = null;
@@ -1112,15 +1253,89 @@ export class GatewayClient {
1112
1253
  return normalizeOpenClawConfigSchema(res) ?? { schema: {}, uiHints: {} };
1113
1254
  }
1114
1255
  async configPatch(patch) {
1115
- await this.rpc("config.patch", { patch });
1256
+ const { hash, baseHash } = await this.rpc("config.get");
1257
+ await this.rpc("config.patch", {
1258
+ raw: JSON.stringify(patch),
1259
+ baseHash: hash ?? baseHash ?? "",
1260
+ });
1261
+ }
1262
+ async configApply(config) {
1263
+ const { hash, baseHash } = await this.rpc("config.get");
1264
+ await this.rpc("config.apply", {
1265
+ raw: JSON.stringify(config),
1266
+ baseHash: hash ?? baseHash ?? "",
1267
+ });
1116
1268
  }
1117
1269
  async configSet(config) {
1118
- await this.rpc("config.set", { config });
1270
+ const { hash, baseHash } = await this.rpc("config.get");
1271
+ await this.rpc("config.set", {
1272
+ raw: JSON.stringify(config),
1273
+ baseHash: hash ?? baseHash ?? "",
1274
+ });
1119
1275
  }
1120
1276
  async modelsList() {
1121
1277
  const res = await this.rpc("models.list");
1122
1278
  return res?.models ?? res ?? [];
1123
1279
  }
1280
+ async waitReady(timeoutMs = 300_000, options = {}) {
1281
+ const retryIntervalMs = options.retryIntervalMs ?? 5_000;
1282
+ const probe = options.probe ?? "config";
1283
+ const deadline = Date.now() + timeoutMs;
1284
+ let lastError = null;
1285
+ while (!this.closed) {
1286
+ try {
1287
+ if (!this.connected) {
1288
+ await this.connect();
1289
+ }
1290
+ if (probe === "status") {
1291
+ return await this.status();
1292
+ }
1293
+ return await this.configGet();
1294
+ }
1295
+ catch (error) {
1296
+ lastError = error;
1297
+ this.close();
1298
+ if (Date.now() >= deadline) {
1299
+ break;
1300
+ }
1301
+ await new Promise((resolve) => setTimeout(resolve, retryIntervalMs));
1302
+ }
1303
+ }
1304
+ const detail = lastError instanceof Error ? `: ${lastError.message}` : "";
1305
+ throw new Error(`Gateway readiness probe timed out after ${timeoutMs}ms${detail}`);
1306
+ }
1307
+ async channelsStatus(probe = false, timeoutMs) {
1308
+ const params = { probe };
1309
+ if (timeoutMs !== undefined)
1310
+ params.timeoutMs = timeoutMs;
1311
+ return await this.rpc("channels.status", params);
1312
+ }
1313
+ async channelsLogout(channel, accountId) {
1314
+ const params = { channel };
1315
+ if (accountId)
1316
+ params.accountId = accountId;
1317
+ return await this.rpc("channels.logout", params);
1318
+ }
1319
+ async webLoginStart(options = {}) {
1320
+ const params = {};
1321
+ if (options.force)
1322
+ params.force = true;
1323
+ if (options.timeoutMs !== undefined)
1324
+ params.timeoutMs = options.timeoutMs;
1325
+ if (options.verbose)
1326
+ params.verbose = true;
1327
+ if (options.accountId)
1328
+ params.accountId = options.accountId;
1329
+ return await this.rpc("web.login.start", params, 30_000);
1330
+ }
1331
+ async webLoginWait(options = {}) {
1332
+ const params = {};
1333
+ if (options.timeoutMs !== undefined)
1334
+ params.timeoutMs = options.timeoutMs;
1335
+ if (options.accountId)
1336
+ params.accountId = options.accountId;
1337
+ return await this.rpc("web.login.wait", params, CHAT_TIMEOUT);
1338
+ }
1124
1339
  // ---------------------------------------------------------------------------
1125
1340
  // Sessions
1126
1341
  // ---------------------------------------------------------------------------
@@ -1148,6 +1363,7 @@ export class GatewayClient {
1148
1363
  async sendChat(message, sessionKey = "main", agentId, attachments) {
1149
1364
  const params = {
1150
1365
  message,
1366
+ deliver: false,
1151
1367
  sessionKey,
1152
1368
  idempotencyKey: makeId(),
1153
1369
  };
@@ -1167,90 +1383,151 @@ export class GatewayClient {
1167
1383
  if (!this.connected || !this.ws) {
1168
1384
  throw new Error("Not connected");
1169
1385
  }
1170
- const id = makeId();
1171
- const req = {
1172
- type: "req",
1173
- id,
1174
- method: "chat.send",
1175
- params: {
1176
- message,
1177
- sessionKey,
1178
- idempotencyKey: makeId(),
1179
- },
1180
- };
1181
- const events = [];
1386
+ const idempotencyKey = makeId();
1387
+ const acceptedRunIds = new Set([idempotencyKey]);
1388
+ const queuedEvents = [];
1182
1389
  let resolveWait = null;
1183
- let done = false;
1184
- let error = null;
1185
- // Temporary event handler for chat events
1390
+ let streamedDisplayText = false;
1391
+ let lastLegacyText = "";
1186
1392
  const handler = (evt) => {
1187
- if (evt.event?.startsWith("chat.")) {
1188
- const payload = evt.payload ?? {};
1393
+ if (evt.event === "chat" || evt.event?.startsWith("chat.")) {
1394
+ queuedEvents.push(evt);
1395
+ const waiter = resolveWait;
1396
+ resolveWait = null;
1397
+ waiter?.();
1398
+ }
1399
+ };
1400
+ this.eventHandlers.add(handler);
1401
+ try {
1402
+ const ack = await this.rpc("chat.send", {
1403
+ message,
1404
+ deliver: false,
1405
+ sessionKey,
1406
+ idempotencyKey,
1407
+ }, CHAT_TIMEOUT);
1408
+ const serverRunId = typeof ack?.runId === "string" ? ack.runId.trim() : "";
1409
+ if (serverRunId) {
1410
+ acceptedRunIds.add(serverRunId);
1411
+ }
1412
+ let deadline = Date.now() + CHAT_TIMEOUT;
1413
+ while (Date.now() < deadline) {
1414
+ if (queuedEvents.length === 0) {
1415
+ const remainingMs = Math.max(100, Math.min(1000, deadline - Date.now()));
1416
+ await new Promise((resolve) => {
1417
+ const timer = setTimeout(() => {
1418
+ if (resolveWait === release) {
1419
+ resolveWait = null;
1420
+ }
1421
+ resolve();
1422
+ }, remainingMs);
1423
+ const release = () => {
1424
+ clearTimeout(timer);
1425
+ resolve();
1426
+ };
1427
+ resolveWait = release;
1428
+ });
1429
+ continue;
1430
+ }
1431
+ const evt = queuedEvents.shift();
1432
+ const payload = asRecord(evt.payload) ?? {};
1433
+ const payloadRunId = typeof payload.runId === "string" ? payload.runId.trim() : "";
1434
+ const payloadSessionKey = typeof payload.sessionKey === "string" ? payload.sessionKey.trim() : "";
1435
+ if (payloadRunId && !acceptedRunIds.has(payloadRunId)) {
1436
+ continue;
1437
+ }
1438
+ if (payloadSessionKey && !sameSessionKey(payloadSessionKey, sessionKey)) {
1439
+ continue;
1440
+ }
1441
+ deadline = Date.now() + CHAT_TIMEOUT;
1189
1442
  if (evt.event === "chat.content") {
1190
- events.push({ type: "content", text: payload.text ?? "" });
1443
+ const text = typeof payload.text === "string" ? payload.text : "";
1444
+ if (text) {
1445
+ streamedDisplayText = true;
1446
+ yield { type: "content", text };
1447
+ }
1448
+ continue;
1191
1449
  }
1192
- else if (evt.event === "chat.thinking") {
1193
- events.push({ type: "thinking", text: payload.text ?? "" });
1450
+ if (evt.event === "chat.thinking") {
1451
+ yield { type: "thinking", text: typeof payload.text === "string" ? payload.text : "" };
1452
+ continue;
1194
1453
  }
1195
- else if (evt.event === "chat.tool_call") {
1196
- events.push({ type: "tool_call", data: payload });
1454
+ if (evt.event === "chat.tool_call") {
1455
+ yield { type: "tool_call", data: payload };
1456
+ continue;
1197
1457
  }
1198
- else if (evt.event === "chat.tool_result") {
1199
- events.push({ type: "tool_result", data: payload });
1458
+ if (evt.event === "chat.tool_result") {
1459
+ yield { type: "tool_result", data: payload };
1460
+ continue;
1200
1461
  }
1201
- else if (evt.event === "chat.done") {
1202
- events.push({ type: "done" });
1203
- done = true;
1462
+ if (evt.event === "chat.done") {
1463
+ yield { type: "done", data: payload };
1464
+ return;
1204
1465
  }
1205
- else if (evt.event === "chat.error") {
1206
- events.push({ type: "error", text: payload.message ?? "Unknown error" });
1207
- done = true;
1466
+ if (evt.event === "chat.error") {
1467
+ yield {
1468
+ type: "error",
1469
+ text: typeof payload.message === "string" ? payload.message : "Unknown error",
1470
+ data: payload,
1471
+ };
1472
+ return;
1208
1473
  }
1209
- resolveWait?.();
1210
- }
1211
- };
1212
- this.eventHandlers.add(handler);
1213
- // Also listen for the RPC response
1214
- const timer = setTimeout(() => {
1215
- this.pending.delete(id);
1216
- error = new Error("Chat timeout");
1217
- done = true;
1218
- resolveWait?.();
1219
- }, CHAT_TIMEOUT);
1220
- this.pending.set(id, {
1221
- resolve: () => {
1222
- clearTimeout(timer);
1223
- done = true;
1224
- resolveWait?.();
1225
- },
1226
- reject: (rejection) => {
1227
- clearTimeout(timer);
1228
- error = rejection instanceof Error ? rejection : new Error(String(rejection));
1229
- done = true;
1230
- resolveWait?.();
1231
- },
1232
- timer,
1233
- });
1234
- this.ws.send(JSON.stringify(req));
1235
- try {
1236
- while (!done || events.length > 0) {
1237
- if (events.length > 0) {
1238
- yield events.shift();
1474
+ if (evt.event !== "chat") {
1475
+ continue;
1239
1476
  }
1240
- else if (!done) {
1241
- await new Promise((resolve) => {
1242
- resolveWait = resolve;
1243
- });
1244
- resolveWait = null;
1477
+ const state = typeof payload.state === "string" ? payload.state.trim().toLowerCase() : "";
1478
+ const currentText = extractMessageText(payload.message) ?? "";
1479
+ if (state === "delta") {
1480
+ const streamed = streamDelta(lastLegacyText, currentText);
1481
+ lastLegacyText = streamed.nextText;
1482
+ if (streamed.delta) {
1483
+ streamedDisplayText = true;
1484
+ yield { type: "content", text: streamed.delta, data: payload };
1485
+ }
1486
+ continue;
1487
+ }
1488
+ if (state === "final") {
1489
+ if (currentText) {
1490
+ const streamed = streamDelta(lastLegacyText, currentText);
1491
+ lastLegacyText = streamed.nextText;
1492
+ if (streamed.delta) {
1493
+ streamedDisplayText = true;
1494
+ yield { type: "content", text: streamed.delta, data: payload };
1495
+ }
1496
+ yield { type: "done", data: payload };
1497
+ return;
1498
+ }
1499
+ if (streamedDisplayText || lastLegacyText) {
1500
+ yield { type: "done", data: payload };
1501
+ return;
1502
+ }
1503
+ const historyText = latestHistoryAssistantText(await this.chatHistory(sessionKey, 20), acceptedRunIds);
1504
+ if (historyText) {
1505
+ yield { type: "content", text: historyText, data: payload };
1506
+ }
1507
+ yield { type: "done", data: payload };
1508
+ return;
1509
+ }
1510
+ if (state === "error" || state === "aborted") {
1511
+ if (currentText) {
1512
+ const streamed = streamDelta(lastLegacyText, currentText);
1513
+ lastLegacyText = streamed.nextText;
1514
+ if (streamed.delta) {
1515
+ streamedDisplayText = true;
1516
+ yield { type: "content", text: streamed.delta, data: payload };
1517
+ }
1518
+ }
1519
+ yield {
1520
+ type: "error",
1521
+ text: typeof payload.errorMessage === "string" ? payload.errorMessage : state,
1522
+ data: payload,
1523
+ };
1524
+ return;
1245
1525
  }
1246
1526
  }
1247
- if (error)
1248
- throw error;
1527
+ throw new Error("Streaming chat.send timed out");
1249
1528
  }
1250
1529
  finally {
1251
- clearTimeout(timer);
1252
1530
  this.eventHandlers.delete(handler);
1253
- this.pending.delete(id);
1254
1531
  }
1255
1532
  }
1256
1533
  // ---------------------------------------------------------------------------