@opengeni/react 4.2.1-canary.39419937372003 → 4.2.1-canary.39435074352001

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 (67) hide show
  1. package/dist/artifacts-document.js +2 -2
  2. package/dist/artifacts-presentation.js +2 -2
  3. package/dist/artifacts-spreadsheet.js +2 -2
  4. package/dist/artifacts.js +40 -40
  5. package/dist/{browser-viewer-HOIVSRJF.js → browser-viewer-WKN4NJBM.js} +4 -4
  6. package/dist/{chat-interactive-block-Z6B6M4OF.js → chat-interactive-block-T4UTX5LA.js} +5 -5
  7. package/dist/{chunk-QUKW3CVS.js → chunk-2RMAZ2HU.js} +4 -4
  8. package/dist/{chunk-SFLO7XMY.js → chunk-3PGBCUVF.js} +65 -65
  9. package/dist/{chunk-SFLO7XMY.js.map → chunk-3PGBCUVF.js.map} +1 -1
  10. package/dist/{chunk-T7KVNEIO.js → chunk-475IS53W.js} +13 -13
  11. package/dist/{chunk-OLBMMOHM.js → chunk-52KMXC7E.js} +2 -2
  12. package/dist/{chunk-2HJVWRHY.js → chunk-6SU56JNB.js} +2 -2
  13. package/dist/{chunk-MJV3GBL5.js → chunk-6USBH4H7.js} +2 -2
  14. package/dist/{chunk-DPGWYCGR.js → chunk-7DVFZCTG.js} +605 -605
  15. package/dist/chunk-7DVFZCTG.js.map +1 -0
  16. package/dist/{chunk-D47K47FK.js → chunk-7KOQHWQL.js} +10 -10
  17. package/dist/{chunk-ISLYSPT6.js → chunk-7MDPYTDM.js} +10 -10
  18. package/dist/{chunk-56HWOPRK.js → chunk-GMUXYNMG.js} +2 -2
  19. package/dist/{chunk-NCLQIXS6.js → chunk-I4GRGY3N.js} +12 -12
  20. package/dist/{chunk-UOC2MPF6.js → chunk-IRKKKYMV.js} +13 -13
  21. package/dist/{chunk-LPHGR2E2.js → chunk-OTFNGTAL.js} +11 -11
  22. package/dist/{chunk-PVBQGFFZ.js → chunk-TGCUL7TL.js} +2 -2
  23. package/dist/{chunk-6RP5IBEI.js → chunk-UPGJEZGE.js} +2 -2
  24. package/dist/{chunk-5HWE3NAB.js → chunk-W5MZOUKU.js} +12 -12
  25. package/dist/{chunk-S7BY4YXE.js → chunk-WGAAF3BA.js} +7 -7
  26. package/dist/{chunk-TFDPAB2J.js → chunk-YK7ODKEY.js} +105 -105
  27. package/dist/composer.js +9 -9
  28. package/dist/{computer-viewer-JZE4F4UP.js → computer-viewer-UDVVW3HJ.js} +5 -5
  29. package/dist/connect.js +6 -6
  30. package/dist/{embedded-new-voice-NI54S5ML.js → embedded-new-voice-JUUHK4IB.js} +5 -5
  31. package/dist/{embedded-voice-PTDD6SPN.js → embedded-voice-3T2BLAW5.js} +5 -5
  32. package/dist/index.js +167 -167
  33. package/dist/interaction.js +10 -10
  34. package/dist/machines.js +2 -2
  35. package/dist/{model-policy-picker-menu-W4YGESSM.js → model-policy-picker-menu-A3W7SNDY.js} +5 -5
  36. package/dist/native-previews.js +3 -3
  37. package/dist/realtime.js +4 -4
  38. package/dist/{sandbox-files-DEQDRUEV.js → sandbox-files-DN2YPOIC.js} +8 -8
  39. package/dist/session-list-model.js +3 -3
  40. package/dist/session-ui.js +42 -42
  41. package/dist/session.js +13 -13
  42. package/dist/timeline-model.js +11 -11
  43. package/package.json +3 -3
  44. package/dist/chunk-DPGWYCGR.js.map +0 -1
  45. /package/dist/{browser-viewer-HOIVSRJF.js.map → browser-viewer-WKN4NJBM.js.map} +0 -0
  46. /package/dist/{chat-interactive-block-Z6B6M4OF.js.map → chat-interactive-block-T4UTX5LA.js.map} +0 -0
  47. /package/dist/{chunk-QUKW3CVS.js.map → chunk-2RMAZ2HU.js.map} +0 -0
  48. /package/dist/{chunk-T7KVNEIO.js.map → chunk-475IS53W.js.map} +0 -0
  49. /package/dist/{chunk-OLBMMOHM.js.map → chunk-52KMXC7E.js.map} +0 -0
  50. /package/dist/{chunk-2HJVWRHY.js.map → chunk-6SU56JNB.js.map} +0 -0
  51. /package/dist/{chunk-MJV3GBL5.js.map → chunk-6USBH4H7.js.map} +0 -0
  52. /package/dist/{chunk-D47K47FK.js.map → chunk-7KOQHWQL.js.map} +0 -0
  53. /package/dist/{chunk-ISLYSPT6.js.map → chunk-7MDPYTDM.js.map} +0 -0
  54. /package/dist/{chunk-56HWOPRK.js.map → chunk-GMUXYNMG.js.map} +0 -0
  55. /package/dist/{chunk-NCLQIXS6.js.map → chunk-I4GRGY3N.js.map} +0 -0
  56. /package/dist/{chunk-UOC2MPF6.js.map → chunk-IRKKKYMV.js.map} +0 -0
  57. /package/dist/{chunk-LPHGR2E2.js.map → chunk-OTFNGTAL.js.map} +0 -0
  58. /package/dist/{chunk-PVBQGFFZ.js.map → chunk-TGCUL7TL.js.map} +0 -0
  59. /package/dist/{chunk-6RP5IBEI.js.map → chunk-UPGJEZGE.js.map} +0 -0
  60. /package/dist/{chunk-5HWE3NAB.js.map → chunk-W5MZOUKU.js.map} +0 -0
  61. /package/dist/{chunk-S7BY4YXE.js.map → chunk-WGAAF3BA.js.map} +0 -0
  62. /package/dist/{chunk-TFDPAB2J.js.map → chunk-YK7ODKEY.js.map} +0 -0
  63. /package/dist/{computer-viewer-JZE4F4UP.js.map → computer-viewer-UDVVW3HJ.js.map} +0 -0
  64. /package/dist/{embedded-new-voice-NI54S5ML.js.map → embedded-new-voice-JUUHK4IB.js.map} +0 -0
  65. /package/dist/{embedded-voice-PTDD6SPN.js.map → embedded-voice-3T2BLAW5.js.map} +0 -0
  66. /package/dist/{model-policy-picker-menu-W4YGESSM.js.map → model-policy-picker-menu-A3W7SNDY.js.map} +0 -0
  67. /package/dist/{sandbox-files-DEQDRUEV.js.map → sandbox-files-DN2YPOIC.js.map} +0 -0
