@agent-native/toolkit 0.228.0-nightly-20261111212500 → 0.228.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 (361) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/dist/app/agentkit/react/approval-card.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/approval-card.js +5 -3
  4. package/dist/app/agentkit/react/approval-card.js.map +1 -1
  5. package/dist/app/agentkit/react/code-block.d.ts +32 -0
  6. package/dist/app/agentkit/react/code-block.d.ts.map +1 -0
  7. package/dist/app/agentkit/react/code-block.js +125 -0
  8. package/dist/app/agentkit/react/code-block.js.map +1 -0
  9. package/dist/app/agentkit/react/components.d.ts +33 -14
  10. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  11. package/dist/app/agentkit/react/components.js +843 -168
  12. package/dist/app/agentkit/react/components.js.map +1 -1
  13. package/dist/app/agentkit/react/context-usage.d.ts +45 -0
  14. package/dist/app/agentkit/react/context-usage.d.ts.map +1 -0
  15. package/dist/app/agentkit/react/context-usage.js +93 -0
  16. package/dist/app/agentkit/react/context-usage.js.map +1 -0
  17. package/dist/app/agentkit/react/context.d.ts +42 -3
  18. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  19. package/dist/app/agentkit/react/context.js +46 -1
  20. package/dist/app/agentkit/react/context.js.map +1 -1
  21. package/dist/app/agentkit/react/disclosure-content.d.ts +12 -0
  22. package/dist/app/agentkit/react/disclosure-content.d.ts.map +1 -0
  23. package/dist/app/agentkit/react/disclosure-content.js +33 -0
  24. package/dist/app/agentkit/react/disclosure-content.js.map +1 -0
  25. package/dist/app/agentkit/react/duration.d.ts +6 -0
  26. package/dist/app/agentkit/react/duration.d.ts.map +1 -0
  27. package/dist/app/agentkit/react/duration.js +21 -0
  28. package/dist/app/agentkit/react/duration.js.map +1 -0
  29. package/dist/app/agentkit/react/file-change.d.ts +33 -0
  30. package/dist/app/agentkit/react/file-change.d.ts.map +1 -0
  31. package/dist/app/agentkit/react/file-change.js +83 -0
  32. package/dist/app/agentkit/react/file-change.js.map +1 -0
  33. package/dist/app/agentkit/react/file-diff.d.ts +17 -0
  34. package/dist/app/agentkit/react/file-diff.d.ts.map +1 -0
  35. package/dist/app/agentkit/react/file-diff.js +94 -0
  36. package/dist/app/agentkit/react/file-diff.js.map +1 -0
  37. package/dist/app/agentkit/react/index.d.ts +7 -0
  38. package/dist/app/agentkit/react/index.d.ts.map +1 -1
  39. package/dist/app/agentkit/react/index.js +7 -0
  40. package/dist/app/agentkit/react/index.js.map +1 -1
  41. package/dist/app/agentkit/react/question-card.d.ts +67 -0
  42. package/dist/app/agentkit/react/question-card.d.ts.map +1 -0
  43. package/dist/app/agentkit/react/question-card.js +198 -0
  44. package/dist/app/agentkit/react/question-card.js.map +1 -0
  45. package/dist/app/agentkit/react/root.d.ts +3 -2
  46. package/dist/app/agentkit/react/root.d.ts.map +1 -1
  47. package/dist/app/agentkit/react/root.js +2 -2
  48. package/dist/app/agentkit/react/root.js.map +1 -1
  49. package/dist/app/agentkit/react/roving-focus.d.ts +4 -0
  50. package/dist/app/agentkit/react/roving-focus.d.ts.map +1 -0
  51. package/dist/app/agentkit/react/roving-focus.js +75 -0
  52. package/dist/app/agentkit/react/roving-focus.js.map +1 -0
  53. package/dist/app/agentkit/react/stack-trace.d.ts +34 -0
  54. package/dist/app/agentkit/react/stack-trace.d.ts.map +1 -0
  55. package/dist/app/agentkit/react/stack-trace.js +121 -0
  56. package/dist/app/agentkit/react/stack-trace.js.map +1 -0
  57. package/dist/app/agentkit/react/stop-button.d.ts.map +1 -1
  58. package/dist/app/agentkit/react/stop-button.js +22 -6
  59. package/dist/app/agentkit/react/stop-button.js.map +1 -1
  60. package/dist/app/agentkit/react/styles.css +1306 -395
  61. package/dist/app/agentkit/react/terminal.d.ts +28 -0
  62. package/dist/app/agentkit/react/terminal.d.ts.map +1 -0
  63. package/dist/app/agentkit/react/terminal.js +84 -0
  64. package/dist/app/agentkit/react/terminal.js.map +1 -0
  65. package/dist/app/agentkit/react/trace.d.ts +31 -0
  66. package/dist/app/agentkit/react/trace.d.ts.map +1 -0
  67. package/dist/app/agentkit/react/trace.js +73 -0
  68. package/dist/app/agentkit/react/trace.js.map +1 -0
  69. package/dist/app/blocks/library/HighlightedCode.d.ts +2 -1
  70. package/dist/app/blocks/library/HighlightedCode.d.ts.map +1 -1
  71. package/dist/app/blocks/library/HighlightedCode.js +8 -111
  72. package/dist/app/blocks/library/HighlightedCode.js.map +1 -1
  73. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  74. package/dist/app/chat/AgentKitAssistantChat.js +23 -245
  75. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  76. package/dist/app/chat/agentkit-chat/guided-questions.d.ts +15 -1
  77. package/dist/app/chat/agentkit-chat/guided-questions.d.ts.map +1 -1
  78. package/dist/app/chat/agentkit-chat/guided-questions.js +142 -2
  79. package/dist/app/chat/agentkit-chat/guided-questions.js.map +1 -1
  80. package/dist/app/chat/agentkit-chat/history.js +1 -1
  81. package/dist/app/chat/agentkit-chat/history.js.map +1 -1
  82. package/dist/app/chat/agentkit-chat/index.d.ts +1 -1
  83. package/dist/app/chat/agentkit-chat/index.d.ts.map +1 -1
  84. package/dist/app/chat/agentkit-chat/index.js +1 -1
  85. package/dist/app/chat/agentkit-chat/index.js.map +1 -1
  86. package/dist/app/chat/agentkit-chat/labels.d.ts +5 -0
  87. package/dist/app/chat/agentkit-chat/labels.d.ts.map +1 -0
  88. package/dist/app/chat/agentkit-chat/labels.js +245 -0
  89. package/dist/app/chat/agentkit-chat/labels.js.map +1 -0
  90. package/dist/app/chat/agentkit-chat/questions.d.ts +1 -1
  91. package/dist/app/chat/agentkit-chat/questions.d.ts.map +1 -1
  92. package/dist/app/chat/agentkit-chat/questions.js +1 -1
  93. package/dist/app/chat/agentkit-chat/questions.js.map +1 -1
  94. package/dist/app/chat/agentkit-chat/root.d.ts.map +1 -1
  95. package/dist/app/chat/agentkit-chat/root.js +5 -64
  96. package/dist/app/chat/agentkit-chat/root.js.map +1 -1
  97. package/dist/app/chat/agentkit-chat/work-step-labels.d.ts +2 -0
  98. package/dist/app/chat/agentkit-chat/work-step-labels.d.ts.map +1 -1
  99. package/dist/app/chat/agentkit-chat/work-step-labels.js +31 -0
  100. package/dist/app/chat/agentkit-chat/work-step-labels.js.map +1 -1
  101. package/dist/app/chat/chat/markdown-renderer.d.ts +2 -12
  102. package/dist/app/chat/chat/markdown-renderer.d.ts.map +1 -1
  103. package/dist/app/chat/chat/markdown-renderer.js +2 -41
  104. package/dist/app/chat/chat/markdown-renderer.js.map +1 -1
  105. package/dist/app/chat/chat/tool-call-display.d.ts.map +1 -1
  106. package/dist/app/chat/chat/tool-call-display.js +2 -2
  107. package/dist/app/chat/chat/tool-call-display.js.map +1 -1
  108. package/dist/app/chat/conversation/AgentConversation.d.ts.map +1 -1
  109. package/dist/app/chat/conversation/AgentConversation.js +2 -37
  110. package/dist/app/chat/conversation/AgentConversation.js.map +1 -1
  111. package/dist/app/chat/tool-cells/BashCell.d.ts +3 -1
  112. package/dist/app/chat/tool-cells/BashCell.d.ts.map +1 -1
  113. package/dist/app/chat/tool-cells/BashCell.js +4 -40
  114. package/dist/app/chat/tool-cells/BashCell.js.map +1 -1
  115. package/dist/app/chat/tool-cells/EditCell.d.ts.map +1 -1
  116. package/dist/app/chat/tool-cells/EditCell.js +5 -108
  117. package/dist/app/chat/tool-cells/EditCell.js.map +1 -1
  118. package/dist/app/chat/tool-cells/FilesChangedSummary.d.ts.map +1 -1
  119. package/dist/app/chat/tool-cells/FilesChangedSummary.js +23 -81
  120. package/dist/app/chat/tool-cells/FilesChangedSummary.js.map +1 -1
  121. package/dist/app/chat/tool-cells/WriteCell.d.ts.map +1 -1
  122. package/dist/app/chat/tool-cells/WriteCell.js +5 -24
  123. package/dist/app/chat/tool-cells/WriteCell.js.map +1 -1
  124. package/dist/app/code-highlighter.d.ts +11 -0
  125. package/dist/app/code-highlighter.d.ts.map +1 -0
  126. package/dist/app/code-highlighter.js +122 -0
  127. package/dist/app/code-highlighter.js.map +1 -0
  128. package/dist/app/context-xray/ThreadContextRing.js +3 -3
  129. package/dist/app/context-xray/ThreadContextRing.js.map +1 -1
  130. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  131. package/dist/app/i18n/catalogs/ar-SA.js +22 -0
  132. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  133. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  134. package/dist/app/i18n/catalogs/de-DE.js +22 -0
  135. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  136. package/dist/app/i18n/catalogs/en-US.d.ts +22 -0
  137. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  138. package/dist/app/i18n/catalogs/en-US.js +22 -0
  139. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  140. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  141. package/dist/app/i18n/catalogs/es-ES.js +22 -0
  142. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  143. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  144. package/dist/app/i18n/catalogs/fr-FR.js +22 -0
  145. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  146. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  147. package/dist/app/i18n/catalogs/hi-IN.js +22 -0
  148. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  149. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  150. package/dist/app/i18n/catalogs/ja-JP.js +22 -0
  151. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  152. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  153. package/dist/app/i18n/catalogs/ko-KR.js +22 -0
  154. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  155. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  156. package/dist/app/i18n/catalogs/pt-BR.js +22 -0
  157. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  158. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  159. package/dist/app/i18n/catalogs/zh-CN.js +22 -0
  160. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  161. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  162. package/dist/app/i18n/catalogs/zh-TW.js +22 -0
  163. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  164. package/dist/app/onboarding/first-run-first-paint.d.ts +10 -0
  165. package/dist/app/onboarding/first-run-first-paint.d.ts.map +1 -0
  166. package/dist/app/onboarding/first-run-first-paint.js +22 -0
  167. package/dist/app/onboarding/first-run-first-paint.js.map +1 -0
  168. package/dist/app/onboarding/first-run-startup-gate.d.ts +3 -1
  169. package/dist/app/onboarding/first-run-startup-gate.d.ts.map +1 -1
  170. package/dist/app/onboarding/first-run-startup-gate.js +30 -6
  171. package/dist/app/onboarding/first-run-startup-gate.js.map +1 -1
  172. package/dist/app/providers/AppProviders.d.ts.map +1 -1
  173. package/dist/app/providers/AppProviders.js +9 -2
  174. package/dist/app/providers/AppProviders.js.map +1 -1
  175. package/dist/app/providers/BuilderSignupActivation.d.ts +2 -1
  176. package/dist/app/providers/BuilderSignupActivation.d.ts.map +1 -1
  177. package/dist/app/providers/BuilderSignupActivation.js +6 -3
  178. package/dist/app/providers/BuilderSignupActivation.js.map +1 -1
  179. package/dist/app/shared/AppShellSkeleton.d.ts.map +1 -1
  180. package/dist/app/shared/AppShellSkeleton.js +11 -1
  181. package/dist/app/shared/AppShellSkeleton.js.map +1 -1
  182. package/dist/app/styles/agent-native.css +2 -2
  183. package/dist/app/styles/tokens/agent-kit.css +20 -3
  184. package/dist/composer/AgentSuggestionBar.d.ts.map +1 -1
  185. package/dist/composer/AgentSuggestionBar.js +2 -2
  186. package/dist/composer/AgentSuggestionBar.js.map +1 -1
  187. package/dist/composer/ComposerContextMenu.js +4 -4
  188. package/dist/composer/ComposerContextMenu.js.map +1 -1
  189. package/dist/composer/ComposerContextPicker.d.ts.map +1 -1
  190. package/dist/composer/ComposerContextPicker.js +2 -2
  191. package/dist/composer/ComposerContextPicker.js.map +1 -1
  192. package/dist/composer/ComposerContextPickerDialog.d.ts.map +1 -1
  193. package/dist/composer/ComposerContextPickerDialog.js +2 -2
  194. package/dist/composer/ComposerContextPickerDialog.js.map +1 -1
  195. package/dist/composer/ComposerModePicker.d.ts.map +1 -1
  196. package/dist/composer/ComposerModePicker.js +2 -1
  197. package/dist/composer/ComposerModePicker.js.map +1 -1
  198. package/dist/composer/ComposerPlusMenu.js +1 -1
  199. package/dist/composer/ComposerPlusMenu.js.map +1 -1
  200. package/dist/composer/MentionChip.js +1 -1
  201. package/dist/composer/MentionChip.js.map +1 -1
  202. package/dist/composer/MentionPopover.d.ts +3 -0
  203. package/dist/composer/MentionPopover.d.ts.map +1 -1
  204. package/dist/composer/MentionPopover.js +34 -15
  205. package/dist/composer/MentionPopover.js.map +1 -1
  206. package/dist/composer/MessageQueueDrawer.d.ts.map +1 -1
  207. package/dist/composer/MessageQueueDrawer.js +14 -9
  208. package/dist/composer/MessageQueueDrawer.js.map +1 -1
  209. package/dist/composer/PastedTextChip.d.ts.map +1 -1
  210. package/dist/composer/PastedTextChip.js +14 -18
  211. package/dist/composer/PastedTextChip.js.map +1 -1
  212. package/dist/composer/PromptBar.js +1 -1
  213. package/dist/composer/PromptBar.js.map +1 -1
  214. package/dist/composer/PromptComposer.d.ts.map +1 -1
  215. package/dist/composer/PromptComposer.js +11 -9
  216. package/dist/composer/PromptComposer.js.map +1 -1
  217. package/dist/composer/RealtimeVoiceMode.js +2 -2
  218. package/dist/composer/RealtimeVoiceMode.js.map +1 -1
  219. package/dist/composer/TiptapComposer.d.ts.map +1 -1
  220. package/dist/composer/TiptapComposer.js +52 -89
  221. package/dist/composer/TiptapComposer.js.map +1 -1
  222. package/dist/composer/VoiceButton.d.ts +3 -1
  223. package/dist/composer/VoiceButton.d.ts.map +1 -1
  224. package/dist/composer/VoiceButton.js +10 -8
  225. package/dist/composer/VoiceButton.js.map +1 -1
  226. package/dist/composer/composer-notice.js +3 -3
  227. package/dist/composer/composer-notice.js.map +1 -1
  228. package/dist/composer/extensions/FileReference.js +1 -1
  229. package/dist/composer/extensions/FileReference.js.map +1 -1
  230. package/dist/composer/extensions/SkillReference.js +1 -1
  231. package/dist/composer/extensions/SkillReference.js.map +1 -1
  232. package/dist/composer/popover-surface.d.ts +1 -1
  233. package/dist/composer/popover-surface.d.ts.map +1 -1
  234. package/dist/composer/popover-surface.js +1 -1
  235. package/dist/composer/popover-surface.js.map +1 -1
  236. package/dist/context-ui/ContextUsageRing.d.ts +1 -45
  237. package/dist/context-ui/ContextUsageRing.d.ts.map +1 -1
  238. package/dist/context-ui/ContextUsageRing.js +2 -87
  239. package/dist/context-ui/ContextUsageRing.js.map +1 -1
  240. package/dist/context-ui/index.d.ts +2 -2
  241. package/dist/context-ui/index.d.ts.map +1 -1
  242. package/dist/context-ui/index.js +2 -2
  243. package/dist/context-ui/index.js.map +1 -1
  244. package/package.json +4 -4
  245. package/src/app/agentkit/react/approval-card.tsx +14 -2
  246. package/src/app/agentkit/react/code-block.spec.tsx +154 -0
  247. package/src/app/agentkit/react/code-block.tsx +317 -0
  248. package/src/app/agentkit/react/components.interaction.spec.tsx +7 -0
  249. package/src/app/agentkit/react/components.papercuts.spec.tsx +143 -2
  250. package/src/app/agentkit/react/components.spec.tsx +40 -47
  251. package/src/app/agentkit/react/components.tsx +1533 -413
  252. package/src/app/agentkit/react/composer-context.spec.tsx +35 -0
  253. package/src/app/agentkit/react/context-usage.tsx +353 -0
  254. package/src/app/agentkit/react/context.tsx +93 -1
  255. package/src/app/agentkit/react/disclosure-content.ts +42 -0
  256. package/src/app/agentkit/react/disclosures.spec.tsx +62 -4
  257. package/src/app/agentkit/react/duration.ts +22 -0
  258. package/src/app/agentkit/react/file-change.spec.tsx +124 -0
  259. package/src/app/agentkit/react/file-change.tsx +228 -0
  260. package/src/app/agentkit/react/file-diff.ts +110 -0
  261. package/src/app/agentkit/react/index.ts +7 -0
  262. package/src/app/agentkit/react/lifecycle.spec.tsx +565 -20
  263. package/src/app/agentkit/react/markdown.spec.tsx +18 -8
  264. package/src/app/agentkit/react/message-actions.spec.tsx +55 -1
  265. package/src/app/agentkit/react/notices.spec.tsx +4 -4
  266. package/src/app/agentkit/react/optimistic-send.spec.tsx +43 -0
  267. package/src/app/agentkit/react/question-card.spec.tsx +276 -0
  268. package/src/app/agentkit/react/question-card.tsx +533 -0
  269. package/src/app/agentkit/react/root.tsx +4 -0
  270. package/src/app/agentkit/react/roving-focus.spec.tsx +114 -0
  271. package/src/app/agentkit/react/roving-focus.ts +82 -0
  272. package/src/app/agentkit/react/stack-trace.spec.tsx +177 -0
  273. package/src/app/agentkit/react/stack-trace.tsx +281 -0
  274. package/src/app/agentkit/react/stop-button.spec.tsx +40 -0
  275. package/src/app/agentkit/react/stop-button.tsx +22 -5
  276. package/src/app/agentkit/react/styles.css +1306 -395
  277. package/src/app/agentkit/react/subagent-step.spec.tsx +554 -0
  278. package/src/app/agentkit/react/terminal.spec.tsx +228 -0
  279. package/src/app/agentkit/react/terminal.tsx +228 -0
  280. package/src/app/agentkit/react/trace.spec.tsx +120 -0
  281. package/src/app/agentkit/react/trace.tsx +239 -0
  282. package/src/app/blocks/library/HighlightedCode.tsx +14 -126
  283. package/src/app/chat/AgentKitAssistantChat.spec.tsx +28 -12
  284. package/src/app/chat/AgentKitAssistantChat.tsx +27 -253
  285. package/src/app/chat/agentkit-chat/approval-card.spec.tsx +1 -0
  286. package/src/app/chat/agentkit-chat/guided-questions.flow.spec.tsx +381 -0
  287. package/src/app/chat/agentkit-chat/guided-questions.tsx +236 -3
  288. package/src/app/chat/agentkit-chat/history.tsx +1 -1
  289. package/src/app/chat/agentkit-chat/index.ts +2 -0
  290. package/src/app/chat/agentkit-chat/labels.ts +259 -0
  291. package/src/app/chat/agentkit-chat/questions.ts +2 -0
  292. package/src/app/chat/agentkit-chat/root.spec.tsx +18 -0
  293. package/src/app/chat/agentkit-chat/root.tsx +5 -64
  294. package/src/app/chat/agentkit-chat/work-step-labels.ts +42 -0
  295. package/src/app/chat/chat/markdown-renderer.tsx +2 -59
  296. package/src/app/chat/chat/tool-call-display.spec.tsx +26 -14
  297. package/src/app/chat/chat/tool-call-display.tsx +2 -1
  298. package/src/app/chat/conversation/AgentConversation.tsx +2 -50
  299. package/src/app/chat/tool-cells/BashCell.tsx +14 -136
  300. package/src/app/chat/tool-cells/EditCell.tsx +11 -248
  301. package/src/app/chat/tool-cells/FilesChangedSummary.spec.tsx +62 -5
  302. package/src/app/chat/tool-cells/FilesChangedSummary.tsx +31 -162
  303. package/src/app/chat/tool-cells/WriteCell.tsx +11 -121
  304. package/src/app/code-highlighter.ts +131 -0
  305. package/src/app/context-xray/ThreadContextRing.tsx +7 -7
  306. package/src/app/i18n/catalogs/ar-SA.ts +22 -0
  307. package/src/app/i18n/catalogs/de-DE.ts +22 -0
  308. package/src/app/i18n/catalogs/en-US.ts +22 -0
  309. package/src/app/i18n/catalogs/es-ES.ts +22 -0
  310. package/src/app/i18n/catalogs/fr-FR.ts +22 -0
  311. package/src/app/i18n/catalogs/hi-IN.ts +22 -0
  312. package/src/app/i18n/catalogs/ja-JP.ts +22 -0
  313. package/src/app/i18n/catalogs/ko-KR.ts +22 -0
  314. package/src/app/i18n/catalogs/pt-BR.ts +22 -0
  315. package/src/app/i18n/catalogs/zh-CN.ts +22 -0
  316. package/src/app/i18n/catalogs/zh-TW.ts +22 -0
  317. package/src/app/onboarding/first-run-first-paint.spec.ts +39 -0
  318. package/src/app/onboarding/first-run-first-paint.ts +24 -0
  319. package/src/app/onboarding/first-run-startup-gate.spec.tsx +125 -13
  320. package/src/app/onboarding/first-run-startup-gate.tsx +48 -5
  321. package/src/app/providers/AppProviders.tsx +18 -0
  322. package/src/app/providers/BuilderSignupActivation.tsx +8 -2
  323. package/src/app/shared/AppShellSkeleton.spec.tsx +60 -1
  324. package/src/app/shared/AppShellSkeleton.tsx +31 -1
  325. package/src/app/styles/agent-native.css +2 -2
  326. package/src/app/styles/agent-native.spec.ts +2 -2
  327. package/src/app/styles/tokens/agent-kit.css +20 -3
  328. package/src/composer/AgentSuggestionBar.spec.tsx +3 -1
  329. package/src/composer/AgentSuggestionBar.tsx +5 -2
  330. package/src/composer/ComposerContextMenu.tsx +4 -4
  331. package/src/composer/ComposerContextPicker.tsx +8 -2
  332. package/src/composer/ComposerContextPickerDialog.tsx +5 -2
  333. package/src/composer/ComposerModePicker.tsx +2 -1
  334. package/src/composer/ComposerPlusMenu.tsx +1 -1
  335. package/src/composer/MentionChip.tsx +1 -1
  336. package/src/composer/MentionPopover.spec.tsx +108 -2
  337. package/src/composer/MentionPopover.tsx +93 -17
  338. package/src/composer/MessageQueueDrawer.spec.tsx +5 -5
  339. package/src/composer/MessageQueueDrawer.tsx +19 -12
  340. package/src/composer/PastedTextChip.spec.tsx +36 -0
  341. package/src/composer/PastedTextChip.tsx +52 -58
  342. package/src/composer/PromptBar.tsx +1 -1
  343. package/src/composer/PromptComposer.context.spec.tsx +2 -2
  344. package/src/composer/PromptComposer.submission.spec.tsx +27 -0
  345. package/src/composer/PromptComposer.tsx +17 -9
  346. package/src/composer/RealtimeVoiceMode.tsx +2 -2
  347. package/src/composer/TiptapComposer.model-picker.spec.tsx +23 -82
  348. package/src/composer/TiptapComposer.tsx +68 -145
  349. package/src/composer/VoiceButton.tsx +12 -7
  350. package/src/composer/composer-notice.tsx +3 -3
  351. package/src/composer/extensions/FileReference.tsx +1 -1
  352. package/src/composer/extensions/SkillReference.tsx +1 -1
  353. package/src/composer/popover-surface.ts +1 -1
  354. package/src/context-ui/ContextUsageRing.spec.tsx +33 -8
  355. package/src/context-ui/ContextUsageRing.tsx +13 -348
  356. package/src/context-ui/index.ts +7 -1
  357. package/dist/composer/ModelPickerParts.d.ts +0 -20
  358. package/dist/composer/ModelPickerParts.d.ts.map +0 -1
  359. package/dist/composer/ModelPickerParts.js +0 -77
  360. package/dist/composer/ModelPickerParts.js.map +0 -1
  361. package/src/composer/ModelPickerParts.tsx +0 -188
