clawconnect-agent 0.2.4 → 0.2.5

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 CHANGED
@@ -422,7 +422,7 @@ Tests are colocated with the source as `*.test.ts`. They run with `npm test`, an
422
422
  ## Requirements
423
423
 
424
424
  - macOS, Linux, or Windows 10 / Server 2016+
425
- - Node.js 18+
425
+ - Node.js 22.19+
426
426
 
427
427
  ## License
428
428
 
package/README.zh-CN.md CHANGED
@@ -477,7 +477,7 @@ clawconnect-agent/
477
477
  ## 前置要求
478
478
 
479
479
  - macOS、Linux 或 Windows 10 / Server 2016+
480
- - Node.js `18+`
480
+ - Node.js `22.19+`
481
481
  - 本机已安装并可运行 `openclaw`
482
482
  - 本机 OpenClaw Gateway 能正常启动
483
483
 
@@ -1,3 +1,4 @@
1
+ import { type GatewayClientMode, type GatewayClientName } from "@openclaw/gateway-protocol/client-info";
1
2
  export declare function gatewayWebSocketOrigin(url: string): string;
2
3
  export interface GatewayClientOptions {
3
4
  url: string | (() => string);
@@ -6,27 +7,30 @@ export interface GatewayClientOptions {
6
7
  role?: string;
7
8
  scopes?: string[];
8
9
  caps?: string[];
9
- clientMode?: string;
10
- clientId?: string;
10
+ clientMode?: GatewayClientMode;
11
+ clientId?: GatewayClientName;
11
12
  clientDisplayName?: string;
12
13
  clientVersion?: string;
13
14
  onConnected: () => void;
14
15
  onEvent: (eventName: string, payload: unknown) => void;
15
16
  onDisconnected: (reason: string) => void;
16
17
  }
18
+ /**
19
+ * ClawConnect's compatibility wrapper around OpenClaw's reference v4 client.
20
+ *
21
+ * ClawConnect is a WebChat bridge, not the bundled Control UI. Advertising the
22
+ * WebChat identity preserves chat routing while avoiding Control UI build-ID
23
+ * checks that third-party clients cannot satisfy.
24
+ */
17
25
  export declare class OpenClawGatewayClient {
18
26
  private readonly opts;
19
- private ws;
20
- private pending;
21
- private backoffMs;
27
+ private client;
28
+ private activeUrl;
22
29
  private stopped;
23
- private connectNonce;
24
- private connectSent;
25
- private storedDeviceToken;
26
- private connectTimer;
27
- private tickTimer;
28
- private lastTick;
29
- private tickIntervalMs;
30
+ private reconnectTimer;
31
+ private storedDeviceAuth;
32
+ private responseHookRequests;
33
+ private bufferedEvents;
30
34
  private readonly identity;
31
35
  constructor(opts: GatewayClientOptions);
32
36
  start(): void;
@@ -36,10 +40,6 @@ export declare class OpenClawGatewayClient {
36
40
  onResponse?: (value: T) => void;
37
41
  }): Promise<T>;
38
42
  private resolveUrl;
39
- private sendConnect;
40
- private handleMessage;
41
- private startTickWatch;
42
- private scheduleReconnect;
43
- private teardown;
44
- private flushPending;
43
+ private recreateForChangedUrl;
44
+ private flushBufferedEvents;
45
45
  }
@@ -1,22 +1,31 @@
1
- import { WebSocket } from "ws";
2
- import { randomUUID, generateKeyPairSync, createPrivateKey, sign, createPublicKey, createHash } from "node:crypto";
3
- import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
4
- import { join } from "node:path";
1
+ import { GatewayClient, } from "@openclaw/gateway-client";
2
+ import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES, } from "@openclaw/gateway-protocol/client-info";
3
+ import { PROTOCOL_VERSION } from "@openclaw/gateway-protocol/version";
4
+ import { createHash, createPrivateKey, createPublicKey, generateKeyPairSync, sign, } from "node:crypto";
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
6
  import { homedir } from "node:os";
7
+ import { join } from "node:path";
6
8
  import { setRestrictiveDirPermissions, setRestrictiveFilePermissions, } from "../platform/service-manager-common.js";