@@ -5,9 +5,9 @@ import {
5
5
  DocumentProjectionArtifactSurface,
6
6
  DocumentProjectionEditor,
7
7
  EditableDocumentArtifactSurface
8
- } from "./chunk-PVBQGFFZ.js";
8
+ } from "./chunk-TGCUL7TL.js";
9
9
  import "./chunk-2DDJ6YH6.js";
10
- import "./chunk-SFLO7XMY.js";
10
+ import "./chunk-3PGBCUVF.js";
11
11
  import "./chunk-VS7OYWSF.js";
12
12
  import "./chunk-TXS65BB2.js";
13
13
  import "./chunk-OD27LDFO.js";
@@ -5,9 +5,9 @@ import {
5
5
  PresentationEditor,
6
6
  PresentationProjectionArtifactSurface,
7
7
  PresentationProjectionEditor
8
- } from "./chunk-MJV3GBL5.js";
8
+ } from "./chunk-6USBH4H7.js";
9
9
  import "./chunk-2DDJ6YH6.js";
10
- import "./chunk-SFLO7XMY.js";
10
+ import "./chunk-3PGBCUVF.js";
11
11
  import "./chunk-VS7OYWSF.js";
12
12
  import "./chunk-TXS65BB2.js";
13
13
  import "./chunk-OD27LDFO.js";
@@ -5,8 +5,8 @@ import {
5
5
  SpreadsheetArtifactSurface,
6
6
  SpreadsheetGrid,
7
7
  SpreadsheetProjectionGrid
8
- } from "./chunk-2HJVWRHY.js";
9
- import "./chunk-SFLO7XMY.js";
8
+ } from "./chunk-6SU56JNB.js";
9
+ import "./chunk-3PGBCUVF.js";
10
10
  import "./chunk-VS7OYWSF.js";
11
11
  import "./chunk-TXS65BB2.js";
12
12
  import "./chunk-OD27LDFO.js";
package/dist/artifacts.js CHANGED
@@ -3,41 +3,62 @@ import {
3
3
  ArtifactSandbox,
4
4
  ChatInteractiveBlock,
5
5
  DeferredChatMedia
6
- } from "./chunk-D47K47FK.js";
6
+ } from "./chunk-7KOQHWQL.js";
7
7
  import {
8
- EditableSpreadsheetArtifactSurface,
9
- EditableSpreadsheetGrid,
10
- SpreadsheetArtifactSurface,
11
- SpreadsheetGrid,
12
- SpreadsheetProjectionGrid
13
- } from "./chunk-2HJVWRHY.js";
8
+ EditablePresentationArtifactSurface,
9
+ PresentationArtifactSurface,
10
+ PresentationEditor,
11
+ PresentationProjectionArtifactSurface,
12
+ PresentationProjectionEditor
13
+ } from "./chunk-6USBH4H7.js";
14
14
  import {
15
15
  DocumentArtifactSurface,
16
16
  DocumentEditor,
17
17
  DocumentProjectionArtifactSurface,
18
18
  DocumentProjectionEditor,
19
19
  EditableDocumentArtifactSurface
20
- } from "./chunk-PVBQGFFZ.js";
21
- import {
22
- EditablePresentationArtifactSurface,
23
- PresentationArtifactSurface,
24
- PresentationEditor,
25
- PresentationProjectionArtifactSurface,
26
- PresentationProjectionEditor
27
- } from "./chunk-MJV3GBL5.js";
20
+ } from "./chunk-TGCUL7TL.js";
28
21
  import "./chunk-2DDJ6YH6.js";
29
22
  import {
30
- ArtifactSurface,
31
- EditableArtifactMessage
32
- } from "./chunk-SFLO7XMY.js";
23
+ inlineHtmlDocument
24
+ } from "./chunk-IGFZFLI2.js";
25
+ import {
26
+ PUBLISHED_HTML_ARTIFACT_IFRAME_SANDBOX,
27
+ PublishedHtmlArtifactFrame,
28
+ openGeniSiteBridgePortFromBootstrap,
29
+ publishedHtmlArtifactDocument
30
+ } from "./chunk-HXXF453K.js";
31
+ import {
32
+ loadSiteSnapshot
33
+ } from "./chunk-IOYHDEP3.js";
33
34
  import {
34
35
  PatchApplyCommand,
35
36
  useRetainedImageObjectUrl
36
37
  } from "./chunk-VJ7HKEDK.js";
38
+ import "./chunk-VHB3E6PT.js";
37
39
  import {
38
40
  joinClientConfigRead
39
41
  } from "./chunk-IGVL3ELX.js";
40
- import "./chunk-VHB3E6PT.js";
42
+ import "./chunk-PEHTX3V7.js";
43
+ import {
44
+ useOpenGeni
45
+ } from "./chunk-ZGFU4LVW.js";
46
+ import {
47
+ isPatchFilename,
48
+ isRetainedImageContentType
49
+ } from "./chunk-TC3B4LEJ.js";
50
+ import "./chunk-4PGSVKPR.js";
51
+ import {
52
+ EditableSpreadsheetArtifactSurface,
53
+ EditableSpreadsheetGrid,
54
+ SpreadsheetArtifactSurface,
55
+ SpreadsheetGrid,
56
+ SpreadsheetProjectionGrid
57
+ } from "./chunk-6SU56JNB.js";
58
+ import {
59
+ ArtifactSurface,
60
+ EditableArtifactMessage
61
+ } from "./chunk-3PGBCUVF.js";
41
62
  import {
42
63
  ArtifactBadge,
43
64
  ArtifactButton,
@@ -53,27 +74,6 @@ import {
53
74
  artifactLoadErrorView,
54
75
  useArtifactLabels
55
76
  } from "./chunk-VS7OYWSF.js";
56
- import {
57
- PUBLISHED_HTML_ARTIFACT_IFRAME_SANDBOX,
58
- PublishedHtmlArtifactFrame,
59
- openGeniSiteBridgePortFromBootstrap,
60
- publishedHtmlArtifactDocument
61
- } from "./chunk-HXXF453K.js";
62
- import {
63
- isPatchFilename,
64
- isRetainedImageContentType
65
- } from "./chunk-TC3B4LEJ.js";
66
- import "./chunk-4PGSVKPR.js";
67
- import {
68
- inlineHtmlDocument
69
- } from "./chunk-IGFZFLI2.js";
70
- import {
71
- loadSiteSnapshot
72
- } from "./chunk-IOYHDEP3.js";
73
- import "./chunk-PEHTX3V7.js";
74
- import {
75
- useOpenGeni
76
- } from "./chunk-ZGFU4LVW.js";
77
77
  import {
78
78
  cn
79
79
  } from "./chunk-TXS65BB2.js";
@@ -2,19 +2,19 @@
2
2
  import {
3
3
  BrowserViewer,
4
4
  staleBrowserEndRetryDelayMs
5
- } from "./chunk-T7KVNEIO.js";
5
+ } from "./chunk-475IS53W.js";
6
6
  import "./chunk-NL4NQTZQ.js";
7
- import "./chunk-PEHTX3V7.js";
8
7
  import "./chunk-ZUWF4NF7.js";
8
+ import "./chunk-TNEZNMSN.js";
9
+ import "./chunk-PEHTX3V7.js";
9
10
  import "./chunk-NAWXARTY.js";
10
11
  import "./chunk-CM7LVUKC.js";
11
12
  import "./chunk-ZGFU4LVW.js";
