@opengeni/react 0.46.1 → 0.48.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 (141) hide show
  1. package/README.md +68 -12
  2. package/dist/{chunk-U3CSCMWA.js → chunk-FK6VG4LL.js} +9 -13
  3. package/dist/chunk-FK6VG4LL.js.map +1 -0
  4. package/dist/{chunk-HFO4ERGQ.js → chunk-FWXGSNXT.js} +2 -2
  5. package/dist/{chunk-SRFUT2ZU.js → chunk-I4MPFDRP.js} +119 -63
  6. package/dist/chunk-I4MPFDRP.js.map +1 -0
  7. package/dist/{chunk-EB67J347.js → chunk-KZ73RL76.js} +111 -31
  8. package/dist/chunk-KZ73RL76.js.map +1 -0
  9. package/dist/{chunk-LWR4MXSS.js → chunk-LHLYWG5R.js} +10 -1
  10. package/dist/chunk-LHLYWG5R.js.map +1 -0
  11. package/dist/{chunk-3PB7MIT6.js → chunk-NJ7M2B6Z.js} +207 -67
  12. package/dist/chunk-NJ7M2B6Z.js.map +1 -0
  13. package/dist/{chunk-VCBFUSUZ.js → chunk-O4VXOBGF.js} +3 -3
  14. package/dist/{chunk-VCBFUSUZ.js.map → chunk-O4VXOBGF.js.map} +1 -1
  15. package/dist/{chunk-6EDV6YFE.js → chunk-OL6QVXGF.js} +121 -29
  16. package/dist/chunk-OL6QVXGF.js.map +1 -0
  17. package/dist/chunk-VZTQ73XT.js +86 -0
  18. package/dist/chunk-VZTQ73XT.js.map +1 -0
  19. package/dist/{chunk-FGZUCXZF.js → chunk-WYA65Y3F.js} +16 -16
  20. package/dist/chunk-WYA65Y3F.js.map +1 -0
  21. package/dist/{chunk-LGVMUIRV.js → chunk-XCNTXWBB.js} +264 -115
  22. package/dist/chunk-XCNTXWBB.js.map +1 -0
  23. package/dist/client.d.ts +1 -1
  24. package/dist/components/chat-composer.d.ts +7 -2
  25. package/dist/components/composer-transcription-control.d.ts +2 -0
  26. package/dist/components/composer.d.ts +14 -0
  27. package/dist/components/machines/machine-detail.d.ts +3 -1
  28. package/dist/components/machines-dashboard.d.ts +3 -3
  29. package/dist/components/message-timeline.d.ts +12 -2
  30. package/dist/components/sandbox-files.d.ts +2 -2
  31. package/dist/components/sandbox-terminal.d.ts +29 -0
  32. package/dist/components/sandbox-workspace.d.ts +5 -1
  33. package/dist/components/workspace-dock.d.ts +3 -1
  34. package/dist/composer.d.ts +2 -2
  35. package/dist/composer.js +6 -6
  36. package/dist/hooks/internal.d.ts +6 -0
  37. package/dist/hooks/use-codex-accounts.d.ts +1 -1
  38. package/dist/hooks/use-environments.d.ts +10 -4
  39. package/dist/hooks/use-machines.d.ts +7 -0
  40. package/dist/hooks/use-sandbox-files.d.ts +19 -0
  41. package/dist/hooks/use-sandbox-git.d.ts +7 -0
  42. package/dist/hooks/use-transcription.d.ts +2 -2
  43. package/dist/hooks/use-voice-input.d.ts +5 -3
  44. package/dist/index.d.ts +6 -5
  45. package/dist/index.js +904 -538
  46. package/dist/index.js.map +1 -1
  47. package/dist/lib/composer-responsive-context.d.ts +9 -0
  48. package/dist/lib/use-portal-token-style.d.ts +14 -3
  49. package/dist/machines.js +2 -2
  50. package/dist/{queue-surface-implementation-J4XJFKRW.js → queue-surface-implementation-U5JFG7HT.js} +19 -18
  51. package/dist/queue-surface-implementation-U5JFG7HT.js.map +1 -0
  52. package/dist/realtime/realtime-control.d.ts +9 -0
  53. package/dist/realtime.js +27 -30
  54. package/dist/realtime.js.map +1 -1
  55. package/dist/session-ui.js +5 -5
  56. package/dist/session.js +4 -4
  57. package/dist/timeline/activity-rail.d.ts +3 -2
  58. package/dist/timeline/index.d.ts +2 -2
  59. package/dist/timeline/parsers.d.ts +3 -3
  60. package/dist/timeline/registry.d.ts +3 -0
  61. package/dist/timeline/screenshot-lightbox.d.ts +1 -1
  62. package/dist/timeline/types.d.ts +4 -0
  63. package/dist/voice-recording-store.d.ts +8 -2
  64. package/package.json +20 -4
  65. package/src/client.ts +3 -0
  66. package/src/components/chat-composer.tsx +12 -2
  67. package/src/components/code-editor.tsx +1 -1
  68. package/src/components/command-palette.tsx +1 -1
  69. package/src/components/composer-transcription-control.tsx +41 -16
  70. package/src/components/composer.tsx +49 -23
  71. package/src/components/copy-button.tsx +1 -1
  72. package/src/components/desktop-viewer.tsx +2 -2
  73. package/src/components/file-browser.tsx +39 -17
  74. package/src/components/human-input-form.tsx +2 -2
  75. package/src/components/machine-card.tsx +1 -1
  76. package/src/components/machines/machine-detail.tsx +39 -15
  77. package/src/components/machines-dashboard.tsx +7 -6
  78. package/src/components/message-timeline.tsx +39 -6
  79. package/src/components/model-picker.tsx +2 -2
  80. package/src/components/model-policy-picker.tsx +16 -15
  81. package/src/components/queue-surface-implementation.tsx +20 -16
  82. package/src/components/queue-surface-state.tsx +2 -2
  83. package/src/components/sandbox-files.tsx +140 -60
  84. package/src/components/sandbox-terminal.tsx +24 -5
  85. package/src/components/sandbox-workspace.tsx +180 -142
  86. package/src/components/session-chrome.tsx +14 -14
  87. package/src/components/tooltip.tsx +13 -16
  88. package/src/components/user-message-body.tsx +1 -1
  89. package/src/components/workbench-changes.tsx +4 -4
  90. package/src/components/workspace-dock.tsx +13 -5
  91. package/src/composer.ts +3 -0
  92. package/src/hooks/internal.ts +132 -38
  93. package/src/hooks/use-codex-accounts.ts +4 -4
  94. package/src/hooks/use-environments.ts +24 -5
  95. package/src/hooks/use-file-attachments.ts +70 -32
  96. package/src/hooks/use-goal.ts +17 -5
  97. package/src/hooks/use-machines.ts +47 -1
  98. package/src/hooks/use-sandbox-files.ts +310 -59
  99. package/src/hooks/use-sandbox-git.ts +148 -41
  100. package/src/hooks/use-session-capabilities.ts +35 -24
  101. package/src/hooks/use-session-events.ts +18 -4
  102. package/src/hooks/use-transcription.ts +4 -14
  103. package/src/hooks/use-turn-queue.ts +17 -5
  104. package/src/hooks/use-voice-input.ts +163 -19
  105. package/src/hooks/use-windowed-sections.ts +9 -7
  106. package/src/index.ts +11 -6
  107. package/src/lib/composer-responsive-context.ts +15 -0
  108. package/src/lib/use-portal-token-style.ts +60 -15
  109. package/src/provider.tsx +52 -7
  110. package/src/realtime/dropdown-menu.tsx +15 -19
  111. package/src/realtime/realtime-control.tsx +16 -5
  112. package/src/timeline/activity-rail.tsx +14 -5
  113. package/src/timeline/index.ts +1 -1
  114. package/src/timeline/parsers.ts +33 -20
  115. package/src/timeline/projection.ts +23 -0
  116. package/src/timeline/registry.ts +7 -0
  117. package/src/timeline/screenshot-lightbox.tsx +15 -4
  118. package/src/timeline/shared.tsx +5 -5
  119. package/src/timeline/tool-renderers.tsx +166 -22
  120. package/src/timeline/turn-summary.tsx +2 -2
  121. package/src/timeline/types.ts +4 -0
  122. package/src/voice-recording-store.ts +15 -0
  123. package/styles/compiled.css +5065 -0
  124. package/styles/compiled.d.ts +2 -0
  125. package/styles/effective-tokens.css +27 -0
  126. package/styles/index.css +3 -0
  127. package/styles/responsive.css +196 -0
  128. package/styles/responsive.d.ts +2 -0
  129. package/styles/tokens.css +50 -17
  130. package/dist/chunk-3PB7MIT6.js.map +0 -1
  131. package/dist/chunk-6EDV6YFE.js.map +0 -1
  132. package/dist/chunk-EB67J347.js.map +0 -1
  133. package/dist/chunk-FGZUCXZF.js.map +0 -1
  134. package/dist/chunk-JB5725BI.js +0 -48
  135. package/dist/chunk-JB5725BI.js.map +0 -1
  136. package/dist/chunk-LGVMUIRV.js.map +0 -1
  137. package/dist/chunk-LWR4MXSS.js.map +0 -1
  138. package/dist/chunk-SRFUT2ZU.js.map +0 -1
  139. package/dist/chunk-U3CSCMWA.js.map +0 -1
  140. package/dist/queue-surface-implementation-J4XJFKRW.js.map +0 -1
  141. /package/dist/{chunk-HFO4ERGQ.js.map → chunk-FWXGSNXT.js.map} +0 -0
