@agent-native/toolkit 0.217.0 → 0.219.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/agent-native.eject.json +21 -0
  2. package/dist/app/agent-page/AgentContextTab.d.ts.map +1 -1
  3. package/dist/app/agent-page/AgentContextTab.js +1 -0
  4. package/dist/app/agent-page/AgentContextTab.js.map +1 -1
  5. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  6. package/dist/app/agentkit/react/components.js +1 -1
  7. package/dist/app/agentkit/react/components.js.map +1 -1
  8. package/dist/app/agentkit/react/context.d.ts +4 -1
  9. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  10. package/dist/app/agentkit/react/context.js +3 -1
  11. package/dist/app/agentkit/react/context.js.map +1 -1
  12. package/dist/app/agentkit/react/data-chart-layout.d.ts +30 -0
  13. package/dist/app/agentkit/react/data-chart-layout.d.ts.map +1 -0
  14. package/dist/app/agentkit/react/data-chart-layout.js +2 -0
  15. package/dist/app/agentkit/react/data-chart-layout.js.map +1 -0
  16. package/dist/app/agentkit/react/index.d.ts +1 -0
  17. package/dist/app/agentkit/react/index.d.ts.map +1 -1
  18. package/dist/app/agentkit/react/index.js +1 -0
  19. package/dist/app/agentkit/react/index.js.map +1 -1
  20. package/dist/app/agentkit/react/root.d.ts +3 -1
  21. package/dist/app/agentkit/react/root.d.ts.map +1 -1
  22. package/dist/app/agentkit/react/root.js +2 -2
  23. package/dist/app/agentkit/react/root.js.map +1 -1
  24. package/dist/app/agentkit/react/styles.css +31 -6
  25. package/dist/app/agentkit/react/transcript-layout.d.ts +2 -0
  26. package/dist/app/agentkit/react/transcript-layout.d.ts.map +1 -1
  27. package/dist/app/agentkit/react/transcript-layout.js.map +1 -1
  28. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  29. package/dist/app/chat/AgentKitAssistantChat.js +2 -2
  30. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  31. package/dist/app/chat/AgentPanel.js +6 -6
  32. package/dist/app/chat/AgentPanel.js.map +1 -1
  33. package/dist/app/chat/MultiTabAssistantChat.d.ts.map +1 -1
  34. package/dist/app/chat/MultiTabAssistantChat.js +53 -95
  35. package/dist/app/chat/MultiTabAssistantChat.js.map +1 -1
  36. package/dist/app/chat/agentkit-chat/action-widget.d.ts.map +1 -1
  37. package/dist/app/chat/agentkit-chat/action-widget.js +4 -1
  38. package/dist/app/chat/agentkit-chat/action-widget.js.map +1 -1
  39. package/dist/app/chat/agentkit-chat/rail.d.ts +1 -1
  40. package/dist/app/chat/agentkit-chat/rail.d.ts.map +1 -1
  41. package/dist/app/chat/agentkit-chat/rail.js +1 -1
  42. package/dist/app/chat/agentkit-chat/rail.js.map +1 -1
  43. package/dist/app/chat/chat/index.d.ts +2 -1
  44. package/dist/app/chat/chat/index.d.ts.map +1 -1
  45. package/dist/app/chat/chat/index.js +1 -1
  46. package/dist/app/chat/chat/index.js.map +1 -1
  47. package/dist/app/chat/chat/surface-types.d.ts +3 -0
  48. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  49. package/dist/app/chat/chat/surface-types.js.map +1 -1
  50. package/dist/app/chat/chat/tool-call-display.d.ts +5 -1
  51. package/dist/app/chat/chat/tool-call-display.d.ts.map +1 -1
  52. package/dist/app/chat/chat/tool-call-display.js +6 -4
  53. package/dist/app/chat/chat/tool-call-display.js.map +1 -1
  54. package/dist/app/chat/chat/tool-render-registry.d.ts +4 -0
  55. package/dist/app/chat/chat/tool-render-registry.d.ts.map +1 -1
  56. package/dist/app/chat/chat/tool-render-registry.js.map +1 -1
  57. package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts +3 -1
  58. package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts.map +1 -1
  59. package/dist/app/chat/chat/widgets/DataChartRenderer.js +116 -26
  60. package/dist/app/chat/chat/widgets/DataChartRenderer.js.map +1 -1
  61. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts +3 -1
  62. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts.map +1 -1
  63. package/dist/app/chat/chat/widgets/DataChartWidget.js +21 -2
  64. package/dist/app/chat/chat/widgets/DataChartWidget.js.map +1 -1
  65. package/dist/app/chat/chat/widgets/DataInsightsWidget.d.ts +3 -1
  66. package/dist/app/chat/chat/widgets/DataInsightsWidget.d.ts.map +1 -1
  67. package/dist/app/chat/chat/widgets/DataInsightsWidget.js +2 -2
  68. package/dist/app/chat/chat/widgets/DataInsightsWidget.js.map +1 -1
  69. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts +1 -1
  70. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts.map +1 -1
  71. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js +3 -1
  72. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js.map +1 -1
  73. package/dist/app/chat/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  74. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js +2 -2
  75. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js.map +1 -1
  76. package/dist/app/chat/chat-first/chat-history.d.ts +13 -2
  77. package/dist/app/chat/chat-first/chat-history.d.ts.map +1 -1
  78. package/dist/app/chat/chat-first/chat-history.js +24 -3
  79. package/dist/app/chat/chat-first/chat-history.js.map +1 -1
  80. package/dist/app/chat/conversation/AgentConversation.d.ts.map +1 -1
  81. package/dist/app/chat/conversation/AgentConversation.js +6 -1
  82. package/dist/app/chat/conversation/AgentConversation.js.map +1 -1
  83. package/dist/app/chat/ownership-history/ChatOwnerAvatar.d.ts +6 -0
  84. package/dist/app/chat/ownership-history/ChatOwnerAvatar.d.ts.map +1 -0
  85. package/dist/app/chat/ownership-history/ChatOwnerAvatar.js +9 -0
  86. package/dist/app/chat/ownership-history/ChatOwnerAvatar.js.map +1 -0
  87. package/dist/app/chat/ownership-history/index.d.ts +11 -0
  88. package/dist/app/chat/ownership-history/index.d.ts.map +1 -0
  89. package/dist/app/chat/ownership-history/index.js +22 -0
  90. package/dist/app/chat/ownership-history/index.js.map +1 -0
  91. package/dist/app/chat/ownership-history/rows.d.ts +27 -0
  92. package/dist/app/chat/ownership-history/rows.d.ts.map +1 -0
  93. package/dist/app/chat/ownership-history/rows.js +101 -0
  94. package/dist/app/chat/ownership-history/rows.js.map +1 -0
  95. package/dist/app/chat/ownership-history/useOwnershipChatHistory.d.ts +52 -0
  96. package/dist/app/chat/ownership-history/useOwnershipChatHistory.d.ts.map +1 -0
  97. package/dist/app/chat/ownership-history/useOwnershipChatHistory.js +497 -0
  98. package/dist/app/chat/ownership-history/useOwnershipChatHistory.js.map +1 -0
  99. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  100. package/dist/app/i18n/catalogs/ar-SA.js +3 -0
  101. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  102. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  103. package/dist/app/i18n/catalogs/de-DE.js +3 -0
  104. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  105. package/dist/app/i18n/catalogs/en-US.d.ts +3 -0
  106. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  107. package/dist/app/i18n/catalogs/en-US.js +3 -0
  108. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  109. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  110. package/dist/app/i18n/catalogs/es-ES.js +3 -0
  111. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  112. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  113. package/dist/app/i18n/catalogs/fr-FR.js +3 -0
  114. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  115. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  116. package/dist/app/i18n/catalogs/hi-IN.js +3 -0
  117. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  118. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  119. package/dist/app/i18n/catalogs/ja-JP.js +3 -0
  120. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  121. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  122. package/dist/app/i18n/catalogs/ko-KR.js +3 -0
  123. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  124. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  125. package/dist/app/i18n/catalogs/pt-BR.js +3 -0
  126. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  127. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  128. package/dist/app/i18n/catalogs/zh-CN.js +3 -0
  129. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  130. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  131. package/dist/app/i18n/catalogs/zh-TW.js +3 -0
  132. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  133. package/dist/app/shared/CommandMenu.d.ts +2 -0
  134. package/dist/app/shared/CommandMenu.d.ts.map +1 -1
  135. package/dist/app/shared/CommandMenu.js +11 -6
  136. package/dist/app/shared/CommandMenu.js.map +1 -1
  137. package/dist/app/sharing/ShareButton.d.ts.map +1 -1
  138. package/dist/app/sharing/ShareButton.js +9 -8
  139. package/dist/app/sharing/ShareButton.js.map +1 -1
  140. package/dist/chat-history/ChatHistoryList.d.ts +16 -3
  141. package/dist/chat-history/ChatHistoryList.d.ts.map +1 -1
  142. package/dist/chat-history/ChatHistoryList.js +25 -15
  143. package/dist/chat-history/ChatHistoryList.js.map +1 -1
  144. package/dist/chat-history.css +109 -9
  145. package/dist/composer/TiptapComposer.js +1 -1
  146. package/dist/composer/TiptapComposer.js.map +1 -1
  147. package/package.json +10 -3
  148. package/src/app/agent-page/AgentContextTab.spec.ts +50 -2
  149. package/src/app/agent-page/AgentContextTab.tsx +1 -0
  150. package/src/app/agentkit/react/components.interaction.spec.tsx +2 -0
  151. package/src/app/agentkit/react/components.spec.tsx +11 -6
  152. package/src/app/agentkit/react/components.tsx +3 -0
  153. package/src/app/agentkit/react/context.tsx +6 -0
  154. package/src/app/agentkit/react/data-chart-layout.ts +25 -0
  155. package/src/app/agentkit/react/index.ts +1 -0
  156. package/src/app/agentkit/react/root.tsx +4 -0
  157. package/src/app/agentkit/react/styles.css +31 -6
  158. package/src/app/agentkit/react/transcript-layout.ts +2 -0
  159. package/src/app/chat/AgentKitAssistantChat.spec.tsx +201 -27
  160. package/src/app/chat/AgentKitAssistantChat.tsx +3 -0
  161. package/src/app/chat/AgentPanel.tsx +8 -8
  162. package/src/app/chat/MultiTabAssistantChat.spec.tsx +270 -3
  163. package/src/app/chat/MultiTabAssistantChat.tsx +81 -158
  164. package/src/app/chat/agentkit-chat/action-widget.spec.tsx +62 -0
  165. package/src/app/chat/agentkit-chat/action-widget.tsx +4 -0
  166. package/src/app/chat/agentkit-chat/rail.ts +11 -0
  167. package/src/app/chat/chat/index.ts +10 -0
  168. package/src/app/chat/chat/surface-types.ts +3 -0
  169. package/src/app/chat/chat/tool-call-display.spec.tsx +29 -0
  170. package/src/app/chat/chat/tool-call-display.tsx +17 -1
  171. package/src/app/chat/chat/tool-render-registry.tsx +5 -0
  172. package/src/app/chat/chat/widgets/DataChartRenderer.spec.tsx +377 -17
  173. package/src/app/chat/chat/widgets/DataChartRenderer.tsx +232 -63
  174. package/src/app/chat/chat/widgets/DataChartWidget.spec.tsx +67 -0
  175. package/src/app/chat/chat/widgets/DataChartWidget.tsx +39 -5
  176. package/src/app/chat/chat/widgets/DataInsightsWidget.tsx +13 -2
  177. package/src/app/chat/chat/widgets/DataWidgetDisplayControls.tsx +6 -4
  178. package/src/app/chat/chat/widgets/builtin-tool-renderers.tsx +5 -1
  179. package/src/app/chat/chat-first/chat-history.spec.tsx +79 -0
  180. package/src/app/chat/chat-first/chat-history.tsx +75 -22
  181. package/src/app/chat/conversation/AgentConversation.spec.tsx +51 -1
  182. package/src/app/chat/conversation/AgentConversation.tsx +11 -2
  183. package/src/app/chat/ownership-history/ChatOwnerAvatar.tsx +27 -0
  184. package/src/app/chat/ownership-history/index.tsx +67 -0
  185. package/src/app/chat/ownership-history/ownership-history.spec.tsx +3146 -0
  186. package/src/app/chat/ownership-history/rows.ts +156 -0
  187. package/src/app/chat/ownership-history/useOwnershipChatHistory.ts +709 -0
  188. package/src/app/i18n/catalogs/ar-SA.ts +3 -0
  189. package/src/app/i18n/catalogs/de-DE.ts +3 -0
  190. package/src/app/i18n/catalogs/en-US.ts +3 -0
  191. package/src/app/i18n/catalogs/es-ES.ts +3 -0
  192. package/src/app/i18n/catalogs/fr-FR.ts +3 -0
  193. package/src/app/i18n/catalogs/hi-IN.ts +3 -0
  194. package/src/app/i18n/catalogs/ja-JP.ts +3 -0
  195. package/src/app/i18n/catalogs/ko-KR.ts +3 -0
  196. package/src/app/i18n/catalogs/pt-BR.ts +3 -0
  197. package/src/app/i18n/catalogs/zh-CN.ts +3 -0
  198. package/src/app/i18n/catalogs/zh-TW.ts +3 -0
  199. package/src/app/shared/CommandMenu.spec.tsx +175 -6
  200. package/src/app/shared/CommandMenu.tsx +24 -7
  201. package/src/app/sharing/ShareButton.tsx +12 -10
  202. package/src/chat-history/ChatHistoryList.spec.tsx +51 -0
  203. package/src/chat-history/ChatHistoryList.tsx +87 -26
  204. package/src/chat-history/ChatHistoryRailSections.spec.tsx +12 -4
  205. package/src/chat-history.css +109 -9
  206. package/src/composer/TiptapComposer.tsx +1 -1
