@agent-native/toolkit 0.212.1 → 0.214.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 (209) hide show
  1. package/agent-native.eject.json +9 -0
  2. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/components.js +10 -4
  4. package/dist/app/agentkit/react/components.js.map +1 -1
  5. package/dist/app/agentkit/react/context.d.ts +13 -1
  6. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  7. package/dist/app/agentkit/react/context.js +3 -1
  8. package/dist/app/agentkit/react/context.js.map +1 -1
  9. package/dist/app/agentkit/react/index.d.ts +1 -0
  10. package/dist/app/agentkit/react/index.d.ts.map +1 -1
  11. package/dist/app/agentkit/react/index.js +1 -0
  12. package/dist/app/agentkit/react/index.js.map +1 -1
  13. package/dist/app/agentkit/react/message-content-order.d.ts +21 -0
  14. package/dist/app/agentkit/react/message-content-order.d.ts.map +1 -0
  15. package/dist/app/agentkit/react/message-content-order.js +173 -0
  16. package/dist/app/agentkit/react/message-content-order.js.map +1 -0
  17. package/dist/app/agentkit/react/root.d.ts +3 -1
  18. package/dist/app/agentkit/react/root.d.ts.map +1 -1
  19. package/dist/app/agentkit/react/root.js +2 -2
  20. package/dist/app/agentkit/react/root.js.map +1 -1
  21. package/dist/app/agentkit/react/styles.css +2 -2
  22. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  23. package/dist/app/chat/AgentKitAssistantChat.js +7 -2
  24. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  25. package/dist/app/chat/AgentPanel.d.ts +14 -2
  26. package/dist/app/chat/AgentPanel.d.ts.map +1 -1
  27. package/dist/app/chat/AgentPanel.js +22 -5
  28. package/dist/app/chat/AgentPanel.js.map +1 -1
  29. package/dist/app/chat/chat/surface-types.d.ts +8 -0
  30. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  31. package/dist/app/chat/chat/surface-types.js.map +1 -1
  32. package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts.map +1 -1
  33. package/dist/app/chat/chat/widgets/DataChartRenderer.js +127 -30
  34. package/dist/app/chat/chat/widgets/DataChartRenderer.js.map +1 -1
  35. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts +3 -2
  36. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts.map +1 -1
  37. package/dist/app/chat/chat/widgets/DataChartWidget.js +14 -9
  38. package/dist/app/chat/chat/widgets/DataChartWidget.js.map +1 -1
  39. package/dist/app/chat/chat/widgets/DataInsightsWidget.js +1 -1
  40. package/dist/app/chat/chat/widgets/DataInsightsWidget.js.map +1 -1
  41. package/dist/app/chat/chat/widgets/DataTableWidget.d.ts +3 -2
  42. package/dist/app/chat/chat/widgets/DataTableWidget.d.ts.map +1 -1
  43. package/dist/app/chat/chat/widgets/DataTableWidget.js +10 -66
  44. package/dist/app/chat/chat/widgets/DataTableWidget.js.map +1 -1
  45. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts +11 -0
  46. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts.map +1 -0
  47. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js +131 -0
  48. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js.map +1 -0
  49. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js +2 -2
  50. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js.map +1 -1
  51. package/dist/app/chat/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  52. package/dist/app/chat/mcp-apps/McpAppRenderer.js +6 -5
  53. package/dist/app/chat/mcp-apps/McpAppRenderer.js.map +1 -1
  54. package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts +2 -0
  55. package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts.map +1 -0
  56. package/dist/app/chat/mcp-apps/mcp-app-theme.js +11 -0
  57. package/dist/app/chat/mcp-apps/mcp-app-theme.js.map +1 -0
  58. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  59. package/dist/app/i18n/catalogs/ar-SA.js +10 -0
  60. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  61. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  62. package/dist/app/i18n/catalogs/de-DE.js +10 -0
  63. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  64. package/dist/app/i18n/catalogs/en-US.d.ts +10 -0
  65. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  66. package/dist/app/i18n/catalogs/en-US.js +10 -0
  67. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  68. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  69. package/dist/app/i18n/catalogs/es-ES.js +10 -0
  70. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  71. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  72. package/dist/app/i18n/catalogs/fr-FR.js +10 -0
  73. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  74. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  75. package/dist/app/i18n/catalogs/hi-IN.js +10 -0
  76. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  77. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  78. package/dist/app/i18n/catalogs/ja-JP.js +10 -0
  79. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  80. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  81. package/dist/app/i18n/catalogs/ko-KR.js +10 -0
  82. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  83. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  84. package/dist/app/i18n/catalogs/pt-BR.js +10 -0
  85. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  86. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  87. package/dist/app/i18n/catalogs/zh-CN.js +10 -0
  88. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  89. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  90. package/dist/app/i18n/catalogs/zh-TW.js +10 -0
  91. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  92. package/dist/app/org/AuthenticationSection.d.ts +3 -0
  93. package/dist/app/org/AuthenticationSection.d.ts.map +1 -1
  94. package/dist/app/org/AuthenticationSection.js +9 -3
  95. package/dist/app/org/AuthenticationSection.js.map +1 -1
  96. package/dist/app/org/pages/OrgAuthenticationPage.d.ts.map +1 -1
  97. package/dist/app/org/pages/OrgAuthenticationPage.js +2 -2
  98. package/dist/app/org/pages/OrgAuthenticationPage.js.map +1 -1
  99. package/dist/app/providers/AppProviders.d.ts +2 -1
  100. package/dist/app/providers/AppProviders.d.ts.map +1 -1
  101. package/dist/app/providers/AppProviders.js +4 -3
  102. package/dist/app/providers/AppProviders.js.map +1 -1
  103. package/dist/app/providers/ThemeFamilySync.d.ts +2 -0
  104. package/dist/app/providers/ThemeFamilySync.d.ts.map +1 -0
  105. package/dist/app/providers/ThemeFamilySync.js +6 -0
  106. package/dist/app/providers/ThemeFamilySync.js.map +1 -0
  107. package/dist/app/settings/account/PreferencesSettings.d.ts.map +1 -1
  108. package/dist/app/settings/account/PreferencesSettings.js +2 -1
  109. package/dist/app/settings/account/PreferencesSettings.js.map +1 -1
  110. package/dist/app/settings/account/ThemeFamilySettings.d.ts +2 -0
  111. package/dist/app/settings/account/ThemeFamilySettings.d.ts.map +1 -0
  112. package/dist/app/settings/account/ThemeFamilySettings.js +31 -0
  113. package/dist/app/settings/account/ThemeFamilySettings.js.map +1 -0
  114. package/dist/app/settings/account/search-entries.d.ts.map +1 -1
  115. package/dist/app/settings/account/search-entries.js +6 -0
  116. package/dist/app/settings/account/search-entries.js.map +1 -1
  117. package/dist/app/shared/DefaultSpinner.d.ts.map +1 -1
  118. package/dist/app/shared/DefaultSpinner.js +4 -5
  119. package/dist/app/shared/DefaultSpinner.js.map +1 -1
  120. package/dist/app/shared/ErrorBoundary.d.ts +1 -0
  121. package/dist/app/shared/ErrorBoundary.d.ts.map +1 -1
  122. package/dist/app/shared/ErrorBoundary.js +27 -12
  123. package/dist/app/shared/ErrorBoundary.js.map +1 -1
  124. package/dist/app/shared/PoweredByBadge.d.ts.map +1 -1
  125. package/dist/app/shared/PoweredByBadge.js +8 -49
  126. package/dist/app/shared/PoweredByBadge.js.map +1 -1
  127. package/dist/app/styles/agent-conversation.css +0 -23
  128. package/dist/app/styles/agent-native.css +1 -1
  129. package/dist/app/styles/theme-families.css +66 -0
  130. package/dist/composer/ComposerContextBanner.d.ts +22 -0
  131. package/dist/composer/ComposerContextBanner.d.ts.map +1 -0
  132. package/dist/composer/ComposerContextBanner.js +9 -0
  133. package/dist/composer/ComposerContextBanner.js.map +1 -0
  134. package/dist/composer/ComposerModePicker.d.ts +26 -0
  135. package/dist/composer/ComposerModePicker.d.ts.map +1 -0
  136. package/dist/composer/ComposerModePicker.js +14 -0
  137. package/dist/composer/ComposerModePicker.js.map +1 -0
  138. package/dist/composer/index.d.ts +2 -0
  139. package/dist/composer/index.d.ts.map +1 -1
  140. package/dist/composer/index.js +2 -0
  141. package/dist/composer/index.js.map +1 -1
  142. package/dist/styles.css +1 -0
  143. package/package.json +3 -3
  144. package/src/app/agentkit/react/components.spec.tsx +12 -0
  145. package/src/app/agentkit/react/components.tsx +41 -22
  146. package/src/app/agentkit/react/context.tsx +17 -0
  147. package/src/app/agentkit/react/index.ts +1 -0
  148. package/src/app/agentkit/react/lifecycle.spec.tsx +116 -1
  149. package/src/app/agentkit/react/message-content-order.spec.ts +190 -0
  150. package/src/app/agentkit/react/message-content-order.ts +246 -0
  151. package/src/app/agentkit/react/root.tsx +4 -0
  152. package/src/app/agentkit/react/styles.css +2 -2
  153. package/src/app/chat/AgentKitAssistantChat.spec.tsx +19 -0
  154. package/src/app/chat/AgentKitAssistantChat.tsx +10 -1
  155. package/src/app/chat/AgentPanel.header.spec.ts +72 -14
  156. package/src/app/chat/AgentPanel.tsx +97 -53
  157. package/src/app/chat/chat/surface-types.ts +8 -0
  158. package/src/app/chat/chat/widgets/DataChartRenderer.spec.tsx +217 -0
  159. package/src/app/chat/chat/widgets/DataChartRenderer.tsx +306 -68
  160. package/src/app/chat/chat/widgets/DataChartWidget.spec.tsx +329 -0
  161. package/src/app/chat/chat/widgets/DataChartWidget.ssr.spec.tsx +25 -0
  162. package/src/app/chat/chat/widgets/DataChartWidget.tsx +48 -33
  163. package/src/app/chat/chat/widgets/DataInsightsWidget.tsx +2 -2
  164. package/src/app/chat/chat/widgets/DataTableWidget.spec.tsx +37 -3
  165. package/src/app/chat/chat/widgets/DataTableWidget.tsx +22 -86
  166. package/src/app/chat/chat/widgets/DataWidgetDisplayControls.tsx +301 -0
  167. package/src/app/chat/chat/widgets/builtin-tool-renderers.tsx +5 -5
  168. package/src/app/chat/mcp-apps/McpAppRenderer.tsx +10 -5
  169. package/src/app/chat/mcp-apps/mcp-app-theme.spec.ts +30 -0
  170. package/src/app/chat/mcp-apps/mcp-app-theme.ts +11 -0
  171. package/src/app/i18n/catalogs/ar-SA.ts +12 -0
  172. package/src/app/i18n/catalogs/de-DE.ts +13 -0
  173. package/src/app/i18n/catalogs/en-US.ts +12 -0
  174. package/src/app/i18n/catalogs/es-ES.ts +14 -0
  175. package/src/app/i18n/catalogs/fr-FR.ts +14 -0
  176. package/src/app/i18n/catalogs/hi-IN.ts +12 -0
  177. package/src/app/i18n/catalogs/ja-JP.ts +12 -0
  178. package/src/app/i18n/catalogs/ko-KR.ts +12 -0
  179. package/src/app/i18n/catalogs/pt-BR.ts +13 -0
  180. package/src/app/i18n/catalogs/zh-CN.ts +11 -0
  181. package/src/app/i18n/catalogs/zh-TW.ts +12 -0
  182. package/src/app/org/AuthenticationSection.spec.tsx +62 -0
  183. package/src/app/org/AuthenticationSection.tsx +47 -1
  184. package/src/app/org/pages/OrgAuthenticationPage.tsx +4 -0
  185. package/src/app/org/pages/OrgSettingsPages.spec.tsx +3 -0
  186. package/src/app/providers/AppProviders.spec.tsx +71 -0
  187. package/src/app/providers/AppProviders.tsx +10 -0
  188. package/src/app/providers/ThemeFamilySync.tsx +6 -0
  189. package/src/app/settings/account/PreferencesSettings.spec.tsx +13 -2
  190. package/src/app/settings/account/PreferencesSettings.tsx +8 -0
  191. package/src/app/settings/account/ThemeFamilySettings.tsx +61 -0
  192. package/src/app/settings/account/search-entries.ts +6 -0
  193. package/src/app/shared/DefaultSpinner.spec.tsx +14 -0
  194. package/src/app/shared/DefaultSpinner.tsx +4 -5
  195. package/src/app/shared/ErrorBoundary.spec.tsx +45 -2
  196. package/src/app/shared/ErrorBoundary.tsx +37 -12
  197. package/src/app/shared/PoweredByBadge.spec.tsx +16 -0
  198. package/src/app/shared/PoweredByBadge.tsx +8 -50
  199. package/src/app/styles/agent-conversation.css +0 -23
  200. package/src/app/styles/agent-native.css +1 -1
  201. package/src/app/styles/agent-native.spec.ts +18 -0
  202. package/src/app/styles/theme-families.css +66 -0
  203. package/src/app/styles/theme-families.spec.ts +29 -0
  204. package/src/composer/ComposerContextBanner.spec.tsx +74 -0
  205. package/src/composer/ComposerContextBanner.tsx +72 -0
  206. package/src/composer/ComposerModePicker.spec.tsx +101 -0
  207. package/src/composer/ComposerModePicker.tsx +98 -0
  208. package/src/composer/index.ts +9 -0
  209. package/src/styles.css +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/composer/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/composer/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  export { FileReference } from "./extensions/FileReference.js";