package/README.md CHANGED
@@ -51,20 +51,40 @@ can therefore implement only the methods used by each hook. A shared event feed
51
51
  also avoids requiring a client-owned event stream at runtime. Workspace-level
52
52
  Resume is an optional authority.
53
53
 
54
- The styled root surface uses Tailwind v4 and the package CSS entries:
54
+ The styled root surface ships with ready-to-use CSS. Import it once; the host
55
+ does not need Tailwind:
55
56
 
56
- The package ships TypeScript source plus two CSS entries. In your Tailwind v4
57
- entry CSS:
57
+ ```tsx
58
+ import "@opengeni/react/compiled.css";
59
+ ```
60
+
61
+ The compiled entry contains the package's Tailwind v4 utilities and tokens,
62
+ omits global Preflight, and scopes every style rule to `.og-root`. Components
63
+ put that class on their standalone roots, including portalled menus, dialogs,
64
+ tooltips, and lightboxes. The low-specificity scope covers both the root element
65
+ itself and its descendants, so utilities work in either shape without resetting
66
+ the host document or globally registering Tailwind's `--tw-*` custom properties.
67
+ Tailwind runtime variables are initialized per element only inside those roots.
68
+ Independent package defaults inherit without replacing host `--og-*` values;
69
+ derived defaults use scoped effective values so changing a base accent, radius,
70
+ motion, or surface token updates its dependents at runtime.
71
+
72
+ The original Tailwind v4 bridge remains available for hosts that intentionally
73
+ want OpenGeni utilities compiled into their own Tailwind entry:
58
74
 
59
75
  ```css
60
76
  @import "tailwindcss";
61
77
  @import "@opengeni/react/styles.css";
78
+ @import "@opengeni/react/responsive.css";
62
79
  @source "../node_modules/@opengeni/react/src";
63
80
  ```
64
81
 
65
- (`@source` lets Tailwind compile the utilities used inside the components.
66
- Consuming only the tokens without Tailwind? Import
67
- `@opengeni/react/tokens.css` and use the `--og-*` variables directly.)
82
+ `@source` lets the host compiler discover utilities used inside the components.
83
+ `responsive.css` is the small opt-in layout layer for
84
+ `responsiveBasis="container"`; omit it when every composer keeps the historical
85
+ viewport basis. `compiled.css` already contains that layer. Do not import both
86
+ `compiled.css` and `styles.css`. Consuming only the tokens?
87
+ Import `@opengeni/react/tokens.css` and use the `--og-*` variables directly.
68
88
 
