@flamingo-stack/openframe-frontend-core 0.0.849 → 0.0.851

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 (140) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/chat-protocol/events.d.ts +4 -1
  3. package/dist/chat-protocol/events.d.ts.map +1 -1
  4. package/dist/chat-protocol/index.cjs +90 -40
  5. package/dist/chat-protocol/nats-decoder.d.ts.map +1 -1
  6. package/dist/chat-protocol/nats-decoder.js +5 -1
  7. package/dist/chat-protocol/policy-review.d.ts +18 -0
  8. package/dist/chat-protocol/policy-review.d.ts.map +1 -0
  9. package/dist/chat-protocol/policy-review.js +55 -0
  10. package/dist/{chunk-C3P7IUTU.cjs → chunk-2NGW73T2.cjs} +5 -4
  11. package/dist/{chunk-SHQY4GOE.cjs → chunk-2WZHNMQY.cjs} +67 -67
  12. package/dist/{chunk-R5JPZ6TY.cjs → chunk-5SEJEBAB.cjs} +8 -8
  13. package/dist/{chunk-TX4NTH22.cjs → chunk-B6D4WWKD.cjs} +36 -36
  14. package/dist/{chunk-FXLROQUT.cjs → chunk-CDW6JTAQ.cjs} +442 -459
  15. package/dist/{chunk-5PIR77V5.cjs → chunk-DN227KZH.cjs} +4 -4
  16. package/dist/{chunk-MC3L525K.cjs → chunk-FGSN5UNY.cjs} +3 -3
  17. package/dist/{chunk-ZGEWT3SF.cjs → chunk-HXURNKXI.cjs} +3 -3
  18. package/dist/{chunk-FRG724DU.cjs → chunk-KRTTH3ET.cjs} +4 -4
  19. package/dist/{chunk-YJZ7R3W5.cjs → chunk-KXFIYO4O.cjs} +8 -8
  20. package/dist/{chunk-4YBS4HIO.cjs → chunk-LM7EL3UQ.cjs} +444 -27
  21. package/dist/{chunk-YYHQY3K6.cjs → chunk-NQEPLUUW.cjs} +21 -21
  22. package/dist/{chunk-KXBZCUDW.cjs → chunk-ODMZSAIY.cjs} +36 -36
  23. package/dist/{chunk-36XWCVSM.cjs → chunk-OUP7L3U5.cjs} +50 -50
  24. package/dist/{chunk-5CBI2ZYV.cjs → chunk-PJNEBSP5.cjs} +5 -5
  25. package/dist/{chunk-6AJYGXXS.cjs → chunk-PPCRLSVR.cjs} +11 -11
  26. package/dist/{chunk-SA2NNWIJ.cjs → chunk-QCSA7GIX.cjs} +17 -62
  27. package/dist/{chunk-PV2XQJ2R.cjs → chunk-SPKAXETT.cjs} +42 -42
  28. package/dist/{chunk-IKOL6NJY.cjs → chunk-U4RTWH5D.cjs} +53 -43
  29. package/dist/{chunk-IHY7E4EX.cjs → chunk-UFGPLXH6.cjs} +4 -4
  30. package/dist/{chunk-TEKN6TJ5.cjs → chunk-UQK6J3ZS.cjs} +13 -13
  31. package/dist/{chunk-S3QXLD4X.cjs → chunk-VCFQHPOO.cjs} +37 -3
  32. package/dist/{chunk-Z5UCDEKZ.cjs → chunk-VU6N3NZS.cjs} +6 -6
  33. package/dist/{chunk-ZY34R37A.cjs → chunk-VXIZCUNZ.cjs} +61 -61
  34. package/dist/{chunk-3W4ASAXN.cjs → chunk-WYROOMUZ.cjs} +2 -2
  35. package/dist/{chunk-YLETC7LP.cjs → chunk-ZEPEFKHA.cjs} +893 -973
  36. package/dist/{cloud-tenants-HKUUEUAY.cjs → cloud-tenants-XH6GV4EI.cjs} +12 -13
  37. package/dist/components/case-studies/index.cjs +24 -25
  38. package/dist/components/chat/approval-batch-message.d.ts +5 -0
  39. package/dist/components/chat/approval-batch-message.d.ts.map +1 -1
  40. package/dist/components/chat/approval-batch-message.js +36 -10
  41. package/dist/components/chat/index.cjs +8 -9
  42. package/dist/components/chat/policy-review.d.ts +27 -0
  43. package/dist/components/chat/policy-review.d.ts.map +1 -0
  44. package/dist/components/chat/policy-review.js +67 -0
  45. package/dist/components/chat/stream/message-mutations.d.ts.map +1 -1
  46. package/dist/components/chat/stream/message-mutations.js +4 -1
  47. package/dist/components/chat/tool-execution-display.d.ts.map +1 -1
  48. package/dist/components/chat/tool-execution-display.js +16 -5
  49. package/dist/components/chat/types/message.types.d.ts +40 -2
  50. package/dist/components/chat/types/message.types.d.ts.map +1 -1
  51. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
  52. package/dist/components/chat/utils/extract-incomplete-message-state.js +2 -0
  53. package/dist/components/chat/utils/message-segment-accumulator.d.ts.map +1 -1
  54. package/dist/components/chat/utils/message-segment-accumulator.js +3 -0
  55. package/dist/components/chat/utils/process-historical-messages.d.ts +2 -2
  56. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  57. package/dist/components/chat/utils/process-historical-messages.js +7 -1
  58. package/dist/components/contact/index.cjs +13 -14
  59. package/dist/components/docs/index.cjs +16 -17
  60. package/dist/components/embeds/embed-viewer-frame.d.ts +2 -0
  61. package/dist/components/embeds/embed-viewer-frame.d.ts.map +1 -1
  62. package/dist/components/embeds/embed-viewer-frame.js +12 -2
  63. package/dist/components/embeds/index.cjs +13 -14
  64. package/dist/components/embeds/pdf-viewer.d.ts.map +1 -1
  65. package/dist/components/embeds/pdf-viewer.js +2 -1
  66. package/dist/components/faq/index.cjs +14 -15
  67. package/dist/components/features/approval-level.d.ts +6 -12
  68. package/dist/components/features/approval-level.d.ts.map +1 -1
  69. package/dist/components/features/approval-level.js +45 -55
  70. package/dist/components/features/index.cjs +17 -15
  71. package/dist/components/features/notifications/approval-request-notification-tile.d.ts.map +1 -1
  72. package/dist/components/features/notifications/approval-request-notification-tile.js +71 -48
  73. package/dist/components/features/notifications/types.d.ts +2 -0
  74. package/dist/components/features/notifications/types.d.ts.map +1 -1
  75. package/dist/components/features/notifications/types.js +3 -1
  76. package/dist/components/features/policy-configuration-panel.d.ts.map +1 -1
  77. package/dist/components/features/policy-configuration-panel.js +75 -64
  78. package/dist/components/features/software/index.d.ts +1 -1
  79. package/dist/components/features/software/index.d.ts.map +1 -1
  80. package/dist/components/features/software/index.js +2 -0
  81. package/dist/components/features/software/software-action-copy.d.ts.map +1 -1
  82. package/dist/components/features/software/software-action-copy.js +6 -12
  83. package/dist/components/features/software/software-action-form.d.ts +7 -1
  84. package/dist/components/features/software/software-action-form.d.ts.map +1 -1
  85. package/dist/components/features/software/software-action-form.js +11 -3
  86. package/dist/components/features/software/update-settings-fields.d.ts +12 -1
  87. package/dist/components/features/software/update-settings-fields.d.ts.map +1 -1
  88. package/dist/components/features/software/update-settings-fields.js +57 -29
  89. package/dist/components/help-center-pages/index.cjs +78 -79
  90. package/dist/components/index.cjs +58 -58
  91. package/dist/components/meeting-scheduler/index.cjs +61 -61
  92. package/dist/components/navigation/index.cjs +15 -16
  93. package/dist/components/onboarding-guides/index.cjs +14 -15
  94. package/dist/components/product-demo/index.cjs +23 -24
  95. package/dist/components/tickets/index.cjs +17 -18
  96. package/dist/components/ui/file-manager/index.cjs +8 -9
  97. package/dist/components/ui/index.cjs +16 -18
  98. package/dist/components/ui/page-actions.d.ts.map +1 -1
  99. package/dist/components/ui/page-actions.js +11 -1
  100. package/dist/components/ui/radio-group.d.ts.map +1 -1
  101. package/dist/components/ui/radio-group.js +8 -2
  102. package/dist/components/ui/tab-selector.d.ts +7 -1
  103. package/dist/components/ui/tab-selector.d.ts.map +1 -1
  104. package/dist/components/ui/tab-selector.js +22 -3
  105. package/dist/{devices-P7M4Z7VP.cjs → devices-7PT6MPJI.cjs} +13 -14
  106. package/dist/{embeddable-chat-322NDFP5.cjs → embeddable-chat-5NY76K7K.cjs} +84 -85
  107. package/dist/index.cjs +24 -24
  108. package/dist/{knowledge-TC7JLOWI.cjs → knowledge-J6N7IEVI.cjs} +13 -14
  109. package/dist/{logs-GPOYCP4B.cjs → logs-D6KQP2BX.cjs} +19 -20
  110. package/dist/{policies-ZUHOUMDD.cjs → policies-J7MCOL3C.cjs} +16 -17
  111. package/dist/{remote-session-NT4NG7EF.cjs → remote-session-PXHA5KFK.cjs} +8 -9
  112. package/dist/{scripts-FOEVDGTH.cjs → scripts-VURXIHVS.cjs} +19 -20
  113. package/dist/{software-update-XGTMNFST.cjs → software-update-6SHUBDIE.cjs} +16 -17
  114. package/dist/{tickets-board-7FLGQEHF.cjs → tickets-board-NLCN7WNX.cjs} +9 -9
  115. package/package.json +1 -1
  116. package/src/chat-protocol/events.ts +4 -1
  117. package/src/chat-protocol/nats-decoder.ts +4 -0
  118. package/src/chat-protocol/policy-review.ts +71 -0
  119. package/src/components/chat/approval-batch-message.tsx +47 -10
  120. package/src/components/chat/policy-review.tsx +90 -0
  121. package/src/components/chat/stream/message-mutations.ts +4 -0
  122. package/src/components/chat/tool-execution-display.tsx +23 -4
  123. package/src/components/chat/types/message.types.ts +42 -2
  124. package/src/components/chat/utils/extract-incomplete-message-state.ts +2 -0
  125. package/src/components/chat/utils/message-segment-accumulator.ts +3 -0
  126. package/src/components/chat/utils/process-historical-messages.ts +14 -3
  127. package/src/components/embeds/embed-viewer-frame.tsx +10 -2
  128. package/src/components/embeds/pdf-viewer.tsx +4 -1
  129. package/src/components/features/approval-level.tsx +74 -78
  130. package/src/components/features/notifications/approval-request-notification-tile.tsx +75 -50
  131. package/src/components/features/notifications/types.ts +4 -0
  132. package/src/components/features/policy-configuration-panel.tsx +100 -83
  133. package/src/components/features/software/index.ts +1 -0
  134. package/src/components/features/software/software-action-copy.ts +19 -12
  135. package/src/components/features/software/software-action-form.tsx +16 -3
  136. package/src/components/features/software/update-settings-fields.tsx +104 -32
  137. package/src/components/ui/page-actions.tsx +19 -2
  138. package/src/components/ui/radio-group.tsx +20 -2
  139. package/src/components/ui/tab-selector.tsx +26 -3
  140. package/dist/chunk-N3MBQRCQ.cjs +0 -41