2
+ export { ComposerContextBanner, } from "./ComposerContextBanner.js";
3
+ export { ComposerModePicker, } from "./ComposerModePicker.js";
2
4
  export { useComposerDefaultActions, mergeComposerMenuItems, } from "./ComposerPlusMenu.js";
3
5
  export { ComposerContextMenu, ComposerContextSearchInput, getComposerContextMenuEntries, } from "./ComposerContextMenu.js";
4
6
  export { ComposerContextPickerDialog } from "./ComposerContextPickerDialog.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/composer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAG1B,6BAA6B,GAW9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,4BAA4B,EAC5B,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,GAE3B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EACL,kBAAkB,GAEnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GAIzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,8BAA8B,EAC9B,kCAAkC,EAClC,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,mCAAmC,EACnC,wCAAwC,EACxC,qBAAqB,EACrB,iBAAiB,GAQlB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,0BAA0B,GAE3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,GAIf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,SAAS,GAGV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,GAMnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAQvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,0BAA0B,EAC1B,wCAAwC,EACxC,wBAAwB,EACxB,iCAAiC,EACjC,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,GAK7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mCAAmC,EACnC,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,yBAAyB,GAG1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAyB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,GAG3B,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/composer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,qBAAqB,GAEtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,kBAAkB,GAGnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAG1B,6BAA6B,GAW9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,4BAA4B,EAC5B,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,GAE3B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EACL,kBAAkB,GAEnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GAIzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,8BAA8B,EAC9B,kCAAkC,EAClC,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,mCAAmC,EACnC,wCAAwC,EACxC,qBAAqB,EACrB,iBAAiB,GAQlB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,0BAA0B,GAE3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,GAIf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,SAAS,GAGV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,GAMnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAQvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,0BAA0B,EAC1B,wCAAwC,EACxC,wBAAwB,EACxB,iCAAiC,EACjC,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,GAK7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mCAAmC,EACnC,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,yBAAyB,GAG1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAyB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,GAG3B,MAAM,uBAAuB,CAAC"}