69
89
  ### Product-compatible theming and density
70
90
 
@@ -76,6 +96,12 @@ SDK type utilities are also scoped against ordinary host resets such as
76
96
  `.app button { font: inherit }`; customize their public tokens instead of
77
97
  adding selector-specific overrides.
78
98
 
99
+ Every portalled surface is an independent `.og-root`. Token-themed portal
100
+ content copies the effective `--og-*` values from its trigger, preserving an
101
+ enclosing light, compact, or rebranded theme even though it mounts under
102
+ `<body>`; a standalone root with `data-og-theme` or `data-og-density` works
103
+ directly as well.
104
+
79
105
  For a narrow product sidebar, opt into the supported compact preset:
80
106
 
81
107
  ```tsx
@@ -85,6 +111,27 @@ For a narrow product sidebar, opt into the supported compact preset:
85
111
  </aside>
86
112
  ```
87
113
 
114
+ Density and responsive measurement are separate opt-ins. By default,
115
+ `ChatComposer` keeps its existing viewport breakpoints. An embed whose composer
116
+ can be narrow inside a wide page should measure the composer instead:
117
+
118
+ ```tsx
119
+ <aside data-og-theme="light" data-og-density="compact">
120
+ <ChatComposer {...composerProps} responsiveBasis="container" />
121
+ </aside>
122
+ ```
123
+
124
+ `responsiveBasis="container"` makes the composer root an inline-size query
125
+ container. Input density, footer wrapping, command descriptions, paused labels,
126
+ model controls, transcription status, and nested realtime controls then follow
127
+ that root's actual width. Coarse-pointer target sizing remains a separate media
128
+ feature, so a narrow mouse-driven panel stays compact while touch targets remain
129
+ at least 44px. Composer-owned model and realtime menus keep their portal
130
+ placement but copy the live root width with the existing theme tokens and never
131
+ grow wider than that source container. Compound layouts can pass the same prop
132
+ to `Composer.Root`. Hosts using the Tailwind source bridge import
133
+ `@opengeni/react/responsive.css`; the ready-to-use `compiled.css` includes it.
134
+
88
135
  The preset is only a starting point. Override individual runtime tokens on the
89
136
  same ancestor without rebuilding Tailwind:
90
137
 
@@ -104,7 +151,8 @@ The type ramp is `--og-font-size-{xs,sm,base,md}` with matching
104
151
  `--og-line-height-*` tokens. Interactive chrome uses the semantic `control`,
105
152
  `menu`, `composer`, and `composer-wide` pairs. Model picker height, width,
106
153
  padding, and row-density tokens are grouped under `--og-model-picker-*` in
107
- `styles/tokens.css`. `ModelPolicyPicker` also exposes `contentClassName` and
154
+ `styles/tokens.css`; realtime menu width uses `--og-realtime-menu-width`.
155
+ `ModelPolicyPicker` also exposes `contentClassName` and
108
156
  `contentStyle` for exceptional surface-level customization; tokens are the
109
157
  recommended path.
110
158
 
@@ -238,6 +286,11 @@ containing only `api-key` and/or `access-key` with
238
286
  exposed as container environment variables. Local non-Kubernetes servers may
239
287
  instead use `OPENGENI_DEMO_API_KEY` and/or `OPENGENI_DEMO_ACCESS_KEY`.
240
288
 
289
+ The container-responsive reference is `demo/composer-responsive.html`. It keeps
290
+ the browser viewport wide while resizing one child composer through 280, 320,
291
+ 360, 420, 640, and 768px, with theme, density, paused, voice, model-menu, and
292
+ slash-command states available from the harness controls.
293
+
241
294
  Microphone capture works on `localhost` or a secure HTTPS origin. A remote HTTP
242
295
  deployment cannot request microphone access. The live page exercises catalog
243
296
  loading, realtime-first creation, Codex Live, Gateway models, mute, recovery,
@@ -281,7 +334,7 @@ function CustomComposer({ sessionComposer, attachments, effectiveControl }) {
281
334
  });
282
335
 
283
336
  return (
284
- <Composer.Root controller={controller}>
337
+ <Composer.Root controller={controller} responsiveBasis="container">
285
338
  <Composer.Frame>
286
339
  <Composer.CommandPalette />
287
340
  <Composer.Surface>
@@ -366,8 +419,10 @@ state remains application-owned; durable draft and session state remain in
366
419
  handlers) behind `CommandPalette`.
367
420
  - `useWorkspaceSessions()` / `useScheduledTasks()` — workspace lists for
368
421
  fleet/manager views (optional polling).
369
- - `useVariable sets()` — workspace variable sets with create/update/remove and
370
- write-only `setVariable`/`deleteVariable` (values never come back on reads).
422
+ - `useVariableSets()` — workspace variable sets with metadata-only generic
423
+ reads and create/update/remove/set/delete operations. Dedicated permissioned
424
+ exact-value reveal is part of the held React/UI train rather than an
425
+ implicit field on ordinary reads.
371
426
  - `usePacks()` — capability packs + installations with
372
427
  register/enable/remove and `installationFor(packId)`.
373
428
  - `useWorkspaces()` — the caller's workspaces with create/update (client-only;
@@ -474,8 +529,9 @@ capability document so every surface degrades to a reason instead of crashing.
474
529
  (`cold`/`warming`/`warm`), and acquires the viewer holder(s) that keep the box
475
530
  warm. Desktop attach is gated behind the un-redacted-pixel acknowledgment.
476
531
  - `useSandboxFiles` / `useSandboxGit` — the Pierre file tree + git status/diff
477
- feeds (the synchronous `fs*`/`git*` SDK point queries plus `fs.changed` /
478
- `git.changed` live notifications).
532
+ feeds. Initial and refresh reads use the SDK's batched file-frontier and
533
+ multi-repository Git queries behind one sandbox lease; `fs.changed` /
534
+ `git.changed` notifications keep the result live.
479
535
  - `useSandboxTerminal` / `useTerminalStream` — the read-only command-output
