@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.
Files changed (325) hide show
  1. package/README.md +138 -2
  2. package/dist/artifacts-document.d.ts +3 -0
  3. package/dist/artifacts-document.js +17 -0
  4. package/dist/artifacts-document.js.map +1 -0
  5. package/dist/artifacts-presentation.d.ts +3 -0
  6. package/dist/artifacts-presentation.js +17 -0
  7. package/dist/artifacts-presentation.js.map +1 -0
  8. package/dist/artifacts-spreadsheet.d.ts +3 -0
  9. package/dist/artifacts-spreadsheet.js +17 -0
  10. package/dist/artifacts-spreadsheet.js.map +1 -0
  11. package/dist/artifacts.d.ts +2 -0
  12. package/dist/artifacts.js +199 -0
  13. package/dist/artifacts.js.map +1 -0
  14. package/dist/{chunk-NJ7M2B6Z.js → chunk-5UQPNLIO.js} +16 -8
  15. package/dist/{chunk-NJ7M2B6Z.js.map → chunk-5UQPNLIO.js.map} +1 -1
  16. package/dist/{chunk-LHLYWG5R.js → chunk-6KLX2RH5.js} +461 -38
  17. package/dist/chunk-6KLX2RH5.js.map +1 -0
  18. package/dist/chunk-7WCLAEFV.js +2828 -0
  19. package/dist/chunk-7WCLAEFV.js.map +1 -0
  20. package/dist/{chunk-I4MPFDRP.js → chunk-B6WPZSTT.js} +104 -104
  21. package/dist/{chunk-I4MPFDRP.js.map → chunk-B6WPZSTT.js.map} +1 -1
  22. package/dist/{chunk-EKZH6IDG.js → chunk-C5ZPSSS5.js} +111 -1
  23. package/dist/chunk-C5ZPSSS5.js.map +1 -0
  24. package/dist/{chunk-OL6QVXGF.js → chunk-HA46CYQK.js} +152 -8
  25. package/dist/chunk-HA46CYQK.js.map +1 -0
  26. package/dist/chunk-HUIKIDM5.js +2148 -0
  27. package/dist/chunk-HUIKIDM5.js.map +1 -0
  28. package/dist/{chunk-FWXGSNXT.js → chunk-IGC6A2ZI.js} +585 -34
  29. package/dist/chunk-IGC6A2ZI.js.map +1 -0
  30. package/dist/chunk-JVYQRRC4.js +53 -0
  31. package/dist/chunk-JVYQRRC4.js.map +1 -0
  32. package/dist/chunk-KCGXPP5V.js +157 -0
  33. package/dist/chunk-KCGXPP5V.js.map +1 -0
  34. package/dist/chunk-LLOLUHVG.js +5937 -0
  35. package/dist/chunk-LLOLUHVG.js.map +1 -0
  36. package/dist/{chunk-WYA65Y3F.js → chunk-MKPIAGVL.js} +13 -3
  37. package/dist/chunk-MKPIAGVL.js.map +1 -0
  38. package/dist/chunk-PEI6RANI.js +3234 -0
  39. package/dist/chunk-PEI6RANI.js.map +1 -0
  40. package/dist/chunk-R3AZOAB5.js +933 -0
  41. package/dist/chunk-R3AZOAB5.js.map +1 -0
  42. package/dist/{chunk-O4VXOBGF.js → chunk-WSK7G5LE.js} +70 -2
  43. package/dist/chunk-WSK7G5LE.js.map +1 -0
  44. package/dist/{chunk-23EJ676W.js → chunk-XBZWOM2K.js} +9 -4
  45. package/dist/chunk-XBZWOM2K.js.map +1 -0
  46. package/dist/{chunk-XCNTXWBB.js → chunk-Y7OEDUJ5.js} +856 -338
  47. package/dist/chunk-Y7OEDUJ5.js.map +1 -0
  48. package/dist/client.d.ts +10 -2
  49. package/dist/clipboard.d.ts +1 -0
  50. package/dist/clipboard.js +7 -0
  51. package/dist/clipboard.js.map +1 -0
  52. package/dist/commands/index.d.ts +3 -3
  53. package/dist/commands/registry.d.ts +1 -1
  54. package/dist/commands/types.d.ts +1 -1
  55. package/dist/components/approval-surface.d.ts +2 -2
  56. package/dist/components/artifacts/artifact-surface.d.ts +18 -0
  57. package/dist/components/artifacts/document-editor.d.ts +172 -0
  58. package/dist/components/artifacts/editable-artifact-ui.d.ts +13 -0
  59. package/dist/components/artifacts/editable-artifact-workbench.d.ts +49 -0
  60. package/dist/components/artifacts/editable-document.d.ts +24 -0
  61. package/dist/components/artifacts/editable-presentation.d.ts +24 -0
  62. package/dist/components/artifacts/editable-spreadsheet.d.ts +32 -0
  63. package/dist/components/artifacts/index.d.ts +9 -0
  64. package/dist/components/artifacts/presentation-editor.d.ts +297 -0
  65. package/dist/components/artifacts/published-html-artifact-frame.d.ts +14 -0
  66. package/dist/components/artifacts/spreadsheet-canvas.d.ts +120 -0
  67. package/dist/components/artifacts/spreadsheet-grid.d.ts +113 -0
  68. package/dist/components/browser-input.d.ts +7 -0
  69. package/dist/components/browser-viewer.d.ts +30 -0
  70. package/dist/components/chat-composer.d.ts +8 -8
  71. package/dist/components/code-editor.d.ts +25 -3
  72. package/dist/components/command-palette.d.ts +2 -2
  73. package/dist/components/composer-transcription-control.d.ts +2 -2
  74. package/dist/components/composer.d.ts +17 -17
  75. package/dist/components/computer-viewer.d.ts +24 -0
  76. package/dist/components/copy-button.d.ts +2 -2
  77. package/dist/components/desktop-viewer.d.ts +50 -22
  78. package/dist/components/diff-view.d.ts +1 -1
  79. package/dist/components/enrollment-consent.d.ts +1 -1
  80. package/dist/components/enrollment-device-flow.d.ts +1 -1
  81. package/dist/components/file-browser.d.ts +2 -2
  82. package/dist/components/fleet-tile.d.ts +1 -1
  83. package/dist/components/generated-video-player.d.ts +10 -0
  84. package/dist/components/human-input-form.d.ts +1 -1
  85. package/dist/components/human-input-surface.d.ts +2 -2
  86. package/dist/components/interaction-intervention-banner.d.ts +11 -0
  87. package/dist/components/interactive-workbench-viewers.d.ts +2 -0
  88. package/dist/components/machine-card.d.ts +2 -2
  89. package/dist/components/machine-dock-bar.d.ts +3 -3
  90. package/dist/components/machine-health-pill.d.ts +2 -2
  91. package/dist/components/machine-input-display.d.ts +1 -1
  92. package/dist/components/machine-metrics.d.ts +2 -2
  93. package/dist/components/machine-status-pill.d.ts +4 -4
  94. package/dist/components/machines/health.d.ts +1 -1
  95. package/dist/components/machines/machine-detail.d.ts +3 -3
  96. package/dist/components/machines/metric-history-chart.d.ts +1 -1
  97. package/dist/components/machines/metric-sparkline.d.ts +2 -2
  98. package/dist/components/machines/series.d.ts +2 -2
  99. package/dist/components/machines-dashboard.d.ts +2 -2
  100. package/dist/components/markdown.d.ts +1 -1
  101. package/dist/components/message-timeline.d.ts +12 -5
  102. package/dist/components/model-picker.d.ts +2 -2
  103. package/dist/components/model-policy-picker.d.ts +7 -7
  104. package/dist/components/pierre-diff.d.ts +1 -1
  105. package/dist/components/pierre-file.d.ts +1 -1
  106. package/dist/components/queue-draft-policy.d.ts +1 -1
  107. package/dist/components/queue-surface-implementation.d.ts +3 -3
  108. package/dist/components/queue-surface-state.d.ts +4 -4
  109. package/dist/components/queue-surface.d.ts +5 -5
  110. package/dist/components/sandbox-files.d.ts +3 -3
  111. package/dist/components/sandbox-terminal.d.ts +24 -4
  112. package/dist/components/sandbox-workspace.d.ts +28 -9
  113. package/dist/components/session-chrome.d.ts +4 -4
  114. package/dist/components/session-status.d.ts +2 -2
  115. package/dist/components/timeline-annotation-selection.d.ts +9 -0
  116. package/dist/components/timeline-annotations-dialog.d.ts +16 -0
  117. package/dist/components/timeline-annotations.d.ts +13 -0
  118. package/dist/components/tooltip.d.ts +4 -4
  119. package/dist/components/user-message-body.d.ts +2 -2
  120. package/dist/components/workbench-changes.d.ts +2 -2
  121. package/dist/components/workspace-dock.d.ts +1 -1
  122. package/dist/composer.d.ts +11 -11
  123. package/dist/composer.js +7 -7
  124. package/dist/hooks/internal.d.ts +1 -1
  125. package/dist/hooks/use-attached-browsers.d.ts +21 -0
  126. package/dist/hooks/use-auth-runs.d.ts +32 -0
  127. package/dist/hooks/use-available-models.d.ts +2 -2
  128. package/dist/hooks/use-billing-usage.d.ts +1 -1
  129. package/dist/hooks/use-browser-downloads.d.ts +25 -0
  130. package/dist/hooks/use-browser-frame-stream.d.ts +28 -0
  131. package/dist/hooks/use-browser-identities.d.ts +30 -0
  132. package/dist/hooks/use-browser-session.d.ts +29 -0
  133. package/dist/hooks/use-browser-sessions.d.ts +32 -0
  134. package/dist/hooks/use-channels.d.ts +26 -0
  135. package/dist/hooks/use-codex-accounts.d.ts +2 -2
  136. package/dist/hooks/use-composer.d.ts +36 -9
  137. package/dist/hooks/use-computer-frame-stream.d.ts +24 -0
  138. package/dist/hooks/use-computer-session.d.ts +29 -0
  139. package/dist/hooks/use-computer-sessions.d.ts +28 -0
  140. package/dist/hooks/use-desktop-stream.d.ts +5 -1
  141. package/dist/hooks/use-environments.d.ts +1 -1
  142. package/dist/hooks/use-file-attachments.d.ts +1 -1
  143. package/dist/hooks/use-goal.d.ts +2 -2
  144. package/dist/hooks/use-human-input.d.ts +2 -2
  145. package/dist/hooks/use-interaction-interventions.d.ts +27 -0
  146. package/dist/hooks/use-interaction-invalidation.d.ts +19 -0
  147. package/dist/hooks/use-last-started-turn-policy.d.ts +2 -2
  148. package/dist/hooks/use-machine-chip.d.ts +2 -2
  149. package/dist/hooks/use-machines.d.ts +4 -4
  150. package/dist/hooks/use-network-routes.d.ts +25 -0
  151. package/dist/hooks/use-packs.d.ts +7 -2
  152. package/dist/hooks/use-rigs.d.ts +1 -1
  153. package/dist/hooks/use-sandbox-files.d.ts +6 -4
  154. package/dist/hooks/use-sandbox-git.d.ts +6 -5
  155. package/dist/hooks/use-sandbox-terminal.d.ts +1 -1
  156. package/dist/hooks/use-scheduled-tasks.d.ts +1 -1
  157. package/dist/hooks/use-session-capabilities.d.ts +5 -4
  158. package/dist/hooks/use-session-control.d.ts +1 -1
  159. package/dist/hooks/use-session-events.d.ts +2 -2
  160. package/dist/hooks/use-session-lineage.d.ts +1 -1
  161. package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
  162. package/dist/hooks/use-session.d.ts +2 -2
  163. package/dist/hooks/use-site-auth-connections.d.ts +25 -0
  164. package/dist/hooks/use-slash-commands.d.ts +1 -1
  165. package/dist/hooks/use-supergrok-accounts.d.ts +26 -0
  166. package/dist/hooks/use-terminal-stream.d.ts +11 -2
  167. package/dist/hooks/use-turn-queue.d.ts +2 -2
  168. package/dist/hooks/use-video-artifact-playback.d.ts +9 -0
  169. package/dist/hooks/use-voice-input.d.ts +1 -1
  170. package/dist/hooks/use-workspace-capture.d.ts +1 -1
  171. package/dist/hooks/use-workspace-edit.d.ts +1 -1
  172. package/dist/hooks/use-workspace-sessions.d.ts +1 -1
  173. package/dist/hooks/use-workspaces.d.ts +1 -1
  174. package/dist/index.d.ts +162 -155
  175. package/dist/index.js +1822 -1703
  176. package/dist/index.js.map +1 -1
  177. package/dist/interaction.d.ts +33 -0
  178. package/dist/interaction.js +550 -0
  179. package/dist/interaction.js.map +1 -0
  180. package/dist/interactive-workbench-viewers-TOHBXJEE.js +15 -0
  181. package/dist/interactive-workbench-viewers-TOHBXJEE.js.map +1 -0
  182. package/dist/lib/host-platform.d.ts +5 -0
  183. package/dist/lib/relay-wire.d.ts +24 -1
  184. package/dist/lib/sandbox-liveness.d.ts +9 -0
  185. package/dist/lib/terminal-capability.d.ts +5 -0
  186. package/dist/lib/xterm-theme.d.ts +1 -1
  187. package/dist/machines.d.ts +30 -30
  188. package/dist/machines.js +2 -2
  189. package/dist/model-policy.d.ts +1 -1
  190. package/dist/model-policy.js +1 -1
  191. package/dist/provider.d.ts +6 -5
  192. package/dist/{queue-surface-implementation-U5JFG7HT.js → queue-surface-implementation-2KVJTYXH.js} +100 -48
  193. package/dist/queue-surface-implementation-2KVJTYXH.js.map +1 -0
  194. package/dist/realtime/dropdown-menu.d.ts +8 -8
  195. package/dist/realtime/realtime-control.d.ts +8 -8
  196. package/dist/realtime.d.ts +4 -4
  197. package/dist/realtime.js +38 -11
  198. package/dist/realtime.js.map +1 -1
  199. package/dist/session-context.d.ts +28 -2
  200. package/dist/session-ui.d.ts +14 -14
  201. package/dist/session-ui.js +5 -4
  202. package/dist/session.d.ts +28 -28
  203. package/dist/session.js +10 -10
  204. package/dist/timeline/activity-rail.d.ts +5 -3
  205. package/dist/timeline/disclosure-context.d.ts +1 -1
  206. package/dist/timeline/fleet-decision-projection.d.ts +1 -1
  207. package/dist/timeline/fleet-decision-row.d.ts +3 -3
  208. package/dist/timeline/index.d.ts +19 -19
  209. package/dist/timeline/parsers.d.ts +4 -1
  210. package/dist/timeline/projection.d.ts +3 -3
  211. package/dist/timeline/registry.d.ts +8 -2
  212. package/dist/timeline/screenshot-lightbox.d.ts +2 -2
  213. package/dist/timeline/shared.d.ts +21 -10
  214. package/dist/timeline/tool-diff.d.ts +2 -2
  215. package/dist/timeline/tool-renderers.d.ts +1 -1
  216. package/dist/timeline/turn-summary.d.ts +3 -3
  217. package/dist/timeline/types.d.ts +44 -3
  218. package/dist/timeline-annotation-selection-3L7LHGG2.js +187 -0
  219. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +1 -0
  220. package/dist/timeline-annotations-dialog-U7EVLR75.js +196 -0
  221. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +1 -0
  222. package/package.json +36 -7
  223. package/src/artifacts-document.ts +31 -0
  224. package/src/artifacts-presentation.ts +36 -0
  225. package/src/artifacts-spreadsheet.ts +21 -0
  226. package/src/artifacts.ts +89 -0
  227. package/src/client.ts +157 -1
  228. package/src/clipboard.ts +2 -0
  229. package/src/components/artifacts/artifact-surface.tsx +93 -0
  230. package/src/components/artifacts/document-editor.tsx +2255 -0
  231. package/src/components/artifacts/editable-artifact-ui.tsx +89 -0
  232. package/src/components/artifacts/editable-artifact-workbench.tsx +203 -0
  233. package/src/components/artifacts/editable-document.tsx +657 -0
  234. package/src/components/artifacts/editable-presentation.tsx +1020 -0
  235. package/src/components/artifacts/editable-spreadsheet.tsx +733 -0
  236. package/src/components/artifacts/index.ts +104 -0
  237. package/src/components/artifacts/presentation-editor.tsx +3148 -0
  238. package/src/components/artifacts/published-html-artifact-frame.tsx +38 -0
  239. package/src/components/artifacts/spreadsheet-canvas.ts +799 -0
  240. package/src/components/artifacts/spreadsheet-grid.tsx +2129 -0
  241. package/src/components/browser-input.ts +65 -0
  242. package/src/components/browser-viewer.tsx +2702 -0
  243. package/src/components/chat-composer.tsx +13 -0
  244. package/src/components/code-editor.tsx +89 -30
  245. package/src/components/composer-transcription-control.tsx +10 -6
  246. package/src/components/computer-viewer.tsx +1636 -0
  247. package/src/components/desktop-viewer.tsx +215 -74
  248. package/src/components/generated-video-player.tsx +89 -0
  249. package/src/components/interaction-intervention-banner.tsx +99 -0
  250. package/src/components/interactive-workbench-viewers.ts +2 -0
  251. package/src/components/machine-input-display.ts +3 -0
  252. package/src/components/machines/machine-detail.tsx +1 -1
  253. package/src/components/message-timeline.tsx +289 -32
  254. package/src/components/model-policy-picker.tsx +15 -0
  255. package/src/components/queue-surface-implementation.tsx +116 -60
  256. package/src/components/sandbox-files.tsx +2 -2
  257. package/src/components/sandbox-terminal.tsx +128 -46
  258. package/src/components/sandbox-workspace.tsx +256 -90
  259. package/src/components/session-chrome.tsx +53 -13
  260. package/src/components/timeline-annotation-selection.tsx +221 -0
  261. package/src/components/timeline-annotations-dialog.tsx +213 -0
  262. package/src/components/timeline-annotations.tsx +84 -0
  263. package/src/components/workbench-changes.tsx +188 -31
  264. package/src/components/workspace-dock.tsx +59 -5
  265. package/src/hooks/use-attached-browsers.ts +154 -0
  266. package/src/hooks/use-auth-runs.ts +278 -0
  267. package/src/hooks/use-browser-downloads.ts +218 -0
  268. package/src/hooks/use-browser-frame-stream.ts +425 -0
  269. package/src/hooks/use-browser-identities.ts +266 -0
  270. package/src/hooks/use-browser-session.ts +543 -0
  271. package/src/hooks/use-browser-sessions.ts +286 -0
  272. package/src/hooks/use-channels.ts +99 -0
  273. package/src/hooks/use-composer.ts +769 -24
  274. package/src/hooks/use-computer-frame-stream.ts +434 -0
  275. package/src/hooks/use-computer-session.ts +462 -0
  276. package/src/hooks/use-computer-sessions.ts +251 -0
  277. package/src/hooks/use-desktop-stream.ts +39 -7
  278. package/src/hooks/use-interaction-interventions.ts +242 -0
  279. package/src/hooks/use-interaction-invalidation.ts +66 -0
  280. package/src/hooks/use-machine-chip.ts +15 -3
  281. package/src/hooks/use-machines.ts +33 -3
  282. package/src/hooks/use-network-routes.ts +214 -0
  283. package/src/hooks/use-packs.ts +51 -0
  284. package/src/hooks/use-sandbox-files.ts +98 -55
  285. package/src/hooks/use-sandbox-git.ts +93 -38
  286. package/src/hooks/use-sandbox-terminal.ts +3 -2
  287. package/src/hooks/use-session-capabilities.ts +59 -46
  288. package/src/hooks/use-site-auth-connections.ts +226 -0
  289. package/src/hooks/use-supergrok-accounts.ts +81 -0
  290. package/src/hooks/use-terminal-stream.ts +359 -47
  291. package/src/hooks/use-video-artifact-playback.ts +28 -0
  292. package/src/hooks/use-workspace-edit.ts +2 -1
  293. package/src/index.ts +18 -0
  294. package/src/interaction.ts +101 -0
  295. package/src/lib/host-platform.ts +10 -0
  296. package/src/lib/relay-wire.ts +47 -4
  297. package/src/lib/sandbox-liveness.ts +11 -0
  298. package/src/lib/terminal-capability.ts +10 -0
  299. package/src/model-policy.ts +19 -4
  300. package/src/provider.tsx +133 -1
  301. package/src/realtime/realtime-control.tsx +34 -6
  302. package/src/session-context.ts +156 -1
  303. package/src/timeline/activity-rail.tsx +25 -3
  304. package/src/timeline/index.ts +3 -0
  305. package/src/timeline/parsers.ts +14 -1
  306. package/src/timeline/projection.ts +269 -14
  307. package/src/timeline/registry.ts +13 -1
  308. package/src/timeline/screenshot-lightbox.tsx +19 -9
  309. package/src/timeline/shared.tsx +56 -8
  310. package/src/timeline/tool-renderers.tsx +303 -50
  311. package/src/timeline/types.ts +57 -3
  312. package/styles/compiled.css +312 -21
  313. package/styles/index.css +15 -0
  314. package/styles/responsive.css +13 -1
  315. package/dist/chunk-23EJ676W.js.map +0 -1
  316. package/dist/chunk-EKZH6IDG.js.map +0 -1
  317. package/dist/chunk-FWXGSNXT.js.map +0 -1
  318. package/dist/chunk-LHLYWG5R.js.map +0 -1
  319. package/dist/chunk-O4VXOBGF.js.map +0 -1
  320. package/dist/chunk-OL6QVXGF.js.map +0 -1
  321. package/dist/chunk-WYA65Y3F.js.map +0 -1
  322. package/dist/chunk-XCNTXWBB.js.map +0 -1
  323. package/dist/fleet-decision-projection-SLNZMS42.js +0 -241
  324. package/dist/fleet-decision-projection-SLNZMS42.js.map +0 -1
  325. 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
+ }