@@ -5,7 +5,14 @@
5
5
 
6
6
 
7
7
 
8
- var _chunkYJZ7R3W5cjs = require('./chunk-YJZ7R3W5.cjs');
8
+
9
+ var _chunkKXFIYO4Ocjs = require('./chunk-KXFIYO4O.cjs');
10
+
11
+
12
+ var _chunk4MGDY2AAcjs = require('./chunk-4MGDY2AA.cjs');
13
+
14
+
15
+ var _chunkOBGYDNT6cjs = require('./chunk-OBGYDNT6.cjs');
9
16
 
10
17
 
11
18
  var _chunkOEP5KAT6cjs = require('./chunk-OEP5KAT6.cjs');
@@ -14,6 +21,15 @@ var _chunkOEP5KAT6cjs = require('./chunk-OEP5KAT6.cjs');
14
21
  var _chunkHFNBMV5Mcjs = require('./chunk-HFNBMV5M.cjs');
15
22
 
16
23
 
24
+ var _chunkZWXR7MSVcjs = require('./chunk-ZWXR7MSV.cjs');
25
+
26
+
27
+ var _chunk7AAW6L5Ucjs = require('./chunk-7AAW6L5U.cjs');
28
+
29
+
30
+ var _chunk7WT2C5YYcjs = require('./chunk-7WT2C5YY.cjs');
31
+
32
+
17
33
  var _chunkBUEEQD3Gcjs = require('./chunk-BUEEQD3G.cjs');
