clawconnect-agent 0.1.39 → 0.1.41

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 (65) hide show
  1. package/README.md +11 -0
  2. package/README.zh-CN.md +10 -0
  3. package/dist/commands/install.js +7 -0
  4. package/dist/commands/install.js.map +1 -1
  5. package/dist/commands/pair.d.ts +1 -2
  6. package/dist/commands/pair.js +2 -16
  7. package/dist/commands/pair.js.map +1 -1
  8. package/dist/commands/run.js +26 -13
  9. package/dist/commands/run.js.map +1 -1
  10. package/dist/core/command-types.d.ts +2 -1
  11. package/dist/core/relay/assistant-stream-coalescer.d.ts +67 -0
  12. package/dist/core/relay/assistant-stream-coalescer.js +269 -0
  13. package/dist/core/relay/assistant-stream-coalescer.js.map +1 -0
  14. package/dist/core/relay/file-upload-utils.d.ts +1 -0
  15. package/dist/core/relay/file-upload-utils.js +15 -0
  16. package/dist/core/relay/file-upload-utils.js.map +1 -1
  17. package/dist/core/relay/office-payload.d.ts +1 -0
  18. package/dist/core/relay/office-payload.js +42 -3
  19. package/dist/core/relay/office-payload.js.map +1 -1
  20. package/dist/core/relay/reconnect.d.ts +1 -0
  21. package/dist/core/relay/reconnect.js +22 -4
  22. package/dist/core/relay/reconnect.js.map +1 -1
  23. package/dist/core/relay/relay-server-connection.d.ts +25 -1
  24. package/dist/core/relay/relay-server-connection.js +246 -3
  25. package/dist/core/relay/relay-server-connection.js.map +1 -1
  26. package/dist/core/relay/reliable-delivery-protocol.d.ts +17 -0
  27. package/dist/core/relay/reliable-delivery-protocol.js +25 -0
  28. package/dist/core/relay/reliable-delivery-protocol.js.map +1 -0
  29. package/dist/core/relay/reliable-relay-outbox-registry.d.ts +19 -0
  30. package/dist/core/relay/reliable-relay-outbox-registry.js +81 -0
  31. package/dist/core/relay/reliable-relay-outbox-registry.js.map +1 -0
  32. package/dist/core/relay/reliable-relay-outbox-store.d.ts +67 -0
  33. package/dist/core/relay/reliable-relay-outbox-store.js +527 -0
  34. package/dist/core/relay/reliable-relay-outbox-store.js.map +1 -0
  35. package/dist/core/relay/reliable-relay-outbox.d.ts +74 -0
  36. package/dist/core/relay/reliable-relay-outbox.js +442 -0
  37. package/dist/core/relay/reliable-relay-outbox.js.map +1 -0
  38. package/dist/core/relay/timeline-event-builder.d.ts +1 -0
  39. package/dist/core/relay/timeline-event-builder.js +1 -0
  40. package/dist/core/relay/timeline-event-builder.js.map +1 -1
  41. package/dist/hermes/hermes-relay-manager.d.ts +5 -0
  42. package/dist/hermes/hermes-relay-manager.js +105 -8
  43. package/dist/hermes/hermes-relay-manager.js.map +1 -1
  44. package/dist/hermes/runtime/hermes-runtime-api-client.js +54 -29
  45. package/dist/hermes/runtime/hermes-runtime-api-client.js.map +1 -1
  46. package/dist/openclaw/gateway-client.d.ts +1 -0
  47. package/dist/openclaw/gateway-client.js +27 -3
  48. package/dist/openclaw/gateway-client.js.map +1 -1
  49. package/dist/openclaw/relay/chat-history.js +18 -7
  50. package/dist/openclaw/relay/chat-history.js.map +1 -1
  51. package/dist/openclaw/relay/chat-run-identity.d.ts +19 -2
  52. package/dist/openclaw/relay/chat-run-identity.js +89 -4
  53. package/dist/openclaw/relay/chat-run-identity.js.map +1 -1
  54. package/dist/openclaw/relay/relay-manager-protocol.d.ts +24 -3
  55. package/dist/openclaw/relay-manager.js +264 -36
  56. package/dist/openclaw/relay-manager.js.map +1 -1
  57. package/dist/platform/service-manager-common.d.ts +4 -0
  58. package/dist/platform/service-manager-common.js +14 -1
  59. package/dist/platform/service-manager-common.js.map +1 -1
  60. package/dist/platform/service-manager-linux.d.ts +17 -5
  61. package/dist/platform/service-manager-linux.js +86 -73
  62. package/dist/platform/service-manager-linux.js.map +1 -1
  63. package/dist/platform/service-manager.js +21 -17
  64. package/dist/platform/service-manager.js.map +1 -1
  65. package/package.json +4 -3