package/dist/styles.css CHANGED
@@ -18,6 +18,7 @@
18
18
  */
19
19
  @import "./theme/resource-icons.css";
20
20
  @import "./app-shell/prompt-home.css";
21
+ @import "./app/styles/theme-families.css";
21
22
  @import "./app/styles/agent-native.css";
22
23
 
23
24
  @source "./**/*.{js,ts,tsx}";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/toolkit",
3
- "version": "0.212.1",
3
+ "version": "0.214.0",
4
4
  "description": "Reusable app-building UI and helpers for Agent-Native apps.",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -678,7 +678,7 @@
678
678
  "y-protocols": "^1.0.7",
679
679
  "yjs": "^13.6.33",
680
680
  "zod": "^4.3.6",
681
- "@agent-native/agentkit": "^0.212.1"
681
+ "@agent-native/agentkit": "^0.214.0"
682
682
  },
683
683
  "devDependencies": {
684
684
  "@excalidraw/excalidraw": "0.18.1",
@@ -702,7 +702,7 @@
702
702
  "typescript-7": "npm:typescript@^7.0.2",
703
703
  "vite": "8.1.0",
704
704
  "vitest": "^4.1.5",
705
- "@agent-native/core": "^0.212.1"
705
+ "@agent-native/core": "^0.214.0"
706
706
  },
