@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
|
@@ -19,15 +19,26 @@ import { useTimelineSearchReveal } from "../components/timeline-search";
|
|
|
19
19
|
import { useEntranceAnimation } from "./entrance";
|
|
20
20
|
import { useFoldMemory, type FoldRestingState } from "./fold-memory";
|
|
21
21
|
import {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
import type { ActivityItem,
|
|
22
|
+
BUILT_IN_TURN_SUMMARY_FACET_IDS,
|
|
23
|
+
createTurnSummaryContext,
|
|
24
|
+
formatElapsed,
|
|
25
|
+
resolveTurnSummaryFacets,
|
|
26
|
+
selectTurnSummaryFacets,
|
|
27
|
+
type TurnSummaryFacetConfiguration,
|
|
28
|
+
type TurnSummaryStatus,
|
|
29
|
+
} from "./turn-summary-model";
|
|
30
|
+
import type { ActivityItem, TurnOutcome } from "./types";
|
|
31
|
+
|
|
32
|
+
export { BUILT_IN_TURN_SUMMARY_FACET_IDS, formatElapsed };
|
|
33
|
+
export type {
|
|
34
|
+
BuiltInTurnSummaryFacetId,
|
|
35
|
+
TurnSummaryContext,
|
|
36
|
+
TurnSummaryFacet,
|
|
37
|
+
TurnSummaryFacetConfiguration,
|
|
38
|
+
TurnSummaryFacetResult,
|
|
39
|
+
TurnSummaryOptions,
|
|
40
|
+
TurnSummaryStatus,
|
|
41
|
+
} from "./turn-summary-model";
|
|
31
42
|
export type { TurnOutcome } from "./types";
|
|
32
43
|
|
|
33
44
|
/* ----------------------------------------------------------------------------
|
|
@@ -55,95 +66,6 @@ export function useTurnSettleOpen(): boolean {
|
|
|
55
66
|
return useContext(TurnSettleChromeContext);
|
|
56
67
|
}
|
|
57
68
|
|
|
58
|
-
export const BUILT_IN_TURN_SUMMARY_FACET_IDS = [
|
|
59
|
-
"steps",
|
|
60
|
-
"files",
|
|
61
|
-
"commands",
|
|
62
|
-
"screenshots",
|
|
63
|
-
"memories",
|
|
64
|
-
"compacted",
|
|
65
|
-
"duration",
|
|
66
|
-
] as const;
|
|
67
|
-
|
|
68
|
-
export type BuiltInTurnSummaryFacetId = (typeof BUILT_IN_TURN_SUMMARY_FACET_IDS)[number];
|
|
69
|
-
|
|
70
|
-
export type TurnSummaryContext = Readonly<{
|
|
71
|
-
/** Every normalized activity item folded into this summary. */
|
|
72
|
-
items: readonly ActivityItem[];
|
|
73
|
-
/** Tool calls from `items`, retained in timeline order for convenient aggregation. */
|
|
74
|
-
toolCalls: readonly ToolCallItem[];
|
|
75
|
-
/** The settled turn verdict, or absent for a neutral/incomplete cluster. */
|
|
76
|
-
outcome: TurnOutcome | undefined;
|
|
77
|
-
/** The bounded failure reason rendered by the enclosing summary, when present. */
|
|
78
|
-
failureText: string | undefined;
|
|
79
|
-
/** Total turn duration when the enclosing group has both valid timestamps. */
|
|
80
|
-
durationMs: number | undefined;
|
|
81
|
-
/** False when any projected activity is still running or streaming. */
|
|
82
|
-
settled: boolean;
|
|
83
|
-
/**
|
|
84
|
-
* Adjacent compaction landmarks next to this fold. Landmark remains the
|
|
85
|
-
* primary UI; this is a secondary chip signal only.
|
|
86
|
-
*/
|
|
87
|
-
contextCompactionCount: number;
|
|
88
|
-
}>;
|
|
89
|
-
|
|
90
|
-
export type TurnSummaryFacetResult = Readonly<{
|
|
91
|
-
icon?: ReactNode;
|
|
92
|
-
content: ReactNode;
|
|
93
|
-
ariaLabel?: string;
|
|
94
|
-
title?: string;
|
|
95
|
-
}>;
|
|
96
|
-
|
|
97
|
-
export type TurnSummaryFacet = Readonly<{
|
|
98
|
-
/** Stable identity used for removal and deterministic de-duplication. */
|
|
99
|
-
id: string;
|
|
100
|
-
/** Return null when this facet has nothing useful to show. */
|
|
101
|
-
summarize(context: TurnSummaryContext): TurnSummaryFacetResult | null;
|
|
102
|
-
}>;
|
|
103
|
-
|
|
104
|
-
type ModifyTurnSummaryFacets = Readonly<{
|
|
105
|
-
/** Appended after the remaining built-ins, in supplied order. */
|
|
106
|
-
add?: readonly TurnSummaryFacet[];
|
|
107
|
-
/** Built-ins to omit before custom facets are appended. */
|
|
108
|
-
remove?: readonly BuiltInTurnSummaryFacetId[];
|
|
109
|
-
replace?: never;
|
|
110
|
-
}>;
|
|
111
|
-
|
|
112
|
-
type ReplaceTurnSummaryFacets = Readonly<{
|
|
113
|
-
/** The complete ordered facet list. Mutually exclusive with add/remove. */
|
|
114
|
-
replace: readonly TurnSummaryFacet[];
|
|
115
|
-
add?: never;
|
|
116
|
-
remove?: never;
|
|
117
|
-
}>;
|
|
118
|
-
|
|
119
|
-
export type TurnSummaryFacetConfiguration = ModifyTurnSummaryFacets | ReplaceTurnSummaryFacets;
|
|
120
|
-
|
|
121
|
-
export type TurnSummaryOptions = Readonly<{
|
|
122
|
-
/**
|
|
123
|
-
* Readable per-turn presentation. Assistant progress stays fully formatted;
|
|
124
|
-
* each turn has its own Working / Worked row and rolling latest step.
|
|
125
|
-
* Ordinary tip-follow and manual scrolling are unchanged.
|
|
126
|
-
*/
|
|
127
|
-
rolling?: boolean;
|
|
128
|
-
facets?: TurnSummaryFacetConfiguration;
|
|
129
|
-
}>;
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Exchange status shown in place of the plain facet line. `working` and
|
|
133
|
-
* `waiting` run a live clock from `since`; `worked` shows the settled span.
|
|
134
|
-
*/
|
|
135
|
-
export type TurnSummaryStatus = Readonly<{
|
|
136
|
-
kind: "working" | "waiting" | "worked";
|
|
137
|
-
/** Replaces the default "Working" / "Waiting" wording. */
|
|
138
|
-
label?: string | undefined;
|
|
139
|
-
/** Live clock start for `working` and `waiting`. */
|
|
140
|
-
since?: string | undefined;
|
|
141
|
-
/** Settled span for `worked`. */
|
|
142
|
-
durationMs?: number | undefined;
|
|
143
|
-
/** Live step preview under the row while it is collapsed. */
|
|
144
|
-
preview?: ReactNode;
|
|
145
|
-
}>;
|
|
146
|
-
|
|
147
69
|
export type TurnSummaryProps = {
|
|
148
70
|
/** Reports the disclosure's actual open state on mount and on every change. */
|
|
149
71
|
onOpenStateChange?: ((open: boolean) => void) | undefined;
|
|
@@ -430,32 +352,7 @@ export function TurnSummary({
|
|
|
430
352
|
);
|
|
431
353
|
const statusKind = status?.kind;
|
|
432
354
|
const facets = useMemo(
|
|
433
|
-
() =>
|
|
434
|
-
facetDefinitions.flatMap((facet) => {
|
|
435
|
-
// The status line owns elapsed time; a live line keeps only the step
|
|
436
|
-
// count (plus host facets) so it stays one short line.
|
|
437
|
-
if (
|
|
438
|
-
statusKind &&
|
|
439
|
-
(facet.id === "duration" ||
|
|
440
|
-
(facet === BUILT_IN_TURN_SUMMARY_FACETS[0] &&
|
|
441
|
-
context.items.every(
|
|
442
|
-
(item) => item.kind === "startup-phase" || item.kind === "agent-message",
|
|
443
|
-
)) ||
|
|
444
|
-
(statusKind !== "worked" &&
|
|
445
|
-
facet.id !== "steps" &&
|
|
446
|
-
BUILT_IN_TURN_SUMMARY_FACET_IDS.includes(facet.id as BuiltInTurnSummaryFacetId)))
|
|
447
|
-
) {
|
|
448
|
-
return [];
|
|
449
|
-
}
|
|
450
|
-
try {
|
|
451
|
-
const result = facet.summarize(context);
|
|
452
|
-
return result && hasFacetContent(result.content) ? [{ facet, result }] : [];
|
|
453
|
-
} catch {
|
|
454
|
-
// A host extension is presentation-only. It must never take down the
|
|
455
|
-
// durable timeline or hide the remaining built-in evidence.
|
|
456
|
-
return [];
|
|
457
|
-
}
|
|
458
|
-
}),
|
|
355
|
+
() => selectTurnSummaryFacets(facetDefinitions, context, statusKind),
|
|
459
356
|
[context, facetDefinitions, statusKind],
|
|
460
357
|
);
|
|
461
358
|
|
|
@@ -672,191 +569,6 @@ function LiveElapsed({ since }: { since: string }) {
|
|
|
672
569
|
);
|
|
673
570
|
}
|
|
674
571
|
|
|
675
|
-
/** Elapsed wall time with seconds below an hour: "14s", "2m 14s", "1h 05m". */
|
|
676
|
-
export function formatElapsed(durationMs: number): string {
|
|
677
|
-
const totalSeconds = Math.max(0, Math.floor(durationMs / 1000));
|
|
678
|
-
if (totalSeconds < 60) {
|
|
679
|
-
return `${totalSeconds}s`;
|
|
680
|
-
}
|
|
681
|
-
const totalMinutes = Math.floor(totalSeconds / 60);
|
|
682
|
-
if (totalMinutes < 60) {
|
|
683
|
-
const seconds = totalSeconds % 60;
|
|
684
|
-
return seconds ? `${totalMinutes}m ${seconds}s` : `${totalMinutes}m`;
|
|
685
|
-
}
|
|
686
|
-
const hours = Math.floor(totalMinutes / 60);
|
|
687
|
-
return `${hours}h ${String(totalMinutes % 60).padStart(2, "0")}m`;
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
function createTurnSummaryContext(
|
|
691
|
-
items: ActivityItem[],
|
|
692
|
-
outcome: TurnOutcome | undefined,
|
|
693
|
-
failureText: string | undefined,
|
|
694
|
-
durationMs: number | undefined,
|
|
695
|
-
contextCompactionCount: number,
|
|
696
|
-
): TurnSummaryContext {
|
|
697
|
-
const itemSnapshot = Object.freeze([...items]);
|
|
698
|
-
const toolCalls = Object.freeze(
|
|
699
|
-
itemSnapshot.filter((item): item is ToolCallItem => item.kind === "tool-call"),
|
|
700
|
-
);
|
|
701
|
-
const settled = itemSnapshot.every((item) => {
|
|
702
|
-
if (item.kind === "reasoning" || item.kind === "agent-message") {
|
|
703
|
-
return !item.streaming;
|
|
704
|
-
}
|
|
705
|
-
if (
|
|
706
|
-
item.kind === "tool-call" ||
|
|
707
|
-
item.kind === "worker" ||
|
|
708
|
-
item.kind === "sandbox" ||
|
|
709
|
-
item.kind === "startup-phase"
|
|
710
|
-
) {
|
|
711
|
-
return item.status !== "running";
|
|
712
|
-
}
|
|
713
|
-
return true;
|
|
714
|
-
});
|
|
715
|
-
return Object.freeze({
|
|
716
|
-
items: itemSnapshot,
|
|
717
|
-
toolCalls,
|
|
718
|
-
outcome,
|
|
719
|
-
failureText,
|
|
720
|
-
durationMs,
|
|
721
|
-
settled,
|
|
722
|
-
contextCompactionCount: Math.max(0, Math.floor(contextCompactionCount)),
|
|
723
|
-
});
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
const BUILT_IN_TURN_SUMMARY_FACETS: readonly TurnSummaryFacet[] = Object.freeze([
|
|
727
|
-
{
|
|
728
|
-
id: "steps",
|
|
729
|
-
summarize: ({ items }) => {
|
|
730
|
-
// Progress notes narrate steps; they are not steps themselves.
|
|
731
|
-
const count = items.filter(
|
|
732
|
-
(item) => item.kind !== "startup-phase" && item.kind !== "agent-message",
|
|
733
|
-
).length;
|
|
734
|
-
return count
|
|
735
|
-
? { content: `${count} ${count === 1 ? "step" : "steps"}` }
|
|
736
|
-
: items.some((item) => item.kind === "startup-phase")
|
|
737
|
-
? { content: "Preparation" }
|
|
738
|
-
: null;
|
|
739
|
-
},
|
|
740
|
-
},
|
|
741
|
-
{
|
|
742
|
-
id: "files",
|
|
743
|
-
summarize: ({ toolCalls }) => {
|
|
744
|
-
let files = 0;
|
|
745
|
-
for (const item of toolCalls) {
|
|
746
|
-
if (isApplyPatch(item)) {
|
|
747
|
-
files += applyPatchOpsFromToolItem(item).length;
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
return files ? { content: `${files} ${files === 1 ? "file" : "files"} edited` } : null;
|
|
751
|
-
},
|
|
752
|
-
},
|
|
753
|
-
{
|
|
754
|
-
id: "commands",
|
|
755
|
-
summarize: ({ toolCalls }) => {
|
|
756
|
-
const commands = toolCalls.filter((item) => item.name === "exec_command").length;
|
|
757
|
-
return commands
|
|
758
|
-
? { content: `${commands} ${commands === 1 ? "command" : "commands"}` }
|
|
759
|
-
: null;
|
|
760
|
-
},
|
|
761
|
-
},
|
|
762
|
-
{
|
|
763
|
-
id: "screenshots",
|
|
764
|
-
summarize: ({ toolCalls }) => {
|
|
765
|
-
let screenshots = 0;
|
|
766
|
-
for (const item of toolCalls) {
|
|
767
|
-
const leaf = mcpToolLeaf(item.name);
|
|
768
|
-
if (
|
|
769
|
-
(rawTypeOf(item) === "computer_call" ||
|
|
770
|
-
item.name === "computer_call" ||
|
|
771
|
-
item.name === "computer_screenshot" ||
|
|
772
|
-
leaf === "browser_screenshot" ||
|
|
773
|
-
leaf === "browser_observe" ||
|
|
774
|
-
leaf === "browser_act") &&
|
|
775
|
-
(retainedScreenshotMetadata(item.output) !== null ||
|
|
776
|
-
screenshotDataUrl(item.output) !== null ||
|
|
777
|
-
mediaPreviewFact(item.output) !== null)
|
|
778
|
-
) {
|
|
779
|
-
screenshots += 1;
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
return screenshots
|
|
783
|
-
? {
|
|
784
|
-
content: `${screenshots} ${screenshots === 1 ? "screenshot" : "screenshots"}`,
|
|
785
|
-
}
|
|
786
|
-
: null;
|
|
787
|
-
},
|
|
788
|
-
},
|
|
789
|
-
{
|
|
790
|
-
id: "memories",
|
|
791
|
-
summarize: ({ items }) => {
|
|
792
|
-
let saved = 0;
|
|
793
|
-
let updated = 0;
|
|
794
|
-
for (const item of items) {
|
|
795
|
-
if (item.kind !== "memory") {
|
|
796
|
-
continue;
|
|
797
|
-
}
|
|
798
|
-
if (item.variant === "corrected") {
|
|
799
|
-
updated += 1;
|
|
800
|
-
} else {
|
|
801
|
-
saved += 1;
|
|
802
|
-
}
|
|
803
|
-
}
|
|
804
|
-
const parts: string[] = [];
|
|
805
|
-
if (saved) {
|
|
806
|
-
parts.push(`${saved} ${saved === 1 ? "memory" : "memories"} saved`);
|
|
807
|
-
}
|
|
808
|
-
if (updated) {
|
|
809
|
-
parts.push(`${updated} ${updated === 1 ? "memory" : "memories"} updated`);
|
|
810
|
-
}
|
|
811
|
-
return parts.length > 0 ? { content: parts.join(" · ") } : null;
|
|
812
|
-
},
|
|
813
|
-
},
|
|
814
|
-
{
|
|
815
|
-
id: "compacted",
|
|
816
|
-
summarize: ({ contextCompactionCount }) =>
|
|
817
|
-
contextCompactionCount > 0
|
|
818
|
-
? {
|
|
819
|
-
content:
|
|
820
|
-
contextCompactionCount === 1 ? "compacted" : `${contextCompactionCount} compacts`,
|
|
821
|
-
ariaLabel:
|
|
822
|
-
contextCompactionCount === 1
|
|
823
|
-
? "Conversation history compacted"
|
|
824
|
-
: `${contextCompactionCount} conversation history compactions`,
|
|
825
|
-
}
|
|
826
|
-
: null,
|
|
827
|
-
},
|
|
828
|
-
{
|
|
829
|
-
id: "duration",
|
|
830
|
-
summarize: ({ durationMs }) => {
|
|
831
|
-
const duration = formatDurationFacet(durationMs);
|
|
832
|
-
return duration ? { content: duration } : null;
|
|
833
|
-
},
|
|
834
|
-
},
|
|
835
|
-
]);
|
|
836
|
-
|
|
837
|
-
function resolveTurnSummaryFacets(
|
|
838
|
-
configuration: TurnSummaryFacetConfiguration | undefined,
|
|
839
|
-
): readonly TurnSummaryFacet[] {
|
|
840
|
-
const requested: readonly TurnSummaryFacet[] = configuration?.replace ?? [
|
|
841
|
-
...BUILT_IN_TURN_SUMMARY_FACETS.filter(
|
|
842
|
-
(facet) => !configuration?.remove?.includes(facet.id as BuiltInTurnSummaryFacetId),
|
|
843
|
-
),
|
|
844
|
-
...(configuration?.add ?? []),
|
|
845
|
-
];
|
|
846
|
-
const seen = new Set<string>();
|
|
847
|
-
return requested.filter((facet) => {
|
|
848
|
-
if (!facet.id || seen.has(facet.id)) {
|
|
849
|
-
return false;
|
|
850
|
-
}
|
|
851
|
-
seen.add(facet.id);
|
|
852
|
-
return true;
|
|
853
|
-
});
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
function hasFacetContent(content: ReactNode): boolean {
|
|
857
|
-
return content !== null && content !== undefined && content !== false && content !== "";
|
|
858
|
-
}
|
|
859
|
-
|
|
860
572
|
class FacetRenderBoundary extends Component<{ children: ReactNode }, { failed: boolean }> {
|
|
861
573
|
state = { failed: false };
|
|
862
574
|
|
|
@@ -868,20 +580,3 @@ class FacetRenderBoundary extends Component<{ children: ReactNode }, { failed: b
|
|
|
868
580
|
return this.state.failed ? null : this.props.children;
|
|
869
581
|
}
|
|
870
582
|
}
|
|
871
|
-
|
|
872
|
-
function formatDurationFacet(durationMs: number | undefined): string | null {
|
|
873
|
-
if (durationMs === undefined || !Number.isFinite(durationMs) || durationMs < 1000) {
|
|
874
|
-
return null;
|
|
875
|
-
}
|
|
876
|
-
const totalSeconds = Math.floor(durationMs / 1000);
|
|
877
|
-
if (totalSeconds < 60) {
|
|
878
|
-
return `${totalSeconds}s`;
|
|
879
|
-
}
|
|
880
|
-
const totalMinutes = Math.floor(totalSeconds / 60);
|
|
881
|
-
if (totalMinutes < 60) {
|
|
882
|
-
return `${totalMinutes}m`;
|
|
883
|
-
}
|
|
884
|
-
const hours = Math.floor(totalMinutes / 60);
|
|
885
|
-
const minutes = totalMinutes % 60;
|
|
886
|
-
return `${hours}h ${String(minutes).padStart(2, "0")}m`;
|
|
887
|
-
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// Pure presentation decisions for a timeline turn's work, shared by the web and native
|
|
2
|
+
// timelines. Every function here is extracted verbatim from the web MessageTimeline so both
|
|
3
|
+
// renderers decide identically what a turn shows (preparing, working, waiting, worked).
|
|
4
|
+
import { timelineGroupContainsPresentedImage } from "./presented-image";
|
|
5
|
+
import type { TurnSummaryStatus } from "./turn-summary-model";
|
|
6
|
+
import type { ActivityItem, TimelineGroup, ToolCallItem } from "./types";
|
|
7
|
+
|
|
8
|
+
export type ActivityGroup = Extract<TimelineGroup, { kind: "activity" }>;
|
|
9
|
+
export type TurnGroup = Extract<TimelineGroup, { kind: "turn" }>;
|
|
10
|
+
|
|
11
|
+
export function durationBetween(startedAt: string, endedAt: string): number | undefined {
|
|
12
|
+
const started = Date.parse(startedAt);
|
|
13
|
+
const ended = Date.parse(endedAt);
|
|
14
|
+
if (!Number.isFinite(started) || !Number.isFinite(ended) || ended < started) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return ended - started;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Compaction landmarks among a fold's groups (secondary summary facet). */
|
|
21
|
+
export function compactedLandmarkCount(groups: readonly TimelineGroup[]): number {
|
|
22
|
+
return groups.filter(
|
|
23
|
+
(group) =>
|
|
24
|
+
group.kind === "item" &&
|
|
25
|
+
group.item.kind === "context-compaction" &&
|
|
26
|
+
group.item.phase === "compacted",
|
|
27
|
+
).length;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function clusterIsSettled(group: ActivityGroup): boolean {
|
|
31
|
+
return group.items.every((item) => {
|
|
32
|
+
if (item.kind === "reasoning" || item.kind === "agent-message") {
|
|
33
|
+
return !item.streaming;
|
|
34
|
+
}
|
|
35
|
+
// Memory writes and fleet observations are discrete, already-settled events.
|
|
36
|
+
if (item.kind === "memory" || item.kind === "fleet-decision") {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return item.status !== "running";
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function flattenActivityItems(groups: readonly TimelineGroup[]): ActivityItem[] {
|
|
44
|
+
const items: ActivityItem[] = [];
|
|
45
|
+
for (const group of groups) {
|
|
46
|
+
if (group.kind === "activity") {
|
|
47
|
+
items.push(...flattenActivityItems(group.work?.details ?? []), ...group.items);
|
|
48
|
+
} else if (group.kind === "turn") {
|
|
49
|
+
items.push(...flattenActivityItems(group.groups));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return items;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type ReadableWorkOptions = {
|
|
56
|
+
/** Host shows startup phases as ordinary details (web: startup-details context). */
|
|
57
|
+
startupDetails: boolean;
|
|
58
|
+
/** Startup chrome was dismissed by the reader. */
|
|
59
|
+
startupDismissed: boolean;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* A readable turn whose only work so far is environment preparation renders as one quiet
|
|
64
|
+
* preparation surface instead of a "Working" fold.
|
|
65
|
+
*/
|
|
66
|
+
export function isPreparingWork(group: ActivityGroup, options: ReadableWorkOptions): boolean {
|
|
67
|
+
if (!group.work) return false;
|
|
68
|
+
const phases = group.items.filter((item) => item.kind === "startup-phase");
|
|
69
|
+
return (
|
|
70
|
+
!options.startupDetails &&
|
|
71
|
+
!options.startupDismissed &&
|
|
72
|
+
!group.work.endedAt &&
|
|
73
|
+
!group.work.waiting &&
|
|
74
|
+
phases.length > 0 &&
|
|
75
|
+
group.items.every(
|
|
76
|
+
(item) => item.kind === "startup-phase" || (item.kind === "reasoning" && !item.text.trim()),
|
|
77
|
+
) &&
|
|
78
|
+
!phases.some((item) => item.status === "failed" || item.status === "cancelled")
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Status of a readable turn's work row, minus the host-rendered live preview. */
|
|
83
|
+
export function readableWorkStatus(
|
|
84
|
+
group: ActivityGroup & { work: NonNullable<ActivityGroup["work"]> },
|
|
85
|
+
): Omit<TurnSummaryStatus, "preview"> {
|
|
86
|
+
const end = group.work.endedAt;
|
|
87
|
+
return end
|
|
88
|
+
? { kind: "worked", durationMs: durationBetween(group.work.startedAt, end) }
|
|
89
|
+
: group.work.waiting
|
|
90
|
+
? { kind: "waiting", ...group.work.waiting }
|
|
91
|
+
: { kind: "working", since: group.work.startedAt };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Whether a readable turn's work fold starts expanded. */
|
|
95
|
+
export function readableWorkDefaultOpen(group: ActivityGroup): true | undefined {
|
|
96
|
+
const phases = group.items.filter((item) => item.kind === "startup-phase");
|
|
97
|
+
return timelineGroupContainsPresentedImage(group) ||
|
|
98
|
+
group.outcome === "failed" ||
|
|
99
|
+
phases.some((item) => item.status === "failed" || item.status === "cancelled")
|
|
100
|
+
? true
|
|
101
|
+
: undefined;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Whether the live preview should show (images stay primary output instead). */
|
|
105
|
+
export function readableWorkShowsPreview(group: ActivityGroup): boolean {
|
|
106
|
+
return !timelineGroupContainsPresentedImage(group);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The step a rolling preview shows: steps advance with event order (progress notes and
|
|
111
|
+
* startup phases have their own surfaces). Mirrors the web RollingActivity selection.
|
|
112
|
+
*/
|
|
113
|
+
export function rollingActivityItem(
|
|
114
|
+
items: readonly ActivityItem[],
|
|
115
|
+
previousItem?: ActivityItem,
|
|
116
|
+
mounted = true,
|
|
117
|
+
): { item: ActivityItem; running: boolean; earlierCount: number } | null {
|
|
118
|
+
const work = items.filter(
|
|
119
|
+
(item) => item.kind !== "startup-phase" && item.kind !== "agent-message",
|
|
120
|
+
);
|
|
121
|
+
const active = work.filter((item) =>
|
|
122
|
+
item.kind === "reasoning" ? item.streaming : "status" in item && item.status === "running",
|
|
123
|
+
);
|
|
124
|
+
const item =
|
|
125
|
+
!mounted && previousItem && previousItem.kind !== "agent-message" ? previousItem : work.at(-1);
|
|
126
|
+
if (!item) return null;
|
|
127
|
+
return {
|
|
128
|
+
item,
|
|
129
|
+
running: active.some((entry) => entry.id === item.id),
|
|
130
|
+
earlierCount: Math.max(
|
|
131
|
+
0,
|
|
132
|
+
work.findIndex((entry) => entry.id === item.id),
|
|
133
|
+
),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function isToolCall(item: ActivityItem): item is ToolCallItem {
|
|
138
|
+
return item.kind === "tool-call";
|
|
139
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// @opengeni/react/timeline-model: the pure presentation model behind the web timeline,
|
|
2
|
+
// shared with non-DOM renderers (React Native). No DOM, no CSS, no styled components:
|
|
3
|
+
// renderers that consume it make the same decisions the web MessageTimeline makes.
|
|
4
|
+
export {
|
|
5
|
+
BUILT_IN_TURN_SUMMARY_FACET_IDS,
|
|
6
|
+
BUILT_IN_TURN_SUMMARY_FACETS,
|
|
7
|
+
createTurnSummaryContext,
|
|
8
|
+
formatDurationFacet,
|
|
9
|
+
formatElapsed,
|
|
10
|
+
resolveTurnSummaryFacets,
|
|
11
|
+
} from "./timeline/turn-summary-model";
|
|
12
|
+
export type {
|
|
13
|
+
BuiltInTurnSummaryFacetId,
|
|
14
|
+
TurnSummaryContext,
|
|
15
|
+
TurnSummaryFacet,
|
|
16
|
+
TurnSummaryFacetConfiguration,
|
|
17
|
+
TurnSummaryFacetResult,
|
|
18
|
+
TurnSummaryOptions,
|
|
19
|
+
TurnSummaryStatus,
|
|
20
|
+
} from "./timeline/turn-summary-model";
|
|
21
|
+
export {
|
|
22
|
+
clusterIsSettled,
|
|
23
|
+
compactedLandmarkCount,
|
|
24
|
+
durationBetween,
|
|
25
|
+
flattenActivityItems,
|
|
26
|
+
isPreparingWork,
|
|
27
|
+
readableWorkDefaultOpen,
|
|
28
|
+
readableWorkShowsPreview,
|
|
29
|
+
readableWorkStatus,
|
|
30
|
+
rollingActivityItem,
|
|
31
|
+
} from "./timeline/work-presentation";
|
|
32
|
+
export type { ActivityGroup, ReadableWorkOptions, TurnGroup } from "./timeline/work-presentation";
|
|
33
|
+
export { timelineGroupContainsPresentedImage } from "./timeline/presented-image";
|
|
34
|
+
export { mcpToolLeaf, toolDisplayName } from "./timeline/tool-display-name";
|
|
35
|
+
export { rawTypeOf } from "./timeline/registry";
|
|
36
|
+
export {
|
|
37
|
+
applyPatchOpsFromToolItem,
|
|
38
|
+
isApplyPatch,
|
|
39
|
+
parseToolArgs,
|
|
40
|
+
sandboxCommandExitCode,
|
|
41
|
+
stripExecBanner,
|
|
42
|
+
tailPeek,
|
|
43
|
+
unwrapMcpOutput,
|
|
44
|
+
} from "./timeline/parsers";
|
|
45
|
+
export { formatClockTime } from "./lib/format";
|
|
46
|
+
export {
|
|
47
|
+
applyPatchPresentation,
|
|
48
|
+
askPresentation,
|
|
49
|
+
execPresentation,
|
|
50
|
+
genericToolIconKind,
|
|
51
|
+
genericToolPresentation,
|
|
52
|
+
pathBasename,
|
|
53
|
+
pathDirname,
|
|
54
|
+
presentedToolKind,
|
|
55
|
+
runOnPresentation,
|
|
56
|
+
toolRowPresentation,
|
|
57
|
+
truncatePreview,
|
|
58
|
+
webSearchPresentation,
|
|
59
|
+
withComputePreview,
|
|
60
|
+
writeStdinPresentation,
|
|
61
|
+
} from "./timeline/tool-presentation";
|
|
62
|
+
export type {
|
|
63
|
+
PresentedToolKind,
|
|
64
|
+
ToolBody,
|
|
65
|
+
ToolChip,
|
|
66
|
+
ToolIconKind,
|
|
67
|
+
ToolIconTone,
|
|
68
|
+
ToolPatchFile,
|
|
69
|
+
ToolPresentationContext,
|
|
70
|
+
ToolPreview,
|
|
71
|
+
ToolRowPresentation,
|
|
72
|
+
WebSearchResult,
|
|
73
|
+
} from "./timeline/tool-presentation";
|
|
74
|
+
|
|
75
|
+
export {
|
|
76
|
+
sandboxRowTitle,
|
|
77
|
+
startupDuration,
|
|
78
|
+
startupPhaseTitle,
|
|
79
|
+
STARTUP_WAIT_TITLES,
|
|
80
|
+
workerRowTitle,
|
|
81
|
+
} from "./timeline/platform-activity-presentation";
|
|
82
|
+
export { formatBytes, stringifyPayload, tryParseJson } from "./lib/format";
|
|
83
|
+
export { selectTurnSummaryFacets } from "./timeline/turn-summary-model";
|
|
84
|
+
export { GENIE_PREPARING_PHRASES, GENIE_WAITING_PHRASES } from "./timeline/genie-copy";
|
|
85
|
+
export {
|
|
86
|
+
answersFromDrafts,
|
|
87
|
+
defaultHumanInputFormMessages,
|
|
88
|
+
emptyDraft,
|
|
89
|
+
formatDeadline,
|
|
90
|
+
humanInputHeading,
|
|
91
|
+
initialDrafts,
|
|
92
|
+
} from "./human-input-model";
|
|
93
|
+
export type { HumanInputAnswerDraft, HumanInputFormMessages } from "./human-input-model";
|
|
94
|
+
export { isActionableHumanInputRequest } from "./human-input";
|
|
95
|
+
export { SESSION_STATUS_BADGE, SESSION_STATUS_PRESENTATION } from "./session-status-model";
|
|
96
|
+
export type { SessionStatusTone } from "./session-status-model";
|
|
97
|
+
export { formatRelativeTime } from "./lib/format";
|
|
98
|
+
export {
|
|
99
|
+
noticeDisplayText,
|
|
100
|
+
noticeIsResolvedApproval,
|
|
101
|
+
noticeTone,
|
|
102
|
+
} from "./timeline/notice-presentation";
|
|
103
|
+
export {
|
|
104
|
+
QUESTION_NAV_HIDDEN_PX,
|
|
105
|
+
QUESTION_NAV_MARGIN_PX,
|
|
106
|
+
questionNavTarget,
|
|
107
|
+
} from "./timeline/question-nav-model";
|
|
108
|
+
export type { QuestionNavPrompt } from "./timeline/question-nav-model";
|
package/styles/compiled.css
CHANGED
|
@@ -2369,6 +2369,9 @@
|
|
|
2369
2369
|
:where(.og-root).max-w-\[min\(18rem\,calc\(100vw-1\.5rem\)\)\],:where(.og-root) .max-w-\[min\(18rem\,calc\(100vw-1\.5rem\)\)\] {
|
|
2370
2370
|
max-width: min(18rem, calc(100vw - 1.5rem));
|
|
2371
2371
|
}
|
|
2372
|
+
:where(.og-root).max-w-\[min\(24rem\,60vw\)\],:where(.og-root) .max-w-\[min\(24rem\,60vw\)\] {
|
|
2373
|
+
max-width: min(24rem, 60vw);
|
|
2374
|
+
}
|
|
2372
2375
|
:where(.og-root).max-w-full,:where(.og-root) .max-w-full {
|
|
2373
2376
|
max-width: 100%;
|
|
2374
2377
|
}
|
|
@@ -6305,6 +6308,11 @@
|
|
|
6305
6308
|
margin-inline: calc(19px * -1);
|
|
6306
6309
|
}
|
|
6307
6310
|
}
|
|
6311
|
+
:where(.og-root).pointer-coarse\:flex,:where(.og-root) .pointer-coarse\:flex {
|
|
6312
|
+
@media (pointer: coarse) {
|
|
6313
|
+
display: flex;
|
|
6314
|
+
}
|
|
6315
|
+
}
|
|
6308
6316
|
:where(.og-root).pointer-coarse\:size-6,:where(.og-root) .pointer-coarse\:size-6 {
|
|
6309
6317
|
@media (pointer: coarse) {
|
|
6310
6318
|
width: calc(var(--spacing) * 6);
|
package/styles/connect.css
CHANGED
|
@@ -278,6 +278,10 @@
|
|
|
278
278
|
.og-connect-setup .og-connect-setup-primary:hover:not(:disabled) { background:var(--og-color-primary-hover); }
|
|
279
279
|
.og-connect-setup .og-connect-setup-secondary { display:flex; flex-wrap:wrap; justify-content:space-between; gap:8px; }
|
|
280
280
|
.og-connect-setup .og-connect-setup-secondary button { border:0; min-height:36px; padding:6px 8px; color:var(--og-color-fg-muted,inherit); font-size:12px; }
|
|
281
|
+
.og-connect-setup .og-connect-setup-pending { display:grid; gap:10px; padding:14px 16px; border:1px solid var(--og-color-border,#888); border-radius:10px; background:var(--og-color-surface-1,transparent); color:var(--og-color-fg-muted,inherit); font-size:13px; line-height:1.55; }
|
|
282
|
+
.og-connect-setup .og-connect-setup-pending p { margin:0; }
|
|
283
|
+
.og-connect-setup .og-connect-setup-pending ol { margin:0; padding-left:20px; display:grid; gap:6px; }
|
|
284
|
+
.og-connect-setup .og-connect-setup-hint { margin:0; color:var(--og-color-fg-muted,inherit); font-size:12px; line-height:1.55; }
|
|
281
285
|
|
|
282
286
|
.og-catalog-more, .og-skill-discovery .og-catalog-more { margin-top:12px; min-height:36px; padding:8px 12px; border:1px solid var(--og-color-border,#888); border-radius:8px; background:var(--og-color-surface-1,transparent); color:inherit; font:inherit; font-size:13px; cursor:pointer; }
|
|
283
287
|
.og-catalog-more:focus-visible { outline:2px solid var(--og-color-accent,currentColor); outline-offset:2px; }
|