@opengeni/react 3.8.0-canary.0 → 4.0.1-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +11 -24
  2. package/dist/artifacts.js +7 -7
  3. package/dist/{browser-viewer-SS46LUAC.js → browser-viewer-NTD6UIPR.js} +3 -3
  4. package/dist/{chunk-VEPNNDNG.js → chunk-24M4YBCL.js} +4 -4
  5. package/dist/chunk-5M6VTFJ5.js +171 -0
  6. package/dist/chunk-5M6VTFJ5.js.map +1 -0
  7. package/dist/{chunk-IOLVN74D.js → chunk-6J56T3MG.js} +15 -1
  8. package/dist/chunk-6J56T3MG.js.map +1 -0
  9. package/dist/{chunk-ELIYWBZR.js → chunk-BV5A4OTE.js} +4 -4
  10. package/dist/{chunk-3HIF5IFC.js → chunk-HO6X4FHG.js} +2597 -1030
  11. package/dist/chunk-HO6X4FHG.js.map +1 -0
  12. package/dist/{chunk-BXJOQFCD.js → chunk-HUMIRRYI.js} +84 -221
  13. package/dist/chunk-HUMIRRYI.js.map +1 -0
  14. package/dist/{chunk-ZFOFY5ST.js → chunk-NLTS7JHI.js} +16 -31
  15. package/dist/chunk-NLTS7JHI.js.map +1 -0
  16. package/dist/chunk-NOSYBS2D.js +208 -0
  17. package/dist/chunk-NOSYBS2D.js.map +1 -0
  18. package/dist/chunk-YBM6CQRU.js +292 -0
  19. package/dist/chunk-YBM6CQRU.js.map +1 -0
  20. package/dist/{chunk-BQGIXRKV.js → chunk-Z7WBDB4E.js} +416 -290
  21. package/dist/chunk-Z7WBDB4E.js.map +1 -0
  22. package/dist/chunk-ZYRGEKWS.js +216 -0
  23. package/dist/chunk-ZYRGEKWS.js.map +1 -0
  24. package/dist/components/composer.d.ts +4 -2
  25. package/dist/components/human-input-form.d.ts +3 -1
  26. package/dist/components/human-input-surface.d.ts +3 -2
  27. package/dist/components/message-timeline.d.ts +9 -2
  28. package/dist/components/session-conversation.d.ts +2 -0
  29. package/dist/components/timeline-annotation-chrome.d.ts +25 -0
  30. package/dist/components/timeline-annotation-layout.d.ts +42 -0
  31. package/dist/components/timeline-annotation-markers.d.ts +8 -0
  32. package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
  33. package/dist/components/timeline-annotation-shared.d.ts +31 -0
  34. package/dist/components/timeline-annotations-dialog.d.ts +1 -1
  35. package/dist/components/timeline-annotations.d.ts +8 -2
  36. package/dist/composer.js +3 -4
  37. package/dist/{computer-viewer-FWEZISW4.js → computer-viewer-7TEZC6Y2.js} +3 -3
  38. package/dist/hooks/use-codex-accounts.d.ts +11 -1
  39. package/dist/hooks/use-composer.d.ts +2 -0
  40. package/dist/hooks/use-session-events.d.ts +2 -2
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +50 -37
  43. package/dist/index.js.map +1 -1
  44. package/dist/interaction.js +3 -3
  45. package/dist/machines.js +1 -1
  46. package/dist/older-history.d.ts +3 -2
  47. package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-27LKAWZD.js} +2 -2
  48. package/dist/platform-activity-row-27LKAWZD.js.map +1 -0
  49. package/dist/{queue-surface-implementation-XL2A6PBM.js → queue-surface-implementation-LK3S4BIW.js} +5 -2
  50. package/dist/{queue-surface-implementation-XL2A6PBM.js.map → queue-surface-implementation-LK3S4BIW.js.map} +1 -1
  51. package/dist/realtime.js +3 -3
  52. package/dist/session-ui.js +11 -11
  53. package/dist/session.js +2 -2
  54. package/dist/timeline/types.d.ts +3 -0
  55. package/dist/timeline-annotation-markers-DRSTLEM6.js +165 -0
  56. package/dist/timeline-annotation-markers-DRSTLEM6.js.map +1 -0
  57. package/dist/timeline-annotation-selection-IHLUGVND.js +236 -0
  58. package/dist/timeline-annotation-selection-IHLUGVND.js.map +1 -0
  59. package/dist/timeline-annotations-dialog-6Q53N5FG.js +262 -0
  60. package/dist/timeline-annotations-dialog-6Q53N5FG.js.map +1 -0
  61. package/package.json +2 -6
  62. package/src/components/chat-composer.tsx +5 -2
  63. package/src/components/composer.tsx +40 -5
  64. package/src/components/copy-button.tsx +1 -0
  65. package/src/components/human-input-form.tsx +185 -53
  66. package/src/components/human-input-surface.tsx +3 -0
  67. package/src/components/machines-dashboard.tsx +1 -16
  68. package/src/components/message-timeline.tsx +397 -302
  69. package/src/components/session-commands-panel.tsx +7 -1
  70. package/src/components/session-conversation.tsx +4 -1
  71. package/src/components/timeline-annotation-chrome.tsx +183 -0
  72. package/src/components/timeline-annotation-layout.ts +268 -0
  73. package/src/components/timeline-annotation-markers.tsx +185 -0
  74. package/src/components/timeline-annotation-reveal-context.ts +9 -0
  75. package/src/components/timeline-annotation-selection.tsx +99 -54
  76. package/src/components/timeline-annotation-shared.ts +245 -0
  77. package/src/components/timeline-annotations-dialog.tsx +172 -128
  78. package/src/components/timeline-annotations.tsx +178 -45
  79. package/src/hooks/use-codex-accounts.ts +32 -5
  80. package/src/hooks/use-composer.ts +17 -0
  81. package/src/hooks/use-session-events.ts +16 -277
  82. package/src/index.ts +0 -1
  83. package/src/older-history.ts +22 -4
  84. package/src/timeline/platform-activity-row.tsx +4 -1
  85. package/src/timeline/projection.ts +99 -9
  86. package/src/timeline/types.ts +3 -0
  87. package/styles/compiled.css +86 -22
  88. package/dist/chat.d.ts +0 -37
  89. package/dist/chat.js +0 -315
  90. package/dist/chat.js.map +0 -1
  91. package/dist/chunk-3HIF5IFC.js.map +0 -1
  92. package/dist/chunk-BQGIXRKV.js.map +0 -1
  93. package/dist/chunk-BXJOQFCD.js.map +0 -1
  94. package/dist/chunk-F2CFHN3Y.js +0 -1415
  95. package/dist/chunk-F2CFHN3Y.js.map +0 -1
  96. package/dist/chunk-HQV2I5HV.js +0 -124
  97. package/dist/chunk-HQV2I5HV.js.map +0 -1
  98. package/dist/chunk-IOLVN74D.js.map +0 -1
  99. package/dist/chunk-W3OUAH6M.js +0 -170
  100. package/dist/chunk-W3OUAH6M.js.map +0 -1
  101. package/dist/chunk-ZFOFY5ST.js.map +0 -1
  102. package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
  103. package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
  104. package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
  105. package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
  106. package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
  107. package/src/chat.tsx +0 -393
  108. /package/dist/{browser-viewer-SS46LUAC.js.map → browser-viewer-NTD6UIPR.js.map} +0 -0
  109. /package/dist/{chunk-VEPNNDNG.js.map → chunk-24M4YBCL.js.map} +0 -0
  110. /package/dist/{chunk-ELIYWBZR.js.map → chunk-BV5A4OTE.js.map} +0 -0
  111. /package/dist/{computer-viewer-FWEZISW4.js.map → computer-viewer-7TEZC6Y2.js.map} +0 -0
