@ozaiya/openclaw-channel 0.10.24 → 0.10.26
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/index.d.ts +1 -1
- package/dist/index.js +21 -1
- package/dist/index.js.map +1 -1
- package/dist/src/channel.d.ts +28 -0
- package/dist/src/channel.js +369 -36
- package/dist/src/channel.js.map +1 -1
- package/dist/src/configSchema.d.ts +1 -1
- package/dist/src/configSchema.js +6 -1
- package/dist/src/configSchema.js.map +1 -1
- package/dist/src/gateway.js +22 -5
- package/dist/src/gateway.js.map +1 -1
- package/dist/src/sandboxScreenCdp.d.ts +10 -0
- package/dist/src/sandboxScreenCdp.js +251 -65
- package/dist/src/sandboxScreenCdp.js.map +1 -1
- package/dist/src/types.d.ts +3 -0
- package/package.json +2 -2
- package/types/openclaw-plugin-sdk.d.ts +37 -0
|
@@ -2,11 +2,22 @@
|
|
|
2
2
|
* CDP-screencast source for the bot computer view (Manus-style).
|
|
3
3
|
*
|
|
4
4
|
* Replaces the old VNC stack (Xvfb + x11vnc + websockify + noVNC). Instead of an
|
|
5
|
-
* RFB pixel stream, we drive Chromium's DevTools Protocol
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* RFB pixel stream, we drive Chromium's DevTools Protocol and ship self-contained
|
|
6
|
+
* JPEG frames — exactly what the Manus / Browserbase / Steel agent-browsers stream.
|
|
7
|
+
* Frames are STATELESS (a dropped/late frame just skips), so they render cleanly
|
|
8
|
+
* over BOTH the relay and a WebRTC DataChannel — unlike the stateful RFB handshake,
|
|
9
|
+
* which stalled over P2P.
|
|
10
|
+
*
|
|
11
|
+
* Frame source: we POLL `Page.captureScreenshot` rather than `Page.startScreencast`.
|
|
12
|
+
* On a headed Xvfb/--disable-gpu Chromium the compositor barely ticks, so
|
|
13
|
+
* startScreencast yields ~0.5fps; captureScreenshot FORCES a frame each call.
|
|
14
|
+
*
|
|
15
|
+
* Stability (RustDesk-grade): the poll loop is fully self-healing. A capture that
|
|
16
|
+
* never answers (renderer busy, tab occluded) is abandoned by a per-shot watchdog
|
|
17
|
+
* and re-polled; after a few consecutive misses — or a silent socket drop — we tear
|
|
18
|
+
* the CDP ws down and reconnect with backoff. The viewer's relay connection is
|
|
19
|
+
* untouched, so frames simply resume. Earlier this loop had no close handler and no
|
|
20
|
+
* watchdog, so a single hung capture froze the view permanently.
|
|
10
21
|
*
|
|
11
22
|
* The viewer renders frames on a canvas (the app's existing `native` JPEG mode) and
|
|
12
23
|
* sends input back; we dispatch that input via CDP `Input.*` for takeover.
|
|
@@ -30,36 +41,35 @@ function cdpGet(host, port, path) {
|
|
|
30
41
|
req.end();
|
|
31
42
|
});
|
|
32
43
|
}
|
|
44
|
+
// A single hung captureScreenshot is abandoned after this long and re-polled.
|
|
45
|
+
const CAPTURE_TIMEOUT_MS = 1200;
|
|
46
|
+
// After this many consecutive misses we stop trusting the socket and reconnect.
|
|
47
|
+
const MAX_CONSECUTIVE_TIMEOUTS = 3;
|
|
48
|
+
// Backoff between CDP reconnect attempts.
|
|
49
|
+
const RECONNECT_DELAY_MS = 1000;
|
|
50
|
+
// Pause capturing while the relay's outbound buffer exceeds this (≈ a frame or two).
|
|
51
|
+
// Bounds in-flight frames to keep the view real-time on a slow uplink.
|
|
52
|
+
const BACKPRESSURE_LIMIT_BYTES = 96 * 1024;
|
|
53
|
+
// While paused for backpressure, re-check this often (ms).
|
|
54
|
+
const BACKPRESSURE_RECHECK_MS = 25;
|
|
33
55
|
export async function createCdpScreencast(opts) {
|
|
34
56
|
const { host, port } = opts;
|
|
35
|
-
let pageWsPath;
|
|
36
|
-
try {
|
|
37
|
-
const json = await cdpGet(host, port, "/json");
|
|
38
|
-
const targets = JSON.parse(json);
|
|
39
|
-
const page = targets.find((t) => t.type === "page" && t.webSocketDebuggerUrl);
|
|
40
|
-
if (!page?.webSocketDebuggerUrl) {
|
|
41
|
-
opts.log?.warn?.("[sandbox-cdp] no page target");
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
// webSocketDebuggerUrl is ws://localhost/devtools/page/<id> (Host we spoofed) —
|
|
45
|
-
// keep only the path and dial the real container host.
|
|
46
|
-
pageWsPath = new URL(page.webSocketDebuggerUrl).pathname;
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
49
|
-
opts.log?.warn?.(`[sandbox-cdp] target discovery failed: ${String(err)}`);
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
const WsModule = await import("ws");
|
|
53
|
-
const WS = (WsModule.default ?? WsModule);
|
|
54
|
-
const ws = new WS(`ws://${host}:${port}${pageWsPath}`, { headers: { Host: "localhost" } });
|
|
55
|
-
ws.binaryType = "arraybuffer";
|
|
56
|
-
let cmdId = 1;
|
|
57
|
-
let closed = false;
|
|
58
57
|
const quality = opts.quality ?? 55;
|
|
59
58
|
const minIntervalMs = opts.minIntervalMs ?? 60; // ~16fps ceiling; self-paces below
|
|
59
|
+
const WsModule = await import("ws");
|
|
60
|
+
const WSImpl = (WsModule.default ?? WsModule);
|
|
61
|
+
let ws = null; // current CDP socket (swapped on reconnect)
|
|
62
|
+
let closed = false; // intentional teardown (close())
|
|
63
|
+
let cmdId = 1;
|
|
64
|
+
let shotId = -1;
|
|
65
|
+
let shotStartedAt = 0;
|
|
66
|
+
let inflight = false; // a captureScreenshot is outstanding
|
|
67
|
+
let consecutiveTimeouts = 0;
|
|
68
|
+
let pendingTimer = null;
|
|
69
|
+
let reconnectTimer = null;
|
|
60
70
|
const send = (method, params) => {
|
|
61
71
|
const id = cmdId++;
|
|
62
|
-
if (!closed && ws.readyState === 1) {
|
|
72
|
+
if (!closed && ws && ws.readyState === 1) {
|
|
63
73
|
try {
|
|
64
74
|
ws.send(JSON.stringify({ id, method, params }));
|
|
65
75
|
}
|
|
@@ -67,29 +77,65 @@ export async function createCdpScreencast(opts) {
|
|
|
67
77
|
}
|
|
68
78
|
return id;
|
|
69
79
|
};
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
80
|
+
const clearPending = () => { if (pendingTimer) {
|
|
81
|
+
clearTimeout(pendingTimer);
|
|
82
|
+
pendingTimer = null;
|
|
83
|
+
} };
|
|
84
|
+
// Sequential poll: send the next capture only after the previous resolves (or its
|
|
85
|
+
// watchdog fires), then wait out the min interval. Self-paces and caps CPU.
|
|
76
86
|
const poll = () => {
|
|
77
|
-
if (closed)
|
|
87
|
+
if (closed || !ws || ws.readyState !== 1)
|
|
78
88
|
return;
|
|
89
|
+
inflight = true;
|
|
79
90
|
shotStartedAt = Date.now();
|
|
80
91
|
shotId = send("Page.captureScreenshot", { format: "jpeg", quality });
|
|
92
|
+
clearPending();
|
|
93
|
+
pendingTimer = setTimeout(onCaptureTimeout, CAPTURE_TIMEOUT_MS);
|
|
81
94
|
};
|
|
82
95
|
const scheduleNext = () => {
|
|
83
96
|
if (closed)
|
|
84
97
|
return;
|
|
98
|
+
// Flow control: if the relay can't drain what we've already sent, don't capture
|
|
99
|
+
// more — keep checking until it clears. This adapts fps to uplink bandwidth and
|
|
100
|
+
// bounds latency (instead of buffering frames the network can't ship in time).
|
|
101
|
+
const bp = opts.getBackpressure?.() ?? 0;
|
|
102
|
+
if (bp > BACKPRESSURE_LIMIT_BYTES) {
|
|
103
|
+
setTimeout(scheduleNext, BACKPRESSURE_RECHECK_MS);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
85
106
|
setTimeout(poll, Math.max(0, minIntervalMs - (Date.now() - shotStartedAt)));
|
|
86
107
|
};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
108
|
+
// A capture resolved (frame arrived) or was abandoned (watchdog) — advance the loop.
|
|
109
|
+
const finishShot = () => {
|
|
110
|
+
if (!inflight)
|
|
111
|
+
return;
|
|
112
|
+
inflight = false;
|
|
113
|
+
clearPending();
|
|
114
|
+
scheduleNext();
|
|
115
|
+
};
|
|
116
|
+
const onCaptureTimeout = () => {
|
|
117
|
+
if (closed)
|
|
118
|
+
return;
|
|
119
|
+
consecutiveTimeouts++;
|
|
120
|
+
if (consecutiveTimeouts >= MAX_CONSECUTIVE_TIMEOUTS) {
|
|
121
|
+
opts.log?.warn?.(`[sandbox-cdp] ${consecutiveTimeouts} capture timeouts — reconnecting CDP`);
|
|
122
|
+
consecutiveTimeouts = 0;
|
|
123
|
+
inflight = false;
|
|
124
|
+
clearPending();
|
|
125
|
+
const dead = ws;
|
|
126
|
+
ws = null;
|
|
127
|
+
try {
|
|
128
|
+
dead?.terminate?.();
|
|
129
|
+
}
|
|
130
|
+
catch { /* ignore */ }
|
|
131
|
+
scheduleReconnect();
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Transient miss — abandon this shot and try the next one.
|
|
135
|
+
finishShot();
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
const onMessage = (raw) => {
|
|
93
139
|
let msg;
|
|
94
140
|
try {
|
|
95
141
|
msg = JSON.parse(typeof raw === "string" ? raw : Buffer.from(raw).toString());
|
|
@@ -99,60 +145,200 @@ export async function createCdpScreencast(opts) {
|
|
|
99
145
|
}
|
|
100
146
|
if (msg.id === shotId) {
|
|
101
147
|
const data = msg.result?.data;
|
|
102
|
-
if (data && !closed)
|
|
148
|
+
if (data && !closed) {
|
|
149
|
+
consecutiveTimeouts = 0;
|
|
103
150
|
opts.onFrame(Buffer.from(data, "base64"));
|
|
104
|
-
|
|
151
|
+
}
|
|
152
|
+
finishShot(); // keep the stream alive whether or not this shot returned data
|
|
105
153
|
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
|
|
154
|
+
};
|
|
155
|
+
/** Discover the page target's ws path (Host spoofed to localhost). */
|
|
156
|
+
async function discoverPagePath() {
|
|
157
|
+
const json = await cdpGet(host, port, "/json");
|
|
158
|
+
const targets = JSON.parse(json);
|
|
159
|
+
const page = targets.find((t) => t.type === "page" && t.webSocketDebuggerUrl);
|
|
160
|
+
if (!page?.webSocketDebuggerUrl)
|
|
161
|
+
return null;
|
|
162
|
+
// webSocketDebuggerUrl is ws://localhost/devtools/page/<id> (Host we spoofed) —
|
|
163
|
+
// keep only the path and dial the real container host.
|
|
164
|
+
return new URL(page.webSocketDebuggerUrl).pathname;
|
|
165
|
+
}
|
|
166
|
+
/** Open (or re-open) the CDP socket and resume the frame loop. Returns false on failure. */
|
|
167
|
+
async function connect() {
|
|
168
|
+
if (closed)
|
|
169
|
+
return false;
|
|
170
|
+
let pageWsPath;
|
|
171
|
+
try {
|
|
172
|
+
pageWsPath = await discoverPagePath();
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
opts.log?.warn?.(`[sandbox-cdp] target discovery failed: ${String(err)}`);
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
if (!pageWsPath) {
|
|
179
|
+
opts.log?.warn?.("[sandbox-cdp] no page target");
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
if (closed)
|
|
183
|
+
return false;
|
|
184
|
+
const sock = new WSImpl(`ws://${host}:${port}${pageWsPath}`, { headers: { Host: "localhost" } });
|
|
185
|
+
sock.binaryType = "arraybuffer";
|
|
186
|
+
ws = sock;
|
|
187
|
+
inflight = false;
|
|
188
|
+
consecutiveTimeouts = 0;
|
|
189
|
+
sock.on("open", () => {
|
|
190
|
+
if (closed || ws !== sock) {
|
|
191
|
+
try {
|
|
192
|
+
sock.close();
|
|
193
|
+
}
|
|
194
|
+
catch { /* ignore */ }
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
opts.log?.info?.("[sandbox-cdp] CDP connected — capturing frames");
|
|
198
|
+
send("Page.enable");
|
|
199
|
+
clearPending();
|
|
200
|
+
inflight = false;
|
|
201
|
+
poll();
|
|
202
|
+
});
|
|
203
|
+
sock.on("message", onMessage);
|
|
204
|
+
sock.on("error", (err) => opts.log?.warn?.(`[sandbox-cdp] ws error: ${err.message}`));
|
|
205
|
+
sock.on("close", () => {
|
|
206
|
+
if (closed)
|
|
207
|
+
return;
|
|
208
|
+
if (ws !== sock)
|
|
209
|
+
return; // superseded by a newer socket already
|
|
210
|
+
ws = null;
|
|
211
|
+
clearPending();
|
|
212
|
+
inflight = false;
|
|
213
|
+
opts.log?.warn?.("[sandbox-cdp] CDP ws closed — reconnecting");
|
|
214
|
+
scheduleReconnect();
|
|
215
|
+
});
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
function scheduleReconnect() {
|
|
219
|
+
if (closed || reconnectTimer)
|
|
220
|
+
return;
|
|
221
|
+
reconnectTimer = setTimeout(async () => {
|
|
222
|
+
reconnectTimer = null;
|
|
223
|
+
if (closed)
|
|
224
|
+
return;
|
|
225
|
+
const ok = await connect();
|
|
226
|
+
if (!ok && !closed)
|
|
227
|
+
scheduleReconnect();
|
|
228
|
+
}, RECONNECT_DELAY_MS);
|
|
229
|
+
}
|
|
230
|
+
// Initial connect — preserve the original contract (return null if it fails outright).
|
|
231
|
+
const ok = await connect();
|
|
232
|
+
if (!ok)
|
|
233
|
+
return null;
|
|
109
234
|
const MOUSE_BUTTON = ["left", "middle", "right"];
|
|
235
|
+
const BUTTONS = { left: 1, right: 2, middle: 4 };
|
|
236
|
+
// app modifier byte (shift 0x01 / ctrl 0x02 / alt 0x04 / cmd 0x08) → CDP modifiers
|
|
237
|
+
// (Alt 1 / Ctrl 2 / Meta 4 / Shift 8).
|
|
238
|
+
const toCdpMods = (m) => (m & 0x01 ? 8 : 0) | (m & 0x02 ? 2 : 0) | (m & 0x04 ? 1 : 0) | (m & 0x08 ? 4 : 0);
|
|
239
|
+
// Named keys → [code, windowsVirtualKeyCode] for CDP keyDown/keyUp.
|
|
240
|
+
const KEYMAP = {
|
|
241
|
+
Enter: ["Enter", 13], Backspace: ["Backspace", 8], Tab: ["Tab", 9], Escape: ["Escape", 27],
|
|
242
|
+
Delete: ["Delete", 46], " ": ["Space", 32], ArrowLeft: ["ArrowLeft", 37], ArrowUp: ["ArrowUp", 38],
|
|
243
|
+
ArrowRight: ["ArrowRight", 39], ArrowDown: ["ArrowDown", 40], Home: ["Home", 36], End: ["End", 35],
|
|
244
|
+
PageUp: ["PageUp", 33], PageDown: ["PageDown", 34],
|
|
245
|
+
};
|
|
246
|
+
const mouseClick = (x, y, button) => {
|
|
247
|
+
const b = BUTTONS[button] ?? 1;
|
|
248
|
+
send("Input.dispatchMouseEvent", { type: "mousePressed", x, y, button, buttons: b, clickCount: 1 });
|
|
249
|
+
send("Input.dispatchMouseEvent", { type: "mouseReleased", x, y, button, buttons: 0, clickCount: 1 });
|
|
250
|
+
};
|
|
110
251
|
return {
|
|
111
252
|
handleInput: (data) => {
|
|
112
253
|
if (closed)
|
|
113
254
|
return;
|
|
114
255
|
const action = String(data.action ?? data.type ?? "");
|
|
115
256
|
const x = Number(data.x ?? 0), y = Number(data.y ?? 0);
|
|
116
|
-
if (action === "mousemove" || action === "move")
|
|
257
|
+
if (action === "mousemove" || action === "move")
|
|
117
258
|
send("Input.dispatchMouseEvent", { type: "mouseMoved", x, y });
|
|
118
|
-
|
|
259
|
+
else if (action === "click")
|
|
260
|
+
mouseClick(x, y, "left");
|
|
261
|
+
else if (action === "rightclick")
|
|
262
|
+
mouseClick(x, y, "right");
|
|
263
|
+
else if (action === "middleclick")
|
|
264
|
+
mouseClick(x, y, "middle");
|
|
119
265
|
else if (action === "mousedown" || action === "down") {
|
|
120
266
|
const b = MOUSE_BUTTON[Number(data.button ?? 0)] ?? "left";
|
|
121
|
-
send("Input.dispatchMouseEvent", { type: "mousePressed", x, y, button: b, buttons:
|
|
267
|
+
send("Input.dispatchMouseEvent", { type: "mousePressed", x, y, button: b, buttons: BUTTONS[b], clickCount: 1 });
|
|
122
268
|
}
|
|
123
269
|
else if (action === "mouseup" || action === "up") {
|
|
124
270
|
const b = MOUSE_BUTTON[Number(data.button ?? 0)] ?? "left";
|
|
125
271
|
send("Input.dispatchMouseEvent", { type: "mouseReleased", x, y, button: b, buttons: 0, clickCount: 1 });
|
|
126
272
|
}
|
|
127
|
-
else if (action === "scroll" || action === "wheel")
|
|
128
|
-
send("Input.dispatchMouseEvent", { type: "mouseWheel", x, y, deltaX:
|
|
273
|
+
else if (action === "scroll" || action === "wheel")
|
|
274
|
+
send("Input.dispatchMouseEvent", { type: "mouseWheel", x, y, deltaX: 0, deltaY: -Number(data.delta ?? data.deltaY ?? data.dy ?? 0) * 30 });
|
|
275
|
+
},
|
|
276
|
+
handleBinaryInput: (buf) => {
|
|
277
|
+
if (closed || buf.length < 1)
|
|
278
|
+
return;
|
|
279
|
+
const code = buf[0];
|
|
280
|
+
const rx = () => buf.readInt16LE(1), ry = () => buf.readInt16LE(3);
|
|
281
|
+
if (code === 0x01 && buf.length >= 5)
|
|
282
|
+
send("Input.dispatchMouseEvent", { type: "mouseMoved", x: rx(), y: ry() });
|
|
283
|
+
else if (code === 0x03 && buf.length >= 5)
|
|
284
|
+
mouseClick(rx(), ry(), "left");
|
|
285
|
+
else if (code === 0x04 && buf.length >= 5)
|
|
286
|
+
mouseClick(rx(), ry(), "right");
|
|
287
|
+
else if (code === 0x0A && buf.length >= 5)
|
|
288
|
+
mouseClick(rx(), ry(), "middle");
|
|
289
|
+
else if ((code === 0x05 || code === 0x08 || code === 0x0B) && buf.length >= 5) {
|
|
290
|
+
const b = code === 0x08 ? "right" : code === 0x0B ? "middle" : "left";
|
|
291
|
+
send("Input.dispatchMouseEvent", { type: "mousePressed", x: rx(), y: ry(), button: b, buttons: BUTTONS[b], clickCount: 1 });
|
|
292
|
+
}
|
|
293
|
+
else if ((code === 0x06 || code === 0x09 || code === 0x0C) && buf.length >= 5) {
|
|
294
|
+
const b = code === 0x09 ? "right" : code === 0x0C ? "middle" : "left";
|
|
295
|
+
send("Input.dispatchMouseEvent", { type: "mouseReleased", x: rx(), y: ry(), button: b, buttons: 0, clickCount: 1 });
|
|
129
296
|
}
|
|
130
|
-
else if (
|
|
131
|
-
send("Input.
|
|
297
|
+
else if (code === 0x07 && buf.length >= 6) {
|
|
298
|
+
send("Input.dispatchMouseEvent", { type: "mouseWheel", x: rx(), y: ry(), deltaX: 0, deltaY: -buf.readInt8(5) * 30 });
|
|
132
299
|
}
|
|
133
|
-
else if (
|
|
134
|
-
|
|
300
|
+
else if ((code === 0x10 || code === 0x11 || code === 0x12) && buf.length >= 3) {
|
|
301
|
+
const mod = buf[1], keyLen = buf[2];
|
|
302
|
+
const key = buf.slice(3, 3 + keyLen).toString();
|
|
303
|
+
const mods = toCdpMods(mod);
|
|
304
|
+
const isDown = code === 0x10 || code === 0x12;
|
|
305
|
+
const hasCombo = (mod & 0x0e) !== 0; // ctrl/alt/cmd held
|
|
306
|
+
const named = KEYMAP[key];
|
|
307
|
+
if (!hasCombo && key.length === 1) {
|
|
308
|
+
// Printable char → 'char' inserts the text (already reflects shift).
|
|
309
|
+
if (isDown)
|
|
310
|
+
send("Input.dispatchKeyEvent", { type: "char", text: key, key, modifiers: mods });
|
|
311
|
+
if (code === 0x11)
|
|
312
|
+
send("Input.dispatchKeyEvent", { type: "keyUp", key, modifiers: mods });
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
const codeName = named ? named[0] : (key.length === 1 ? "Key" + key.toUpperCase() : key);
|
|
316
|
+
const vk = named ? named[1] : (key.length === 1 ? key.toUpperCase().charCodeAt(0) : 0);
|
|
317
|
+
send("Input.dispatchKeyEvent", { type: isDown ? "keyDown" : "keyUp", key, code: codeName, windowsVirtualKeyCode: vk, modifiers: mods });
|
|
318
|
+
}
|
|
135
319
|
}
|
|
136
320
|
},
|
|
137
|
-
resize: (
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
//
|
|
141
|
-
// right aspect (adaptive resolution).
|
|
142
|
-
const w = Math.min(Math.max(Math.round(width), 320), 1920);
|
|
143
|
-
const h = Math.min(Math.max(Math.round(height), 240), 1200);
|
|
144
|
-
send("Emulation.setDeviceMetricsOverride", { width: w, height: h, deviceScaleFactor: 1, mobile: false });
|
|
321
|
+
resize: (_width, _height) => {
|
|
322
|
+
// No-op: we capture the bot's NATIVE viewport. Overriding device metrics to
|
|
323
|
+
// the viewer's size would reflow the page the agent is actively driving (and
|
|
324
|
+
// the viewer just letterboxes the frame), so don't touch it.
|
|
145
325
|
},
|
|
146
326
|
close: () => {
|
|
147
327
|
closed = true;
|
|
328
|
+
if (reconnectTimer) {
|
|
329
|
+
clearTimeout(reconnectTimer);
|
|
330
|
+
reconnectTimer = null;
|
|
331
|
+
}
|
|
332
|
+
clearPending();
|
|
148
333
|
try {
|
|
149
334
|
send("Page.stopScreencast");
|
|
150
335
|
}
|
|
151
336
|
catch { /* ignore */ }
|
|
152
337
|
try {
|
|
153
|
-
ws
|
|
338
|
+
ws?.close();
|
|
154
339
|
}
|
|
155
340
|
catch { /* ignore */ }
|
|
341
|
+
ws = null;
|
|
156
342
|
},
|
|
157
343
|
};
|
|
158
344
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandboxScreenCdp.js","sourceRoot":"","sources":["../../src/sandboxScreenCdp.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sandboxScreenCdp.js","sourceRoot":"","sources":["../../src/sandboxScreenCdp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AA8B7B,oEAAoE;AACpE,SAAS,MAAM,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EACnE,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,gFAAgF;AAChF,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACnC,0CAA0C;AAC1C,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,qFAAqF;AACrF,uEAAuE;AACvE,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC3C,2DAA2D;AAC3D,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAA0B;IAClE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,mCAAmC;IAGnF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAkC,CAAC;IAE/E,IAAI,EAAE,GAAc,IAAI,CAAC,CAAK,4CAA4C;IAC1E,IAAI,MAAM,GAAG,KAAK,CAAC,CAAW,iCAAiC;IAC/D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAChB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAS,qCAAqC;IACnE,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAI,YAAY,GAAyC,IAAI,CAAC;IAC9D,IAAI,cAAc,GAAyC,IAAI,CAAC;IAEhE,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,MAAgC,EAAU,EAAE;QACxE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC;gBAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;QAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAAC,YAAY,GAAG,IAAI,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC;IAEtG,kFAAkF;IAClF,4EAA4E;IAC5E,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,IAAI,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,CAAC;YAAE,OAAO;QACjD,QAAQ,GAAG,IAAI,CAAC;QAChB,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,GAAG,IAAI,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,YAAY,EAAE,CAAC;QACf,YAAY,GAAG,UAAU,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,MAAM;YAAE,OAAO;QACnB,gFAAgF;QAChF,gFAAgF;QAChF,+EAA+E;QAC/E,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,EAAE,GAAG,wBAAwB,EAAE,CAAC;YAClC,UAAU,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC;IAEF,qFAAqF;IACrF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,QAAQ,GAAG,KAAK,CAAC;QACjB,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,MAAM;YAAE,OAAO;QACnB,mBAAmB,EAAE,CAAC;QACtB,IAAI,mBAAmB,IAAI,wBAAwB,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,iBAAiB,mBAAmB,sCAAsC,CAAC,CAAC;YAC7F,mBAAmB,GAAG,CAAC,CAAC;YACxB,QAAQ,GAAG,KAAK,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,EAAE,GAAG,IAAI,CAAC;YACV,IAAI,CAAC;gBAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACnD,iBAAiB,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,2DAA2D;YAC3D,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,GAAkC,EAAE,EAAE;QACvD,IAAI,GAAgD,CAAC;QACrD,IAAI,CAAC;YAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO;QAAC,CAAC;QACvH,IAAI,GAAG,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;YAC9B,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,mBAAmB,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,UAAU,EAAE,CAAC,CAAC,+DAA+D;QAC/E,CAAC;IACH,CAAC,CAAC;IAEF,sEAAsE;IACtE,KAAK,UAAU,gBAAgB;QAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2D,CAAC;QAC3F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI,EAAE,oBAAoB;YAAE,OAAO,IAAI,CAAC;QAC7C,gFAAgF;QAChF,uDAAuD;QACvD,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC;IACrD,CAAC;IAED,4FAA4F;IAC5F,KAAK,UAAU,OAAO;QACpB,IAAI,MAAM;YAAE,OAAO,KAAK,CAAC;QACzB,IAAI,UAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,0CAA0C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,8BAA8B,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;QACpF,IAAI,MAAM;YAAE,OAAO,KAAK,CAAC;QAEzB,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAChG,IAA0C,CAAC,UAAU,GAAG,aAAa,CAAC;QACvE,EAAE,GAAG,IAAI,CAAC;QACV,QAAQ,GAAG,KAAK,CAAC;QACjB,mBAAmB,GAAG,CAAC,CAAC;QAExB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACnB,IAAI,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAAC,IAAI,CAAC;oBAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACnF,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,gDAAgD,CAAC,CAAC;YACnE,IAAI,CAAC,aAAa,CAAC,CAAC;YACpB,YAAY,EAAE,CAAC;YACf,QAAQ,GAAG,KAAK,CAAC;YACjB,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,IAAI,MAAM;gBAAE,OAAO;YACnB,IAAI,EAAE,KAAK,IAAI;gBAAE,OAAO,CAAC,uCAAuC;YAChE,EAAE,GAAG,IAAI,CAAC;YACV,YAAY,EAAE,CAAC;YACf,QAAQ,GAAG,KAAK,CAAC;YACjB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,4CAA4C,CAAC,CAAC;YAC/D,iBAAiB,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,iBAAiB;QACxB,IAAI,MAAM,IAAI,cAAc;YAAE,OAAO;QACrC,cAAc,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACrC,cAAc,GAAG,IAAI,CAAC;YACtB,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM;gBAAE,iBAAiB,EAAE,CAAC;QAC1C,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACzB,CAAC;IAED,uFAAuF;IACvF,MAAM,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAErB,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,OAAO,GAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACzE,mFAAmF;IACnF,uCAAuC;IACvC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnH,oEAAoE;IACpE,MAAM,MAAM,GAAqC;QAC/C,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC1F,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC;QAClG,UAAU,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAClG,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;KACnD,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,MAAc,EAAE,EAAE;QAC1D,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QACpG,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IACvG,CAAC,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,CAAC,IAA6B,EAAE,EAAE;YAC7C,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACtD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,MAAM;gBAAE,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;iBAC3G,IAAI,MAAM,KAAK,OAAO;gBAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;iBACjD,IAAI,MAAM,KAAK,YAAY;gBAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;iBACvD,IAAI,MAAM,KAAK,aAAa;gBAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;iBACzD,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;gBAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;iBACjO,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;gBAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;iBACrN,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO;gBAAE,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjM,CAAC;QACD,iBAAiB,EAAE,CAAC,GAAW,EAAE,EAAE;YACjC,IAAI,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YACrC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACnE,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;gBAAE,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;iBAC5G,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;gBAAE,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;iBACrE,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;gBAAE,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;iBACtE,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;gBAAE,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;iBACvE,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC9E,MAAM,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;gBACtE,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9H,CAAC;iBAAM,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChF,MAAM,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;gBACtE,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACtH,CAAC;iBAAM,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACvH,CAAC;iBAAM,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChF,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAChD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC5B,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC;gBAC9C,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB;gBACzD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1B,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAClC,qEAAqE;oBACrE,IAAI,MAAM;wBAAE,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9F,IAAI,IAAI,KAAK,IAAI;wBAAE,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7F,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACzF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvF,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,qBAAqB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1I,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,EAAE,CAAC,MAAc,EAAE,OAAe,EAAE,EAAE;YAC1C,4EAA4E;YAC5E,6EAA6E;YAC7E,6DAA6D;QAC/D,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,cAAc,EAAE,CAAC;gBAAC,YAAY,CAAC,cAAc,CAAC,CAAC;gBAAC,cAAc,GAAG,IAAI,CAAC;YAAC,CAAC;YAC5E,YAAY,EAAE,CAAC;YACf,IAAI,CAAC;gBAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC3D,IAAI,CAAC;gBAAC,EAAE,EAAE,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC3C,EAAE,GAAG,IAAI,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -316,6 +316,9 @@ export interface OzaiyaTaskProgressContent {
|
|
|
316
316
|
startedAt?: number;
|
|
317
317
|
endedAt?: number;
|
|
318
318
|
credits?: number;
|
|
319
|
+
/** LLM token usage accumulated across the task's model calls (input-side / output). */
|
|
320
|
+
tokensInput?: number;
|
|
321
|
+
tokensOutput?: number;
|
|
319
322
|
}
|
|
320
323
|
/** Decrypted message content format used by the Ozaiya app */
|
|
321
324
|
export interface OzaiyaMessageContent {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ozaiya/openclaw-channel",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.26",
|
|
4
4
|
"description": "OpenClaw channel plugin for Ozaiya Chat",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"ai-agent"
|
|
56
56
|
],
|
|
57
57
|
"scripts": {
|
|
58
|
-
"build": "tsc",
|
|
58
|
+
"build": "tsc && node scripts/gen-manifest.mjs",
|
|
59
59
|
"prepublishOnly": "npm run build"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
@@ -144,10 +144,47 @@ declare module "openclaw/plugin-sdk" {
|
|
|
144
144
|
};
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
+
/** Tool-call lifecycle hook payloads (subset we consume; permissive). */
|
|
148
|
+
export interface PluginHookToolEvent {
|
|
149
|
+
toolName?: string;
|
|
150
|
+
params?: Record<string, unknown>;
|
|
151
|
+
runId?: string;
|
|
152
|
+
toolCallId?: string;
|
|
153
|
+
result?: unknown;
|
|
154
|
+
error?: string;
|
|
155
|
+
durationMs?: number;
|
|
156
|
+
/** LLM token usage (llm_output hook). */
|
|
157
|
+
usage?: {
|
|
158
|
+
input?: number;
|
|
159
|
+
output?: number;
|
|
160
|
+
cacheRead?: number;
|
|
161
|
+
cacheWrite?: number;
|
|
162
|
+
total?: number;
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
export interface PluginHookToolContext {
|
|
166
|
+
agentId?: string;
|
|
167
|
+
sessionKey?: string;
|
|
168
|
+
sessionId?: string;
|
|
169
|
+
runId?: string;
|
|
170
|
+
toolName?: string;
|
|
171
|
+
toolCallId?: string;
|
|
172
|
+
}
|
|
173
|
+
|
|
147
174
|
/** API passed to plugin.register() by OpenClaw. */
|
|
148
175
|
export interface OpenClawPluginApi {
|
|
149
176
|
runtime: PluginRuntime;
|
|
150
177
|
registerChannel(opts: { plugin: unknown }): void;
|
|
178
|
+
/**
|
|
179
|
+
* Subscribe to a plugin hook. We only use the tool-call lifecycle hooks; the
|
|
180
|
+
* signature is kept permissive so other hook names still type-check. Optional
|
|
181
|
+
* because older gateways may not expose it.
|
|
182
|
+
*/
|
|
183
|
+
on?: (
|
|
184
|
+
hookName: string,
|
|
185
|
+
handler: (event: PluginHookToolEvent, ctx: PluginHookToolContext) => unknown,
|
|
186
|
+
opts?: { priority?: number },
|
|
187
|
+
) => void;
|
|
151
188
|
}
|
|
152
189
|
|
|
153
190
|
/** Register an HTTP route handled by this plugin. Returns an unregister function. */
|