@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.
- package/README.md +19 -0
- package/dist/{ConnectedCallDock-733O5M36.cjs → ConnectedCallDock-XJOYVVAH.cjs} +5 -5
- package/dist/{ConnectedCallDock-733O5M36.cjs.map → ConnectedCallDock-XJOYVVAH.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-TAUGSRGV.cjs → ConnectedCallRoom-CUDYAPQK.cjs} +5 -5
- package/dist/{ConnectedCallRoom-TAUGSRGV.cjs.map → ConnectedCallRoom-CUDYAPQK.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-HDE522YC.cjs → ConnectedNativeDocxComparison-JUF2TI2P.cjs} +9 -9
- package/dist/{ConnectedNativeDocxComparison-HDE522YC.cjs.map → ConnectedNativeDocxComparison-JUF2TI2P.cjs.map} +1 -1
- package/dist/ConnectedPresentation-SI3L77J4.cjs +1 -1
- package/dist/{ConnectedSlidesTab-JSPU6EY5.cjs → ConnectedSlidesTab-E76OVY34.cjs} +3 -3
- package/dist/{ConnectedSlidesTab-JSPU6EY5.cjs.map → ConnectedSlidesTab-E76OVY34.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-4FHPOAFZ.cjs → ConnectedStreamedWordArtifact-Q64DRRQD.cjs} +9 -9
- package/dist/{ConnectedStreamedWordArtifact-4FHPOAFZ.cjs.map → ConnectedStreamedWordArtifact-Q64DRRQD.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-BDNXP3D4.cjs → DocumentReviewCard-M53XFLI2.cjs} +4 -4
- package/dist/{DocumentReviewCard-BDNXP3D4.cjs.map → DocumentReviewCard-M53XFLI2.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-WQRNSKWM.cjs → FilesViewerDialog-V6FSRQTP.cjs} +8 -8
- package/dist/{FilesViewerDialog-WQRNSKWM.cjs.map → FilesViewerDialog-V6FSRQTP.cjs.map} +1 -1
- package/dist/{NativeDocxEditor-SUDULUN3.cjs → NativeDocxEditor-2PTEK6ND.cjs} +6 -6
- package/dist/{NativeDocxEditor-SUDULUN3.cjs.map → NativeDocxEditor-2PTEK6ND.cjs.map} +1 -1
- package/dist/WorkspaceTableView-3XYAV4BV.cjs +1 -1
- package/dist/agents/index.cjs +1 -1
- package/dist/ai-IEIR7SC2.cjs +1 -1
- package/dist/calls/index.cjs +2 -2
- package/dist/{chunk-Q6N5D3R5.cjs → chunk-23I5EUZA.cjs} +45 -15
- package/dist/chunk-23I5EUZA.cjs.map +1 -0
- package/dist/{chunk-OHHKBURG.cjs → chunk-2SU37RZA.cjs} +378 -11
- package/dist/chunk-2SU37RZA.cjs.map +1 -0
- package/dist/{chunk-6B4CCDDB.cjs → chunk-ESVRVZ53.cjs} +5 -5
- package/dist/{chunk-6B4CCDDB.cjs.map → chunk-ESVRVZ53.cjs.map} +1 -1
- package/dist/{chunk-KA3F6TIH.cjs → chunk-IWHP7FAB.cjs} +12 -5
- package/dist/chunk-IWHP7FAB.cjs.map +1 -0
- package/dist/{chunk-FB3JXSQT.cjs → chunk-JVLOIIA7.cjs} +8 -8
- package/dist/{chunk-FB3JXSQT.cjs.map → chunk-JVLOIIA7.cjs.map} +1 -1
- package/dist/{chunk-FGOJBOZX.cjs → chunk-M6WVIGYP.cjs} +4 -4
- package/dist/{chunk-FGOJBOZX.cjs.map → chunk-M6WVIGYP.cjs.map} +1 -1
- package/dist/{chunk-I4X72WUT.cjs → chunk-MMSHIIKG.cjs} +6 -6
- package/dist/{chunk-I4X72WUT.cjs.map → chunk-MMSHIIKG.cjs.map} +1 -1
- package/dist/{chunk-LXM5QXII.cjs → chunk-MXBXZXXQ.cjs} +3 -3
- package/dist/{chunk-LXM5QXII.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
- package/dist/{chunk-463QM764.cjs → chunk-NG2EE7HR.cjs} +3 -3
- package/dist/{chunk-463QM764.cjs.map → chunk-NG2EE7HR.cjs.map} +1 -1
- package/dist/chunk-NTDQQLDD.cjs +18 -0
- package/dist/{chunk-OALQGO5C.cjs.map → chunk-NTDQQLDD.cjs.map} +1 -1
- package/dist/{chunk-XNB27POJ.cjs → chunk-Q6IKXWPG.cjs} +4 -4
- package/dist/{chunk-XNB27POJ.cjs.map → chunk-Q6IKXWPG.cjs.map} +1 -1
- package/dist/{chunk-LOB2ATS5.cjs → chunk-VLQCLQAS.cjs} +5 -5
- package/dist/{chunk-LOB2ATS5.cjs.map → chunk-VLQCLQAS.cjs.map} +1 -1
- package/dist/{chunk-4KEQ62SL.cjs → chunk-YP5EBGLU.cjs} +6 -6
- package/dist/{chunk-4KEQ62SL.cjs.map → chunk-YP5EBGLU.cjs.map} +1 -1
- package/dist/{chunk-CMPHJRVV.cjs → chunk-ZYGAXD3N.cjs} +3 -3
- package/dist/{chunk-CMPHJRVV.cjs.map → chunk-ZYGAXD3N.cjs.map} +1 -1
- package/dist/connect/docx.cjs +13 -13
- package/dist/connect/index.cjs +233 -287
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/viewer.cjs +6 -6
- package/dist/connection/remote-control/ConnectedRemoteControlConsent.js +6 -3
- package/dist/connection/remote-control/ConnectedRemoteControlConsent.js.map +2 -2
- package/dist/connection/remote-control/ConnectedRemoteControlIndicator.js +12 -2
- package/dist/connection/remote-control/ConnectedRemoteControlIndicator.js.map +2 -2
- package/dist/connection/remote-control/ConnectedRemoteControlSwitch.js +1 -1
- package/dist/connection/remote-control/ConnectedRemoteControlSwitch.js.map +1 -1
- package/dist/connection/remote-control/browser-diagnostics.d.ts +7 -0
- package/dist/connection/remote-control/browser-diagnostics.js +109 -0
- package/dist/connection/remote-control/browser-diagnostics.js.map +7 -0
- package/dist/connection/remote-control/remoteControl.d.ts +9 -1
- package/dist/connection/remote-control/remoteControl.js +130 -10
- package/dist/connection/remote-control/remoteControl.js.map +2 -2
- package/dist/connection/remote-control/screen-sharing.d.ts +11 -0
- package/dist/connection/remote-control/screen-sharing.js +78 -0
- package/dist/connection/remote-control/screen-sharing.js.map +7 -0
- package/dist/connection/report-problem/screen-capture.d.ts +1 -0
- package/dist/connection/report-problem/screen-capture.js +2 -1
- package/dist/connection/report-problem/screen-capture.js.map +2 -2
- package/dist/docx/NativeDocxEditor.js +14 -12
- package/dist/docx/NativeDocxEditor.js.map +2 -2
- package/dist/docx/index.cjs +38 -38
- package/dist/docx/useVersionAutosave.d.ts +10 -0
- package/dist/docx/useVersionAutosave.js +36 -0
- package/dist/docx/useVersionAutosave.js.map +7 -0
- package/dist/embed/index.cjs +9 -9
- package/dist/facts/index.cjs +43 -43
- package/dist/index.cjs +97 -97
- package/dist/settings/index.cjs +1 -1
- package/dist/shell/RemoteControlPill.d.ts +2 -1
- package/dist/shell/RemoteControlPill.js +10 -3
- package/dist/shell/RemoteControlPill.js.map +2 -2
- package/dist/shell/index.cjs +21 -21
- package/dist/studio/index.cjs +1 -1
- package/dist/workflow-canvas/index.cjs +12 -12
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/chunk-KA3F6TIH.cjs.map +0 -1
- package/dist/chunk-OALQGO5C.cjs +0 -18
- package/dist/chunk-OHHKBURG.cjs.map +0 -1
- 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
|
-
|
|
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 (
|
|
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: () =>
|
|
111
|
-
|
|
112
|
-
actions.
|
|
113
|
-
|
|
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
|
-
|
|
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-
|
|
5244
|
-
//# sourceMappingURL=chunk-
|
|
5610
|
+
//# sourceMappingURL=chunk-2SU37RZA.cjs.map
|
|
5611
|
+
//# sourceMappingURL=chunk-2SU37RZA.cjs.map
|