@agent-native/toolkit 0.213.1 → 0.216.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 (222) hide show
  1. package/agent-native.eject.json +9 -0
  2. package/dist/app/agentkit/react/chat.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/chat.js +2 -2
  4. package/dist/app/agentkit/react/chat.js.map +1 -1
  5. package/dist/app/agentkit/react/components.d.ts +4 -1
  6. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  7. package/dist/app/agentkit/react/components.js +73 -13
  8. package/dist/app/agentkit/react/components.js.map +1 -1
  9. package/dist/app/agentkit/react/context.d.ts +19 -1
  10. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  11. package/dist/app/agentkit/react/context.js +7 -1
  12. package/dist/app/agentkit/react/context.js.map +1 -1
  13. package/dist/app/agentkit/react/index.d.ts +2 -0
  14. package/dist/app/agentkit/react/index.d.ts.map +1 -1
  15. package/dist/app/agentkit/react/index.js +2 -0
  16. package/dist/app/agentkit/react/index.js.map +1 -1
  17. package/dist/app/agentkit/react/message-content-order.d.ts +21 -0
  18. package/dist/app/agentkit/react/message-content-order.d.ts.map +1 -0
  19. package/dist/app/agentkit/react/message-content-order.js +173 -0
  20. package/dist/app/agentkit/react/message-content-order.js.map +1 -0
  21. package/dist/app/agentkit/react/root.d.ts +6 -1
  22. package/dist/app/agentkit/react/root.d.ts.map +1 -1
  23. package/dist/app/agentkit/react/root.js +2 -2
  24. package/dist/app/agentkit/react/root.js.map +1 -1
  25. package/dist/app/agentkit/react/styles.css +45 -8
  26. package/dist/app/agentkit/react/transcript-layout.d.ts +51 -0
  27. package/dist/app/agentkit/react/transcript-layout.d.ts.map +1 -0
  28. package/dist/app/agentkit/react/transcript-layout.js +34 -0
  29. package/dist/app/agentkit/react/transcript-layout.js.map +1 -0
  30. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  31. package/dist/app/chat/AgentKitAssistantChat.js +9 -4
  32. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  33. package/dist/app/chat/AgentPanel.d.ts +16 -2
  34. package/dist/app/chat/AgentPanel.d.ts.map +1 -1
  35. package/dist/app/chat/AgentPanel.js +26 -5
  36. package/dist/app/chat/AgentPanel.js.map +1 -1
  37. package/dist/app/chat/chat/index.d.ts +2 -0
  38. package/dist/app/chat/chat/index.d.ts.map +1 -1
  39. package/dist/app/chat/chat/index.js.map +1 -1
  40. package/dist/app/chat/chat/surface-types.d.ts +15 -0
  41. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  42. package/dist/app/chat/chat/surface-types.js.map +1 -1
  43. package/dist/app/chat/chat/tool-call-display.d.ts +7 -2
  44. package/dist/app/chat/chat/tool-call-display.d.ts.map +1 -1
  45. package/dist/app/chat/chat/tool-call-display.js +10 -9
  46. package/dist/app/chat/chat/tool-call-display.js.map +1 -1
  47. package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts.map +1 -1
  48. package/dist/app/chat/chat/widgets/DataChartRenderer.js +300 -33
  49. package/dist/app/chat/chat/widgets/DataChartRenderer.js.map +1 -1
  50. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts +3 -2
  51. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts.map +1 -1
  52. package/dist/app/chat/chat/widgets/DataChartWidget.js +18 -9
  53. package/dist/app/chat/chat/widgets/DataChartWidget.js.map +1 -1
  54. package/dist/app/chat/chat/widgets/DataInsightsWidget.js +1 -1
  55. package/dist/app/chat/chat/widgets/DataInsightsWidget.js.map +1 -1
  56. package/dist/app/chat/chat/widgets/DataTableWidget.d.ts +3 -2
  57. package/dist/app/chat/chat/widgets/DataTableWidget.d.ts.map +1 -1
  58. package/dist/app/chat/chat/widgets/DataTableWidget.js +10 -66
  59. package/dist/app/chat/chat/widgets/DataTableWidget.js.map +1 -1
  60. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts +11 -0
  61. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts.map +1 -0
  62. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js +133 -0
  63. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js.map +1 -0
  64. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js +2 -2
  65. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js.map +1 -1
  66. package/dist/app/chat/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  67. package/dist/app/chat/mcp-apps/McpAppRenderer.js +6 -5
  68. package/dist/app/chat/mcp-apps/McpAppRenderer.js.map +1 -1
  69. package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts +2 -0
  70. package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts.map +1 -0
  71. package/dist/app/chat/mcp-apps/mcp-app-theme.js +11 -0
  72. package/dist/app/chat/mcp-apps/mcp-app-theme.js.map +1 -0
  73. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  74. package/dist/app/i18n/catalogs/ar-SA.js +9 -0
  75. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  76. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  77. package/dist/app/i18n/catalogs/de-DE.js +9 -0
  78. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  79. package/dist/app/i18n/catalogs/en-US.d.ts +9 -0
  80. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  81. package/dist/app/i18n/catalogs/en-US.js +9 -0
  82. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  83. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  84. package/dist/app/i18n/catalogs/es-ES.js +9 -0
  85. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  86. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  87. package/dist/app/i18n/catalogs/fr-FR.js +9 -0
  88. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  89. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  90. package/dist/app/i18n/catalogs/hi-IN.js +9 -0
  91. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  92. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  93. package/dist/app/i18n/catalogs/ja-JP.js +9 -0
  94. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  95. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  96. package/dist/app/i18n/catalogs/ko-KR.js +9 -0
  97. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  98. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  99. package/dist/app/i18n/catalogs/pt-BR.js +9 -0
  100. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  101. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  102. package/dist/app/i18n/catalogs/zh-CN.js +9 -0
  103. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  104. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  105. package/dist/app/i18n/catalogs/zh-TW.js +9 -0
  106. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  107. package/dist/app/providers/AppProviders.d.ts +2 -1
  108. package/dist/app/providers/AppProviders.d.ts.map +1 -1
  109. package/dist/app/providers/AppProviders.js +4 -3
  110. package/dist/app/providers/AppProviders.js.map +1 -1
  111. package/dist/app/providers/ThemeFamilySync.d.ts +2 -0
  112. package/dist/app/providers/ThemeFamilySync.d.ts.map +1 -0
  113. package/dist/app/providers/ThemeFamilySync.js +6 -0
  114. package/dist/app/providers/ThemeFamilySync.js.map +1 -0
  115. package/dist/app/settings/account/PreferencesSettings.d.ts.map +1 -1
  116. package/dist/app/settings/account/PreferencesSettings.js +2 -1
  117. package/dist/app/settings/account/PreferencesSettings.js.map +1 -1
  118. package/dist/app/settings/account/ThemeFamilySettings.d.ts +2 -0
  119. package/dist/app/settings/account/ThemeFamilySettings.d.ts.map +1 -0
  120. package/dist/app/settings/account/ThemeFamilySettings.js +31 -0
  121. package/dist/app/settings/account/ThemeFamilySettings.js.map +1 -0
  122. package/dist/app/settings/account/search-entries.d.ts.map +1 -1
  123. package/dist/app/settings/account/search-entries.js +6 -0
  124. package/dist/app/settings/account/search-entries.js.map +1 -1
  125. package/dist/app/shared/DefaultSpinner.d.ts.map +1 -1
  126. package/dist/app/shared/DefaultSpinner.js +4 -5
  127. package/dist/app/shared/DefaultSpinner.js.map +1 -1
  128. package/dist/app/shared/ErrorBoundary.d.ts +1 -0
  129. package/dist/app/shared/ErrorBoundary.d.ts.map +1 -1
  130. package/dist/app/shared/ErrorBoundary.js +27 -12
  131. package/dist/app/shared/ErrorBoundary.js.map +1 -1
  132. package/dist/app/shared/PoweredByBadge.d.ts.map +1 -1
  133. package/dist/app/shared/PoweredByBadge.js +8 -49
  134. package/dist/app/shared/PoweredByBadge.js.map +1 -1
  135. package/dist/app/styles/agent-conversation.css +0 -23
  136. package/dist/app/styles/agent-native.css +1 -1
  137. package/dist/app/styles/theme-families.css +66 -0
  138. package/dist/composer/ComposerContextBanner.d.ts +24 -0
  139. package/dist/composer/ComposerContextBanner.d.ts.map +1 -0
  140. package/dist/composer/ComposerContextBanner.js +9 -0
  141. package/dist/composer/ComposerContextBanner.js.map +1 -0
  142. package/dist/composer/ComposerModePicker.d.ts +26 -0
  143. package/dist/composer/ComposerModePicker.d.ts.map +1 -0
  144. package/dist/composer/ComposerModePicker.js +14 -0
  145. package/dist/composer/ComposerModePicker.js.map +1 -0
  146. package/dist/composer/index.d.ts +2 -0
  147. package/dist/composer/index.d.ts.map +1 -1
  148. package/dist/composer/index.js +2 -0
  149. package/dist/composer/index.js.map +1 -1
  150. package/dist/styles.css +1 -0
  151. package/package.json +3 -3
  152. package/src/app/agentkit/react/chat.tsx +2 -0
  153. package/src/app/agentkit/react/components.interaction.spec.tsx +107 -0
  154. package/src/app/agentkit/react/components.spec.tsx +40 -1
  155. package/src/app/agentkit/react/components.tsx +186 -31
  156. package/src/app/agentkit/react/context.tsx +29 -0
  157. package/src/app/agentkit/react/index.ts +2 -0
  158. package/src/app/agentkit/react/lifecycle.spec.tsx +289 -4
  159. package/src/app/agentkit/react/message-content-order.spec.ts +190 -0
  160. package/src/app/agentkit/react/message-content-order.ts +246 -0
  161. package/src/app/agentkit/react/root.tsx +11 -0
  162. package/src/app/agentkit/react/styles.css +45 -8
  163. package/src/app/agentkit/react/transcript-layout.spec.ts +72 -0
  164. package/src/app/agentkit/react/transcript-layout.ts +97 -0
  165. package/src/app/auth/AuthPage.attribution.spec.tsx +6 -0
  166. package/src/app/chat/AgentKitAssistantChat.spec.tsx +58 -0
  167. package/src/app/chat/AgentKitAssistantChat.tsx +15 -1
  168. package/src/app/chat/AgentPanel.header.spec.ts +72 -14
  169. package/src/app/chat/AgentPanel.page-header-share.spec.tsx +101 -0
  170. package/src/app/chat/AgentPanel.tsx +111 -55
  171. package/src/app/chat/chat/index.ts +2 -0
  172. package/src/app/chat/chat/surface-types.ts +18 -0
  173. package/src/app/chat/chat/tool-call-display.spec.tsx +83 -0
  174. package/src/app/chat/chat/tool-call-display.tsx +40 -8
  175. package/src/app/chat/chat/widgets/DataChartRenderer.spec.tsx +849 -0
  176. package/src/app/chat/chat/widgets/DataChartRenderer.tsx +567 -72
  177. package/src/app/chat/chat/widgets/DataChartWidget.spec.tsx +432 -0
  178. package/src/app/chat/chat/widgets/DataChartWidget.ssr.spec.tsx +25 -0
  179. package/src/app/chat/chat/widgets/DataChartWidget.tsx +58 -33
  180. package/src/app/chat/chat/widgets/DataInsightsWidget.tsx +2 -2
  181. package/src/app/chat/chat/widgets/DataTableWidget.spec.tsx +37 -3
  182. package/src/app/chat/chat/widgets/DataTableWidget.tsx +22 -86
  183. package/src/app/chat/chat/widgets/DataWidgetDisplayControls.tsx +321 -0
  184. package/src/app/chat/chat/widgets/builtin-tool-renderers.tsx +5 -5
  185. package/src/app/chat/mcp-apps/McpAppRenderer.tsx +10 -5
  186. package/src/app/chat/mcp-apps/mcp-app-theme.spec.ts +30 -0
  187. package/src/app/chat/mcp-apps/mcp-app-theme.ts +11 -0
  188. package/src/app/i18n/catalogs/ar-SA.ts +10 -0
  189. package/src/app/i18n/catalogs/de-DE.ts +11 -0
  190. package/src/app/i18n/catalogs/en-US.ts +11 -0
  191. package/src/app/i18n/catalogs/es-ES.ts +12 -0
  192. package/src/app/i18n/catalogs/fr-FR.ts +12 -0
  193. package/src/app/i18n/catalogs/hi-IN.ts +10 -0
  194. package/src/app/i18n/catalogs/ja-JP.ts +11 -0
  195. package/src/app/i18n/catalogs/ko-KR.ts +10 -0
  196. package/src/app/i18n/catalogs/pt-BR.ts +11 -0
  197. package/src/app/i18n/catalogs/zh-CN.ts +9 -0
  198. package/src/app/i18n/catalogs/zh-TW.ts +10 -0
  199. package/src/app/providers/AppProviders.spec.tsx +71 -0
  200. package/src/app/providers/AppProviders.tsx +10 -0
  201. package/src/app/providers/ThemeFamilySync.tsx +6 -0
  202. package/src/app/settings/account/PreferencesSettings.spec.tsx +13 -2
  203. package/src/app/settings/account/PreferencesSettings.tsx +8 -0
  204. package/src/app/settings/account/ThemeFamilySettings.tsx +61 -0
  205. package/src/app/settings/account/search-entries.ts +6 -0
  206. package/src/app/shared/DefaultSpinner.spec.tsx +14 -0
  207. package/src/app/shared/DefaultSpinner.tsx +4 -5
  208. package/src/app/shared/ErrorBoundary.spec.tsx +45 -2
  209. package/src/app/shared/ErrorBoundary.tsx +37 -12
  210. package/src/app/shared/PoweredByBadge.spec.tsx +16 -0
  211. package/src/app/shared/PoweredByBadge.tsx +8 -50
  212. package/src/app/styles/agent-conversation.css +0 -23
  213. package/src/app/styles/agent-native.css +1 -1
  214. package/src/app/styles/agent-native.spec.ts +18 -0
  215. package/src/app/styles/theme-families.css +66 -0
  216. package/src/app/styles/theme-families.spec.ts +29 -0
  217. package/src/composer/ComposerContextBanner.spec.tsx +100 -0
  218. package/src/composer/ComposerContextBanner.tsx +77 -0
  219. package/src/composer/ComposerModePicker.spec.tsx +101 -0
  220. package/src/composer/ComposerModePicker.tsx +98 -0
  221. package/src/composer/index.ts +9 -0
  222. package/src/styles.css +1 -0