18
34
 
19
35
 
@@ -44,6 +60,10 @@ var _chunkJQCQCE6Ucjs = require('./chunk-JQCQCE6U.cjs');
44
60
  var _chunkGG466XFQcjs = require('./chunk-GG466XFQ.cjs');
45
61
 
46
62
 
63
+ var _chunkVCFQHPOOcjs = require('./chunk-VCFQHPOO.cjs');
64
+
65
+
66
+
47
67
 
48
68
 
49
69
 
@@ -310,15 +330,15 @@ function TicketStatusTag({
310
330
  );
311
331
  if (loading || disabled || !options || options.length === 0 || !onSelect) {
312
332
  if (!loading && disabled && disabledReason) {
313
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYJZ7R3W5cjs.TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkYJZ7R3W5cjs.Tooltip, { children: [
314
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYJZ7R3W5cjs.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "w-fit shrink-0 cursor-not-allowed", children: tag }) }),
315
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYJZ7R3W5cjs.TooltipContent, { children: disabledReason })
333
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKXFIYO4Ocjs.TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkKXFIYO4Ocjs.Tooltip, { children: [
334
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKXFIYO4Ocjs.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "w-fit shrink-0 cursor-not-allowed", children: tag }) }),
335
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKXFIYO4Ocjs.TooltipContent, { children: disabledReason })
316
336
  ] }) });
317
337
  }
318
338
  return tag;
319
339
  }
320
340
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
321
- _chunkYJZ7R3W5cjs.ActionsMenuDropdown,
341
+ _chunkKXFIYO4Ocjs.ActionsMenuDropdown,
322
342
  {
323
343
  align: "start",
324
344
  groups: [
@@ -371,6 +391,70 @@ function TicketStatusTag({
371
391
  );
372
392
  }
373
393
 
394
+ // src/components/ui/alert.tsx
395
+ var _classvarianceauthority = require('class-variance-authority');
396
+ var _react = require('react');
397
+
398
+ var alertVariants = _classvarianceauthority.cva.call(void 0,
399
+ "relative w-full rounded-lg border p-4 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
400
+ {
401
+ variants: {
402
+ variant: {
403
+ default: "bg-background text-foreground",
404
+ destructive: "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
405
+ warning: "border-transparent bg-ods-warning-secondary text-ods-warning [&>svg]:text-ods-warning",
406
+ error: "border-transparent bg-ods-error-secondary text-ods-error [&>svg]:text-ods-error"
407
+ }
408
+ },
409
+ defaultVariants: {
410
+ variant: "default"
411
+ }
412
+ }
413
+ );
414
+ var Alert = _react.forwardRef.call(void 0,
415
+ ({ className, variant, ...props }, ref) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref, role: "alert", className: _chunk63A4GZMBcjs.cn.call(void 0, alertVariants({ variant }), className), ...props })
416
+ );
417
+ Alert.displayName = "Alert";
418
+ var AlertTitle = _react.forwardRef.call(void 0,
419
+ ({ className, ...props }, ref) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h5", { ref, className: _chunk63A4GZMBcjs.cn.call(void 0, "mb-1 font-medium leading-none tracking-tight", className), ...props })
420
+ );
421
+ AlertTitle.displayName = "AlertTitle";
422
+ var AlertDescription = _react.forwardRef.call(void 0,
423
+ ({ className, ...props }, ref) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref, className: _chunk63A4GZMBcjs.cn.call(void 0, "text-h6 [&_p]:leading-relaxed", className), ...props })
424
+ );
425
+ AlertDescription.displayName = "AlertDescription";
426
+
427
+ // src/components/ui/layout-hold.tsx
428
+
429
+ var ROUNDED_BAR = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100%25' height='100%25' rx='6'/%3E%3C/svg%3E")`;
430
+ var BAR_MASK = `${ROUNDED_BAR} center / 100% min(1em, calc(1lh - 6px)) no-repeat`;
431
+ var BAR_STYLE = { mask: BAR_MASK, WebkitMask: BAR_MASK };
432
+ function TextHold({ children, variant = "bar", className }) {
433
+ const bar = variant === "bar";
434
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
435
+ "span",
436
+ {
437
+ "aria-hidden": true,
438
+ className: _chunk63A4GZMBcjs.cn.call(void 0,
439
+ // `bar`: the words themselves, unseen, on the skeleton's surface. The span stays INLINE, so the
440
+ // browser paints one bar per line the words take, each exactly as wide as that line, and
441
+ // `box-decoration-clone` gives every line its own bar (and its own mask, `BAR_STYLE`). Pure CSS: it
442
+ // is drawn in the server's HTML, before any script runs (a loading state streamed by the server
443
+ // is often replaced before it hydrates).
444
+ bar ? _chunk63A4GZMBcjs.cn.call(void 0, _chunkPMUCEUFQcjs.SKELETON_SURFACE_CLASS, "rounded-md box-decoration-clone text-transparent") : "invisible",
445
+ // A hold is never selectable or clickable, whatever it wraps.
446
+ "pointer-events-none select-none",
447
+ className
448
+ ),
449
+ style: bar ? BAR_STYLE : void 0,
450
+ children
451
+ }
452
+ );
453
+ }
454
+ function LayoutHold({ children, className }) {
455
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { "aria-hidden": true, inert: true, className: _chunk63A4GZMBcjs.cn.call(void 0, "invisible", className), children });
456
+ }
457
+
374
458
  // src/components/ui/status-line.tsx
375
459
 