480
536
  firehose and the real interactive PTY over the minted `pty-ws` cell.
481
537
  - `useDesktopStream` — the noVNC socket, hot-swapped on box rollover via
@@ -1,17 +1,14 @@
1
1
  import {
2
+ usePortalTokenSource,
2
3
  usePortalTokenStyle
3
- } from "./chunk-JB5725BI.js";
4
+ } from "./chunk-VZTQ73XT.js";
4
5
  import {
5
6
  cn
6
7
  } from "./chunk-22KP6LR5.js";
7
8
 
8
9
  // src/components/tooltip.tsx
9
10
  import { Tooltip as TooltipPrimitive } from "radix-ui";
10
- import {
11
- createContext,
12
- useContext,
13
- useRef
14
- } from "react";
11
+ import { createContext, useContext } from "react";
15
12
  import { jsx, jsxs } from "react/jsx-runtime";
16
13
  var TooltipSourceContext = createContext(null);
17
14
  function TooltipProvider({
@@ -21,8 +18,8 @@ function TooltipProvider({
21
18
  return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, { delayDuration, ...props });
22
19
  }
23
20
  function Tooltip({ children, ...props }) {
24
- const sourceRef = useRef(null);
25
- return /* @__PURE__ */ jsx(TooltipSourceContext.Provider, { value: sourceRef, children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props, children }) });
21
+ const source = usePortalTokenSource();
22
+ return /* @__PURE__ */ jsx(TooltipSourceContext.Provider, { value: source, children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props, children }) });
26
23
  }