@@ -62,6 +62,21 @@ export function toRelayHttpBase(relayServerUrl) {
62
62
  }
63
63
  return `http://${trimmed}`;
64
64
  }
65
+ export function normalizeRelayServerIdentity(relayServerUrl) {
66
+ const parsed = new URL(toRelayHttpBase(relayServerUrl));
67
+ const protocol = parsed.protocol.toLowerCase();
68
+ const host = normalizeRelayHost(parsed.hostname);
69
+ const port = parsed.port || (protocol === "https:" ? "443" : "80");
70
+ const pathname = parsed.pathname.replace(/\/+$/, "");
71
+ return `${protocol}//${host}:${port}${pathname}`;
72
+ }
73
+ function normalizeRelayHost(hostname) {
74
+ const lower = hostname.toLowerCase();
75
+ if (lower === "localhost" || lower === "::1" || lower === "[::1]") {
76
+ return "127.0.0.1";
77
+ }
78
+ return lower;
79
+ }
65
80
  export function inferMimeType(fileName) {
66
81
  const lowerName = fileName.trim().toLowerCase();
67
82
  const dotIndex = lowerName.lastIndexOf(".");
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload-utils.js","sourceRoot":"","sources":["../../../src/core/relay/file-upload-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-upload-utils.js","sourceRoot":"","sources":["../../../src/core/relay/file-upload-utils.ts"],"names":[],"mappings":"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"}
@@ -16,4 +16,5 @@ export interface OfficeStreamPayload {
16
16
  updatedAt: string;
17
17
  };
18
18
  }
19
+ export declare const OFFICE_DETAIL_MAX_CODE_POINTS = 240;
19
20
  export declare function buildOfficeEventPayload(eventName: string, payload: unknown, nowIso?: () => string): OfficeStreamPayload | null;
@@ -1,4 +1,8 @@
1
1
  import { extractChatRole, extractChatText, } from "./chat-payload.js";
