@opengeni/react 0.45.0 → 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.
- package/README.md +68 -12
- package/dist/{chunk-U3CSCMWA.js → chunk-FK6VG4LL.js} +9 -13
- package/dist/chunk-FK6VG4LL.js.map +1 -0
- package/dist/{chunk-HFO4ERGQ.js → chunk-FWXGSNXT.js} +2 -2
- package/dist/{chunk-SRFUT2ZU.js → chunk-I4MPFDRP.js} +119 -63
- package/dist/chunk-I4MPFDRP.js.map +1 -0
- package/dist/{chunk-EB67J347.js → chunk-KZ73RL76.js} +111 -31
- package/dist/chunk-KZ73RL76.js.map +1 -0
- package/dist/{chunk-LWR4MXSS.js → chunk-LHLYWG5R.js} +10 -1
- package/dist/chunk-LHLYWG5R.js.map +1 -0
- package/dist/{chunk-L3EWO3UK.js → chunk-NJ7M2B6Z.js} +445 -84
- package/dist/chunk-NJ7M2B6Z.js.map +1 -0
- package/dist/{chunk-VCBFUSUZ.js → chunk-O4VXOBGF.js} +3 -3
- package/dist/{chunk-VCBFUSUZ.js.map → chunk-O4VXOBGF.js.map} +1 -1
- package/dist/{chunk-6EDV6YFE.js → chunk-OL6QVXGF.js} +121 -29
- package/dist/chunk-OL6QVXGF.js.map +1 -0
- package/dist/chunk-VZTQ73XT.js +86 -0
- package/dist/chunk-VZTQ73XT.js.map +1 -0
- package/dist/{chunk-EHSYZ4KP.js → chunk-WYA65Y3F.js} +16 -16
- package/dist/chunk-WYA65Y3F.js.map +1 -0
- package/dist/{chunk-FD72GJMK.js → chunk-XCNTXWBB.js} +274 -125
- package/dist/chunk-XCNTXWBB.js.map +1 -0
- package/dist/client.d.ts +1 -1
- package/dist/components/chat-composer.d.ts +7 -2
- package/dist/components/composer-transcription-control.d.ts +2 -0
- package/dist/components/composer.d.ts +14 -0
- package/dist/components/machines/machine-detail.d.ts +3 -1
- package/dist/components/machines-dashboard.d.ts +3 -3
- package/dist/components/message-timeline.d.ts +12 -2
- package/dist/components/sandbox-files.d.ts +2 -2
- package/dist/components/sandbox-terminal.d.ts +29 -0
- package/dist/components/sandbox-workspace.d.ts +5 -1
- package/dist/components/workspace-dock.d.ts +3 -1
- package/dist/composer.d.ts +2 -2
- package/dist/composer.js +6 -6
- package/dist/hooks/internal.d.ts +6 -0
- package/dist/hooks/use-codex-accounts.d.ts +1 -1
- package/dist/hooks/use-environments.d.ts +10 -4
- package/dist/hooks/use-machines.d.ts +7 -0
- package/dist/hooks/use-sandbox-files.d.ts +19 -0
- package/dist/hooks/use-sandbox-git.d.ts +7 -0
- package/dist/hooks/use-transcription.d.ts +2 -2
- package/dist/hooks/use-voice-input.d.ts +13 -4
- package/dist/index.d.ts +6 -5
- package/dist/index.js +904 -538
- package/dist/index.js.map +1 -1
- package/dist/lib/composer-responsive-context.d.ts +9 -0
- package/dist/lib/use-portal-token-style.d.ts +14 -3
- package/dist/machines.js +2 -2
- package/dist/{queue-surface-implementation-J4XJFKRW.js → queue-surface-implementation-U5JFG7HT.js} +19 -18
- package/dist/queue-surface-implementation-U5JFG7HT.js.map +1 -0
- package/dist/realtime/realtime-control.d.ts +9 -0
- package/dist/realtime.js +29 -32
- package/dist/realtime.js.map +1 -1
- package/dist/session-ui.js +5 -5
- package/dist/session.js +4 -4
- package/dist/timeline/activity-rail.d.ts +3 -2
- package/dist/timeline/index.d.ts +2 -2
- package/dist/timeline/parsers.d.ts +3 -3
- package/dist/timeline/registry.d.ts +3 -0
- package/dist/timeline/screenshot-lightbox.d.ts +1 -1
- package/dist/timeline/types.d.ts +4 -0
- package/dist/voice-recording-store.d.ts +8 -2
- package/package.json +20 -4
- package/src/client.ts +3 -0
- package/src/components/chat-composer.tsx +12 -2
- package/src/components/code-editor.tsx +1 -1
- package/src/components/command-palette.tsx +1 -1
- package/src/components/composer-transcription-control.tsx +41 -16
- package/src/components/composer.tsx +52 -26
- package/src/components/copy-button.tsx +2 -2
- package/src/components/desktop-viewer.tsx +2 -2
- package/src/components/file-browser.tsx +39 -17
- package/src/components/human-input-form.tsx +2 -2
- package/src/components/machine-card.tsx +1 -1
- package/src/components/machines/machine-detail.tsx +39 -15
- package/src/components/machines-dashboard.tsx +7 -6
- package/src/components/message-timeline.tsx +44 -11
- package/src/components/model-picker.tsx +2 -2
- package/src/components/model-policy-picker.tsx +16 -15
- package/src/components/queue-surface-implementation.tsx +20 -16
- package/src/components/queue-surface-state.tsx +2 -2
- package/src/components/sandbox-files.tsx +140 -60
- package/src/components/sandbox-terminal.tsx +24 -5
- package/src/components/sandbox-workspace.tsx +180 -142
- package/src/components/session-chrome.tsx +14 -14
- package/src/components/tooltip.tsx +13 -16
- package/src/components/user-message-body.tsx +1 -1
- package/src/components/workbench-changes.tsx +4 -4
- package/src/components/workspace-dock.tsx +13 -5
- package/src/composer.ts +3 -0
- package/src/hooks/internal.ts +132 -38
- package/src/hooks/use-codex-accounts.ts +4 -4
- package/src/hooks/use-environments.ts +24 -5
- package/src/hooks/use-file-attachments.ts +70 -32
- package/src/hooks/use-goal.ts +17 -5
- package/src/hooks/use-machines.ts +47 -1
- package/src/hooks/use-sandbox-files.ts +310 -59
- package/src/hooks/use-sandbox-git.ts +148 -41
- package/src/hooks/use-session-capabilities.ts +35 -24
- package/src/hooks/use-session-events.ts +18 -4
- package/src/hooks/use-transcription.ts +4 -14
- package/src/hooks/use-turn-queue.ts +17 -5
- package/src/hooks/use-voice-input.ts +481 -36
- package/src/hooks/use-windowed-sections.ts +9 -7
- package/src/index.ts +11 -6
- package/src/lib/composer-responsive-context.ts +15 -0
- package/src/lib/use-portal-token-style.ts +60 -15
- package/src/provider.tsx +52 -7
- package/src/realtime/dropdown-menu.tsx +15 -19
- package/src/realtime/realtime-control.tsx +18 -7
- package/src/timeline/activity-rail.tsx +15 -6
- package/src/timeline/index.ts +1 -1
- package/src/timeline/parsers.ts +33 -20
- package/src/timeline/projection.ts +23 -0
- package/src/timeline/registry.ts +7 -0
- package/src/timeline/screenshot-lightbox.tsx +15 -4
- package/src/timeline/shared.tsx +8 -8
- package/src/timeline/tool-renderers.tsx +166 -22
- package/src/timeline/turn-summary.tsx +6 -6
- package/src/timeline/types.ts +4 -0
- package/src/voice-recording-store.ts +15 -0
- package/styles/compiled.css +5065 -0
- package/styles/compiled.d.ts +2 -0
- package/styles/effective-tokens.css +27 -0
- package/styles/index.css +3 -0
- package/styles/responsive.css +196 -0
- package/styles/responsive.d.ts +2 -0
- package/styles/tokens.css +50 -17
- package/dist/chunk-6EDV6YFE.js.map +0 -1
- package/dist/chunk-EB67J347.js.map +0 -1
- package/dist/chunk-EHSYZ4KP.js.map +0 -1
- package/dist/chunk-FD72GJMK.js.map +0 -1
- package/dist/chunk-JB5725BI.js +0 -48
- package/dist/chunk-JB5725BI.js.map +0 -1
- package/dist/chunk-L3EWO3UK.js.map +0 -1
- package/dist/chunk-LWR4MXSS.js.map +0 -1
- package/dist/chunk-SRFUT2ZU.js.map +0 -1
- package/dist/chunk-U3CSCMWA.js.map +0 -1
- package/dist/queue-surface-implementation-J4XJFKRW.js.map +0 -1
- /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
|
|
54
|
+
The styled root surface ships with ready-to-use CSS. Import it once; the host
|
|
55
|
+
does not need Tailwind:
|
|
55
56
|
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
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
|
-
- `
|
|
370
|
-
|
|
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
|
|
478
|
-
`
|
|
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-
|
|
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
|
|
25
|
-
return /* @__PURE__ */ jsx(TooltipSourceContext.Provider, { value:
|
|
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
|
-
|
|
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
|
|
56
|
-
const
|
|
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-
|
|
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-
|
|
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-
|
|
1073
|
+
//# sourceMappingURL=chunk-FWXGSNXT.js.map
|
|
@@ -2,13 +2,14 @@ import {
|
|
|
2
2
|
buildTimeline,
|
|
3
3
|
groupTimeline,
|
|
4
4
|
sessionStatusFromEvents
|
|
5
|
-
} from "./chunk-
|
|
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-
|
|
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 || !
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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(
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1374
|
+
cancelled = true;
|
|
1375
|
+
if (timer !== null) clearTimeout(timer);
|
|
1331
1376
|
readGeneration.current += 1;
|
|
1332
1377
|
};
|
|
1333
|
-
}, [load, enabled, options.pollIntervalMs]);
|
|
1334
|
-
|
|
1378
|
+
}, [load, enabled, pageLive, options.pollIntervalMs]);
|
|
1379
|
+
useEffect4(() => {
|
|
1335
1380
|
if (enabled && workspaceControlEvent) void load();
|
|
1336
1381
|
}, [enabled, load, workspaceControlEvent]);
|
|
1337
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1720
|
+
useEffect6(() => {
|
|
1665
1721
|
if (enabled && workspaceControlEvent) void refresh();
|
|
1666
1722
|
}, [enabled, refresh, workspaceControlEvent]);
|
|
1667
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
2085
|
+
useEffect8(() => {
|
|
2030
2086
|
respondingRequestRef.current = null;
|
|
2031
2087
|
setRespondingRequestId(null);
|
|
2032
2088
|
}, [sessionId, workspaceId]);
|
|
2033
|
-
|
|
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-
|
|
2161
|
+
//# sourceMappingURL=chunk-I4MPFDRP.js.map
|