27
24
  function TooltipTrigger({
28
25
  asChild = true,
@@ -35,7 +32,7 @@ function TooltipTrigger({
35
32
  "data-slot": "tooltip-trigger",
36
33
  asChild,
37
34
  ref: (node) => {
38
- if (sourceRef) sourceRef.current = node;
35
+ sourceRef?.ref(node);
39
36
  },
40
37
  ...props
41
38
  }
@@ -52,9 +49,8 @@ function TooltipContent({
52
49
  style,
53
50
  ...props
54
51
  }) {
55
- const sourceRef = useContext(TooltipSourceContext);
56
- const fallbackRef = useRef(null);
57
- const portalStyle = usePortalTokenStyle(sourceRef ?? fallbackRef);
52
+ const source = useContext(TooltipSourceContext);
53
+ const portalStyle = usePortalTokenStyle(source?.source ?? null);
58
54
  return /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
59
55
  TooltipPrimitive.Content,
60
56
  {
@@ -91,4 +87,4 @@ export {
91
87
  TooltipTrigger,
92
88
  TooltipContent
93
89
  };
94
- //# sourceMappingURL=chunk-U3CSCMWA.js.map
90
+ //# sourceMappingURL=chunk-FK6VG4LL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/tooltip.tsx"],"sourcesContent":["/**\n * Token-styled Radix tooltip — SDK counterpart to apps/web `components/ui/tooltip`.\n * Portals copy `--og-*` tokens so embeds keep the host theme outside `.og-root`.\n *\n * Background/foreground are applied as inline styles (not only Tailwind\n * utilities): `.og-root` sets `color: var(--og-color-fg)` after utilities in the\n * consumer CSS cascade, which would otherwise paint light-on-light inverted\n * tips and look like a blank white bubble.\n */\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\";\nimport { createContext, useContext, type ComponentProps, type CSSProperties } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { usePortalTokenSource, usePortalTokenStyle } from \"../lib/use-portal-token-style\";\n\ntype TooltipSourceContextValue = {\n source: HTMLElement | null;\n ref: (node: HTMLElement | null) => void;\n};\n\nconst TooltipSourceContext = createContext<TooltipSourceContextValue | null>(null);\n\nfunction TooltipProvider({\n delayDuration = 300,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider delayDuration={delayDuration} {...props} />;\n}\n\nfunction Tooltip({ children, ...props }: ComponentProps<typeof TooltipPrimitive.Root>) {\n const source = usePortalTokenSource<HTMLElement>();\n return (\n <TooltipSourceContext.Provider value={source}>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props}>\n {children}\n </TooltipPrimitive.Root>\n </TooltipSourceContext.Provider>\n );\n}\n\nfunction TooltipTrigger({\n asChild = true,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Trigger>) {\n const sourceRef = useContext(TooltipSourceContext);\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n asChild={asChild}\n ref={(node) => {\n sourceRef?.ref(node);\n }}\n {...props}\n />\n );\n}\n\nconst tooltipSurfaceStyle: CSSProperties = {\n backgroundColor: \"var(--og-color-fg)\",\n color: \"var(--og-color-bg)\",\n};\n\nfunction TooltipContent({\n className,\n sideOffset = 6,\n children,\n style,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Content>) {\n const source = useContext(TooltipSourceContext);\n const portalStyle = usePortalTokenStyle(source?.source ?? null);\n\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"og-root z-50 w-fit max-w-xs origin-[var(--radix-tooltip-content-transform-origin)]\",\n \"rounded-og-md px-2.5 py-1.5 text-og-xs leading-4 text-balance shadow-og-md\",\n \"animate-og-enter data-[state=closed]:opacity-0 data-[state=closed]:transition-opacity\",\n className,\n )}\n style={{ ...portalStyle, ...tooltipSurfaceStyle, ...style }}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow\n className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\"\n style={{\n backgroundColor: \"var(--og-color-fg)\",\n fill: \"var(--og-color-fg)\",\n }}\n />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n"],"mappings":";;;;;;;;;AASA,SAAS,WAAW,wBAAwB;AAC5C,SAAS,eAAe,kBAA2D;AAgB1E,cAgDH,YAhDG;AANT,IAAM,uBAAuB,cAAgD,IAAI;AAEjF,SAAS,gBAAgB;AAAA,EACvB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAAqD;AACnD,SAAO,oBAAC,iBAAiB,UAAjB,EAA0B,eAA+B,GAAG,OAAO;AAC7E;AAEA,SAAS,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAiD;AACrF,QAAM,SAAS,qBAAkC;AACjD,SACE,oBAAC,qBAAqB,UAArB,EAA8B,OAAO,QACpC,8BAAC,iBAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAC5C,UACH,GACF;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB,UAAU;AAAA,EACV,GAAG;AACL,GAAoD;AAClD,QAAM,YAAY,WAAW,oBAAoB;AACjD,SACE;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,KAAK,CAAC,SAAS;AACb,mBAAW,IAAI,IAAI;AAAA,MACrB;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,sBAAqC;AAAA,EACzC,iBAAiB;AAAA,EACjB,OAAO;AACT;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAoD;AAClD,QAAM,SAAS,WAAW,oBAAoB;AAC9C,QAAM,cAAc,oBAAoB,QAAQ,UAAU,IAAI;AAE9D,SACE,oBAAC,iBAAiB,QAAjB,EACC;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,EAAE,GAAG,aAAa,GAAG,qBAAqB,GAAG,MAAM;AAAA,MACzD,GAAG;AAAA,MAEH;AAAA;AAAA,QACD;AAAA,UAAC,iBAAiB;AAAA,UAAjB;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,iBAAiB;AAAA,cACjB,MAAM;AAAA,YACR;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useSessionEventTrigger
3
- } from "./chunk-EB67J347.js";
3
+ } from "./chunk-KZ73RL76.js";
4
4
  import {
5
5
  useEmbeddedSession
6
6
  } from "./chunk-EKZH6IDG.js";
@@ -1070,4 +1070,4 @@ export {
1070
1070
  shouldSubmitOnKey,
1071
1071
  shouldSteerOnKey
1072
1072
  };
1073
- //# sourceMappingURL=chunk-HFO4ERGQ.js.map
1073
+ //# sourceMappingURL=chunk-FWXGSNXT.js.map
@@ -2,13 +2,14 @@ import {
2
2
  buildTimeline,
3
3
  groupTimeline,
4
4
  sessionStatusFromEvents
5
- } from "./chunk-LWR4MXSS.js";
5
+ } from "./chunk-LHLYWG5R.js";
6
6
  import {
7
7
  useDebouncedCallback,
8
8
  useMutationRunner,
9
+ usePageLiveActivity,
9
10
  usePolledValue,
10
11
  useSessionEventTrigger
11
- } from "./chunk-EB67J347.js";
12
+ } from "./chunk-KZ73RL76.js";
12
13
  import {
13
14
  useEmbeddedFileAttachments,
14
15
  useEmbeddedGoal,
@@ -152,6 +153,8 @@ var EMPTY_EVENT_WINDOW = {
152
153
  function useSessionEvents(sessionId, options = {}) {
153
154
  const { client, workspaceId, reconcileSession } = useEmbeddedSession(options);
154
155
  const enabled = options.enabled ?? true;
156
+ const pageLive = usePageLiveActivity();
157
+ const streamEnabled = enabled && pageLive;
155
158
  const after = options.after ?? 0;
156
159
  const replay = options.replay ?? "windowed";
157
160
  const fullReplay = replay === "full" || after !== 0;
@@ -228,7 +231,7 @@ function useSessionEvents(sessionId, options = {}) {
228
231
  loadingOlderRef.current = false;
229
232
  setLoadingOlder(false);
230
233
  }
231
- if (!sessionId || !enabled) {
234
+ if (!sessionId || !streamEnabled) {
232
235
  setConnectionState("idle");
233
236
  return;
234
237
  }
@@ -323,7 +326,13 @@ function useSessionEvents(sessionId, options = {}) {
323
326
  const stream = client.streamEvents(workspaceId, sessionId, {
324
327
  after: streamResumeSequenceRef.current,
325
328
  signal: controller.signal,
326
- beforeLive: async () => await reconcileSession(sessionId),
329
+ onOpen: () => {
330
+ void Promise.resolve().then(() => reconcileSession(sessionId)).catch((cause) => {
331
+ if (isCurrent()) {
332
+ setError(cause instanceof Error ? cause : new Error(String(cause)));
333
+ }
334
+ });
335
+ },
327
336
  onStateChange: (state) => {
328
337
  if (isCurrent()) {
329
338
  setConnectionState(state);
@@ -375,7 +384,7 @@ function useSessionEvents(sessionId, options = {}) {
375
384
  workspaceId,
376
385
  sessionId,
377
386
  after,
378
- enabled,
387
+ streamEnabled,
379
388
  fullReplay,
380
389
  streamKey,
381
390
  streamEpoch,
@@ -956,7 +965,7 @@ async function loadPreviousPage(client, workspaceId, sessionId, before, options)
956
965
  compact: true,
957
966
  // Monitoring summaries omit correlation fields once a bounded durable
958
967
  // payload exceeds their preview threshold. The browser timeline needs the
959
- // sanitized stored payload so persisted tool outputs still match their
968
+ // exact stored payload so persisted tool outputs still match their
960
969
  // calls and expose truthful truncation telemetry after a reload.
961
970
  payloadMode: "full"
962
971
  });
@@ -1039,20 +1048,61 @@ function abortError() {
1039
1048
  }
1040
1049
 
1041
1050
  // src/hooks/use-file-attachments.ts
1042
- import { useCallback as useCallback3, useRef as useRef2, useState as useState3 } from "react";
1051
+ import { useCallback as useCallback3, useEffect as useEffect3, useRef as useRef2, useState as useState3 } from "react";
1043
1052
  var isImage = (file) => file.type.startsWith("image/");
1044
1053
  function useFileAttachments(options = {}) {
1045
1054
  const { client, workspaceId } = useEmbeddedFileAttachments(options);
1046
1055
  const pasteFilter = options.pasteFilter ?? isImage;
1047
1056
  const [attachments, setAttachments] = useState3([]);
1048
1057
  const sources = useRef2(/* @__PURE__ */ new Map());
1058
+ const previewUrls = useRef2(/* @__PURE__ */ new Map());
1059
+ const revokePreview = useCallback3((id) => {
1060
+ const previewUrl = previewUrls.current.get(id);
1061
+ if (!previewUrl) return;
1062
+ previewUrls.current.delete(id);
1063
+ URL.revokeObjectURL(previewUrl);
1064
+ }, []);
1065
+ const revokeAllPreviews = useCallback3(() => {
1066
+ const urls = [...previewUrls.current.values()];
1067
+ previewUrls.current.clear();
1068
+ for (const previewUrl of urls) URL.revokeObjectURL(previewUrl);
1069
+ }, []);
1070
+ const committedAttachmentIds = useRef2(/* @__PURE__ */ new Set());
1071
+ useEffect3(() => {
1072
+ const currentIds = new Set(attachments.map((attachment) => attachment.id));
1073
+ for (const id of committedAttachmentIds.current) {
1074
+ if (!currentIds.has(id)) revokePreview(id);
1075
+ }
1076
+ committedAttachmentIds.current = currentIds;
1077
+ }, [attachments, revokePreview]);
1078
+ const scopeGeneration = useRef2(0);
1079
+ const previousScope = useRef2({ client, workspaceId });
1080
+ useEffect3(() => {
1081
+ const previous = previousScope.current;
1082
+ if (previous.client === client && previous.workspaceId === workspaceId) return;
1083
+ previousScope.current = { client, workspaceId };
1084
+ scopeGeneration.current += 1;
1085
+ sources.current.clear();
1086
+ revokeAllPreviews();
1087
+ setAttachments([]);
1088
+ }, [client, revokeAllPreviews, workspaceId]);
1089
+ useEffect3(
1090
+ () => () => {
1091
+ scopeGeneration.current += 1;
1092
+ sources.current.clear();
1093
+ revokeAllPreviews();
1094
+ },
1095
+ [revokeAllPreviews]
1096
+ );
1049
1097
  const startUpload = useCallback3(
1050
1098
  (id, file) => {
1099
+ const generation = scopeGeneration.current;
1051
1100
  void client.uploadFile(workspaceId, {
1052
1101
  filename: file.name || "file",
1053
1102
  contentType: file.type || "application/octet-stream",
1054
1103
  data: file
1055
1104
  }).then((asset) => {
1105
+ if (scopeGeneration.current !== generation) return;
1056
1106
  sources.current.delete(id);
1057
1107
  setAttachments(
1058
1108
  (current) => current.map(
@@ -1068,6 +1118,7 @@ function useFileAttachments(options = {}) {
1068
1118
  )
1069
1119
  );
1070
1120
  }).catch((error) => {
1121
+ if (scopeGeneration.current !== generation) return;
1071
1122
  setAttachments(
1072
1123
  (current) => current.map(
1073
1124
  (attachment) => attachment.id === id ? {
@@ -1087,6 +1138,7 @@ function useFileAttachments(options = {}) {
1087
1138
  const id = crypto.randomUUID();
1088
1139
  sources.current.set(id, file);
1089
1140
  const previewUrl = isImage(file) ? URL.createObjectURL(file) : void 0;
1141
+ if (previewUrl) previewUrls.current.set(id, previewUrl);
1090
1142
  setAttachments((current) => [
1091
1143
  ...current,
1092
1144
  {
@@ -1167,51 +1219,33 @@ function useFileAttachments(options = {}) {
1167
1219
  // only authority restored across page/device boundaries.
1168
1220
  };
1169
1221
  });
1170
- for (const [fileId, attachment] of existingReady) {
1171
- if (!incoming.has(fileId) && attachment.previewUrl) {
1172
- URL.revokeObjectURL(attachment.previewUrl);
1173
- }
1174
- }
1175
1222
  return [...unresolved, ...restored];
1176
1223
  });
1177
1224
  },
1178
1225
  [workspaceId]
1179
1226
  );
1180
- const remove = useCallback3((id) => {
1181
- sources.current.delete(id);
1182
- setAttachments((current) => {
1183
- const removed = current.find((attachment) => attachment.id === id);
1184
- if (removed?.previewUrl) {
1185
- URL.revokeObjectURL(removed.previewUrl);
1186
- }
1187
- return current.filter((attachment) => attachment.id !== id);
1188
- });
1189
- }, []);
1227
+ const remove = useCallback3(
1228
+ (id) => {
1229
+ sources.current.delete(id);
1230
+ revokePreview(id);
1231
+ setAttachments((current) => current.filter((attachment) => attachment.id !== id));
1232
+ },
1233
+ [revokePreview]
1234
+ );
1190
1235
  const removeReadyFiles = useCallback3((fileIds) => {
1191
1236
  const accepted = new Set(fileIds);
1192
1237
  if (accepted.size === 0) return;
1193
1238
  setAttachments(
1194
1239
  (current) => current.filter((attachment) => {
1195
- const removeAccepted = attachment.status === "ready" && attachment.file !== void 0 && accepted.has(attachment.file.id);
1196
- if (removeAccepted) {
1197
- sources.current.delete(attachment.id);
1198
- if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);
1199
- }
1200
- return !removeAccepted;
1240
+ return !(attachment.status === "ready" && attachment.file !== void 0 && accepted.has(attachment.file.id));
1201
1241
  })
1202
1242
  );
1203
1243
  }, []);
1204
1244
  const clear = useCallback3(() => {
1205
1245
  sources.current.clear();
1206
- setAttachments((current) => {
1207
- for (const attachment of current) {
1208
- if (attachment.previewUrl) {
1209
- URL.revokeObjectURL(attachment.previewUrl);
1210
- }
1211
- }
1212
- return [];
1213
- });
1214
- }, []);
1246
+ revokeAllPreviews();
1247
+ setAttachments([]);
1248
+ }, [revokeAllPreviews]);
1215
1249
  return {
1216
1250
  attachments,
1217
1251
  readyResources: attachments.flatMap(
@@ -1230,7 +1264,7 @@ function useFileAttachments(options = {}) {
1230
1264
  }
1231
1265
 
1232
1266
  // src/hooks/use-turn-queue.ts
1233
- import { useCallback as useCallback4, useEffect as useEffect3, useLayoutEffect, useMemo as useMemo3, useRef as useRef3, useState as useState4 } from "react";
1267
+ import { useCallback as useCallback4, useEffect as useEffect4, useLayoutEffect, useMemo as useMemo3, useRef as useRef3, useState as useState4 } from "react";
1234
1268
  function isTurnQueueEvent(event) {
1235
1269
  return event.type.startsWith("turn.") || event.type.startsWith("session.queue.") || event.type.startsWith("session.control.") || event.type.startsWith("system.update.") || event.type.startsWith("workspace.inference.");
1236
1270
  }
@@ -1244,6 +1278,7 @@ function useTurnQueue(sessionId, options = {}) {
1244
1278
  const { client, workspaceId, workspaceControlEvent, registerSessionReconciler } = useEmbeddedSession(options);
1245
1279
  const enabled = (options.enabled ?? true) && Boolean(sessionId);
1246
1280
  const targetKey = `${workspaceId}\0${sessionId ?? ""}`;
1281
+ const pageLive = usePageLiveActivity();
1247
1282
  const [snapshot, setSnapshot] = useState4(null);
1248
1283
  const [stateTargetKey, setStateTargetKey] = useState4(targetKey);
1249
1284
  const [loading, setLoading] = useState4(enabled);
@@ -1312,29 +1347,39 @@ function useTurnQueue(sessionId, options = {}) {
1312
1347
  },
1313
1348
  [client, workspaceId, sessionId, acceptSnapshot]
1314
1349
  );
1315
- useEffect3(() => {
1316
- if (!enabled) {
1350
+ useEffect4(() => {
1351
+ if (!enabled || !pageLive) {
1317
1352
  setLoading(false);
1318
1353
  return;
1319
1354
  }
1320
1355
  setLoading(true);
1321
- void load();
1322
1356
  const pollIntervalMs = options.pollIntervalMs;
1323
1357
  if (pollIntervalMs === void 0 || pollIntervalMs <= 0) {
1358
+ void load();
1324
1359
  return () => {
1325
1360
  readGeneration.current += 1;
1326
1361
  };
1327
1362
  }
1328
- const timer = setInterval(() => void load(), pollIntervalMs);
1363
+ let cancelled = false;
1364
+ let timer = null;
1365
+ const schedule = () => {
1366
+ if (cancelled) return;
1367
+ timer = setTimeout(() => {
1368
+ timer = null;
1369
+ void load().finally(schedule);
1370
+ }, pollIntervalMs);
1371
+ };
1372
+ void load().finally(schedule);
1329
1373
  return () => {
1330
- clearInterval(timer);
1374
+ cancelled = true;
1375
+ if (timer !== null) clearTimeout(timer);
1331
1376
  readGeneration.current += 1;
1332
1377
  };
1333
- }, [load, enabled, options.pollIntervalMs]);
1334
- useEffect3(() => {
1378
+ }, [load, enabled, pageLive, options.pollIntervalMs]);
1379
+ useEffect4(() => {
1335
1380
  if (enabled && workspaceControlEvent) void load();
1336
1381
  }, [enabled, load, workspaceControlEvent]);
1337
- useEffect3(() => {
1382
+ useEffect4(() => {
1338
1383
  if (!sessionId || !enabled) return;
1339
1384
  return registerSessionReconciler(sessionId, "queue", load);
1340
1385
  }, [enabled, load, registerSessionReconciler, sessionId]);
@@ -1491,7 +1536,7 @@ function asError(cause) {
1491
1536
 
1492
1537
  // src/hooks/use-goal.ts
1493
1538
  import { OpenGeniApiError } from "@opengeni/sdk";
1494
- import { useCallback as useCallback5, useEffect as useEffect4, useRef as useRef4, useState as useState5 } from "react";
1539
+ import { useCallback as useCallback5, useEffect as useEffect5, useRef as useRef4, useState as useState5 } from "react";
1495
1540
  function isGoalEvent(event) {
1496
1541
  return event.type.startsWith("goal.");
1497
1542
  }
@@ -1504,6 +1549,7 @@ function useGoal(sessionId, options = {}) {
1504
1549
  const enabled = (options.enabled ?? true) && Boolean(sessionId);
1505
1550
  const sharedEvents = options.events;
1506
1551
  const sharedFeed = sharedEvents !== void 0;
1552
+ const pageLive = usePageLiveActivity();
1507
1553
  const [goal, setGoal] = useState5(null);
1508
1554
  const [loading, setLoading] = useState5(enabled);
1509
1555
  const [error, setError] = useState5(null);
@@ -1535,14 +1581,14 @@ function useGoal(sessionId, options = {}) {
1535
1581
  setLoading(false);
1536
1582
  }
1537
1583
  }, [client, workspaceId, sessionId]);
1538
- useEffect4(() => {
1584
+ useEffect5(() => {
1539
1585
  const targetKey = `${workspaceId} ${sessionId ?? ""}`;
1540
1586
  if (targetKeyRef.current !== targetKey) {
1541
1587
  targetKeyRef.current = targetKey;
1542
1588
  setGoal(null);
1543
1589
  setError(null);
1544
1590
  }
1545
- if (!enabled) {
1591
+ if (!enabled || !pageLive) {
1546
1592
  setLoading(false);
1547
1593
  return;
1548
1594
  }
@@ -1553,19 +1599,29 @@ function useGoal(sessionId, options = {}) {
1553
1599
  };
1554
1600
  }
1555
1601
  setLoading(true);
1556
- void load();
1557
1602
  const pollIntervalMs = options.pollIntervalMs;
1558
1603
  if (pollIntervalMs === void 0 || pollIntervalMs <= 0) {
1604
+ void load();
1559
1605
  return () => {
1560
1606
  generation.current += 1;
1561
1607
  };
1562
1608
  }
1563
- const timer = setInterval(() => void load(), pollIntervalMs);
1609
+ let cancelled = false;
1610
+ let timer = null;
1611
+ const schedule = () => {
1612
+ if (cancelled) return;
1613
+ timer = setTimeout(() => {
1614
+ timer = null;
1615
+ void load().finally(schedule);
1616
+ }, pollIntervalMs);
1617
+ };
1618
+ void load().finally(schedule);
1564
1619
  return () => {
1565
- clearInterval(timer);
1620
+ cancelled = true;
1621
+ if (timer !== null) clearTimeout(timer);
1566
1622
  generation.current += 1;
1567
1623
  };
1568
- }, [load, enabled, workspaceId, sessionId, options.pollIntervalMs, sharedFeed]);
1624
+ }, [load, enabled, pageLive, workspaceId, sessionId, options.pollIntervalMs, sharedFeed]);
1569
1625
  const scheduleRefresh = useDebouncedCallback(() => void load());
1570
1626
  useSessionEventTrigger(client, workspaceId, sessionId, isGoalRefreshEvent, scheduleRefresh, {
1571
1627
  enabled,
@@ -1632,7 +1688,7 @@ function useGoal(sessionId, options = {}) {
1632
1688
  }
1633
1689
 
1634
1690
  // src/hooks/use-session-lineage.ts
1635
- import { useCallback as useCallback6, useEffect as useEffect5, useRef as useRef5 } from "react";
1691
+ import { useCallback as useCallback6, useEffect as useEffect6, useRef as useRef5 } from "react";
1636
1692
  function isLineageRefreshEvent(event) {
1637
1693
  if (event.type === "session.status.changed" || event.type === "session.created") {
1638
1694
  return true;
@@ -1661,16 +1717,16 @@ function useSessionLineage(sessionId, options = {}) {
1661
1717
  );
1662
1718
  const state = usePolledValue(load, { pollIntervalMs: options.pollIntervalMs, enabled });
1663
1719
  const refresh = state.refresh;
1664
- useEffect5(() => {
1720
+ useEffect6(() => {
1665
1721
  if (enabled && workspaceControlEvent) void refresh();
1666
1722
  }, [enabled, refresh, workspaceControlEvent]);
1667
- useEffect5(() => {
1723
+ useEffect6(() => {
1668
1724
  if (!sessionId || !enabled) return;
1669
1725
  return registerSessionReconciler(sessionId, "lineage", refresh);
1670
1726
  }, [enabled, refresh, registerSessionReconciler, sessionId]);
1671
1727
  const refreshSoon = useDebouncedCallback(() => void refresh(), 150);
1672
1728
  const delayedChildRefreshRef = useRef5(null);
1673
- useEffect5(() => {
1729
+ useEffect6(() => {
1674
1730
  return () => {
1675
1731
  if (delayedChildRefreshRef.current !== null) {
1676
1732
  clearTimeout(delayedChildRefreshRef.current);
@@ -1814,7 +1870,7 @@ function useSessionControl(sessionId, options = {}) {
1814
1870
  }
1815
1871
 
1816
1872
  // src/hooks/use-session-mcp-approval-policy.ts
1817
- import { useCallback as useCallback8, useEffect as useEffect6, useLayoutEffect as useLayoutEffect3, useMemo as useMemo4, useRef as useRef7, useState as useState6 } from "react";
1873
+ import { useCallback as useCallback8, useEffect as useEffect7, useLayoutEffect as useLayoutEffect3, useMemo as useMemo4, useRef as useRef7, useState as useState6 } from "react";
1818
1874
  function isSessionMcpApprovalPolicyEvent(event, serverId) {
1819
1875
  if (event.type !== "session.mcp.approval_policy.updated") {
1820
1876
  return false;
@@ -1858,7 +1914,7 @@ function useSessionMcpApprovalPolicy(sessionId, serverId, options = {}) {
1858
1914
  enabled,
1859
1915
  pollIntervalMs: options.pollIntervalMs
1860
1916
  });
1861
- useEffect6(() => {
1917
+ useEffect7(() => {
1862
1918
  if (data?.targetKey === targetKey && data.generation === authoritativeGeneration.current) {
1863
1919
  setOverride(null);
1864
1920
  }
@@ -2008,7 +2064,7 @@ function isRecord(value) {
2008
2064
  }
2009
2065
 
2010
2066
  // src/hooks/use-human-input.ts
2011
- import { useCallback as useCallback9, useEffect as useEffect7, useRef as useRef8, useState as useState7 } from "react";
2067
+ import { useCallback as useCallback9, useEffect as useEffect8, useRef as useRef8, useState as useState7 } from "react";
2012
2068
  function isHumanInputEvent(event) {
2013
2069
  return event.type === "session.humanInput.requested" || event.type === "user.humanInputResponse" || event.type === "turn.completed" || event.type === "turn.failed" || event.type === "turn.cancelled";
2014
2070
  }
@@ -2026,11 +2082,11 @@ function useHumanInputRequests(sessionId, options = {}) {
2026
2082
  const mutation = useMutationRunner(`${workspaceId}\0${sessionId ?? ""}`);
2027
2083
  const [respondingRequestId, setRespondingRequestId] = useState7(null);
2028
2084
  const respondingRequestRef = useRef8(null);
2029
- useEffect7(() => {
2085
+ useEffect8(() => {
2030
2086
  respondingRequestRef.current = null;
2031
2087
  setRespondingRequestId(null);
2032
2088
  }, [sessionId, workspaceId]);
2033
- useEffect7(() => {
2089
+ useEffect8(() => {
2034
2090
  if (!sessionId || !enabled) return;
2035
2091
  return registerSessionReconciler(sessionId, "human-input", state.refresh);
2036
2092
  }, [enabled, registerSessionReconciler, sessionId, state.refresh]);
@@ -2102,4 +2158,4 @@ export {
2102
2158
  isHumanInputEvent,
2103
2159
  useHumanInputRequests
2104
2160
  };
2105
- //# sourceMappingURL=chunk-SRFUT2ZU.js.map
2161
+ //# sourceMappingURL=chunk-I4MPFDRP.js.map