2
+ export const OFFICE_DETAIL_MAX_CODE_POINTS = 240;
3
+ const OFFICE_DETAIL_SEGMENTER = typeof Intl.Segmenter === "function"
4
+ ? new Intl.Segmenter(undefined, { granularity: "grapheme" })
5
+ : undefined;
2
6
  export function buildOfficeEventPayload(eventName, payload, nowIso = () => new Date().toISOString()) {
3
7
  if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
4
8
  return null;
@@ -30,7 +34,7 @@ export function buildOfficeEventPayload(eventName, payload, nowIso = () => new D
30
34
  ?? stringValue(data?.tool_call_id);
31
35
  const kind = resolveKind(eventName, phase, role, toolName);
32
36
  const title = resolveTitle(kind);
33
- const detail = resolveDetail(kind, {
37
+ const detail = truncateOfficeDetail(resolveDetail(kind, {
34
38
  eventName,
35
39
  text,
36
40
  currentModel,
@@ -40,7 +44,7 @@ export function buildOfficeEventPayload(eventName, payload, nowIso = () => new D
40
44
  phase,
41
45
  office,
42
46
  record,
43
- });
47
+ }));
44
48
  const progress = resolveProgress(kind, phase);
45
49
  return {
46
50
  ...(sessionKey ? { sessionKey } : {}),
@@ -52,7 +56,6 @@ export function buildOfficeEventPayload(eventName, payload, nowIso = () => new D
52
56
  title,
53
57
  detail,
54
58
  ...(phase ? { phase } : {}),
55
- ...(text ? { text } : {}),
56
59
  ...(toolName ? { toolName } : {}),
57
60
  ...(toolCallId ? { toolCallId } : {}),
58
61
  ...(progress !== undefined ? { progress } : {}),
@@ -60,6 +63,42 @@ export function buildOfficeEventPayload(eventName, payload, nowIso = () => new D
60
63
  },
61
64
  };
62
65
  }
66
+ function truncateOfficeDetail(value) {
67
+ if (OFFICE_DETAIL_SEGMENTER) {
68
+ let codePointCount = 0;
69
+ let safeEnd = 0;
70
+ for (const segment of OFFICE_DETAIL_SEGMENTER.segment(value)) {
71
+ codePointCount += countCodePoints(segment.segment);
72
+ if (codePointCount <= OFFICE_DETAIL_MAX_CODE_POINTS - 1) {
73
+ safeEnd = segment.index + segment.segment.length;
74
+ }
75
+ if (codePointCount > OFFICE_DETAIL_MAX_CODE_POINTS) {
76
+ return `${value.slice(0, safeEnd)}…`;
77
+ }
78
+ }
79
+ return value;
80
+ }
81
+ // Small-ICU or unusual embedded Node builds may not expose Segmenter. Iterate
82
+ // lazily by code point so every platform still avoids splitting a surrogate.
83
+ let codePointCount = 0;
84
+ let safeEnd = 0;
85
+ for (const codePoint of value) {
86
+ codePointCount += 1;
87
+ if (codePointCount <= OFFICE_DETAIL_MAX_CODE_POINTS - 1) {
88
+ safeEnd += codePoint.length;
89
+ }
90
+ if (codePointCount > OFFICE_DETAIL_MAX_CODE_POINTS) {
91
+ return `${value.slice(0, safeEnd)}…`;
92
+ }
93
+ }
94
+ return value;
95
+ }
96
+ function countCodePoints(value) {
97
+ let count = 0;
98
+ for (const _codePoint of value)
99
+ count += 1;
100
+ return count;
101
+ }
63
102
  function resolveKind(eventName, phase, role, toolName) {
64
103
  const loweredTool = toolName?.toLowerCase() ?? "";
65
104
  if (eventName === "gateway_disconnected") {
@@ -1 +1 @@
1
- {"version":3,"file":"office-payload.js","sourceRoot":"","sources":["../../../src/core/relay/office-payload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"office-payload.js","sourceRoot":"","sources":["../../../src/core/relay/office-payload.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ export interface ReconnectOptions {
2
2
  initialDelayMs?: number;
3
3
  maxDelayMs?: number;
4
4
  onRetry?: (attempt: number, delayMs: number) => void;
5
+ signal?: AbortSignal;
5
6
  }
6
7
  /**
7
8
  * Implements exponential backoff: 500ms → 1s → 2s → ... → 30s cap.
@@ -12,16 +12,34 @@ export async function withReconnect(connect, opts = {}) {
12
12
  let attempt = 0;
13
13
  let delay = initialDelay;
14
14
  while (true) {
15
+ if (opts.signal?.aborted)
16
+ break;
15
17
  const shouldRetry = await connect();
16
- if (!shouldRetry)
18
+ if (!shouldRetry || opts.signal?.aborted)
17
19
  break;
18
20
  attempt++;
19
21
  opts.onRetry?.(attempt, delay);
20
- await sleep(delay);
22
+ if (!await sleep(delay, opts.signal))
23
+ break;
21
24
  delay = Math.min(delay * 2, maxDelay);
22
25
  }
23
26
  }
24
- function sleep(ms) {
25
- return new Promise((resolve) => setTimeout(resolve, ms));
27
+ function sleep(ms, signal) {
28
+ if (signal?.aborted)
29
+ return Promise.resolve(false);
30
+ return new Promise((resolve) => {
31
+ const onAbort = () => {
32
+ clearTimeout(timer);
33
+ resolve(false);
34
+ };
35
+ const timer = setTimeout(() => {
36
+ signal?.removeEventListener("abort", onAbort);
37
+ resolve(true);
38
+ }, ms);
39
+ timer.unref?.();
40
+ signal?.addEventListener("abort", onAbort, { once: true });
41
+ if (signal?.aborted)
42
+ onAbort();
43
+ });
26
44
  }
27
45
  //# sourceMappingURL=reconnect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reconnect.js","sourceRoot":"","sources":["../../../src/core/relay/reconnect.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA+B,EAC/B,OAAyB,EAAE;IAE3B,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,YAAY,CAAC;IAEzB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW;YAAE,MAAM;QAExB,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"reconnect.js","sourceRoot":"","sources":["../../../src/core/relay/reconnect.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA+B,EAC/B,OAAyB,EAAE;IAE3B,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,YAAY,CAAC;IAEzB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM;QAChC,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM;QAEhD,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;YAAE,MAAM;QAC5C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,6 +1,30 @@
1
1
  import { WebSocket, type RawData } from "ws";
2
+ export declare const RELAY_WS_BACKPRESSURE_HIGH_WATER_MARK_BYTES: number;
3
+ export declare const RELAY_WS_COMPRESSION_THRESHOLD_BYTES = 1024;
4
+ export declare const RELAY_WS_WRITE_CONFIRMATION_TIMEOUT_MS = 10000;
5
+ export declare const RELAY_WS_CLIENT_OPTIONS: Readonly<{
6
+ perMessageDeflate: true;
7
+ }>;
8
+ export type RelaySendResult = {
9
+ status: "sent" | "socket_not_open" | "backpressure_skipped" | "backpressure_disconnected" | "send_failed";
10
+ byteLength: number;
11
+ bufferedAmount: number;
12
+ projectedBufferedAmount: number;
13
+ aboveHighWaterMark: boolean;
14
+ error?: unknown;
15
+ };
2
16
  export declare function buildRelayUrl(serverUrl: string, gatewayId: string, relaySecret: string): string;
3
- export declare function sendRelayJson(ws: WebSocket, message: unknown): void;
17
+ export declare function createRelayWebSocket(url: string): WebSocket;
18
+ export declare function sendRelayJson(ws: WebSocket, message: unknown, highWaterMarkBytes?: number, onComplete?: (error?: Error) => void): RelaySendResult;
19
+ /** Waits for the ws.send callback so a stream coalescer can compensate for async write failures. */
20
+ export declare function sendRelayJsonWithWriteConfirmation(ws: WebSocket, message: unknown, highWaterMarkBytes?: number, timeoutMs?: number): Promise<RelaySendResult>;
21
+ /**
22
+ * Streaming snapshots carry the complete assistant text in timelineEvents.
23
+ * Remove legacy mirrors only on that canonical path; terminal and non-chat
24
+ * envelopes retain their existing wire shape for mixed-version clients.
25
+ */
26
+ export declare function compactRelayMessageForTransport(message: unknown): unknown;
4
27
  export declare function parseRelayFrame<T>(raw: RawData): T | undefined;
5
28
  export declare function bindRelayAbortSignal(ws: WebSocket, signal?: AbortSignal): void;
6
29
  export declare function shouldRetryRelayClose(code: number, signal?: AbortSignal): boolean;
30
+ export declare function disconnectRelaySocketForRecovery(ws: WebSocket, reason: string): void;
@@ -1,12 +1,218 @@
1
1
  import { WebSocket } from "ws";
2
+ export const RELAY_WS_BACKPRESSURE_HIGH_WATER_MARK_BYTES = 4 * 1024 * 1024;
3
+ export const RELAY_WS_COMPRESSION_THRESHOLD_BYTES = 1024;
4
+ export const RELAY_WS_WRITE_CONFIRMATION_TIMEOUT_MS = 10_000;
5
+ export const RELAY_WS_CLIENT_OPTIONS = Object.freeze({
6
+ perMessageDeflate: true,
7
+ });
2
8
  export function buildRelayUrl(serverUrl, gatewayId, relaySecret) {
3
9
  const base = serverUrl.replace(/\/+$/, "").replace(/^http/, "ws");
4
10
  return `${base}/relay/${gatewayId}?secret=${encodeURIComponent(relaySecret)}`;
5
11
  }
6
- export function sendRelayJson(ws, message) {
7
- if (ws.readyState === WebSocket.OPEN) {
8
- ws.send(JSON.stringify(message));
12
+ export function createRelayWebSocket(url) {
13
+ return new WebSocket(url, RELAY_WS_CLIENT_OPTIONS);
14
+ }
15
+ export function sendRelayJson(ws, message, highWaterMarkBytes = RELAY_WS_BACKPRESSURE_HIGH_WATER_MARK_BYTES, onComplete) {
16
+ const bufferedAmount = finiteNonNegative(ws.bufferedAmount);
17
+ if (ws.readyState !== WebSocket.OPEN) {
18
+ return {
19
+ status: "socket_not_open",
20
+ byteLength: 0,
21
+ bufferedAmount,
22
+ projectedBufferedAmount: bufferedAmount,
23
+ aboveHighWaterMark: bufferedAmount >= highWaterMarkBytes,
24
+ };
25
+ }
26
+ let serialized;
27
+ try {
28
+ const encoded = JSON.stringify(compactRelayMessageForTransport(message));
29
+ if (encoded === undefined) {
30
+ throw new TypeError("relay_message_not_json_serializable");
31
+ }
32
+ serialized = encoded;
33
+ }
34
+ catch (error) {
35
+ onComplete?.(asError(error));
36
+ return {
37
+ status: "send_failed",
38
+ byteLength: 0,
39
+ bufferedAmount,
40
+ projectedBufferedAmount: bufferedAmount,
41
+ aboveHighWaterMark: bufferedAmount >= highWaterMarkBytes,
42
+ error,
43
+ };
44
+ }
45
+ const byteLength = Buffer.byteLength(serialized, "utf8");
46
+ const projectedBufferedAmount = bufferedAmount + byteLength;
47
+ // An empty queue may carry one large history/control frame. Under sustained
48
+ // pressure replaceable snapshots are skipped; every other frame closes the
49
+ // socket instead of growing ws.bufferedAmount without bound. Reliable terminal
50
+ // events and responses remain owned by the ACK outbox for reconnect replay.
51
+ if (bufferedAmount > 0 && projectedBufferedAmount > highWaterMarkBytes) {
52
+ if (isRecoverableStreamingSnapshot(message)) {
53
+ return {
54
+ status: "backpressure_skipped",
55
+ byteLength,
56
+ bufferedAmount,
57
+ projectedBufferedAmount,
58
+ aboveHighWaterMark: true,
59
+ };
60
+ }
61
+ closeBackpressuredSocket(ws);
62
+ return {
63
+ status: "backpressure_disconnected",
64
+ byteLength,
65
+ bufferedAmount,
66
+ projectedBufferedAmount,
67
+ aboveHighWaterMark: true,
68
+ };
69
+ }
70
+ try {
71
+ ws.send(serialized, { compress: byteLength >= RELAY_WS_COMPRESSION_THRESHOLD_BYTES }, (error) => {
72
+ if (onComplete) {
73
+ onComplete(error);
74
+ }
75
+ else if (error) {
76
+ console.warn(`[relay] asynchronous WebSocket send failed: ${error.message}`);
77
+ }
78
+ });
79
+ }
80
+ catch (error) {
81
+ onComplete?.(asError(error));
82
+ return {
83
+ status: "send_failed",
84
+ byteLength,
85
+ bufferedAmount,
86
+ projectedBufferedAmount,
87
+ aboveHighWaterMark: projectedBufferedAmount >= highWaterMarkBytes,
88
+ error,
89
+ };
9
90
  }
91
+ return {
92
+ status: "sent",
93
+ byteLength,
94
+ bufferedAmount: finiteNonNegative(ws.bufferedAmount),
95
+ projectedBufferedAmount,
96
+ aboveHighWaterMark: projectedBufferedAmount >= highWaterMarkBytes,
97
+ };
98
+ }
99
+ /** Waits for the ws.send callback so a stream coalescer can compensate for async write failures. */
100
+ export function sendRelayJsonWithWriteConfirmation(ws, message, highWaterMarkBytes = RELAY_WS_BACKPRESSURE_HIGH_WATER_MARK_BYTES, timeoutMs = RELAY_WS_WRITE_CONFIRMATION_TIMEOUT_MS) {
101
+ return new Promise((resolve) => {
102
+ let immediate;
103
+ let callbackCompleted = false;
104
+ let callbackError;
105
+ let timer;
106
+ let settled = false;
107
+ const finish = (result) => {
108
+ if (settled)
109
+ return;
110
+ settled = true;
111
+ if (timer)
112
+ clearTimeout(timer);
113
+ resolve(result);
114
+ };
115
+ const finishCallback = () => {
116
+ if (!immediate || immediate.status !== "sent")
117
+ return;
118
+ finish(callbackError
119
+ ? { ...immediate, status: "send_failed", error: callbackError }
120
+ : immediate);
121
+ };
122
+ immediate = sendRelayJson(ws, message, highWaterMarkBytes, (error) => {
123
+ callbackCompleted = true;
124
+ callbackError = error;
125
+ finishCallback();
126
+ });
127
+ if (immediate.status !== "sent") {
128
+ finish(immediate);
129
+ return;
130
+ }
131
+ if (callbackCompleted) {
132
+ finishCallback();
133
+ return;
134
+ }
135
+ timer = setTimeout(() => {
136
+ finish({
137
+ ...immediate,
138
+ status: "send_failed",
139
+ error: new Error("relay_write_confirmation_timeout"),
140
+ });
141
+ }, positiveInteger(timeoutMs, RELAY_WS_WRITE_CONFIRMATION_TIMEOUT_MS));
142
+ });
143
+ }
144
+ function isRecoverableStreamingSnapshot(message) {
145
+ const envelope = asRecord(message);
146
+ if (envelope?.type !== "event")
147
+ return false;
148
+ const payload = asRecord(envelope.payload);
149
+ const office = asRecord(payload?.office);
150
+ const state = normalizedState(payload?.state) || normalizedState(office?.phase);
151
+ if (envelope.event === "office") {
152
+ const kind = normalizedState(office?.kind);
153
+ return STREAMING_STATES.has(state)
154
+ || (STREAMING_OFFICE_KINDS.has(kind) && state !== "final" && state !== "completed");
155
+ }
156
+ if (envelope.event !== "chat" && envelope.event !== "agent")
157
+ return false;
158
+ return STREAMING_STATES.has(state)
159
+ && Array.isArray(payload?.timelineEvents)
160
+ && payload.timelineEvents.some((candidate) => asRecord(candidate)?.eventType === "message.part.delta");
161
+ }
162
+ /**
163
+ * Streaming snapshots carry the complete assistant text in timelineEvents.
164
+ * Remove legacy mirrors only on that canonical path; terminal and non-chat
165
+ * envelopes retain their existing wire shape for mixed-version clients.
166
+ */
167
+ export function compactRelayMessageForTransport(message) {
168
+ if (!message || typeof message !== "object" || Array.isArray(message))
169
+ return message;
170
+ const envelope = message;
171
+ if (envelope.type !== "event" || (envelope.event !== "chat" && envelope.event !== "agent"))
172
+ return message;
173
+ const payload = asRecord(envelope.payload);
174
+ const state = normalizedState(payload?.state);
175
+ if (!payload || !STREAMING_STATES.has(state))
176
+ return message;
177
+ const timelineEvents = Array.isArray(payload.timelineEvents) ? payload.timelineEvents : [];
178
+ if (!timelineEvents.some((candidate) => asRecord(candidate)?.eventType === "message.part.delta"))
179
+ return message;
180
+ const compactPayload = { ...payload };
181
+ delete compactPayload.delta;
182
+ delete compactPayload.text;
183
+ compactPayload.content = nonTextContent(compactPayload.content);
184
+ if (compactPayload.content === undefined)
185
+ delete compactPayload.content;
186
+ const messagePayload = compactTextContainer(compactPayload.message);
187
+ if (messagePayload)
188
+ compactPayload.message = messagePayload;
189
+ else
190
+ delete compactPayload.message;
191
+ const data = asRecord(compactPayload.data);
192
+ if (data) {
193
+ compactPayload.data = compactTextContainer(data) ?? {};
194
+ }
195
+ return { ...envelope, payload: compactPayload };
196
+ }
197
+ function compactTextContainer(value) {
198
+ const record = asRecord(value);
199
+ if (!record)
200
+ return undefined;
201
+ const compact = { ...record };
202
+ delete compact.delta;
203
+ delete compact.text;
204
+ const content = nonTextContent(compact.content);
205
+ if (content === undefined)
206
+ delete compact.content;
207
+ else
208
+ compact.content = content;
209
+ return Object.keys(compact).length > 0 ? compact : undefined;
210
+ }
211
+ function nonTextContent(value) {
212
+ if (!Array.isArray(value))
213
+ return undefined;
214
+ const retained = value.filter((block) => asRecord(block)?.type !== "text");
215
+ return retained.length > 0 ? retained : undefined;
10
216
  }
11
217
  export function parseRelayFrame(raw) {
12
218
  try {
@@ -29,4 +235,41 @@ export function bindRelayAbortSignal(ws, signal) {
29
235
  export function shouldRetryRelayClose(code, signal) {
30
236
  return !(signal?.aborted || code === 4000);
31
237
  }
238
+ function finiteNonNegative(value) {
239
+ return Number.isFinite(value) && value >= 0 ? value : 0;
240
+ }
241
+ function positiveInteger(value, fallback) {
242
+ return Number.isInteger(value) && value > 0 ? value : fallback;
243
+ }
244
+ const STREAMING_STATES = new Set(["delta", "streaming", "in_progress"]);
245
+ const STREAMING_OFFICE_KINDS = new Set(["writing", "researching", "executing"]);
246
+ function normalizedState(value) {
247
+ return typeof value === "string" ? value.trim().toLowerCase() : "";
248
+ }
249
+ function asError(value) {
250
+ return value instanceof Error ? value : new Error(String(value));
251
+ }
252
+ export function disconnectRelaySocketForRecovery(ws, reason) {
253
+ try {
254
+ ws.close(1013, reason);
255
+ return;
256
+ }
257
+ catch {
258
+ try {
259
+ ws.terminate();
260
+ }
261
+ catch {
262
+ // The caller still receives backpressure_disconnected and will stop
263
+ // appending to this socket even if a test double cannot close itself.
264
+ }
265
+ }
266
+ }
267
+ function closeBackpressuredSocket(ws) {
268
+ disconnectRelaySocketForRecovery(ws, "relay_backpressure");
269
+ }
270
+ function asRecord(value) {
271
+ return value && typeof value === "object" && !Array.isArray(value)
272
+ ? value
273
+ : undefined;
274
+ }
32
275
  //# sourceMappingURL=relay-server-connection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"relay-server-connection.js","sourceRoot":"","sources":["../../../src/core/relay/relay-server-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,IAAI,CAAC;AAE7C,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,SAAiB,EAAE,WAAmB;IACrF,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClE,OAAO,GAAG,IAAI,UAAU,SAAS,WAAW,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAa,EAAE,OAAgB;IAC3D,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAI,GAAY;IAC7C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAM,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAa,EAAE,MAAoB;IACtE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,MAAoB;IACtE,OAAO,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"relay-server-connection.js","sourceRoot":"","sources":["../../../src/core/relay/relay-server-connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare const RELAY_RELIABLE_DELIVERY_ACK_CAPABILITY = "reliable_delivery_ack_v1";
2
+ export declare const RELAY_HELLO_NEGOTIATION_TIMEOUT_MS = 10000;
3
+ export type RelayReliableDeliveryMode = "acknowledged" | "legacy_write_confirmed";
4
+ export type RelayHelloDeliveryDeclaration = {
5
+ type?: unknown;
6
+ role?: unknown;
7
+ gatewayId?: unknown;
8
+ ok?: unknown;
9
+ protocolCapabilities?: readonly string[];
10
+ };
11
+ export declare function isValidRelayHello(hello: RelayHelloDeliveryDeclaration, expectedGatewayId: string): boolean;
12
+ /**
13
+ * Relay 必须在 hello.protocolCapabilities 中声明版本化 token,Agent 才进入 ACK 保留模式。
14
+ * 已收到但未声明能力的 hello 明确代表旧协议;单纯等待超时绝不用于降级判断。
15
+ */
16
+ export declare function reliableDeliveryModeFromRelayHello(hello: RelayHelloDeliveryDeclaration): RelayReliableDeliveryMode;
17
+ export declare function relayHelloDeclaresReliableDeliveryAcks(hello: RelayHelloDeliveryDeclaration): boolean;
@@ -0,0 +1,25 @@
1
+ export const RELAY_RELIABLE_DELIVERY_ACK_CAPABILITY = "reliable_delivery_ack_v1";
2
+ export const RELAY_HELLO_NEGOTIATION_TIMEOUT_MS = 10_000;
3
+ export function isValidRelayHello(hello, expectedGatewayId) {
4
+ return hello.type === "hello"
5
+ && hello.role === "relay"
6
+ && hello.ok === true
7
+ && typeof hello.gatewayId === "string"
8
+ && hello.gatewayId.trim() === expectedGatewayId.trim();
9
+ }
10
+ /**
11
+ * Relay 必须在 hello.protocolCapabilities 中声明版本化 token,Agent 才进入 ACK 保留模式。
12
+ * 已收到但未声明能力的 hello 明确代表旧协议;单纯等待超时绝不用于降级判断。
13
+ */
14
+ export function reliableDeliveryModeFromRelayHello(hello) {
15
+ const capabilities = new Set(Array.isArray(hello.protocolCapabilities)
16
+ ? hello.protocolCapabilities.filter((value) => typeof value === "string")
17
+ : []);
18
+ return capabilities.has(RELAY_RELIABLE_DELIVERY_ACK_CAPABILITY)
19
+ ? "acknowledged"
20
+ : "legacy_write_confirmed";
21
+ }
22
+ export function relayHelloDeclaresReliableDeliveryAcks(hello) {
23
+ return reliableDeliveryModeFromRelayHello(hello) === "acknowledged";
24
+ }
25
+ //# sourceMappingURL=reliable-delivery-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reliable-delivery-protocol.js","sourceRoot":"","sources":["../../../src/core/relay/reliable-delivery-protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sCAAsC,GAAG,0BAA0B,CAAC;AACjF,MAAM,CAAC,MAAM,kCAAkC,GAAG,MAAM,CAAC;AAYzD,MAAM,UAAU,iBAAiB,CAC/B,KAAoC,EACpC,iBAAyB;IAEzB,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO;WACxB,KAAK,CAAC,IAAI,KAAK,OAAO;WACtB,KAAK,CAAC,EAAE,KAAK,IAAI;WACjB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;WACnC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,iBAAiB,CAAC,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAChD,KAAoC;IAEpC,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;QACvC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QAC1F,CAAC,CAAC,EAAE,CACP,CAAC;IACF,OAAO,YAAY,CAAC,GAAG,CAAC,sCAAsC,CAAC;QAC7D,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,wBAAwB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,sCAAsC,CACpD,KAAoC;IAEpC,OAAO,kCAAkC,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC;AACtE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { ReliableRelayOutbox } from "./reliable-relay-outbox.js";
2
+ export declare const RELIABLE_RELAY_OUTBOX_MAX_GATEWAYS = 64;
3
+ export type ReliableRelayOutboxLookupResult = {
4
+ status: "ready";
5
+ outbox: ReliableRelayOutbox;
6
+ } | {
7
+ status: "rejected";
8
+ reason: "gateway_id_required" | "relay_identity_required" | "gateway_limit_reached" | "storage_unavailable";
9
+ error: Error;
10
+ };
11
+ /**
12
+ * Relay、profile 存储目录和 gateway 共同定义唯一队列,禁止跨 Relay 误重放。
13
+ */
14
+ export declare function reliableRelayOutboxForGateway(gatewayId: string, options?: {
15
+ storageDirectory?: string;
16
+ relayIdentity?: string;
17
+ }): ReliableRelayOutboxLookupResult;
18
+ export declare function clearReliableRelayOutboxesForTests(): void;
19
+ export declare function disposeReliableRelayOutboxes(): void;