@opengeni/react 1.4.2 → 1.4.5-canary.37458084490001
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 +17 -6
- package/dist/artifacts.d.ts +1 -0
- package/dist/artifacts.js +22 -15
- package/dist/artifacts.js.map +1 -1
- package/dist/{browser-viewer-WGJ43YGI.js → browser-viewer-CV23VIHB.js} +8 -6
- package/dist/chunk-3ZC6QPOM.js +174 -0
- package/dist/chunk-3ZC6QPOM.js.map +1 -0
- package/dist/{chunk-YVFRBXST.js → chunk-4BCVCJSU.js} +2 -2
- package/dist/{chunk-JHTIMBOL.js → chunk-5JSUNNQN.js} +26 -4
- package/dist/{chunk-JHTIMBOL.js.map → chunk-5JSUNNQN.js.map} +1 -1
- package/dist/{chunk-MDIXFKA3.js → chunk-6FOTSVWU.js} +303 -109
- package/dist/chunk-6FOTSVWU.js.map +1 -0
- package/dist/{chunk-IUHHPMAX.js → chunk-7RRBX5EM.js} +14 -85
- package/dist/chunk-7RRBX5EM.js.map +1 -0
- package/dist/{chunk-L2J3PU7A.js → chunk-7ZB7I3KP.js} +24 -98
- package/dist/chunk-7ZB7I3KP.js.map +1 -0
- package/dist/{chunk-LVS3MH5T.js → chunk-ATIRUHBZ.js} +128 -10
- package/dist/chunk-ATIRUHBZ.js.map +1 -0
- package/dist/chunk-BOFEQC6K.js +162 -0
- package/dist/chunk-BOFEQC6K.js.map +1 -0
- package/dist/{chunk-VCSERYXH.js → chunk-CESBPQP5.js} +309 -162
- package/dist/chunk-CESBPQP5.js.map +1 -0
- package/dist/{chunk-IYQCWGU5.js → chunk-GHJU7XG7.js} +35 -62
- package/dist/chunk-GHJU7XG7.js.map +1 -0
- package/dist/{chunk-G6YRCIYJ.js → chunk-HNVWMDNN.js} +55 -60
- package/dist/chunk-HNVWMDNN.js.map +1 -0
- package/dist/{chunk-PHBFJCEU.js → chunk-I5EGRXXG.js} +110 -7
- package/dist/chunk-I5EGRXXG.js.map +1 -0
- package/dist/{chunk-PBCZL4JP.js → chunk-INIZSNXT.js} +2 -2
- package/dist/{chunk-XS67YG5R.js → chunk-IX3K4THH.js} +24 -3
- package/dist/chunk-IX3K4THH.js.map +1 -0
- package/dist/chunk-IZV5FTJC.js +55 -0
- package/dist/chunk-IZV5FTJC.js.map +1 -0
- package/dist/chunk-JDJJMBB3.js +1883 -0
- package/dist/chunk-JDJJMBB3.js.map +1 -0
- package/dist/{chunk-C5BF4L26.js → chunk-KHF2VRXF.js} +7 -7
- package/dist/{chunk-QMMCJGFI.js → chunk-L5OKM2VX.js} +2 -2
- package/dist/chunk-LHF6BVM4.js +83 -0
- package/dist/chunk-LHF6BVM4.js.map +1 -0
- package/dist/chunk-N7S72EXK.js +25 -0
- package/dist/chunk-N7S72EXK.js.map +1 -0
- package/dist/{chunk-CVYCLFMH.js → chunk-PEHTX3V7.js} +19 -1
- package/dist/chunk-PEHTX3V7.js.map +1 -0
- package/dist/chunk-R5R5RQQD.js +51 -0
- package/dist/chunk-R5R5RQQD.js.map +1 -0
- package/dist/chunk-RI42H5IU.js +326 -0
- package/dist/chunk-RI42H5IU.js.map +1 -0
- package/dist/{chunk-JH7V627O.js → chunk-SHLZMAJN.js} +2 -11
- package/dist/chunk-SHLZMAJN.js.map +1 -0
- package/dist/{chunk-CREMJMVN.js → chunk-TZQSHCZN.js} +692 -1996
- package/dist/chunk-TZQSHCZN.js.map +1 -0
- package/dist/chunk-ZIB4H5LN.js +101 -0
- package/dist/chunk-ZIB4H5LN.js.map +1 -0
- package/dist/client.d.ts +9 -3
- package/dist/clipboard.js +1 -1
- package/dist/components/browser-viewer.d.ts +6 -0
- package/dist/components/composer.d.ts +3 -69
- package/dist/components/human-input-form.d.ts +3 -32
- package/dist/components/markdown.d.ts +8 -0
- package/dist/components/model-policy-picker.d.ts +4 -37
- package/dist/components/opper-mark.d.ts +7 -0
- package/dist/components/provider-recovery-notice.d.ts +15 -0
- package/dist/components/remark-soft-line-breaks.d.ts +38 -0
- package/dist/components/sandbox-workspace.d.ts +13 -0
- package/dist/components/session-chrome.d.ts +5 -3
- package/dist/components/session-conversation.d.ts +15 -3
- package/dist/composer-messages.d.ts +74 -0
- package/dist/composer-messages.js +9 -0
- package/dist/composer.js +15 -10
- package/dist/{computer-viewer-46UIN7F3.js → computer-viewer-K4CKYRX6.js} +4 -4
- package/dist/connect-setup.d.ts +2 -0
- package/dist/connect.d.ts +1 -1
- package/dist/connect.js +21 -6
- package/dist/connect.js.map +1 -1
- package/dist/{embedded-voice-NIL4RDX3.js → embedded-voice-3ZFWWJ6O.js} +6 -4
- package/dist/{embedded-voice-NIL4RDX3.js.map → embedded-voice-3ZFWWJ6O.js.map} +1 -1
- package/dist/hooks/shared-machines-list.d.ts +4 -0
- package/dist/hooks/use-client-config-flags.d.ts +6 -0
- package/dist/hooks/use-computer-session.d.ts +2 -0
- package/dist/hooks/use-goal.d.ts +2 -1
- package/dist/human-input-model.d.ts +40 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +116 -73
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +5 -5
- package/dist/{latest-question-2POFPYNB.js → latest-question-SWC6QEVN.js} +3 -3
- package/dist/lib/clipboard.d.ts +7 -0
- package/dist/lib/provider-recovery.d.ts +49 -0
- package/dist/machines.js +2 -2
- package/dist/model-mark-paths.d.ts +34 -0
- package/dist/model-mark-paths.js +16 -0
- package/dist/model-picker-model.d.ts +111 -0
- package/dist/model-picker-model.js +25 -0
- package/dist/model-picker-model.js.map +1 -0
- package/dist/{model-policy-picker-menu-WRNSRFQC.js → model-policy-picker-menu-NM4RPTY6.js} +6 -4
- package/dist/model-policy-picker-menu-NM4RPTY6.js.map +1 -0
- package/dist/model-policy.d.ts +10 -0
- package/dist/model-policy.js +5 -1
- package/dist/organization-model.d.ts +32 -0
- package/dist/organization-model.js +65 -0
- package/dist/organization-model.js.map +1 -0
- package/dist/{platform-activity-row-PJJVATTZ.js → platform-activity-row-NJ47YBXW.js} +7 -84
- package/dist/platform-activity-row-NJ47YBXW.js.map +1 -0
- package/dist/queue-presentation-model.d.ts +72 -0
- package/dist/queue-presentation-model.js +38 -0
- package/dist/queue-presentation-model.js.map +1 -0
- package/dist/{queue-surface-implementation-67FS7FUI.js → queue-surface-implementation-YPJFQ3O6.js} +24 -252
- package/dist/queue-surface-implementation-YPJFQ3O6.js.map +1 -0
- package/dist/realtime.js +5 -3
- package/dist/{sandbox-files-34CJJNOY.js → sandbox-files-RCVCMXG7.js} +5 -5
- package/dist/sandbox-files-RCVCMXG7.js.map +1 -0
- package/dist/sandbox-label-model.d.ts +23 -0
- package/dist/sandbox-label-model.js +28 -0
- package/dist/sandbox-label-model.js.map +1 -0
- package/dist/session-attention-model.d.ts +8 -0
- package/dist/session-attention-model.js +46 -0
- package/dist/session-attention-model.js.map +1 -0
- package/dist/session-feedback-model.d.ts +20 -0
- package/dist/session-feedback-model.js +56 -0
- package/dist/session-feedback-model.js.map +1 -0
- package/dist/session-list-model.d.ts +96 -0
- package/dist/session-list-model.js +219 -0
- package/dist/session-list-model.js.map +1 -0
- package/dist/session-status-model.d.ts +19 -0
- package/dist/session-ui.js +26 -17
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +8 -6
- package/dist/testing/session-scenarios.d.ts +10 -0
- package/dist/testing/session-scenarios.js +303 -0
- package/dist/testing/session-scenarios.js.map +1 -0
- package/dist/timeline/genie-copy.d.ts +3 -0
- package/dist/timeline/genie-loading.d.ts +11 -0
- package/dist/timeline/index.d.ts +1 -1
- package/dist/timeline/notice-presentation.d.ts +7 -0
- package/dist/timeline/patch-apply-command.d.ts +18 -0
- package/dist/timeline/platform-activity-presentation.d.ts +7 -0
- package/dist/timeline/presented-image.d.ts +6 -1
- package/dist/timeline/question-nav-model.d.ts +23 -0
- package/dist/timeline/registry.d.ts +10 -1
- package/dist/timeline/retained-loaders.d.ts +1 -1
- package/dist/timeline/tool-presentation.d.ts +172 -0
- package/dist/timeline/turn-summary-model.d.ts +90 -0
- package/dist/timeline/turn-summary.d.ts +4 -74
- package/dist/timeline/work-presentation.d.ts +42 -0
- package/dist/timeline-model.d.ts +24 -0
- package/dist/timeline-model.js +152 -0
- package/dist/timeline-model.js.map +1 -0
- package/package.json +47 -3
- package/src/artifacts.ts +1 -0
- package/src/client.ts +9 -3
- package/src/components/browser-viewer.tsx +23 -2
- package/src/components/claude-mark.tsx +2 -1
- package/src/components/composer.tsx +4 -144
- package/src/components/computer-viewer.tsx +139 -30
- package/src/components/grok-mark.tsx +2 -1
- package/src/components/human-input-form.tsx +13 -124
- package/src/components/markdown.tsx +19 -1
- package/src/components/message-timeline.tsx +45 -99
- package/src/components/model-mark.tsx +2 -1
- package/src/components/model-policy-picker-menu.tsx +30 -85
- package/src/components/model-policy-picker.tsx +15 -148
- package/src/components/opper-mark.tsx +18 -0
- package/src/components/provider-recovery-notice.tsx +41 -0
- package/src/components/queue-surface-implementation.tsx +20 -349
- package/src/components/remark-soft-line-breaks.ts +166 -0
- package/src/components/sandbox-workspace.tsx +17 -1
- package/src/components/session-chrome.tsx +114 -99
- package/src/components/session-conversation.tsx +55 -6
- package/src/components/session-list.tsx +1 -1
- package/src/components/session-status.tsx +17 -16
- package/src/composer-messages.ts +150 -0
- package/src/connect-setup.tsx +45 -11
- package/src/connect.ts +1 -1
- package/src/hooks/shared-machines-list.ts +34 -1
- package/src/hooks/use-browser-session.ts +445 -168
- package/src/hooks/use-client-config-flags.ts +8 -0
- package/src/hooks/use-computer-session.ts +334 -98
- package/src/hooks/use-goal.ts +66 -10
- package/src/human-input-model.ts +147 -0
- package/src/index.ts +16 -0
- package/src/lib/clipboard.ts +29 -0
- package/src/lib/format.ts +7 -0
- package/src/lib/provider-recovery.ts +202 -0
- package/src/model-mark-paths.ts +53 -0
- package/src/model-picker-model.ts +330 -0
- package/src/model-policy.ts +43 -2
- package/src/organization-model.ts +118 -0
- package/src/queue-presentation-model.ts +464 -0
- package/src/sandbox-label-model.ts +41 -0
- package/src/session-attention-model.ts +59 -0
- package/src/session-feedback-model.ts +95 -0
- package/src/session-list-model.ts +327 -0
- package/src/session-status-model.ts +62 -0
- package/src/testing/session-scenarios.ts +326 -0
- package/src/timeline/activity-rail.tsx +5 -17
- package/src/timeline/genie-copy.ts +19 -0
- package/src/timeline/genie-loading.tsx +13 -18
- package/src/timeline/index.ts +1 -0
- package/src/timeline/notice-presentation.ts +22 -0
- package/src/timeline/patch-apply-command.tsx +135 -0
- package/src/timeline/platform-activity-presentation.ts +122 -0
- package/src/timeline/platform-activity-row.tsx +6 -96
- package/src/timeline/presented-image.ts +16 -2
- package/src/timeline/question-nav-model.ts +28 -0
- package/src/timeline/registry.ts +11 -1
- package/src/timeline/retained-loaders.ts +9 -4
- package/src/timeline/rolling-activity.tsx +7 -19
- package/src/timeline/tool-presentation.ts +1316 -0
- package/src/timeline/tool-renderers.tsx +226 -1025
- package/src/timeline/turn-summary-model.ts +338 -0
- package/src/timeline/turn-summary.tsx +21 -326
- package/src/timeline/work-presentation.ts +139 -0
- package/src/timeline-model.ts +108 -0
- package/styles/compiled.css +8 -0
- package/styles/connect.css +4 -0
- package/dist/chunk-CREMJMVN.js.map +0 -1
- package/dist/chunk-CVYCLFMH.js.map +0 -1
- package/dist/chunk-G6YRCIYJ.js.map +0 -1
- package/dist/chunk-HXYOSSQO.js +0 -117
- package/dist/chunk-HXYOSSQO.js.map +0 -1
- package/dist/chunk-IUHHPMAX.js.map +0 -1
- package/dist/chunk-IYQCWGU5.js.map +0 -1
- package/dist/chunk-JH7V627O.js.map +0 -1
- package/dist/chunk-L2J3PU7A.js.map +0 -1
- package/dist/chunk-LVS3MH5T.js.map +0 -1
- package/dist/chunk-MDIXFKA3.js.map +0 -1
- package/dist/chunk-PHBFJCEU.js.map +0 -1
- package/dist/chunk-VCSERYXH.js.map +0 -1
- package/dist/chunk-XS67YG5R.js.map +0 -1
- package/dist/platform-activity-row-PJJVATTZ.js.map +0 -1
- package/dist/queue-surface-implementation-67FS7FUI.js.map +0 -1
- /package/dist/{browser-viewer-WGJ43YGI.js.map → browser-viewer-CV23VIHB.js.map} +0 -0
- /package/dist/{chunk-YVFRBXST.js.map → chunk-4BCVCJSU.js.map} +0 -0
- /package/dist/{chunk-PBCZL4JP.js.map → chunk-INIZSNXT.js.map} +0 -0
- /package/dist/{chunk-C5BF4L26.js.map → chunk-KHF2VRXF.js.map} +0 -0
- /package/dist/{chunk-QMMCJGFI.js.map → chunk-L5OKM2VX.js.map} +0 -0
- /package/dist/{computer-viewer-46UIN7F3.js.map → composer-messages.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-WRNSRFQC.js.map → computer-viewer-K4CKYRX6.js.map} +0 -0
- /package/dist/{latest-question-2POFPYNB.js.map → latest-question-SWC6QEVN.js.map} +0 -0
- /package/dist/{sandbox-files-34CJJNOY.js.map → model-mark-paths.js.map} +0 -0
|
@@ -2,12 +2,8 @@
|
|
|
2
2
|
import {
|
|
3
3
|
BillingClassMark,
|
|
4
4
|
ModelMark,
|
|
5
|
-
PickerNavRow
|
|
6
|
-
|
|
7
|
-
defaultModelPolicyPickerMessages,
|
|
8
|
-
effectiveRows,
|
|
9
|
-
groupPresentationFor
|
|
10
|
-
} from "./chunk-L2J3PU7A.js";
|
|
5
|
+
PickerNavRow
|
|
6
|
+
} from "./chunk-7ZB7I3KP.js";
|
|
11
7
|
import {
|
|
12
8
|
MENU_CHECK_CLASS,
|
|
13
9
|
MENU_LABEL_CLASS,
|
|
@@ -15,14 +11,15 @@ import {
|
|
|
15
11
|
MENU_SURFACE_CLASS
|
|
16
12
|
} from "./chunk-PMV53IMM.js";
|
|
17
13
|
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
14
|
+
compactEffortLabel,
|
|
15
|
+
defaultModelPolicyPickerMessages,
|
|
16
|
+
groupPresentationFor,
|
|
17
|
+
modelPickerChoice,
|
|
18
|
+
modelPickerMenuView
|
|
19
|
+
} from "./chunk-3ZC6QPOM.js";
|
|
20
|
+
import {
|
|
21
|
+
labelReasoningEffort
|
|
22
|
+
} from "./chunk-IX3K4THH.js";
|
|
26
23
|
import {
|
|
27
24
|
cn
|
|
28
25
|
} from "./chunk-TXS65BB2.js";
|
|
@@ -33,40 +30,17 @@ import { useRef, useState } from "react";
|
|
|
33
30
|
import { Popover, RadioGroup } from "radix-ui";
|
|
34
31
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
35
32
|
function ModelPolicyPickerMenu(props) {
|
|
36
|
-
const messages = { ...defaultModelPolicyPickerMessages, ...props.messages };
|
|
37
33
|
const [query, setQuery] = useState("");
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
const filtered = rows.filter((row) => {
|
|
42
|
-
const description = groupPresentationFor(props, row.billingClass)?.description;
|
|
43
|
-
const text = `${row.label} ${row.id} ${row.providerLabel} ${row.billingClassLabel} ${description === void 0 ? payerSummaryForModel(row.catalog) : description ?? ""}`.toLowerCase();
|
|
44
|
-
return words.every((word) => text.includes(word));
|
|
45
|
-
});
|
|
46
|
-
const matchingIds = new Set(filtered.map((row) => row.id));
|
|
47
|
-
const groups = groupPickerRowsByBillingClass(rows, {
|
|
48
|
-
codexOnly: props.codexOnly === true,
|
|
49
|
-
selectedId: props.model,
|
|
50
|
-
collapseScopes: props.collapseScopes !== false
|
|
51
|
-
}).map((group) => {
|
|
52
|
-
const presentation = groupPresentationFor(props, group.billingClass);
|
|
53
|
-
const override = presentation?.description;
|
|
54
|
-
const defaultHint = props.collapseScopes === false && messages.billingHints[group.billingClass] === defaultModelPolicyPickerMessages.billingHints[group.billingClass] ? SCOPED_BILLING_HINTS[group.billingClass] ?? messages.billingHints[group.billingClass] : messages.billingHints[group.billingClass];
|
|
55
|
-
return {
|
|
56
|
-
...group,
|
|
57
|
-
label: presentation?.label ?? group.label,
|
|
58
|
-
rows: group.rows.filter((row) => matchingIds.has(row.id)),
|
|
59
|
-
description: override === void 0 ? group.billingClass === "opengeni_credits" ? null : defaultHint : override
|
|
60
|
-
};
|
|
61
|
-
}).filter((group) => group.rows.length > 0);
|
|
34
|
+
const view = modelPickerMenuView(props, query);
|
|
35
|
+
const { messages, rows, groups } = view;
|
|
36
|
+
const selected = view.selected;
|
|
62
37
|
const choose = (row) => {
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
props.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
38
|
+
if (props.disabled) return;
|
|
39
|
+
const choice = modelPickerChoice(props, row);
|
|
40
|
+
if (!choice) return;
|
|
41
|
+
if (choice.model !== null) props.onModelChange(choice.model);
|
|
42
|
+
props.onEffortChange(choice.effort);
|
|
43
|
+
if (choice.latencyMode !== null) props.onLatencyModeChange(choice.latencyMode);
|
|
70
44
|
};
|
|
71
45
|
const modelRow = (row) => /* @__PURE__ */ jsx(
|
|
72
46
|
PickerNavRow,
|
|
@@ -169,12 +143,12 @@ function ModelPolicyPickerMenu(props) {
|
|
|
169
143
|
},
|
|
170
144
|
group.billingClass
|
|
171
145
|
)),
|
|
172
|
-
|
|
146
|
+
view.matchCount === 0 ? /* @__PURE__ */ jsx("p", { className: MENU_NOTE_CLASS, children: view.searching ? messages.noMatches : messages.noModels }) : null
|
|
173
147
|
] }) : props.connectModelsHref || rows.length > 0 ? /* @__PURE__ */ jsx(ConnectModelsPanel, { href: props.connectModelsHref, messages }) : /* @__PURE__ */ jsx("p", { className: MENU_NOTE_CLASS, children: messages.noModels })
|
|
174
148
|
}
|
|
175
149
|
),
|
|
176
|
-
|
|
177
|
-
|
|
150
|
+
view.anySelectable && selected && (view.unsupportedAttachments || view.thinking) ? /* @__PURE__ */ jsxs("div", { className: "border-t border-og-border px-2.5 py-2.5", children: [
|
|
151
|
+
view.unsupportedAttachments ? /* @__PURE__ */ jsx("p", { className: "pb-1.5 text-og-control leading-relaxed text-og-fg-subtle", children: messages.unsupportedAttachments }) : null,
|
|
178
152
|
/* @__PURE__ */ jsx(ModelThinkingControls, { ...props })
|
|
179
153
|
] }) : null
|
|
180
154
|
]
|
|
@@ -225,14 +199,13 @@ function ConnectModelsPanel(props) {
|
|
|
225
199
|
] });
|
|
226
200
|
}
|
|
227
201
|
function ModelThinkingControls(props) {
|
|
228
|
-
const
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
const messages =
|
|
232
|
-
const
|
|
233
|
-
const showThinking =
|
|
234
|
-
const showFast =
|
|
235
|
-
if (!showThinking && !showFast) return null;
|
|
202
|
+
const view = modelPickerMenuView(props, "");
|
|
203
|
+
const thinking = view.thinking;
|
|
204
|
+
if (!view.selected || !thinking) return null;
|
|
205
|
+
const messages = view.messages;
|
|
206
|
+
const efforts = thinking.efforts;
|
|
207
|
+
const showThinking = thinking.showThinking;
|
|
208
|
+
const showFast = thinking.showFast;
|
|
236
209
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-2 text-og-control", "data-testid": "model-picker-reasoning", children: [
|
|
237
210
|
/* @__PURE__ */ jsxs("div", { className: "flex min-h-7 items-center justify-between gap-3", children: [
|
|
238
211
|
showThinking ? /* @__PURE__ */ jsx("span", { className: "text-og-fg-subtle", children: messages.thinking }) : /* @__PURE__ */ jsx("span", {}),
|
|
@@ -241,7 +214,7 @@ function ModelThinkingControls(props) {
|
|
|
241
214
|
{
|
|
242
215
|
type: "button",
|
|
243
216
|
"data-testid": "model-picker-fast",
|
|
244
|
-
disabled: props.disabled ||
|
|
217
|
+
disabled: props.disabled || thinking.disabled,
|
|
245
218
|
"aria-pressed": props.latencyMode === "fast",
|
|
246
219
|
title: messages.fast + " \xB7 " + messages.fastRateHint,
|
|
247
220
|
onClick: () => props.onLatencyModeChange(props.latencyMode === "fast" ? "standard" : "fast"),
|
|
@@ -258,8 +231,8 @@ function ModelThinkingControls(props) {
|
|
|
258
231
|
RadioGroup.Root,
|
|
259
232
|
{
|
|
260
233
|
"aria-label": messages.thinkingEffort,
|
|
261
|
-
value:
|
|
262
|
-
disabled: props.disabled ||
|
|
234
|
+
value: thinking.value,
|
|
235
|
+
disabled: props.disabled || thinking.disabled,
|
|
263
236
|
onValueChange: (value) => props.onEffortChange(value),
|
|
264
237
|
orientation: "horizontal",
|
|
265
238
|
className: "flex flex-wrap gap-0.5 rounded-og-md bg-og-surface-2 p-0.5",
|
|
@@ -270,7 +243,7 @@ function ModelThinkingControls(props) {
|
|
|
270
243
|
"aria-label": labelReasoningEffort(effort),
|
|
271
244
|
title: labelReasoningEffort(effort),
|
|
272
245
|
className: "min-h-8 min-w-10 flex-1 cursor-pointer whitespace-nowrap rounded-og-sm px-1.5 text-og-control text-og-fg-muted outline-hidden transition-colors hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 data-[state=checked]:bg-og-surface-1 data-[state=checked]:text-og-fg data-[state=checked]:shadow-sm disabled:cursor-not-allowed disabled:opacity-50",
|
|
273
|
-
children: effort
|
|
246
|
+
children: compactEffortLabel(effort, labelReasoningEffort(effort))
|
|
274
247
|
},
|
|
275
248
|
effort
|
|
276
249
|
))
|
|
@@ -317,4 +290,4 @@ export {
|
|
|
317
290
|
ModelPolicyPickerMenu,
|
|
318
291
|
ModelPolicyPickerPopover
|
|
319
292
|
};
|
|
320
|
-
//# sourceMappingURL=chunk-
|
|
293
|
+
//# sourceMappingURL=chunk-GHJU7XG7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/model-policy-picker-menu.tsx"],"sourcesContent":["import type { ClientModel, ReasoningEffort } from \"@opengeni/sdk\";\nimport { ArrowRightIcon, CheckIcon, SearchIcon, ZapIcon } from \"lucide-react\";\nimport { useRef, useState, type RefObject, type CSSProperties } from \"react\";\nimport { Popover, RadioGroup } from \"radix-ui\";\nimport { cn } from \"../lib/cn\";\nimport {\n MENU_CHECK_CLASS,\n MENU_LABEL_CLASS,\n MENU_NOTE_CLASS,\n MENU_SURFACE_CLASS,\n} from \"../lib/menu-styles\";\nimport { labelReasoningEffort, type PickerModelRow } from \"../model-policy\";\nimport {\n compactEffortLabel,\n groupPresentationFor,\n modelPickerChoice,\n modelPickerMenuView,\n} from \"../model-picker-model\";\nimport {\n BillingClassMark,\n defaultModelPolicyPickerMessages,\n PickerNavRow,\n type ModelPolicyPickerProps,\n} from \"./model-policy-picker\";\nimport { ModelMark } from \"./model-mark\";\ntype ClientPickerModelRow = PickerModelRow<ClientModel>;\n\n/** Model selection stays flat; reasoning never becomes a navigation destination. */\nexport function ModelPolicyPickerMenu(props: ModelPolicyPickerProps) {\n const [query, setQuery] = useState(\"\");\n const view = modelPickerMenuView(props, query);\n const { messages, rows, groups } = view;\n const selected = view.selected;\n const choose = (row: ClientPickerModelRow) => {\n if (props.disabled) return;\n const choice = modelPickerChoice(props, row);\n if (!choice) return;\n if (choice.model !== null) props.onModelChange(choice.model);\n // Hosts may commit the combined model/effort draft through this callback.\n props.onEffortChange(choice.effort);\n if (choice.latencyMode !== null) props.onLatencyModeChange(choice.latencyMode);\n };\n const modelRow = (row: ClientPickerModelRow) => (\n <PickerNavRow\n key={row.id}\n icon={\n props.collapseScopes === false ? undefined : (\n <ModelMark model={row.catalog} className=\"size-4 text-og-fg-muted\" />\n )\n }\n label={row.label}\n hint={row.unavailableReason ?? row.fundingHint}\n disabled={props.disabled || !row.selectable}\n title={[row.label, row.unavailableReason ?? row.fundingHint].filter(Boolean).join(\" · \")}\n active={row.selectable && row.id === props.model}\n showChevron={false}\n trailing={\n row.catalog.cost === \"free\" || row.id === props.model ? (\n <span className=\"flex items-center gap-2\">\n {row.catalog.cost === \"free\" ? (\n <span className=\"rounded-full bg-og-surface-2 px-1.5 py-0.5 text-og-control text-og-fg-muted\">\n {messages.free}\n </span>\n ) : null}\n {row.id === props.model ? (\n <CheckIcon className={MENU_CHECK_CLASS} aria-label={messages.selected} />\n ) : null}\n </span>\n ) : null\n }\n testId={`model-picker-choice-${row.id}`}\n onClick={() => choose(row)}\n />\n );\n return (\n <div\n data-testid=\"model-picker-menu\"\n className=\"flex min-h-0 flex-col\"\n onKeyDown={(event) => {\n if (\n !(event.target instanceof HTMLButtonElement) ||\n ![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)\n )\n return;\n const buttons = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n '[data-testid^=\"model-picker-choice-\"]:not(:disabled)',\n ),\n );\n const index = buttons.indexOf(event.target);\n if (index < 0) return;\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? buttons.length - 1\n : (index + (event.key === \"ArrowDown\" ? 1 : -1) + buttons.length) % buttons.length;\n buttons[next]?.focus();\n }}\n >\n {rows.some((row) => row.selectable) ? (\n <div className=\"border-b border-og-border py-1\">\n <label className=\"og-model-policy-search flex items-center gap-2 px-2.5 py-0.5\">\n <SearchIcon className=\"size-4 shrink-0 text-og-fg-subtle\" aria-hidden />\n <input\n aria-label={messages.searchLabel}\n placeholder={messages.searchPlaceholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key !== \"Escape\" && event.key !== \"Tab\") event.stopPropagation();\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n event.currentTarget\n .closest('[data-testid=\"model-picker-menu\"]')\n ?.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")\n ?.focus();\n }\n }}\n className=\"og-model-policy-search-input h-8 min-w-0 flex-1 bg-transparent text-og-menu text-og-fg outline-hidden placeholder:text-og-fg-subtle\"\n />\n </label>\n </div>\n ) : null}\n {props.error ? (\n <p className={cn(MENU_NOTE_CLASS, \"text-og-sm text-og-status-failed\")} role=\"alert\">\n {props.error}\n </p>\n ) : null}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain py-1\"\n data-testid=\"model-picker-models\"\n >\n {props.loading ? (\n // Rows at the menu's row height, never a sentence, so nothing jumps.\n <div role=\"status\" aria-label={messages.loading}>\n {[58, 44, 66, 50].map((width) => (\n <div key={width} aria-hidden=\"true\" className=\"flex h-8 items-center gap-3 px-2.5\">\n <span className=\"size-4 shrink-0 animate-pulse rounded bg-og-surface-2\" />\n <span\n className=\"h-2.5 animate-pulse rounded bg-og-surface-2\"\n style={{ width: `${width}%` }}\n />\n </div>\n ))}\n </div>\n ) : rows.some((row) => row.selectable) ? (\n <>\n {groups.map((group) => (\n <section\n key={group.billingClass}\n aria-label={group.label}\n className=\"[&+section]:mt-1.5 [&+section]:border-t [&+section]:border-og-border [&+section]:pt-1.5\"\n >\n <div className={cn(MENU_LABEL_CLASS, \"flex items-center gap-2\")}>\n <BillingClassMark\n billingClass={group.billingClass}\n presentation={groupPresentationFor(props, group.billingClass)}\n aria-label=\"\"\n />\n <span className=\"min-w-0 break-words\">{group.label}</span>\n </div>\n {group.description ? (\n <p className=\"break-words px-2.5 pb-1 text-og-sm text-og-fg-muted\">\n {group.description}\n </p>\n ) : null}\n {group.rows.map(modelRow)}\n </section>\n ))}\n {view.matchCount === 0 ? (\n <p className={MENU_NOTE_CLASS}>\n {view.searching ? messages.noMatches : messages.noModels}\n </p>\n ) : null}\n </>\n ) : props.connectModelsHref || rows.length > 0 ? (\n <ConnectModelsPanel href={props.connectModelsHref} messages={messages} />\n ) : (\n <p className={MENU_NOTE_CLASS}>{messages.noModels}</p>\n )}\n </div>\n {view.anySelectable && selected && (view.unsupportedAttachments || view.thinking) ? (\n <div className=\"border-t border-og-border px-2.5 py-2.5\">\n {view.unsupportedAttachments ? (\n <p className=\"pb-1.5 text-og-control leading-relaxed text-og-fg-subtle\">\n {messages.unsupportedAttachments}\n </p>\n ) : null}\n <ModelThinkingControls {...props} />\n </div>\n ) : null}\n </div>\n );\n}\n\nconst CONNECT_MODEL_OPTIONS: Array<{\n billingClass: \"codex_subscription\" | \"supergrok_subscription\" | \"byok\" | \"external\";\n title: string;\n detail: string;\n}> = [\n { billingClass: \"codex_subscription\", title: \"Codex\", detail: \"ChatGPT\" },\n { billingClass: \"supergrok_subscription\", title: \"SuperGrok\", detail: \"xAI\" },\n { billingClass: \"byok\", title: \"AI Gateway\", detail: \"Vercel\" },\n { billingClass: \"external\", title: \"OpenRouter\", detail: \"API key\" },\n];\n\nfunction ConnectModelsPanel(props: {\n href: string | undefined;\n messages: typeof defaultModelPolicyPickerMessages;\n}) {\n return (\n <div className=\"px-1.5 pb-1.5 pt-2\" data-testid=\"model-picker-connect\">\n <div className=\"px-1.5 pb-3\">\n <p className=\"text-og-menu font-medium tracking-tight text-og-fg\">\n {props.messages.connectTitle}\n </p>\n <p className=\"mt-1 text-og-control leading-snug text-og-fg-subtle\">\n {props.messages.connectBody}\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-1\">\n {CONNECT_MODEL_OPTIONS.map((option) => {\n const content = (\n <>\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-og-md bg-og-surface-2 text-og-fg\">\n <BillingClassMark\n billingClass={option.billingClass}\n aria-label=\"\"\n className=\"size-4 text-og-fg\"\n />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-og-control font-medium text-og-fg\">\n {option.title}\n </span>\n <span className=\"block truncate text-og-control text-og-fg-subtle\">\n {option.detail}\n </span>\n </span>\n </>\n );\n const className =\n \"flex min-w-0 items-center gap-2 rounded-og-md px-1.5 py-1.5 outline-hidden transition-colors hover:bg-og-hover focus-visible:ring-2 focus-visible:ring-og-accent/40\";\n return props.href ? (\n <a key={option.title} href={props.href} className={className}>\n {content}\n </a>\n ) : (\n <div key={option.title} className={className}>\n {content}\n </div>\n );\n })}\n </div>\n {props.href ? (\n <a\n href={props.href}\n className=\"mt-2 flex h-9 w-full items-center justify-center gap-1.5 rounded-og-md border border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover text-og-control font-medium outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n {props.messages.connectAction}\n <ArrowRightIcon className=\"size-3.5\" aria-hidden />\n </a>\n ) : (\n <p className=\"px-1.5 pt-3 text-og-control text-og-fg-subtle\">{props.messages.noModels}</p>\n )}\n </div>\n );\n}\n\nfunction ModelThinkingControls(props: ModelPolicyPickerProps) {\n const view = modelPickerMenuView(props, \"\");\n const thinking = view.thinking;\n if (!view.selected || !thinking) return null;\n const messages = view.messages;\n const efforts = thinking.efforts;\n const showThinking = thinking.showThinking;\n const showFast = thinking.showFast;\n return (\n <div className=\"space-y-2 text-og-control\" data-testid=\"model-picker-reasoning\">\n <div className=\"flex min-h-7 items-center justify-between gap-3\">\n {showThinking ? <span className=\"text-og-fg-subtle\">{messages.thinking}</span> : <span />}\n {showFast ? (\n <button\n type=\"button\"\n data-testid=\"model-picker-fast\"\n disabled={props.disabled || thinking.disabled}\n aria-pressed={props.latencyMode === \"fast\"}\n title={messages.fast + \" · \" + messages.fastRateHint}\n onClick={() =>\n props.onLatencyModeChange(props.latencyMode === \"fast\" ? \"standard\" : \"fast\")\n }\n className=\"flex min-h-8 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-og-sm px-2 text-og-fg-muted hover:bg-og-hover focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50\"\n >\n <ZapIcon className={cn(\"size-3.5\", props.latencyMode === \"fast\" && \"fill-current\")} />\n {messages.fast}\n <span className=\"text-og-fg-subtle\">{messages.fastRateHint}</span>\n </button>\n ) : null}\n </div>\n {showThinking ? (\n <RadioGroup.Root\n aria-label={messages.thinkingEffort}\n value={thinking.value}\n disabled={props.disabled || thinking.disabled}\n onValueChange={(value) => props.onEffortChange(value as ReasoningEffort)}\n orientation=\"horizontal\"\n className=\"flex flex-wrap gap-0.5 rounded-og-md bg-og-surface-2 p-0.5\"\n >\n {efforts.map((effort) => (\n <RadioGroup.Item\n key={effort}\n value={effort}\n aria-label={labelReasoningEffort(effort)}\n title={labelReasoningEffort(effort)}\n className=\"min-h-8 min-w-10 flex-1 cursor-pointer whitespace-nowrap rounded-og-sm px-1.5 text-og-control text-og-fg-muted outline-hidden transition-colors hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 data-[state=checked]:bg-og-surface-1 data-[state=checked]:text-og-fg data-[state=checked]:shadow-sm disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {compactEffortLabel(effort, labelReasoningEffort(effort))}\n </RadioGroup.Item>\n ))}\n </RadioGroup.Root>\n ) : null}\n </div>\n );\n}\n\nexport function ModelPolicyPickerPopover(\n props: ModelPolicyPickerProps & {\n anchor: RefObject<HTMLButtonElement | null>;\n contentId: string;\n portalStyle: CSSProperties;\n },\n) {\n const outside = useRef(false);\n const messages = { ...defaultModelPolicyPickerMessages, ...props.messages };\n return (\n <Popover.Root open onOpenChange={(open) => props.onOpenChange?.(open)}>\n <Popover.Anchor virtualRef={props.anchor} />\n <Popover.Portal>\n <Popover.Content\n id={props.contentId}\n aria-label={messages.label}\n align=\"start\"\n side={props.menuSide ?? \"bottom\"}\n sideOffset={8}\n collisionPadding={12}\n onInteractOutside={(event) => {\n if (props.anchor.current?.contains(event.target as Node)) event.preventDefault();\n else outside.current = true;\n }}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (!outside.current) props.anchor.current?.focus();\n }}\n className={cn(\n MENU_SURFACE_CLASS,\n \"og-root og-model-policy-menu z-50 flex max-h-[min(32rem,var(--radix-popover-content-available-height))] w-[22rem] max-w-[calc(100vw-16px)] flex-col overflow-hidden p-[var(--og-model-picker-menu-padding)]\",\n props.contentClassName,\n )}\n style={{ ...props.portalStyle, ...props.contentStyle }}\n data-testid=\"model-picker-content\"\n >\n <ModelPolicyPickerMenu {...props} />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,10 @@ import {
|
|
|
3
3
|
buildTimeline,
|
|
4
4
|
groupTimeline,
|
|
5
5
|
sessionStatusFromEvents
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-L5OKM2VX.js";
|
|
7
|
+
import {
|
|
8
|
+
isActionableHumanInputRequest
|
|
9
|
+
} from "./chunk-IZV5FTJC.js";
|
|
7
10
|
import {
|
|
8
11
|
useDebouncedCallback,
|
|
9
12
|
useMutationRunner,
|
|
@@ -23,53 +26,6 @@ import {
|
|
|
23
26
|
useEmbeddedSessionRead
|
|
24
27
|
} from "./chunk-XTD7TZHW.js";
|
|
25
28
|
|
|
26
|
-
// src/human-input.ts
|
|
27
|
-
function isActionableHumanInputRequest(request, nowMs = Date.now()) {
|
|
28
|
-
if (request.status !== "pending") return false;
|
|
29
|
-
if (!request.expiresAt) return true;
|
|
30
|
-
const deadline = Date.parse(request.expiresAt);
|
|
31
|
-
return Number.isFinite(deadline) && deadline > nowMs;
|
|
32
|
-
}
|
|
33
|
-
function humanInputRequestFromEvent(event) {
|
|
34
|
-
if (event.type !== "session.humanInput.requested" || !isRecord(event.payload)) return null;
|
|
35
|
-
const request = event.payload.request;
|
|
36
|
-
if (!isRecord(request) || typeof request.id !== "string" || !Array.isArray(request.questions)) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
return {
|
|
40
|
-
id: request.id,
|
|
41
|
-
turnId: event.turnId ?? null,
|
|
42
|
-
questions: request.questions,
|
|
43
|
-
allowSkip: request.allowSkip === true,
|
|
44
|
-
expiresAt: typeof request.expiresAt === "string" ? request.expiresAt : null
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
function projectPendingHumanInputRequests(events) {
|
|
48
|
-
const pending = /* @__PURE__ */ new Map();
|
|
49
|
-
for (const event of events) {
|
|
50
|
-
const requested = humanInputRequestFromEvent(event);
|
|
51
|
-
if (requested) {
|
|
52
|
-
pending.set(requested.id, requested);
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
if (event.type === "user.humanInputResponse" && isRecord(event.payload)) {
|
|
56
|
-
if (typeof event.payload.requestId === "string") pending.delete(event.payload.requestId);
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
if (event.type === "turn.completed" || event.type === "turn.failed" || event.type === "turn.cancelled") {
|
|
60
|
-
for (const [id, request] of pending) {
|
|
61
|
-
if (request.turnId === null || event.turnId === null || event.turnId === void 0 || request.turnId === event.turnId) {
|
|
62
|
-
pending.delete(id);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return [...pending.values()];
|
|
68
|
-
}
|
|
69
|
-
function isRecord(value) {
|
|
70
|
-
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
29
|
// src/approvals.ts
|
|
74
30
|
import {
|
|
75
31
|
parseToolDisplayMetadata
|
|
@@ -892,7 +848,7 @@ function useSessionEvents(sessionId, options = {}) {
|
|
|
892
848
|
let generation = navigationGenerationRef.current;
|
|
893
849
|
const current = () => ownsNavigation() && generation === navigationGenerationRef.current;
|
|
894
850
|
try {
|
|
895
|
-
const { resolveLatestQuestion } = await import("./latest-question-
|
|
851
|
+
const { resolveLatestQuestion } = await import("./latest-question-SWC6QEVN.js");
|
|
896
852
|
if (!current()) return null;
|
|
897
853
|
const destination = await resolveLatestQuestion({
|
|
898
854
|
client,
|
|
@@ -2253,7 +2209,7 @@ function useSessionControl(sessionId, options = {}) {
|
|
|
2253
2209
|
|
|
2254
2210
|
// src/hooks/use-goal.ts
|
|
2255
2211
|
import { OpenGeniApiError } from "@opengeni/sdk";
|
|
2256
|
-
import { useCallback as useCallback7, useEffect as useEffect6, useRef as useRef7, useState as useState6 } from "react";
|
|
2212
|
+
import { useCallback as useCallback7, useEffect as useEffect6, useLayoutEffect as useLayoutEffect3, useRef as useRef7, useState as useState6 } from "react";
|
|
2257
2213
|
function isGoalEvent(event) {
|
|
2258
2214
|
return event.type.startsWith("goal.");
|
|
2259
2215
|
}
|
|
@@ -2274,7 +2230,13 @@ function useGoal(sessionId, options = {}) {
|
|
|
2274
2230
|
const generation = useRef7(0);
|
|
2275
2231
|
const targetKeyRef = useRef7(null);
|
|
2276
2232
|
const goalAbsentRef = useRef7(false);
|
|
2233
|
+
const pendingRefreshRef = useRef7("none");
|
|
2234
|
+
const sharedEventsRef = useRef7(sharedEvents);
|
|
2235
|
+
useLayoutEffect3(() => {
|
|
2236
|
+
sharedEventsRef.current = sharedEvents;
|
|
2237
|
+
}, [sharedEvents]);
|
|
2277
2238
|
const loadAbort = useRef7(null);
|
|
2239
|
+
const scheduleRefreshRef = useRef7(() => void 0);
|
|
2278
2240
|
const retireLoads = useCallback7(() => {
|
|
2279
2241
|
generation.current += 1;
|
|
2280
2242
|
loadAbort.current?.abort();
|
|
@@ -2285,15 +2247,14 @@ function useGoal(sessionId, options = {}) {
|
|
|
2285
2247
|
return;
|
|
2286
2248
|
}
|
|
2287
2249
|
const ticket = ++generation.current;
|
|
2250
|
+
pendingRefreshRef.current = "none";
|
|
2288
2251
|
loadAbort.current?.abort();
|
|
2289
2252
|
const controller = new AbortController();
|
|
2290
2253
|
loadAbort.current = controller;
|
|
2291
2254
|
try {
|
|
2292
|
-
const fetched = await client.getGoal(workspaceId, sessionId, {
|
|
2293
|
-
signal: controller.signal
|
|
2294
|
-
});
|
|
2255
|
+
const fetched = typeof client.findGoal === "function" ? await client.findGoal(workspaceId, sessionId, { signal: controller.signal }) : await client.getGoal(workspaceId, sessionId, { signal: controller.signal });
|
|
2295
2256
|
if (ticket === generation.current) {
|
|
2296
|
-
goalAbsentRef.current =
|
|
2257
|
+
goalAbsentRef.current = fetched === null;
|
|
2297
2258
|
setGoal(fetched);
|
|
2298
2259
|
setError(null);
|
|
2299
2260
|
setLoading(false);
|
|
@@ -2313,12 +2274,30 @@ function useGoal(sessionId, options = {}) {
|
|
|
2313
2274
|
} finally {
|
|
2314
2275
|
if (loadAbort.current === controller) loadAbort.current = null;
|
|
2315
2276
|
}
|
|
2277
|
+
if (ticket !== generation.current || pendingRefreshRef.current === "none") {
|
|
2278
|
+
return;
|
|
2279
|
+
}
|
|
2280
|
+
if (goalAbsentRef.current && pendingRefreshRef.current === "refresh") {
|
|
2281
|
+
const events = sharedEventsRef.current ?? [];
|
|
2282
|
+
let latestGoalEvent;
|
|
2283
|
+
for (let index = events.length - 1; index >= 0 && !latestGoalEvent; index -= 1) {
|
|
2284
|
+
const event = events[index];
|
|
2285
|
+
if (event && isGoalEvent(event)) latestGoalEvent = event;
|
|
2286
|
+
}
|
|
2287
|
+
if (!latestGoalEvent || latestGoalEvent.type === "goal.cleared") {
|
|
2288
|
+
pendingRefreshRef.current = "none";
|
|
2289
|
+
return;
|
|
2290
|
+
}
|
|
2291
|
+
pendingRefreshRef.current = "goal";
|
|
2292
|
+
}
|
|
2293
|
+
scheduleRefreshRef.current();
|
|
2316
2294
|
}, [client, workspaceId, sessionId]);
|
|
2317
2295
|
useEffect6(() => {
|
|
2318
2296
|
const targetKey = `${workspaceId} ${sessionId ?? ""}`;
|
|
2319
2297
|
if (targetKeyRef.current !== targetKey) {
|
|
2320
2298
|
targetKeyRef.current = targetKey;
|
|
2321
2299
|
goalAbsentRef.current = false;
|
|
2300
|
+
pendingRefreshRef.current = "none";
|
|
2322
2301
|
setGoal(null);
|
|
2323
2302
|
setError(null);
|
|
2324
2303
|
}
|
|
@@ -2367,12 +2346,31 @@ function useGoal(sessionId, options = {}) {
|
|
|
2367
2346
|
retireLoads,
|
|
2368
2347
|
sharedFeed
|
|
2369
2348
|
]);
|
|
2370
|
-
const scheduleRefresh = useDebouncedCallback(() =>
|
|
2349
|
+
const scheduleRefresh = useDebouncedCallback(() => {
|
|
2350
|
+
const pending = pendingRefreshRef.current;
|
|
2351
|
+
if (pending === "none" || loadAbort.current !== null) return;
|
|
2352
|
+
if (pending === "refresh" && goalAbsentRef.current) {
|
|
2353
|
+
pendingRefreshRef.current = "none";
|
|
2354
|
+
return;
|
|
2355
|
+
}
|
|
2356
|
+
void load();
|
|
2357
|
+
});
|
|
2358
|
+
useLayoutEffect3(() => {
|
|
2359
|
+
scheduleRefreshRef.current = scheduleRefresh;
|
|
2360
|
+
}, [scheduleRefresh]);
|
|
2371
2361
|
const isRefreshEvent = useCallback7(
|
|
2372
2362
|
(event) => goalAbsentRef.current ? isGoalEvent(event) : isGoalRefreshEvent(event),
|
|
2373
2363
|
[]
|
|
2374
2364
|
);
|
|
2375
|
-
|
|
2365
|
+
const onRefreshEvent = useCallback7(
|
|
2366
|
+
(event) => {
|
|
2367
|
+
if (isGoalEvent(event)) pendingRefreshRef.current = "goal";
|
|
2368
|
+
else if (pendingRefreshRef.current === "none") pendingRefreshRef.current = "refresh";
|
|
2369
|
+
scheduleRefresh();
|
|
2370
|
+
},
|
|
2371
|
+
[scheduleRefresh]
|
|
2372
|
+
);
|
|
2373
|
+
useSessionEventTrigger(client, workspaceId, sessionId, isRefreshEvent, onRefreshEvent, {
|
|
2376
2374
|
enabled,
|
|
2377
2375
|
...sharedEvents !== void 0 ? { events: sharedEvents } : {}
|
|
2378
2376
|
});
|
|
@@ -2489,9 +2487,6 @@ function conversationTimeline(items, queue, composer) {
|
|
|
2489
2487
|
}
|
|
2490
2488
|
|
|
2491
2489
|
export {
|
|
2492
|
-
isActionableHumanInputRequest,
|
|
2493
|
-
humanInputRequestFromEvent,
|
|
2494
|
-
projectPendingHumanInputRequests,
|
|
2495
2490
|
approvalsFromRequiresAction,
|
|
2496
2491
|
projectPendingApprovals,
|
|
2497
2492
|
invokeOlderHistoryLoaderWithReceiptCapture,
|
|
@@ -2514,4 +2509,4 @@ export {
|
|
|
2514
2509
|
useGoal,
|
|
2515
2510
|
conversationTimeline
|
|
2516
2511
|
};
|
|
2517
|
-
//# sourceMappingURL=chunk-
|
|
2512
|
+
//# sourceMappingURL=chunk-HNVWMDNN.js.map
|