@@ -135,6 +135,7 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
135
135
  const ordered = orderTimelineEvents(events, prescan);
136
136
  const pendingWaitOutcomeByTurn = new Map<string | null, PendingWaitOutcome>();
137
137
  const latestAgentResponseByTurn = new Map<string | null, TrackedAgentResponse>();
138
+ const identifiedMessages = new Map<string, AgentMessageItem>();
138
139
  const humanInputRequests = humanInputRequestsById(events);
139
140
  const humanInputToolCallIds = new Set(
140
141
  [...humanInputRequests.values()]
@@ -157,6 +158,7 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
157
158
  mode = 0,
158
159
  explicitStartedAt?: string,
159
160
  explicitId?: string,
161
+ blockedReason?: StartupPhaseItem["blockedReason"],
160
162
  ): void => {
161
163
  const key = `${startupTurnId}:${phase}`;
162
164
  const priorState = startupPhases.get(key);
@@ -183,6 +185,7 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
183
185
  ? elapsedDurationMs(open.startedAt, startupEvent.occurredAt)
184
186
  : Math.max(0, duration);
185
187
  open.outcome = outcome ?? open.outcome;
188
+ open.blockedReason = blockedReason;
186
189
  return;
187
190
  }
188
191
  const running = status === "running";
@@ -201,6 +204,7 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
201
204
  completedAt: running ? null : startupEvent.occurredAt,
