@flamingo-stack/openframe-frontend-core 0.0.351 → 0.0.352-snapshot.20260701170615

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 (117) hide show
  1. package/dist/{chunk-HMUIRZ46.cjs → chunk-3B663UT5.cjs} +222 -165
  2. package/dist/chunk-3B663UT5.cjs.map +1 -0
  3. package/dist/{chunk-UQFTSFIF.cjs → chunk-5AR4XSIK.cjs} +29 -29
  4. package/dist/{chunk-UQFTSFIF.cjs.map → chunk-5AR4XSIK.cjs.map} +1 -1
  5. package/dist/{chunk-MLW25MGY.js → chunk-5Y6G2GKO.js} +3 -3
  6. package/dist/{chunk-EKU6D26E.js → chunk-776NIQQ6.js} +6 -6
  7. package/dist/{chunk-YBL3JURC.js → chunk-BAPR6IQV.js} +5 -5
  8. package/dist/{chunk-VY6AAUCK.js → chunk-CDPGUKPU.js} +2 -2
  9. package/dist/{chunk-NEIOYJIE.cjs → chunk-D4TPL6T4.cjs} +15 -15
  10. package/dist/{chunk-NEIOYJIE.cjs.map → chunk-D4TPL6T4.cjs.map} +1 -1
  11. package/dist/{chunk-YIFJJCFB.js → chunk-EQQZLZZH.js} +4 -4
  12. package/dist/{chunk-RD3HIB25.cjs → chunk-GPX5I7FT.cjs} +2 -2
  13. package/dist/{chunk-FPAF4JHM.js.map → chunk-GPX5I7FT.cjs.map} +1 -1
  14. package/dist/{chunk-46Z3O6SN.cjs → chunk-HAFY32LW.cjs} +5 -5
  15. package/dist/{chunk-46Z3O6SN.cjs.map → chunk-HAFY32LW.cjs.map} +1 -1
  16. package/dist/{chunk-VZ7TICMR.cjs → chunk-HWFFUT6G.cjs} +40 -40
  17. package/dist/{chunk-VZ7TICMR.cjs.map → chunk-HWFFUT6G.cjs.map} +1 -1
  18. package/dist/{chunk-NIRMBPFP.cjs → chunk-IVL6FGM6.cjs} +19 -19
  19. package/dist/{chunk-NIRMBPFP.cjs.map → chunk-IVL6FGM6.cjs.map} +1 -1
  20. package/dist/{chunk-FPAF4JHM.js → chunk-JGAAUUD7.js} +2 -2
  21. package/dist/chunk-JGAAUUD7.js.map +1 -0
  22. package/dist/{chunk-A6YFD2SK.js → chunk-OKGXLXDW.js} +174 -117
  23. package/dist/chunk-OKGXLXDW.js.map +1 -0
  24. package/dist/{chunk-63ISTNQW.cjs → chunk-P56AC6I5.cjs} +31 -31
  25. package/dist/{chunk-63ISTNQW.cjs.map → chunk-P56AC6I5.cjs.map} +1 -1
  26. package/dist/{chunk-4WVVMKMC.js → chunk-POLYFLWF.js} +5 -5
  27. package/dist/{chunk-JKJO7HVH.cjs → chunk-RYROZ7HM.cjs} +3 -3
  28. package/dist/{chunk-JKJO7HVH.cjs.map → chunk-RYROZ7HM.cjs.map} +1 -1
  29. package/dist/{chunk-QGBJKB6V.cjs → chunk-TWVF3QU5.cjs} +39 -39
  30. package/dist/{chunk-QGBJKB6V.cjs.map → chunk-TWVF3QU5.cjs.map} +1 -1
  31. package/dist/{chunk-KYCZ4ISB.js → chunk-U5MQW3PH.js} +2 -2
  32. package/dist/{chunk-XZVVLO4V.cjs → chunk-W3CCNLBL.cjs} +12 -12
  33. package/dist/{chunk-XZVVLO4V.cjs.map → chunk-W3CCNLBL.cjs.map} +1 -1
  34. package/dist/{chunk-DJZ64AF6.js → chunk-XJQNOT4Z.js} +2 -2
  35. package/dist/{chunk-TH3HPNMO.cjs → chunk-XKRR5GIV.cjs} +70 -70
  36. package/dist/{chunk-TH3HPNMO.cjs.map → chunk-XKRR5GIV.cjs.map} +1 -1
  37. package/dist/{chunk-JBWB3U3P.js → chunk-YGCWTL7E.js} +2 -2
  38. package/dist/{chunk-5F45BY24.js → chunk-YI5435S6.js} +3 -3
  39. package/dist/{chunk-BMQ5CBFD.cjs → chunk-YL2YXSRI.cjs} +73 -73
  40. package/dist/{chunk-BMQ5CBFD.cjs.map → chunk-YL2YXSRI.cjs.map} +1 -1
  41. package/dist/{chunk-GJZL72ON.cjs → chunk-Z22AMCZL.cjs} +7 -7
  42. package/dist/{chunk-GJZL72ON.cjs.map → chunk-Z22AMCZL.cjs.map} +1 -1
  43. package/dist/{chunk-WB2EWYSF.js → chunk-ZAKU2MOI.js} +3 -3
  44. package/dist/{chunk-Q3VK7WI2.js → chunk-ZYB2QBNU.js} +6 -6
  45. package/dist/components/case-studies/index.cjs +9 -9
  46. package/dist/components/case-studies/index.js +3 -3
  47. package/dist/components/chat/approval-batch-message.d.ts +7 -1
  48. package/dist/components/chat/approval-batch-message.d.ts.map +1 -1
  49. package/dist/components/chat/approval-request-message.d.ts.map +1 -1
  50. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  51. package/dist/components/chat/index.cjs +3 -3
  52. package/dist/components/chat/index.js +2 -2
  53. package/dist/components/chat/tool-call-blocks.d.ts.map +1 -1
  54. package/dist/components/chat/tool-execution-display.d.ts.map +1 -1
  55. package/dist/components/chat/types/component.types.d.ts +6 -0
  56. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  57. package/dist/components/contact/index.cjs +4 -4
  58. package/dist/components/contact/index.js +3 -3
  59. package/dist/components/docs/index.cjs +6 -6
  60. package/dist/components/docs/index.js +5 -5
  61. package/dist/components/embeds/index.cjs +4 -4
  62. package/dist/components/embeds/index.js +3 -3
  63. package/dist/components/faq/index.cjs +5 -5
  64. package/dist/components/faq/index.js +4 -4
  65. package/dist/components/features/index.cjs +3 -3
  66. package/dist/components/features/index.js +2 -2
  67. package/dist/components/help-center-pages/index.cjs +22 -22
  68. package/dist/components/help-center-pages/index.js +13 -13
  69. package/dist/components/index.cjs +124 -124
  70. package/dist/components/index.js +11 -11
  71. package/dist/components/navigation/index.cjs +3 -3
  72. package/dist/components/navigation/index.js +2 -2
  73. package/dist/components/onboarding-guides/index.cjs +7 -7
  74. package/dist/components/onboarding-guides/index.js +6 -6
  75. package/dist/components/related-content/index.cjs +5 -5
  76. package/dist/components/related-content/index.js +4 -4
  77. package/dist/components/tickets/index.cjs +6 -6
  78. package/dist/components/tickets/index.js +5 -5
  79. package/dist/components/ui/index.cjs +3 -3
  80. package/dist/components/ui/index.js +2 -2
  81. package/dist/hooks/index.cjs +2 -2
  82. package/dist/hooks/index.js +1 -1
  83. package/dist/index.cjs +3 -3
  84. package/dist/index.js +2 -2
  85. package/dist/utils/index.cjs +1 -1
  86. package/dist/utils/index.cjs.map +1 -1
  87. package/dist/utils/index.js +1 -1
  88. package/dist/utils/index.js.map +1 -1
  89. package/dist/utils/platform-config.d.ts.map +1 -1
  90. package/package.json +1 -1
  91. package/src/components/chat/approval-batch-message.tsx +82 -27
  92. package/src/components/chat/approval-request-message.tsx +27 -19
  93. package/src/components/chat/chat-message-enhanced.tsx +3 -0
  94. package/src/components/chat/tool-call-blocks.tsx +17 -6
  95. package/src/components/chat/tool-execution-display.tsx +23 -8
  96. package/src/components/chat/types/component.types.ts +6 -0
  97. package/src/stories/ApprovalBatchMessage.stories.tsx +169 -0
  98. package/src/stories/ApprovalBatchMessageClient.stories.tsx +172 -0
  99. package/src/stories/ApprovalRequestMessage.stories.tsx +95 -0
  100. package/src/stories/ToolExecutionDisplay.stories.tsx +1 -1
  101. package/src/stories/ToolExecutionDisplayClient.stories.tsx +64 -0
  102. package/src/utils/platform-config.tsx +4 -1
  103. package/dist/chunk-A6YFD2SK.js.map +0 -1
  104. package/dist/chunk-HMUIRZ46.cjs.map +0 -1
  105. package/dist/chunk-RD3HIB25.cjs.map +0 -1
  106. /package/dist/{chunk-MLW25MGY.js.map → chunk-5Y6G2GKO.js.map} +0 -0
  107. /package/dist/{chunk-EKU6D26E.js.map → chunk-776NIQQ6.js.map} +0 -0
  108. /package/dist/{chunk-YBL3JURC.js.map → chunk-BAPR6IQV.js.map} +0 -0
  109. /package/dist/{chunk-VY6AAUCK.js.map → chunk-CDPGUKPU.js.map} +0 -0
  110. /package/dist/{chunk-YIFJJCFB.js.map → chunk-EQQZLZZH.js.map} +0 -0
  111. /package/dist/{chunk-4WVVMKMC.js.map → chunk-POLYFLWF.js.map} +0 -0
  112. /package/dist/{chunk-KYCZ4ISB.js.map → chunk-U5MQW3PH.js.map} +0 -0
  113. /package/dist/{chunk-DJZ64AF6.js.map → chunk-XJQNOT4Z.js.map} +0 -0
  114. /package/dist/{chunk-JBWB3U3P.js.map → chunk-YGCWTL7E.js.map} +0 -0
  115. /package/dist/{chunk-5F45BY24.js.map → chunk-YI5435S6.js.map} +0 -0
  116. /package/dist/{chunk-WB2EWYSF.js.map → chunk-ZAKU2MOI.js.map} +0 -0
  117. /package/dist/{chunk-Q3VK7WI2.js.map → chunk-ZYB2QBNU.js.map} +0 -0