376
460
  function StatusLine({ tone, label, className }) {
@@ -408,7 +492,7 @@ function ExpandChevron({ expanded, className }) {
408
492
  }
409
493
 
410
494
  // src/components/chat/hooks/use-collapsible.ts
411
- var _react = require('react');
495
+
412
496
  function useCollapsible({
413
497
  expanded,
414
498
  collapsedHeight = 0,
@@ -442,6 +526,243 @@ function useCollapsible({
442
526
  };
443
527
  }
444
528
 
529
+ // src/components/ui/tab-selector.tsx
530
+
531
+ function TabSelector({
532
+ value,
533
+ onValueChange,
534
+ items,
535
+ variant = "primary",
536
+ size = "default",
537
+ label,
538
+ disabled,
539
+ scrollable = false,
540
+ className
541
+ }) {
542
+ const flush = _chunkKXFIYO4Ocjs.useIsInActionsMenuHeader.call(void 0, );
543
+ const compact = size === "compact";
544
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
545
+ "div",
546
+ {
547
+ className: _chunk63A4GZMBcjs.cn.call(void 0, "flex flex-col gap-[var(--spacing-system-xxs)]", disabled && "opacity-50", className),
548
+ "aria-disabled": disabled || void 0,
549
+ children: [
550
+ label && // Label for family/color; 'large' (text-h4) is this component's
551
+ // long-standing label scale — neighbours opt into the same scale via
552
+ // their `labelVariant="large"` when a design puts them side by side.
553
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVCFQHPOOcjs.Label, { variant: "large", children: label }),
554
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
555
+ "div",
556
+ {
557
+ className: _chunk63A4GZMBcjs.cn.call(void 0,
558
+ "flex gap-[var(--spacing-system-xxs)] bg-ods-bg p-[var(--spacing-system-xxs)]",
559
+ flush ? "h-10 w-full" : _chunk63A4GZMBcjs.cn.call(void 0,
560
+ "rounded-md border border-ods-border",
561
+ compact ? "h-10 content-md:h-11" : "h-11 content-md:h-12",
562
+ scrollable ? "overflow-x-auto" : compact ? "w-auto" : "w-full"
563
+ )
564
+ ),
565
+ children: items.map((item) => {
566
+ const isActive = value === item.id;
567
+ const isDisabled = disabled || item.disabled;
568
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
569
+ _chunkFCZAUK4Dcjs.Button,
570
+ {
571
+ variant: "segment",
572
+ type: "button",
573
+ disabled: isDisabled,
574
+ onClick: () => onValueChange(item.id),
575
+ "aria-label": !item.label ? item.ariaLabel : void 0,
576
+ "aria-pressed": isActive,
577
+ "data-state": isActive ? "active" : void 0,
578
+ "data-tone": variant === "primary" ? "accent" : void 0,
579
+ className: _chunk63A4GZMBcjs.cn.call(void 0,
580
+ "h-full",
581
+ compact ? "w-8 flex-none content-md:w-9" : scrollable ? "flex-none shrink-0 basis-auto" : "flex-1"
582
+ ),
583
+ children: [
584
+ item.icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
585
+ "span",
586
+ {
587
+ className: _chunk63A4GZMBcjs.cn.call(void 0,
588
+ "flex shrink-0 items-center justify-center",
589
+ // compact: the box sizes the icon, whatever size the caller drew it at.
590
+ compact ? "size-4 content-md:size-5 [&>svg]:size-full" : "size-4 content-md:size-6"
591
+ ),
592
+ children: item.icon
593
+ }
594
+ ),
595
+ item.label,
596
+ item.badge && item.badge
597
+ ]
598
+ },
599
+ item.id
600
+ );
601
+ })
602
+ }
603
+ )
604
+ ]
605
+ }
606
+ );
607
+ }
608
+
609
+ // src/components/ui/touch-friendly-tooltip.tsx
610
+
611
+
612
+ var dismissOpenTooltip = null;
613
+ function TouchFriendlyTooltip({ content, side = "left", children }) {
614
+ const [open, setOpen] = _react.useState.call(void 0, false);
615
+ const isTouchRef = _react.useRef.call(void 0, false);
616
+ const close = _react.useCallback.call(void 0, () => setOpen(false), []);
617
+ if (!content) return children;
618
+ const toggleFromTouch = () => {
619
+ setOpen((prev) => {
620
+ const next = !prev;
621
+ if (next) {
622
+ if (dismissOpenTooltip && dismissOpenTooltip !== close) dismissOpenTooltip();
623
+ dismissOpenTooltip = close;
624
+ } else if (dismissOpenTooltip === close) {
625
+ dismissOpenTooltip = null;
626
+ }
627
+ return next;
628
+ });
629
+ };
630
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKXFIYO4Ocjs.TooltipProvider, { delayDuration: 150, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkKXFIYO4Ocjs.Tooltip, { open, onOpenChange: setOpen, children: [
631
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
632
+ _chunkKXFIYO4Ocjs.TooltipTrigger,
633
+ {
634
+ asChild: true,
635
+ onPointerDown: (e) => {
636
+ isTouchRef.current = e.pointerType === "touch";
637
+ if (!isTouchRef.current) return;
638
+ e.preventDefault();
639
+ toggleFromTouch();
640
+ },
641
+ onFocus: (e) => {
642
+ if (isTouchRef.current) e.preventDefault();
643
+ },
644
+ onClick: (e) => {
645
+ if (isTouchRef.current) e.preventDefault();
646
+ },
647
+ children
648
+ }
649
+ ),
650
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKXFIYO4Ocjs.TooltipContent, { side, className: "max-w-xs", children: content })
651
+ ] }) });
652
+ }
653
+
654
+ // src/components/features/approval-level.tsx
655
+
656
+ var APPROVAL_LEVELS = ["ALLOW", "ASK_USER", "ASK_TECHNICIAN", "DENY"];
657
+ var APPROVAL_LEVEL_META = {
658
+ ALLOW: {
659
+ label: "Allow",
660
+ hint: "Runs on its own. You get a summary after.",
661
+ Icon: _chunkHFNBMV5Mcjs.CheckCircleIcon,
662
+ toneClassName: "text-ods-success"
663
+ },
664
+ ASK_USER: {
665
+ label: "Ask User",
666
+ hint: "Asks the person at the computer first.",
667
+ Icon: _chunk4MGDY2AAcjs.UserCheckIcon,
668
+ toneClassName: "text-ods-warning"
669
+ },
670
+ ASK_TECHNICIAN: {
671
+ label: "Ask Technician",
672
+ hint: "Asks a technician first. Nothing runs until they approve.",
673
+ Icon: _chunkOBGYDNT6cjs.ShieldCheckIcon,
674
+ toneClassName: "text-ods-warning"
675
+ },
676
+ DENY: { label: "Restrict", hint: "Never runs.", Icon: _chunkZWXR7MSVcjs.BannedIcon, toneClassName: "text-ods-error" }
677
+ };
678
+ var ICON_PX = 24;
679
+ var READ_ONLY_ROW_CLASS = "inline-flex shrink-0 items-center gap-[var(--spacing-system-xxs)]";
680
+ var EDITABLE_ROW_CLASS = "flex shrink-0 items-center gap-[var(--spacing-system-xxs)] content-md:gap-[var(--spacing-system-m)]";
681
+ var EDITABLE_NAME_ORDER_CLASS = "order-last content-md:order-none";
682
+ var READ_ONLY_ICON_BOX_CLASS = "[&>*]:!size-4 content-md:[&>*]:!size-6";
683
+ var READ_ONLY_NAME_CLASS = "whitespace-nowrap text-ods-text-primary text-h4";
684
+ var LEVEL_NAME_CLASS = "whitespace-nowrap text-h6";
685
+ var EDITABLE_ICON_PX = 20;
686
+ var LONGEST_LEVEL_LABEL = APPROVAL_LEVELS.map((level) => APPROVAL_LEVEL_META[level].label).reduce(
687
+ (a, b) => b.length > a.length ? b : a
688
+ );
689
+ function levelItems(inForce) {
690
+ return APPROVAL_LEVELS.map((level) => {
691
+ const { label, Icon } = APPROVAL_LEVEL_META[level];
692
+ const tone = level === inForce ? "text-ods-text-primary" : "text-ods-text-secondary";
693
+ return { id: level, ariaLabel: label, icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Icon, { size: EDITABLE_ICON_PX, className: tone, "aria-hidden": true }) };
694
+ });
695
+ }
696
+ function ApprovalLevelView({
697
+ value,
698
+ editable,
699
+ onChange,
700
+ disabled = false,
701
+ showLabel = true,
702
+ "aria-labelledby": labelledBy,
703
+ loading = false,
704
+ className
705
+ }) {
706
+ const canEdit = _nullishCoalesce(editable, () => ( onChange !== void 0));
707
+ if (_chunk63A4GZMBcjs.useLoadingScope.call(void 0, ) || loading) {
708
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ApprovalLevelSkeleton, { editable: canEdit, showLabel, className });
709
+ }
710
+ const current = APPROVAL_LEVEL_META[value];
711
+ if (!canEdit) {
712
+ const icon = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: _chunk63A4GZMBcjs.cn.call(void 0, "inline-flex shrink-0", READ_ONLY_ICON_BOX_CLASS, current.toneClassName), children: [
713
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, current.Icon, { size: ICON_PX, "aria-hidden": true }),
714
+ !showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "sr-only", children: current.label })
715
+ ] });
716
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: _chunk63A4GZMBcjs.cn.call(void 0, READ_ONLY_ROW_CLASS, className), children: [
717
+ showLabel ? icon : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TouchFriendlyTooltip, { content: `${current.label}: ${current.hint}`, side: "top", children: icon }),
718
+ showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: READ_ONLY_NAME_CLASS, children: current.label })
719
+ ] });
720
+ }
721
+ const name = showLabel ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: _chunk63A4GZMBcjs.cn.call(void 0, LEVEL_NAME_CLASS, EDITABLE_NAME_ORDER_CLASS, current.toneClassName), children: current.label }) : null;
722
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk63A4GZMBcjs.cn.call(void 0, EDITABLE_ROW_CLASS, className), children: [
723
+ name,
724
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { role: "group", "aria-labelledby": labelledBy, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
725
+ TabSelector,
726
+ {
727
+ variant: "secondary",
728
+ size: "compact",
729
+ value,
730
+ disabled,
731
+ onValueChange: (next) => {
732
+ if (next !== value) _optionalChain([onChange, 'optionalCall', _ => _(next)]);
733
+ },
734
+ items: levelItems(value),
735
+ className: "w-auto"
736
+ }
737
+ ) })
738
+ ] });
739
+ }
740
+ function ApprovalLevelSkeleton({ editable = false, showLabel = true, className }) {
741
+ if (!editable) {
742
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { "aria-hidden": true, className: _chunk63A4GZMBcjs.cn.call(void 0, READ_ONLY_ROW_CLASS, className), children: [
743
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: _chunk63A4GZMBcjs.cn.call(void 0, "inline-flex shrink-0", READ_ONLY_ICON_BOX_CLASS), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkPMUCEUFQcjs.UnifiedSkeleton, { as: "span", className: "inline-block shrink-0 rounded-sm", width: ICON_PX, height: ICON_PX }) }),
744
+ showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: READ_ONLY_NAME_CLASS, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TextHold, { children: LONGEST_LEVEL_LABEL }) })
745
+ ] });
746
+ }
747
+ const name = showLabel ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: _chunk63A4GZMBcjs.cn.call(void 0, LEVEL_NAME_CLASS, EDITABLE_NAME_ORDER_CLASS), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TextHold, { children: LONGEST_LEVEL_LABEL }) }) : null;
748
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { "aria-hidden": true, inert: true, className: _chunk63A4GZMBcjs.cn.call(void 0, EDITABLE_ROW_CLASS, className), children: [
749
+ name,
750
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
751
+ TabSelector,
752
+ {
753
+ variant: "secondary",
754
+ size: "compact",
755
+ value: "",
756
+ disabled: true,
757
+ onValueChange: () => {
758
+ },
759
+ items: levelItems(void 0),
760
+ className: "w-auto"
761
+ }
762
+ )
763
+ ] });
764
+ }
765
+
445
766
  // src/components/chat/utils/tool-call-helpers.ts
