clawconnect-agent 0.1.11 → 0.1.12

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 (89) hide show
  1. package/dist/commands/send-file.js +25 -5
  2. package/dist/commands/send-file.js.map +1 -1
  3. package/dist/core/relay/timeline-event-builder.d.ts +5 -1
  4. package/dist/core/relay/timeline-event-builder.js +4 -0
  5. package/dist/core/relay/timeline-event-builder.js.map +1 -1
  6. package/dist/core/relay/timeline-event-log.d.ts +3 -0
  7. package/dist/core/relay/timeline-event-log.js +4 -0
  8. package/dist/core/relay/timeline-event-log.js.map +1 -1
  9. package/dist/hermes/hermes-relay-manager.d.ts +27 -24
  10. package/dist/hermes/hermes-relay-manager.js +126 -343
  11. package/dist/hermes/hermes-relay-manager.js.map +1 -1
  12. package/dist/hermes/hermes-runtime-test-support.d.ts +27 -0
  13. package/dist/hermes/hermes-runtime-test-support.js +703 -0
  14. package/dist/hermes/hermes-runtime-test-support.js.map +1 -0
  15. package/dist/hermes/hermes-runtime.d.ts +1 -2
  16. package/dist/hermes/hermes-runtime.js +1 -2
  17. package/dist/hermes/hermes-runtime.js.map +1 -1
  18. package/dist/hermes/relay/active-hermes-chat-runs.d.ts +12 -0
  19. package/dist/hermes/relay/active-hermes-chat-runs.js +42 -0
  20. package/dist/hermes/relay/active-hermes-chat-runs.js.map +1 -0
  21. package/dist/hermes/relay/hermes-slash-command-catalog.d.ts +22 -0
  22. package/dist/hermes/relay/hermes-slash-command-catalog.js +248 -0
  23. package/dist/hermes/relay/hermes-slash-command-catalog.js.map +1 -0
  24. package/dist/hermes/relay/hermes-state-db-realtime.d.ts +69 -0
  25. package/dist/hermes/relay/hermes-state-db-realtime.js +444 -0
  26. package/dist/hermes/relay/hermes-state-db-realtime.js.map +1 -0
  27. package/dist/hermes/runtime/hermes-runtime-api-client.d.ts +15 -0
  28. package/dist/hermes/runtime/hermes-runtime-api-client.js +510 -0
  29. package/dist/hermes/runtime/hermes-runtime-api-client.js.map +1 -0
  30. package/dist/hermes/runtime/hermes-runtime-chat.d.ts +4 -14
  31. package/dist/hermes/runtime/hermes-runtime-chat.js +205 -436
  32. package/dist/hermes/runtime/hermes-runtime-chat.js.map +1 -1
  33. package/dist/hermes/runtime/hermes-runtime-command-utils.d.ts +1 -0
  34. package/dist/hermes/runtime/hermes-runtime-command-utils.js +10 -1
  35. package/dist/hermes/runtime/hermes-runtime-command-utils.js.map +1 -1
  36. package/dist/hermes/runtime/hermes-runtime-history-completion.d.ts +12 -0
  37. package/dist/hermes/runtime/hermes-runtime-history-completion.js +162 -0
  38. package/dist/hermes/runtime/hermes-runtime-history-completion.js.map +1 -0
  39. package/dist/hermes/runtime/hermes-runtime-history.js +85 -22
  40. package/dist/hermes/runtime/hermes-runtime-history.js.map +1 -1
  41. package/dist/hermes/runtime/hermes-runtime-preloaded-skills.d.ts +11 -0
  42. package/dist/hermes/runtime/hermes-runtime-preloaded-skills.js +67 -0
  43. package/dist/hermes/runtime/hermes-runtime-preloaded-skills.js.map +1 -0
  44. package/dist/hermes/runtime/hermes-runtime-process.d.ts +3 -1
  45. package/dist/hermes/runtime/hermes-runtime-process.js +35 -6
  46. package/dist/hermes/runtime/hermes-runtime-process.js.map +1 -1
  47. package/dist/hermes/runtime/hermes-runtime-sessions.js +28 -3
  48. package/dist/hermes/runtime/hermes-runtime-sessions.js.map +1 -1
  49. package/dist/hermes/runtime/hermes-runtime-slash-command.d.ts +8 -0
  50. package/dist/hermes/runtime/hermes-runtime-slash-command.js +144 -0
  51. package/dist/hermes/runtime/hermes-runtime-slash-command.js.map +1 -0
  52. package/dist/hermes/runtime/hermes-runtime-state-db.d.ts +4 -0
  53. package/dist/hermes/runtime/hermes-runtime-state-db.js +193 -0
  54. package/dist/hermes/runtime/hermes-runtime-state-db.js.map +1 -0
  55. package/dist/hermes/runtime/hermes-runtime-tool-log-watcher.d.ts +8 -0
  56. package/dist/hermes/runtime/hermes-runtime-tool-log-watcher.js +121 -0
  57. package/dist/hermes/runtime/hermes-runtime-tool-log-watcher.js.map +1 -0
  58. package/dist/hermes/runtime/hermes-runtime-usage.d.ts +2 -0
  59. package/dist/hermes/runtime/hermes-runtime-usage.js +59 -5
  60. package/dist/hermes/runtime/hermes-runtime-usage.js.map +1 -1
  61. package/dist/openclaw/handlers/local-handlers.js +66 -20
  62. package/dist/openclaw/handlers/local-handlers.js.map +1 -1
  63. package/dist/openclaw/relay/chat-send-dedupe-coordinator.d.ts +20 -0
  64. package/dist/openclaw/relay/chat-send-dedupe-coordinator.js +161 -0
  65. package/dist/openclaw/relay/chat-send-dedupe-coordinator.js.map +1 -0
  66. package/dist/openclaw/relay/relay-manager-hello.d.ts +6 -0
  67. package/dist/openclaw/relay/relay-manager-hello.js +11 -0
  68. package/dist/openclaw/relay/relay-manager-hello.js.map +1 -0
  69. package/dist/openclaw/relay/relay-manager-history-timing.d.ts +5 -0
  70. package/dist/openclaw/relay/relay-manager-history-timing.js +6 -0
  71. package/dist/openclaw/relay/relay-manager-history-timing.js.map +1 -0
  72. package/dist/openclaw/relay/relay-manager-office-events.d.ts +2 -0
  73. package/dist/openclaw/relay/relay-manager-office-events.js +9 -0
  74. package/dist/openclaw/relay/relay-manager-office-events.js.map +1 -0
  75. package/dist/openclaw/relay/relay-manager-payload-helpers.d.ts +18 -0
  76. package/dist/openclaw/relay/relay-manager-payload-helpers.js +213 -0
  77. package/dist/openclaw/relay/relay-manager-payload-helpers.js.map +1 -0
  78. package/dist/openclaw/relay/relay-manager-protocol.d.ts +49 -0
  79. package/dist/openclaw/relay/relay-manager-protocol.js +2 -0
  80. package/dist/openclaw/relay/relay-manager-protocol.js.map +1 -0
  81. package/dist/openclaw/relay-manager.d.ts +3 -27
  82. package/dist/openclaw/relay-manager.js +19 -402
  83. package/dist/openclaw/relay-manager.js.map +1 -1
  84. package/dist/openclaw/session-store.js +42 -1
  85. package/dist/openclaw/session-store.js.map +1 -1
  86. package/package.json +1 -1
  87. package/dist/hermes/runtime/hermes-runtime-artifacts.d.ts +0 -3
  88. package/dist/hermes/runtime/hermes-runtime-artifacts.js +0 -75
  89. package/dist/hermes/runtime/hermes-runtime-artifacts.js.map +0 -1