@@ -25,7 +25,7 @@ import {
25
25
  useOgPlaceholderUrl,
26
26
  useOnboardingState,
27
27
  useToast
28
- } from "./chunk-FPAF4JHM.js";
28
+ } from "./chunk-JGAAUUD7.js";
29
29
  import {
30
30
  AlertCircleIcon,
31
31
  AnthropicLogoGreyIcon,
@@ -515,27 +515,30 @@ function Tag({
515
515
  }
516
516
 
517
517
  // src/components/chat/approval-request-message.tsx
518
- import { CheckCircle, XCircle } from "lucide-react";
518
+ import { Ban, CheckCircle, XCircle } from "lucide-react";
519
519
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
520
520
  function ApprovalFieldList({ fields }) {
521
- return /* @__PURE__ */ jsx2("dl", { className: "flex flex-col gap-2.5 mt-1", children: fields.map((f, i) => /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-0.5", children: [
521
+ return /* @__PURE__ */ jsx2("dl", { className: "flex flex-col gap-2.5 mt-[var(--spacing-system-xxs)]", children: fields.map((f, i) => /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-0.5", children: [
522
522
  /* @__PURE__ */ jsx2("dt", { className: "font-['DM_Sans'] font-semibold text-[11px] uppercase tracking-wide text-ods-text-tertiary leading-4", children: f.label }),
523
- /* @__PURE__ */ jsx2("dd", { className: "font-['DM_Sans'] text-sm text-ods-text-primary leading-5 whitespace-pre-wrap break-words", children: f.value })
523
+ /* @__PURE__ */ jsx2("dd", { className: "text-h6 text-ods-text-primary whitespace-pre-wrap break-words", children: f.value })
524
524
  ] }, i)) });
525
525
  }
526
526
  function ApprovalCardBody({
527
527
  data
528
528
  }) {
529
- return /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-1", children: [
530
- /* @__PURE__ */ jsxs2("div", { className: "bg-ods-bg border border-ods-border rounded-md p-3 flex gap-2 items-start max-h-32 overflow-y-auto", children: [
531
- /* @__PURE__ */ jsx2("code", { className: "font-['DM_Sans'] font-medium text-sm text-ods-text-primary flex-1 leading-5 whitespace-pre-wrap break-words", children: data.command }),
529
+ return /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-[var(--spacing-system-xxs)]", children: [
530
+ /* @__PURE__ */ jsxs2("div", { className: "bg-ods-bg border border-ods-border rounded-md p-[var(--spacing-system-sf)] flex gap-[var(--spacing-system-xsf)] items-start max-h-32 overflow-y-auto", children: [
531
+ /* @__PURE__ */ jsx2("code", { className: "text-h6 text-ods-text-primary flex-1 whitespace-pre-wrap break-words", children: data.command }),
532
532
  data.icon && /* @__PURE__ */ jsx2("div", { className: "w-4 h-4 shrink-0 text-ods-text-tertiary", children: data.icon })
533
533
  ] }),
534
- data.fields && data.fields.length > 0 ? /* @__PURE__ */ jsx2(ApprovalFieldList, { fields: data.fields }) : data.explanation && /* @__PURE__ */ jsx2("p", { className: "font-['DM_Sans'] font-medium text-sm text-ods-text-secondary leading-5 whitespace-pre-line break-words", children: data.explanation })
534
+ data.fields && data.fields.length > 0 ? /* @__PURE__ */ jsx2(ApprovalFieldList, { fields: data.fields }) : data.explanation && /* @__PURE__ */ jsx2("p", { className: "text-h6 text-ods-text-secondary whitespace-pre-line break-words", children: data.explanation })
535
535
  ] });
536
536
  }
537
537
  var ApprovalRequestMessage = forwardRef(
538
- ({ className, data, onApprove, onReject, status = "pending", ...props }, ref) => {
538
+ // `assistantType` is accepted for prop-parity with the batch card (so hosts
539
+ // can forward it uniformly); the legacy single-command card has no
540
+ // icon/divider to vary, so it renders identically for admin and client today.
541
+ ({ className, data, onApprove, onReject, status = "pending", assistantType: _assistantType, ...props }, ref) => {
539
542
  const [isProcessing, setIsProcessing] = useState(false);
540
543
  const handleApprove = async () => {
541
544
  setIsProcessing(true);
@@ -558,13 +561,13 @@ var ApprovalRequestMessage = forwardRef(
558
561
  {
559
562
  ref,
560
563
  className: cn(
561
- "bg-ods-card border border-ods-border rounded-md p-4 mb-2 flex flex-col gap-4",
564
+ "bg-ods-card border border-ods-border rounded-md p-[var(--spacing-system-mf)] mb-[var(--spacing-system-xsf)] flex flex-col gap-[var(--spacing-system-mf)]",
562
565
  className
563
566
  ),
564
567
  ...props,
565
568
  children: [
566
569
  /* @__PURE__ */ jsx2(ApprovalCardBody, { data }),
567
- status === "pending" ? /* @__PURE__ */ jsxs2("div", { className: "flex gap-4 items-center", children: [
570
+ status === "pending" ? /* @__PURE__ */ jsxs2("div", { className: "flex gap-[var(--spacing-system-mf)] items-center", children: [
568
571
  /* @__PURE__ */ jsx2(
569
572
  Button,
570
573
  {
@@ -574,8 +577,8 @@ var ApprovalRequestMessage = forwardRef(
574
577
  disabled: isProcessing,
575
578
  className: cn(
576
579
  "bg-ods-accent hover:bg-ods-accent/90",
577
- "font-mono font-medium md:!text-sm text-ods-bg uppercase tracking-[-0.28px]",
578
- "px-2 py-1 h-auto"
580
+ "text-h5 text-ods-bg",
581
+ "px-[var(--spacing-system-xsf)] h-8"
579
582
  ),
580
583
  children: "Approve"
581
584
  }
@@ -589,20 +592,13 @@ var ApprovalRequestMessage = forwardRef(
589
592
  disabled: isProcessing,
590
593
  className: cn(
591
594
  "bg-ods-card border-ods-border",
592
- "font-mono font-medium md:!text-sm text-ods-text-primary uppercase tracking-[-0.28px]",
593
- "hover:bg-ods-bg px-2 py-1 h-auto"
595
+ "text-h5 text-ods-text-primary",
596
+ "hover:bg-ods-bg px-[var(--spacing-system-xsf)] h-8"
594
597
  ),
595
598
  children: "Reject"
596
599
  }
597
600
  )
598
- ] }) : /* @__PURE__ */ jsx2("div", { className: "flex", children: /* @__PURE__ */ jsx2(
599
- Tag,
600
- {
601
- label: status === "approved" ? "Approved" : "Rejected",
602
- variant: status === "approved" ? "success" : "error",
603
- icon: status === "approved" ? /* @__PURE__ */ jsx2(CheckCircle, { className: "w-4 h-4" }) : /* @__PURE__ */ jsx2(XCircle, { className: "w-4 h-4" })
604
- }
605
- ) })
601
+ ] }) : /* @__PURE__ */ jsx2("div", { className: "flex", children: status === "approved" ? /* @__PURE__ */ jsx2(Tag, { label: "Approved", variant: "success", icon: /* @__PURE__ */ jsx2(CheckCircle, { className: "w-4 h-4" }) }) : status === "cancelled" ? /* @__PURE__ */ jsx2(Tag, { label: "Canceled", variant: "grey", icon: /* @__PURE__ */ jsx2(Ban, { className: "w-4 h-4" }) }) : /* @__PURE__ */ jsx2(Tag, { label: "Rejected", variant: "error", icon: /* @__PURE__ */ jsx2(XCircle, { className: "w-4 h-4" }) }) })
606
602
  ]
607
603
  }
608
604
  );
@@ -771,10 +767,11 @@ function formatToolResult(value) {
771
767
 
772
768
  // src/components/chat/tool-call-blocks.tsx
773
769
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
770
+ var CODE_PRE_CLASS = "bg-ods-bg border border-ods-border rounded-md p-[var(--spacing-system-sf)] w-full max-h-64 overflow-auto text-xs leading-5 text-ods-text-primary font-mono whitespace-pre";
774
771
  function ArgRow({ argKey, value }) {
775
772
  const formatted = formatToolArgValue(value);
776
773
  if (formatted.kind === "inline") {
777
- return /* @__PURE__ */ jsxs3("div", { className: "flex gap-1 items-start w-full", children: [
774
+ return /* @__PURE__ */ jsxs3("div", { className: "flex gap-[var(--spacing-system-xxs)] items-start w-full", children: [
778
775
  /* @__PURE__ */ jsxs3("span", { className: "shrink-0 text-ods-text-secondary", children: [
779
776
  argKey,
780
777
  ":"
@@ -782,40 +779,41 @@ function ArgRow({ argKey, value }) {
782
779
  /* @__PURE__ */ jsx4("span", { className: "flex-1 min-w-0 text-ods-text-primary break-all", children: formatted.text })
783
780
  ] });
784
781
  }
785
- return /* @__PURE__ */ jsxs3("div", { className: "flex flex-col gap-1 items-start w-full", children: [
782
+ return /* @__PURE__ */ jsxs3("div", { className: "flex flex-col gap-[var(--spacing-system-xxs)] items-start w-full", children: [
786
783
  /* @__PURE__ */ jsxs3("span", { className: "text-ods-text-secondary", children: [
787
784
  argKey,
788
785
  ":"
789
786
  ] }),
790
- /* @__PURE__ */ jsx4("pre", { className: "bg-ods-bg border border-ods-border rounded-md p-3 w-full max-h-64 overflow-auto text-xs leading-5 text-ods-text-primary font-mono whitespace-pre", children: /* @__PURE__ */ jsx4("code", { children: formatted.text }) })
787
+ /* @__PURE__ */ jsx4("pre", { className: CODE_PRE_CLASS, children: /* @__PURE__ */ jsx4("code", { children: formatted.text }) })
791
788
  ] });
792
789
  }
793
790
  function ResultBlock({ result, className }) {
794
791
  const formatted = formatToolResult(result);
795
792
  if (!formatted.text) return null;
796
793
  if (formatted.kind === "inline") {
797
- return /* @__PURE__ */ jsxs3("div", { className: cn("flex flex-col gap-1 items-start w-full", className), children: [
794
+ return /* @__PURE__ */ jsxs3("div", { className: cn("flex flex-col gap-[var(--spacing-system-xxs)] items-start w-full", className), children: [
798
795
  /* @__PURE__ */ jsx4("span", { className: "text-ods-text-secondary", children: "Result:" }),
799
796
  /* @__PURE__ */ jsx4("span", { className: "text-ods-text-primary break-all", children: formatted.text })
800
797
  ] });
801
798
  }
802
- return /* @__PURE__ */ jsxs3("div", { className: cn("flex flex-col gap-1 items-start w-full", className), children: [
799
+ return /* @__PURE__ */ jsxs3("div", { className: cn("flex flex-col gap-[var(--spacing-system-xxs)] items-start w-full", className), children: [
803
800
  /* @__PURE__ */ jsx4("span", { className: "text-ods-text-secondary", children: "Result:" }),
804
- /* @__PURE__ */ jsx4("pre", { className: "bg-ods-bg border border-ods-border rounded-md p-3 w-full max-h-64 overflow-auto text-xs leading-5 text-ods-text-primary font-mono whitespace-pre", children: /* @__PURE__ */ jsx4("code", { children: formatted.text }) })
801
+ /* @__PURE__ */ jsx4("pre", { className: CODE_PRE_CLASS, children: /* @__PURE__ */ jsx4("code", { children: formatted.text }) })
805
802
  ] });
806
803
  }
807
804
 
808
805
  // src/components/chat/approval-batch-message.tsx
809
806
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
810
807
  var COMMAND_BODY_KEYS = new Set(COMMAND_BODY_ARG_KEYS);
811
- function renderStatusTag(status) {
808
+ function renderStatusTag(status, isClient, resolvedByName) {
809
+ const suffix = isClient && resolvedByName ? ` by ${resolvedByName}` : "";
812
810
  if (status === "approved") {
813
- return /* @__PURE__ */ jsx5(Tag, { label: "Approved", variant: "success", icon: /* @__PURE__ */ jsx5(CheckCircleIcon, { className: "w-4 h-4" }) });
811
+ return /* @__PURE__ */ jsx5(Tag, { label: `Approved${suffix}`, variant: "success", icon: /* @__PURE__ */ jsx5(CheckCircleIcon, { className: "w-4 h-4" }) });
814
812
  }
815
813
  if (status === "cancelled") {
816
- return /* @__PURE__ */ jsx5(Tag, { label: "Cancelled", variant: "grey", icon: /* @__PURE__ */ jsx5(XmarkIcon, { className: "w-4 h-4" }) });
814
+ return /* @__PURE__ */ jsx5(Tag, { label: `Canceled${suffix}`, variant: "grey", icon: /* @__PURE__ */ jsx5(XmarkIcon, { className: "w-4 h-4" }) });
817
815
  }
818
- return /* @__PURE__ */ jsx5(Tag, { label: "Rejected", variant: "error", icon: /* @__PURE__ */ jsx5(XmarkCircleIcon, { className: "w-4 h-4" }) });
816
+ return /* @__PURE__ */ jsx5(Tag, { label: `Rejected${suffix}`, variant: "error", icon: /* @__PURE__ */ jsx5(XmarkCircleIcon, { className: "w-4 h-4" }) });
819
817
  }
820
818
  function getArgEntries(call) {
821
819
  const args = call.toolCallArguments;
@@ -831,47 +829,66 @@ function ExecutionStatusIcon({
831
829
  if (execution.success === false) return /* @__PURE__ */ jsx5(XmarkCircleIcon, { className: "w-4 h-4 text-ods-error" });
832
830
  return /* @__PURE__ */ jsx5(CheckCircleIcon, { className: "w-4 h-4 text-ods-success" });
833
831
  }
834
- function ToolCallRow({ call, expanded, onToggle, batchStatus, execution, showExecutionStatus }) {
832
+ function ToolCallRow({ call, expanded, onToggle, batchStatus, execution, showExecutionStatus, isClient }) {
835
833
  const command = getCommandText(call);
836
834
  const args = getArgEntries(call);
837
835
  const toolType = call.toolType || "OPENFRAME";
838
836
  const { innerRef, containerStyle } = useCollapsible({ expanded });
839
837
  const result = execution?.status === "done" ? execution.result : void 0;
840
838
  const hasExpandableBody = args.length > 0 || typeof result === "string" && result.length > 0;
841
- return /* @__PURE__ */ jsxs4("div", { className: "bg-ods-card border-b border-ods-border last:border-b-0 flex flex-col items-start w-full", children: [
842
- /* @__PURE__ */ jsxs4(
843
- "button",
844
- {
845
- type: "button",
846
- onClick: onToggle,
847
- className: "flex gap-2 items-start w-full p-3 cursor-pointer text-left",
848
- children: [
849
- /* @__PURE__ */ jsx5("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx5(ToolIcon, { toolType, size: 16 }) }),
850
- /* @__PURE__ */ jsx5(
851
- "div",
852
- {
853
- className: cn(
854
- "flex-1 min-w-0 font-medium text-sm leading-5",
855
- expanded ? "text-ods-text-primary whitespace-pre-wrap break-all" : "text-ods-text-secondary line-clamp-2 max-h-10 break-all"
839
+ return /* @__PURE__ */ jsxs4(
840
+ "div",
841
+ {
842
+ className: cn(
843
+ "bg-ods-card flex flex-col items-start w-full",
844
+ // ADMIN: rows share one outer card, separated by a bottom border.
845
+ // CLIENT (Fae): each command is its own self-contained bordered box
846
+ // (Figma 1092-2804 / 1972-7925) — the outer component is frameless.
847
+ isClient ? "border border-ods-border rounded-[6px] overflow-hidden" : "border-b border-ods-border last:border-b-0"
848
+ ),
849
+ children: [
850
+ /* @__PURE__ */ jsxs4(
851
+ "button",
852
+ {
853
+ type: "button",
854
+ onClick: onToggle,
855
+ className: "flex gap-[var(--spacing-system-xsf)] items-start w-full p-[var(--spacing-system-sf)] cursor-pointer text-left",
856
+ children: [
857
+ !isClient && /* @__PURE__ */ jsx5("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx5(ToolIcon, { toolType, size: 16 }) }),
858
+ /* @__PURE__ */ jsx5(
859
+ "div",
860
+ {
861
+ className: cn(
862
+ "flex-1 min-w-0 text-h6",
863
+ expanded ? "text-ods-text-primary whitespace-pre-wrap break-all" : "text-ods-text-secondary line-clamp-2 max-h-10 break-all"
864
+ ),
865
+ children: command
866
+ }
856
867
  ),
857
- children: command
868
+ showExecutionStatus && /* @__PURE__ */ jsx5("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx5(ExecutionStatusIcon, { batchStatus, execution }) }),
869
+ /* @__PURE__ */ jsx5("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx5(ExpandChevron, { expanded }) })
870
+ ]
871
+ }
872
+ ),
873
+ /* @__PURE__ */ jsx5("div", { className: "w-full", style: containerStyle, children: /* @__PURE__ */ jsx5("div", { ref: innerRef, children: hasExpandableBody && /* @__PURE__ */ jsxs4("div", { className: "flex flex-col gap-0 items-start w-full text-h6 px-[var(--spacing-system-sf)] pb-[var(--spacing-system-sf)] bg-ods-card", children: [
874
+ args.map(([key, value]) => /* @__PURE__ */ jsx5(ArgRow, { argKey: key, value }, key)),
875
+ result && /* @__PURE__ */ jsx5(
876
+ ResultBlock,
877
+ {
878
+ result,
879
+ className: args.length > 0 ? "mt-[var(--spacing-system-xsf)]" : void 0
858
880
  }
859
- ),
860
- showExecutionStatus && /* @__PURE__ */ jsx5("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx5(ExecutionStatusIcon, { batchStatus, execution }) }),
861
- /* @__PURE__ */ jsx5("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx5(ExpandChevron, { expanded }) })
862
- ]
863
- }
864
- ),
865
- /* @__PURE__ */ jsx5("div", { className: "w-full", style: containerStyle, children: /* @__PURE__ */ jsx5("div", { ref: innerRef, children: hasExpandableBody && /* @__PURE__ */ jsxs4("div", { className: "flex flex-col gap-2 items-start w-full text-sm font-medium leading-5 p-3 bg-ods-card", children: [
866
- args.map(([key, value]) => /* @__PURE__ */ jsx5(ArgRow, { argKey: key, value }, key)),
867
- result && /* @__PURE__ */ jsx5(ResultBlock, { result })
868
- ] }) }) })
869
- ] });
881
+ )
882
+ ] }) }) })
883
+ ]
884
+ }
885
+ );
870
886
  }
871
887
  var ApprovalBatchMessage = forwardRef2(
872
- ({ className, data, onApprove, onReject, status = "pending", maxBodyHeight, resolvedByName, showExecutionStatus = true, ...props }, ref) => {
888
+ ({ className, data, onApprove, onReject, status = "pending", maxBodyHeight, resolvedByName, showExecutionStatus = true, assistantType, ...props }, ref) => {
873
889
  const [expandedId, setExpandedId] = useState3(null);
874
890
  const [isProcessing, setIsProcessing] = useState3(false);
891
+ const isClient = assistantType === "fae";
875
892
  const explanations = data.toolCalls.map((c) => c.toolExplanation?.trim()).filter((s) => !!s);
876
893
  const handleApprove = async () => {
877
894
  setIsProcessing(true);
@@ -895,7 +912,10 @@ var ApprovalBatchMessage = forwardRef2(
895
912
  {
896
913
  ref,
897
914
  className: cn(
898
- "bg-ods-card border border-ods-border rounded-md overflow-hidden flex flex-col mb-2",
915
+ "flex flex-col mb-[var(--spacing-system-xsf)]",
916
+ // ADMIN: one framed card. CLIENT (Fae): frameless container — the
917
+ // bordered command box(es) + button/status row stacked 16px apart.
918
+ isClient ? "gap-[var(--spacing-system-mf)]" : "bg-ods-card border border-ods-border rounded-md overflow-hidden",
899
919
  className
900
920
  ),
901
921
  ...props,
@@ -903,7 +923,11 @@ var ApprovalBatchMessage = forwardRef2(
903
923
  /* @__PURE__ */ jsx5(
904
924
  "div",
905
925
  {
906
- className: cn("flex flex-col", maxBodyHeight != null && "overflow-y-auto overscroll-contain"),
926
+ className: cn(
927
+ "flex flex-col",
928
+ isClient && "gap-[var(--spacing-system-mf)]",
929
+ maxBodyHeight != null && "overflow-y-auto overscroll-contain"
930
+ ),
907
931
  style: maxBodyHeight != null ? { maxHeight: maxBodyHeight } : void 0,
908
932
  children: data.toolCalls.map((call) => /* @__PURE__ */ jsx5(
909
933
  ToolCallRow,
@@ -915,53 +939,65 @@ var ApprovalBatchMessage = forwardRef2(
915
939
  ),
916
940
  batchStatus: status,
917
941
  execution: data.executions?.[call.toolExecutionRequestId],
918
- showExecutionStatus
942
+ showExecutionStatus,
943
+ isClient
919
944
  },
920
945
  call.toolExecutionRequestId
921
946
  ))
922
947
  }
923
948
  ),
924
- showFooterBlock && /* @__PURE__ */ jsxs4("div", { className: "bg-ods-card flex flex-col gap-2 items-start justify-center p-3", children: [
925
- explanations.length > 0 && /* @__PURE__ */ jsx5("ul", { className: "list-disc pl-5 text-sm font-medium text-ods-text-primary leading-5 w-full", children: explanations.map((expl, i) => /* @__PURE__ */ jsx5("li", { children: expl }, i)) }),
926
- status === "pending" ? /* @__PURE__ */ jsxs4("div", { className: "flex gap-2 items-center", children: [
927
- /* @__PURE__ */ jsx5(
928
- Button,
929
- {
930
- size: "small-legacy",
931
- variant: "accent",
932
- onClick: handleApprove,
933
- disabled: isProcessing,
934
- className: cn(
935
- "bg-ods-accent hover:bg-ods-accent/90",
936
- "font-mono font-medium md:!text-sm text-ods-bg uppercase tracking-[-0.28px]",
937
- "px-2 py-1 h-auto"
938
- ),
939
- children: "Approve"
940
- }
949
+ showFooterBlock && /* @__PURE__ */ jsxs4(
950
+ "div",
951
+ {
952
+ className: cn(
953
+ "flex flex-col gap-[var(--spacing-system-xsf)] items-start justify-center",
954
+ // ADMIN: padded footer inside the card, divided from the list.
955
+ // CLIENT (Fae): buttons/status sit flush outside the box.
956
+ !isClient && "bg-ods-card border-t border-ods-border p-[var(--spacing-system-sf)]"
941
957
  ),
942
- /* @__PURE__ */ jsx5(
943
- Button,
944
- {
945
- size: "small-legacy",
946
- variant: "outline",
947
- onClick: handleReject,
948
- disabled: isProcessing,
949
- className: cn(
950
- "bg-ods-card border-ods-border",
951
- "font-mono font-medium md:!text-sm text-ods-text-primary uppercase tracking-[-0.28px]",
952
- "hover:bg-ods-bg px-2 py-1 h-auto"
958
+ children: [
959
+ explanations.length > 0 && /* @__PURE__ */ jsx5("ul", { className: "list-disc pl-5 text-h6 text-ods-text-primary w-full", children: explanations.map((expl, i) => /* @__PURE__ */ jsx5("li", { children: expl }, i)) }),
960
+ status === "pending" ? /* @__PURE__ */ jsxs4("div", { className: "flex gap-[var(--spacing-system-xsf)] items-center", children: [
961
+ /* @__PURE__ */ jsx5(
962
+ Button,
963
+ {
964
+ size: "small-legacy",
965
+ variant: "accent",
966
+ onClick: handleApprove,
967
+ disabled: isProcessing,
968
+ className: cn(
969
+ "bg-ods-accent hover:bg-ods-accent/90",
970
+ "text-h5 text-ods-bg",
971
+ "px-[var(--spacing-system-xsf)] h-8"
972
+ ),
973
+ children: "Approve"
974
+ }
953
975
  ),
954
- children: "Reject"
955
- }
956
- )
957
- ] }) : /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-2", children: [
958
- renderStatusTag(status),
959
- resolvedByName && /* @__PURE__ */ jsxs4("span", { className: "text-h6 text-ods-text-secondary", children: [
960
- "by ",
961
- resolvedByName
962
- ] })
963
- ] })
964
- ] })
976
+ /* @__PURE__ */ jsx5(
977
+ Button,
978
+ {
979
+ size: "small-legacy",
980
+ variant: "outline",
981
+ onClick: handleReject,
982
+ disabled: isProcessing,
983
+ className: cn(
984
+ "bg-ods-card border-ods-border",
985
+ "text-h5 text-ods-text-primary",
986
+ "hover:bg-ods-bg px-[var(--spacing-system-xsf)] h-8"
987
+ ),
988
+ children: "Reject"
989
+ }
990
+ )
991
+ ] }) : /* @__PURE__ */ jsxs4("div", { className: "flex items-center gap-[var(--spacing-system-xsf)]", children: [
992
+ renderStatusTag(status, isClient, resolvedByName),
993
+ !isClient && resolvedByName && /* @__PURE__ */ jsxs4("span", { className: "text-h6 text-ods-text-secondary", children: [
994
+ "by ",
995
+ resolvedByName
996
+ ] })
997
+ ] })
998
+ ]
999
+ }
1000
+ )
965
1001
  ]
966
1002
  }
967
1003
  );
@@ -4336,9 +4372,10 @@ import { forwardRef as forwardRef10, useMemo as useMemo4, useState as useState9
4336
4372
  import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
4337
4373
  var COMMAND_BODY_KEYS2 = new Set(COMMAND_BODY_ARG_KEYS);
4338
4374
  var ToolExecutionDisplay = forwardRef10(
4339
- ({ className, message: message2, ...props }, ref) => {
4375
+ ({ className, message: message2, assistantType, ...props }, ref) => {
4340
4376
  const [expanded, setExpanded] = useState9(false);
4341
4377
  const { innerRef, containerStyle } = useCollapsible({ expanded });
4378
+ const isClient = assistantType === "fae";
4342
4379
  const isExecuting = message2.type === "EXECUTING_TOOL";
4343
4380
  const isExecuted = message2.type === "EXECUTED_TOOL";
4344
4381
  const integratedToolType = message2.integratedToolType || "OPENFRAME";
@@ -4369,6 +4406,8 @@ var ToolExecutionDisplay = forwardRef10(
4369
4406
  {
4370
4407
  ref,
4371
4408
  className: cn(
4409
+ // The command running block keeps its bordered box in both chats
4410
+ // (Figma 1972-6109). CLIENT (Fae) only drops the tool icon below.
4372
4411
  "bg-ods-card border border-ods-border rounded-[6px] overflow-hidden w-full flex flex-col",
4373
4412
  className
4374
4413
  ),
@@ -4381,12 +4420,12 @@ var ToolExecutionDisplay = forwardRef10(
4381
4420
  className: "flex gap-[var(--spacing-system-xs)] items-start p-[var(--spacing-system-s)] cursor-pointer text-left w-full",
4382
4421
  onClick: () => setExpanded((prev) => !prev),
4383
4422
  children: [
4384
- /* @__PURE__ */ jsx21("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx21(ToolIcon, { toolType: integratedToolType, size: 16 }) }),
4423
+ !isClient && /* @__PURE__ */ jsx21("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx21(ToolIcon, { toolType: integratedToolType, size: 16 }) }),
4385
4424
  /* @__PURE__ */ jsx21(
4386
4425
  "div",
4387
4426
  {
4388
4427
  className: cn(
4389
- "flex-1 min-w-0 text-sm font-medium leading-5",
4428
+ "flex-1 min-w-0 text-h6",
4390
4429
  expanded ? "text-ods-text-primary whitespace-pre-wrap break-all" : "text-ods-text-secondary line-clamp-2 max-h-10 break-all"
4391
4430
  ),
4392
4431
  children: previewText
@@ -4397,13 +4436,28 @@ var ToolExecutionDisplay = forwardRef10(
4397
4436
  ]
4398
4437
  }
4399
4438
  ),
4400
- /* @__PURE__ */ jsx21("div", { className: "w-full", style: containerStyle, children: /* @__PURE__ */ jsx21("div", { ref: innerRef, children: hasBody && /* @__PURE__ */ jsxs17("div", { className: "flex flex-col gap-2 items-start w-full text-sm font-medium leading-5 p-3 bg-ods-card", children: [
4439
+ /* @__PURE__ */ jsx21("div", { className: "w-full", style: containerStyle, children: /* @__PURE__ */ jsx21("div", { ref: innerRef, children: hasBody && /* @__PURE__ */ jsxs17("div", { className: "flex flex-col gap-0 items-start w-full text-h6 p-[var(--spacing-system-sf)] bg-ods-card", children: [
4401
4440
  argEntries.map(([key, value]) => /* @__PURE__ */ jsx21(ArgRow, { argKey: key, value }, key)),
4402
- hasResult && /* @__PURE__ */ jsx21(ResultBlock, { result: message2.result }),
4403
- isExecuting && /* @__PURE__ */ jsxs17("div", { className: "flex flex-col gap-1 items-start w-full", children: [
4404
- /* @__PURE__ */ jsx21("span", { className: "text-ods-text-secondary", children: "Result:" }),
4405
- /* @__PURE__ */ jsx21(DotsLoaderIcon, { size: 16, className: "text-ods-text-secondary" })
4406
- ] })
4441
+ hasResult && /* @__PURE__ */ jsx21(
4442
+ ResultBlock,
4443
+ {
4444
+ result: message2.result,
4445
+ className: argEntries.length > 0 ? "mt-[var(--spacing-system-xsf)]" : void 0
4446
+ }
4447
+ ),
4448
+ isExecuting && /* @__PURE__ */ jsxs17(
4449
+ "div",
4450
+ {
4451
+ className: cn(
4452
+ "flex flex-col gap-[var(--spacing-system-xxs)] items-start w-full",
4453
+ argEntries.length > 0 && "mt-[var(--spacing-system-xsf)]"
4454
+ ),
4455
+ children: [
4456
+ /* @__PURE__ */ jsx21("span", { className: "text-ods-text-secondary", children: "Result:" }),
4457
+ /* @__PURE__ */ jsx21(DotsLoaderIcon, { size: 16, className: "text-ods-text-secondary" })
4458
+ ]
4459
+ }
4460
+ )
4407
4461
  ] }) }) })
4408
4462
  ]
4409
4463
  }
@@ -5159,7 +5213,8 @@ var ChatMessageEnhanced = forwardRef11(
5159
5213
  return /* @__PURE__ */ jsx24(
5160
5214
  ToolExecutionDisplay,
5161
5215
  {
5162
- message: segment.data
5216
+ message: segment.data,
5217
+ assistantType
5163
5218
  },
5164
5219
  index
5165
5220
  );
@@ -5170,7 +5225,8 @@ var ChatMessageEnhanced = forwardRef11(
5170
5225
  data: segment.data,
5171
5226
  status: segment.status,
5172
5227
  onApprove: segment.onApprove,
5173
- onReject: segment.onReject
5228
+ onReject: segment.onReject,
5229
+ assistantType
5174
5230
  },
5175
5231
  index
5176
5232
  );
@@ -5182,7 +5238,8 @@ var ChatMessageEnhanced = forwardRef11(
5182
5238
  status: segment.status,
5183
5239
  resolvedByName: segment.resolvedByName,
5184
5240
  onApprove: segment.onApprove,
5185
- onReject: segment.onReject
5241
+ onReject: segment.onReject,
5242
+ assistantType
5186
5243
  },
5187
5244
  index
5188
5245
  );
@@ -50392,4 +50449,4 @@ export {
50392
50449
  LogsList,
50393
50450
  assets
50394
50451
  };
50395
- //# sourceMappingURL=chunk-A6YFD2SK.js.map
50452
+ //# sourceMappingURL=chunk-OKGXLXDW.js.map