707
707
  "peerDependencies": {
708
708
  "@agent-native/core": ">=0.205.1",
@@ -196,6 +196,18 @@ describe("AgentMessageActions layout", () => {
196
196
  });
197
197
 
198
198
  describe("AgentKitChat", () => {
199
+ it("keeps work-summary chevrons visible before the row is opened", () => {
200
+ const styles = readFileSync(
201
+ new URL("./styles.css", import.meta.url),
202
+ "utf8",
203
+ ).replace(/\r\n/g, "\n");
204
+ const rule = styles.match(
205
+ /\.agentkit-activities-summary > \.agentkit-summary-chevron \{([^}]*)\}/,
206
+ )?.[1];
207
+
208
+ expect(rule).toContain("opacity: 1;");
209
+ });
210
+
199
211
  it("renders the complete reference surface from one managed component", () => {
200
212
  const transport: AgentTransport = {
201
213
  async startRun() {
@@ -136,6 +136,7 @@ import {
136
136
  type AgentKitSuggestionsRenderProps,
137
137
  type AgentRunFailureRenderProps,
138
138
  } from "./context.js";
139
+ import { orderMessageContent } from "./message-content-order.js";
139
140
  import { AgentStreamingText } from "./streaming-text.js";
140
141
 
141
142
  // AgentKit React installs without @agent-native/core, so it repeats core's
@@ -1907,7 +1908,9 @@ function AgentWorkDisclosure({
1907
1908
  current?: ReactNode;
1908
1909
  children: ReactNode;
1909
1910
  }) {
1911
+ const { slots } = useAgentKit();
1910
1912
  const [open, setOpen] = useState(false);
1913
+ const Summary = slots.workedForSummary;
1911
1914
  return (
1912
1915
  <details
1913
1916
  className="agentkit-activities"
@@ -1924,18 +1927,30 @@ function AgentWorkDisclosure({
1924
1927
  setOpen((value) => !value);
1925
1928
  }}
1926
1929
  >
1927
- <span className="agentkit-activities-summary-content">
1928
- {label ? (
1929
- <span className="agentkit-activities-heading">
1930
- <span className="agentkit-activities-label">{label}</span>
1930
+ {Summary ? (
1931
+ <Summary
1932
+ label={label}
1933
+ running={running}
1934
+ expandable={expandable}
1935
+ open={open}
1936
+ current={current}
1937
+ />
1938
+ ) : (
1939
+ <>
1940
+ <IconChevronRight
1941
+ aria-hidden="true"
1942
+ className="agentkit-icon agentkit-summary-chevron"
1943
+ />
1944
+ <span className="agentkit-activities-summary-content">
1945
+ {label ? (
1946
+ <span className="agentkit-activities-heading">
1947
+ <span className="agentkit-activities-label">{label}</span>
1948
+ </span>
1949
+ ) : null}
1950
+ {current}
1931
1951
  </span>
1932
- ) : null}
1933
- {current}
1934
- </span>
1935
- <IconChevronRight
1936
- aria-hidden="true"
1937
- className="agentkit-icon agentkit-summary-chevron"
1938
- />
1952
+ </>
1953
+ )}
1939
1954
  </summary>
1940
1955
  {children}
1941
1956
  </details>
@@ -3787,7 +3802,7 @@ export function AgentMessageView({
3787
3802
  value: message,
3788
3803
  threadId,
3789
3804
  }: AgentKitRenderProps<AgentMessage>) {
3790
- const { labels, slots } = useAgentKit();
3805
+ const { labels, slots, resolveMessageContentOrder } = useAgentKit();
3791
3806
  const thread = useAgentThread(threadId);
3792
3807
  const visibleMessage = stripAgentMessageContext(message);
3793
3808
  const Supplement = slots.messageSupplement;
@@ -3812,6 +3827,13 @@ export function AgentMessageView({
3812
3827
  thread.annotationMessageIds[annotation.id] === message.id &&
3813
3828
  !embeddedAnnotationIds.has(annotation.id),
3814
3829
  );
3830
+ const orderedContent = orderMessageContent(
3831
+ visibleMessage,
3832
+ visibleMessage.parts,
3833
+ attachedWidgets,
3834
+ thread.events,
3835
+ resolveMessageContentOrder,
3836
+ );
3815
3837
  if (
3816
3838
  !message.parts.length &&
3817
3839
  !attachedWidgets.length &&
@@ -3830,23 +3852,20 @@ export function AgentMessageView({
3830
3852
  aria-busy={message.status === "streaming"}
3831
3853
  >
3832
3854
  <div className="agentkit-message-content">
3833
- {visibleMessage.parts.map((part, index) => (
3855
+ {orderedContent.map((item, index) => (
3834
3856
  <AgentMessagePartView
3835
- key={`${message.id}-${index}`}
3836
- value={part}
3857
+ key={item.key}
3858
+ value={
3859
+ item.type === "widget"
3860
+ ? { type: "widget", widget: item.widget }
3861
+ : item.part
3862
+ }
3837
3863
  threadId={threadId}
3838
3864
  active={message.status === "streaming"}
3839
3865
  resetKey={`${threadId}:${message.id}:${index}`}
3840
3866
  userMessage={message.role === "user"}
3841
3867
  />
3842
3868
  ))}
3843
- {attachedWidgets.map((widget) => (
3844
- <AgentMessagePartView
3845
- key={widget.id}
3846
- value={{ type: "widget", widget }}
3847
- threadId={threadId}
3848
- />
3849
- ))}
3850
3869
  {attachedAnnotations.length ? (
3851
3870
  <div className="agentkit-annotations">
3852
3871
  {attachedAnnotations.map((annotation) => (
@@ -43,6 +43,8 @@ import {
43
43
  type ReactNode,
44
44
  } from "react";
45
45
 
46
+ import type { AgentMessageContentOrderResolver } from "./message-content-order.js";
47
+
46
48
  export interface AgentKitRenderProps<T> {
47
49
  value: T;
48
50
  threadId: ThreadId;
@@ -79,6 +81,14 @@ export interface AgentKitSuggestionsRenderProps {
79
81
  onSelect: (suggestion: AgentSuggestion) => void;
80
82
  }
81
83
 
84
+ export interface AgentKitWorkedForSummaryRenderProps {
85
+ label: string;
86
+ running?: boolean;
87
+ expandable: boolean;
88
+ open: boolean;
89
+ current?: ReactNode;
90
+ }
91
+
82
92
  export interface AgentConnectionErrorRenderProps {
83
93
  error: AgentError;
84
94
  threadId: ThreadId;
@@ -153,6 +163,8 @@ export interface AgentKitSlots {
153
163
  composer?: ComponentType<{ threadId: ThreadId }>;
154
164
  queue?: ComponentType<AgentKitQueueRenderProps>;
155
165
  suggestions?: ComponentType<AgentKitSuggestionsRenderProps>;
166
+ /** Replaces the visible work-summary row while the shared disclosure owns its semantics. */
167
+ workedForSummary?: ComponentType<AgentKitWorkedForSummaryRenderProps>;
156
168
  }
157
169
 
158
170
  export interface AgentKitToolSource {
@@ -482,6 +494,7 @@ export interface AgentKitProviderProps {
482
494
  ) => Promise<AgentConnectionResponse>;
483
495
  /** Receives full renderer failures while the UI shows a safe fallback. */
484
496
  onRenderError?: (failure: AgentKitRenderFailure) => void;
497
+ resolveMessageContentOrder?: AgentMessageContentOrderResolver;
485
498
  onClientEffect?: (effect: {
486
499
  type: "client.effect" | "client.deeplink";
487
500
  name: string;
@@ -511,6 +524,7 @@ export interface AgentKitContextValue {
511
524
  loadRunUsage?: AgentKitRunUsageLoader;
512
525
  onConnectionRequest?: AgentKitProviderProps["onConnectionRequest"];
513
526
  onRenderError?: (failure: AgentKitRenderFailure) => void;
527
+ resolveMessageContentOrder?: AgentMessageContentOrderResolver;
514
528
  registerComposerFocus: (threadId: ThreadId, focus: () => void) => () => void;
515
529
  requestComposerFocus: (threadId: ThreadId) => void;
516
530
  }
@@ -531,6 +545,7 @@ export function AgentKitProvider({
531
545
  loadRunUsage,
532
546
  onConnectionRequest,
533
547
  onRenderError,
548
+ resolveMessageContentOrder,
534
549
  onClientEffect,
535
550
  children,
536
551
  }: AgentKitProviderProps) {
@@ -597,6 +612,7 @@ export function AgentKitProvider({
597
612
  loadRunUsage,
598
613
  onConnectionRequest,
599
614
  onRenderError,
615
+ resolveMessageContentOrder,
600
616
  registerComposerFocus,
601
617
  requestComposerFocus,
602
618
  }),
@@ -614,6 +630,7 @@ export function AgentKitProvider({
614
630
  loadRunUsage,
615
631
  onConnectionRequest,
616
632
  onRenderError,
633
+ resolveMessageContentOrder,
617
634
  registerComposerFocus,
618
635
  requestComposerFocus,
619
636
  ],
@@ -1,5 +1,6 @@
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";
@@ -157,6 +157,83 @@ afterEach(async () => {
157
157
  });
158
158
 
159
159
  describe("AgentChat lifecycle", () => {
160
+ it("renders host-ordered text around an attached widget", async () => {
161
+ const threadId = "thread-host-content-order";
162
+ const message = {
163
+ id: "assistant-host-content-order",
164
+ role: "assistant" as const,
165
+ status: "complete" as const,
166
+ parts: [{ type: "text" as const, text: "Intro. Summary." }],
167
+ };
168
+ const widget = {
169
+ id: "chart-host-content-order",
170
+ kind: "test-chart",
171
+ data: {},
172
+ };
173
+ const thread = {
174
+ ...createAgentThreadState(threadId),
175
+ messages: [message],
176
+ widgets: { [widget.id]: widget },
177
+ widgetMessageIds: { [widget.id]: message.id },
178
+ };
179
+ const observable = observableController({
180
+ connection: "connected",
181
+ capabilities: {},
182
+ capabilitiesStatus: "ready",
183
+ threads: { [threadId]: thread },
184
+ revision: 0,
185
+ });
186
+ const tree = mount();
187
+
188
+ await tree.render(
189
+ <AgentKitProvider
190
+ controller={observable.controller}
191
+ threadId={threadId}
192
+ resolveMessageContentOrder={({ parts, widgets }) => {
193
+ const part = parts[0];
194
+ const chart = widgets[0];
195
+ if (part?.type !== "text" || !chart) return [];
196
+ return [
197
+ {
198
+ key: "intro",
199
+ type: "part",
200
+ part: { ...part, text: "Intro. " },
201
+ },
202
+ { key: chart.id, type: "widget", widget: chart },
203
+ {
204
+ key: "summary",
205
+ type: "part",
206
+ part: { ...part, text: "Summary." },
207
+ },
208
+ ];
209
+ }}
210
+ registry={{
211
+ widgets: {
212
+ "test-chart": () => <span data-chart-result>Chart</span>,
213
+ },
214
+ }}
215
+ slots={{
216
+ text: ({ value }) => <span data-chat-part>{value.text}</span>,
217
+ }}
218
+ >
219
+ <AgentKitChat composer={false} />
220
+ </AgentKitProvider>,
221
+ );
222
+
223
+ const content = tree.container.querySelector(
224
+ `[data-message-id="${message.id}"] .agentkit-message-content`,
225
+ );
226
+ const renderedOrder = [...(content?.children ?? [])].map((element) =>
227
+ element.hasAttribute("data-chat-part")
228
+ ? element.textContent
229
+ : element.hasAttribute("data-chart-result")
230
+ ? "chart"
231
+ : "other",
232
+ );
233
+ expect(renderedOrder).toEqual(["Intro. ", "chart", "Summary."]);
234
+ await tree.unmount();
235
+ });
236
+
160
237
  it("keeps partial transcript updates out of live announcements", async () => {
161
238
  const threadId = "thread-accessible-transcript";
162
239
  const thread = {
@@ -1744,6 +1821,44 @@ describe("AgentChat lifecycle", () => {
1744
1821
  ".agentkit-activities-summary > .agentkit-summary-chevron",
1745
1822
  ),
1746
1823
  ).not.toBeNull();
1824
+ await tree.render(
1825
+ <AgentKitProvider
1826
+ controller={observable.controller}
1827
+ threadId={threadId}
1828
+ registry={{
1829
+ activities: {
1830
+ reasoning: ({ value }) => (
1831
+ <span data-protocol-reasoning>{value.label}</span>
1832
+ ),
1833
+ },
1834
+ }}
1835
+ slots={{
1836
+ reasoning: ({ value, active, resetKey }) => (
1837
+ <span data-thought={resetKey} data-active={active}>
1838
+ {value.text}
1839
+ </span>
1840
+ ),
1841
+ workedForSummary: ({ label, open, current }) => (
1842
+ <span data-work-summary data-open={open}>
1843
+ <span>{label}</span>
1844
+ <span data-work-chevron aria-hidden="true">
1845
+ ›
1846
+ </span>
1847
+ {current}
1848
+ </span>
1849
+ ),
1850
+ }}
1851
+ >
1852
+ <AgentKitChat composer={false} />
1853
+ </AgentKitProvider>,
1854
+ );
1855
+ expect(work.querySelector("[data-work-summary]")?.textContent).toContain(
1856
+ "Searching documentation",
1857
+ );
1858
+ expect(work.querySelector("[data-work-chevron]")).not.toBeNull();
1859
+ expect(
1860
+ work.querySelector("[data-work-summary]")?.getAttribute("data-open"),
1861
+ ).toBe("false");
1747
1862
  thread = reduceAgentEvent(thread, {
1748
1863
  ...base(8, 18),
1749
1864
  type: "message.completed",
@@ -1765,7 +1880,7 @@ describe("AgentChat lifecycle", () => {
1765
1880
  await flush();
1766
1881
  expect(tree.container.querySelector(".agentkit-activities")).toBe(work);
1767
1882
  expect(work.open).toBe(false);
1768
- expect(work.querySelector("summary")?.textContent).toBe("Worked for 18s");
1883
+ expect(work.querySelector("summary")?.textContent).toBe("Worked for 18s›");
1769
1884
  expect(work.querySelector("[data-agentkit-current-activity]")).toBeNull();
1770
1885
  expect(tree.container.querySelectorAll("article")).toHaveLength(1);
1771
1886
  const answer = tree.container.querySelector(
@@ -0,0 +1,190 @@
1
+ import type {
2
+ AgentEvent,
3
+ AgentMessage,
4
+ AgentWidget,
5
+ } from "@agent-native/agentkit/protocol";
6
+ import { describe, expect, it } from "vitest";
7
+
8
+ import {
9
+ orderMessageContent,
10
+ type AgentMessageContentOrderResolver,
11
+ } from "./message-content-order.js";
12
+
13
+ const widget: AgentWidget = {
14
+ id: "chart-1",
15
+ kind: "core.data-chart",
16
+ data: { toolCallId: "tool-1" },
17
+ };
18
+
19
+ function event(
20
+ sequence: number,
21
+ payload: Omit<
22
+ AgentEvent,
23
+ "id" | "threadId" | "runId" | "sequence" | "occurredAt"
24
+ >,
25
+ ): AgentEvent {
26
+ return {
27
+ id: `event-${sequence}`,
28
+ threadId: "thread-1",
29
+ runId: "run-1",
30
+ sequence,
31
+ occurredAt: `2026-10-21T00:00:0${sequence}.000Z`,
32
+ ...payload,
33
+ } as AgentEvent;
34
+ }
35
+
36
+ describe("orderMessageContent", () => {
37
+ it("keeps an attached chart between the streamed introduction and conclusion", () => {
38
+ const message: AgentMessage = {
39
+ id: "assistant-1",
40
+ role: "assistant",
41
+ status: "complete",
42
+ parts: [
43
+ {
44
+ type: "text",
45
+ text: "Intro before chart. Conclusion after chart.",
46
+ format: "markdown",
47
+ },
48
+ ],
49
+ };
50
+ const events: AgentEvent[] = [
51
+ event(1, {
52
+ type: "message.created",
53
+ message: { ...message, status: "streaming", parts: [] },
54
+ }),
55
+ event(2, {
56
+ type: "message.delta",
57
+ messageId: message.id,
58
+ text: "Intro before chart. ",
59
+ format: "markdown",
60
+ }),
61
+ event(3, { type: "widget.created", messageId: message.id, widget }),
62
+ event(4, {
63
+ type: "message.delta",
64
+ messageId: message.id,
65
+ text: "Conclusion after chart.",
66
+ format: "markdown",
67
+ }),
68
+ event(5, { type: "message.completed", message }),
69
+ ];
70
+
71
+ const result = orderMessageContent(
72
+ message,
73
+ message.parts,
74
+ [widget],
75
+ events,
76
+ );
77
+
78
+ expect(result.map((item) => item.type)).toEqual(["part", "widget", "part"]);
79
+ expect(result[0]).toMatchObject({
80
+ type: "part",
81
+ part: { text: "Intro before chart. " },
82
+ });
83
+ expect(result[1]).toMatchObject({ type: "widget", widget });
84
+ expect(result[2]).toMatchObject({
85
+ type: "part",
86
+ part: { text: "Conclusion after chart." },
87
+ });
88
+ });
89
+
90
+ it("keeps legacy append order when streamed text cannot be matched exactly", () => {
91
+ const message: AgentMessage = {
92
+ id: "assistant-2",
93
+ role: "assistant",
94
+ parts: [{ type: "text", text: "Final answer" }],
95
+ };
96
+
97
+ const result = orderMessageContent(message, message.parts, [widget], []);
98
+
99
+ expect(result.map((item) => item.type)).toEqual(["part", "widget"]);
100
+ });
101
+
102
+ it("lets a host split text around a widget when stream order is unavailable", () => {
103
+ const message: AgentMessage = {
104
+ id: "assistant-3",
105
+ role: "assistant",
106
+ parts: [{ type: "text", text: "Intro. Summary." }],
107
+ };
108
+ const textPart = message.parts[0];
109
+ if (textPart?.type !== "text") throw new Error("Expected text part");
110
+
111
+ const result = orderMessageContent(
112
+ message,
113
+ message.parts,
114
+ [widget],
115
+ [],
116
+ ({ parts, widgets }) => {
117
+ const part = parts[0];
118
+ const chart = widgets[0];
119
+ if (part?.type !== "text" || !chart) return [];
120
+ return [
121
+ {
122
+ key: "intro",
123
+ type: "part",
124
+ part: { ...part, text: "Intro. " },
125
+ },
126
+ { key: chart.id, type: "widget", widget: chart },
127
+ {
128
+ key: "summary",
129
+ type: "part",
130
+ part: { ...part, text: "Summary." },
131
+ },
132
+ ];
133
+ },
134
+ );
135
+
136
+ expect(result.map((item) => item.type)).toEqual(["part", "widget", "part"]);
137
+ expect(result[0]).toMatchObject({ part: { text: "Intro. " } });
138
+ expect(result[1]).toMatchObject({ type: "widget", widget });
139
+ expect(result[2]).toMatchObject({ part: { text: "Summary." } });
140
+ expect(textPart.text).toBe("Intro. Summary.");
141
+ });
142
+
143
+ it("falls back when the host ordering result drops all visible content", () => {
144
+ const message: AgentMessage = {
145
+ id: "assistant-4",
146
+ role: "assistant",
147
+ parts: [{ type: "text", text: "A saved answer" }],
148
+ };
149
+
150
+ const result = orderMessageContent(
151
+ message,
152
+ message.parts,
153
+ [widget],
154
+ [],
155
+ () => [],
156
+ );
157
+
158
+ expect(result).toEqual([
159
+ {
160
+ key: "assistant-4-0",
161
+ type: "part",
162
+ part: message.parts[0],
163
+ },
164
+ { key: widget.id, type: "widget", widget },
165
+ ]);
166
+ });
167
+
168
+ it("falls back when the host ordering result loses text or a widget", () => {
169
+ const message: AgentMessage = {
170
+ id: "assistant-5",
171
+ role: "assistant",
172
+ parts: [{ type: "text", text: "Visible answer" }],
173
+ };
174
+ const incompleteOrders: AgentMessageContentOrderResolver[] = [
175
+ () => [{ key: widget.id, type: "widget" as const, widget }],
176
+ ({ defaultOrder }) => defaultOrder.slice(0, 1),
177
+ ];
178
+
179
+ for (const resolveOrder of incompleteOrders) {
180
+ const result = orderMessageContent(
181
+ message,
182
+ message.parts,
183
+ [widget],
184
+ [],
185
+ resolveOrder,
186
+ );
187
+ expect(result.map((item) => item.type)).toEqual(["part", "widget"]);
188
+ }
189
+ });
190
+ });