@arbidocs/blocks 0.5.126 → 0.5.127

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 (94) hide show
  1. package/README.md +19 -0
  2. package/dist/{ConnectedCallDock-733O5M36.cjs → ConnectedCallDock-XJOYVVAH.cjs} +5 -5
  3. package/dist/{ConnectedCallDock-733O5M36.cjs.map → ConnectedCallDock-XJOYVVAH.cjs.map} +1 -1
  4. package/dist/{ConnectedCallRoom-TAUGSRGV.cjs → ConnectedCallRoom-CUDYAPQK.cjs} +5 -5
  5. package/dist/{ConnectedCallRoom-TAUGSRGV.cjs.map → ConnectedCallRoom-CUDYAPQK.cjs.map} +1 -1
  6. package/dist/{ConnectedNativeDocxComparison-HDE522YC.cjs → ConnectedNativeDocxComparison-JUF2TI2P.cjs} +9 -9
  7. package/dist/{ConnectedNativeDocxComparison-HDE522YC.cjs.map → ConnectedNativeDocxComparison-JUF2TI2P.cjs.map} +1 -1
  8. package/dist/ConnectedPresentation-SI3L77J4.cjs +1 -1
  9. package/dist/{ConnectedSlidesTab-JSPU6EY5.cjs → ConnectedSlidesTab-E76OVY34.cjs} +3 -3
  10. package/dist/{ConnectedSlidesTab-JSPU6EY5.cjs.map → ConnectedSlidesTab-E76OVY34.cjs.map} +1 -1
  11. package/dist/{ConnectedStreamedWordArtifact-4FHPOAFZ.cjs → ConnectedStreamedWordArtifact-Q64DRRQD.cjs} +9 -9
  12. package/dist/{ConnectedStreamedWordArtifact-4FHPOAFZ.cjs.map → ConnectedStreamedWordArtifact-Q64DRRQD.cjs.map} +1 -1
  13. package/dist/{DocumentReviewCard-BDNXP3D4.cjs → DocumentReviewCard-M53XFLI2.cjs} +4 -4
  14. package/dist/{DocumentReviewCard-BDNXP3D4.cjs.map → DocumentReviewCard-M53XFLI2.cjs.map} +1 -1
  15. package/dist/{FilesViewerDialog-WQRNSKWM.cjs → FilesViewerDialog-V6FSRQTP.cjs} +8 -8
  16. package/dist/{FilesViewerDialog-WQRNSKWM.cjs.map → FilesViewerDialog-V6FSRQTP.cjs.map} +1 -1
  17. package/dist/{NativeDocxEditor-SUDULUN3.cjs → NativeDocxEditor-2PTEK6ND.cjs} +6 -6
  18. package/dist/{NativeDocxEditor-SUDULUN3.cjs.map → NativeDocxEditor-2PTEK6ND.cjs.map} +1 -1
  19. package/dist/WorkspaceTableView-3XYAV4BV.cjs +1 -1
  20. package/dist/agents/index.cjs +1 -1
  21. package/dist/ai-IEIR7SC2.cjs +1 -1
  22. package/dist/calls/index.cjs +2 -2
  23. package/dist/{chunk-Q6N5D3R5.cjs → chunk-23I5EUZA.cjs} +45 -15
  24. package/dist/chunk-23I5EUZA.cjs.map +1 -0
  25. package/dist/{chunk-OHHKBURG.cjs → chunk-2SU37RZA.cjs} +378 -11
  26. package/dist/chunk-2SU37RZA.cjs.map +1 -0
  27. package/dist/{chunk-6B4CCDDB.cjs → chunk-ESVRVZ53.cjs} +5 -5
  28. package/dist/{chunk-6B4CCDDB.cjs.map → chunk-ESVRVZ53.cjs.map} +1 -1
  29. package/dist/{chunk-KA3F6TIH.cjs → chunk-IWHP7FAB.cjs} +12 -5
  30. package/dist/chunk-IWHP7FAB.cjs.map +1 -0
  31. package/dist/{chunk-FB3JXSQT.cjs → chunk-JVLOIIA7.cjs} +8 -8
  32. package/dist/{chunk-FB3JXSQT.cjs.map → chunk-JVLOIIA7.cjs.map} +1 -1
  33. package/dist/{chunk-FGOJBOZX.cjs → chunk-M6WVIGYP.cjs} +4 -4
  34. package/dist/{chunk-FGOJBOZX.cjs.map → chunk-M6WVIGYP.cjs.map} +1 -1
  35. package/dist/{chunk-I4X72WUT.cjs → chunk-MMSHIIKG.cjs} +6 -6
  36. package/dist/{chunk-I4X72WUT.cjs.map → chunk-MMSHIIKG.cjs.map} +1 -1
  37. package/dist/{chunk-LXM5QXII.cjs → chunk-MXBXZXXQ.cjs} +3 -3
  38. package/dist/{chunk-LXM5QXII.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
  39. package/dist/{chunk-463QM764.cjs → chunk-NG2EE7HR.cjs} +3 -3
  40. package/dist/{chunk-463QM764.cjs.map → chunk-NG2EE7HR.cjs.map} +1 -1
  41. package/dist/chunk-NTDQQLDD.cjs +18 -0
  42. package/dist/{chunk-OALQGO5C.cjs.map → chunk-NTDQQLDD.cjs.map} +1 -1
  43. package/dist/{chunk-XNB27POJ.cjs → chunk-Q6IKXWPG.cjs} +4 -4
  44. package/dist/{chunk-XNB27POJ.cjs.map → chunk-Q6IKXWPG.cjs.map} +1 -1
  45. package/dist/{chunk-LOB2ATS5.cjs → chunk-VLQCLQAS.cjs} +5 -5
  46. package/dist/{chunk-LOB2ATS5.cjs.map → chunk-VLQCLQAS.cjs.map} +1 -1
  47. package/dist/{chunk-4KEQ62SL.cjs → chunk-YP5EBGLU.cjs} +6 -6
  48. package/dist/{chunk-4KEQ62SL.cjs.map → chunk-YP5EBGLU.cjs.map} +1 -1
  49. package/dist/{chunk-CMPHJRVV.cjs → chunk-ZYGAXD3N.cjs} +3 -3
  50. package/dist/{chunk-CMPHJRVV.cjs.map → chunk-ZYGAXD3N.cjs.map} +1 -1
  51. package/dist/connect/docx.cjs +13 -13
  52. package/dist/connect/index.cjs +233 -287
  53. package/dist/connect/index.cjs.map +1 -1
  54. package/dist/connect/viewer.cjs +6 -6
  55. package/dist/connection/remote-control/ConnectedRemoteControlConsent.js +6 -3
  56. package/dist/connection/remote-control/ConnectedRemoteControlConsent.js.map +2 -2
  57. package/dist/connection/remote-control/ConnectedRemoteControlIndicator.js +12 -2
  58. package/dist/connection/remote-control/ConnectedRemoteControlIndicator.js.map +2 -2
  59. package/dist/connection/remote-control/ConnectedRemoteControlSwitch.js +1 -1
  60. package/dist/connection/remote-control/ConnectedRemoteControlSwitch.js.map +1 -1
  61. package/dist/connection/remote-control/browser-diagnostics.d.ts +7 -0
  62. package/dist/connection/remote-control/browser-diagnostics.js +109 -0
  63. package/dist/connection/remote-control/browser-diagnostics.js.map +7 -0
  64. package/dist/connection/remote-control/remoteControl.d.ts +9 -1
  65. package/dist/connection/remote-control/remoteControl.js +130 -10
  66. package/dist/connection/remote-control/remoteControl.js.map +2 -2
  67. package/dist/connection/remote-control/screen-sharing.d.ts +11 -0
  68. package/dist/connection/remote-control/screen-sharing.js +78 -0
  69. package/dist/connection/remote-control/screen-sharing.js.map +7 -0
  70. package/dist/connection/report-problem/screen-capture.d.ts +1 -0
  71. package/dist/connection/report-problem/screen-capture.js +2 -1
  72. package/dist/connection/report-problem/screen-capture.js.map +2 -2
  73. package/dist/docx/NativeDocxEditor.js +14 -12
  74. package/dist/docx/NativeDocxEditor.js.map +2 -2
  75. package/dist/docx/index.cjs +38 -38
  76. package/dist/docx/useVersionAutosave.d.ts +10 -0
  77. package/dist/docx/useVersionAutosave.js +36 -0
  78. package/dist/docx/useVersionAutosave.js.map +7 -0
  79. package/dist/embed/index.cjs +9 -9
  80. package/dist/facts/index.cjs +43 -43
  81. package/dist/index.cjs +97 -97
  82. package/dist/settings/index.cjs +1 -1
  83. package/dist/shell/RemoteControlPill.d.ts +2 -1
  84. package/dist/shell/RemoteControlPill.js +10 -3
  85. package/dist/shell/RemoteControlPill.js.map +2 -2
  86. package/dist/shell/index.cjs +21 -21
  87. package/dist/studio/index.cjs +1 -1
  88. package/dist/workflow-canvas/index.cjs +12 -12
  89. package/node_modules/@arbidocs/coedit/package.json +1 -1
  90. package/package.json +5 -5
  91. package/dist/chunk-KA3F6TIH.cjs.map +0 -1
  92. package/dist/chunk-OALQGO5C.cjs +0 -18
  93. package/dist/chunk-OHHKBURG.cjs.map +0 -1
  94. package/dist/chunk-Q6N5D3R5.cjs.map +0 -1
@@ -61,20 +61,353 @@ var renderConnectedUser = (user, { tooltip, variant = "icon" }) => /* @__PURE__
61
61
  showTooltip: tooltip
62
62
  }
63
63
  );
64
- function createRemoteControl(session, guided) {
64
+
65
+ // src/connection/report-problem/screen-capture.ts
66
+ var ScreenCaptureError = class extends Error {
67
+ constructor(code, message) {
68
+ super(message);
69
+ this.code = code;
70
+ this.name = "ScreenCaptureError";
71
+ }
72
+ code;
73
+ };
74
+ function canCaptureScreen() {
75
+ return typeof navigator !== "undefined" && !!navigator.mediaDevices?.getDisplayMedia;
76
+ }
77
+ async function captureCurrentTab() {
78
+ if (!canCaptureScreen()) {
79
+ throw new ScreenCaptureError("unsupported", "This browser can't capture the screen.");
80
+ }
81
+ let stream;
82
+ try {
83
+ stream = await navigator.mediaDevices.getDisplayMedia({
84
+ video: { displaySurface: "browser" },
85
+ audio: false,
86
+ // Chromium hints: offer this tab first, and don't let the person switch surfaces mid-capture.
87
+ preferCurrentTab: true,
88
+ selfBrowserSurface: "include",
89
+ surfaceSwitching: "exclude"
90
+ });
91
+ } catch (error) {
92
+ const name = error instanceof DOMException ? error.name : "";
93
+ if (name === "NotAllowedError" || name === "AbortError") {
94
+ throw new ScreenCaptureError("cancelled", "Screen capture was cancelled.");
95
+ }
96
+ throw new ScreenCaptureError("failed", "Couldn't start screen capture.");
97
+ }
98
+ try {
99
+ return await grabFrame(stream);
100
+ } finally {
101
+ stream.getTracks().forEach((track) => track.stop());
102
+ }
103
+ }
104
+ async function grabFrame(stream) {
105
+ const video = document.createElement("video");
106
+ video.muted = true;
107
+ video.playsInline = true;
108
+ video.srcObject = stream;
109
+ await video.play();
110
+ for (let i = 0; i < 50 && (!video.videoWidth || !video.videoHeight); i++) {
111
+ await new Promise((resolve) => setTimeout(resolve, 40));
112
+ }
113
+ await new Promise((resolve) => requestAnimationFrame(() => resolve(null)));
114
+ const canvas = document.createElement("canvas");
115
+ canvas.width = video.videoWidth;
116
+ canvas.height = video.videoHeight;
117
+ const ctx = canvas.getContext("2d");
118
+ if (!ctx || !canvas.width) throw new ScreenCaptureError("failed", "Couldn't read the screen.");
119
+ ctx.drawImage(video, 0, 0);
120
+ video.srcObject = null;
121
+ return canvasToBlob(canvas);
122
+ }
123
+ function canvasToBlob(canvas) {
124
+ return new Promise(
125
+ (resolve, reject) => canvas.toBlob(
126
+ (blob) => blob ? resolve(blob) : reject(new ScreenCaptureError("failed", "Couldn't save the image.")),
127
+ "image/png"
128
+ )
129
+ );
130
+ }
131
+
132
+ // src/connection/remote-control/browser-diagnostics.ts
133
+ function collectBrowserDiagnostics() {
134
+ const lines = [];
135
+ const add = (message) => {
136
+ lines.push(`${(/* @__PURE__ */ new Date()).toISOString()} ${sanitizeDiagnostic(message).slice(0, 1800)}`);
137
+ if (lines.length > 30) lines.shift();
138
+ };
139
+ const stringify = (value) => {
140
+ if (value instanceof Error)
141
+ return chunkT73BHNQX_cjs.formatErrorReport({ error: value, url: safeUrl(location.href) });
142
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
143
+ return String(value);
144
+ return "[object omitted]";
145
+ };
146
+ const originalError = console.error;
147
+ const originalWarn = console.warn;
148
+ const error = (...args) => {
149
+ add(`error: ${args.map(stringify).join(" ")}`);
150
+ originalError.apply(console, args);
151
+ };
152
+ const warn = (...args) => {
153
+ add(`warning: ${args.map(stringify).join(" ")}`);
154
+ originalWarn.apply(console, args);
155
+ };
156
+ console.error = error;
157
+ console.warn = warn;
158
+ const onError = (event) => add(`uncaught: ${stringify(event.error ?? event.message)}`);
159
+ const onRejection = (event) => add(`unhandled rejection: ${stringify(event.reason)}`);
160
+ window.addEventListener("error", onError);
161
+ window.addEventListener("unhandledrejection", onRejection);
162
+ const originalFetch = window.fetch;
163
+ const wrappedFetch = async (...args) => {
164
+ const input = args[0];
165
+ const url = safeUrl(
166
+ typeof input === "string" ? input : input instanceof URL ? input.href : input.url
167
+ );
168
+ try {
169
+ const response = await originalFetch.apply(window, args);
170
+ if (!response.ok) add(`HTTP ${response.status}: ${url}`);
171
+ return response;
172
+ } catch (failure) {
173
+ add(`request failed: ${url}`);
174
+ throw failure;
175
+ }
176
+ };
177
+ window.fetch = wrappedFetch;
178
+ let resources;
179
+ if (typeof PerformanceObserver !== "undefined") {
180
+ try {
181
+ resources = new PerformanceObserver((list) => {
182
+ for (const entry of list.getEntries()) {
183
+ const resource = entry;
184
+ if ("responseStatus" in resource && Number(resource.responseStatus) >= 400)
185
+ add(`HTTP ${resource.responseStatus}: ${safeUrl(resource.name)}`);
186
+ }
187
+ });
188
+ resources.observe({ type: "resource" });
189
+ } catch {
190
+ resources = void 0;
191
+ }
192
+ }
193
+ return {
194
+ snapshot: () => [
195
+ `ARBI tab: ${safeUrl(location.href)}`,
196
+ `Viewport: ${innerWidth} x ${innerHeight}; DPR ${devicePixelRatio}`,
197
+ "Visible ARBI controls (selectors for control_ui):",
198
+ ...Array.from(
199
+ document.querySelectorAll(
200
+ 'button[data-testid],a[data-testid],input[data-testid]:not([type="password"]),select[data-testid],[role="button"][data-testid]'
201
+ )
202
+ ).filter(
203
+ (el) => el.getBoundingClientRect().width > 0 && !el.closest("[data-remote-control-surface]")
204
+ ).slice(0, 60).map(
205
+ (el) => `[data-testid=${JSON.stringify(el.dataset.testid)}] ${sanitizeDiagnostic(el.getAttribute("aria-label") ?? el.getAttribute("title") ?? el.textContent ?? "").slice(0, 80)}`
206
+ ),
207
+ ...lines
208
+ ].join("\n").slice(-18e3),
209
+ stop: () => {
210
+ if (console.error === error) console.error = originalError;
211
+ if (console.warn === warn) console.warn = originalWarn;
212
+ if (window.fetch === wrappedFetch) window.fetch = originalFetch;
213
+ window.removeEventListener("error", onError);
214
+ window.removeEventListener("unhandledrejection", onRejection);
215
+ resources?.disconnect();
216
+ lines.length = 0;
217
+ }
218
+ };
219
+ }
220
+ function safeUrl(value) {
221
+ try {
222
+ const url = new URL(value, location.href);
223
+ return `${url.origin}${url.pathname}`;
224
+ } catch {
225
+ return "[invalid URL]";
226
+ }
227
+ }
228
+ function sanitizeDiagnostic(value) {
229
+ return value.replace(/https?:\/\/[^\s<>"']+/g, (url) => safeUrl(url)).replace(/\bBearer\s+[^\s,;]+/gi, "Bearer [redacted]").replace(
230
+ /\b(token|password|secret|authorization|api[_-]?key)\s*[:=]\s*[^\s,;]+/gi,
231
+ "$1=[redacted]"
232
+ ).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g, "[redacted token]");
233
+ }
234
+
235
+ // src/connection/remote-control/screen-sharing.ts
236
+ function createScreenSharing() {
237
+ let stream = null;
238
+ let diagnostics = null;
239
+ let generation = 0;
240
+ const stop = () => {
241
+ generation++;
242
+ const previous = stream;
243
+ stream = null;
244
+ previous?.getTracks().forEach((track) => track.stop());
245
+ diagnostics?.stop();
246
+ diagnostics = null;
247
+ };
248
+ return {
249
+ get active() {
250
+ return !!stream?.getVideoTracks().some((track) => track.readyState === "live");
251
+ },
252
+ async start(onEnded) {
253
+ const token = ++generation;
254
+ if (!navigator.mediaDevices?.getDisplayMedia)
255
+ throw new ScreenCaptureError(
256
+ "unsupported",
257
+ "Screen sharing is unavailable in this browser."
258
+ );
259
+ const next = await navigator.mediaDevices.getDisplayMedia({
260
+ video: { displaySurface: "browser" },
261
+ audio: false,
262
+ preferCurrentTab: true,
263
+ selfBrowserSurface: "include",
264
+ surfaceSwitching: "exclude"
265
+ });
266
+ if (token !== generation) {
267
+ next.getTracks().forEach((track) => track.stop());
268
+ throw new ScreenCaptureError("cancelled", "Sharing stopped.");
269
+ }
270
+ stream = next;
271
+ diagnostics = collectBrowserDiagnostics();
272
+ next.getVideoTracks().forEach(
273
+ (track) => track.addEventListener(
274
+ "ended",
275
+ () => {
276
+ if (stream === next) {
277
+ stop();
278
+ onEnded();
279
+ }
280
+ },
281
+ { once: true }
282
+ )
283
+ );
284
+ },
285
+ async frame() {
286
+ if (!stream) throw new ScreenCaptureError("cancelled", "Sharing stopped.");
287
+ const token = generation;
288
+ const blob = await grabFrame(stream);
289
+ if (token !== generation) throw new ScreenCaptureError("cancelled", "Sharing stopped.");
290
+ if (blob.size > 8 * 1024 * 1024)
291
+ throw new ScreenCaptureError(
292
+ "failed",
293
+ "The shared screen image is too large. Share a smaller window."
294
+ );
295
+ const screenshot_png = await new Promise((resolve, reject) => {
296
+ const reader = new FileReader();
297
+ reader.onload = () => resolve(String(reader.result).split(",")[1]);
298
+ reader.onerror = () => reject(new Error("Could not read the screen frame."));
299
+ reader.readAsDataURL(blob);
300
+ });
301
+ if (token !== generation) throw new ScreenCaptureError("cancelled", "Sharing stopped.");
302
+ return { screenshot_png, diagnostics: diagnostics?.snapshot() ?? "" };
303
+ },
304
+ stop
305
+ };
306
+ }
307
+
308
+ // src/connection/remote-control/remoteControl.ts
309
+ var screenRuntimes = /* @__PURE__ */ new WeakMap();
310
+ function screenRuntime(session) {
311
+ let runtime = screenRuntimes.get(session);
312
+ if (!runtime) {
313
+ runtime = { sharing: createScreenSharing(), generation: 0, setup: "" };
314
+ screenRuntimes.set(session, runtime);
315
+ }
316
+ return runtime;
317
+ }
318
+ function stopScreen(session) {
319
+ const runtime = screenRuntimes.get(session);
320
+ if (!runtime) return;
321
+ runtime.generation++;
322
+ runtime.sharing.stop();
323
+ runtime.setup = "";
324
+ const actions = react.remoteControlActions(session);
325
+ if (react.remoteControlStateOf(session.getState()).sharing) actions.setSharing(false);
326
+ }
327
+ function createRemoteControl(session, guided, screenTransport) {
65
328
  const actions = react.remoteControlActions(session);
66
329
  const state = () => react.remoteControlStateOf(session.getState());
330
+ const runtime = screenRuntime(session);
331
+ const reply = async (req, status) => {
332
+ if ((req.screenRequestId || req.actionRequestId) && screenTransport) {
333
+ await screenTransport.reply(req.screenRequestId || req.actionRequestId, { status }).catch(() => {
334
+ });
335
+ }
336
+ };
337
+ const disable = () => {
338
+ const pending = state().pending;
339
+ if (pending) void reply(pending, "stopped");
340
+ stopScreen(session);
341
+ actions.setEnabled(false);
342
+ chunkORELHENJ_cjs.cancelGuidedRun();
343
+ };
344
+ const inspect = async (req, keepSharing) => {
345
+ if (!req.screenRequestId || !screenTransport) return;
346
+ const workspace = session.getState().workspaceId;
347
+ if (workspace !== req.workspaceExtId) {
348
+ await reply(req, "unavailable");
349
+ return;
350
+ }
351
+ const token = runtime.generation;
352
+ const current = () => token === runtime.generation && session.getState().workspaceId === workspace;
353
+ actions.setControllingAgent({ name: req.agentName, extId: req.agentExtId });
354
+ try {
355
+ if (!runtime.sharing.active) {
356
+ await runtime.sharing.start(disable);
357
+ if (!current()) {
358
+ runtime.sharing.stop();
359
+ await reply(req, "stopped");
360
+ return;
361
+ }
362
+ actions.setSharing(true);
363
+ if (screenTransport.diagnose)
364
+ runtime.setup = await screenTransport.diagnose().catch(() => "Setup checks unavailable.");
365
+ }
366
+ if (!current()) {
367
+ await reply(req, "stopped");
368
+ return;
369
+ }
370
+ const frame = await runtime.sharing.frame();
371
+ if (!current()) {
372
+ await reply(req, "stopped");
373
+ return;
374
+ }
375
+ await screenTransport.reply(req.screenRequestId, {
376
+ status: "captured",
377
+ ...frame,
378
+ diagnostics: `${frame.diagnostics}
379
+ ${runtime.setup}`.slice(0, 24e3)
380
+ });
381
+ } catch {
382
+ await reply(req, current() ? "unavailable" : "stopped");
383
+ if (current()) disable();
384
+ } finally {
385
+ if (current()) {
386
+ actions.setControllingAgent(null);
387
+ if (!keepSharing) disable();
388
+ }
389
+ }
390
+ };
67
391
  const resolveRun = (req) => {
68
392
  if (req.steps && req.steps.length > 0) return req.steps;
69
393
  if (req.sequenceId && guided.isSequenceId(req.sequenceId)) return req.sequenceId;
70
394
  return null;
71
395
  };
72
- const runRemoteRequest = async (req) => {
396
+ const runRemoteRequest = async (req, keepSharing = state().enabled) => {
397
+ if (req.screenRequestId) {
398
+ await inspect(req, keepSharing);
399
+ return;
400
+ }
73
401
  const run = resolveRun(req);
74
402
  if (!run) return;
403
+ const token = runtime.generation;
75
404
  actions.setControllingAgent({ name: req.agentName, extId: req.agentExtId });
76
405
  try {
77
406
  await guided.run(run, { remote: true });
407
+ if (req.actionRequestId)
408
+ await reply(req, token === runtime.generation ? "action_finished" : "stopped");
409
+ } catch {
410
+ await reply(req, "unavailable");
78
411
  } finally {
79
412
  const current = state().controllingAgent;
80
413
  if (current && current.name === req.agentName && current.extId === req.agentExtId) {
@@ -94,31 +427,49 @@ function createRemoteControl(session, guided) {
94
427
  }
95
428
  const req = react.toRemoteControlRequest(msg, guided.isSequenceId);
96
429
  if (!req) return;
97
- if (state().enabled) {
430
+ if ((req.screenRequestId || req.actionRequestId) && (!screenTransport || session.getState().workspaceId !== req.workspaceExtId)) {
431
+ void reply(req, "unavailable");
432
+ return;
433
+ }
434
+ if (state().enabled && (!req.screenRequestId || runtime.sharing.active)) {
98
435
  client.logger.info("[RemoteControl] Enabled \u2014 running requested action from", req.agentName);
99
436
  void runRemoteRequest(req);
100
437
  return;
101
438
  }
102
439
  client.logger.info("[RemoteControl] Consent required \u2014 prompting for", req.agentName);
440
+ if (state().pending) void reply(state().pending, "denied");
103
441
  actions.request(req);
104
442
  },
105
443
  grantAndRun(opts) {
106
444
  const pending = state().pending;
445
+ const keepSharing = opts.forSession || state().enabled;
107
446
  actions.grant(opts);
108
- if (pending) void runRemoteRequest(pending);
447
+ if (pending) void runRemoteRequest(pending, keepSharing);
109
448
  },
110
- deny: () => actions.deny(),
111
- disable() {
112
- actions.setEnabled(false);
113
- chunkORELHENJ_cjs.cancelGuidedRun();
449
+ deny: () => {
450
+ const pending = state().pending;
451
+ actions.deny();
452
+ if (pending) void reply(pending, "denied");
114
453
  },
454
+ disable,
115
455
  enable: () => actions.setEnabled(true)
116
456
  };
117
457
  }
118
458
  function useRemoteControlActions() {
119
459
  const session = react.useArbiSessionStore();
120
460
  const guided = chunkORELHENJ_cjs.useGuidedRuns();
121
- return React6.useMemo(() => createRemoteControl(session, guided), [session, guided]);
461
+ const { arbi } = react.useArbiHost();
462
+ return React6.useMemo(
463
+ () => createRemoteControl(
464
+ session,
465
+ guided,
466
+ arbi ? {
467
+ reply: (id, result) => arbi.remoteControl.replyScreen(id, result),
468
+ diagnose: async () => JSON.stringify(await arbi.diagnose())
469
+ } : void 0
470
+ ),
471
+ [session, guided, arbi]
472
+ );
122
473
  }
123
474
  function useRemoteControlSessionReset() {
124
475
  const session = react.useArbiSessionStore();
@@ -126,6 +477,7 @@ function useRemoteControlSessionReset() {
126
477
  const userId = react.useArbiSession().user?.external_id ?? null;
127
478
  React6.useEffect(() => {
128
479
  const reset = () => {
480
+ stopScreen(session);
129
481
  react.remoteControlActions(session).reset();
130
482
  chunkORELHENJ_cjs.cancelGuidedRun();
131
483
  };
@@ -141,6 +493,7 @@ function useRemoteControlSessionReset() {
141
493
  React6.useEffect(() => {
142
494
  if (lastUser.current === userId) return;
143
495
  lastUser.current = userId;
496
+ stopScreen(session);
144
497
  react.remoteControlActions(session).reset();
145
498
  chunkORELHENJ_cjs.cancelGuidedRun();
146
499
  }, [userId, session]);
@@ -149,6 +502,16 @@ function useRemoteControlHandlers() {
149
502
  useRemoteControlSessionReset();
150
503
  const remote = useRemoteControlActions();
151
504
  const { remoteControl } = chunkORELHENJ_cjs.useGuidedRuns();
505
+ const session = react.useArbiSessionStore();
506
+ const workspaceId = react.useArbiSessionState((s) => s.workspaceId);
507
+ React6.useEffect(
508
+ () => () => {
509
+ stopScreen(session);
510
+ react.remoteControlActions(session).setEnabled(false);
511
+ chunkORELHENJ_cjs.cancelGuidedRun();
512
+ },
513
+ [session, workspaceId]
514
+ );
152
515
  return React6.useMemo(
153
516
  () => remoteControl ? {
154
517
  remote_control: (message) => remote.handleMessage(message)
@@ -5221,8 +5584,12 @@ exports.PENDING_RECOVERY_KEY = PENDING_RECOVERY_KEY;
5221
5584
  exports.PREMIUM_TIER_TAG = PREMIUM_TIER_TAG;
5222
5585
  exports.RunningSubagents = RunningSubagents;
5223
5586
  exports.STANDARD_TIER_TAG = STANDARD_TIER_TAG;
5587
+ exports.ScreenCaptureError = ScreenCaptureError;
5224
5588
  exports.WorkflowStepMessage = WorkflowStepMessage;
5225
5589
  exports.backUpOnSignup = backUpOnSignup;
5590
+ exports.canCaptureScreen = canCaptureScreen;
5591
+ exports.canvasToBlob = canvasToBlob;
5592
+ exports.captureCurrentTab = captureCurrentTab;
5226
5593
  exports.completeSsoSignIn = completeSsoSignIn;
5227
5594
  exports.createRemoteControl = createRemoteControl;
5228
5595
  exports.defaultHost = defaultHost;
@@ -5240,5 +5607,5 @@ exports.useRemoteControlHandlers = useRemoteControlHandlers;
5240
5607
  exports.useRemoteControlSessionReset = useRemoteControlSessionReset;
5241
5608
  exports.useSsoSignIn = useSsoSignIn;
5242
5609
  exports.useWorkspaceDocTitles = useWorkspaceDocTitles;
5243
- //# sourceMappingURL=chunk-OHHKBURG.cjs.map
5244
- //# sourceMappingURL=chunk-OHHKBURG.cjs.map
5610
+ //# sourceMappingURL=chunk-2SU37RZA.cjs.map
5611
+ //# sourceMappingURL=chunk-2SU37RZA.cjs.map