446
767
  var COMMAND_BODY_ARG_KEYS = ["command", "query", "script", "scriptContent", "code"];
447
768
  function getToolCallTitle(opts) {
@@ -496,7 +817,7 @@ function expandJson(value, indent) {
496
817
  function expandedJsonStringify(value) {
497
818
  try {
498
819
  return expandJson(value, 0);
499
- } catch (e) {
820
+ } catch (e2) {
500
821
  return String(value);
501
822
  }
502
823
  }
@@ -510,7 +831,7 @@ function formatToolArgValue(value) {
510
831
  if (trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]")) {
511
832
  try {
512
833
  return { kind: "block", text: expandedJsonStringify(JSON.parse(trimmed)), language: "json" };
513
- } catch (e2) {
834
+ } catch (e3) {
514
835
  }
515
836
  }
516
837
  if (value.includes("\n") || value.length > INLINE_STRING_MAX) {
@@ -531,7 +852,7 @@ function formatToolResult(value) {
531
852
  if (trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]")) {
532
853
  try {
533
854
  return { kind: "block", text: expandedJsonStringify(JSON.parse(trimmed)), language: "json" };
534
- } catch (e3) {
855
+ } catch (e4) {
535
856
  }
536
857
  }
537
858
  if (body.includes("\n") || body.length > INLINE_STRING_MAX) {
@@ -588,6 +909,63 @@ function CommandBlock({ command, className }) {
588
909
  var CHAT_BLOCK_FRAME_CLASS = "rounded-lg border border-ods-border bg-ods-bg";
589
910
  var CHAT_BLOCK_CLASS = `${CHAT_BLOCK_FRAME_CLASS} flex flex-col gap-[var(--spacing-system-xsf)] p-[var(--spacing-system-sf)]`;
590
911
 
912
+ // src/components/chat/policy-review.tsx
913
+
914
+ var RULE_DECISIONS = /* @__PURE__ */ new Set(["DENY", "SOFT_DENY", "HARD_DENY"]);
915
+ function isPolicyEscalated(review) {
916
+ if (!review) return false;
917
+ return review.decision ? RULE_DECISIONS.has(review.decision) : review.matchedRules.length > 0;
918
+ }
919
+ function policyLevelText(review) {
920
+ const level = _nullishCoalesce(review.policyLevel, () => ( (isPolicyEscalated(review) ? void 0 : review.approvalLevel)));
921
+ if (!level) return void 0;
922
+ const label = APPROVAL_LEVEL_META[level].label;
923
+ return review.decision === "FALLBACK" ? `${label} (Unmatched Actions)` : label;
924
+ }
925
+ function hasPolicyReviewRows(review) {
926
+ return !!review && (!!policyLevelText(review) || review.operationCodes.length > 0);
927
+ }
928
+ function PolicyReviewRows({ review, className }) {
929
+ const level = policyLevelText(review);
930
+ if (!hasPolicyReviewRows(review)) return null;
931
+ return (
932
+ // A plain block: the rows stack on their own, and a nested flex column costs WebKit a layout pass (WEBVIEW-001).
933
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk63A4GZMBcjs.cn.call(void 0, "w-full", className), children: [
934
+ level && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ArgRow, { argKey: "Guardrail Policy", value: level }),
935
+ review.operationCodes.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ArgRow, { argKey: "Operations", value: review.operationCodes.join(", ") })
936
+ ] })
937
+ );
938
+ }
939
+ function PolicyEscalationAlert({
940
+ review,
941
+ className
942
+ }) {
943
+ if (!review || !isPolicyEscalated(review)) return null;
944
+ const description = _nullishCoalesce(review.reason, () => ( review.matchedRules.map((rule) => rule.label).join(", ")));
945
+ return (
946
+ // A note, not an `alert`: it is part of the thread, read in place, and a live region would interrupt the reader
947
+ // for every escalated call on each replay of the history.
948
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
949
+ Alert,
950
+ {
951
+ role: "note",
952
+ variant: "warning",
953
+ className: _chunk63A4GZMBcjs.cn.call(void 0,
954
+ "flex items-center gap-[var(--spacing-system-m)] rounded-none border-0 p-[var(--spacing-system-m)]",
955
+ className
956
+ ),
957
+ children: [
958
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "flex shrink-0", "aria-hidden": true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk7AAW6L5Ucjs.AlertTriangleIcon, { size: 20 }) }),
959
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "grid min-w-0 flex-1 grid-cols-1 gap-[var(--spacing-system-xxs)]", children: [
960
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "break-words text-h3", children: "Mingo Escalated" }),
961
+ description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "break-words text-h6", children: description })
962
+ ] })
963
+ ]
964
+ }
965
+ )
966
+ );
967
+ }
968
+
591
969
  // src/components/chat/approval-batch-message.tsx
