@opengeni/react 1.4.4 → 1.4.5-canary.37485542607001
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-5EEAS3IU.js → browser-viewer-CV23VIHB.js} +8 -6
- package/dist/{chunk-XS67YG5R.js → chunk-4O7OE7ON.js} +45 -4
- package/dist/chunk-4O7OE7ON.js.map +1 -0
- 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-QMMCJGFI.js → chunk-6BAMPGBV.js} +6 -3
- package/dist/chunk-6BAMPGBV.js.map +1 -0
- package/dist/{chunk-I6OY3MWC.js → chunk-6FOTSVWU.js} +2 -2
- 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-2OQA3CPB.js → chunk-CESBPQP5.js} +19 -5
- package/dist/chunk-CESBPQP5.js.map +1 -0
- package/dist/{chunk-YVFRBXST.js → chunk-GMNGUPMX.js} +2 -2
- 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-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-LHF6BVM4.js +83 -0
- package/dist/chunk-LHF6BVM4.js.map +1 -0
- package/dist/{chunk-C5BF4L26.js → chunk-LSMWZSCJ.js} +7 -7
- package/dist/chunk-LTKGTXUQ.js +174 -0
- package/dist/chunk-LTKGTXUQ.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-IYQCWGU5.js → chunk-RGTZ2VDR.js} +35 -62
- package/dist/chunk-RGTZ2VDR.js.map +1 -0
- package/dist/chunk-RI42H5IU.js +326 -0
- package/dist/chunk-RI42H5IU.js.map +1 -0
- package/dist/{chunk-EAOSEIXB.js → chunk-RRRS5D5T.js} +727 -1983
- package/dist/chunk-RRRS5D5T.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-IUHHPMAX.js → chunk-SZOCY5VG.js} +18 -87
- package/dist/chunk-SZOCY5VG.js.map +1 -0
- package/dist/{chunk-L2J3PU7A.js → chunk-VYIPNDUZ.js} +29 -100
- package/dist/chunk-VYIPNDUZ.js.map +1 -0
- package/dist/{chunk-G6YRCIYJ.js → chunk-YK6QMGVL.js} +55 -60
- package/dist/chunk-YK6QMGVL.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-ELNLZGHI.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-K7SOZVVZ.js} +6 -4
- package/dist/{embedded-voice-NIL4RDX3.js.map → embedded-voice-K7SOZVVZ.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-goal.d.ts +2 -1
- package/dist/hooks/use-new-session-draft.d.ts +74 -0
- 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-27HGRPVF.js} +3 -3
- package/dist/lib/clipboard.d.ts +7 -0
- package/dist/lib/provider-recovery.d.ts +49 -0
- package/dist/lib/transient-retry.d.ts +25 -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-I5KPC3D6.js} +6 -4
- package/dist/model-policy-picker-menu-I5KPC3D6.js.map +1 -0
- package/dist/model-policy.d.ts +10 -0
- package/dist/model-policy.js +5 -1
- package/dist/new-session-draft.d.ts +7 -0
- package/dist/new-session-draft.js +639 -0
- package/dist/new-session-draft.js.map +1 -0
- 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-2DGDO6NI.js} +5 -5
- package/dist/sandbox-files-2DGDO6NI.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-agents-model.d.ts +10 -0
- package/dist/session-agents-model.js +25 -0
- package/dist/session-agents-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 +119 -0
- package/dist/session-list-model.js +244 -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 +55 -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 +8 -146
- 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 +20 -150
- 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-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-client-config-flags.ts +8 -0
- package/src/hooks/use-goal.ts +66 -10
- package/src/hooks/use-new-session-draft.ts +813 -0
- 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/lib/transient-retry.ts +99 -0
- package/src/model-mark-paths.ts +53 -0
- package/src/model-picker-model.ts +330 -0
- package/src/model-policy.ts +75 -5
- package/src/new-session-draft.ts +22 -0
- 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-agents-model.ts +33 -0
- package/src/session-attention-model.ts +59 -0
- package/src/session-feedback-model.ts +95 -0
- package/src/session-list-model.ts +377 -0
- package/src/session-status-model.ts +62 -0
- package/src/testing/session-scenarios.ts +326 -0
- package/src/timeline/activity-rail.tsx +54 -24
- package/src/timeline/genie-copy.ts +19 -0
- package/src/timeline/genie-loading.tsx +15 -19
- 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/projection.ts +12 -1
- 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 +254 -1024
- 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 +17 -4
- package/styles/connect.css +4 -0
- package/styles/responsive.css +11 -2
- package/dist/chunk-2OQA3CPB.js.map +0 -1
- package/dist/chunk-CVYCLFMH.js.map +0 -1
- package/dist/chunk-EAOSEIXB.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-PHBFJCEU.js.map +0 -1
- package/dist/chunk-QMMCJGFI.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-5EEAS3IU.js.map → browser-viewer-CV23VIHB.js.map} +0 -0
- /package/dist/{chunk-I6OY3MWC.js.map → chunk-6FOTSVWU.js.map} +0 -0
- /package/dist/{chunk-YVFRBXST.js.map → chunk-GMNGUPMX.js.map} +0 -0
- /package/dist/{chunk-PBCZL4JP.js.map → chunk-INIZSNXT.js.map} +0 -0
- /package/dist/{chunk-C5BF4L26.js.map → chunk-LSMWZSCJ.js.map} +0 -0
- /package/dist/{computer-viewer-ELNLZGHI.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-27HGRPVF.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
|
}
|
|
@@ -5887,14 +5890,19 @@
|
|
|
5887
5890
|
align-items: center;
|
|
5888
5891
|
}
|
|
5889
5892
|
}
|
|
5893
|
+
:where(.og-root).max-sm\:gap-0\.5,:where(.og-root) .max-sm\:gap-0\.5 {
|
|
5894
|
+
@media (width < 40rem) {
|
|
5895
|
+
gap: calc(var(--spacing) * 0.5);
|
|
5896
|
+
}
|
|
5897
|
+
}
|
|
5890
5898
|
:where(.og-root).max-sm\:gap-1,:where(.og-root) .max-sm\:gap-1 {
|
|
5891
5899
|
@media (width < 40rem) {
|
|
5892
5900
|
gap: calc(var(--spacing) * 1);
|
|
5893
5901
|
}
|
|
5894
5902
|
}
|
|
5895
|
-
:where(.og-root).max-sm\:px-
|
|
5903
|
+
:where(.og-root).max-sm\:px-1\.5,:where(.og-root) .max-sm\:px-1\.5 {
|
|
5896
5904
|
@media (width < 40rem) {
|
|
5897
|
-
padding-inline: calc(var(--spacing) *
|
|
5905
|
+
padding-inline: calc(var(--spacing) * 1.5);
|
|
5898
5906
|
}
|
|
5899
5907
|
}
|
|
5900
5908
|
:where(.og-root).max-sm\:pr-10,:where(.og-root) .max-sm\:pr-10 {
|
|
@@ -6644,6 +6652,7 @@
|
|
|
6644
6652
|
--og-model-policy-label-full-display: inline;
|
|
6645
6653
|
--og-model-policy-label-short-display: none;
|
|
6646
6654
|
--og-model-policy-effort-display: inline;
|
|
6655
|
+
--og-model-policy-chevron-display: inline;
|
|
6647
6656
|
}
|
|
6648
6657
|
:where(.og-root)[data-og-responsive-basis="container"] .og-composer-input,:where(.og-root) [data-og-responsive-basis="container"] .og-composer-input {
|
|
6649
6658
|
padding-inline: var(--_og-c-input-x);
|
|
@@ -6681,6 +6690,9 @@
|
|
|
6681
6690
|
:where(.og-root)[data-og-responsive-basis="container"] .og-model-policy-effort,:where(.og-root) [data-og-responsive-basis="container"] .og-model-policy-effort {
|
|
6682
6691
|
display: var(--og-model-policy-effort-display);
|
|
6683
6692
|
}
|
|
6693
|
+
:where(.og-root)[data-og-responsive-basis="container"] .og-model-policy-chevron,:where(.og-root) [data-og-responsive-basis="container"] .og-model-policy-chevron {
|
|
6694
|
+
display: var(--og-model-policy-chevron-display);
|
|
6695
|
+
}
|
|
6684
6696
|
:where(.og-root)[data-og-responsive-basis="container"] .og-model-picker-native,:where(.og-root) [data-og-responsive-basis="container"] .og-model-picker-native {
|
|
6685
6697
|
max-width: var(--_og-c-native-max);
|
|
6686
6698
|
}
|
|
@@ -6713,19 +6725,20 @@
|
|
|
6713
6725
|
}
|
|
6714
6726
|
@container og-composer (max-width: 39.999rem) {
|
|
6715
6727
|
:where(.og-root)[data-og-responsive-basis="container"] :where(*),:where(.og-root) [data-og-responsive-basis="container"] :where(*) {
|
|
6716
|
-
--_og-c-gap: 0.
|
|
6728
|
+
--_og-c-gap: 0.125rem;
|
|
6717
6729
|
--_og-c-footer-x: 0.5rem;
|
|
6718
6730
|
--_og-c-footer-b: 0.5rem;
|
|
6719
6731
|
--_og-c-controls-wrap: nowrap;
|
|
6720
6732
|
--_og-c-hint-display: none;
|
|
6721
6733
|
--_og-c-model-max: 7.5rem;
|
|
6722
|
-
--_og-c-model-x: 0.
|
|
6734
|
+
--_og-c-model-x: 0.375rem;
|
|
6723
6735
|
--_og-c-native-max: 7.5rem;
|
|
6724
6736
|
--_og-c-recovered-max: 8rem;
|
|
6725
6737
|
--_og-c-error-max: 8rem;
|
|
6726
6738
|
--og-model-policy-label-full-display: none;
|
|
6727
6739
|
--og-model-policy-label-short-display: inline;
|
|
6728
6740
|
--og-model-policy-effort-display: none;
|
|
6741
|
+
--og-model-policy-chevron-display: none;
|
|
6729
6742
|
}
|
|
6730
6743
|
:where(.og-root)[data-og-responsive-basis="container"] .og-composer-footer,:where(.og-root) [data-og-responsive-basis="container"] .og-composer-footer {
|
|
6731
6744
|
flex-wrap: nowrap;
|