12
13
  import "./chunk-XUNI5SSO.js";
13
- import "./chunk-TNEZNMSN.js";
14
14
  import "./chunk-TXS65BB2.js";
15
15
  import "./chunk-OD27LDFO.js";
16
16
  export {
17
17
  BrowserViewer,
18
18
  staleBrowserEndRetryDelayMs
19
19
  };
20
- //# sourceMappingURL=browser-viewer-HOIVSRJF.js.map
20
+ //# sourceMappingURL=browser-viewer-WKN4NJBM.js.map
@@ -1,15 +1,15 @@
1
1
  "use client";
2
2
  import {
3
3
  ChatInteractiveBlock
4
- } from "./chunk-D47K47FK.js";
5
- import "./chunk-VHB3E6PT.js";
6
- import "./chunk-VS7OYWSF.js";
7
- import "./chunk-HXXF453K.js";
4
+ } from "./chunk-7KOQHWQL.js";
8
5
  import "./chunk-IGFZFLI2.js";
6
+ import "./chunk-HXXF453K.js";
9
7
  import "./chunk-IOYHDEP3.js";
8
+ import "./chunk-VHB3E6PT.js";
9
+ import "./chunk-VS7OYWSF.js";
10
10
  import "./chunk-TXS65BB2.js";
11
11
  import "./chunk-OD27LDFO.js";
12
12
  export {
13
13
  ChatInteractiveBlock
14
14
  };
15
- //# sourceMappingURL=chat-interactive-block-Z6B6M4OF.js.map
15
+ //# sourceMappingURL=chat-interactive-block-T4UTX5LA.js.map
@@ -1,13 +1,13 @@
1
1
  "use client";
2
+ import {
3
+ ToolDetailsProvider
4
+ } from "./chunk-RZLBICR5.js";
2
5
  import {
3
6
  useRetainedReads
4
7
  } from "./chunk-WEY5J52U.js";
5
8
  import {
6
9
  joinClientConfigRead
7
10
  } from "./chunk-IGVL3ELX.js";
8
- import {
9
- ToolDetailsProvider
10
- } from "./chunk-RZLBICR5.js";
11
11
  import {
12
12
  usePageLiveActivity
13
13
  } from "./chunk-NAWXARTY.js";