592
970
 
593
971
  var COMMAND_BODY_KEYS = new Set(COMMAND_BODY_ARG_KEYS);
@@ -610,21 +988,35 @@ function getArgEntries(call) {
610
988
  }
611
989
  function ExecutionStatusIcon({
612
990
  batchStatus,
613
- execution
991
+ execution,
992
+ escalated
614
993
  }) {
994
+ if (batchStatus === "pending" && escalated)
995
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk7WT2C5YYcjs.AlertCircleIcon, { className: "h-4 w-4 text-ods-warning", "aria-hidden": true });
615
996
  if (batchStatus !== "approved") return null;
616
997
  if (!execution || execution.status === "executing")
617
998
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkOEP5KAT6cjs.DotsLoaderIcon, { size: 16, className: "text-ods-text-secondary" });
618
999
  if (execution.success === false) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkRUHKTWGBcjs.XmarkCircleIcon, { className: "h-4 w-4 text-ods-error" });
619
1000
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHFNBMV5Mcjs.CheckCircleIcon, { className: "h-4 w-4 text-ods-success" });
620
1001
  }
621
- function ToolCallRow({ call, expanded, onToggle, batchStatus, execution, showExecutionStatus }) {
1002
+ function ToolCallRow({
1003
+ call,
1004
+ expanded,
1005
+ onToggle,
1006
+ batchStatus,
1007
+ execution,
1008
+ showExecutionStatus,
1009
+ showEscalationAlert
1010
+ }) {
622
1011
  const command = getCommandText(call);
623
1012
  const args = getArgEntries(call);
624
1013
  const toolType = call.toolType || "OPENFRAME";
625
1014
  const { innerRef, containerStyle } = useCollapsible({ expanded });
626
- const result = _optionalChain([execution, 'optionalAccess', _ => _.status]) === "done" ? execution.result : void 0;
627
- const hasExpandableBody = args.length > 0 || typeof result === "string" && result.length > 0;
1015
+ const result = _optionalChain([execution, 'optionalAccess', _2 => _2.status]) === "done" ? execution.result : void 0;
1016
+ const review = call.policyReview;
1017
+ const escalated = isPolicyEscalated(review);
1018
+ const reviewRows = hasPolicyReviewRows(review);
1019
+ const hasExpandableBody = args.length > 0 || reviewRows || typeof result === "string" && result.length > 0;
628
1020
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full flex-col items-start border-b border-ods-border bg-ods-card last:border-b-0", children: [
629
1021
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkFCZAUK4Dcjs.Button, { variant: "row", type: "button", onClick: onToggle, "aria-expanded": expanded, className: "rounded-none", children: [
630
1022
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-5 w-5 shrink-0 items-center justify-center text-ods-text-secondary", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBUEEQD3Gcjs.ToolIcon, { toolType, size: 16 }) }),
@@ -638,19 +1030,27 @@ function ToolCallRow({ call, expanded, onToggle, batchStatus, execution, showExe
638
1030
  children: command
639
1031
  }
640
1032
  ),
641
- showExecutionStatus && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ExecutionStatusIcon, { batchStatus, execution }) }),
1033
+ (showExecutionStatus || batchStatus === "pending" && escalated) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ExecutionStatusIcon, { batchStatus, execution, escalated }) }),
642
1034
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-5 w-5 shrink-0 items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ExpandChevron, { expanded }) })
643
1035
  ] }),
