@opengeni/react 0.48.0 → 0.57.0
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 +138 -2
- package/dist/artifacts-document.d.ts +3 -0
- package/dist/artifacts-document.js +17 -0
- package/dist/artifacts-document.js.map +1 -0
- package/dist/artifacts-presentation.d.ts +3 -0
- package/dist/artifacts-presentation.js +17 -0
- package/dist/artifacts-presentation.js.map +1 -0
- package/dist/artifacts-spreadsheet.d.ts +3 -0
- package/dist/artifacts-spreadsheet.js +17 -0
- package/dist/artifacts-spreadsheet.js.map +1 -0
- package/dist/artifacts.d.ts +2 -0
- package/dist/artifacts.js +199 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/{chunk-NJ7M2B6Z.js → chunk-5UQPNLIO.js} +16 -8
- package/dist/{chunk-NJ7M2B6Z.js.map → chunk-5UQPNLIO.js.map} +1 -1
- package/dist/{chunk-LHLYWG5R.js → chunk-6KLX2RH5.js} +461 -38
- package/dist/chunk-6KLX2RH5.js.map +1 -0
- package/dist/chunk-7WCLAEFV.js +2828 -0
- package/dist/chunk-7WCLAEFV.js.map +1 -0
- package/dist/{chunk-I4MPFDRP.js → chunk-B6WPZSTT.js} +104 -104
- package/dist/{chunk-I4MPFDRP.js.map → chunk-B6WPZSTT.js.map} +1 -1
- package/dist/{chunk-EKZH6IDG.js → chunk-C5ZPSSS5.js} +111 -1
- package/dist/chunk-C5ZPSSS5.js.map +1 -0
- package/dist/{chunk-OL6QVXGF.js → chunk-HA46CYQK.js} +152 -8
- package/dist/chunk-HA46CYQK.js.map +1 -0
- package/dist/chunk-HUIKIDM5.js +2148 -0
- package/dist/chunk-HUIKIDM5.js.map +1 -0
- package/dist/{chunk-FWXGSNXT.js → chunk-IGC6A2ZI.js} +585 -34
- package/dist/chunk-IGC6A2ZI.js.map +1 -0
- package/dist/chunk-JVYQRRC4.js +53 -0
- package/dist/chunk-JVYQRRC4.js.map +1 -0
- package/dist/chunk-KCGXPP5V.js +157 -0
- package/dist/chunk-KCGXPP5V.js.map +1 -0
- package/dist/chunk-LLOLUHVG.js +5937 -0
- package/dist/chunk-LLOLUHVG.js.map +1 -0
- package/dist/{chunk-WYA65Y3F.js → chunk-MKPIAGVL.js} +13 -3
- package/dist/chunk-MKPIAGVL.js.map +1 -0
- package/dist/chunk-PEI6RANI.js +3234 -0
- package/dist/chunk-PEI6RANI.js.map +1 -0
- package/dist/chunk-R3AZOAB5.js +933 -0
- package/dist/chunk-R3AZOAB5.js.map +1 -0
- package/dist/{chunk-O4VXOBGF.js → chunk-WSK7G5LE.js} +70 -2
- package/dist/chunk-WSK7G5LE.js.map +1 -0
- package/dist/{chunk-23EJ676W.js → chunk-XBZWOM2K.js} +9 -4
- package/dist/chunk-XBZWOM2K.js.map +1 -0
- package/dist/{chunk-XCNTXWBB.js → chunk-Y7OEDUJ5.js} +856 -338
- package/dist/chunk-Y7OEDUJ5.js.map +1 -0
- package/dist/client.d.ts +10 -2
- package/dist/clipboard.d.ts +1 -0
- package/dist/clipboard.js +7 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/commands/index.d.ts +3 -3
- package/dist/commands/registry.d.ts +1 -1
- package/dist/commands/types.d.ts +1 -1
- package/dist/components/approval-surface.d.ts +2 -2
- package/dist/components/artifacts/artifact-surface.d.ts +18 -0
- package/dist/components/artifacts/document-editor.d.ts +172 -0
- package/dist/components/artifacts/editable-artifact-ui.d.ts +13 -0
- package/dist/components/artifacts/editable-artifact-workbench.d.ts +49 -0
- package/dist/components/artifacts/editable-document.d.ts +24 -0
- package/dist/components/artifacts/editable-presentation.d.ts +24 -0
- package/dist/components/artifacts/editable-spreadsheet.d.ts +32 -0
- package/dist/components/artifacts/index.d.ts +9 -0
- package/dist/components/artifacts/presentation-editor.d.ts +297 -0
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +14 -0
- package/dist/components/artifacts/spreadsheet-canvas.d.ts +120 -0
- package/dist/components/artifacts/spreadsheet-grid.d.ts +113 -0
- package/dist/components/browser-input.d.ts +7 -0
- package/dist/components/browser-viewer.d.ts +30 -0
- package/dist/components/chat-composer.d.ts +8 -8
- package/dist/components/code-editor.d.ts +25 -3
- package/dist/components/command-palette.d.ts +2 -2
- package/dist/components/composer-transcription-control.d.ts +2 -2
- package/dist/components/composer.d.ts +17 -17
- package/dist/components/computer-viewer.d.ts +24 -0
- package/dist/components/copy-button.d.ts +2 -2
- package/dist/components/desktop-viewer.d.ts +50 -22
- package/dist/components/diff-view.d.ts +1 -1
- package/dist/components/enrollment-consent.d.ts +1 -1
- package/dist/components/enrollment-device-flow.d.ts +1 -1
- package/dist/components/file-browser.d.ts +2 -2
- package/dist/components/fleet-tile.d.ts +1 -1
- package/dist/components/generated-video-player.d.ts +10 -0
- package/dist/components/human-input-form.d.ts +1 -1
- package/dist/components/human-input-surface.d.ts +2 -2
- package/dist/components/interaction-intervention-banner.d.ts +11 -0
- package/dist/components/interactive-workbench-viewers.d.ts +2 -0
- package/dist/components/machine-card.d.ts +2 -2
- package/dist/components/machine-dock-bar.d.ts +3 -3
- package/dist/components/machine-health-pill.d.ts +2 -2
- package/dist/components/machine-input-display.d.ts +1 -1
- package/dist/components/machine-metrics.d.ts +2 -2
- package/dist/components/machine-status-pill.d.ts +4 -4
- package/dist/components/machines/health.d.ts +1 -1
- package/dist/components/machines/machine-detail.d.ts +3 -3
- package/dist/components/machines/metric-history-chart.d.ts +1 -1
- package/dist/components/machines/metric-sparkline.d.ts +2 -2
- package/dist/components/machines/series.d.ts +2 -2
- package/dist/components/machines-dashboard.d.ts +2 -2
- package/dist/components/markdown.d.ts +1 -1
- package/dist/components/message-timeline.d.ts +12 -5
- package/dist/components/model-picker.d.ts +2 -2
- package/dist/components/model-policy-picker.d.ts +7 -7
- package/dist/components/pierre-diff.d.ts +1 -1
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/queue-draft-policy.d.ts +1 -1
- package/dist/components/queue-surface-implementation.d.ts +3 -3
- package/dist/components/queue-surface-state.d.ts +4 -4
- package/dist/components/queue-surface.d.ts +5 -5
- package/dist/components/sandbox-files.d.ts +3 -3
- package/dist/components/sandbox-terminal.d.ts +24 -4
- package/dist/components/sandbox-workspace.d.ts +28 -9
- package/dist/components/session-chrome.d.ts +4 -4
- package/dist/components/session-status.d.ts +2 -2
- package/dist/components/timeline-annotation-selection.d.ts +9 -0
- package/dist/components/timeline-annotations-dialog.d.ts +16 -0
- package/dist/components/timeline-annotations.d.ts +13 -0
- package/dist/components/tooltip.d.ts +4 -4
- package/dist/components/user-message-body.d.ts +2 -2
- package/dist/components/workbench-changes.d.ts +2 -2
- package/dist/components/workspace-dock.d.ts +1 -1
- package/dist/composer.d.ts +11 -11
- package/dist/composer.js +7 -7
- package/dist/hooks/internal.d.ts +1 -1
- package/dist/hooks/use-attached-browsers.d.ts +21 -0
- package/dist/hooks/use-auth-runs.d.ts +32 -0
- package/dist/hooks/use-available-models.d.ts +2 -2
- package/dist/hooks/use-billing-usage.d.ts +1 -1
- package/dist/hooks/use-browser-downloads.d.ts +25 -0
- package/dist/hooks/use-browser-frame-stream.d.ts +28 -0
- package/dist/hooks/use-browser-identities.d.ts +30 -0
- package/dist/hooks/use-browser-session.d.ts +29 -0
- package/dist/hooks/use-browser-sessions.d.ts +32 -0
- package/dist/hooks/use-channels.d.ts +26 -0
- package/dist/hooks/use-codex-accounts.d.ts +2 -2
- package/dist/hooks/use-composer.d.ts +36 -9
- package/dist/hooks/use-computer-frame-stream.d.ts +24 -0
- package/dist/hooks/use-computer-session.d.ts +29 -0
- package/dist/hooks/use-computer-sessions.d.ts +28 -0
- package/dist/hooks/use-desktop-stream.d.ts +5 -1
- package/dist/hooks/use-environments.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +1 -1
- package/dist/hooks/use-goal.d.ts +2 -2
- package/dist/hooks/use-human-input.d.ts +2 -2
- package/dist/hooks/use-interaction-interventions.d.ts +27 -0
- package/dist/hooks/use-interaction-invalidation.d.ts +19 -0
- package/dist/hooks/use-last-started-turn-policy.d.ts +2 -2
- package/dist/hooks/use-machine-chip.d.ts +2 -2
- package/dist/hooks/use-machines.d.ts +4 -4
- package/dist/hooks/use-network-routes.d.ts +25 -0
- package/dist/hooks/use-packs.d.ts +7 -2
- package/dist/hooks/use-rigs.d.ts +1 -1
- package/dist/hooks/use-sandbox-files.d.ts +6 -4
- package/dist/hooks/use-sandbox-git.d.ts +6 -5
- package/dist/hooks/use-sandbox-terminal.d.ts +1 -1
- package/dist/hooks/use-scheduled-tasks.d.ts +1 -1
- package/dist/hooks/use-session-capabilities.d.ts +5 -4
- package/dist/hooks/use-session-control.d.ts +1 -1
- package/dist/hooks/use-session-events.d.ts +2 -2
- package/dist/hooks/use-session-lineage.d.ts +1 -1
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session.d.ts +2 -2
- package/dist/hooks/use-site-auth-connections.d.ts +25 -0
- package/dist/hooks/use-slash-commands.d.ts +1 -1
- package/dist/hooks/use-supergrok-accounts.d.ts +26 -0
- package/dist/hooks/use-terminal-stream.d.ts +11 -2
- package/dist/hooks/use-turn-queue.d.ts +2 -2
- package/dist/hooks/use-video-artifact-playback.d.ts +9 -0
- package/dist/hooks/use-voice-input.d.ts +1 -1
- package/dist/hooks/use-workspace-capture.d.ts +1 -1
- package/dist/hooks/use-workspace-edit.d.ts +1 -1
- package/dist/hooks/use-workspace-sessions.d.ts +1 -1
- package/dist/hooks/use-workspaces.d.ts +1 -1
- package/dist/index.d.ts +162 -155
- package/dist/index.js +1822 -1703
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +33 -0
- package/dist/interaction.js +550 -0
- package/dist/interaction.js.map +1 -0
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +15 -0
- package/dist/interactive-workbench-viewers-TOHBXJEE.js.map +1 -0
- package/dist/lib/host-platform.d.ts +5 -0
- package/dist/lib/relay-wire.d.ts +24 -1
- package/dist/lib/sandbox-liveness.d.ts +9 -0
- package/dist/lib/terminal-capability.d.ts +5 -0
- package/dist/lib/xterm-theme.d.ts +1 -1
- package/dist/machines.d.ts +30 -30
- package/dist/machines.js +2 -2
- package/dist/model-policy.d.ts +1 -1
- package/dist/model-policy.js +1 -1
- package/dist/provider.d.ts +6 -5
- package/dist/{queue-surface-implementation-U5JFG7HT.js → queue-surface-implementation-2KVJTYXH.js} +100 -48
- package/dist/queue-surface-implementation-2KVJTYXH.js.map +1 -0
- package/dist/realtime/dropdown-menu.d.ts +8 -8
- package/dist/realtime/realtime-control.d.ts +8 -8
- package/dist/realtime.d.ts +4 -4
- package/dist/realtime.js +38 -11
- package/dist/realtime.js.map +1 -1
- package/dist/session-context.d.ts +28 -2
- package/dist/session-ui.d.ts +14 -14
- package/dist/session-ui.js +5 -4
- package/dist/session.d.ts +28 -28
- package/dist/session.js +10 -10
- package/dist/timeline/activity-rail.d.ts +5 -3
- package/dist/timeline/disclosure-context.d.ts +1 -1
- package/dist/timeline/fleet-decision-projection.d.ts +1 -1
- package/dist/timeline/fleet-decision-row.d.ts +3 -3
- package/dist/timeline/index.d.ts +19 -19
- package/dist/timeline/parsers.d.ts +4 -1
- package/dist/timeline/projection.d.ts +3 -3
- package/dist/timeline/registry.d.ts +8 -2
- package/dist/timeline/screenshot-lightbox.d.ts +2 -2
- package/dist/timeline/shared.d.ts +21 -10
- package/dist/timeline/tool-diff.d.ts +2 -2
- package/dist/timeline/tool-renderers.d.ts +1 -1
- package/dist/timeline/turn-summary.d.ts +3 -3
- package/dist/timeline/types.d.ts +44 -3
- package/dist/timeline-annotation-selection-3L7LHGG2.js +187 -0
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +1 -0
- package/dist/timeline-annotations-dialog-U7EVLR75.js +196 -0
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +1 -0
- package/package.json +36 -7
- package/src/artifacts-document.ts +31 -0
- package/src/artifacts-presentation.ts +36 -0
- package/src/artifacts-spreadsheet.ts +21 -0
- package/src/artifacts.ts +89 -0
- package/src/client.ts +157 -1
- package/src/clipboard.ts +2 -0
- package/src/components/artifacts/artifact-surface.tsx +93 -0
- package/src/components/artifacts/document-editor.tsx +2255 -0
- package/src/components/artifacts/editable-artifact-ui.tsx +89 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +203 -0
- package/src/components/artifacts/editable-document.tsx +657 -0
- package/src/components/artifacts/editable-presentation.tsx +1020 -0
- package/src/components/artifacts/editable-spreadsheet.tsx +733 -0
- package/src/components/artifacts/index.ts +104 -0
- package/src/components/artifacts/presentation-editor.tsx +3148 -0
- package/src/components/artifacts/published-html-artifact-frame.tsx +38 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +799 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +2129 -0
- package/src/components/browser-input.ts +65 -0
- package/src/components/browser-viewer.tsx +2702 -0
- package/src/components/chat-composer.tsx +13 -0
- package/src/components/code-editor.tsx +89 -30
- package/src/components/composer-transcription-control.tsx +10 -6
- package/src/components/computer-viewer.tsx +1636 -0
- package/src/components/desktop-viewer.tsx +215 -74
- package/src/components/generated-video-player.tsx +89 -0
- package/src/components/interaction-intervention-banner.tsx +99 -0
- package/src/components/interactive-workbench-viewers.ts +2 -0
- package/src/components/machine-input-display.ts +3 -0
- package/src/components/machines/machine-detail.tsx +1 -1
- package/src/components/message-timeline.tsx +289 -32
- package/src/components/model-policy-picker.tsx +15 -0
- package/src/components/queue-surface-implementation.tsx +116 -60
- package/src/components/sandbox-files.tsx +2 -2
- package/src/components/sandbox-terminal.tsx +128 -46
- package/src/components/sandbox-workspace.tsx +256 -90
- package/src/components/session-chrome.tsx +53 -13
- package/src/components/timeline-annotation-selection.tsx +221 -0
- package/src/components/timeline-annotations-dialog.tsx +213 -0
- package/src/components/timeline-annotations.tsx +84 -0
- package/src/components/workbench-changes.tsx +188 -31
- package/src/components/workspace-dock.tsx +59 -5
- package/src/hooks/use-attached-browsers.ts +154 -0
- package/src/hooks/use-auth-runs.ts +278 -0
- package/src/hooks/use-browser-downloads.ts +218 -0
- package/src/hooks/use-browser-frame-stream.ts +425 -0
- package/src/hooks/use-browser-identities.ts +266 -0
- package/src/hooks/use-browser-session.ts +543 -0
- package/src/hooks/use-browser-sessions.ts +286 -0
- package/src/hooks/use-channels.ts +99 -0
- package/src/hooks/use-composer.ts +769 -24
- package/src/hooks/use-computer-frame-stream.ts +434 -0
- package/src/hooks/use-computer-session.ts +462 -0
- package/src/hooks/use-computer-sessions.ts +251 -0
- package/src/hooks/use-desktop-stream.ts +39 -7
- package/src/hooks/use-interaction-interventions.ts +242 -0
- package/src/hooks/use-interaction-invalidation.ts +66 -0
- package/src/hooks/use-machine-chip.ts +15 -3
- package/src/hooks/use-machines.ts +33 -3
- package/src/hooks/use-network-routes.ts +214 -0
- package/src/hooks/use-packs.ts +51 -0
- package/src/hooks/use-sandbox-files.ts +98 -55
- package/src/hooks/use-sandbox-git.ts +93 -38
- package/src/hooks/use-sandbox-terminal.ts +3 -2
- package/src/hooks/use-session-capabilities.ts +59 -46
- package/src/hooks/use-site-auth-connections.ts +226 -0
- package/src/hooks/use-supergrok-accounts.ts +81 -0
- package/src/hooks/use-terminal-stream.ts +359 -47
- package/src/hooks/use-video-artifact-playback.ts +28 -0
- package/src/hooks/use-workspace-edit.ts +2 -1
- package/src/index.ts +18 -0
- package/src/interaction.ts +101 -0
- package/src/lib/host-platform.ts +10 -0
- package/src/lib/relay-wire.ts +47 -4
- package/src/lib/sandbox-liveness.ts +11 -0
- package/src/lib/terminal-capability.ts +10 -0
- package/src/model-policy.ts +19 -4
- package/src/provider.tsx +133 -1
- package/src/realtime/realtime-control.tsx +34 -6
- package/src/session-context.ts +156 -1
- package/src/timeline/activity-rail.tsx +25 -3
- package/src/timeline/index.ts +3 -0
- package/src/timeline/parsers.ts +14 -1
- package/src/timeline/projection.ts +269 -14
- package/src/timeline/registry.ts +13 -1
- package/src/timeline/screenshot-lightbox.tsx +19 -9
- package/src/timeline/shared.tsx +56 -8
- package/src/timeline/tool-renderers.tsx +303 -50
- package/src/timeline/types.ts +57 -3
- package/styles/compiled.css +312 -21
- package/styles/index.css +15 -0
- package/styles/responsive.css +13 -1
- package/dist/chunk-23EJ676W.js.map +0 -1
- package/dist/chunk-EKZH6IDG.js.map +0 -1
- package/dist/chunk-FWXGSNXT.js.map +0 -1
- package/dist/chunk-LHLYWG5R.js.map +0 -1
- package/dist/chunk-O4VXOBGF.js.map +0 -1
- package/dist/chunk-OL6QVXGF.js.map +0 -1
- package/dist/chunk-WYA65Y3F.js.map +0 -1
- package/dist/chunk-XCNTXWBB.js.map +0 -1
- package/dist/fleet-decision-projection-SLNZMS42.js +0 -241
- package/dist/fleet-decision-projection-SLNZMS42.js.map +0 -1
- package/dist/queue-surface-implementation-U5JFG7HT.js.map +0 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
EditableArtifactSession,
|
|
3
|
+
EditableArtifactSyncView,
|
|
4
|
+
} from "@opengeni/sdk/editable-artifacts";
|
|
5
|
+
import { useEffect, useState } from "react";
|
|
6
|
+
|
|
7
|
+
export function useEditableArtifactView(
|
|
8
|
+
session: EditableArtifactSession,
|
|
9
|
+
): EditableArtifactSyncView {
|
|
10
|
+
const [view, setView] = useState(() => session.getView());
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
setView(session.getView());
|
|
13
|
+
return session.subscribe(setView);
|
|
14
|
+
}, [session]);
|
|
15
|
+
return view;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Changes whenever the Worker-resident speculative projection may have changed. */
|
|
19
|
+
export function editableArtifactProjectionKey(view: EditableArtifactSyncView): string {
|
|
20
|
+
return [
|
|
21
|
+
view.state,
|
|
22
|
+
view.cursor,
|
|
23
|
+
view.headSequence,
|
|
24
|
+
view.pendingTransactions,
|
|
25
|
+
view.blockedPending.map((entry) => `${entry.clientTransactionId}:${entry.code}`).join(","),
|
|
26
|
+
].join(":");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function editableArtifactStatusLabel(view: EditableArtifactSyncView): string {
|
|
30
|
+
switch (view.state) {
|
|
31
|
+
case "idle":
|
|
32
|
+
case "connecting":
|
|
33
|
+
return "Connecting…";
|
|
34
|
+
case "syncing":
|
|
35
|
+
case "resyncing":
|
|
36
|
+
return "Syncing…";
|
|
37
|
+
case "reconnecting":
|
|
38
|
+
return "Reconnecting…";
|
|
39
|
+
case "unsupported":
|
|
40
|
+
return "This artifact version is not supported";
|
|
41
|
+
case "failed":
|
|
42
|
+
if (editableArtifactAccessRevoked(view)) {
|
|
43
|
+
return "You no longer have access to this artifact";
|
|
44
|
+
}
|
|
45
|
+
return view.lastError?.message ?? "Could not open this artifact";
|
|
46
|
+
case "closed":
|
|
47
|
+
return "Artifact session closed";
|
|
48
|
+
case "live":
|
|
49
|
+
return view.writable ? "Live" : "Live · Read only";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Revoked read authority must hide any projection retained before invalidation. */
|
|
54
|
+
export function editableArtifactAccessRevoked(view: EditableArtifactSyncView): boolean {
|
|
55
|
+
if (view.state !== "failed" || !view.lastError) return false;
|
|
56
|
+
return (view.lastError as Error & Readonly<{ code?: unknown }>).code === "permission_changed";
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function EditableArtifactMessage({
|
|
60
|
+
title,
|
|
61
|
+
detail,
|
|
62
|
+
retry,
|
|
63
|
+
}: {
|
|
64
|
+
title: string;
|
|
65
|
+
detail: string;
|
|
66
|
+
retry?: (() => void) | undefined;
|
|
67
|
+
}) {
|
|
68
|
+
return (
|
|
69
|
+
<div className="grid h-full min-h-56 place-items-center bg-og-bg p-6 text-center">
|
|
70
|
+
<div>
|
|
71
|
+
<p className="text-og-base font-medium text-og-fg">{title}</p>
|
|
72
|
+
<p className="mt-1 max-w-lg text-og-sm text-og-fg-muted">{detail}</p>
|
|
73
|
+
{retry ? (
|
|
74
|
+
<button
|
|
75
|
+
type="button"
|
|
76
|
+
onClick={retry}
|
|
77
|
+
className="mt-3 rounded-og-sm bg-og-accent-deep px-3 py-1.5 text-og-sm font-medium text-og-accent-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent"
|
|
78
|
+
>
|
|
79
|
+
Retry
|
|
80
|
+
</button>
|
|
81
|
+
) : null}
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function asEditableArtifactError(cause: unknown, fallback: string): Error {
|
|
88
|
+
return cause instanceof Error ? cause : new Error(fallback);
|
|
89
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createBrowserEditableArtifactSession,
|
|
3
|
+
type CreateBrowserEditableArtifactSessionOptions,
|
|
4
|
+
type EditableArtifactBrowserRuntime,
|
|
5
|
+
type EditableArtifactSession,
|
|
6
|
+
} from "@opengeni/sdk/editable-artifacts";
|
|
7
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
8
|
+
|
|
9
|
+
import { EditableArtifactMessage } from "./editable-artifact-ui";
|
|
10
|
+
import {
|
|
11
|
+
EditableDocumentArtifactSurface,
|
|
12
|
+
type EditableDocumentArtifactSurfaceProps,
|
|
13
|
+
} from "./editable-document";
|
|
14
|
+
import {
|
|
15
|
+
EditablePresentationArtifactSurface,
|
|
16
|
+
type EditablePresentationArtifactSurfaceProps,
|
|
17
|
+
} from "./editable-presentation";
|
|
18
|
+
import {
|
|
19
|
+
EditableSpreadsheetArtifactSurface,
|
|
20
|
+
type EditableSpreadsheetArtifactSurfaceProps,
|
|
21
|
+
} from "./editable-spreadsheet";
|
|
22
|
+
|
|
23
|
+
export type EditableArtifactWorkbenchProps = Readonly<{
|
|
24
|
+
session: EditableArtifactSession;
|
|
25
|
+
document?: Omit<EditableDocumentArtifactSurfaceProps, "session">;
|
|
26
|
+
spreadsheet?: Omit<EditableSpreadsheetArtifactSurfaceProps, "session">;
|
|
27
|
+
presentation?: Omit<EditablePresentationArtifactSurfaceProps, "session">;
|
|
28
|
+
}>;
|
|
29
|
+
|
|
30
|
+
export type EditableArtifactWorkbenchHostProps = Omit<EditableArtifactWorkbenchProps, "session"> &
|
|
31
|
+
Readonly<{
|
|
32
|
+
/**
|
|
33
|
+
* Complete identity of the browser session authority. Change this when the
|
|
34
|
+
* artifact, deployment, principal, or authorization epoch changes.
|
|
35
|
+
*/
|
|
36
|
+
sessionKey: string;
|
|
37
|
+
/** Called for the active keyed lifecycle and again only after replacement or retry. */
|
|
38
|
+
createSession: () => EditableArtifactSession;
|
|
39
|
+
}>;
|
|
40
|
+
|
|
41
|
+
type DefaultBrowserArtifactTransport = Omit<
|
|
42
|
+
NonNullable<CreateBrowserEditableArtifactSessionOptions["transport"]>,
|
|
43
|
+
"apiKey" | "fetch" | "headers" | "webSocketFactory"
|
|
44
|
+
> &
|
|
45
|
+
Readonly<{
|
|
46
|
+
/** Static deployment auth headers; rotate authorizationEpoch when they change. */
|
|
47
|
+
headers?: Readonly<Record<string, string>>;
|
|
48
|
+
}>;
|
|
49
|
+
|
|
50
|
+
export type BrowserEditableArtifactWorkbenchOptions = Omit<
|
|
51
|
+
CreateBrowserEditableArtifactSessionOptions,
|
|
52
|
+
"runtime" | "storage" | "transport"
|
|
53
|
+
> &
|
|
54
|
+
Readonly<{
|
|
55
|
+
/** Default module Worker only; custom Worker hosts use EditableArtifactWorkbenchHost. */
|
|
56
|
+
runtime: Omit<EditableArtifactBrowserRuntime, "workerFactory">;
|
|
57
|
+
/** Default fetch/WebSocket only; static deployment auth headers are supported. */
|
|
58
|
+
transport?: DefaultBrowserArtifactTransport;
|
|
59
|
+
}>;
|
|
60
|
+
|
|
61
|
+
export type BrowserEditableArtifactWorkbenchProps = Omit<
|
|
62
|
+
EditableArtifactWorkbenchProps,
|
|
63
|
+
"session"
|
|
64
|
+
> &
|
|
65
|
+
Readonly<{ options: BrowserEditableArtifactWorkbenchOptions }>;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* One modality-neutral SDK workbench. Embedding hosts keep one route/component;
|
|
69
|
+
* each artifact still renders through its complete first-party editor surface.
|
|
70
|
+
*/
|
|
71
|
+
export function EditableArtifactWorkbench({
|
|
72
|
+
session,
|
|
73
|
+
document,
|
|
74
|
+
spreadsheet,
|
|
75
|
+
presentation,
|
|
76
|
+
}: EditableArtifactWorkbenchProps) {
|
|
77
|
+
switch (session.modality) {
|
|
78
|
+
case "document":
|
|
79
|
+
return (
|
|
80
|
+
<EditableDocumentArtifactSurface
|
|
81
|
+
{...document}
|
|
82
|
+
session={session}
|
|
83
|
+
title={document?.title ?? "Document"}
|
|
84
|
+
/>
|
|
85
|
+
);
|
|
86
|
+
case "spreadsheet":
|
|
87
|
+
return <EditableSpreadsheetArtifactSurface {...spreadsheet} session={session} />;
|
|
88
|
+
case "presentation":
|
|
89
|
+
return <EditablePresentationArtifactSurface {...presentation} session={session} />;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Route/embed composition that owns exactly one SDK session. The host supplies
|
|
95
|
+
* the authenticated SDK factory; React guarantees replacement and teardown.
|
|
96
|
+
*/
|
|
97
|
+
export function EditableArtifactWorkbenchHost({
|
|
98
|
+
sessionKey,
|
|
99
|
+
createSession,
|
|
100
|
+
document,
|
|
101
|
+
spreadsheet,
|
|
102
|
+
presentation,
|
|
103
|
+
}: EditableArtifactWorkbenchHostProps) {
|
|
104
|
+
const createSessionRef = useRef(createSession);
|
|
105
|
+
const [retryEpoch, setRetryEpoch] = useState(0);
|
|
106
|
+
const [state, setState] = useState<
|
|
107
|
+
| Readonly<{ key: string; session: EditableArtifactSession; error: null }>
|
|
108
|
+
| Readonly<{ key: string | null; session: null; error: Error | null }>
|
|
109
|
+
>({ key: null, session: null, error: null });
|
|
110
|
+
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
createSessionRef.current = createSession;
|
|
113
|
+
}, [createSession]);
|
|
114
|
+
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
let owned: EditableArtifactSession | null = null;
|
|
117
|
+
setState({ key: sessionKey, session: null, error: null });
|
|
118
|
+
try {
|
|
119
|
+
owned = createSessionRef.current();
|
|
120
|
+
setState({ key: sessionKey, session: owned, error: null });
|
|
121
|
+
} catch (cause) {
|
|
122
|
+
setState({
|
|
123
|
+
key: sessionKey,
|
|
124
|
+
session: null,
|
|
125
|
+
error: cause instanceof Error ? cause : new Error("Could not create artifact session"),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return () => {
|
|
129
|
+
const closing = owned;
|
|
130
|
+
owned = null;
|
|
131
|
+
if (closing) void closing.close().catch(() => undefined);
|
|
132
|
+
};
|
|
133
|
+
}, [retryEpoch, sessionKey]);
|
|
134
|
+
|
|
135
|
+
const retry = useCallback(() => setRetryEpoch((value) => value + 1), []);
|
|
136
|
+
const currentError = state.key === sessionKey ? state.error : null;
|
|
137
|
+
if (state.key === sessionKey && state.session) {
|
|
138
|
+
return (
|
|
139
|
+
<EditableArtifactWorkbench
|
|
140
|
+
session={state.session}
|
|
141
|
+
{...(document ? { document } : {})}
|
|
142
|
+
{...(spreadsheet ? { spreadsheet } : {})}
|
|
143
|
+
{...(presentation ? { presentation } : {})}
|
|
144
|
+
/>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
return (
|
|
148
|
+
<EditableArtifactMessage
|
|
149
|
+
title={currentError ? "Could not open this artifact" : "Opening artifact"}
|
|
150
|
+
detail={currentError?.message ?? "Starting the secure editing session…"}
|
|
151
|
+
retry={currentError ? retry : undefined}
|
|
152
|
+
/>
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Complete default-browser composition for embedders: verified WASM Worker,
|
|
158
|
+
* durable IndexedDB state, authenticated live sync, teardown, and the matching
|
|
159
|
+
* first-party editor. Advanced/custom transports compose the lower-level host.
|
|
160
|
+
*/
|
|
161
|
+
export function BrowserEditableArtifactWorkbench({
|
|
162
|
+
options,
|
|
163
|
+
document,
|
|
164
|
+
spreadsheet,
|
|
165
|
+
presentation,
|
|
166
|
+
}: BrowserEditableArtifactWorkbenchProps) {
|
|
167
|
+
const sessionKey = browserSessionKey(options);
|
|
168
|
+
const createSession = useCallback(() => createBrowserEditableArtifactSession(options), [options]);
|
|
169
|
+
return (
|
|
170
|
+
<EditableArtifactWorkbenchHost
|
|
171
|
+
sessionKey={sessionKey}
|
|
172
|
+
createSession={createSession}
|
|
173
|
+
{...(document ? { document } : {})}
|
|
174
|
+
{...(spreadsheet ? { spreadsheet } : {})}
|
|
175
|
+
{...(presentation ? { presentation } : {})}
|
|
176
|
+
/>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function browserSessionKey(options: BrowserEditableArtifactWorkbenchOptions): string {
|
|
181
|
+
const transport = options.transport
|
|
182
|
+
? {
|
|
183
|
+
...options.transport,
|
|
184
|
+
// Credentials must not be copied into React lifecycle keys. The
|
|
185
|
+
// authorization epoch is the explicit credential/grant rotation fence.
|
|
186
|
+
headers: options.transport.headers
|
|
187
|
+
? Object.keys(options.transport.headers).sort()
|
|
188
|
+
: undefined,
|
|
189
|
+
}
|
|
190
|
+
: null;
|
|
191
|
+
return JSON.stringify(
|
|
192
|
+
{
|
|
193
|
+
baseUrl: options.baseUrl,
|
|
194
|
+
workspaceId: options.workspaceId,
|
|
195
|
+
artifact: { id: options.artifact.id, modality: options.artifact.modality },
|
|
196
|
+
storageAuthority: options.storageAuthority,
|
|
197
|
+
runtime: options.runtime,
|
|
198
|
+
replicaId: options.replicaId ?? null,
|
|
199
|
+
transport,
|
|
200
|
+
},
|
|
201
|
+
(_key, value: unknown) => (value instanceof URL ? value.href : value),
|
|
202
|
+
);
|
|
203
|
+
}
|