@@ -10,6 +10,7 @@ import {
10
10
  } from "@agent-native/agentkit/protocol";
11
11
  import type {
12
12
  AgentInteraction,
13
+ AgentToolCall,
13
14
  FilePart,
14
15
  AgentMessage,
15
16
  AgentTransport,
@@ -24,6 +25,10 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
24
25
  import { AgentSuggestionBar } from "../../composer/AgentSuggestionBar.js";
25
26
  import { AgentInteractionItem } from "../agentkit/react/components.js";
26
27
  import { AgentKitProvider } from "../agentkit/react/context.js";
28
+ import {
29
+ clearToolRenderersForTests,
30
+ registerToolRenderer,
31
+ } from "./chat/tool-render-registry.js";
27
32
 
28
33
  function largePngBytes(
29
34
  width = 2560,
@@ -106,6 +111,7 @@ const chatMocks = vi.hoisted(() => ({
106
111
  runtimeOptions: null as any,
107
112
  inBuilder: false,
108
113
  useRealRoot: false,
114
+ renderRealToolCalls: false,
109
115
  realComposerController: null as AgentKitClient | null,
110
116
  useRealChat: false,
111
117
  routeControllerPersistenceThroughTransport: false,
@@ -675,29 +681,33 @@ vi.mock("@agent-native/core/client/agent-chat", async (importOriginal) => {
675
681
  };
676
682
  });
677
683
 
678
- vi.mock("./chat/run-recovery.js", async (importOriginal) => ({
679
- isMissingLlmProviderRunError: (
680
- await importOriginal<typeof import("./chat/run-recovery.js")>()
681
- ).isMissingLlmProviderRunError,
682
- RunErrorRecoveryCard: (props: unknown) => {
683
- chatMocks.failureProps = props;
684
- chatMocks.failurePropsHistory.push(props);
685
- return React.createElement("div", {
686
- "data-testid": "run-error-recovery-card",
687
- });
688
- },
689
- BuilderSetupCard: (props: unknown) => {
690
- chatMocks.setupCardProps = props;
691
- chatMocks.setupCardPropsHistory.push(props);
692
- return React.createElement("div", { "data-testid": "builder-setup-card" });
693
- },
694
- LoopLimitContinueCard: (props: unknown) => {
695
- chatMocks.loopLimitProps = props;
696
- return null;
697
- },
698
- PlanModeCallout: () => null,
699
- getRequestModeMetadata: () => undefined,
700
- }));
684
+ vi.mock("./chat/run-recovery.js", async (importOriginal) => {
685
+ const actual =
686
+ await importOriginal<typeof import("./chat/run-recovery.js")>();
687
+ return {
688
+ ...actual,
689
+ RunErrorRecoveryCard: (props: unknown) => {
690
+ chatMocks.failureProps = props;
691
+ chatMocks.failurePropsHistory.push(props);
692
+ return React.createElement("div", {
693
+ "data-testid": "run-error-recovery-card",
694
+ });
695
+ },
696
+ BuilderSetupCard: (props: unknown) => {
697
+ chatMocks.setupCardProps = props;
698
+ chatMocks.setupCardPropsHistory.push(props);
699
+ return React.createElement("div", {
700
+ "data-testid": "builder-setup-card",
701
+ });
702
+ },
703
+ LoopLimitContinueCard: (props: unknown) => {
704
+ chatMocks.loopLimitProps = props;
705
+ return null;
706
+ },
707
+ PlanModeCallout: () => null,
708
+ getRequestModeMetadata: () => undefined,
709
+ };
710
+ });
701
711
 
702
712
  vi.mock("./FileStorageSetupPopover.js", async () => {
703
713
  const React = await import("react");
@@ -771,12 +781,17 @@ vi.mock("@agent-native/core/client/use-session", () => ({
771
781
  useSession: () => ({ session: chatMocks.session, status: "authenticated" }),
772
782
  }));
773
783
 
774
- vi.mock("./chat/tool-call-display.js", async () => {
784
+ vi.mock("./chat/tool-call-display.js", async (importOriginal) => {
775
785
  const React = await import("react");
786
+ const actual =
787
+ await importOriginal<typeof import("./chat/tool-call-display.js")>();
776
788
  return {
777
- ChatRunningContext: React.createContext(false),
778
- SuppressInlineOpenAppContext: React.createContext(false),
779
- ToolCallDisplay: () => null,
789
+ ChatRunningContext: actual.ChatRunningContext,
790
+ SuppressInlineOpenAppContext: actual.SuppressInlineOpenAppContext,
791
+ ToolCallDisplay: (props: any) =>
792
+ chatMocks.renderRealToolCalls
793
+ ? React.createElement(actual.ToolCallDisplay, props)
794
+ : null,
780
795
  AgentApprovalCard: (props: any) => {
781
796
  chatMocks.approvalCardProps = props;
782
797
  return React.createElement(
@@ -1000,6 +1015,7 @@ beforeEach(() => {
1000
1015
  chatMocks.transportOptions = null;
1001
1016
  chatMocks.inBuilder = false;
1002
1017
  chatMocks.useRealRoot = false;
1018
+ chatMocks.renderRealToolCalls = false;
1003
1019
  chatMocks.realComposerController = null;
1004
1020
  chatMocks.useRealChat = false;
1005
1021
  chatMocks.routeControllerPersistenceThroughTransport = false;
@@ -1035,6 +1051,7 @@ afterEach(async () => {
1035
1051
  await unmount();
1036
1052
  chatMocks.realComposerController?.dispose();
1037
1053
  window.sessionStorage.clear();
1054
+ clearToolRenderersForTests();
1038
1055
  });
1039
1056
 
1040
1057
  describe("AgentKitAssistantChat host behavior", () => {
@@ -1331,6 +1348,161 @@ describe("AgentKitAssistantChat host behavior", () => {
1331
1348
  expect(chatMocks.rootProps.slots.widget).toBe(AgentKitActionWidget);
1332
1349
  });
1333
1350
 
1351
+ it("shows failed tools through the shared fallback without an app renderer", async () => {
1352
+ const at = "2026-09-28T00:00:00.000Z";
1353
+ const failedTool: AgentToolCall = {
1354
+ id: "query-1",
1355
+ name: "query-analytics",
1356
+ input: {},
1357
+ output: "Query execution failed.",
1358
+ error: { code: "query_failed", message: "Query execution failed." },
1359
+ status: "failed",
1360
+ runId: "run-1",
1361
+ messageId: "assistant-1",
1362
+ metadata: { chatUI: { renderer: "analytics.query-result.v1" } },
1363
+ };
1364
+ chatMocks.useRealChat = true;
1365
+ chatMocks.useRealRoot = true;
1366
+ chatMocks.renderRealToolCalls = true;
1367
+ chatMocks.thread.messages = [
1368
+ {
1369
+ id: "assistant-1",
1370
+ role: "assistant",
1371
+ status: "complete",
1372
+ parts: [{ type: "text", text: "The query could not be completed." }],
1373
+ },
1374
+ ];
1375
+ chatMocks.thread.tools = { [failedTool.id]: failedTool };
1376
+ chatMocks.thread.runs = {
1377
+ "run-1": { id: "run-1", status: "failed", lastSequence: 3 },
1378
+ };
1379
+ chatMocks.thread.events = [
1380
+ {
1381
+ id: "tool-started",
1382
+ threadId: chatMocks.threadId,
1383
+ runId: "run-1",
1384
+ sequence: 1,
1385
+ occurredAt: at,
1386
+ type: "tool.started",
1387
+ toolCall: { ...failedTool, status: "running" },
1388
+ },
1389
+ {
1390
+ id: "tool-failed",
1391
+ threadId: chatMocks.threadId,
1392
+ runId: "run-1",
1393
+ sequence: 2,
1394
+ occurredAt: at,
1395
+ type: "tool.updated",
1396
+ toolCall: failedTool,
1397
+ },
1398
+ {
1399
+ id: "run-failed",
1400
+ threadId: chatMocks.threadId,
1401
+ runId: "run-1",
1402
+ sequence: 3,
1403
+ occurredAt: at,
1404
+ type: "run.failed",
1405
+ error: { code: "query_failed", message: "Query execution failed." },
1406
+ },
1407
+ ];
1408
+
1409
+ await useRealComposer();
1410
+ await mount(baseProps({ isNewThread: false }));
1411
+
1412
+ const toolRow = container.querySelector<HTMLButtonElement>(
1413
+ "button[aria-expanded]",
1414
+ );
1415
+ expect(toolRow?.textContent).toContain("query analytics");
1416
+ expect(toolRow?.getAttribute("aria-expanded")).toBe("false");
1417
+ expect(container.textContent).not.toContain("Query execution failed.");
1418
+
1419
+ await act(async () => {
1420
+ toolRow?.click();
1421
+ });
1422
+
1423
+ expect(toolRow?.getAttribute("aria-expanded")).toBe("true");
1424
+ expect(container.textContent).toContain("Query execution failed.");
1425
+ });
1426
+
1427
+ it.each(["completed", "cancelled"] as const)(
1428
+ "passes %s status to custom renderers in the regular transcript",
1429
+ async (status) => {
1430
+ const at = "2026-09-28T00:00:00.000Z";
1431
+ const tool: AgentToolCall = {
1432
+ id: "status-tool-1",
1433
+ name: "example-status-tool",
1434
+ input: {},
1435
+ output: "Finished.",
1436
+ status,
1437
+ runId: "status-run-1",
1438
+ messageId: "status-assistant-1",
1439
+ };
1440
+ registerToolRenderer({
1441
+ id: "example-status-renderer",
1442
+ match: "example-status-tool",
1443
+ Component: ({ context }) => (
1444
+ <div data-testid="custom-tool-status" data-status={context.status} />
1445
+ ),
1446
+ });
1447
+ chatMocks.useRealChat = true;
1448
+ chatMocks.useRealRoot = true;
1449
+ chatMocks.renderRealToolCalls = true;
1450
+ chatMocks.thread.messages = [
1451
+ {
1452
+ id: "status-assistant-1",
1453
+ role: "assistant",
1454
+ status: "complete",
1455
+ parts: [{ type: "text", text: "The tool finished." }],
1456
+ },
1457
+ ];
1458
+ chatMocks.thread.tools = { [tool.id]: tool };
1459
+ chatMocks.thread.runs = {
1460
+ "status-run-1": {
1461
+ id: "status-run-1",
1462
+ status,
1463
+ lastSequence: 3,
1464
+ },
1465
+ };
1466
+ chatMocks.thread.events = [
1467
+ {
1468
+ id: "status-tool-started",
1469
+ threadId: chatMocks.threadId,
1470
+ runId: "status-run-1",
1471
+ sequence: 1,
1472
+ occurredAt: at,
1473
+ type: "tool.started",
1474
+ toolCall: { ...tool, status: "running" },
1475
+ },
1476
+ {
1477
+ id: "status-tool-updated",
1478
+ threadId: chatMocks.threadId,
1479
+ runId: "status-run-1",
1480
+ sequence: 2,
1481
+ occurredAt: at,
1482
+ type: "tool.updated",
1483
+ toolCall: tool,
1484
+ },
1485
+ {
1486
+ id: "status-run-ended",
1487
+ threadId: chatMocks.threadId,
1488
+ runId: "status-run-1",
1489
+ sequence: 3,
1490
+ occurredAt: at,
1491
+ type: status === "completed" ? "run.completed" : "run.cancelled",
1492
+ },
1493
+ ];
1494
+
1495
+ await useRealComposer();
1496
+ await mount(baseProps({ isNewThread: false }));
1497
+
1498
+ expect(
1499
+ container
1500
+ .querySelector('[data-testid="custom-tool-status"]')
1501
+ ?.getAttribute("data-status"),
1502
+ ).toBe(status);
1503
+ },
1504
+ );
1505
+
1334
1506
  it("checks readiness on the configured chat API server", async () => {
1335
1507
  await mount(
1336
1508
  baseProps({
@@ -1863,12 +2035,14 @@ describe("AgentKitAssistantChat host behavior", () => {
1863
2035
  createdAt: at,
1864
2036
  updatedAt: at,
1865
2037
  messages: chatMocks.thread.messages,
2038
+ events: chatMocks.thread.events,
1866
2039
  runs: Object.values(chatMocks.thread.runs).map((run) => ({
1867
2040
  ...run,
1868
2041
  threadId,
1869
2042
  startedAt: at,
1870
2043
  completedAt: at,
1871
2044
  })),
2045
+ toolCalls: Object.values(chatMocks.thread.tools),
1872
2046
  suggestions: chatMocks.thread.suggestions,
1873
2047
  }),
1874
2048
  startRun,
@@ -2108,6 +2108,7 @@ export const AgentKitAssistantChat = forwardRef<
2108
2108
  loadRunUsage={loadRunUsage}
2109
2109
  buildFeedbackReport={formatFeedbackReport}
2110
2110
  workedForRowLayout={props.workedForRowLayout}
2111
+ dataChartLayout={props.dataChartLayout}
2111
2112
  formatWorkedForDuration={props.formatWorkedForDuration}
2112
2113
  onThreadForked={(thread) => props.onForkedThread?.(thread.id)}
2113
2114
  onCopyMessage={({ text }) => {
@@ -6466,6 +6467,7 @@ function AgentKitTool({ value, active }: AgentKitRenderProps<AgentToolCall>) {
6466
6467
  args={input}
6467
6468
  argsText={JSON.stringify(input)}
6468
6469
  result={output}
6470
+ status={value.status}
6469
6471
  isError={value.status === "failed"}
6470
6472
  isRunning={value.status === "running"}
6471
6473
  structuredMeta={metadata}
@@ -6474,6 +6476,7 @@ function AgentKitTool({ value, active }: AgentKitRenderProps<AgentToolCall>) {
6474
6476
  activity={metadata.activity === true}
6475
6477
  isActiveTail={active === true}
6476
6478
  workedForRowLayout={surface.props.workedForRowLayout}
6479
+ dataChartLayout={surface.props.dataChartLayout}
6477
6480
  formatWorkedForDuration={surface.props.formatWorkedForDuration}
6478
6481
  />
6479
6482
  </SuppressInlineOpenAppContext.Provider>
@@ -1965,7 +1965,7 @@ function AgentPanelInner({
1965
1965
  return (
1966
1966
  <div
1967
1967
  key={tab.id}
1968
- className="agent-tab-group relative flex shrink-0 items-center"
1968
+ className="agent-tab-group relative flex min-w-[56px] max-w-[150px] shrink items-center"
1969
1969
  >
1970
1970
  <div
1971
1971
  role="tab"
@@ -1981,7 +1981,7 @@ function AgentPanelInner({
1981
1981
  switchMode("chat");
1982
1982
  })}
1983
1983
  className={cn(
1984
- "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer min-w-[56px] max-w-[150px]",
1984
+ "agent-tab relative flex w-full min-w-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer",
1985
1985
  isActive
1986
1986
  ? "bg-accent text-foreground"
1987
1987
  : "text-muted-foreground hover:bg-accent hover:text-foreground",
@@ -2104,7 +2104,7 @@ function AgentPanelInner({
2104
2104
  return (
2105
2105
  <div
2106
2106
  key={tab.id}
2107
- className="agent-tab-group relative shrink-0"
2107
+ className="agent-tab-group relative min-w-[56px] max-w-[150px] shrink"
2108
2108
  >
2109
2109
  <div
2110
2110
  role="button"
@@ -2115,7 +2115,7 @@ function AgentPanelInner({
2115
2115
  setActiveTabId(tab.id),
2116
2116
  )}
2117
2117
  className={cn(
2118
- "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer min-w-[56px] max-w-[150px]",
2118
+ "agent-tab relative flex w-full min-w-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer",
2119
2119
  isActive
2120
2120
  ? "bg-accent text-foreground"
2121
2121
  : "text-muted-foreground hover:bg-accent hover:text-foreground",
@@ -2208,7 +2208,7 @@ function AgentPanelInner({
2208
2208
  return (
2209
2209
  <div
2210
2210
  key={tab.id}
2211
- className="agent-tab-group relative shrink-0"
2211
+ className="agent-tab-group relative min-w-[56px] max-w-[150px] shrink"
2212
2212
  >
2213
2213
  <div
2214
2214
  role="button"
@@ -2219,7 +2219,7 @@ function AgentPanelInner({
2219
2219
  setActiveTabId(tab.id),
2220
2220
  )}
2221
2221
  className={cn(
2222
- "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer min-w-[56px] max-w-[150px]",
2222
+ "agent-tab relative flex w-full min-w-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer",
2223
2223
  isActive
2224
2224
  ? "bg-accent text-foreground"
2225
2225
  : "text-muted-foreground hover:bg-accent hover:text-foreground",
@@ -2338,7 +2338,7 @@ function AgentPanelInner({
2338
2338
  {childTabs.map((tab) => (
2339
2339
  <div
2340
2340
  key={tab.id}
2341
- className="agent-tab-group relative shrink-0"
2341
+ className="agent-tab-group relative min-w-[48px] max-w-[140px] shrink"
2342
2342
  >
2343
2343
  <div
2344
2344
  role="button"
@@ -2353,7 +2353,7 @@ function AgentPanelInner({
2353
2353
  setActiveTabId(tab.id),
2354
2354
  )}
2355
2355
  className={cn(
2356
- "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer min-w-[48px] max-w-[140px]",
2356
+ "agent-tab relative flex w-full min-w-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer",
2357
2357
  tab.id === activeTabId
2358
2358
  ? "bg-accent text-foreground"
2359
2359
  : "text-muted-foreground hover:bg-accent hover:text-foreground",