644
1036
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-full", style: containerStyle, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: innerRef, children: hasExpandableBody && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full flex-col items-start gap-0 bg-ods-card px-[var(--spacing-system-sf)] pb-[var(--spacing-system-sf)] text-h6", children: [
645
1037
  args.map(([key, value]) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ArgRow, { argKey: key, value }, key)),
1038
+ reviewRows && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1039
+ PolicyReviewRows,
1040
+ {
1041
+ review,
1042
+ className: args.length > 0 ? "mt-[var(--spacing-system-xsf)]" : void 0
1043
+ }
1044
+ ),
646
1045
  result && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
647
1046
  ResultBlock,
648
1047
  {
649
1048
  result,
650
- className: args.length > 0 ? "mt-[var(--spacing-system-xsf)]" : void 0
1049
+ className: args.length > 0 || reviewRows ? "mt-[var(--spacing-system-xsf)]" : void 0
651
1050
  }
652
1051
  )
653
- ] }) }) })
1052
+ ] }) }) }),
1053
+ showEscalationAlert && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, PolicyEscalationAlert, { review, className: "border-t border-ods-border" })
654
1054
  ] });
655
1055
  }
656
1056
  var ApprovalBatchLoading = _react.forwardRef.call(void 0,
@@ -739,6 +1139,7 @@ var ApprovalBatchMessage = _react.forwardRef.call(void 0,
739
1139
  assistantType: _assistantType,
740
1140
  variant = "admin",
741
1141
  showFooterActions = true,
1142
+ showEscalationAlerts = true,
742
1143
  ...props
743
1144
  }, ref) => {
744
1145
  const [expandedId, setExpandedId] = _react.useState.call(void 0, null);
@@ -757,11 +1158,12 @@ var ApprovalBatchMessage = _react.forwardRef.call(void 0,
757
1158
  }
758
1159
  );
759
1160
  }
760
- const explanations = data.toolCalls.map((c) => _optionalChain([c, 'access', _2 => _2.toolExplanation, 'optionalAccess', _3 => _3.trim, 'call', _4 => _4()])).filter((s) => !!s);
1161
+ const explanations = data.toolCalls.map((c) => _optionalChain([c, 'access', _3 => _3.toolExplanation, 'optionalAccess', _4 => _4.trim, 'call', _5 => _5()])).filter((s) => !!s);
1162
+ const escalated = !isClient && data.toolCalls.some((c) => isPolicyEscalated(c.policyReview));
761
1163
  const handleApprove = async () => {
762
1164
  setIsProcessing(true);
763
1165
  try {
764
- await _optionalChain([onApprove, 'optionalCall', _5 => _5(data.approvalRequestId)]);
1166
+ await _optionalChain([onApprove, 'optionalCall', _6 => _6(data.approvalRequestId)]);
765
1167
  } finally {
766
1168
  setIsProcessing(false);
767
1169
  }
@@ -769,7 +1171,7 @@ var ApprovalBatchMessage = _react.forwardRef.call(void 0,
769
1171
  const handleReject = async () => {
770
1172
  setIsProcessing(true);
771
1173
  try {
772
- await _optionalChain([onReject, 'optionalCall', _6 => _6(data.approvalRequestId)]);
1174
+ await _optionalChain([onReject, 'optionalCall', _7 => _7(data.approvalRequestId)]);
773
1175
  } finally {
774
1176
  setIsProcessing(false);
775
1177
  }
@@ -779,12 +1181,12 @@ var ApprovalBatchMessage = _react.forwardRef.call(void 0,
779
1181
  _chunkFCZAUK4Dcjs.Button,
780
1182
  {
781
1183
  size: "small-legacy",
782
- variant: "accent",
1184
+ variant: escalated ? "warning" : "accent",
783
1185
  onClick: handleApprove,
784
1186
  disabled: isProcessing,
785
1187
  className: _chunk63A4GZMBcjs.cn.call(void 0,
786
- "bg-ods-accent hover:bg-ods-accent/90",
787
- "text-ods-bg text-h5",
1188
+ !escalated && "bg-ods-accent text-ods-bg hover:bg-ods-accent/90",
1189
+ "text-h5",
788
1190
  "h-8 px-[var(--spacing-system-xsf)]"
789
1191
  ),
790
1192
  children: "Approve"
@@ -807,7 +1209,7 @@ var ApprovalBatchMessage = _react.forwardRef.call(void 0,
807
1209
  )
808
1210
  ] });
809
1211
  if (isClient) {
810
- const titles = data.toolCalls.map((c) => _optionalChain([c, 'access', _7 => _7.toolExplanation, 'optionalAccess', _8 => _8.trim, 'call', _9 => _9()]) || _optionalChain([c, 'access', _10 => _10.toolTitle, 'optionalAccess', _11 => _11.trim, 'call', _12 => _12()])).filter((s) => !!s);
1212
+ const titles = data.toolCalls.map((c) => _optionalChain([c, 'access', _8 => _8.toolExplanation, 'optionalAccess', _9 => _9.trim, 'call', _10 => _10()]) || _optionalChain([c, 'access', _11 => _11.toolTitle, 'optionalAccess', _12 => _12.trim, 'call', _13 => _13()])).filter((s) => !!s);
811
1213
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref, className: _chunk63A4GZMBcjs.cn.call(void 0, "mb-[var(--spacing-system-xsf)]", CHAT_BLOCK_CLASS, className), ...props, children: [
812
1214
  titles.length > 0 ? titles.map((title, i) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "w-full whitespace-pre-line break-words text-ods-text-primary text-h4", children: title }, i)) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "w-full text-ods-text-primary text-h4", children: "Approval required" }),
813
1215
  showFooterActions && status === "pending" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ApprovalWaitingLine, {}),
@@ -838,7 +1240,8 @@ var ApprovalBatchMessage = _react.forwardRef.call(void 0,
838
1240
  expanded: expandedId === call.toolExecutionRequestId,
839
1241
  onToggle: () => setExpandedId((prev) => prev === call.toolExecutionRequestId ? null : call.toolExecutionRequestId),
840
1242
  batchStatus: status,
841
- execution: _optionalChain([data, 'access', _13 => _13.executions, 'optionalAccess', _14 => _14[call.toolExecutionRequestId]]),
1243
+ showEscalationAlert: showEscalationAlerts,
1244
+ execution: _optionalChain([data, 'access', _14 => _14.executions, 'optionalAccess', _15 => _15[call.toolExecutionRequestId]]),
842
1245
  showExecutionStatus
843
1246
  },