@@ -0,0 +1,161 @@
1
+ import { dedupeOpenClawChatSendUserMirrorTranscript, } from "./transcript-dedupe.js";
2
+ import { canonicalizeSessionKey, } from "./session-context.js";
3
+ const CHAT_SEND_MIRROR_DEDUPE_RETRY_DELAYS_MS = [250, 1000, 2500, 5000, 10000, 20000, 30000];
4
+ export class OpenClawChatSendDedupeCoordinator {
5
+ getSessionDefaults;
6
+ requests = new Map();
7
+ runKeys = new Map();
8
+ timers = new Map();
9
+ attempts = new Map();
10
+ running = new Map();
11
+ // OpenClaw 本地 transcript 写入和 relay 回包不是同一事务,必须用 clientRunId 做确定性去重键,
12
+ // 通过有限重试等待落盘;不能用文本相同或时间接近来合并消息。
13
+ constructor(getSessionDefaults) {
14
+ this.getSessionDefaults = getSessionDefaults;
15
+ }
16
+ register(request, runId) {
17
+ this.requests.set(request.clientRunId, request);
18
+ if (runId) {
19
+ this.runKeys.set(runId, request.clientRunId);
20
+ }
21
+ this.schedule(request.clientRunId);
22
+ }
23
+ scheduleForRun(runId, delayMs = 100) {
24
+ const clientRunId = this.runKeys.get(runId);
25
+ if (!clientRunId) {
26
+ return;
27
+ }
28
+ this.schedule(clientRunId, delayMs);
29
+ }
30
+ async dedupePendingForSession(rawParams) {
31
+ const sessionKey = this.resolveRawParamsSessionKey(rawParams);
32
+ const pending = Array.from(this.requests.entries()).filter(([, request]) => {
33
+ const requestSessionKey = canonicalizeSessionKey(request.sessionKey ?? this.getSessionDefaults().mainSessionKey, this.getSessionDefaults());
34
+ return requestSessionKey === sessionKey;
35
+ });
36
+ for (const [clientRunId] of pending) {
37
+ await this.runAttempt(clientRunId);
38
+ }
39
+ }
40
+ buildRequest(paramsRecord) {
41
+ if (!paramsRecord) {
42
+ return undefined;
43
+ }
44
+ const message = typeof paramsRecord.message === "string" && paramsRecord.message.trim().length > 0
45
+ ? paramsRecord.message.trim()
46
+ : "";
47
+ const idempotencyKey = typeof paramsRecord.idempotencyKey === "string" && paramsRecord.idempotencyKey.trim().length > 0
48
+ ? paramsRecord.idempotencyKey.trim()
49
+ : "";
50
+ if (!message || !idempotencyKey) {
51
+ return undefined;
52
+ }
53
+ const clientRunId = idempotencyKey.endsWith(":user")
54
+ ? idempotencyKey.slice(0, -":user".length)
55
+ : idempotencyKey;
56
+ if (!clientRunId) {
57
+ return undefined;
58
+ }
59
+ return {
60
+ clientRunId,
61
+ message,
62
+ sessionKey: this.resolveRawParamsSessionKey(paramsRecord),
63
+ senderId: "openclaw-macos",
64
+ senderName: "ClawConnect Agent",
65
+ };
66
+ }
67
+ clearAll() {
68
+ for (const timer of this.timers.values()) {
69
+ clearTimeout(timer);
70
+ }
71
+ this.timers.clear();
72
+ this.requests.clear();
73
+ this.runKeys.clear();
74
+ this.attempts.clear();
75
+ this.running.clear();
76
+ }
77
+ clear(clientRunId) {
78
+ const timer = this.timers.get(clientRunId);
79
+ if (timer) {
80
+ clearTimeout(timer);
81
+ this.timers.delete(clientRunId);
82
+ }
83
+ this.requests.delete(clientRunId);
84
+ this.attempts.delete(clientRunId);
85
+ for (const [runId, mappedClientRunId] of this.runKeys.entries()) {
86
+ if (mappedClientRunId === clientRunId) {
87
+ this.runKeys.delete(runId);
88
+ }
89
+ }
90
+ }
91
+ schedule(clientRunId, delayOverrideMs) {
92
+ if (!this.requests.has(clientRunId)) {
93
+ return;
94
+ }
95
+ const existing = this.timers.get(clientRunId);
96
+ if (existing) {
97
+ clearTimeout(existing);
98
+ }
99
+ const attempt = this.attempts.get(clientRunId) ?? 0;
100
+ const delayMs = delayOverrideMs ?? CHAT_SEND_MIRROR_DEDUPE_RETRY_DELAYS_MS[Math.min(attempt, CHAT_SEND_MIRROR_DEDUPE_RETRY_DELAYS_MS.length - 1)];
101
+ const timer = setTimeout(() => {
102
+ this.timers.delete(clientRunId);
103
+ void this.runAttempt(clientRunId).then((changed) => {
104
+ if (changed || !this.requests.has(clientRunId)) {
105
+ return;
106
+ }
107
+ const nextAttempt = attempt + 1;
108
+ if (nextAttempt >= CHAT_SEND_MIRROR_DEDUPE_RETRY_DELAYS_MS.length) {
109
+ this.clear(clientRunId);
110
+ return;
111
+ }
112
+ this.attempts.set(clientRunId, nextAttempt);
113
+ this.schedule(clientRunId);
114
+ });
115
+ }, delayMs);
116
+ timer.unref?.();
117
+ this.timers.set(clientRunId, timer);
118
+ }
119
+ async runAttempt(clientRunId) {
120
+ const running = this.running.get(clientRunId);
121
+ if (running) {
122
+ return running;
123
+ }
124
+ const promise = (async () => {
125
+ const request = this.requests.get(clientRunId);
126
+ if (!request) {
127
+ return false;
128
+ }
129
+ try {
130
+ const result = await dedupeOpenClawChatSendUserMirrorTranscript(request, this.getSessionDefaults(), { maxRetries: 2 });
131
+ if (result.changed) {
132
+ console.log(`[relay] removed ${result.removedCount} duplicate OpenClaw prompt mirror(s) from ${result.transcriptPath ?? "transcript"}`);
133
+ this.clear(clientRunId);
134
+ return true;
135
+ }
136
+ }
137
+ catch (error) {
138
+ console.warn(`[relay] chat.send transcript dedupe failed runId=${clientRunId}: ${String(error)}`);
139
+ }
140
+ return false;
141
+ })().finally(() => {
142
+ this.running.delete(clientRunId);
143
+ });
144
+ this.running.set(clientRunId, promise);
145
+ return promise;
146
+ }
147
+ resolveRawParamsSessionKey(rawParams) {
148
+ const sessionDefaults = this.getSessionDefaults();
149
+ const record = rawParams && typeof rawParams === "object" && !Array.isArray(rawParams)
150
+ ? rawParams
151
+ : {};
152
+ const rawSessionKey = typeof record.sessionKey === "string" && record.sessionKey.trim().length > 0
153
+ ? record.sessionKey.trim()
154
+ : sessionDefaults.mainSessionKey;
155
+ const normalized = canonicalizeSessionKey(rawSessionKey, sessionDefaults);
156
+ return typeof normalized === "string" && normalized.trim().length > 0
157
+ ? normalized.trim()
158
+ : sessionDefaults.mainSessionKey;
159
+ }
160
+ }
161
+ //# sourceMappingURL=chat-send-dedupe-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-send-dedupe-coordinator.js","sourceRoot":"","sources":["../../../src/openclaw/relay/chat-send-dedupe-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RelayHelloMessage } from "./relay-manager-protocol.js";
2
+ export declare function buildRelayHelloMessage(opts: {
3
+ platform: string;
4
+ agentVersion: string;
5
+ capabilities?: string[];
6
+ }): RelayHelloMessage;
@@ -0,0 +1,11 @@
1
+ import { OPENCLAW_SLASH_COMMAND_CATALOG } from "./slash-command-catalog.js";
2
+ export function buildRelayHelloMessage(opts) {
3
+ return {
4
+ type: "hello",
5
+ platform: opts.platform,
6
+ agentVersion: opts.agentVersion,
7
+ capabilities: opts.capabilities,
8
+ slashCommands: OPENCLAW_SLASH_COMMAND_CATALOG,
9
+ };
10
+ }
11
+ //# sourceMappingURL=relay-manager-hello.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-manager-hello.js","sourceRoot":"","sources":["../../../src/openclaw/relay/relay-manager-hello.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAG5E,MAAM,UAAU,sBAAsB,CAAC,IAItC;IACC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,aAAa,EAAE,8BAA8B;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const CHAT_HISTORY_FETCH_TIMEOUT_MS = 3000;
2
+ export declare const CHAT_HISTORY_FALLBACK_INITIAL_DELAY_MS = 1200;
3
+ export declare const CHAT_HISTORY_FALLBACK_RETRY_DELAY_MS = 1800;
4
+ export declare const CHAT_HISTORY_FALLBACK_MAX_ATTEMPTS = 120;
5
+ export declare const CHAT_HISTORY_FINAL_RETRY_DELAY_MS = 750;
@@ -0,0 +1,6 @@
1
+ export const CHAT_HISTORY_FETCH_TIMEOUT_MS = 3000;
2
+ export const CHAT_HISTORY_FALLBACK_INITIAL_DELAY_MS = 1200;
3
+ export const CHAT_HISTORY_FALLBACK_RETRY_DELAY_MS = 1800;
4
+ export const CHAT_HISTORY_FALLBACK_MAX_ATTEMPTS = 120;
5
+ export const CHAT_HISTORY_FINAL_RETRY_DELAY_MS = 750;
6
+ //# sourceMappingURL=relay-manager-history-timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-manager-history-timing.js","sourceRoot":"","sources":["../../../src/openclaw/relay/relay-manager-history-timing.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAClD,MAAM,CAAC,MAAM,sCAAsC,GAAG,IAAI,CAAC;AAC3D,MAAM,CAAC,MAAM,oCAAoC,GAAG,IAAI,CAAC;AACzD,MAAM,CAAC,MAAM,kCAAkC,GAAG,GAAG,CAAC;AACtD,MAAM,CAAC,MAAM,iCAAiC,GAAG,GAAG,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { OpenClawRelayToServer } from "./relay-manager-protocol.js";
2
+ export declare function publishOfficeSnapshot(send: (message: OpenClawRelayToServer) => void, eventName: string, payload: unknown): void;
@@ -0,0 +1,9 @@
1
+ import { buildOfficeEventPayload } from "../../core/relay/office-payload.js";
2
+ export function publishOfficeSnapshot(send, eventName, payload) {
3
+ const officePayload = buildOfficeEventPayload(eventName, payload, () => new Date().toISOString());
4
+ if (!officePayload) {
5
+ return;
6
+ }
7
+ send({ type: "event", event: "office", payload: officePayload });
8
+ }
9
+ //# sourceMappingURL=relay-manager-office-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-manager-office-events.js","sourceRoot":"","sources":["../../../src/openclaw/relay/relay-manager-office-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAG7E,MAAM,UAAU,qBAAqB,CACnC,IAA8C,EAC9C,SAAiB,EACjB,OAAgB;IAEhB,MAAM,aAAa,GAAG,uBAAuB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAClG,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { MobileAssistantUsage } from "../../core/relay/mobile-chat-run-bridge.js";
2
+ import type { TimelineContentBlock } from "../../core/relay/timeline-event-log.js";
3
+ import { type GatewaySessionDefaults } from "./session-context.js";
4
+ import type { ChatHistoryOutcome, HistoryMessage, HistoryResponse } from "./chat-history.js";
5
+ export declare function shouldUseLegacyOpenClawHistoryFallback(params: unknown, sessionDefaults: GatewaySessionDefaults): boolean;
6
+ export declare function buildLegacyOpenClawHistoryParams(params: unknown, sessionDefaults: GatewaySessionDefaults): Record<string, unknown>;
7
+ export declare function buildEmptyHistoryPage(params: unknown, sessionDefaults: GatewaySessionDefaults): HistoryResponse;
8
+ export declare function hasHistoryCursor(params: unknown): boolean;
9
+ export declare function buildFinalPayloadFromHistoryOutcome(basePayload: unknown, outcome: Extract<ChatHistoryOutcome, {
10
+ kind: "final";
11
+ }>): unknown;
12
+ export declare function mergeCanonicalChatPayload(basePayload: unknown, canonicalPayload: unknown): unknown;
13
+ export declare function resolveChatPayloadSeq(payload: unknown): number;
14
+ export declare function resolveChatPayloadTimestamp(payload: unknown): number;
15
+ export declare function extractChatErrorMessage(payload: unknown): string;
16
+ export declare function mobileAssistantUsageFromPayload(payload: unknown): MobileAssistantUsage;
17
+ export declare function nonTextContentBlocks(payload: unknown): TimelineContentBlock[];
18
+ export declare function nonTextContentBlocksFromHistory(message: HistoryMessage): TimelineContentBlock[];
@@ -0,0 +1,213 @@
1
+ import { withMessageText } from "../../core/relay/chat-payload.js";
2
+ import { canonicalizeSessionKey, } from "./session-context.js";
3
+ export function shouldUseLegacyOpenClawHistoryFallback(params, sessionDefaults) {
4
+ const record = asRecord(params) ?? {};
5
+ const rawSessionKey = typeof record.sessionKey === "string" && record.sessionKey.trim().length > 0
6
+ ? record.sessionKey.trim()
7
+ : sessionDefaults.mainSessionKey;
8
+ const normalized = canonicalizeSessionKey(rawSessionKey, sessionDefaults);
9
+ return typeof normalized === "string" && normalized === sessionDefaults.mainSessionKey;
10
+ }
11
+ // legacy OpenClaw 只可靠暴露主会话历史。非主会话不能回退到 legacy 参数,
12
+ // 否则会把其他会话的历史映射到当前移动端 session。
13
+ export function buildLegacyOpenClawHistoryParams(params, sessionDefaults) {
14
+ const record = asRecord(params) ?? {};
15
+ const rawSessionKey = typeof record.sessionKey === "string" && record.sessionKey.trim().length > 0
16
+ ? record.sessionKey.trim()
17
+ : sessionDefaults.mainSessionKey;
18
+ const sessionKey = canonicalizeSessionKey(rawSessionKey, sessionDefaults);
19
+ const legacyParams = {
20
+ sessionKey: typeof sessionKey === "string" && sessionKey.trim().length > 0
21
+ ? sessionKey.trim()
22
+ : sessionDefaults.mainSessionKey,
23
+ };
24
+ const limit = normalizePositiveInteger(record.limit);
25
+ if (limit !== undefined) {
26
+ legacyParams.limit = limit;
27
+ }
28
+ const maxChars = normalizePositiveInteger(record.maxChars);
29
+ if (maxChars !== undefined) {
30
+ legacyParams.maxChars = maxChars;
31
+ }
32
+ return legacyParams;
33
+ }
34
+ export function buildEmptyHistoryPage(params, sessionDefaults) {
35
+ const record = asRecord(params) ?? {};
36
+ const rawSessionKey = typeof record.sessionKey === "string" && record.sessionKey.trim().length > 0
37
+ ? record.sessionKey.trim()
38
+ : sessionDefaults.mainSessionKey;
39
+ const sessionKey = canonicalizeSessionKey(rawSessionKey, sessionDefaults);
40
+ return {
41
+ sessionKey: typeof sessionKey === "string" && sessionKey.trim().length > 0
42
+ ? sessionKey.trim()
43
+ : sessionDefaults.mainSessionKey,
44
+ messages: [],
45
+ hasMore: false,
46
+ };
47
+ }
48
+ export function hasHistoryCursor(params) {
49
+ const cursor = asRecord(params)?.cursor;
50
+ return typeof cursor === "string" && cursor.trim().length > 0;
51
+ }
52
+ export function buildFinalPayloadFromHistoryOutcome(basePayload, outcome) {
53
+ const payload = outcome.text.trim()
54
+ ? withMessageText(basePayload, outcome.text)
55
+ : asRecord(basePayload)
56
+ ? { ...asRecord(basePayload) }
57
+ : {};
58
+ const historyMessage = outcome.message;
59
+ const content = Array.isArray(historyMessage.content) ? historyMessage.content : [];
60
+ if (content.length === 0) {
61
+ return payload;
62
+ }
63
+ const payloadRecord = asRecord(payload) ?? {};
64
+ const existingMessage = asRecord(payloadRecord.message) ?? {};
65
+ return {
66
+ ...payloadRecord,
67
+ message: {
68
+ ...existingMessage,
69
+ ...stripUndefinedHistoryMessageFields(historyMessage),
70
+ role: "assistant",
71
+ content,
72
+ },
73
+ };
74
+ }
75
+ export function mergeCanonicalChatPayload(basePayload, canonicalPayload) {
76
+ const base = asRecord(basePayload);
77
+ const canonical = asRecord(canonicalPayload);
78
+ if (!base) {
79
+ return canonicalPayload;
80
+ }
81
+ if (!canonical) {
82
+ return basePayload;
83
+ }
84
+ const baseMessage = asRecord(base.message);
85
+ const canonicalMessage = asRecord(canonical.message);
86
+ const merged = {
87
+ ...base,
88
+ ...canonical,
89
+ };
90
+ return baseMessage || canonicalMessage
91
+ ? {
92
+ ...merged,
93
+ message: {
94
+ ...(baseMessage ?? {}),
95
+ ...(canonicalMessage ?? {}),
96
+ },
97
+ }
98
+ : merged;
99
+ }
100
+ export function resolveChatPayloadSeq(payload) {
101
+ return normalizeFiniteNumber(deepField(payload, ["seq", "sequence", "index"]))
102
+ ?? resolveChatPayloadTimestamp(payload);
103
+ }
104
+ export function resolveChatPayloadTimestamp(payload) {
105
+ const value = normalizeFiniteNumber(deepField(payload, ["ts", "timestamp", "createdAt", "created_at", "time"]));
106
+ if (value !== undefined) {
107
+ return value > 10_000_000_000 ? Math.round(value) : Math.round(value * 1000);
108
+ }
109
+ return Date.now();
110
+ }
111
+ export function extractChatErrorMessage(payload) {
112
+ const direct = firstNonEmptyString(deepField(payload, ["errorMessage", "error_message", "message", "text"]));
113
+ if (direct) {
114
+ return direct;
115
+ }
116
+ const error = asRecord(asRecord(payload)?.error);
117
+ const nested = firstNonEmptyString(error?.message, error?.userMessage, error?.detail);
118
+ return nested ?? "Request failed";
119
+ }
120
+ export function mobileAssistantUsageFromPayload(payload) {
121
+ const record = asRecord(payload);
122
+ const usage = asRecord(record?.usage);
123
+ return stripUndefined({
124
+ currentModel: firstNonEmptyString(record?.currentModel, record?.model, usage?.currentModel, usage?.model),
125
+ provider: firstNonEmptyString(record?.provider, usage?.provider),
126
+ contextUsage: normalizeNonNegativeInteger(record?.contextUsage)
127
+ ?? normalizeNonNegativeInteger(record?.promptTokens)
128
+ ?? normalizeNonNegativeInteger(record?.inputTokens)
129
+ ?? normalizeNonNegativeInteger(usage?.contextUsage)
130
+ ?? normalizeNonNegativeInteger(usage?.promptTokens)
131
+ ?? normalizeNonNegativeInteger(usage?.inputTokens),
132
+ contextLimit: normalizeNonNegativeInteger(record?.contextLimit)
133
+ ?? normalizeNonNegativeInteger(record?.maxInputTokens)
134
+ ?? normalizeNonNegativeInteger(usage?.contextLimit)
135
+ ?? normalizeNonNegativeInteger(usage?.maxInputTokens),
136
+ });
137
+ }
138
+ export function nonTextContentBlocks(payload) {
139
+ const payloadRecord = asRecord(payload);
140
+ const message = asRecord(payloadRecord?.message);
141
+ const topLevelContent = payloadRecord?.content;
142
+ const content = Array.isArray(message?.content)
143
+ ? message.content
144
+ : Array.isArray(topLevelContent)
145
+ ? topLevelContent
146
+ : [];
147
+ return content.filter((block) => {
148
+ const record = asRecord(block);
149
+ return Boolean(record?.type) && record?.type !== "text";
150
+ });
151
+ }
152
+ export function nonTextContentBlocksFromHistory(message) {
153
+ return Array.isArray(message.content)
154
+ ? message.content.filter((block) => {
155
+ const record = asRecord(block);
156
+ return Boolean(record?.type) && record?.type !== "text";
157
+ })
158
+ : [];
159
+ }
160
+ function stripUndefinedHistoryMessageFields(message) {
161
+ return Object.fromEntries(Object.entries(message).filter(([, value]) => value !== undefined));
162
+ }
163
+ function normalizePositiveInteger(value) {
164
+ const parsed = typeof value === "number" && Number.isFinite(value)
165
+ ? Math.round(value)
166
+ : typeof value === "string" && value.trim().length > 0
167
+ ? Number.parseInt(value.trim(), 10)
168
+ : Number.NaN;
169
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
170
+ }
171
+ function deepField(payload, keys) {
172
+ const record = asRecord(payload);
173
+ const message = asRecord(record?.message);
174
+ const data = asRecord(record?.data);
175
+ for (const key of keys) {
176
+ if (record && record[key] !== undefined)
177
+ return record[key];
178
+ if (message && message[key] !== undefined)
179
+ return message[key];
180
+ if (data && data[key] !== undefined)
181
+ return data[key];
182
+ }
183
+ return undefined;
184
+ }
185
+ function firstNonEmptyString(...values) {
186
+ for (const value of values) {
187
+ if (typeof value === "string" && value.trim().length > 0) {
188
+ return value.trim();
189
+ }
190
+ }
191
+ return undefined;
192
+ }
193
+ function normalizeFiniteNumber(value) {
194
+ const number = typeof value === "number" && Number.isFinite(value)
195
+ ? value
196
+ : typeof value === "string" && value.trim().length > 0
197
+ ? Number(value.trim())
198
+ : Number.NaN;
199
+ return Number.isFinite(number) ? number : undefined;
200
+ }
201
+ function normalizeNonNegativeInteger(value) {
202
+ const number = normalizeFiniteNumber(value);
203
+ return number !== undefined && number >= 0 ? Math.round(number) : undefined;
204
+ }
205
+ function stripUndefined(value) {
206
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
207
+ }
208
+ function asRecord(value) {
209
+ return value && typeof value === "object" && !Array.isArray(value)
210
+ ? value
211
+ : undefined;
212
+ }
213
+ //# sourceMappingURL=relay-manager-payload-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-manager-payload-helpers.js","sourceRoot":"","sources":["../../../src/openclaw/relay/relay-manager-payload-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { RelaySlashCommandDescriptor } from "../../core/relay/slash-command-types.js";
2
+ /** Messages the OpenClaw relay client sends to the relay server. */
3
+ export type RelayHelloMessage = {
4
+ type: "hello";
5
+ platform: string;
6
+ agentVersion: string;
7
+ capabilities?: string[];
8
+ slashCommands?: readonly RelaySlashCommandDescriptor[];
9
+ };
10
+ export type OpenClawRelayToServer = RelayHelloMessage | {
11
+ type: "heartbeat";
12
+ } | {
13
+ type: "gateway_connected";
14
+ } | {
15
+ type: "gateway_disconnected";
16
+ reason: string;
17
+ } | {
18
+ type: "event";
19
+ event: string;
20
+ payload: unknown;
21
+ } | {
22
+ type: "res";
23
+ id: string;
24
+ ok: boolean;
25
+ payload?: unknown;
26
+ error?: {
27
+ message?: string;
28
+ };
29
+ };
30
+ /** Messages the relay server sends to the OpenClaw relay client. */
31
+ export interface OpenClawRelayFromServer {
32
+ type: "cmd" | "hello" | "heartbeat";
33
+ id?: string;
34
+ method: string;
35
+ params: unknown;
36
+ }
37
+ export interface RelayManagerOptions {
38
+ relayServerUrl: string;
39
+ gatewayId: string;
40
+ relaySecret: string;
41
+ gatewayUrl: string | (() => string);
42
+ gatewayToken?: string;
43
+ gatewayPassword?: string;
44
+ onConnected?: () => void;
45
+ onDisconnected?: () => void;
46
+ /** Optional abort signal. When aborted the relay WebSocket is closed
47
+ * cleanly (code 1001) and the retry loop stops. */
48
+ signal?: AbortSignal;
49
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=relay-manager-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-manager-protocol.js","sourceRoot":"","sources":["../../../src/openclaw/relay/relay-manager-protocol.ts"],"names":[],"mappings":""}
@@ -1,25 +1,6 @@
1
- import type { RelaySlashCommandDescriptor } from "../core/relay/slash-command-types.js";
2
- /** Messages the relay client sends to the relay server. */
3
- export type RelayHelloMessage = {
4
- type: "hello";
5
- platform: string;
6
- agentVersion: string;
7
- capabilities?: string[];
8
- slashCommands?: readonly RelaySlashCommandDescriptor[];
9
- };
10
- export interface RelayManagerOptions {
11
- relayServerUrl: string;
12
- gatewayId: string;
13
- relaySecret: string;
14
- gatewayUrl: string | (() => string);
15
- gatewayToken?: string;
16
- gatewayPassword?: string;
17
- onConnected?: () => void;
18
- onDisconnected?: () => void;
19
- /** Optional abort signal. When aborted the relay WebSocket is closed
20
- * cleanly (code 1001) and the retry loop stops. */
21
- signal?: AbortSignal;
22
- }
1
+ import type { RelayManagerOptions } from "./relay/relay-manager-protocol.js";
2
+ export { buildRelayHelloMessage } from "./relay/relay-manager-hello.js";
3
+ export type { RelayHelloMessage, RelayManagerOptions } from "./relay/relay-manager-protocol.js";
23
4
  /**
24
5
  * Connects to the cloud relay server and the local OpenClaw Gateway,
25
6
  * then bridges messages between them indefinitely.
@@ -29,8 +10,3 @@ export interface RelayManagerOptions {
29
10
  * connection closes.
30
11
  */
31
12
  export declare function runRelayManager(opts: RelayManagerOptions): Promise<boolean>;
32
- export declare function buildRelayHelloMessage(opts: {
33
- platform: string;
34
- agentVersion: string;
35
- capabilities?: string[];
36
- }): RelayHelloMessage;