202
205
  durationMs,
203
206
  outcome,
207
+ blockedReason,
204
208
  occurredAt: startedAt,
205
209
  } satisfies Partial<StartupPhaseItem>);
206
210
  startupPhases.set(key, [prior, startupAttemptId, startupRecoveryRevision]);
@@ -216,6 +220,7 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
216
220
  completedAt: running ? null : startupEvent.occurredAt,
217
221
  durationMs,
218
222
  outcome,
223
+ blockedReason,
219
224
  occurredAt: startedAt,
220
225
  };
221
226
  items.push(item);
@@ -408,8 +413,43 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
408
413
  if (!text) {
409
414
  break;
410
415
  }
416
+ const messageId = stringValue(payload.messageId);
417
+ const messageKey = messageId ? JSON.stringify([turnId, messageId]) : null;
418
+ const identified = messageKey ? identifiedMessages.get(messageKey) : undefined;
419
+ if (identified) {
420
+ if (identified.annotationSource?.eventType !== "agent.message.completed") {
421
+ identified.text += text;
422
+ rememberAgentResponse(turnId, identified, false);
423
+ }
424
+ break;
425
+ }
411
426
  const open = last();
412
- if (open?.kind === "agent-message" && open.streaming && open.turnId === turnId) {
427
+ if (!messageKey && open?.kind === "tool-call" && open.status === "running") {
428
+ const previous = latestAgentResponseByTurn.get(turnId);
429
+ const previousIndex = previous ? items.indexOf(previous.item) : -1;
430
+ if (
431
+ previous &&
432
+ !previous.completed &&
433
+ previousIndex >= 0 &&
434
+ items
435
+ .slice(previousIndex + 1)
436
+ .every(
437
+ (item) =>
438
+ item.kind === "tool-call" && item.turnId === turnId && item.status === "running",
439
+ )
440
+ ) {
441
+ // Legacy deltas have no provider message identity. Tool creation
442
+ // alone is not a text boundary; completed output still is.
443
+ previous.item.text += text;
444
+ break;
445
+ }
446
+ }
447
+ if (
448
+ !messageKey &&
449
+ open?.kind === "agent-message" &&
450
+ open.streaming &&
451
+ open.turnId === turnId
452
+ ) {
413
453
  open.text += text;
414
454
  rememberAgentResponse(turnId, open, false);
415
455
  break;
@@ -424,18 +464,21 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
424
464
  occurredAt: event.occurredAt,
425
465
  };
426
466
  items.push(item);
467
+ if (messageKey) identifiedMessages.set(messageKey, item);
427
468
  rememberAgentResponse(turnId, item, false);
428
469
  break;
429
470
  }
430
471
 
