@opengeni/react 3.7.0-canary.1 → 3.7.0-canary.3
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/dist/{chunk-5IXTJTK3.js → chunk-2ZICNIGZ.js} +353 -286
- package/dist/chunk-2ZICNIGZ.js.map +1 -0
- package/dist/{chunk-INGB2N5R.js → chunk-3IY6UZI6.js} +2 -2
- package/dist/chunk-3IY6UZI6.js.map +1 -0
- package/dist/components/child-session-link.d.ts +5 -0
- package/dist/components/session-chrome.d.ts +8 -4
- package/dist/composer.js +1 -1
- package/dist/index.js +2 -2
- package/dist/session-ui.js +2 -2
- package/package.json +2 -2
- package/src/components/child-session-link.tsx +27 -0
- package/src/components/composer.tsx +1 -1
- package/src/components/machine-input-display.ts +2 -2
- package/src/components/message-timeline.tsx +17 -2
- package/src/components/session-chrome.tsx +75 -37
- package/styles/compiled.css +25 -14
- package/dist/chunk-5IXTJTK3.js.map +0 -1
- package/dist/chunk-INGB2N5R.js.map +0 -1
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MachineInputMember } from "../timeline/types.js";
|
|
2
|
+
/** Source IDs are routing coordinates only for typed child updates, never parsed from prose. */
|
|
3
|
+
export declare function ChildSessionLink({ kind, sourceId, onOpenSession, }: Pick<MachineInputMember, "kind" | "sourceId"> & {
|
|
4
|
+
onOpenSession?: ((sessionId: string) => void) | undefined;
|
|
5
|
+
}): import("react").JSX.Element | null;
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* shell uses one CSS grid-track transition for deliberate open/close actions;
|
|
40
40
|
* live queue reconciliation never feeds measurements back into layout.
|
|
41
41
|
*/
|
|
42
|
-
import type { SessionGoal, SessionTurn } from "@opengeni/sdk";
|
|
42
|
+
import type { SessionGoal, SessionStatus, SessionTurn } from "@opengeni/sdk";
|
|
43
43
|
import { type ReactNode } from "react";
|
|
44
44
|
import type { ComposerOptimisticMessage, ComposerState } from "../hooks/use-composer.js";
|
|
45
45
|
import type { UseGoalResult } from "../hooks/use-goal.js";
|
|
@@ -53,6 +53,8 @@ export type SessionChromeAgentsSignal = {
|
|
|
53
53
|
};
|
|
54
54
|
export type SessionChromeProps = {
|
|
55
55
|
compact?: boolean;
|
|
56
|
+
/** Authoritative execution status; omitted by older embedding hosts. */
|
|
57
|
+
sessionStatus?: SessionStatus | undefined;
|
|
56
58
|
queue: UseTurnQueueResult;
|
|
57
59
|
/** Needed for queue edit → composer checkout. Omit with `readOnly`. */
|
|
58
60
|
composer?: ComposerState | undefined;
|
|
@@ -69,6 +71,8 @@ export type SessionChromeProps = {
|
|
|
69
71
|
* (and the gallery) may still pass a handler so the action is visible.
|
|
70
72
|
*/
|
|
71
73
|
onDismissIncoming?: ((inputId: string) => void) | undefined;
|
|
74
|
+
/** Open a typed child update's source through the host's normal authorized route. */
|
|
75
|
+
onOpenSession?: ((sessionId: string) => void) | undefined;
|
|
72
76
|
readOnly?: boolean | undefined;
|
|
73
77
|
className?: string | undefined;
|
|
74
78
|
/** Controlled active segment; omit for uncontrolled. */
|
|
@@ -76,7 +80,7 @@ export type SessionChromeProps = {
|
|
|
76
80
|
defaultActive?: SessionChromeSignalId | null | undefined;
|
|
77
81
|
onActiveChange?: ((next: SessionChromeSignalId | null) => void) | undefined;
|
|
78
82
|
};
|
|
79
|
-
type GoalPillState = "pursuing" | "waiting" | "scheduled" | "blocked" | "held" | "paused" | "invariant_broken" | "completed";
|
|
83
|
+
type GoalPillState = "pursuing" | "waiting" | "scheduled" | "session_failed" | "blocked" | "held" | "paused" | "invariant_broken" | "completed";
|
|
80
84
|
type GoalPillRecord = Pick<SessionGoal, "status" | "pausedReason"> & {
|
|
81
85
|
continuation?: SessionGoal["continuation"] | null | undefined;
|
|
82
86
|
};
|
|
@@ -111,6 +115,6 @@ export declare function sessionChromeShouldOfferQueue(input: {
|
|
|
111
115
|
suppressed: boolean;
|
|
112
116
|
}): boolean;
|
|
113
117
|
/** Select pill state from the goal's authoritative continuation projection. */
|
|
114
|
-
export declare function sessionChromeGoalPillState(goalStatus: "active" | "paused" | "completed", continuation: SessionGoal["continuation"] | null | undefined): GoalPillState;
|
|
115
|
-
export declare function SessionChrome({ compact, queue, composer, goal, agentsPanel, commandsPanel, commandsCount, agentsSignal, onDismissIncoming, readOnly, className, active: activeControlled, defaultActive, onActiveChange, }: SessionChromeProps): import("react").JSX.Element | null;
|
|
118
|
+
export declare function sessionChromeGoalPillState(goalStatus: "active" | "paused" | "completed", continuation: SessionGoal["continuation"] | null | undefined, sessionStatus?: SessionStatus): GoalPillState;
|
|
119
|
+
export declare function SessionChrome({ compact, sessionStatus, queue, composer, goal, agentsPanel, commandsPanel, commandsCount, agentsSignal, onDismissIncoming, onOpenSession, readOnly, className, active: activeControlled, defaultActive, onActiveChange, }: SessionChromeProps): import("react").JSX.Element | null;
|
|
116
120
|
export {};
|
package/dist/composer.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -105,7 +105,7 @@ import {
|
|
|
105
105
|
useWorkspaceModelCatalog,
|
|
106
106
|
userMessageLikelyNeedsDisclosure,
|
|
107
107
|
v4aToGitFileDiff
|
|
108
|
-
} from "./chunk-
|
|
108
|
+
} from "./chunk-2ZICNIGZ.js";
|
|
109
109
|
import "./chunk-W3OUAH6M.js";
|
|
110
110
|
import {
|
|
111
111
|
OpenGeniProvider
|
|
@@ -153,7 +153,7 @@ import {
|
|
|
153
153
|
useSlashCommands,
|
|
154
154
|
useTranscription,
|
|
155
155
|
useVoiceInput
|
|
156
|
-
} from "./chunk-
|
|
156
|
+
} from "./chunk-3IY6UZI6.js";
|
|
157
157
|
import {
|
|
158
158
|
BillingClassMark,
|
|
159
159
|
ModelPolicyPicker,
|
package/dist/session-ui.js
CHANGED
|
@@ -13,11 +13,11 @@ import {
|
|
|
13
13
|
sessionChromeGoalPillLabel,
|
|
14
14
|
sessionChromeGoalPillState,
|
|
15
15
|
userMessageLikelyNeedsDisclosure
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-2ZICNIGZ.js";
|
|
17
17
|
import "./chunk-W3OUAH6M.js";
|
|
18
18
|
import "./chunk-PAJU5KKL.js";
|
|
19
19
|
import "./chunk-JVYQRRC4.js";
|
|
20
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-3IY6UZI6.js";
|
|
21
21
|
import "./chunk-4JFUT22W.js";
|
|
22
22
|
import "./chunk-VZTQ73XT.js";
|
|
23
23
|
import {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opengeni/react",
|
|
3
|
-
"version": "3.7.0-canary.
|
|
3
|
+
"version": "3.7.0-canary.3",
|
|
4
4
|
"description": "React hooks and styled components for OpenGeni: live session streaming, chat composer, message timeline, session status, and fleet views — token-themed (CSS variables), dark-first, built on Tailwind v4 + Radix + Motion.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"@dnd-kit/utilities": "3.2.2",
|
|
121
121
|
"@fontsource-variable/noto-sans-arabic": "5.2.10",
|
|
122
122
|
"@fontsource-variable/noto-sans-jp": "5.2.10",
|
|
123
|
-
"@opengeni/sdk": "^3.7.0-canary.
|
|
123
|
+
"@opengeni/sdk": "^3.7.0-canary.3",
|
|
124
124
|
"clsx": "^2.1.1",
|
|
125
125
|
"dequal": "2.0.3",
|
|
126
126
|
"lucide-react": "^1.8.0",
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { MachineInputMember } from "../timeline/types";
|
|
2
|
+
|
|
3
|
+
/** Source IDs are routing coordinates only for typed child updates, never parsed from prose. */
|
|
4
|
+
export function ChildSessionLink({
|
|
5
|
+
kind,
|
|
6
|
+
sourceId,
|
|
7
|
+
onOpenSession,
|
|
8
|
+
}: Pick<MachineInputMember, "kind" | "sourceId"> & {
|
|
9
|
+
onOpenSession?: ((sessionId: string) => void) | undefined;
|
|
10
|
+
}) {
|
|
11
|
+
if (
|
|
12
|
+
!onOpenSession ||
|
|
13
|
+
!kind.startsWith("child_") ||
|
|
14
|
+
!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(sourceId)
|
|
15
|
+
) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return (
|
|
19
|
+
<button
|
|
20
|
+
type="button"
|
|
21
|
+
onClick={() => onOpenSession(sourceId)}
|
|
22
|
+
className="mt-1 rounded-og-sm text-og-xs font-medium text-og-accent underline-offset-4 hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-og-accent"
|
|
23
|
+
>
|
|
24
|
+
View session
|
|
25
|
+
</button>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -281,7 +281,7 @@ function measureComposerContentHeight(textarea: HTMLTextAreaElement): number {
|
|
|
281
281
|
mirror.tabIndex = -1;
|
|
282
282
|
mirror.rows = 1;
|
|
283
283
|
mirror.style.cssText =
|
|
284
|
-
"position:
|
|
284
|
+
"position:fixed;top:0;left:-100000px;visibility:hidden;pointer-events:none;height:auto;min-height:0;max-height:none;overflow:hidden;z-index:-1;";
|
|
285
285
|
composerHeightMirror = mirror;
|
|
286
286
|
}
|
|
287
287
|
|
|
@@ -7,7 +7,7 @@ export const MACHINE_INPUT_META: Record<MachineInputMember["kind"], string> = {
|
|
|
7
7
|
session_wait_timeout: "Wait ended",
|
|
8
8
|
agent_message: "Agent update",
|
|
9
9
|
agent_steer_instruction: "Agent direction",
|
|
10
|
-
child_terminal_result: "Agent
|
|
10
|
+
child_terminal_result: "Agent result received",
|
|
11
11
|
media_generation_result: "Video update",
|
|
12
12
|
child_requires_action: "Agent needs input",
|
|
13
13
|
child_requires_action_resolved: "Agent unblocked",
|
|
@@ -35,7 +35,7 @@ export function machineInputBatchLabel(members: readonly MachineInputMember[]):
|
|
|
35
35
|
case "session_wait_timeout":
|
|
36
36
|
return n === 1 ? "Wait ended" : `${n} waits ended`;
|
|
37
37
|
case "child_terminal_result":
|
|
38
|
-
return n === 1 ? "Agent
|
|
38
|
+
return n === 1 ? "Agent result received" : `${n} agent results received`;
|
|
39
39
|
case "goal_continuation":
|
|
40
40
|
return n === 1 ? "Goal continued" : `${n} goal continuations`;
|
|
41
41
|
case "scheduled_occurrence":
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ChildSessionLink } from "./child-session-link";
|
|
1
2
|
import type {
|
|
2
3
|
DraftTimelineAnnotation,
|
|
3
4
|
MediaGenerationResult,
|
|
@@ -2847,7 +2848,11 @@ export function TimelineRow({
|
|
|
2847
2848
|
return <GoalRow item={item} />;
|
|
2848
2849
|
case "machine-input-batch":
|
|
2849
2850
|
return (
|
|
2850
|
-
<MachineInputBatchRow
|
|
2851
|
+
<MachineInputBatchRow
|
|
2852
|
+
item={item}
|
|
2853
|
+
onOpenSession={onOpenSession}
|
|
2854
|
+
loadVideoArtifactPlayback={loadVideoArtifactPlayback}
|
|
2855
|
+
/>
|
|
2851
2856
|
);
|
|
2852
2857
|
case "notice":
|
|
2853
2858
|
return <NoticeRow item={item} />;
|
|
@@ -3460,9 +3465,11 @@ function GoalRow({ item }: { item: GoalItem }) {
|
|
|
3460
3465
|
|
|
3461
3466
|
function MachineInputBatchRow({
|
|
3462
3467
|
item,
|
|
3468
|
+
onOpenSession,
|
|
3463
3469
|
loadVideoArtifactPlayback,
|
|
3464
3470
|
}: {
|
|
3465
3471
|
item: MachineInputBatchItem;
|
|
3472
|
+
onOpenSession?: ((sessionId: string) => void) | undefined;
|
|
3466
3473
|
loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;
|
|
3467
3474
|
}) {
|
|
3468
3475
|
const enter = useEntranceAnimation();
|
|
@@ -3509,6 +3516,7 @@ function MachineInputBatchRow({
|
|
|
3509
3516
|
<MachineInputRow
|
|
3510
3517
|
key={member.id}
|
|
3511
3518
|
member={member}
|
|
3519
|
+
onOpenSession={onOpenSession}
|
|
3512
3520
|
loadVideoArtifactPlayback={loadVideoArtifactPlayback}
|
|
3513
3521
|
/>
|
|
3514
3522
|
))}
|
|
@@ -3525,9 +3533,11 @@ function MachineInputBatchRow({
|
|
|
3525
3533
|
|
|
3526
3534
|
function MachineInputRow({
|
|
3527
3535
|
member,
|
|
3536
|
+
onOpenSession,
|
|
3528
3537
|
loadVideoArtifactPlayback,
|
|
3529
3538
|
}: {
|
|
3530
3539
|
member: MachineInputBatchItem["members"][number];
|
|
3540
|
+
onOpenSession?: ((sessionId: string) => void) | undefined;
|
|
3531
3541
|
loadVideoArtifactPlayback?: VideoArtifactPlaybackLoader | undefined;
|
|
3532
3542
|
}) {
|
|
3533
3543
|
if (member.kind === "media_generation_result" && member.result) {
|
|
@@ -3554,6 +3564,11 @@ function MachineInputRow({
|
|
|
3554
3564
|
{truncate(summary, 320)}
|
|
3555
3565
|
</p>
|
|
3556
3566
|
) : null}
|
|
3567
|
+
<ChildSessionLink
|
|
3568
|
+
kind={member.kind}
|
|
3569
|
+
sourceId={member.sourceId}
|
|
3570
|
+
onOpenSession={onOpenSession}
|
|
3571
|
+
/>
|
|
3557
3572
|
</div>
|
|
3558
3573
|
</div>
|
|
3559
3574
|
);
|
|
@@ -3662,7 +3677,7 @@ function NoticeRow({ item }: { item: NoticeItem }) {
|
|
|
3662
3677
|
{item.details ? (
|
|
3663
3678
|
<details className="mt-2 text-og-control">
|
|
3664
3679
|
<summary className="cursor-pointer font-medium">{item.details.label}</summary>
|
|
3665
|
-
<pre className="mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-all rounded-og-sm bg-
|
|
3680
|
+
<pre className="mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-all rounded-og-sm bg-og-fg/5 p-2 font-mono">
|
|
3666
3681
|
{JSON.stringify(item.details.value, null, 2)}
|
|
3667
3682
|
</pre>
|
|
3668
3683
|
</details>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ChildSessionLink } from "./child-session-link";
|
|
1
2
|
/**
|
|
2
3
|
* SessionChrome — compact merged session signals above the composer.
|
|
3
4
|
*
|
|
@@ -39,7 +40,12 @@
|
|
|
39
40
|
* shell uses one CSS grid-track transition for deliberate open/close actions;
|
|
40
41
|
* live queue reconciliation never feeds measurements back into layout.
|
|
41
42
|
*/
|
|
42
|
-
import type {
|
|
43
|
+
import type {
|
|
44
|
+
SessionGoal,
|
|
45
|
+
SessionPendingInputPreview,
|
|
46
|
+
SessionStatus,
|
|
47
|
+
SessionTurn,
|
|
48
|
+
} from "@opengeni/sdk";
|
|
43
49
|
import {
|
|
44
50
|
ActivityIcon,
|
|
45
51
|
AudioLinesIcon,
|
|
@@ -89,6 +95,8 @@ export type SessionChromeAgentsSignal = {
|
|
|
89
95
|
|
|
90
96
|
export type SessionChromeProps = {
|
|
91
97
|
compact?: boolean;
|
|
98
|
+
/** Authoritative execution status; omitted by older embedding hosts. */
|
|
99
|
+
sessionStatus?: SessionStatus | undefined;
|
|
92
100
|
queue: UseTurnQueueResult;
|
|
93
101
|
/** Needed for queue edit → composer checkout. Omit with `readOnly`. */
|
|
94
102
|
composer?: ComposerState | undefined;
|
|
@@ -105,6 +113,8 @@ export type SessionChromeProps = {
|
|
|
105
113
|
* (and the gallery) may still pass a handler so the action is visible.
|
|
106
114
|
*/
|
|
107
115
|
onDismissIncoming?: ((inputId: string) => void) | undefined;
|
|
116
|
+
/** Open a typed child update's source through the host's normal authorized route. */
|
|
117
|
+
onOpenSession?: ((sessionId: string) => void) | undefined;
|
|
108
118
|
readOnly?: boolean | undefined;
|
|
109
119
|
className?: string | undefined;
|
|
110
120
|
/** Controlled active segment; omit for uncontrolled. */
|
|
@@ -117,6 +127,7 @@ type GoalPillState =
|
|
|
117
127
|
| "pursuing"
|
|
118
128
|
| "waiting"
|
|
119
129
|
| "scheduled"
|
|
130
|
+
| "session_failed"
|
|
120
131
|
| "blocked"
|
|
121
132
|
| "held"
|
|
122
133
|
| "paused"
|
|
@@ -133,6 +144,7 @@ const GOAL_LABEL: Record<GoalPillState, string> = {
|
|
|
133
144
|
waiting: "Waiting",
|
|
134
145
|
scheduled: "Waiting",
|
|
135
146
|
blocked: "Blocked",
|
|
147
|
+
session_failed: "Blocked by session failure",
|
|
136
148
|
held: "Held",
|
|
137
149
|
paused: "Paused",
|
|
138
150
|
invariant_broken: "Needs attention",
|
|
@@ -187,6 +199,9 @@ export function sessionChromeGoalPillExplanation(
|
|
|
187
199
|
record: GoalPillRecord | null | undefined,
|
|
188
200
|
): string | null {
|
|
189
201
|
const continuation = record?.continuation ?? null;
|
|
202
|
+
if (state === "session_failed") {
|
|
203
|
+
return "Resolve the session failure, then use Continue or send a message to continue this active goal.";
|
|
204
|
+
}
|
|
190
205
|
if (state === "paused") {
|
|
191
206
|
return record?.pausedReason
|
|
192
207
|
? (GOAL_PAUSED_REASON_EXPLANATION[record.pausedReason] ?? null)
|
|
@@ -309,9 +324,11 @@ function objectValue(value: unknown): Record<string, unknown> | null {
|
|
|
309
324
|
export function sessionChromeGoalPillState(
|
|
310
325
|
goalStatus: "active" | "paused" | "completed",
|
|
311
326
|
continuation: SessionGoal["continuation"] | null | undefined,
|
|
327
|
+
sessionStatus?: SessionStatus,
|
|
312
328
|
): GoalPillState {
|
|
313
329
|
if (goalStatus === "completed") return "completed";
|
|
314
330
|
if (goalStatus === "paused") return "paused";
|
|
331
|
+
if (sessionStatus === "failed") return "session_failed";
|
|
315
332
|
if (!continuation) return "invariant_broken";
|
|
316
333
|
if (continuation.state === "running") {
|
|
317
334
|
return continuation.reason === "goal_turn_running"
|
|
@@ -411,6 +428,7 @@ function toneClass(tone: SessionChromeSignalTone, selected: boolean): string {
|
|
|
411
428
|
|
|
412
429
|
export function SessionChrome({
|
|
413
430
|
compact = false,
|
|
431
|
+
sessionStatus,
|
|
414
432
|
queue,
|
|
415
433
|
composer,
|
|
416
434
|
goal,
|
|
@@ -419,6 +437,7 @@ export function SessionChrome({
|
|
|
419
437
|
commandsCount = 0,
|
|
420
438
|
agentsSignal,
|
|
421
439
|
onDismissIncoming,
|
|
440
|
+
onOpenSession,
|
|
422
441
|
readOnly = false,
|
|
423
442
|
className,
|
|
424
443
|
active: activeControlled,
|
|
@@ -458,7 +477,9 @@ export function SessionChrome({
|
|
|
458
477
|
const canMutateQueue = !readOnly && composer !== undefined;
|
|
459
478
|
|
|
460
479
|
const elapsed = useLiveElapsed(record?.createdAt, Boolean(record));
|
|
461
|
-
const goalState = record
|
|
480
|
+
const goalState = record
|
|
481
|
+
? sessionChromeGoalPillState(record.status, record.continuation, sessionStatus)
|
|
482
|
+
: null;
|
|
462
483
|
|
|
463
484
|
const initialAuthoritativeQueuedCount = countAuthoritativeQueuedTurns(
|
|
464
485
|
queue.queue,
|
|
@@ -571,6 +592,7 @@ export function SessionChrome({
|
|
|
571
592
|
const waiting =
|
|
572
593
|
goalState === "waiting" ||
|
|
573
594
|
goalState === "blocked" ||
|
|
595
|
+
goalState === "session_failed" ||
|
|
574
596
|
goalState === "held" ||
|
|
575
597
|
goalState === "paused";
|
|
576
598
|
const explanation = sessionChromeGoalPillExplanation(goalState, record);
|
|
@@ -751,7 +773,11 @@ export function SessionChrome({
|
|
|
751
773
|
|
|
752
774
|
const panelBody =
|
|
753
775
|
active === "incoming" ? (
|
|
754
|
-
<IncomingPanel
|
|
776
|
+
<IncomingPanel
|
|
777
|
+
inputs={incoming}
|
|
778
|
+
onDismiss={onDismissIncoming}
|
|
779
|
+
onOpenSession={onOpenSession}
|
|
780
|
+
/>
|
|
755
781
|
) : active === "queue" ? (
|
|
756
782
|
<QueuePanel
|
|
757
783
|
turns={queuedTurns}
|
|
@@ -1221,47 +1247,59 @@ export function SessionChrome({
|
|
|
1221
1247
|
function IncomingPanel({
|
|
1222
1248
|
inputs,
|
|
1223
1249
|
onDismiss,
|
|
1250
|
+
onOpenSession,
|
|
1224
1251
|
}: {
|
|
1225
1252
|
inputs: SessionPendingInputPreview[];
|
|
1226
1253
|
onDismiss?: ((inputId: string) => void) | undefined;
|
|
1254
|
+
onOpenSession?: ((sessionId: string) => void) | undefined;
|
|
1227
1255
|
}) {
|
|
1228
1256
|
return (
|
|
1229
|
-
<
|
|
1230
|
-
className="
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
className={cn(
|
|
1241
|
-
"mt-px shrink-0 rounded px-1 py-px text-[10px] font-medium leading-4",
|
|
1242
|
-
input.classification === "action_required" || input.classification === "failure"
|
|
1243
|
-
? "bg-og-status-waiting/12 text-og-status-waiting"
|
|
1244
|
-
: "bg-og-surface-3/80 text-og-fg-muted",
|
|
1245
|
-
)}
|
|
1257
|
+
<div>
|
|
1258
|
+
<p className="mb-2 text-og-xs text-og-fg-subtle">Waiting to be included in an agent turn.</p>
|
|
1259
|
+
<ul
|
|
1260
|
+
className="flex flex-col gap-0.5"
|
|
1261
|
+
aria-label="Incoming updates"
|
|
1262
|
+
data-og-session-chrome-panel="incoming"
|
|
1263
|
+
>
|
|
1264
|
+
{inputs.map((input) => (
|
|
1265
|
+
<li
|
|
1266
|
+
key={input.id}
|
|
1267
|
+
className="group flex items-start gap-1.5 rounded-og-sm px-1.5 py-1 transition-colors hover:bg-[var(--_og-session-chrome-row-hover)]"
|
|
1246
1268
|
>
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1269
|
+
<span
|
|
1270
|
+
className={cn(
|
|
1271
|
+
"mt-px shrink-0 rounded px-1 py-px text-[10px] font-medium leading-4",
|
|
1272
|
+
input.classification === "action_required" || input.classification === "failure"
|
|
1273
|
+
? "bg-og-status-waiting/12 text-og-status-waiting"
|
|
1274
|
+
: "bg-og-surface-3/80 text-og-fg-muted",
|
|
1275
|
+
)}
|
|
1276
|
+
>
|
|
1277
|
+
{pendingKindLabel(input.kind)}
|
|
1278
|
+
</span>
|
|
1279
|
+
<div className="min-w-0 flex-1">
|
|
1280
|
+
<p className="break-words text-og-xs leading-4 text-og-fg">{input.summary}</p>
|
|
1281
|
+
<ChildSessionLink
|
|
1282
|
+
kind={input.kind}
|
|
1283
|
+
sourceId={input.sourceId}
|
|
1284
|
+
onOpenSession={onOpenSession}
|
|
1285
|
+
/>
|
|
1260
1286
|
</div>
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1287
|
+
{onDismiss ? (
|
|
1288
|
+
<div className="flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 max-sm:opacity-100">
|
|
1289
|
+
<IconAction
|
|
1290
|
+
label={`Dismiss incoming ${pendingKindLabel(input.kind)}`}
|
|
1291
|
+
tip="Dismiss"
|
|
1292
|
+
onClick={() => onDismiss(input.id)}
|
|
1293
|
+
danger
|
|
1294
|
+
>
|
|
1295
|
+
<Trash2Icon className="size-3" />
|
|
1296
|
+
</IconAction>
|
|
1297
|
+
</div>
|
|
1298
|
+
) : null}
|
|
1299
|
+
</li>
|
|
1300
|
+
))}
|
|
1301
|
+
</ul>
|
|
1302
|
+
</div>
|
|
1265
1303
|
);
|
|
1266
1304
|
}
|
|
1267
1305
|
|
package/styles/compiled.css
CHANGED
|
@@ -2307,12 +2307,6 @@
|
|
|
2307
2307
|
:where(.og-root).bg-black,:where(.og-root) .bg-black {
|
|
2308
2308
|
background-color: var(--color-black);
|
|
2309
2309
|
}
|
|
2310
|
-
:where(.og-root).bg-black\/5,:where(.og-root) .bg-black\/5 {
|
|
2311
|
-
background-color: color-mix(in srgb, #000 5%, transparent);
|
|
2312
|
-
@supports (color: color-mix(in lab, red, red)) {
|
|
2313
|
-
background-color: color-mix(in oklab, var(--color-black) 5%, transparent);
|
|
2314
|
-
}
|
|
2315
|
-
}
|
|
2316
2310
|
:where(.og-root).bg-black\/45,:where(.og-root) .bg-black\/45 {
|
|
2317
2311
|
background-color: color-mix(in srgb, #000 45%, transparent);
|
|
2318
2312
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -2430,6 +2424,12 @@
|
|
|
2430
2424
|
:where(.og-root).bg-og-fg-subtle,:where(.og-root) .bg-og-fg-subtle {
|
|
2431
2425
|
background-color: var(--og-color-fg-subtle);
|
|
2432
2426
|
}
|
|
2427
|
+
:where(.og-root).bg-og-fg\/5,:where(.og-root) .bg-og-fg\/5 {
|
|
2428
|
+
background-color: var(--og-color-fg);
|
|
2429
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
2430
|
+
background-color: color-mix(in oklab, var(--og-color-fg) 5%, transparent);
|
|
2431
|
+
}
|
|
2432
|
+
}
|
|
2433
2433
|
:where(.og-root).bg-og-status-cancelled,:where(.og-root) .bg-og-status-cancelled {
|
|
2434
2434
|
background-color: var(--og-color-status-cancelled);
|
|
2435
2435
|
}
|
|
@@ -3257,6 +3257,9 @@
|
|
|
3257
3257
|
:where(.og-root).underline-offset-2,:where(.og-root) .underline-offset-2 {
|
|
3258
3258
|
text-underline-offset: 2px;
|
|
3259
3259
|
}
|
|
3260
|
+
:where(.og-root).underline-offset-4,:where(.og-root) .underline-offset-4 {
|
|
3261
|
+
text-underline-offset: 4px;
|
|
3262
|
+
}
|
|
3260
3263
|
:where(.og-root).accent-og-accent,:where(.og-root) .accent-og-accent {
|
|
3261
3264
|
accent-color: var(--og-color-accent);
|
|
3262
3265
|
}
|
|
@@ -4523,6 +4526,22 @@
|
|
|
4523
4526
|
}
|
|
4524
4527
|
}
|
|
4525
4528
|
}
|
|
4529
|
+
:where(.og-root).focus-visible\:outline-2,:where(.og-root) .focus-visible\:outline-2 {
|
|
4530
|
+
&:focus-visible {
|
|
4531
|
+
outline-style: var(--tw-outline-style);
|
|
4532
|
+
outline-width: 2px;
|
|
4533
|
+
}
|
|
4534
|
+
}
|
|
4535
|
+
:where(.og-root).focus-visible\:outline-offset-2,:where(.og-root) .focus-visible\:outline-offset-2 {
|
|
4536
|
+
&:focus-visible {
|
|
4537
|
+
outline-offset: 2px;
|
|
4538
|
+
}
|
|
4539
|
+
}
|
|
4540
|
+
:where(.og-root).focus-visible\:outline-og-accent,:where(.og-root) .focus-visible\:outline-og-accent {
|
|
4541
|
+
&:focus-visible {
|
|
4542
|
+
outline-color: var(--og-color-accent);
|
|
4543
|
+
}
|
|
4544
|
+
}
|
|
4526
4545
|
:where(.og-root).focus-visible\:ring-inset,:where(.og-root) .focus-visible\:ring-inset {
|
|
4527
4546
|
&:focus-visible {
|
|
4528
4547
|
--tw-ring-inset: inset;
|
|
@@ -5077,14 +5096,6 @@
|
|
|
5077
5096
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
5078
5097
|
}
|
|
5079
5098
|
}
|
|
5080
|
-
:where(.og-root).dark\:bg-white\/5,:where(.og-root) .dark\:bg-white\/5 {
|
|
5081
|
-
@media (prefers-color-scheme: dark) {
|
|
5082
|
-
background-color: color-mix(in srgb, #fff 5%, transparent);
|
|
5083
|
-
@supports (color: color-mix(in lab, red, red)) {
|
|
5084
|
-
background-color: color-mix(in oklab, var(--color-white) 5%, transparent);
|
|
5085
|
-
}
|
|
5086
|
-
}
|
|
5087
|
-
}
|
|
5088
5099
|
:where(.og-root).dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20,:where(.og-root) .dark\:data-\[variant\=destructive\]\:focus\:bg-destructive\/20 {
|
|
5089
5100
|
@media (prefers-color-scheme: dark) {
|
|
5090
5101
|
&[data-variant="destructive"] {
|