@flamingo-stack/openframe-frontend-core 0.0.354 → 0.0.355-snapshot.20260701201047

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 (116) hide show
  1. package/dist/{chunk-AN7YCTF4.js → chunk-2YYYGBLE.js} +3 -3
  2. package/dist/{chunk-5RYGC2HA.cjs → chunk-3PUFWBRR.cjs} +29 -29
  3. package/dist/{chunk-5RYGC2HA.cjs.map → chunk-3PUFWBRR.cjs.map} +1 -1
  4. package/dist/{chunk-RERV3ALE.cjs → chunk-44F5VCCJ.cjs} +7 -7
  5. package/dist/{chunk-RERV3ALE.cjs.map → chunk-44F5VCCJ.cjs.map} +1 -1
  6. package/dist/{chunk-LPJKRZRD.js → chunk-5NV6U7SX.js} +2 -2
  7. package/dist/{chunk-SH5ZPAVK.js → chunk-64EZVZZQ.js} +4 -4
  8. package/dist/{chunk-U5MQW3PH.js → chunk-7RQM23VH.js} +2 -2
  9. package/dist/{chunk-GPX5I7FT.cjs → chunk-B7NOIJR3.cjs} +2 -2
  10. package/dist/chunk-B7NOIJR3.cjs.map +1 -0
  11. package/dist/{chunk-HD4S7ITV.cjs → chunk-CR6ZUBNF.cjs} +40 -40
  12. package/dist/{chunk-HD4S7ITV.cjs.map → chunk-CR6ZUBNF.cjs.map} +1 -1
  13. package/dist/{chunk-XXVNJDZV.cjs → chunk-CVDJ6S4Y.cjs} +5 -5
  14. package/dist/{chunk-XXVNJDZV.cjs.map → chunk-CVDJ6S4Y.cjs.map} +1 -1
  15. package/dist/{chunk-MHWK6CDS.cjs → chunk-EBQNKU66.cjs} +19 -19
  16. package/dist/{chunk-MHWK6CDS.cjs.map → chunk-EBQNKU66.cjs.map} +1 -1
  17. package/dist/{chunk-LNJ4QIAN.cjs → chunk-F3GFL65H.cjs} +31 -31
  18. package/dist/{chunk-LNJ4QIAN.cjs.map → chunk-F3GFL65H.cjs.map} +1 -1
  19. package/dist/{chunk-NJ4R2IJY.js → chunk-FFFOXYA7.js} +6 -6
  20. package/dist/{chunk-5CTJCJV3.js → chunk-H6ZKXS32.js} +3 -3
  21. package/dist/{chunk-HEXR3TGX.js → chunk-HTR5P2PT.js} +2 -2
  22. package/dist/{chunk-3XNJWYLX.cjs → chunk-IEXRQXJM.cjs} +15 -15
  23. package/dist/{chunk-3XNJWYLX.cjs.map → chunk-IEXRQXJM.cjs.map} +1 -1
  24. package/dist/{chunk-OQ75ZMB7.cjs → chunk-IYO2PQRQ.cjs} +747 -723
  25. package/dist/chunk-IYO2PQRQ.cjs.map +1 -0
  26. package/dist/{chunk-SJ3O2463.js → chunk-KV7UDCIW.js} +5 -5
  27. package/dist/{chunk-DFZ74LGW.js → chunk-MSMWCG6V.js} +3 -3
  28. package/dist/{chunk-O6HI537F.cjs → chunk-PDZOVPTI.cjs} +12 -12
  29. package/dist/{chunk-O6HI537F.cjs.map → chunk-PDZOVPTI.cjs.map} +1 -1
  30. package/dist/{chunk-2RX6DW5A.cjs → chunk-PGDL4GI7.cjs} +73 -73
  31. package/dist/{chunk-2RX6DW5A.cjs.map → chunk-PGDL4GI7.cjs.map} +1 -1
  32. package/dist/{chunk-RYROZ7HM.cjs → chunk-QCG3MBP6.cjs} +3 -3
  33. package/dist/{chunk-RYROZ7HM.cjs.map → chunk-QCG3MBP6.cjs.map} +1 -1
  34. package/dist/{chunk-SJBFKX6U.js → chunk-QSVG54VM.js} +29 -5
  35. package/dist/chunk-QSVG54VM.js.map +1 -0
  36. package/dist/{chunk-4XFFHXCQ.js → chunk-SBMDCLK4.js} +6 -6
  37. package/dist/{chunk-JGAAUUD7.js → chunk-UJ4ENR2O.js} +2 -2
  38. package/dist/chunk-UJ4ENR2O.js.map +1 -0
  39. package/dist/{chunk-3MUALDLX.js → chunk-VTFPRVGI.js} +5 -5
  40. package/dist/{chunk-J5RQ4T5L.cjs → chunk-VXZWKYM4.cjs} +70 -70
  41. package/dist/{chunk-J5RQ4T5L.cjs.map → chunk-VXZWKYM4.cjs.map} +1 -1
  42. package/dist/{chunk-NJRZK3KL.cjs → chunk-YUSVGYRV.cjs} +39 -39
  43. package/dist/{chunk-NJRZK3KL.cjs.map → chunk-YUSVGYRV.cjs.map} +1 -1
  44. package/dist/{chunk-BWT6O7K5.js → chunk-ZDTARDIT.js} +2 -2
  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.map +1 -1
  48. package/dist/components/chat/index.cjs +5 -3
  49. package/dist/components/chat/index.cjs.map +1 -1
  50. package/dist/components/chat/index.js +4 -2
  51. package/dist/components/chat/tool-call-blocks.d.ts +9 -0
  52. package/dist/components/chat/tool-call-blocks.d.ts.map +1 -1
  53. package/dist/components/chat/utils/tool-call-helpers.d.ts +7 -0
  54. package/dist/components/chat/utils/tool-call-helpers.d.ts.map +1 -1
  55. package/dist/components/contact/index.cjs +4 -4
  56. package/dist/components/contact/index.js +3 -3
  57. package/dist/components/docs/index.cjs +6 -6
  58. package/dist/components/docs/index.js +5 -5
  59. package/dist/components/embeds/index.cjs +4 -4
  60. package/dist/components/embeds/index.js +3 -3
  61. package/dist/components/faq/index.cjs +5 -5
  62. package/dist/components/faq/index.js +4 -4
  63. package/dist/components/features/index.cjs +3 -3
  64. package/dist/components/features/index.js +2 -2
  65. package/dist/components/help-center-pages/index.cjs +22 -22
  66. package/dist/components/help-center-pages/index.js +13 -13
  67. package/dist/components/index.cjs +126 -124
  68. package/dist/components/index.cjs.map +1 -1
  69. package/dist/components/index.js +13 -11
  70. package/dist/components/index.js.map +1 -1
  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 +5 -3
  80. package/dist/components/ui/index.cjs.map +1 -1
  81. package/dist/components/ui/index.js +4 -2
  82. package/dist/hooks/index.cjs +2 -2
  83. package/dist/hooks/index.js +1 -1
  84. package/dist/index.cjs +5 -3
  85. package/dist/index.cjs.map +1 -1
  86. package/dist/index.js +4 -2
  87. package/dist/types/index.cjs +1 -1
  88. package/dist/types/index.cjs.map +1 -1
  89. package/dist/types/index.js +1 -1
  90. package/dist/types/index.js.map +1 -1
  91. package/dist/utils/index.cjs +1 -1
  92. package/dist/utils/index.cjs.map +1 -1
  93. package/dist/utils/index.js +1 -1
  94. package/dist/utils/index.js.map +1 -1
  95. package/package.json +1 -1
  96. package/src/components/chat/approval-batch-message.tsx +22 -6
  97. package/src/components/chat/tool-call-blocks.tsx +14 -0
  98. package/src/components/chat/utils/tool-call-helpers.ts +16 -0
  99. package/src/stories/ApprovalBatchMessageClient.stories.tsx +4 -0
  100. package/src/types/tool.types.ts +1 -1
  101. package/dist/chunk-GPX5I7FT.cjs.map +0 -1
  102. package/dist/chunk-JGAAUUD7.js.map +0 -1
  103. package/dist/chunk-OQ75ZMB7.cjs.map +0 -1
  104. package/dist/chunk-SJBFKX6U.js.map +0 -1
  105. /package/dist/{chunk-AN7YCTF4.js.map → chunk-2YYYGBLE.js.map} +0 -0
  106. /package/dist/{chunk-LPJKRZRD.js.map → chunk-5NV6U7SX.js.map} +0 -0
  107. /package/dist/{chunk-SH5ZPAVK.js.map → chunk-64EZVZZQ.js.map} +0 -0
  108. /package/dist/{chunk-U5MQW3PH.js.map → chunk-7RQM23VH.js.map} +0 -0
  109. /package/dist/{chunk-NJ4R2IJY.js.map → chunk-FFFOXYA7.js.map} +0 -0
  110. /package/dist/{chunk-5CTJCJV3.js.map → chunk-H6ZKXS32.js.map} +0 -0
  111. /package/dist/{chunk-HEXR3TGX.js.map → chunk-HTR5P2PT.js.map} +0 -0
  112. /package/dist/{chunk-SJ3O2463.js.map → chunk-KV7UDCIW.js.map} +0 -0
  113. /package/dist/{chunk-DFZ74LGW.js.map → chunk-MSMWCG6V.js.map} +0 -0
  114. /package/dist/{chunk-4XFFHXCQ.js.map → chunk-SBMDCLK4.js.map} +0 -0
  115. /package/dist/{chunk-3MUALDLX.js.map → chunk-VTFPRVGI.js.map} +0 -0
  116. /package/dist/{chunk-BWT6O7K5.js.map → chunk-ZDTARDIT.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
2
 
3
3
 
4
- var _chunkGPX5I7FTcjs = require('./chunk-GPX5I7FT.cjs');
4
+ var _chunkB7NOIJR3cjs = require('./chunk-B7NOIJR3.cjs');
5
5
 
6
6
  // src/hooks/use-self-fetch.ts
7
7
  var _react = require('react');
@@ -27,7 +27,7 @@ function useSelfFetch(url, options) {
27
27
  try {
28
28
  setIsLoading(true);
29
29
  setError(false);
30
- const res = await _chunkGPX5I7FTcjs.contentFetch.call(void 0, url, { signal: ctrl.signal });
30
+ const res = await _chunkB7NOIJR3cjs.contentFetch.call(void 0, url, { signal: ctrl.signal });
31
31
  if (!res.ok) throw new Error(`Request failed (${res.status})`);
32
32
  const json = await res.json();
33
33
  if (!cancelled) {
@@ -65,4 +65,4 @@ function useSelfFetch(url, options) {
65
65
 
66
66
 
67
67
  exports.useSelfFetch = useSelfFetch;
68
- //# sourceMappingURL=chunk-RYROZ7HM.cjs.map
68
+ //# sourceMappingURL=chunk-QCG3MBP6.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-RYROZ7HM.cjs","../src/hooks/use-self-fetch.ts"],"names":[],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-RYROZ7HM.cjs","sourcesContent":[null,"'use client'\n\nimport { useEffect, useRef, useState, type Dispatch, type SetStateAction } from 'react'\nimport { contentFetch } from '../utils/embed-content-fetch'\n\nexport interface UseSelfFetchResult<T> {\n data: T | null\n /** Imperatively patch the fetched data (e.g. optimistic vote updates). */\n setData: Dispatch<SetStateAction<T | null>>\n isLoading: boolean\n error: boolean\n /** Re-run the fetch (error-retry affordance). */\n reload: () => void\n}\n\n/**\n * The single source for the 4 self-fetching content views\n * (`ProductReleasesView`, `RoadmapView`, the onboarding catalog/detail). GETs a\n * configured `url` into component state with **plain `fetch` + `useEffect`** —\n * deliberately NO react-query, so embedders don't need a QueryClient. This is\n * the same technology choice the shipped `DeliveryLists` makes; that component\n * predates this hook and still hand-rolls the loop (a future pass can migrate\n * it onto a two-url variant of this hook).\n *\n * Behaviour:\n * - `url = null` → fetching is DISABLED (controlled / SSR mode, or missing\n * config); returns `initialData ?? null` and never fetches.\n * - `initialData` provided → hydrates immediately and SKIPS the first fetch\n * (so the hub's server-rendered data isn't re-fetched on mount); later\n * `url` changes still re-fetch.\n * - a `cancelled` guard ensures an in-flight response from a STALE `url`\n * (e.g. a fast pagination / section toggle) can't overwrite a newer one.\n * - `reload()` bumps an internal key to retry after an error.\n *\n * Re-fetches whenever `url` changes, so callers fold all query params INTO the\n * url string (the url IS the cache key).\n */\nexport function useSelfFetch<T>(\n url: string | null,\n options?: { initialData?: T },\n): UseSelfFetchResult<T> {\n const initialData = options?.initialData\n const [data, setData] = useState<T | null>(initialData ?? null)\n const [isLoading, setIsLoading] = useState(initialData === undefined && url !== null)\n const [error, setError] = useState(false)\n const [reloadKey, setReloadKey] = useState(0)\n // The url whose data we currently hold — seeded from SSR `initialData`, then set after\n // each completed fetch. The effect skips the fetch when this equals `url` (so server-\n // rendered data isn't re-fetched on mount). A VALUE compare (not a one-shot flag) so the\n // SSR-hydration skip survives React 18 StrictMode's mount→unmount→remount in dev;\n // `reload()` nulls it to force a re-fetch of the same url.\n const dataUrlRef = useRef<string | null>(initialData !== undefined ? url : null)\n\n // Re-sync when a CONTROLLED `initialData` changes (e.g. the host navigates\n // between detail slugs without remounting). No-op in self-fetch mode, where\n // `initialData` is `undefined`.\n useEffect(() => {\n if (initialData !== undefined) setData(initialData)\n }, [initialData])\n\n useEffect(() => {\n if (url === null) {\n setIsLoading(false)\n return\n }\n // Already hold data for this exact url (SSR-hydrated, or a prior completed fetch) →\n // skip. `reload()` clears `dataUrlRef` so a retry of the same url still fetches.\n if (dataUrlRef.current === url) return\n const ctrl = new AbortController()\n let cancelled = false\n async function load() {\n try {\n setIsLoading(true)\n setError(false)\n const res = await contentFetch(url as string, { signal: ctrl.signal })\n if (!res.ok) throw new Error(`Request failed (${res.status})`)\n const json = (await res.json()) as T\n if (!cancelled) {\n setData(json)\n dataUrlRef.current = url // remember the url we now hold data for\n }\n } catch (err) {\n // AbortError on cleanup (unmount / stale-url change / React StrictMode's dev\n // double-invoke) is EXPECTED — the request was intentionally aborted. Aborting\n // also means the orphaned StrictMode fetch shows as \"cancelled\" instead of\n // completing as a wasted duplicate (parity with useChatIdentity). Only real\n // failures fall through to the error state + console.\n if (cancelled || (err as Error)?.name === 'AbortError') return\n setError(true)\n console.error('useSelfFetch:', url, err)\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n load()\n return () => {\n cancelled = true\n ctrl.abort()\n }\n // `url` folds in every query param; `reloadKey` drives retry.\n }, [url, reloadKey])\n\n return {\n data,\n setData,\n isLoading,\n error,\n // Force a re-fetch of the current url: clear the held-url ref so the skip above\n // doesn't short-circuit, then bump the effect key.\n reload: () => {\n dataUrlRef.current = null\n setReloadKey((k) => k + 1)\n },\n }\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-QCG3MBP6.cjs","../src/hooks/use-self-fetch.ts"],"names":[],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-QCG3MBP6.cjs","sourcesContent":[null,"'use client'\n\nimport { useEffect, useRef, useState, type Dispatch, type SetStateAction } from 'react'\nimport { contentFetch } from '../utils/embed-content-fetch'\n\nexport interface UseSelfFetchResult<T> {\n data: T | null\n /** Imperatively patch the fetched data (e.g. optimistic vote updates). */\n setData: Dispatch<SetStateAction<T | null>>\n isLoading: boolean\n error: boolean\n /** Re-run the fetch (error-retry affordance). */\n reload: () => void\n}\n\n/**\n * The single source for the 4 self-fetching content views\n * (`ProductReleasesView`, `RoadmapView`, the onboarding catalog/detail). GETs a\n * configured `url` into component state with **plain `fetch` + `useEffect`** —\n * deliberately NO react-query, so embedders don't need a QueryClient. This is\n * the same technology choice the shipped `DeliveryLists` makes; that component\n * predates this hook and still hand-rolls the loop (a future pass can migrate\n * it onto a two-url variant of this hook).\n *\n * Behaviour:\n * - `url = null` → fetching is DISABLED (controlled / SSR mode, or missing\n * config); returns `initialData ?? null` and never fetches.\n * - `initialData` provided → hydrates immediately and SKIPS the first fetch\n * (so the hub's server-rendered data isn't re-fetched on mount); later\n * `url` changes still re-fetch.\n * - a `cancelled` guard ensures an in-flight response from a STALE `url`\n * (e.g. a fast pagination / section toggle) can't overwrite a newer one.\n * - `reload()` bumps an internal key to retry after an error.\n *\n * Re-fetches whenever `url` changes, so callers fold all query params INTO the\n * url string (the url IS the cache key).\n */\nexport function useSelfFetch<T>(\n url: string | null,\n options?: { initialData?: T },\n): UseSelfFetchResult<T> {\n const initialData = options?.initialData\n const [data, setData] = useState<T | null>(initialData ?? null)\n const [isLoading, setIsLoading] = useState(initialData === undefined && url !== null)\n const [error, setError] = useState(false)\n const [reloadKey, setReloadKey] = useState(0)\n // The url whose data we currently hold — seeded from SSR `initialData`, then set after\n // each completed fetch. The effect skips the fetch when this equals `url` (so server-\n // rendered data isn't re-fetched on mount). A VALUE compare (not a one-shot flag) so the\n // SSR-hydration skip survives React 18 StrictMode's mount→unmount→remount in dev;\n // `reload()` nulls it to force a re-fetch of the same url.\n const dataUrlRef = useRef<string | null>(initialData !== undefined ? url : null)\n\n // Re-sync when a CONTROLLED `initialData` changes (e.g. the host navigates\n // between detail slugs without remounting). No-op in self-fetch mode, where\n // `initialData` is `undefined`.\n useEffect(() => {\n if (initialData !== undefined) setData(initialData)\n }, [initialData])\n\n useEffect(() => {\n if (url === null) {\n setIsLoading(false)\n return\n }\n // Already hold data for this exact url (SSR-hydrated, or a prior completed fetch) →\n // skip. `reload()` clears `dataUrlRef` so a retry of the same url still fetches.\n if (dataUrlRef.current === url) return\n const ctrl = new AbortController()\n let cancelled = false\n async function load() {\n try {\n setIsLoading(true)\n setError(false)\n const res = await contentFetch(url as string, { signal: ctrl.signal })\n if (!res.ok) throw new Error(`Request failed (${res.status})`)\n const json = (await res.json()) as T\n if (!cancelled) {\n setData(json)\n dataUrlRef.current = url // remember the url we now hold data for\n }\n } catch (err) {\n // AbortError on cleanup (unmount / stale-url change / React StrictMode's dev\n // double-invoke) is EXPECTED — the request was intentionally aborted. Aborting\n // also means the orphaned StrictMode fetch shows as \"cancelled\" instead of\n // completing as a wasted duplicate (parity with useChatIdentity). Only real\n // failures fall through to the error state + console.\n if (cancelled || (err as Error)?.name === 'AbortError') return\n setError(true)\n console.error('useSelfFetch:', url, err)\n } finally {\n if (!cancelled) setIsLoading(false)\n }\n }\n load()\n return () => {\n cancelled = true\n ctrl.abort()\n }\n // `url` folds in every query param; `reloadKey` drives retry.\n }, [url, reloadKey])\n\n return {\n data,\n setData,\n isLoading,\n error,\n // Force a re-fetch of the current url: clear the held-url ref so the skip above\n // doesn't short-circuit, then bump the effect key.\n reload: () => {\n dataUrlRef.current = null\n setReloadKey((k) => k + 1)\n },\n }\n}\n"]}
@@ -25,7 +25,7 @@ import {
25
25
  useOgPlaceholderUrl,
26
26
  useOnboardingState,
27
27
  useToast
28
- } from "./chunk-JGAAUUD7.js";
28
+ } from "./chunk-UJ4ENR2O.js";
29
29
  import {
30
30
  AlertCircleIcon,
31
31
  AnthropicLogoGreyIcon,
@@ -686,6 +686,15 @@ function getCommandText(call) {
686
686
  name: call.toolName
687
687
  });
688
688
  }
689
+ function getCommandBody(args) {
690
+ if (args && typeof args === "object") {
691
+ for (const key of COMMAND_BODY_ARG_KEYS) {
692
+ const candidate = args[key];
693
+ if (typeof candidate === "string" && candidate.trim()) return candidate;
694
+ }
695
+ }
696
+ return void 0;
697
+ }
689
698
  var INLINE_STRING_MAX = 80;
690
699
  function expandJson(value, indent) {
691
700
  const pad = (n) => " ".repeat(n);
@@ -801,6 +810,10 @@ function ResultBlock({ result, className }) {
801
810
  /* @__PURE__ */ jsx4("pre", { className: CODE_PRE_CLASS, children: /* @__PURE__ */ jsx4("code", { children: formatted.text }) })
802
811
  ] });
803
812
  }
813
+ function CommandBlock({ command, className }) {
814
+ if (!command) return null;
815
+ return /* @__PURE__ */ jsx4("pre", { className: cn(CODE_PRE_CLASS, className), children: /* @__PURE__ */ jsx4("code", { children: command }) });
816
+ }
804
817
 
805
818
  // src/components/chat/approval-batch-message.tsx
806
819
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
@@ -835,7 +848,10 @@ function ToolCallRow({ call, expanded, onToggle, batchStatus, execution, showExe
835
848
  const toolType = call.toolType || "OPENFRAME";
836
849
  const { innerRef, containerStyle } = useCollapsible({ expanded });
837
850
  const result = execution?.status === "done" ? execution.result : void 0;
838
- const hasExpandableBody = args.length > 0 || typeof result === "string" && result.length > 0;
851
+ const explanation = call.toolExplanation?.trim();
852
+ const headerText = isClient && explanation ? explanation : command;
853
+ const commandBody = isClient ? getCommandBody(call.toolCallArguments) : void 0;
854
+ const hasExpandableBody = !!commandBody || args.length > 0 || typeof result === "string" && result.length > 0;
839
855
  return /* @__PURE__ */ jsxs4(
840
856
  "div",
841
857
  {
@@ -862,7 +878,7 @@ function ToolCallRow({ call, expanded, onToggle, batchStatus, execution, showExe
862
878
  "flex-1 min-w-0 text-h6",
863
879
  expanded ? "text-ods-text-primary whitespace-pre-wrap break-all" : "text-ods-text-secondary line-clamp-2 max-h-10 break-all"
864
880
  ),
865
- children: command
881
+ children: headerText
866
882
  }
867
883
  ),
868
884
  showExecutionStatus && /* @__PURE__ */ jsx5("div", { className: "flex items-center justify-center shrink-0 w-5 h-5", children: /* @__PURE__ */ jsx5(ExecutionStatusIcon, { batchStatus, execution }) }),
@@ -871,6 +887,13 @@ function ToolCallRow({ call, expanded, onToggle, batchStatus, execution, showExe
871
887
  }
872
888
  ),
873
889
  /* @__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: [
890
+ commandBody && /* @__PURE__ */ jsx5(
891
+ CommandBlock,
892
+ {
893
+ command: commandBody,
894
+ className: args.length > 0 || result ? "mb-[var(--spacing-system-xsf)]" : void 0
895
+ }
896
+ ),
874
897
  args.map(([key, value]) => /* @__PURE__ */ jsx5(ArgRow, { argKey: key, value }, key)),
875
898
  result && /* @__PURE__ */ jsx5(
876
899
  ResultBlock,
@@ -889,7 +912,7 @@ var ApprovalBatchMessage = forwardRef2(
889
912
  const [expandedId, setExpandedId] = useState3(null);
890
913
  const [isProcessing, setIsProcessing] = useState3(false);
891
914
  const isClient = assistantType === "fae";
892
- const explanations = data.toolCalls.map((c) => c.toolExplanation?.trim()).filter((s) => !!s);
915
+ const explanations = isClient ? [] : data.toolCalls.map((c) => c.toolExplanation?.trim()).filter((s) => !!s);
893
916
  const handleApprove = async () => {
894
917
  setIsProcessing(true);
895
918
  try {
@@ -49841,6 +49864,7 @@ export {
49841
49864
  getCommandText,
49842
49865
  ArgRow,
49843
49866
  ResultBlock,
49867
+ CommandBlock,
49844
49868
  ApprovalBatchMessage,
49845
49869
  ContextCompactionDisplay,
49846
49870
  SimpleMarkdownRenderer,
@@ -50501,4 +50525,4 @@ export {
50501
50525
  LogsList,
50502
50526
  assets
50503
50527
  };
50504
- //# sourceMappingURL=chunk-SJBFKX6U.js.map
50528
+ //# sourceMappingURL=chunk-QSVG54VM.js.map