844
1247
  call.toolExecutionRequestId
@@ -868,10 +1271,10 @@ ApprovalBatchMessage.displayName = "ApprovalBatchMessage";
868
1271
 
869
1272
  function AgentMark({ agent, className = "", color = _chunkJBTH3O2Ccjs.AGENT_GLYPH_COLOR }) {
870
1273
  const identity = _chunkJBTH3O2Ccjs.useAgentIdentityIcon.call(void 0, agent);
871
- if (_optionalChain([identity, 'optionalAccess', _15 => _15.url])) {
1274
+ if (_optionalChain([identity, 'optionalAccess', _16 => _16.url])) {
872
1275
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "aria-hidden": "true", className: _chunk63A4GZMBcjs.cn.call(void 0, "relative inline-block overflow-hidden rounded-full", className), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGG466XFQcjs.next_image_default, { src: identity.url, alt: "", fill: true, sizes: _chunkJQCQCE6Ucjs.fixedImageSlot.call(void 0, "mark"), className: _chunkJBTH3O2Ccjs.AGENT_PICTURE_CLASS }) });
873
1276
  }
874
- if (_optionalChain([identity, 'optionalAccess', _16 => _16.name])) {
1277
+ if (_optionalChain([identity, 'optionalAccess', _17 => _17.name])) {
875
1278
  return _react.createElement.call(void 0, _chunkJQCQCE6Ucjs.resolveIcon.call(void 0, identity.name), {
876
1279
  className,
877
1280
  "aria-hidden": true,
@@ -924,4 +1327,18 @@ function AgentAvatarSkeleton({ size, className }) {
924
1327
 
925
1328
 
926
1329
 
927
- exports.formatTicketRelativeTime = formatTicketRelativeTime; exports.formatTicketFullTimestamp = formatTicketFullTimestamp; exports.formatRelativeTime = formatRelativeTime; exports.formatRelativeTimeFrom = formatRelativeTimeFrom; exports.formatAbsoluteDate = formatAbsoluteDate; exports.formatDateTime = formatDateTime; exports.getDetailedTimeDifference = getDetailedTimeDifference; exports.isToday = isToday; exports.isWithinMinutes = isWithinMinutes; exports.createUTCTimestamp = createUTCTimestamp; exports.ColorSwatch = ColorSwatch; exports.resolveTicketStatus = resolveTicketStatus; exports.getTicketStatusConfig = getTicketStatusConfig; exports.getTicketStatusTag = getTicketStatusTag; exports.kindToCanonicalStatus = kindToCanonicalStatus; exports.usesCanonicalStatusStyle = usesCanonicalStatusStyle; exports.resolveStatusTagProps = resolveStatusTagProps; exports.TicketStatusTag = TicketStatusTag; exports.StatusLine = StatusLine; exports.CHAT_BLOCK_FRAME_CLASS = CHAT_BLOCK_FRAME_CLASS; exports.CHAT_BLOCK_CLASS = CHAT_BLOCK_CLASS; exports.ExpandChevron = ExpandChevron; exports.useCollapsible = useCollapsible; exports.COMMAND_BODY_ARG_KEYS = COMMAND_BODY_ARG_KEYS; exports.getCommandText = getCommandText; exports.ArgRow = ArgRow; exports.ResultBlock = ResultBlock; exports.CommandBlock = CommandBlock; exports.ApprovalStatusTag = ApprovalStatusTag; exports.ApprovalWaitingLine = ApprovalWaitingLine; exports.ApprovalBatchMessage = ApprovalBatchMessage; exports.AgentMark = AgentMark; exports.AgentAvatar = AgentAvatar;
1330
+
1331
+
1332
+
1333
+
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+
1340
+
1341
+
1342
+
1343
+
1344
+ exports.formatTicketRelativeTime = formatTicketRelativeTime; exports.formatTicketFullTimestamp = formatTicketFullTimestamp; exports.formatRelativeTime = formatRelativeTime; exports.formatRelativeTimeFrom = formatRelativeTimeFrom; exports.formatAbsoluteDate = formatAbsoluteDate; exports.formatDateTime = formatDateTime; exports.getDetailedTimeDifference = getDetailedTimeDifference; exports.isToday = isToday; exports.isWithinMinutes = isWithinMinutes; exports.createUTCTimestamp = createUTCTimestamp; exports.ColorSwatch = ColorSwatch; exports.resolveTicketStatus = resolveTicketStatus; exports.getTicketStatusConfig = getTicketStatusConfig; exports.getTicketStatusTag = getTicketStatusTag; exports.kindToCanonicalStatus = kindToCanonicalStatus; exports.usesCanonicalStatusStyle = usesCanonicalStatusStyle; exports.resolveStatusTagProps = resolveStatusTagProps; exports.TicketStatusTag = TicketStatusTag; exports.Alert = Alert; exports.AlertTitle = AlertTitle; exports.AlertDescription = AlertDescription; exports.TextHold = TextHold; exports.LayoutHold = LayoutHold; exports.StatusLine = StatusLine; exports.CHAT_BLOCK_FRAME_CLASS = CHAT_BLOCK_FRAME_CLASS; exports.CHAT_BLOCK_CLASS = CHAT_BLOCK_CLASS; exports.ExpandChevron = ExpandChevron; exports.useCollapsible = useCollapsible; exports.TabSelector = TabSelector; exports.TouchFriendlyTooltip = TouchFriendlyTooltip; exports.APPROVAL_LEVELS = APPROVAL_LEVELS; exports.APPROVAL_LEVEL_META = APPROVAL_LEVEL_META; exports.ApprovalLevelView = ApprovalLevelView; exports.COMMAND_BODY_ARG_KEYS = COMMAND_BODY_ARG_KEYS; exports.getCommandText = getCommandText; exports.ArgRow = ArgRow; exports.ResultBlock = ResultBlock; exports.CommandBlock = CommandBlock; exports.isPolicyEscalated = isPolicyEscalated; exports.hasPolicyReviewRows = hasPolicyReviewRows; exports.PolicyReviewRows = PolicyReviewRows; exports.PolicyEscalationAlert = PolicyEscalationAlert; exports.ApprovalStatusTag = ApprovalStatusTag; exports.ApprovalWaitingLine = ApprovalWaitingLine; exports.ApprovalBatchMessage = ApprovalBatchMessage; exports.AgentMark = AgentMark; exports.AgentAvatar = AgentAvatar;