@@ -40,6 +40,7 @@ import {
40
40
  import {
41
41
  createContext,
42
42
  Component,
43
+ Fragment,
43
44
  memo,
44
45
  useCallback,
45
46
  useContext,
@@ -49,6 +50,7 @@ import {
49
50
  useRef,
50
51
  useState,
51
52
  type ComponentType,
53
+ type CSSProperties,
52
54
  type ErrorInfo,
53
55
  type KeyboardEvent as ReactKeyboardEvent,
54
56
  type PointerEvent as ReactPointerEvent,
@@ -136,7 +138,13 @@ import {
136
138
  type AgentKitSuggestionsRenderProps,
137
139
  type AgentRunFailureRenderProps,
138
140
  } from "./context.js";
141
+ import { orderMessageContent } from "./message-content-order.js";
139
142
  import { AgentStreamingText } from "./streaming-text.js";
143
+ import {
144
+ workedForRowChevronStyle,
145
+ workedForRowSummaryStyle,
146
+ type AgentChatTranscriptLayout,
147
+ } from "./transcript-layout.js";
140
148
 
141
149
  // AgentKit React installs without @agent-native/core, so it repeats core's
142
150
  // replay markers. Its specs assert core's attribute names.
@@ -1464,7 +1472,8 @@ export function AgentActivityGroup({
1464
1472
  excludeAgentActivities?: boolean;
1465
1473
  isCurrentSegment?: boolean;
1466
1474
  }) {
1467
- const { threadId, slots, registry, labels } = useAgentKit();
1475
+ const { threadId, slots, registry, labels, formatWorkedForDuration } =
1476
+ useAgentKit();
1468
1477
  const thread = useAgentThread();
1469
1478
  const runEvents = runId
1470
1479
  ? thread.events.filter((event) => event.runId === runId)
@@ -1761,6 +1770,7 @@ export function AgentActivityGroup({
1761
1770
  }
1762
1771
  const hasExpandableActivity = displayGroups.length > 0;
1763
1772
  const formatDuration = (ms: number) =>
1773
+ formatWorkedForDuration?.(ms) ??
1764
1774
  formatAgentKitDuration(ms, {
1765
1775
  hour: labels.durationHourShort,
1766
1776
  minute: labels.durationMinuteShort,
@@ -1907,7 +1917,9 @@ function AgentWorkDisclosure({
1907
1917
  current?: ReactNode;
1908
1918
  children: ReactNode;
1909
1919
  }) {
1920
+ const { slots, workedForRowLayout } = useAgentKit();
1910
1921
  const [open, setOpen] = useState(false);
1922
+ const Summary = slots.workedForSummary;
1911
1923
  return (
1912
1924
  <details
1913
1925
  className="agentkit-activities"
@@ -1918,24 +1930,39 @@ function AgentWorkDisclosure({
1918
1930
  <summary
1919
1931
  className="agentkit-activities-summary"
1920
1932
  aria-disabled={!expandable}
1933
+ style={workedForRowSummaryStyle(workedForRowLayout)}
1921
1934
  onClick={(event) => {
1922
1935
  event.preventDefault();
1923
1936
  if (!expandable) return;
1924
1937
  setOpen((value) => !value);
1925
1938
  }}
1926
1939
  >
1927
- <span className="agentkit-activities-summary-content">
1928
- {label ? (
1929
- <span className="agentkit-activities-heading">
1930
- <span className="agentkit-activities-label">{label}</span>
1940
+ {Summary ? (
1941
+ <Summary
1942
+ label={label}
1943
+ running={running}
1944
+ expandable={expandable}
1945
+ open={open}
1946
+ current={current}
1947
+ layout={workedForRowLayout}
1948
+ />
1949
+ ) : (
1950
+ <>
1951
+ <IconChevronRight
1952
+ aria-hidden="true"
1953
+ className="agentkit-icon agentkit-summary-chevron"
1954
+ style={workedForRowChevronStyle(workedForRowLayout)}
1955
+ />
1956
+ <span className="agentkit-activities-summary-content">
1957
+ {label ? (
1958
+ <span className="agentkit-activities-heading">
1959
+ <span className="agentkit-activities-label">{label}</span>
1960
+ </span>
1961
+ ) : null}
1962
+ {current}
1931
1963
  </span>
1932
- ) : null}
1933
- {current}
1934
- </span>
1935
- <IconChevronRight
1936
- aria-hidden="true"
1937
- className="agentkit-icon agentkit-summary-chevron"
1938
- />
1964
+ </>
1965
+ )}
1939
1966
  </summary>
1940
1967
  {children}
1941
1968
  </details>
@@ -3783,11 +3810,15 @@ export function AgentMessageActions({
3783
3810
  );
3784
3811
  }
3785
3812
 
3813
+ const AgentKitPostWidgetTextContext =
3814
+ createContext<AgentChatTranscriptLayout["postWidgetText"]>(undefined);
3815
+
3786
3816
  export function AgentMessageView({
3787
3817
  value: message,
3788
3818
  threadId,
3789
3819
  }: AgentKitRenderProps<AgentMessage>) {
3790
- const { labels, slots } = useAgentKit();
3820
+ const { labels, slots, resolveMessageContentOrder } = useAgentKit();
3821
+ const postWidgetText = useContext(AgentKitPostWidgetTextContext);
3791
3822
  const thread = useAgentThread(threadId);
3792
3823
  const visibleMessage = stripAgentMessageContext(message);
3793
3824
  const Supplement = slots.messageSupplement;
@@ -3812,6 +3843,13 @@ export function AgentMessageView({
3812
3843
  thread.annotationMessageIds[annotation.id] === message.id &&
3813
3844
  !embeddedAnnotationIds.has(annotation.id),
3814
3845
  );
3846
+ const orderedContent = orderMessageContent(
3847
+ visibleMessage,
3848
+ visibleMessage.parts,
3849
+ attachedWidgets,
3850
+ thread.events,
3851
+ resolveMessageContentOrder,
3852
+ );
3815
3853
  if (
3816
3854
  !message.parts.length &&
3817
3855
  !attachedWidgets.length &&
@@ -3821,6 +3859,7 @@ export function AgentMessageView({
3821
3859
  <Supplement value={visibleMessage} threadId={threadId} />
3822
3860
  ) : null;
3823
3861
  }
3862
+ let hasSeenWidget = false;
3824
3863
  return (
3825
3864
  <article
3826
3865
  className="agentkit-message"
@@ -3830,23 +3869,39 @@ export function AgentMessageView({
3830
3869
  aria-busy={message.status === "streaming"}
3831
3870
  >
3832
3871
  <div className="agentkit-message-content">
3833
- {visibleMessage.parts.map((part, index) => (
3834
- <AgentMessagePartView
3835
- key={`${message.id}-${index}`}
3836
- value={part}
3837
- threadId={threadId}
3838
- active={message.status === "streaming"}
3839
- resetKey={`${threadId}:${message.id}:${index}`}
3840
- userMessage={message.role === "user"}
3841
- />
3842
- ))}
3843
- {attachedWidgets.map((widget) => (
3844
- <AgentMessagePartView
3845
- key={widget.id}
3846
- value={{ type: "widget", widget }}
3847
- threadId={threadId}
3848
- />
3849
- ))}
3872
+ {orderedContent.map((item, index) => {
3873
+ const isWidget =
3874
+ item.type === "widget" ||
3875
+ (item.type === "part" && item.part.type === "widget");
3876
+ const followsWidget =
3877
+ message.role === "assistant" &&
3878
+ postWidgetText !== undefined &&
3879
+ hasSeenWidget &&
3880
+ item.type === "part" &&
3881
+ item.part.type === "text";
3882
+ if (isWidget) hasSeenWidget = true;
3883
+ const content = (
3884
+ <AgentMessagePartView
3885
+ value={
3886
+ item.type === "widget"
3887
+ ? { type: "widget", widget: item.widget }
3888
+ : item.part
3889
+ }
3890
+ threadId={threadId}
3891
+ active={message.status === "streaming"}
3892
+ resetKey={`${threadId}:${message.id}:${index}`}
3893
+ userMessage={message.role === "user"}
3894
+ />
3895
+ );
3896
+
3897
+ return followsWidget ? (
3898
+ <div key={item.key} data-post-widget-text="true">
3899
+ {content}
3900
+ </div>
3901
+ ) : (
3902
+ <Fragment key={item.key}>{content}</Fragment>
3903
+ );
3904
+ })}
3850
3905
  {attachedAnnotations.length ? (
3851
3906
  <div className="agentkit-annotations">
3852
3907
  {attachedAnnotations.map((annotation) => (
@@ -4781,9 +4836,103 @@ export interface AgentKitChatProps {
4781
4836
  emptyComposerPlacement?: "center" | "bottom";
4782
4837
  /** Follow new output until the user deliberately scrolls away. */
4783
4838
  autoScroll?: boolean;
4839
+ /** Optional transcript geometry. Omitted values keep the shared defaults. */
4840
+ transcriptLayout?: AgentChatTranscriptLayout;
4784
4841
  className?: string;
4785
4842
  }
4786
4843
 
4844
+ type AgentKitTranscriptContentStyle = CSSProperties & {
4845
+ "--agentkit-transcript-top-inset"?: string;
4846
+ "--agentkit-transcript-lane-width"?: string;
4847
+ "--agentkit-transcript-lane-offset-inline"?: string;
4848
+ "--agentkit-transcript-message-gap"?: string;
4849
+ "--agentkit-transcript-message-line-height"?: string;
4850
+ "--agentkit-transcript-font-family"?: string;
4851
+ "--agentkit-transcript-post-widget-text-color"?: string;
4852
+ "--agentkit-transcript-post-widget-paragraph-padding-block"?: string;
4853
+ "--agentkit-user-bubble-line-height"?: string;
4854
+ "--agentkit-user-bubble-max-width"?: string;
4855
+ "--agentkit-user-bubble-offset-inline"?: string;
4856
+ "--agentkit-user-bubble-padding-block"?: string;
4857
+ "--agentkit-user-bubble-padding-inline"?: string;
4858
+ };
4859
+
4860
+ function transcriptLength(value: number | undefined, name: string) {
4861
+ if (value === undefined) return undefined;
4862
+ if (!Number.isFinite(value) || value < 0) {
4863
+ throw new RangeError(
4864
+ `transcriptLayout.${name} must be a non-negative number`,
4865
+ );
4866
+ }
4867
+ return `${value}px`;
4868
+ }
4869
+
4870
+ function transcriptOffset(value: number | undefined, name: string) {
4871
+ if (value === undefined) return undefined;
4872
+ if (!Number.isFinite(value)) {
4873
+ throw new RangeError(`transcriptLayout.${name} must be a finite number`);
4874
+ }
4875
+ return `${value}px`;
4876
+ }
4877
+
4878
+ function transcriptContentStyle(
4879
+ layout?: AgentChatTranscriptLayout,
4880
+ ): AgentKitTranscriptContentStyle | undefined {
4881
+ if (!layout) return undefined;
4882
+ return {
4883
+ "--agentkit-transcript-top-inset": transcriptLength(
4884
+ layout.topInset,
4885
+ "topInset",
4886
+ ),
4887
+ "--agentkit-transcript-lane-width": transcriptLength(
4888
+ layout.messageLaneWidth,
4889
+ "messageLaneWidth",
4890
+ ),
4891
+ "--agentkit-transcript-lane-offset-inline": transcriptOffset(
4892
+ layout.messageLaneOffsetInline,
4893
+ "messageLaneOffsetInline",
4894
+ ),
4895
+ "--agentkit-transcript-message-gap": transcriptLength(
4896
+ layout.messageGap,
4897
+ "messageGap",
4898
+ ),
4899
+ "--agentkit-transcript-message-line-height": transcriptLength(
4900
+ layout.messageLineHeight,
4901
+ "messageLineHeight",
4902
+ ),
4903
+ "--agentkit-transcript-font-family": layout.fontFamily,
4904
+ "--agentkit-transcript-post-widget-text-color":
4905
+ layout.postWidgetText?.tone === "muted"
4906
+ ? "var(--agentkit-text-muted)"
4907
+ : undefined,
4908
+ "--agentkit-transcript-post-widget-paragraph-padding-block":
4909
+ transcriptLength(
4910
+ layout.postWidgetText?.paragraphPaddingBlock,
4911
+ "postWidgetText.paragraphPaddingBlock",
4912
+ ),
4913
+ "--agentkit-user-bubble-line-height": transcriptLength(
4914
+ layout.userBubbleLineHeight,
4915
+ "userBubbleLineHeight",
4916
+ ),
4917
+ "--agentkit-user-bubble-max-width": transcriptLength(
4918
+ layout.userBubbleMaxWidth,
4919
+ "userBubbleMaxWidth",
4920
+ ),
4921
+ "--agentkit-user-bubble-offset-inline": transcriptOffset(
4922
+ layout.userBubbleOffsetInline,
4923
+ "userBubbleOffsetInline",
4924
+ ),
4925
+ "--agentkit-user-bubble-padding-block": transcriptLength(
4926
+ layout.userBubblePadding?.block,
4927
+ "userBubblePadding.block",
4928
+ ),
4929
+ "--agentkit-user-bubble-padding-inline": transcriptLength(
4930
+ layout.userBubblePadding?.inline,
4931
+ "userBubblePadding.inline",
4932
+ ),
4933
+ };
4934
+ }
4935
+
4787
4936
  const AGENTKIT_TRANSCRIPT_BOTTOM_THRESHOLD = 24;
4788
4937
  const AGENTKIT_TRANSCRIPT_SCROLLBAR_IDLE_MS = 900;
4789
4938
  const AGENTKIT_TRANSCRIPT_SCROLL_KEYS = new Set([
@@ -4813,6 +4962,7 @@ export function AgentKitChat({
4813
4962
  hasRenderedMessages = false,
4814
4963
  emptyComposerPlacement = "center",
4815
4964
  autoScroll = true,
4965
+ transcriptLayout,
4816
4966
  className,
4817
4967
  }: AgentKitChatProps) {
4818
4968
  const { threadId, slots, registry, labels, onThreadForked } = useAgentKit();
@@ -5563,12 +5713,17 @@ export function AgentKitChat({
5563
5713
  <div
5564
5714
  ref={transcriptContentRef}
5565
5715
  className="agentkit-transcript-content"
5716
+ style={transcriptContentStyle(transcriptLayout)}
5566
5717
  >
5567
5718
  <AgentKitRegionSlot slot={Transcript} threadId={threadId}>
5568
5719
  {!hasConversation && EmptyState ? (
5569
5720
  <EmptyState threadId={threadId} />
5570
5721
  ) : null}
5571
- {transcriptItems}
5722
+ <AgentKitPostWidgetTextContext.Provider
5723
+ value={transcriptLayout?.postWidgetText}
5724
+ >
5725
+ {transcriptItems}
5726
+ </AgentKitPostWidgetTextContext.Provider>
5572
5727
  {approvalEntries.map(([approvalId, request]) => (
5573
5728
  <AgentKitSurfaceBoundary
5574
5729
  key={`${threadId}:${approvalId}`}
@@ -43,6 +43,9 @@ import {
43
43
  type ReactNode,
44
44
  } from "react";
45
45
 
46
+ import type { AgentMessageContentOrderResolver } from "./message-content-order.js";
47
+ import type { AgentChatWorkedForRowLayout } from "./transcript-layout.js";
48
+
46
49
  export interface AgentKitRenderProps<T> {
47
50
  value: T;
48
51
  threadId: ThreadId;
@@ -79,6 +82,15 @@ export interface AgentKitSuggestionsRenderProps {
79
82
  onSelect: (suggestion: AgentSuggestion) => void;
80
83
  }
81
84
 
85
+ export interface AgentKitWorkedForSummaryRenderProps {
86
+ label: string;
87
+ running?: boolean;
88
+ expandable: boolean;
89
+ open: boolean;
90
+ current?: ReactNode;
91
+ layout?: AgentChatWorkedForRowLayout;
92
+ }
93
+
82
94
  export interface AgentConnectionErrorRenderProps {
83
95
  error: AgentError;
84
96
  threadId: ThreadId;
@@ -153,6 +165,8 @@ export interface AgentKitSlots {
153
165
  composer?: ComponentType<{ threadId: ThreadId }>;
154
166
  queue?: ComponentType<AgentKitQueueRenderProps>;
155
167
  suggestions?: ComponentType<AgentKitSuggestionsRenderProps>;
168
+ /** Replaces the visible work-summary row while the shared disclosure owns its semantics. */
169
+ workedForSummary?: ComponentType<AgentKitWorkedForSummaryRenderProps>;
156
170
  }
157
171
 
158
172
  export interface AgentKitToolSource {
@@ -482,6 +496,9 @@ export interface AgentKitProviderProps {
482
496
  ) => Promise<AgentConnectionResponse>;
483
497
  /** Receives full renderer failures while the UI shows a safe fallback. */
484
498
  onRenderError?: (failure: AgentKitRenderFailure) => void;
499
+ resolveMessageContentOrder?: AgentMessageContentOrderResolver;
500
+ workedForRowLayout?: AgentChatWorkedForRowLayout;
501
+ formatWorkedForDuration?: (durationMs: number) => string;
485
502
  onClientEffect?: (effect: {
486
503
  type: "client.effect" | "client.deeplink";
487
504
  name: string;
@@ -511,6 +528,9 @@ export interface AgentKitContextValue {
511
528
  loadRunUsage?: AgentKitRunUsageLoader;
512
529
  onConnectionRequest?: AgentKitProviderProps["onConnectionRequest"];
513
530
  onRenderError?: (failure: AgentKitRenderFailure) => void;
531
+ resolveMessageContentOrder?: AgentMessageContentOrderResolver;
532
+ workedForRowLayout?: AgentChatWorkedForRowLayout;
533
+ formatWorkedForDuration?: (durationMs: number) => string;
514
534
  registerComposerFocus: (threadId: ThreadId, focus: () => void) => () => void;
515
535
  requestComposerFocus: (threadId: ThreadId) => void;
516
536
  }
@@ -531,6 +551,9 @@ export function AgentKitProvider({
531
551
  loadRunUsage,
532
552
  onConnectionRequest,
533
553
  onRenderError,
554
+ resolveMessageContentOrder,
555
+ workedForRowLayout,
556
+ formatWorkedForDuration,
534
557
  onClientEffect,
535
558
  children,
536
559
  }: AgentKitProviderProps) {
@@ -597,6 +620,9 @@ export function AgentKitProvider({
597
620
  loadRunUsage,
598
621
  onConnectionRequest,
599
622
  onRenderError,
623
+ resolveMessageContentOrder,
624
+ workedForRowLayout,
625
+ formatWorkedForDuration,
600
626
  registerComposerFocus,
601
627
  requestComposerFocus,
602
628
  }),
@@ -614,6 +640,9 @@ export function AgentKitProvider({
614
640
  loadRunUsage,
615
641
  onConnectionRequest,
616
642
  onRenderError,
643
+ resolveMessageContentOrder,
644
+ workedForRowLayout,
645
+ formatWorkedForDuration,
617
646
  registerComposerFocus,
618
647
  requestComposerFocus,
619
648
  ],
@@ -1,5 +1,7 @@
1
1
  export * from "./chat.js";
2
2
  export * from "./components.js";
3
3
  export * from "./context.js";
4
+ export * from "./message-content-order.js";
4
5
  export * from "./root.js";
5
6
  export * from "./streaming-text.js";
7
+ export * from "./transcript-layout.js";