7
- // ---------------------------------------------------------------------------
8
- // Device identity (Ed25519, persisted across restarts)
9
- // ---------------------------------------------------------------------------
9
+ import { CLAWCONNECT_AGENT_VERSION } from "../runtime-metadata.js";
10
10
  const IDENTITY_PATH = join(homedir(), ".clawconnect", "device-identity.json");
11
11
  const ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
12
+ const DEFAULT_CLIENT_ID = GATEWAY_CLIENT_NAMES.WEBCHAT_UI;
13
+ const DEFAULT_CLIENT_MODE = GATEWAY_CLIENT_MODES.WEBCHAT;
14
+ const DEFAULT_SCOPES = [
15
+ "operator.admin",
16
+ "operator.read",
17
+ "operator.write",
18
+ "operator.approvals",
19
+ "operator.pairing",
20
+ ];
12
21
  function base64UrlEncode(buf) {
13
- return buf.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/g, "");
22
+ return buf.toString("base64url");
14
23
  }
15
24
  function rawPublicKeyBytes(publicKeyPem) {
16
25
  const key = createPublicKey(publicKeyPem);
17
26
  const spki = key.export({ type: "spki", format: "der" });
18
- if (spki.length === ED25519_SPKI_PREFIX.length + 32 &&
19
- spki.subarray(0, ED25519_SPKI_PREFIX.length).equals(ED25519_SPKI_PREFIX)) {
27
+ if (spki.length === ED25519_SPKI_PREFIX.length + 32
28
+ && spki.subarray(0, ED25519_SPKI_PREFIX.length).equals(ED25519_SPKI_PREFIX)) {
20
29
  return spki.subarray(ED25519_SPKI_PREFIX.length);
21
30
  }
22
31
  return spki;
@@ -26,10 +35,12 @@ function loadOrCreateDeviceIdentity() {
26
35
  try {
27
36
  const stored = JSON.parse(readFileSync(IDENTITY_PATH, "utf8"));
28
37
  if (stored.deviceId && stored.publicKeyPem && stored.privateKeyPem) {
29
- return { deviceId: stored.deviceId, publicKeyPem: stored.publicKeyPem, privateKeyPem: stored.privateKeyPem };
38
+ return stored;
30
39
  }
31
40
  }
32
- catch { /* fall through */ }
41
+ catch {
42
+ // Generate a replacement below when the persisted identity is unreadable.
43
+ }
33
44
  }
34
45
  const { publicKey, privateKey } = generateKeyPairSync("ed25519");
35
46
  const publicKeyPem = publicKey.export({ type: "spki", format: "pem" }).toString();
@@ -38,38 +49,11 @@ function loadOrCreateDeviceIdentity() {
38
49
  const identity = { deviceId, publicKeyPem, privateKeyPem };
39
50
  const clawconnectDir = join(homedir(), ".clawconnect");
40
51
  mkdirSync(clawconnectDir, { recursive: true });
41
- writeFileSync(IDENTITY_PATH, JSON.stringify({ version: 1, ...identity, createdAtMs: Date.now() }, null, 2) + "\n", "utf8");
52
+ writeFileSync(IDENTITY_PATH, `${JSON.stringify({ version: 1, ...identity, createdAtMs: Date.now() }, null, 2)}\n`, "utf8");
42
53
  setRestrictiveDirPermissions(clawconnectDir);
43
54
  setRestrictiveFilePermissions(IDENTITY_PATH);
44
55
  return identity;
45
56
  }
46
- function buildSignedDevice(identity, opts) {
47
- const version = opts.nonce ? "v2" : "v1";
48
- const payload = [
49
- version,
50
- identity.deviceId,
51
- opts.clientId,
52
- opts.clientMode,
53
- opts.role,
54
- opts.scopes.join(","),
55
- String(opts.signedAtMs),
56
- opts.token ?? "",
57
- ...(version === "v2" ? [opts.nonce ?? ""] : []),
58
- ].join("|");
59
- const key = createPrivateKey(identity.privateKeyPem);
60
- const signature = base64UrlEncode(sign(null, Buffer.from(payload, "utf8"), key));
61
- return {
62
- id: identity.deviceId,
63
- publicKey: base64UrlEncode(rawPublicKeyBytes(identity.publicKeyPem)),
64
- signature,
65
- signedAt: opts.signedAtMs,
66
- nonce: opts.nonce,
67
- };
68
- }
69
- const MIN_PROTOCOL_VERSION = 3;
70
- const MAX_PROTOCOL_VERSION = 4;
71
- const DEFAULT_CLIENT_ID = "openclaw-control-ui";
72
- const DEFAULT_CLIENT_MODE = "webchat";
73
57
  export function gatewayWebSocketOrigin(url) {
74
58
  const parsed = new URL(url);
75
59
  if (parsed.protocol === "ws:")
@@ -83,250 +67,140 @@ export function gatewayWebSocketOrigin(url) {
83
67
  parsed.hash = "";
84
68
  return parsed.origin;
85
69
  }
70
+ /**
71
+ * ClawConnect's compatibility wrapper around OpenClaw's reference v4 client.
72
+ *
73
+ * ClawConnect is a WebChat bridge, not the bundled Control UI. Advertising the
74
+ * WebChat identity preserves chat routing while avoiding Control UI build-ID
75
+ * checks that third-party clients cannot satisfy.
76
+ */
86
77
  export class OpenClawGatewayClient {
87
78
  opts;
88
- ws = null;
89
- pending = new Map();
90
- backoffMs = 1000;
79
+ client = null;
80
+ activeUrl = null;
91
81
  stopped = false;
92
- connectNonce = null;
93
- connectSent = false;
94
- storedDeviceToken = null;
95
- connectTimer = null;
96
- tickTimer = null;
97
- lastTick = 0;
98
- tickIntervalMs = 30_000;
99
- identity;
82
+ reconnectTimer = null;
83
+ storedDeviceAuth = null;
84
+ responseHookRequests = 0;
85
+ bufferedEvents = [];
86
+ identity = loadOrCreateDeviceIdentity();
100
87
  constructor(opts) {
101
88
  this.opts = opts;
102
- this.identity = loadOrCreateDeviceIdentity();
103
89
  }
104
90
  start() {
105
- if (this.stopped)
91
+ if (this.stopped || this.client)
106
92
  return;
107
93
  const url = this.resolveUrl();
108
- const clientId = this.opts.clientId ?? DEFAULT_CLIENT_ID;
109
- this.ws = new WebSocket(url, {
110
- maxPayload: 25 * 1024 * 1024,
111
- // OpenClaw 会校验 Control UI 的 Gateway 来源;必须从 ws(s) 地址确定性派生,
112
- // 不能通过放宽 gateway.controlUi.allowedOrigins 绕过安全边界。
113
- ...(clientId === DEFAULT_CLIENT_ID ? { origin: gatewayWebSocketOrigin(url) } : {}),
114
- });
115
- this.ws.on("open", () => {
116
- this.connectNonce = null;
117
- this.connectSent = false;
118
- // Fallback: send connect after 1 s if challenge hasn't arrived
119
- this.connectTimer = setTimeout(() => this.sendConnect(), 1000);
120
- });
121
- this.ws.on("message", (data) => {
122
- const raw = typeof data === "string" ? data : data.toString();
123
- this.handleMessage(raw);
124
- });
125
- this.ws.on("close", (code, reason) => {
126
- const reasonText = reason.toString() || `code ${code}`;
127
- this.teardown();
128
- this.flushPending(new Error(`gateway disconnected: ${reasonText}`));
129
- this.opts.onDisconnected(reasonText);
130
- this.scheduleReconnect();
131
- });
132
- this.ws.on("error", (err) => {
133
- console.error(`[gateway-client] ws error: ${String(err)}`);
94
+ this.activeUrl = url;
95
+ const client = new GatewayClient({
96
+ url,
97
+ origin: gatewayWebSocketOrigin(url),
98
+ token: this.opts.token,
99
+ password: this.opts.password,
100
+ role: this.opts.role ?? "operator",
101
+ scopes: this.opts.scopes ?? DEFAULT_SCOPES,
102
+ caps: this.opts.caps ?? ["tool-events"],
103
+ clientName: this.opts.clientId ?? DEFAULT_CLIENT_ID,
104
+ clientDisplayName: this.opts.clientDisplayName ?? "ClawConnect Agent",
105
+ clientVersion: this.opts.clientVersion ?? CLAWCONNECT_AGENT_VERSION,
106
+ platform: process.platform,
107
+ mode: this.opts.clientMode ?? DEFAULT_CLIENT_MODE,
108
+ minProtocol: PROTOCOL_VERSION,
109
+ maxProtocol: PROTOCOL_VERSION,
110
+ deviceIdentity: this.identity,
111
+ hostDeps: {
112
+ signDevicePayload: (privateKeyPem, payload) => base64UrlEncode(sign(null, Buffer.from(payload, "utf8"), createPrivateKey(privateKeyPem))),
113
+ publicKeyRawBase64UrlFromPem: (publicKeyPem) => base64UrlEncode(rawPublicKeyBytes(publicKeyPem)),
114
+ loadDeviceAuthToken: () => this.storedDeviceAuth,
115
+ storeDeviceAuthToken: ({ token, scopes }) => {
116
+ this.storedDeviceAuth = { token, scopes };
117
+ },
118
+ clearDeviceAuthToken: () => {
119
+ this.storedDeviceAuth = null;
120
+ },
121
+ logDebug: (message) => console.debug(`[gateway-client] ${message}`),
122
+ logError: (message) => console.error(`[gateway-client] ${message}`),
123
+ },
124
+ onHelloOk: () => this.opts.onConnected(),
125
+ onConnectError: (error) => {
126
+ console.error(`[gateway-client] connect failed: ${String(error)}`);
127
+ },
128
+ onEvent: (event) => {
129
+ if (event.event === "tick")
130
+ return;
131
+ const bufferedEvent = { event: event.event, payload: event.payload ?? null };
132
+ if (this.responseHookRequests > 0) {
133
+ this.bufferedEvents.push(bufferedEvent);
134
+ return;
135
+ }
136
+ this.opts.onEvent(bufferedEvent.event, bufferedEvent.payload);
137
+ },
138
+ onClose: (code, reason) => {
139
+ const reasonText = reason || `code ${code}`;
140
+ this.opts.onDisconnected(reasonText);
141
+ this.recreateForChangedUrl(client);
142
+ },
134
143
  });
144
+ this.client = client;
145
+ client.start();
135
146
  }
136
147
  stop() {
137
148
  this.stopped = true;
138
- this.teardown();
139
- this.ws?.close();
140
- this.ws = null;
141
- this.flushPending(new Error("gateway client stopped"));
149
+ if (this.reconnectTimer) {
150
+ clearTimeout(this.reconnectTimer);
151
+ this.reconnectTimer = null;
152
+ }
153
+ this.client?.stop();
154
+ this.client = null;
155
+ this.activeUrl = null;
142
156
  }
143
157
  send(method, params) {
144
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
145
- throw new Error("gateway not connected");
146
- }
147
- const frame = { type: "req", id: randomUUID(), method, params };
148
- this.ws.send(JSON.stringify(frame));
158
+ void this.request(method, params).catch((error) => {
159
+ console.error(`[gateway-client] ${method} failed: ${String(error)}`);
160
+ });
149
161
  }
150
162
  async request(method, params, options) {
151
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
163
+ if (!this.client)
152
164
  throw new Error("gateway not connected");
153
- }
154
- const id = randomUUID();
155
- const frame = { type: "req", id, method, params };
156
- const p = new Promise((resolve, reject) => {
157
- this.pending.set(id, {
158
- resolve: (v) => resolve(v),
159
- reject,
160
- ...(options?.onResponse ? { onResponse: (value) => options.onResponse?.(value) } : {}),
161
- });
162
- });
163
- this.ws.send(JSON.stringify(frame));
164
- return p;
165
- }
166
- // -------------------------------------------------------------------------
167
- resolveUrl() {
168
- return typeof this.opts.url === "function" ? this.opts.url() : this.opts.url;
169
- }
170
- sendConnect() {
171
- if (this.connectSent)
172
- return;
173
- this.connectSent = true;
174
- if (this.connectTimer) {
175
- clearTimeout(this.connectTimer);
176
- this.connectTimer = null;
177
- }
178
- const role = this.opts.role ?? "operator";
179
- const scopes = this.opts.scopes ?? [
180
- "operator.admin",
181
- "operator.read",
182
- "operator.write",
183
- "operator.approvals",
184
- "operator.pairing",
185
- ];
186
- // chat.send 属于操作界面行为。其他 client id 会被 OpenClaw 当作外部发送者,
187
- // 并给模型提示词添加 Sender 不可信信封,使普通 ClawConnect 消息被误判为注入。
188
- const clientId = this.opts.clientId ?? DEFAULT_CLIENT_ID;
189
- const clientMode = this.opts.clientMode ?? DEFAULT_CLIENT_MODE;
190
- const caps = this.opts.caps ?? ["tool-events"];
191
- const signedAtMs = Date.now();
192
- const nonce = this.connectNonce ?? undefined;
193
- const authToken = this.storedDeviceToken ?? this.opts.token;
194
- const device = buildSignedDevice(this.identity, {
195
- clientId, clientMode, role, scopes, signedAtMs,
196
- token: authToken ?? undefined,
197
- nonce,
198
- });
199
- const params = {
200
- minProtocol: MIN_PROTOCOL_VERSION,
201
- maxProtocol: MAX_PROTOCOL_VERSION,
202
- role,
203
- scopes,
204
- caps,
205
- client: {
206
- id: clientId,
207
- displayName: this.opts.clientDisplayName ?? "ClawConnect Agent",
208
- version: this.opts.clientVersion ?? "1.0.0",
209
- platform: process.platform,
210
- mode: clientMode,
211
- },
212
- device,
213
- auth: authToken || this.opts.password
214
- ? { token: authToken, password: this.opts.password }
215
- : undefined,
216
- };
217
- this.request("connect", params)
218
- .then((helloOk) => {
219
- const deviceToken = helloOk?.auth?.deviceToken;
220
- if (typeof deviceToken === "string") {
221
- this.storedDeviceToken = deviceToken;
222
- }
223
- if (typeof helloOk?.policy?.tickIntervalMs === "number") {
224
- this.tickIntervalMs = helloOk.policy.tickIntervalMs;
225
- }
226
- this.backoffMs = 1000;
227
- this.lastTick = Date.now();
228
- this.startTickWatch();
229
- this.opts.onConnected();
230
- })
231
- .catch((err) => {
232
- console.error(`[gateway-client] connect failed: ${String(err)}`);
233
- // Clear stale device token so the next reconnect uses the base token from config
234
- this.storedDeviceToken = null;
235
- this.ws?.close(1008, "connect failed");
236
- });
237
- }
238
- handleMessage(raw) {
239
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
240
- let parsed;
165
+ const hasResponseHook = Boolean(options?.onResponse);
166
+ if (hasResponseHook)
167
+ this.responseHookRequests += 1;
241
168
  try {
242
- parsed = JSON.parse(raw);
243
- }
244
- catch {
245
- return;
169
+ const value = await this.client.request(method, params);
170
+ options?.onResponse?.(value);
171
+ return value;
246
172
  }
247
- if (typeof parsed?.type !== "string")
248
- return;
249
- if (parsed.type === "event") {
250
- const evt = parsed;
251
- if (evt.event === "connect.challenge") {
252
- const nonce = evt.payload?.nonce;
253
- if (typeof nonce === "string") {
254
- this.connectNonce = nonce;
255
- this.sendConnect();
256
- }
257
- return;
258
- }
259
- if (evt.event === "tick") {
260
- this.lastTick = Date.now();
261
- return;
173
+ finally {
174
+ if (hasResponseHook) {
175
+ this.responseHookRequests -= 1;
176
+ if (this.responseHookRequests === 0)
177
+ this.flushBufferedEvents();
262
178
  }
263
- this.opts.onEvent(evt.event, evt.payload ?? null);
264
- return;
265
- }
266
- if (parsed.type === "res") {
267
- const res = parsed;
268
- const pending = this.pending.get(res.id);
269
- if (!pending)
270
- return;
271
- this.pending.delete(res.id);
272
- if (res.ok) {
273
- try {
274
- // response hook 必须先于 Promise continuation;Gateway 可能紧接 response 帧发送首个事件。
275
- pending.onResponse?.(res.payload);
276
- pending.resolve(res.payload);
277
- }
278
- catch (error) {
279
- pending.reject(error);
280
- }
281
- }
282
- else
283
- pending.reject(new Error(res.error?.message ?? "gateway error"));
284
- return;
285
- }
286
- // Handle incoming req frames from OpenClaw. Ack immediately so the
287
- // gateway doesn't retry control-plane requests at this relay client.
288
- if (parsed.type === "req") {
289
- const id = parsed.id;
290
- // Ack immediately so OpenClaw doesn't retry
291
- if (id && this.ws?.readyState === WebSocket.OPEN) {
292
- this.ws.send(JSON.stringify({ type: "res", id, ok: true }));
293
- }
294
- return;
295
179
  }
296
180
  }
297
- startTickWatch() {
298
- if (this.tickTimer)
299
- clearInterval(this.tickTimer);
300
- const interval = Math.max(this.tickIntervalMs, 1000);
301
- this.tickTimer = setInterval(() => {
302
- if (this.stopped || !this.lastTick)
303
- return;
304
- if (Date.now() - this.lastTick > this.tickIntervalMs * 2) {
305
- this.ws?.close(4000, "tick timeout");
306
- }
307
- }, interval);
181
+ resolveUrl() {
182
+ return typeof this.opts.url === "function" ? this.opts.url() : this.opts.url;
308
183
  }
309
- scheduleReconnect() {
310
- if (this.stopped)
184
+ recreateForChangedUrl(closedClient) {
185
+ if (this.stopped || this.client !== closedClient)
311
186
  return;
312
- const delay = this.backoffMs;
313
- this.backoffMs = Math.min(this.backoffMs * 2, 30_000);
314
- setTimeout(() => this.start(), delay).unref();
315
- }
316
- teardown() {
317
- if (this.connectTimer) {
318
- clearTimeout(this.connectTimer);
319
- this.connectTimer = null;
320
- }
321
- if (this.tickTimer) {
322
- clearInterval(this.tickTimer);
323
- this.tickTimer = null;
324
- }
187
+ const nextUrl = this.resolveUrl();
188
+ if (nextUrl === this.activeUrl)
189
+ return;
190
+ closedClient.stop();
191
+ this.client = null;
192
+ this.activeUrl = null;
193
+ this.reconnectTimer = setTimeout(() => {
194
+ this.reconnectTimer = null;
195
+ this.start();
196
+ }, 0);
197
+ this.reconnectTimer.unref?.();
325
198
  }
326
- flushPending(err) {
327
- for (const p of this.pending.values())
328
- p.reject(err);
329
- this.pending.clear();
199
+ flushBufferedEvents() {
200
+ const events = this.bufferedEvents;
201
+ this.bufferedEvents = [];
202
+ for (const event of events)
203
+ this.opts.onEvent(event.event, event.payload);
330
204
  }
331
205
  }
332
206
  //# sourceMappingURL=gateway-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../../src/openclaw/gateway-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../../src/openclaw/gateway-client.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,17 @@ export type TranscriptHistoryRequest = {
55
55
  export declare function clearTranscriptHistoryCache(): void;
56
56
  export declare function readOpenClawTranscriptChatHistory(rawParams: unknown, defaults: GatewaySessionDefaults): Promise<HistoryResponse | null>;
57
57
  export declare function readChatHistoryFromTranscriptFile(request: TranscriptHistoryRequest): Promise<HistoryResponse>;
58
+ /**
59
+ * OpenClaw v4 may serve chat.history from its state database even when the
60
+ * legacy transcript file is unavailable. The v4 response deliberately keeps
61
+ * canonical identity under __openclaw, so Relay cannot consume its raw
62
+ * messages as a timeline snapshot. Project those protocol fields here instead
63
+ * of asking downstream clients to infer missing user turns from assistant text.
64
+ */
65
+ export declare function canonicalizeOpenClawGatewayHistoryResponse(history: HistoryResponse, request: {
66
+ sessionKey: string;
67
+ cursor?: string;
68
+ }): HistoryResponse;
58
69
  /**
59
70
  * OpenClaw 会把内部心跳探测写入 transcript。只有精确的保留提示最终得到纯确认回执时,
60
71
  * 才隐藏整段内部记录;若心跳产生真实告警,则保留完整内容供用户查看。