431
472
  case "agent.message.completed": {
432
473
  const text = stringValue(payload.text);
474
+ const messageId = stringValue(payload.messageId);
475
+ const messageKey = messageId ? JSON.stringify([turnId, messageId]) : null;
433
476
  const phase = assistantMessagePhase(payload.phase);
434
477
  // Reconcile the most recent same-turn agent message — even when
435
478
  // activity (tool calls, reasoning) landed after its deltas — so the
436
479
  // completed text never duplicates the streamed one.
437
- let openIndex = -1;
438
- for (let index = items.length - 1; index >= 0; index -= 1) {
480
+ let openIndex = messageKey ? items.indexOf(identifiedMessages.get(messageKey)!) : -1;
481
+ for (let index = messageKey ? -1 : items.length - 1; index >= 0; index -= 1) {
439
482
  const candidate = items[index];
440
483
  if (candidate?.kind === "agent-message" && candidate.turnId === turnId) {
441
484
  openIndex = index;
@@ -447,10 +490,15 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
447
490
  candidate?.kind === "agent-message" ? candidate : undefined;
448
491
  if (
449
492
  open &&
450
- (open.streaming || !open.text || text === open.text || text.startsWith(open.text))
493
+ (messageKey ||
494
+ open.streaming ||
495
+ !open.text ||
496
+ text === open.text ||
497
+ text.startsWith(open.text))
451
498
  ) {
452
- // The completed text is authoritative when it extends what streamed.
453
- if (!open.text || (text && text.startsWith(open.text))) {
499
+ // Identity makes the final text authoritative even if it corrects the
500
+ // draft; legacy receipts still require an extension match.
501
+ if (!open.text || (text && (messageKey || text.startsWith(open.text)))) {
454
502
  open.text = text || open.text;
455
503
  }
456
504
  open.streaming = false;
@@ -502,6 +550,7 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
502
550
  },
503
551
  };
504
552
  items.push(item);
553
+ if (messageKey) identifiedMessages.set(messageKey, item);
505
554
  rememberAgentResponse(turnId, item, true);
506
555
  }
507
556
  break;
@@ -693,7 +742,18 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
693
742
  const startupPhase = startupPhaseForSandboxOperation(name);
694
743
  if (startupPhase) {
695
744
  closeStreamingTail();
696
- settleStartupPhase(startupPhase, status, numberOrNull(payload.durationMs), origin);
745
+ settleStartupPhase(
746
+ startupPhase,
747
+ status,
748
+ numberOrNull(payload.durationMs),
749
+ origin,
750
+ 0,
751
+ undefined,
752
+ undefined,
753
+ status === "cancelled" && payload.failureCode === "rotation_in_progress"
754
+ ? "rotation_in_progress"
755
+ : undefined,
756
+ );
697
757
  break;
698
758
  }
699
759
  // Routine per-turn platform plumbing that runs before EVERY turn to
@@ -1039,11 +1099,17 @@ export function buildTimeline(events: SessionEvent[]): TimelineItem[] {
1039
1099
  }
1040
1100
  }
1041
1101
  finalizeOpen(turnId, "complete", event.occurredAt);
1042
- items.push(turnEndItem(event, "complete", null));
1102
+ const completedTurn = turnEndItem(event, "complete", null);
1103
+ items.push(completedTurn);
1043
1104
  const hasCompletedFinalResponse =
1044
1105
  latestAgentResponse?.completed === true &&
1045
1106
  latestAgentResponse.item.phase !== "commentary" &&
1046
1107
  Boolean(visibleTrackedResponse);
1108
+ if (!hasAuthoritativeFinalOutput && pendingWaitOutcome) {
1109
+ // Preserve existing prose, including delta-only streams, when a
1110
+ // trailing wait yields without a terminal output receipt.
1111
+ completedTurn.preserveWaitResponse = true;
1112
+ }
1047
1113
  if (!hasAuthoritativeFinalOutput && !hasCompletedFinalResponse && pendingWaitOutcome) {
1048
1114
  items.push({
1049
1115
  kind: "notice",
@@ -1808,7 +1874,31 @@ function foldSettledTurn(groups: TimelineGroup[], turnEnd: TurnEndItem): void {
1808
1874
  return;
1809
1875
  }
1810
1876
 
1811
- const finalMessage = extractFinalAgentMessage(collected, turnEnd);
1877
+ // Resolve only inside this turn's collected suffix. A user/machine-input
1878
+ // boundary or an interleaved foreign turn must never donate its answer.
1879
+ const waitMessages = turnEnd.preserveWaitResponse
1880
+ ? collected.filter(
1881
+ (group): group is Extract<TimelineGroup, { kind: "item" }> =>
1882
+ group.kind === "item" &&
1883
+ group.item.kind === "agent-message" &&
1884
+ !group.item.streaming &&
1885
+ group.item.text.trim().length > 0 &&
1886
+ belongsToTurn(group.item, turnEnd.turnId),
1887
+ )
1888
+ : [];
1889
+ // A completed answer outranks later commentary. Otherwise use the latest
1890
+ // visible existing prose, ignoring whitespace and opaque-only stream tails.
1891
+ const waitResponse =
1892
+ waitMessages
1893
+ .slice()
1894
+ .reverse()
1895
+ .find(
1896
+ (group) =>
1897
+ group.item.kind === "agent-message" &&
1898
+ group.item.phase !== "commentary" &&
1899
+ group.item.annotationSource?.eventType === "agent.message.completed",
1900
+ ) ?? waitMessages.at(-1);
1901
+ const finalMessage = waitResponse ?? extractFinalAgentMessage(collected, turnEnd);
1812
1902
  const fallbackMessage =
1813
1903
  finalMessage || hasOrdinaryFinalAgentMessage(collected, turnEnd)
1814
1904
  ? null
@@ -215,6 +215,7 @@ export type StartupPhaseItem = {
215
215
  durationMs: number | null;
216
216
  /** Sandbox origin and rig marker outcomes refine the settled label only. */
217
217
  outcome: "created" | "restored" | "resumed" | "skipped" | null;
218
+ blockedReason?: "rotation_in_progress" | undefined;
218
219
  occurredAt: string;
219
220
  };
220
221
 
@@ -451,6 +452,8 @@ export type TurnOutcome = "complete" | "failed" | "cancelled";
451
452
 
452
453
  export type TurnEndItem = {
453
454
  kind: "turn-end";
455
+ /** Keep an existing answer visible when a recorded input wait ends without final output. */
456
+ preserveWaitResponse?: true;
454
457
  id: string;
455
458
  turnId: string | null;
456
459
  outcome: TurnOutcome;
@@ -469,6 +469,7 @@
469
469
  --leading-tight: 1.25;
470
470
  --leading-snug: 1.375;
471
471
  --leading-relaxed: 1.625;
472
+ --radius-2xl: 1rem;
472
473
  --ease-out: cubic-bezier(0, 0, 0.2, 1);
473
474
  --blur-sm: 8px;
474
475
  --blur-md: 12px;
@@ -1004,6 +1005,9 @@
1004
1005
  :where(.og-root).z-\[1\],:where(.og-root) .z-\[1\] {
1005
1006
  z-index: 1;
1006
1007
  }
1008
+ :where(.og-root).z-\[35\],:where(.og-root) .z-\[35\] {
1009
+ z-index: 35;
1010
+ }
1007
1011
  :where(.og-root).z-\[75\],:where(.og-root) .z-\[75\] {
1008
1012
  z-index: 75;
1009
1013
  }
@@ -1139,6 +1143,9 @@
1139
1143
  :where(.og-root).mr-2,:where(.og-root) .mr-2 {
1140
1144
  margin-right: calc(var(--spacing) * 2);
1141
1145
  }
1146
+ :where(.og-root).mb-0\.5,:where(.og-root) .mb-0\.5 {
1147
+ margin-bottom: calc(var(--spacing) * 0.5);
1148
+ }
1142
1149
  :where(.og-root).mb-1,:where(.og-root) .mb-1 {
1143
1150
  margin-bottom: calc(var(--spacing) * 1);
1144
1151
  }
@@ -1199,6 +1206,12 @@
1199
1206
  -webkit-box-orient: vertical;
1200
1207
  -webkit-line-clamp: 3;
1201
1208
  }
1209
+ :where(.og-root).line-clamp-4,:where(.og-root) .line-clamp-4 {
1210
+ overflow: hidden;
1211
+ display: -webkit-box;
1212
+ -webkit-box-orient: vertical;
1213
+ -webkit-line-clamp: 4;
1214
+ }
1202
1215
  :where(.og-root).block,:where(.og-root) .block {
1203
1216
  display: block;
1204
1217
  }
@@ -1361,9 +1374,6 @@
1361
1374
  :where(.og-root).max-h-20,:where(.og-root) .max-h-20 {
1362
1375
  max-height: calc(var(--spacing) * 20);
1363
1376
  }
1364
- :where(.og-root).max-h-28,:where(.og-root) .max-h-28 {
1365
- max-height: calc(var(--spacing) * 28);
1366
- }
1367
1377
  :where(.og-root).max-h-40,:where(.og-root) .max-h-40 {
1368
1378
  max-height: calc(var(--spacing) * 40);
1369
1379
  }
@@ -1403,12 +1413,12 @@
1403
1413
  :where(.og-root).max-h-\[min\(28rem\,50dvh\)\],:where(.og-root) .max-h-\[min\(28rem\,50dvh\)\] {
1404
1414
  max-height: min(28rem, 50dvh);
1405
1415
  }
1416
+ :where(.og-root).max-h-\[min\(28rem\,55vh\)\],:where(.og-root) .max-h-\[min\(28rem\,55vh\)\] {
1417
+ max-height: min(28rem, 55vh);
1418
+ }
1406
1419
  :where(.og-root).max-h-\[min\(30rem\,60dvh\)\],:where(.og-root) .max-h-\[min\(30rem\,60dvh\)\] {
1407
1420
  max-height: min(30rem, 60dvh);
1408
1421
  }
1409
- :where(.og-root).max-h-\[min\(32rem\,70vh\)\],:where(.og-root) .max-h-\[min\(32rem\,70vh\)\] {
1410
- max-height: min(32rem, 70vh);
1411
- }
1412
1422
  :where(.og-root).max-h-\[min\(32rem\,var\(--radix-popover-content-available-height\)\)\],:where(.og-root) .max-h-\[min\(32rem\,var\(--radix-popover-content-available-height\)\)\] {
1413
1423
  max-height: min(32rem, var(--radix-popover-content-available-height));
1414
1424
  }
@@ -1589,6 +1599,9 @@
1589
1599
  :where(.og-root).max-w-\[calc\(100vw-16px\)\],:where(.og-root) .max-w-\[calc\(100vw-16px\)\] {
1590
1600
  max-width: calc(100vw - 16px);
1591
1601
  }
1602
+ :where(.og-root).max-w-\[min\(18rem\,calc\(100vw-1\.5rem\)\)\],:where(.og-root) .max-w-\[min\(18rem\,calc\(100vw-1\.5rem\)\)\] {
1603
+ max-width: min(18rem, calc(100vw - 1.5rem));
1604
+ }
1592
1605
  :where(.og-root).max-w-full,:where(.og-root) .max-w-full {
1593
1606
  max-width: 100%;
1594
1607
  }
@@ -1607,6 +1620,9 @@
1607
1620
  :where(.og-root).min-w-0,:where(.og-root) .min-w-0 {
1608
1621
  min-width: calc(var(--spacing) * 0);
1609
1622
  }
1623
+ :where(.og-root).min-w-4,:where(.og-root) .min-w-4 {
1624
+ min-width: calc(var(--spacing) * 4);
1625
+ }
1610
1626
  :where(.og-root).min-w-10,:where(.og-root) .min-w-10 {
1611
1627
  min-width: calc(var(--spacing) * 10);
1612
1628
  }
@@ -1669,6 +1685,10 @@
1669
1685
  --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
1670
1686
  translate: var(--tw-translate-x) var(--tw-translate-y);
1671
1687
  }
1688
+ :where(.og-root).-translate-y-\[110\%\],:where(.og-root) .-translate-y-\[110\%\] {
1689
+ --tw-translate-y: calc(110% * -1);
1690
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1691
+ }
1672
1692
  :where(.og-root).-translate-y-full,:where(.og-root) .-translate-y-full {
1673
1693
  --tw-translate-y: -100%;
1674
1694
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -1993,6 +2013,9 @@
1993
2013
  :where(.og-root).rounded,:where(.og-root) .rounded {
1994
2014
  border-radius: 0.25rem;
1995
2015
  }
2016
+ :where(.og-root).rounded-2xl,:where(.og-root) .rounded-2xl {
2017
+ border-radius: var(--radius-2xl);
2018
+ }
1996
2019
  :where(.og-root).rounded-\[2px\],:where(.og-root) .rounded-\[2px\] {
1997
2020
  border-radius: 2px;
1998
2021
  }
@@ -2367,6 +2390,12 @@
2367
2390
  background-color: color-mix(in oklab, var(--_og-color-accent-soft) 45%, transparent);
2368
2391
  }
2369
2392
  }
2393
+ :where(.og-root).bg-og-accent-soft\/50,:where(.og-root) .bg-og-accent-soft\/50 {
2394
+ background-color: var(--_og-color-accent-soft);
2395
+ @supports (color: color-mix(in lab, red, red)) {
2396
+ background-color: color-mix(in oklab, var(--_og-color-accent-soft) 50%, transparent);
2397
+ }
2398
+ }
2370
2399
  :where(.og-root).bg-og-accent\/10,:where(.og-root) .bg-og-accent\/10 {
2371
2400
  background-color: var(--og-color-accent);
2372
2401
  @supports (color: color-mix(in lab, red, red)) {
@@ -2379,6 +2408,12 @@
2379
2408
  background-color: color-mix(in oklab, var(--og-color-accent) 15%, transparent);
2380
2409
  }
2381
2410
  }
2411
+ :where(.og-root).bg-og-accent\/55,:where(.og-root) .bg-og-accent\/55 {
2412
+ background-color: var(--og-color-accent);
2413
+ @supports (color: color-mix(in lab, red, red)) {
2414
+ background-color: color-mix(in oklab, var(--og-color-accent) 55%, transparent);
2415
+ }
2416
+ }
2382
2417
  :where(.og-root).bg-og-bg,:where(.og-root) .bg-og-bg {
2383
2418
  background-color: var(--og-color-bg);
2384
2419
  }
@@ -2921,6 +2956,9 @@
2921
2956
  :where(.og-root).pl-2,:where(.og-root) .pl-2 {
2922
2957
  padding-left: calc(var(--spacing) * 2);
2923
2958
  }
2959
+ :where(.og-root).pl-2\.5,:where(.og-root) .pl-2\.5 {
2960
+ padding-left: calc(var(--spacing) * 2.5);
2961
+ }
2924
2962
  :where(.og-root).pl-3,:where(.og-root) .pl-3 {
2925
2963
  padding-left: calc(var(--spacing) * 3);
2926
2964
  }
@@ -3368,6 +3406,12 @@
3368
3406
  :where(.og-root).ring-og-accent,:where(.og-root) .ring-og-accent {
3369
3407
  --tw-ring-color: var(--og-color-accent);
3370
3408
  }
3409
+ :where(.og-root).ring-og-accent-fg\/35,:where(.og-root) .ring-og-accent-fg\/35 {
3410
+ --tw-ring-color: var(--og-color-accent-fg);
3411
+ @supports (color: color-mix(in lab, red, red)) {
3412
+ --tw-ring-color: color-mix(in oklab, var(--og-color-accent-fg) 35%, transparent);
3413
+ }
3414
+ }
3371
3415
  :where(.og-root).ring-og-accent\/45,:where(.og-root) .ring-og-accent\/45 {
3372
3416
  --tw-ring-color: var(--og-color-accent);
3373
3417
  @supports (color: color-mix(in lab, red, red)) {
@@ -3807,6 +3851,12 @@
3807
3851
  position: absolute;
3808
3852
  }
3809
3853
  }
3854
+ :where(.og-root).after\:-inset-2,:where(.og-root) .after\:-inset-2 {
3855
+ &::after {
3856
+ content: var(--tw-content);
3857
+ inset: calc(var(--spacing) * -2);
3858
+ }
3859
+ }
3810
3860
  :where(.og-root).after\:inset-x-0,:where(.og-root) .after\:inset-x-0 {
3811
3861
  &::after {
3812
3862
  content: var(--tw-content);
@@ -3912,6 +3962,12 @@
3912
3962
  background-color: var(--_og-color-accent-soft);
3913
3963
  }
3914
3964
  }
3965
+ :where(.og-root).after\:content-\[\'\'\],:where(.og-root) .after\:content-\[\'\'\] {
3966
+ &::after {
3967
+ --tw-content: '';
3968
+ content: var(--tw-content);
3969
+ }
3970
+ }
3915
3971
  :where(.og-root).first\:mt-0,:where(.og-root) .first\:mt-0 {
3916
3972
  &:first-child {
3917
3973
  margin-top: calc(var(--spacing) * 0);
@@ -4006,6 +4062,16 @@
4006
4062
  }
4007
4063
  }
4008
4064
  }
4065
+ :where(.og-root).hover\:border-og-accent\/40,:where(.og-root) .hover\:border-og-accent\/40 {
4066
+ &:hover {
4067
+ @media (hover: hover) {
4068
+ border-color: var(--og-color-accent);
4069
+ @supports (color: color-mix(in lab, red, red)) {
4070
+ border-color: color-mix(in oklab, var(--og-color-accent) 40%, transparent);
4071
+ }
4072
+ }
4073
+ }
4074
+ }
4009
4075
  :where(.og-root).hover\:border-og-border,:where(.og-root) .hover\:border-og-border {
4010
4076
  &:hover {
4011
4077
  @media (hover: hover) {
@@ -4397,23 +4463,12 @@
4397
4463
  opacity: 100%;
4398
4464
  }
4399
4465
  }
4400
- :where(.og-root).focus\:ring-1,:where(.og-root) .focus\:ring-1 {
4401
- &:focus {
4402
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
4403
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4404
- }
4405
- }
4406
4466
  :where(.og-root).focus\:ring-2,:where(.og-root) .focus\:ring-2 {
4407
4467
  &:focus {
4408
4468
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
4409
4469
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4410
4470
  }
4411
4471
  }
4412
- :where(.og-root).focus\:ring-og-accent,:where(.og-root) .focus\:ring-og-accent {
4413
- &:focus {
4414
- --tw-ring-color: var(--og-color-accent);
4415
- }
4416
- }
4417
4472
  :where(.og-root).focus\:ring-og-accent-soft,:where(.og-root) .focus\:ring-og-accent-soft {
4418
4473
  &:focus {
4419
4474
  --tw-ring-color: var(--_og-color-accent-soft);
@@ -4468,6 +4523,12 @@
4468
4523
  opacity: 100%;
4469
4524
  }
4470
4525
  }
4526
+ :where(.og-root).focus-visible\:ring-0,:where(.og-root) .focus-visible\:ring-0 {
4527
+ &:focus-visible {
4528
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
4529
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4530
+ }
4531
+ }
4471
4532
  :where(.og-root).focus-visible\:ring-2,:where(.og-root) .focus-visible\:ring-2 {
4472
4533
  &:focus-visible {
4473
4534
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
@@ -5080,11 +5141,6 @@
5080
5141
  padding-inline: calc(var(--spacing) * 3);
5081
5142
  }
5082
5143
  }
5083
- :where(.og-root).sm\:px-4,:where(.og-root) .sm\:px-4 {
5084
- @media (width >= 40rem) {
5085
- padding-inline: calc(var(--spacing) * 4);
5086
- }
5087
- }
5088
5144
  :where(.og-root).sm\:px-6,:where(.og-root) .sm\:px-6 {
5089
5145
  @media (width >= 40rem) {
5090
5146
  padding-inline: calc(var(--spacing) * 6);
@@ -5259,6 +5315,14 @@
5259
5315
  opacity: 100%;
5260
5316
  }
5261
5317
  }
5318
+ :where(.og-root).pointer-coarse\:after\:-inset-2\.5,:where(.og-root) .pointer-coarse\:after\:-inset-2\.5 {
5319
+ @media (pointer: coarse) {
5320
+ &::after {
5321
+ content: var(--tw-content);
5322
+ inset: calc(var(--spacing) * -2.5);
5323
+ }
5324
+ }
5325
+ }
5262
5326
  :where(.og-root).\[\&_strong\]\:text-og-fg-muted,:where(.og-root) .\[\&_strong\]\:text-og-fg-muted {
5263
5327
  & strong {
5264
5328
  color: var(--og-color-fg-muted);
package/dist/chat.d.ts DELETED
@@ -1,37 +0,0 @@
1
- import { type ReactNode } from "react";
2
- /**
3
- * Chat component that talks only to the host's `createChatHandler` endpoint:
4
- * it restores the conversation with `GET` on mount, POSTs `{ message }`
5
- * (native format), renders the streamed reply, shows a card for a pending
6
- * approval or human-input request, and answers it through
7
- * `${handlerUrl}/respond`. No provider or OpenGeni credentials in the browser.
8
- */
9
- export type OpenGeniChatMessage = {
10
- id: string;
11
- role: "user" | "assistant";
12
- text: string;
13
- streaming: boolean;
14
- /** Tool names the agent used while producing this reply. */
15
- tools: string[];
16
- };
17
- export type OpenGeniChatProps = {
18
- /** The host endpoint served by `createChatHandler`. */
19
- handlerUrl: string;
20
- /** Sent as the `x-opengeni-conversation` header so the host's `resolve` can pick it up. */
21
- conversation?: string | undefined;
22
- /**
23
- * Host authentication headers, resolved on each host render. Changed values
24
- * reset the chat. Re-render the host when a callback's credentials change.
25
- */
26
- headers?: Record<string, string> | (() => Record<string, string>) | undefined;
27
- /**
28
- * Stable authenticated user/tenant identity. Change this on sign-in, sign-out
29
- * or tenant switches when authentication uses cookies or otherwise changes
30
- * without changing the headers. This resets local state; it is not sent.
31
- */
32
- authKey?: string | undefined;
33
- placeholder?: string | undefined;
34
- className?: string | undefined;
35
- renderMessage?: ((message: OpenGeniChatMessage) => ReactNode) | undefined;
36
- };
37
- export declare function OpenGeniChat(props: OpenGeniChatProps): import("react").JSX.Element;