@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.
@@ -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 `Page.startScreencast`,
6
- * which emits the page viewport as self-contained JPEG frames exactly what the
7
- * Manus / Browserbase / Steel agent-browsers stream. Frames are STATELESS (a
8
- * dropped/late frame just skips), so they render cleanly over BOTH the relay and a
9
- * WebRTC DataChannel — unlike the stateful RFB handshake, which stalled over P2P.
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
- // Frame source: POLL Page.captureScreenshot. Page.startScreencast is unreliable on
71
- // a headed Xvfb/--disable-gpu Chromium (the compositor barely ticks → ~0.5fps), but
72
- // captureScreenshot FORCES a frame each call (~25fps achievable). Sequential
73
- // (send the next only after each reply) + a min interval self-paces and caps CPU.
74
- let shotId = -1;
75
- let shotStartedAt = 0;
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
- ws.on("open", () => {
88
- opts.log?.info?.("[sandbox-cdp] CDP connected capturing frames");
89
- send("Page.enable");
90
- poll();
91
- });
92
- ws.on("message", (raw) => {
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
- scheduleNext(); // keep the stream alive whether or not this shot returned data
151
+ }
152
+ finishShot(); // keep the stream alive whether or not this shot returned data
105
153
  }
106
- });
107
- ws.on("error", (err) => opts.log?.warn?.(`[sandbox-cdp] ws error: ${err.message}`));
108
- // Mouse buttons: CDP wants "left"/"middle"/"right"/"none".
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: 1, clickCount: 1 });
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: Number(data.deltaX ?? data.dx ?? 0), deltaY: Number(data.deltaY ?? data.delta ?? data.dy ?? 0) });
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 (action === "keydown") {
131
- send("Input.dispatchKeyEvent", { type: "keyDown", key: String(data.key ?? ""), code: String(data.code ?? ""), text: typeof data.text === "string" ? data.text : undefined });
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 (action === "keyup") {
134
- send("Input.dispatchKeyEvent", { type: "keyUp", key: String(data.key ?? ""), code: String(data.code ?? "") });
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: (width, height) => {
138
- if (closed || !width || !height)
139
- return;
140
- // Match the page viewport to the viewer so captureScreenshot frames have the
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.close();
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":"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"}
@@ -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.24",
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. */