@@ -0,0 +1,554 @@
1
+ // @vitest-environment happy-dom
2
+
3
+ import {
4
+ createAgentThreadState,
5
+ reduceAgentEvent,
6
+ type AgentKitController,
7
+ type AgentKitSnapshot,
8
+ type AgentThreadState,
9
+ } from "@agent-native/agentkit/client";
10
+ import type { AgentEvent } from "@agent-native/agentkit/protocol";
11
+ import { act } from "react";
12
+ import { createRoot, type Root } from "react-dom/client";
13
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
14
+
15
+ import {
16
+ AgentActivityGroup,
17
+ AgentCollaborationFeed,
18
+ AgentTaskGroup,
19
+ } from "./components.js";
20
+ import { AgentKitProvider } from "./context.js";
21
+
22
+ const threadId = "thread-subagent";
23
+ const runId = "run-subagent";
24
+ const app = { id: "Brain", kind: "agent", label: "Brain" };
25
+
26
+ type EventBody = AgentEvent extends infer Event
27
+ ? Event extends AgentEvent
28
+ ? Omit<Event, "id" | "threadId" | "runId" | "sequence" | "occurredAt">
29
+ : never
30
+ : never;
31
+
32
+ function threadFrom(bodies: EventBody[]): AgentThreadState {
33
+ let thread = createAgentThreadState(threadId);
34
+ bodies.forEach((body, index) => {
35
+ thread = reduceAgentEvent(thread, {
36
+ ...body,
37
+ id: `event-${index + 1}`,
38
+ threadId,
39
+ runId,
40
+ sequence: index + 1,
41
+ occurredAt: `2026-11-11T00:00:${String(index + 1).padStart(2, "0")}.000Z`,
42
+ } as AgentEvent);
43
+ });
44
+ return thread;
45
+ }
46
+
47
+ function controllerFor(thread: AgentThreadState): AgentKitController {
48
+ const snapshot: AgentKitSnapshot = {
49
+ connection: "connected",
50
+ capabilities: {},
51
+ capabilitiesStatus: "ready",
52
+ threads: { [threadId]: thread },
53
+ revision: 0,
54
+ };
55
+ return {
56
+ getSnapshot: () => snapshot,
57
+ subscribe: () => () => undefined,
58
+ getThread: () => thread,
59
+ loadThread: vi.fn(async () => thread),
60
+ } as unknown as AgentKitController;
61
+ }
62
+
63
+ const delegation: EventBody[] = [
64
+ { type: "run.started" },
65
+ {
66
+ type: "agent.registered",
67
+ agent: {
68
+ id: "call-1",
69
+ name: "Brain",
70
+ kind: "delegated-agent",
71
+ status: "working",
72
+ activeTaskId: "task-1",
73
+ origin: app,
74
+ },
75
+ },
76
+ {
77
+ type: "agent.interaction",
78
+ interaction: {
79
+ id: "call-1:delegated:1",
80
+ kind: "delegated",
81
+ agentId: "call-1",
82
+ scope: "external",
83
+ source: app,
84
+ },
85
+ },
86
+ {
87
+ type: "task.created",
88
+ task: {
89
+ id: "task-1",
90
+ title: "Summarize the release notes",
91
+ kind: "delegated-agent",
92
+ status: "running",
93
+ assignedAgentId: "call-1",
94
+ source: app,
95
+ },
96
+ },
97
+ {
98
+ type: "tool.started",
99
+ toolCall: {
100
+ id: "call-1-search",
101
+ name: "search-docs",
102
+ status: "running",
103
+ agentId: "call-1",
104
+ },
105
+ },
106
+ {
107
+ type: "agent.interaction",
108
+ interaction: {
109
+ id: "call-1:message:2",
110
+ kind: "messaged",
111
+ agentId: "call-1",
112
+ detail: "Found the runtime boundary.",
113
+ scope: "external",
114
+ source: app,
115
+ },
116
+ },
117
+ {
118
+ type: "activity.started",
119
+ activity: {
120
+ id: "call-1:progress",
121
+ kind: "agent",
122
+ label: "processing",
123
+ detail: "Reading the contract",
124
+ status: "running",
125
+ agentId: "call-1",
126
+ scope: "external",
127
+ source: app,
128
+ },
129
+ },
130
+ ];
131
+
132
+ describe("AgentSubagentStep", () => {
133
+ let container: HTMLDivElement;
134
+ let root: Root;
135
+
136
+ beforeEach(() => {
137
+ vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
138
+ container = document.createElement("div");
139
+ document.body.appendChild(container);
140
+ root = createRoot(container);
141
+ });
142
+
143
+ afterEach(() => {
144
+ act(() => root.unmount());
145
+ container.remove();
146
+ vi.unstubAllGlobals();
147
+ });
148
+
149
+ const render = async (thread: AgentThreadState) => {
150
+ await act(async () => {
151
+ root.render(
152
+ <AgentKitProvider
153
+ controller={controllerFor(thread)}
154
+ threadId={threadId}
155
+ >
156
+ <AgentCollaborationFeed runId={runId} />
157
+ <AgentTaskGroup runId={runId} />
158
+ <AgentActivityGroup runId={runId} excludeAgentActivities />
159
+ </AgentKitProvider>,
160
+ );
161
+ });
162
+ };
163
+ const steps = () =>
164
+ Array.from(
165
+ container.querySelectorAll<HTMLElement>(".agentkit-subagent-step"),
166
+ );
167
+ const header = (step: HTMLElement) =>
168
+ step.querySelector<HTMLElement>(":scope > .agentkit-activity-row");
169
+ const toggle = async (step: HTMLElement) => {
170
+ await act(async () =>
171
+ step
172
+ .querySelector<HTMLElement>(
173
+ ":scope > .agentkit-activity-row .agentkit-disclosure-summary",
174
+ )
175
+ ?.click(),
176
+ );
177
+ };
178
+
179
+ it("folds a running delegation into one collapsed step", async () => {
180
+ await render(threadFrom(delegation));
181
+
182
+ expect(steps()).toHaveLength(1);
183
+ const [step] = steps();
184
+ if (!step) throw new Error("No subagent step");
185
+ expect(step.dataset.status).toBe("running");
186
+ const row = header(step);
187
+ expect(row?.querySelector(".agentkit-agent-name")?.textContent).toBe(
188
+ "Brain",
189
+ );
190
+ // The chip's shimmer is not the only sign it is working.
191
+ expect(
192
+ row?.querySelector(".agentkit-agent .agentkit-visually-hidden")
193
+ ?.textContent,
194
+ ).toBe("Running");
195
+ expect(row?.querySelector(".agentkit-activity-label")?.textContent).toBe(
196
+ "working",
197
+ );
198
+ // The task it was given is the headline, not its progress line.
199
+ expect(row?.querySelector(".agentkit-activity-detail")?.textContent).toBe(
200
+ "Summarize the release notes",
201
+ );
202
+ expect(container.querySelector(".agentkit-tasks")).toBeNull();
203
+ expect(
204
+ step.querySelector(".agentkit-subagent-content")?.getAttribute("hidden"),
205
+ ).toBe("until-found");
206
+ expect(container.textContent?.match(/Brain/g)).toHaveLength(1);
207
+ });
208
+
209
+ it("holds the agent's own calls and messages without repeating its name", async () => {
210
+ await render(threadFrom(delegation));
211
+ const [step] = steps();
212
+ if (!step) throw new Error("No subagent step");
213
+ await toggle(step);
214
+
215
+ const content = step.querySelector(".agentkit-subagent-content");
216
+ expect(content).not.toBeNull();
217
+ // Its call is here, not in the parent's work.
218
+ expect(
219
+ content?.querySelector('.agentkit-activity-item[data-status="running"]')
220
+ ?.textContent,
221
+ ).toContain("Search docs");
222
+ expect(
223
+ String(container.querySelector(".agentkit-activities")?.textContent),
224
+ ).not.toContain("Search docs");
225
+ // Its state is said in words, not only by the shimmer.
226
+ expect(
227
+ content?.querySelector(
228
+ '.agentkit-activity-item[data-status="running"] .agentkit-visually-hidden',
229
+ )?.textContent,
230
+ ).toBe("Running");
231
+ const message = content?.querySelector(
232
+ '.agentkit-agent-interaction[data-kind="messaged"]',
233
+ );
234
+ expect(message?.textContent).toContain("Found the runtime boundary");
235
+ // "delegated work" is what the row's status already says.
236
+ expect(content?.textContent).not.toContain("delegated work");
237
+ expect(content?.querySelector(".agentkit-agent")).toBeNull();
238
+ expect(container.textContent?.match(/Brain/g)).toHaveLength(1);
239
+
240
+ await toggle(step);
241
+ expect(
242
+ step.querySelector(".agentkit-subagent-content")?.getAttribute("hidden"),
243
+ ).toBe("until-found");
244
+ });
245
+
246
+ it("shows how long a finished agent worked and its result in place", async () => {
247
+ await render(
248
+ threadFrom([
249
+ ...delegation,
250
+ {
251
+ type: "activity.completed",
252
+ activity: {
253
+ id: "call-1:activity",
254
+ kind: "agent",
255
+ label: "finished",
256
+ status: "completed",
257
+ agentId: "call-1",
258
+ scope: "external",
259
+ source: app,
260
+ summary: [
261
+ {
262
+ type: "text",
263
+ text: "- **search-docs** `release` · done",
264
+ format: "markdown",
265
+ },
266
+ {
267
+ type: "text",
268
+ text: "The release adds a Subagent step.",
269
+ format: "markdown",
270
+ },
271
+ ],
272
+ },
273
+ },
274
+ {
275
+ type: "agent.updated",
276
+ agent: {
277
+ id: "call-1",
278
+ name: "Brain",
279
+ kind: "delegated-agent",
280
+ status: "completed",
281
+ origin: app,
282
+ metadata: { durationMs: 8_000 },
283
+ },
284
+ },
285
+ {
286
+ type: "agent.interaction",
287
+ interaction: {
288
+ id: "call-1:completed:3",
289
+ kind: "completed",
290
+ agentId: "call-1",
291
+ scope: "external",
292
+ source: app,
293
+ },
294
+ },
295
+ ]),
296
+ );
297
+ const [step] = steps();
298
+ if (!step) throw new Error("No subagent step");
299
+ expect(step.dataset.status).toBe("completed");
300
+ expect(
301
+ header(step)?.querySelector(".agentkit-activity-label")?.textContent,
302
+ ).toBe("worked for 8s");
303
+
304
+ await toggle(step);
305
+ const content = step.querySelector(".agentkit-subagent-content");
306
+ // The reply reads as text, not behind a second "finished" disclosure.
307
+ expect(content?.textContent).toContain("The release adds a Subagent step.");
308
+ expect(content?.querySelector('[data-activity-kind="agent"]')).toBeNull();
309
+ expect(content?.textContent).not.toContain("finished");
310
+ });
311
+
312
+ it("marks a failed agent amber with its reason on the row", async () => {
313
+ await render(
314
+ threadFrom([
315
+ ...delegation.slice(0, 3),
316
+ {
317
+ type: "agent.updated",
318
+ agent: {
319
+ id: "call-1",
320
+ name: "Brain",
321
+ kind: "delegated-agent",
322
+ status: "failed",
323
+ origin: app,
324
+ },
325
+ },
326
+ {
327
+ type: "agent.interaction",
328
+ interaction: {
329
+ id: "call-1:failed:2",
330
+ kind: "failed",
331
+ agentId: "call-1",
332
+ detail: "Needs setup first",
333
+ scope: "external",
334
+ source: app,
335
+ },
336
+ },
337
+ ]),
338
+ );
339
+ const [step] = steps();
340
+ if (!step) throw new Error("No subagent step");
341
+ expect(step.dataset.status).toBe("failed");
342
+ expect(
343
+ header(step)?.querySelector('[data-trace-status="error"]'),
344
+ ).not.toBeNull();
345
+ expect(
346
+ header(step)?.querySelector(
347
+ '.agentkit-agent[data-status="failed"] .tabler-icon-alert-triangle',
348
+ ),
349
+ ).not.toBeNull();
350
+ expect(
351
+ header(step)?.querySelector(".agentkit-activity-label")?.textContent,
352
+ ).toBe("needs attention");
353
+ expect(
354
+ step.querySelector(":scope > .agentkit-activity-error")?.textContent,
355
+ ).toBe("Needs setup first");
356
+ });
357
+
358
+ it("settles an agent still marked working once its run ends", async () => {
359
+ await render(threadFrom([...delegation, { type: "run.completed" }]));
360
+ const [step] = steps();
361
+ if (!step) throw new Error("No subagent step");
362
+ expect(step.dataset.status).toBe("completed");
363
+ expect(
364
+ header(step)
365
+ ?.querySelector(".agentkit-agent")
366
+ ?.getAttribute("data-status"),
367
+ ).toBe("completed");
368
+ expect(header(step)?.textContent).not.toContain("Running");
369
+ });
370
+
371
+ it("names a failed or stopped call in words", async () => {
372
+ await render(
373
+ threadFrom([
374
+ ...delegation.slice(0, 3),
375
+ {
376
+ type: "tool.started",
377
+ toolCall: {
378
+ id: "call-1-read",
379
+ name: "read-file",
380
+ status: "running",
381
+ agentId: "call-1",
382
+ },
383
+ },
384
+ {
385
+ type: "tool.updated",
386
+ toolCall: {
387
+ id: "call-1-read",
388
+ name: "read-file",
389
+ status: "failed",
390
+ agentId: "call-1",
391
+ error: { code: "denied", message: "Permission denied" },
392
+ },
393
+ },
394
+ {
395
+ type: "tool.started",
396
+ toolCall: {
397
+ id: "call-1-write",
398
+ name: "write-file",
399
+ status: "cancelled",
400
+ agentId: "call-1",
401
+ },
402
+ },
403
+ ]),
404
+ );
405
+ const [step] = steps();
406
+ if (!step) throw new Error("No subagent step");
407
+ await toggle(step);
408
+ const words = (status: string) =>
409
+ step.querySelector(
410
+ `.agentkit-activity-item[data-status="${status}"] .agentkit-visually-hidden`,
411
+ )?.textContent;
412
+ expect(words("failed")).toBe("Failed");
413
+ expect(words("cancelled")).toBe("Stopped");
414
+ // A failed call keeps its row; its error is that row's error line.
415
+ expect(
416
+ step.querySelector('.agentkit-activity-item[data-status="failed"]')
417
+ ?.textContent,
418
+ ).toContain("Read file");
419
+ });
420
+
421
+ it("keeps an agent's other tasks in the task list", async () => {
422
+ await render(
423
+ threadFrom([
424
+ ...delegation,
425
+ {
426
+ type: "task.created",
427
+ task: {
428
+ id: "task-2",
429
+ title: "Draft the changelog",
430
+ status: "pending",
431
+ assignedAgentId: "call-1",
432
+ },
433
+ },
434
+ ]),
435
+ );
436
+
437
+ // The step shows the active task; the agent's other task stays listed.
438
+ expect(
439
+ header(steps()[0] as HTMLElement)?.querySelector(
440
+ ".agentkit-activity-detail",
441
+ )?.textContent,
442
+ ).toBe("Summarize the release notes");
443
+ expect(container.querySelector(".agentkit-tasks-count")?.textContent).toBe(
444
+ "0 of 1 done",
445
+ );
446
+ await act(async () =>
447
+ container.querySelector<HTMLElement>(".agentkit-tasks-summary")?.click(),
448
+ );
449
+ expect(
450
+ Array.from(
451
+ container.querySelectorAll(".agentkit-task-title"),
452
+ (title) => title.textContent,
453
+ ),
454
+ ).toEqual(["Draft the changelog"]);
455
+ });
456
+
457
+ it("gives each delegated agent its own step", async () => {
458
+ await render(
459
+ threadFrom([
460
+ ...delegation,
461
+ {
462
+ type: "agent.registered",
463
+ agent: {
464
+ id: "call-2",
465
+ name: "Clips",
466
+ kind: "delegated-agent",
467
+ status: "working",
468
+ },
469
+ },
470
+ {
471
+ type: "activity.started",
472
+ activity: {
473
+ id: "call-2:progress",
474
+ kind: "agent",
475
+ label: "processing",
476
+ detail: "Finding the recording",
477
+ status: "running",
478
+ agentId: "call-2",
479
+ },
480
+ },
481
+ ]),
482
+ );
483
+ expect(steps().map((step) => step.dataset.agentId)).toEqual([
484
+ "call-1",
485
+ "call-2",
486
+ ]);
487
+ const second = steps()[1];
488
+ if (!second) throw new Error("No second step");
489
+ expect(
490
+ header(second)?.querySelector(".agentkit-activity-detail")?.textContent,
491
+ ).toBe("Finding the recording");
492
+ });
493
+ });
494
+
495
+ describe("AgentTaskGroup progress", () => {
496
+ let container: HTMLDivElement;
497
+ let root: Root;
498
+
499
+ beforeEach(() => {
500
+ vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
501
+ container = document.createElement("div");
502
+ document.body.appendChild(container);
503
+ root = createRoot(container);
504
+ });
505
+
506
+ afterEach(() => {
507
+ act(() => root.unmount());
508
+ container.remove();
509
+ vi.unstubAllGlobals();
510
+ });
511
+
512
+ it("says how many tasks are done, not only how many there are", async () => {
513
+ const statuses = [
514
+ "completed",
515
+ "completed",
516
+ "running",
517
+ "pending",
518
+ "failed",
519
+ ] as const;
520
+ const thread = threadFrom([
521
+ { type: "run.started" },
522
+ ...statuses.map(
523
+ (status, index): EventBody => ({
524
+ type: "task.created",
525
+ task: {
526
+ id: `task-${index}`,
527
+ title: `Task ${index + 1}`,
528
+ status,
529
+ ...(index === 2 ? { progress: { completed: 3, total: 4 } } : {}),
530
+ },
531
+ }),
532
+ ),
533
+ ]);
534
+ await act(async () => {
535
+ root.render(
536
+ <AgentKitProvider
537
+ controller={controllerFor(thread)}
538
+ threadId={threadId}
539
+ >
540
+ <AgentTaskGroup runId={runId} />
541
+ </AgentKitProvider>,
542
+ );
543
+ });
544
+ expect(container.querySelector(".agentkit-tasks-count")?.textContent).toBe(
545
+ "2 of 5 done",
546
+ );
547
+ await act(async () =>
548
+ container.querySelector<HTMLElement>(".agentkit-tasks-summary")?.click(),
549
+ );
550
+ expect(
551
+ container.querySelector(".agentkit-task-progress")?.textContent,
552
+ ).toBe("3 of 4 done");
553
+ });
554
+ });