@@ -376,4 +376,4 @@ function reloadForContractMismatchOnce(mismatch) {
376
376
  export {
377
377
  OpenGeniProvider
378
378
  };
379
- //# sourceMappingURL=chunk-QUKW3CVS.js.map
379
+ //# sourceMappingURL=chunk-2RMAZ2HU.js.map
@@ -87,65 +87,11 @@ function ArtifactSurface({
87
87
  );
88
88
  }
89
89
 
90
- // src/components/artifacts/artifact-submissions.tsx
91
- import { createContext, useContext, useState } from "react";
92
- import { jsx as jsx2 } from "react/jsx-runtime";
93
- function createSubmissionQueue() {
94
- let pending = 0;
95
- const listeners = /* @__PURE__ */ new Set();
96
- const emit = () => {
97
- for (const listener of listeners) listener();
98
- };
99
- return {
100
- getPending: () => pending,
101
- subscribe: (listener) => {
102
- listeners.add(listener);
103
- return () => {
104
- listeners.delete(listener);
105
- };
106
- },
107
- async run(invoke) {
108
- pending++;
109
- emit();
110
- try {
111
- return await invoke();
112
- } finally {
113
- pending--;
114
- emit();
115
- }
116
- }
117
- };
118
- }
119
- var standaloneQueue = {
120
- getPending: () => 0,
121
- subscribe: (_listener) => () => {
122
- },
123
- run: (invoke) => invoke()
124
- };
125
- var SubmissionContext = createContext(null);
126
- function ArtifactSubmissionProvider({ children }) {
127
- const [queue] = useState(createSubmissionQueue);
128
- return /* @__PURE__ */ jsx2(SubmissionContext.Provider, { value: queue, children });
129
- }
130
- function useArtifactSubmissions() {
131
- return useContext(SubmissionContext) ?? standaloneQueue;
132
- }
133
- var SESSION_KEYS = /* @__PURE__ */ new WeakMap();
134
- var nextSessionKey = 0;
135
- function artifactSubmissionSessionKey(session) {
136
- let key = SESSION_KEYS.get(session);
137
- if (key === void 0) {
138
- key = ++nextSessionKey;
139
- SESSION_KEYS.set(session, key);
140
- }
141
- return key;
142
- }
143
-
144
90
  // src/components/artifacts/editable-artifact-ui.tsx
145
- import { useEffect, useState as useState2 } from "react";
146
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
91
+ import { useEffect, useState } from "react";
92
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
147
93
  function useEditableArtifactView(session) {
148
- const [view, setView] = useState2(() => session.getView());
94
+ const [view, setView] = useState(() => session.getView());
149
95
  useEffect(() => {
150
96
  setView(session.getView());
151
97
  return session.subscribe(setView);
@@ -196,10 +142,10 @@ function EditableArtifactMessage({
196
142
  }) {
197
143
  const t = useOpenGeniText();
198
144
  const retryLabel = retryLabelProp === void 0 ? t("artifacts.editableArtifactUi.retry") : retryLabelProp;
199
- return /* @__PURE__ */ jsx3("div", { className: "grid h-full min-h-56 place-items-center bg-og-bg p-6 text-center", children: /* @__PURE__ */ jsxs2("div", { children: [
200
- /* @__PURE__ */ jsx3("p", { className: "text-og-base font-medium text-og-fg", children: title }),
201
- /* @__PURE__ */ jsx3("p", { className: "mt-1 max-w-lg text-og-sm text-og-fg-muted", children: detail }),
202
- retry ? /* @__PURE__ */ jsx3(
145
+ return /* @__PURE__ */ jsx2("div", { className: "grid h-full min-h-56 place-items-center bg-og-bg p-6 text-center", children: /* @__PURE__ */ jsxs2("div", { children: [
146
+ /* @__PURE__ */ jsx2("p", { className: "text-og-base font-medium text-og-fg", children: title }),
147
+ /* @__PURE__ */ jsx2("p", { className: "mt-1 max-w-lg text-og-sm text-og-fg-muted", children: detail }),
148
+ retry ? /* @__PURE__ */ jsx2(
203
149
  "button",
204
150
  {
205
151
  type: "button",
@@ -214,6 +160,60 @@ function asEditableArtifactError(cause, fallback) {
214
160
  return cause instanceof Error ? cause : new Error(fallback);
215
161
  }
216
162
 
163
+ // src/components/artifacts/artifact-submissions.tsx
164
+ import { createContext, useContext, useState as useState2 } from "react";
165
+ import { jsx as jsx3 } from "react/jsx-runtime";
166
+ function createSubmissionQueue() {
167
+ let pending = 0;
168
+ const listeners = /* @__PURE__ */ new Set();
169
+ const emit = () => {
170
+ for (const listener of listeners) listener();
171
+ };
172
+ return {
173
+ getPending: () => pending,
174
+ subscribe: (listener) => {
175
+ listeners.add(listener);
176
+ return () => {
177
+ listeners.delete(listener);
178
+ };
179
+ },
180
+ async run(invoke) {
181
+ pending++;
182
+ emit();
183
+ try {
184
+ return await invoke();
185
+ } finally {
186
+ pending--;
187
+ emit();
188
+ }
189
+ }
190
+ };
191
+ }
192
+ var standaloneQueue = {
193
+ getPending: () => 0,
194
+ subscribe: (_listener) => () => {
195
+ },
196
+ run: (invoke) => invoke()
197
+ };
198
+ var SubmissionContext = createContext(null);
199
+ function ArtifactSubmissionProvider({ children }) {
200
+ const [queue] = useState2(createSubmissionQueue);
201
+ return /* @__PURE__ */ jsx3(SubmissionContext.Provider, { value: queue, children });
202
+ }
203
+ function useArtifactSubmissions() {
204
+ return useContext(SubmissionContext) ?? standaloneQueue;
205
+ }
206
+ var SESSION_KEYS = /* @__PURE__ */ new WeakMap();
207
+ var nextSessionKey = 0;
208
+ function artifactSubmissionSessionKey(session) {
209
+ let key = SESSION_KEYS.get(session);
210
+ if (key === void 0) {
211
+ key = ++nextSessionKey;
212
+ SESSION_KEYS.set(session, key);
213
+ }
214
+ return key;
215
+ }
216
+
217
217
  // src/components/artifacts/artifact-download.tsx
218
218
  import { DownloadIcon, LoaderCircleIcon as LoaderCircleIcon2 } from "lucide-react";
219
219
  import { useEffect as useEffect2, useRef, useState as useState3, useSyncExternalStore } from "react";
@@ -325,15 +325,15 @@ function downloadFileName(title, format, fallback) {
325
325
 
326
326
  export {
327
327
  ArtifactSurface,
328
- ArtifactSubmissionProvider,
329
- useArtifactSubmissions,
330
- artifactSubmissionSessionKey,
331
328
  useEditableArtifactView,
332
329
  editableArtifactProjectionKey,
333
330
  editableArtifactStatusLabel,
334
331
  editableArtifactAccessRevoked,
335
332
  EditableArtifactMessage,
336
333
  asEditableArtifactError,
334
+ ArtifactSubmissionProvider,
335
+ useArtifactSubmissions,
336
+ artifactSubmissionSessionKey,
337
337
  EditableArtifactDownloadButton
338
338
  };
339
- //# sourceMappingURL=chunk-SFLO7XMY.js.map
339
+ //# sourceMappingURL=chunk-3PGBCUVF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/artifacts/artifact-surface.tsx","../src/components/artifacts/artifact-submissions.tsx","../src/components/artifacts/editable-artifact-ui.tsx","../src/components/artifacts/artifact-download.tsx"],"sourcesContent":["import {\n FileSpreadsheetIcon,\n FileTextIcon,\n LoaderCircleIcon,\n PresentationIcon,\n} from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\n\nexport type ArtifactModality = \"spreadsheet\" | \"document\" | \"presentation\";\n\nexport type ArtifactSurfaceProps = {\n modality: ArtifactModality;\n title: string;\n /** An embedding host may already provide the artifact title and navigation. */\n showHeader?: boolean | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n children: ReactNode;\n footer?: ReactNode | undefined;\n busy?: boolean | undefined;\n className?: string | undefined;\n};\n\nconst MODALITY_LABEL = (t: OpenGeniText): Record<ArtifactModality, string> => ({\n spreadsheet: t(\"artifacts.artifactSurface.spreadsheet\"),\n document: t(\"artifacts.artifactSurface.document\"),\n presentation: t(\"artifacts.artifactSurface.presentation\"),\n});\n\nfunction ModalityIcon({ modality }: { modality: ArtifactModality }) {\n switch (modality) {\n case \"spreadsheet\":\n return <FileSpreadsheetIcon className=\"size-4\" />;\n case \"document\":\n return <FileTextIcon className=\"size-4\" />;\n case \"presentation\":\n return <PresentationIcon className=\"size-4\" />;\n }\n}\n\n/**\n * Modality-neutral artifact chrome. It deliberately owns no file, session, or\n * persistence state: hosts can use the same surface for a local draft, a\n * durable Opengeni artifact, or a collaborative projection.\n */\nexport function ArtifactSurface({\n modality,\n title,\n showHeader = true,\n subtitle,\n actions,\n children,\n footer,\n busy = false,\n className,\n}: ArtifactSurfaceProps) {\n const t = useOpenGeniText();\n return (\n <section\n aria-label={`${MODALITY_LABEL(t)[modality]}: ${title}`}\n aria-busy={busy || undefined}\n data-og-artifact-modality={modality}\n className={cn(\n \"og-root flex h-full min-h-0 min-w-0 flex-col overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1 text-og-fg shadow-og-md\",\n className,\n )}\n >\n {showHeader ? (\n <header className=\"flex min-h-11 shrink-0 items-center gap-2 border-b border-og-border bg-og-surface-2 px-3\">\n <span\n aria-hidden\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm bg-og-surface-3 text-og-fg-muted\"\n >\n <ModalityIcon modality={modality} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-og-base font-medium text-og-fg\">{title}</h2>\n {subtitle ? (\n <div className=\"truncate text-og-xs text-og-fg-muted\">{subtitle}</div>\n ) : null}\n </div>\n {busy ? (\n <LoaderCircleIcon\n aria-label={t(\"artifacts.artifactSurface.updatingArtifact\")}\n className=\"size-4 shrink-0 animate-spin text-og-fg-muted\"\n />\n ) : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n </header>\n ) : (\n <>\n {typeof subtitle === \"string\" || typeof subtitle === \"number\" ? (\n <span role=\"status\" className=\"sr-only\">\n {subtitle}\n </span>\n ) : null}\n {actions ? (\n <div className=\"flex shrink-0 items-center justify-end gap-1 border-b border-og-border px-3 py-1\">\n {actions}\n </div>\n ) : null}\n </>\n )}\n\n <div className=\"min-h-0 min-w-0 flex-1\">{children}</div>\n\n {footer ? (\n <footer className=\"shrink-0 border-t border-og-border bg-og-surface-2\">{footer}</footer>\n ) : null}\n </section>\n );\n}\n","import type { EditableArtifactSession } from \"@opengeni/sdk/editable-artifacts\";\nimport { createContext, useContext, useState, type ReactNode } from \"react\";\n\nfunction createSubmissionQueue() {\n let pending = 0;\n const listeners = new Set<() => void>();\n const emit = () => {\n for (const listener of listeners) listener();\n };\n return {\n getPending: () => pending,\n subscribe: (listener: () => void) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n async run<T>(invoke: () => Promise<T>): Promise<T> {\n // The SDK's causal queue and Worker authoring precede pendingTransactions.\n // Latch synchronously so a same-event blur/click cannot export an older head.\n pending++;\n emit();\n try {\n return await invoke();\n } finally {\n pending--;\n emit();\n }\n },\n };\n}\n\nexport type ArtifactSubmissions = Readonly<{\n getPending: () => number;\n subscribe: (listener: () => void) => () => void;\n run: <T>(invoke: () => Promise<T>) => Promise<T>;\n}>;\n\nconst standaloneQueue: ArtifactSubmissions = {\n getPending: () => 0,\n subscribe: (_listener: () => void) => () => {},\n run: <T,>(invoke: () => Promise<T>) => invoke(),\n};\nconst SubmissionContext = createContext<ArtifactSubmissions | null>(null);\n\nexport function ArtifactSubmissionProvider({ children }: { children: ReactNode }) {\n const [queue] = useState(createSubmissionQueue);\n return <SubmissionContext.Provider value={queue}>{children}</SubmissionContext.Provider>;\n}\n\n/** UI authoring submissions not yet visible as SDK pending transactions. */\nexport function useArtifactSubmissions(): ArtifactSubmissions {\n return useContext(SubmissionContext) ?? standaloneQueue;\n}\n\nconst SESSION_KEYS = new WeakMap<EditableArtifactSession, number>();\nlet nextSessionKey = 0;\n\n/** Stable per-session React key so a replaced session never inherits queued state. */\nexport function artifactSubmissionSessionKey(session: EditableArtifactSession): number {\n let key = SESSION_KEYS.get(session);\n if (key === undefined) {\n key = ++nextSessionKey;\n SESSION_KEYS.set(session, key);\n }\n return key;\n}\n","import type {\n EditableArtifactSession,\n EditableArtifactSyncView,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { useEffect, useState } from \"react\";\nimport { type OpenGeniText } from \"../../messages/runtime\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\n\nexport function useEditableArtifactView(\n session: EditableArtifactSession,\n): EditableArtifactSyncView {\n const [view, setView] = useState(() => session.getView());\n useEffect(() => {\n setView(session.getView());\n return session.subscribe(setView);\n }, [session]);\n return view;\n}\n\n/** Changes whenever the Worker-resident speculative projection may have changed. */\nexport function editableArtifactProjectionKey(view: EditableArtifactSyncView): string {\n return [\n view.state,\n view.cursor,\n view.headSequence,\n view.pendingTransactions,\n view.blockedPending.map((entry) => `${entry.clientTransactionId}:${entry.code}`).join(\",\"),\n ].join(\":\");\n}\n\nexport function editableArtifactStatusLabel(\n t: OpenGeniText,\n view: EditableArtifactSyncView,\n): string {\n switch (view.state) {\n case \"idle\":\n case \"connecting\":\n return t(\"artifacts.editableArtifactUi.connecting\");\n case \"syncing\":\n case \"resyncing\":\n return t(\"artifacts.editableArtifactUi.syncing\");\n case \"reconnecting\":\n return t(\"artifacts.editableArtifactUi.reconnecting\");\n case \"unsupported\":\n return t(\"artifacts.editableArtifactUi.thisArtifactVersionIsNot\");\n case \"failed\":\n if (editableArtifactAccessRevoked(view)) {\n return t(\"artifacts.editableArtifactUi.youNoLongerHaveAccess\");\n }\n return view.lastError?.message ?? t(\"artifacts.editableArtifactUi.couldNotOpenThisArtifact\");\n case \"closed\":\n return t(\"artifacts.editableArtifactUi.artifactSessionClosed\");\n case \"live\":\n return view.writable\n ? t(\"artifacts.editableArtifactUi.live\")\n : t(\"artifacts.editableArtifactUi.liveReadOnly\");\n }\n}\n\n/** Revoked read authority must hide any projection retained before invalidation. */\nexport function editableArtifactAccessRevoked(view: EditableArtifactSyncView): boolean {\n if (view.state !== \"failed\" || !view.lastError) return false;\n return (view.lastError as Error & Readonly<{ code?: unknown }>).code === \"permission_changed\";\n}\n\nexport function EditableArtifactMessage({\n title,\n detail,\n retry,\n retryLabel: retryLabelProp,\n}: {\n title: string;\n detail: string;\n retry?: (() => void) | undefined;\n retryLabel?: string | undefined;\n}) {\n const t = useOpenGeniText();\n const retryLabel =\n retryLabelProp === undefined ? t(\"artifacts.editableArtifactUi.retry\") : retryLabelProp;\n return (\n <div className=\"grid h-full min-h-56 place-items-center bg-og-bg p-6 text-center\">\n <div>\n <p className=\"text-og-base font-medium text-og-fg\">{title}</p>\n <p className=\"mt-1 max-w-lg text-og-sm text-og-fg-muted\">{detail}</p>\n {retry ? (\n <button\n type=\"button\"\n onClick={retry}\n className=\"mt-3 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-3 py-1.5 text-og-sm font-medium hover:bg-og-primary-hover outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n {retryLabel}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport function asEditableArtifactError(cause: unknown, fallback: string): Error {\n return cause instanceof Error ? cause : new Error(fallback);\n}\n","import type { EditableArtifactSession } from \"@opengeni/sdk/editable-artifacts\";\nimport { DownloadIcon, LoaderCircleIcon } from \"lucide-react\";\nimport { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\n\nimport { ArtifactButton } from \"./artifact-chrome\";\nimport { useArtifactSubmissions } from \"./artifact-submissions\";\nimport { useEditableArtifactView } from \"./editable-artifact-ui\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\n\n/** Host-authenticated export of the saved native head as an Office file. */\nexport type EditableArtifactDownload = (signal: AbortSignal) => Promise<Blob>;\nexport type EditableArtifactDownloadFormat = \"xlsx\" | \"docx\" | \"pptx\";\n\nconst LABELS = {\n xlsx: {\n download: \"artifacts.spreadsheetDownload.download\",\n preparing: \"artifacts.spreadsheetDownload.preparing\",\n failed: \"artifacts.spreadsheetDownload.downloadFailedTryAgain\",\n title: \"artifacts.spreadsheetDownload.downloadWorkbookAsXlsx\",\n wait: \"artifacts.spreadsheetDownload.waitForWorkbookChangesTo\",\n fallbackName: \"artifacts.spreadsheetDownload.workbook\",\n },\n docx: {\n download: \"artifacts.artifactDownload.download\",\n preparing: \"artifacts.artifactDownload.preparing\",\n failed: \"artifacts.artifactDownload.downloadFailedTryAgain\",\n title: \"artifacts.artifactDownload.downloadDocumentAsDocx\",\n wait: \"artifacts.artifactDownload.waitForDocumentChangesTo\",\n fallbackName: \"artifacts.artifactDownload.document\",\n },\n pptx: {\n download: \"artifacts.artifactDownload.download\",\n preparing: \"artifacts.artifactDownload.preparing\",\n failed: \"artifacts.artifactDownload.downloadFailedTryAgain\",\n title: \"artifacts.artifactDownload.downloadPresentationAsPptx\",\n wait: \"artifacts.artifactDownload.waitForPresentationChangesTo\",\n fallbackName: \"artifacts.artifactDownload.presentation\",\n },\n} as const;\n\n/**\n * Download action shared by every editable modality. It waits for live sync\n * with no pending or still-submitting edits, so the export is the latest head.\n */\nexport function EditableArtifactDownloadButton({\n session,\n title,\n download,\n format,\n}: {\n session: EditableArtifactSession;\n title: string;\n download: EditableArtifactDownload;\n format: EditableArtifactDownloadFormat;\n}) {\n const t = useOpenGeniText();\n const labels = LABELS[format];\n const view = useEditableArtifactView(session);\n const submissions = useArtifactSubmissions();\n const submitting = useSyncExternalStore(\n submissions.subscribe,\n submissions.getPending,\n submissions.getPending,\n );\n const active = useRef<AbortController | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const ready =\n view.state === \"live\" &&\n submitting === 0 &&\n view.pendingTransactions === 0 &&\n view.blockedPending.length === 0 &&\n !view.authoringBlockedReason;\n useEffect(() => () => active.current?.abort(), [session]);\n useEffect(() => {\n if (view.state === \"failed\" || view.state === \"closed\") {\n active.current?.abort();\n active.current = null;\n setBusy(false);\n }\n }, [view.state]);\n\n const start = async () => {\n if (active.current || !ready || submissions.getPending()) return;\n // Re-read the live view: a just-committed edit may precede React's next render.\n const current = session.getView();\n if (\n current.state !== \"live\" ||\n current.pendingTransactions ||\n current.blockedPending.length ||\n current.authoringBlockedReason\n )\n return;\n const controller = new AbortController();\n active.current = controller;\n setBusy(true);\n setError(false);\n try {\n const blob = await download(controller.signal);\n if (controller.signal.aborted) return;\n const url = URL.createObjectURL(blob);\n try {\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = downloadFileName(title, format, t(labels.fallbackName));\n anchor.rel = \"noopener\";\n anchor.click();\n } finally {\n setTimeout(() => URL.revokeObjectURL(url), 0);\n }\n } catch {\n if (!controller.signal.aborted) setError(true);\n } finally {\n if (!controller.signal.aborted) {\n active.current = null;\n setBusy(false);\n }\n }\n };\n\n return (\n <>\n {error ? (\n <span role=\"alert\" className=\"text-og-xs text-og-fg-muted\">\n {t(labels.failed)}\n </span>\n ) : null}\n <ArtifactButton\n onClick={() => void start()}\n disabled={busy || !ready}\n title={ready ? t(labels.title) : t(labels.wait)}\n >\n {busy ? (\n <LoaderCircleIcon className=\"animate-spin\" aria-hidden />\n ) : (\n <DownloadIcon aria-hidden />\n )}\n {busy ? t(labels.preparing) : t(labels.download)}\n </ArtifactButton>\n </>\n );\n}\n\n/** Safe local file name: the artifact title with exactly one matching extension. */\nexport function downloadFileName(\n title: string,\n format: EditableArtifactDownloadFormat,\n fallback: string,\n): string {\n const base =\n title\n .replace(/[\\\\/:*?\"<>|\\u0000-\\u001f]/g, \"_\")\n .replace(new RegExp(`\\\\.${format}$`, \"i\"), \"\")\n .trim() || fallback;\n return `${base}.${format}`;\n}\n"],"mappings":"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","names":["jsx","useState","jsx","jsxs","useState","LoaderCircleIcon","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","LoaderCircleIcon"]}
1
+ {"version":3,"sources":["../src/components/artifacts/artifact-surface.tsx","../src/components/artifacts/editable-artifact-ui.tsx","../src/components/artifacts/artifact-submissions.tsx","../src/components/artifacts/artifact-download.tsx"],"sourcesContent":["import {\n FileSpreadsheetIcon,\n FileTextIcon,\n LoaderCircleIcon,\n PresentationIcon,\n} from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\n\nexport type ArtifactModality = \"spreadsheet\" | \"document\" | \"presentation\";\n\nexport type ArtifactSurfaceProps = {\n modality: ArtifactModality;\n title: string;\n /** An embedding host may already provide the artifact title and navigation. */\n showHeader?: boolean | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n children: ReactNode;\n footer?: ReactNode | undefined;\n busy?: boolean | undefined;\n className?: string | undefined;\n};\n\nconst MODALITY_LABEL = (t: OpenGeniText): Record<ArtifactModality, string> => ({\n spreadsheet: t(\"artifacts.artifactSurface.spreadsheet\"),\n document: t(\"artifacts.artifactSurface.document\"),\n presentation: t(\"artifacts.artifactSurface.presentation\"),\n});\n\nfunction ModalityIcon({ modality }: { modality: ArtifactModality }) {\n switch (modality) {\n case \"spreadsheet\":\n return <FileSpreadsheetIcon className=\"size-4\" />;\n case \"document\":\n return <FileTextIcon className=\"size-4\" />;\n case \"presentation\":\n return <PresentationIcon className=\"size-4\" />;\n }\n}\n\n/**\n * Modality-neutral artifact chrome. It deliberately owns no file, session, or\n * persistence state: hosts can use the same surface for a local draft, a\n * durable Opengeni artifact, or a collaborative projection.\n */\nexport function ArtifactSurface({\n modality,\n title,\n showHeader = true,\n subtitle,\n actions,\n children,\n footer,\n busy = false,\n className,\n}: ArtifactSurfaceProps) {\n const t = useOpenGeniText();\n return (\n <section\n aria-label={`${MODALITY_LABEL(t)[modality]}: ${title}`}\n aria-busy={busy || undefined}\n data-og-artifact-modality={modality}\n className={cn(\n \"og-root flex h-full min-h-0 min-w-0 flex-col overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1 text-og-fg shadow-og-md\",\n className,\n )}\n >\n {showHeader ? (\n <header className=\"flex min-h-11 shrink-0 items-center gap-2 border-b border-og-border bg-og-surface-2 px-3\">\n <span\n aria-hidden\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm bg-og-surface-3 text-og-fg-muted\"\n >\n <ModalityIcon modality={modality} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-og-base font-medium text-og-fg\">{title}</h2>\n {subtitle ? (\n <div className=\"truncate text-og-xs text-og-fg-muted\">{subtitle}</div>\n ) : null}\n </div>\n {busy ? (\n <LoaderCircleIcon\n aria-label={t(\"artifacts.artifactSurface.updatingArtifact\")}\n className=\"size-4 shrink-0 animate-spin text-og-fg-muted\"\n />\n ) : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n </header>\n ) : (\n <>\n {typeof subtitle === \"string\" || typeof subtitle === \"number\" ? (\n <span role=\"status\" className=\"sr-only\">\n {subtitle}\n </span>\n ) : null}\n {actions ? (\n <div className=\"flex shrink-0 items-center justify-end gap-1 border-b border-og-border px-3 py-1\">\n {actions}\n </div>\n ) : null}\n </>\n )}\n\n <div className=\"min-h-0 min-w-0 flex-1\">{children}</div>\n\n {footer ? (\n <footer className=\"shrink-0 border-t border-og-border bg-og-surface-2\">{footer}</footer>\n ) : null}\n </section>\n );\n}\n","import type {\n EditableArtifactSession,\n EditableArtifactSyncView,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { useEffect, useState } from \"react\";\nimport { type OpenGeniText } from \"../../messages/runtime\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\n\nexport function useEditableArtifactView(\n session: EditableArtifactSession,\n): EditableArtifactSyncView {\n const [view, setView] = useState(() => session.getView());\n useEffect(() => {\n setView(session.getView());\n return session.subscribe(setView);\n }, [session]);\n return view;\n}\n\n/** Changes whenever the Worker-resident speculative projection may have changed. */\nexport function editableArtifactProjectionKey(view: EditableArtifactSyncView): string {\n return [\n view.state,\n view.cursor,\n view.headSequence,\n view.pendingTransactions,\n view.blockedPending.map((entry) => `${entry.clientTransactionId}:${entry.code}`).join(\",\"),\n ].join(\":\");\n}\n\nexport function editableArtifactStatusLabel(\n t: OpenGeniText,\n view: EditableArtifactSyncView,\n): string {\n switch (view.state) {\n case \"idle\":\n case \"connecting\":\n return t(\"artifacts.editableArtifactUi.connecting\");\n case \"syncing\":\n case \"resyncing\":\n return t(\"artifacts.editableArtifactUi.syncing\");\n case \"reconnecting\":\n return t(\"artifacts.editableArtifactUi.reconnecting\");\n case \"unsupported\":\n return t(\"artifacts.editableArtifactUi.thisArtifactVersionIsNot\");\n case \"failed\":\n if (editableArtifactAccessRevoked(view)) {\n return t(\"artifacts.editableArtifactUi.youNoLongerHaveAccess\");\n }\n return view.lastError?.message ?? t(\"artifacts.editableArtifactUi.couldNotOpenThisArtifact\");\n case \"closed\":\n return t(\"artifacts.editableArtifactUi.artifactSessionClosed\");\n case \"live\":\n return view.writable\n ? t(\"artifacts.editableArtifactUi.live\")\n : t(\"artifacts.editableArtifactUi.liveReadOnly\");\n }\n}\n\n/** Revoked read authority must hide any projection retained before invalidation. */\nexport function editableArtifactAccessRevoked(view: EditableArtifactSyncView): boolean {\n if (view.state !== \"failed\" || !view.lastError) return false;\n return (view.lastError as Error & Readonly<{ code?: unknown }>).code === \"permission_changed\";\n}\n\nexport function EditableArtifactMessage({\n title,\n detail,\n retry,\n retryLabel: retryLabelProp,\n}: {\n title: string;\n detail: string;\n retry?: (() => void) | undefined;\n retryLabel?: string | undefined;\n}) {\n const t = useOpenGeniText();\n const retryLabel =\n retryLabelProp === undefined ? t(\"artifacts.editableArtifactUi.retry\") : retryLabelProp;\n return (\n <div className=\"grid h-full min-h-56 place-items-center bg-og-bg p-6 text-center\">\n <div>\n <p className=\"text-og-base font-medium text-og-fg\">{title}</p>\n <p className=\"mt-1 max-w-lg text-og-sm text-og-fg-muted\">{detail}</p>\n {retry ? (\n <button\n type=\"button\"\n onClick={retry}\n className=\"mt-3 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-3 py-1.5 text-og-sm font-medium hover:bg-og-primary-hover outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n {retryLabel}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport function asEditableArtifactError(cause: unknown, fallback: string): Error {\n return cause instanceof Error ? cause : new Error(fallback);\n}\n","import type { EditableArtifactSession } from \"@opengeni/sdk/editable-artifacts\";\nimport { createContext, useContext, useState, type ReactNode } from \"react\";\n\nfunction createSubmissionQueue() {\n let pending = 0;\n const listeners = new Set<() => void>();\n const emit = () => {\n for (const listener of listeners) listener();\n };\n return {\n getPending: () => pending,\n subscribe: (listener: () => void) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n async run<T>(invoke: () => Promise<T>): Promise<T> {\n // The SDK's causal queue and Worker authoring precede pendingTransactions.\n // Latch synchronously so a same-event blur/click cannot export an older head.\n pending++;\n emit();\n try {\n return await invoke();\n } finally {\n pending--;\n emit();\n }\n },\n };\n}\n\nexport type ArtifactSubmissions = Readonly<{\n getPending: () => number;\n subscribe: (listener: () => void) => () => void;\n run: <T>(invoke: () => Promise<T>) => Promise<T>;\n}>;\n\nconst standaloneQueue: ArtifactSubmissions = {\n getPending: () => 0,\n subscribe: (_listener: () => void) => () => {},\n run: <T,>(invoke: () => Promise<T>) => invoke(),\n};\nconst SubmissionContext = createContext<ArtifactSubmissions | null>(null);\n\nexport function ArtifactSubmissionProvider({ children }: { children: ReactNode }) {\n const [queue] = useState(createSubmissionQueue);\n return <SubmissionContext.Provider value={queue}>{children}</SubmissionContext.Provider>;\n}\n\n/** UI authoring submissions not yet visible as SDK pending transactions. */\nexport function useArtifactSubmissions(): ArtifactSubmissions {\n return useContext(SubmissionContext) ?? standaloneQueue;\n}\n\nconst SESSION_KEYS = new WeakMap<EditableArtifactSession, number>();\nlet nextSessionKey = 0;\n\n/** Stable per-session React key so a replaced session never inherits queued state. */\nexport function artifactSubmissionSessionKey(session: EditableArtifactSession): number {\n let key = SESSION_KEYS.get(session);\n if (key === undefined) {\n key = ++nextSessionKey;\n SESSION_KEYS.set(session, key);\n }\n return key;\n}\n","import type { EditableArtifactSession } from \"@opengeni/sdk/editable-artifacts\";\nimport { DownloadIcon, LoaderCircleIcon } from \"lucide-react\";\nimport { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\n\nimport { ArtifactButton } from \"./artifact-chrome\";\nimport { useArtifactSubmissions } from \"./artifact-submissions\";\nimport { useEditableArtifactView } from \"./editable-artifact-ui\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\n\n/** Host-authenticated export of the saved native head as an Office file. */\nexport type EditableArtifactDownload = (signal: AbortSignal) => Promise<Blob>;\nexport type EditableArtifactDownloadFormat = \"xlsx\" | \"docx\" | \"pptx\";\n\nconst LABELS = {\n xlsx: {\n download: \"artifacts.spreadsheetDownload.download\",\n preparing: \"artifacts.spreadsheetDownload.preparing\",\n failed: \"artifacts.spreadsheetDownload.downloadFailedTryAgain\",\n title: \"artifacts.spreadsheetDownload.downloadWorkbookAsXlsx\",\n wait: \"artifacts.spreadsheetDownload.waitForWorkbookChangesTo\",\n fallbackName: \"artifacts.spreadsheetDownload.workbook\",\n },\n docx: {\n download: \"artifacts.artifactDownload.download\",\n preparing: \"artifacts.artifactDownload.preparing\",\n failed: \"artifacts.artifactDownload.downloadFailedTryAgain\",\n title: \"artifacts.artifactDownload.downloadDocumentAsDocx\",\n wait: \"artifacts.artifactDownload.waitForDocumentChangesTo\",\n fallbackName: \"artifacts.artifactDownload.document\",\n },\n pptx: {\n download: \"artifacts.artifactDownload.download\",\n preparing: \"artifacts.artifactDownload.preparing\",\n failed: \"artifacts.artifactDownload.downloadFailedTryAgain\",\n title: \"artifacts.artifactDownload.downloadPresentationAsPptx\",\n wait: \"artifacts.artifactDownload.waitForPresentationChangesTo\",\n fallbackName: \"artifacts.artifactDownload.presentation\",\n },\n} as const;\n\n/**\n * Download action shared by every editable modality. It waits for live sync\n * with no pending or still-submitting edits, so the export is the latest head.\n */\nexport function EditableArtifactDownloadButton({\n session,\n title,\n download,\n format,\n}: {\n session: EditableArtifactSession;\n title: string;\n download: EditableArtifactDownload;\n format: EditableArtifactDownloadFormat;\n}) {\n const t = useOpenGeniText();\n const labels = LABELS[format];\n const view = useEditableArtifactView(session);\n const submissions = useArtifactSubmissions();\n const submitting = useSyncExternalStore(\n submissions.subscribe,\n submissions.getPending,\n submissions.getPending,\n );\n const active = useRef<AbortController | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const ready =\n view.state === \"live\" &&\n submitting === 0 &&\n view.pendingTransactions === 0 &&\n view.blockedPending.length === 0 &&\n !view.authoringBlockedReason;\n useEffect(() => () => active.current?.abort(), [session]);\n useEffect(() => {\n if (view.state === \"failed\" || view.state === \"closed\") {\n active.current?.abort();\n active.current = null;\n setBusy(false);\n }\n }, [view.state]);\n\n const start = async () => {\n if (active.current || !ready || submissions.getPending()) return;\n // Re-read the live view: a just-committed edit may precede React's next render.\n const current = session.getView();\n if (\n current.state !== \"live\" ||\n current.pendingTransactions ||\n current.blockedPending.length ||\n current.authoringBlockedReason\n )\n return;\n const controller = new AbortController();\n active.current = controller;\n setBusy(true);\n setError(false);\n try {\n const blob = await download(controller.signal);\n if (controller.signal.aborted) return;\n const url = URL.createObjectURL(blob);\n try {\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = downloadFileName(title, format, t(labels.fallbackName));\n anchor.rel = \"noopener\";\n anchor.click();\n } finally {\n setTimeout(() => URL.revokeObjectURL(url), 0);\n }\n } catch {\n if (!controller.signal.aborted) setError(true);\n } finally {\n if (!controller.signal.aborted) {\n active.current = null;\n setBusy(false);\n }\n }\n };\n\n return (\n <>\n {error ? (\n <span role=\"alert\" className=\"text-og-xs text-og-fg-muted\">\n {t(labels.failed)}\n </span>\n ) : null}\n <ArtifactButton\n onClick={() => void start()}\n disabled={busy || !ready}\n title={ready ? t(labels.title) : t(labels.wait)}\n >\n {busy ? (\n <LoaderCircleIcon className=\"animate-spin\" aria-hidden />\n ) : (\n <DownloadIcon aria-hidden />\n )}\n {busy ? t(labels.preparing) : t(labels.download)}\n </ArtifactButton>\n </>\n );\n}\n\n/** Safe local file name: the artifact title with exactly one matching extension. */\nexport function downloadFileName(\n title: string,\n format: EditableArtifactDownloadFormat,\n fallback: string,\n): string {\n const base =\n title\n .replace(/[\\\\/:*?\"<>|\\u0000-\\u001f]/g, \"_\")\n .replace(new RegExp(`\\\\.${format}$`, \"i\"), \"\")\n .trim() || fallback;\n return `${base}.${format}`;\n}\n"],"mappings":"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","names":["jsx","jsxs","useState","jsx","LoaderCircleIcon","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","LoaderCircleIcon"]}
@@ -8,21 +8,9 @@ import {
8
8
  useInteractionInvalidation,
9
9
  useViewerMenuDismiss
10
10
  } from "./chunk-NL4NQTZQ.js";
11
- import {
12
- copyTextToClipboard
13
- } from "./chunk-PEHTX3V7.js";
14
11
  import {
15
12
  interactionHostPlatform
16
13
  } from "./chunk-ZUWF4NF7.js";
17
- import {
18
- usePageLiveActivity
19
- } from "./chunk-NAWXARTY.js";
20
- import {
21
- useEmbeddedBrowserInteraction
22
- } from "./chunk-ZGFU4LVW.js";
23
- import {
24
- formatBytes
25
- } from "./chunk-XUNI5SSO.js";
26
14
  import {
27
15
  STREAM_CLOSE_REASON_NORMAL,
28
16
  STREAM_KIND_BROWSER,
@@ -32,6 +20,18 @@ import {
32
20
  encodeStreamClose,
33
21
  encodeStreamOpen
34
22
  } from "./chunk-TNEZNMSN.js";
23
+ import {
24
+ copyTextToClipboard
25
+ } from "./chunk-PEHTX3V7.js";
26
+ import {
27
+ usePageLiveActivity
28
+ } from "./chunk-NAWXARTY.js";
29
+ import {
30
+ useEmbeddedBrowserInteraction
31
+ } from "./chunk-ZGFU4LVW.js";
32
+ import {
33
+ formatBytes
34
+ } from "./chunk-XUNI5SSO.js";
35
35
  import {
36
36
  cn
37
37
  } from "./chunk-TXS65BB2.js";
@@ -4810,4 +4810,4 @@ export {
4810
4810
  staleBrowserEndRetryDelayMs,
4811
4811
  BrowserViewer
4812
4812
  };
4813
- //# sourceMappingURL=chunk-T7KVNEIO.js.map
4813
+ //# sourceMappingURL=chunk-475IS53W.js.map
@@ -3,7 +3,7 @@ import {
3
3
  BillingClassMark,
4
4
  ModelMark,
5
5
  PickerNavRow
6
- } from "./chunk-LPHGR2E2.js";
6
+ } from "./chunk-OTFNGTAL.js";
7
7
  import {
8
8
  MENU_CHECK_CLASS,
9
9
  MENU_LABEL_CLASS,
@@ -305,4 +305,4 @@ export {
305
305
  ModelPolicyPickerMenu,
306
306
  ModelPolicyPickerPopover
307
307
  };
308
- //# sourceMappingURL=chunk-OLBMMOHM.js.map
308
+ //# sourceMappingURL=chunk-52KMXC7E.js.map
@@ -8,7 +8,7 @@ import {
8
8
  editableArtifactStatusLabel,
9
9
  useArtifactSubmissions,
10
10
  useEditableArtifactView
11
- } from "./chunk-SFLO7XMY.js";
11
+ } from "./chunk-3PGBCUVF.js";
12
12
  import {
13
13
  cn
14
14
  } from "./chunk-TXS65BB2.js";
@@ -3848,4 +3848,4 @@ export {
3848
3848
  EditableSpreadsheetGrid,
3849
3849
  EditableSpreadsheetArtifactSurface
3850
3850
  };
3851
- //# sourceMappingURL=chunk-2HJVWRHY.js.map
3851
+ //# sourceMappingURL=chunk-6SU56JNB.js.map
@@ -14,7 +14,7 @@ import {
14
14
  editableArtifactStatusLabel,
15
15
  useArtifactSubmissions,
16
16
  useEditableArtifactView
17
- } from "./chunk-SFLO7XMY.js";
17
+ } from "./chunk-3PGBCUVF.js";
18
18
  import {
19
19
  cn
20
20
  } from "./chunk-TXS65BB2.js";
@@ -3547,4 +3547,4 @@ export {
3547
3547
  PresentationProjectionArtifactSurface,
3548
3548
  EditablePresentationArtifactSurface
3549
3549
  };
3550
- //# sourceMappingURL=chunk-MJV3GBL5.js.map
3550
+ //# sourceMappingURL=chunk-6USBH4H7.js.map