@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
@@ -5,9 +5,10 @@ import { act } from "react";
5
5
  import { createRoot } from "react-dom/client";
6
6
  import { renderToStaticMarkup } from "react-dom/server";
7
7
  import { MemoryRouter } from "react-router";
8
- import { describe, expect, it } from "vitest";
8
+ import { afterEach, describe, expect, it } from "vitest";
9
9
 
10
10
  import { consumeFirstPaintPromptDraft } from "../../app-shell/first-paint-prompt-draft.js";
11
+ import { FIRST_RUN_PENDING_ATTRIBUTE } from "../onboarding/first-run-first-paint.js";
11
12
  import { AppShellSkeleton } from "./AppShellSkeleton.js";
12
13
  import type { AppShellFirstPaintHome } from "./AppShellSkeleton.js";
13
14
 
@@ -21,6 +22,64 @@ function render(layout: Parameters<typeof AppShellSkeleton>[0]["layout"]) {
21
22
  )!;
22
23
  }
23
24
 
25
+ function firstPaintFixture(): AppShellFirstPaintHome {
26
+ return {
27
+ appId: "slides",
28
+ appName: "Slides",
29
+ pageTitle: "Decks",
30
+ promptTitle: "Let's create your first presentation",
31
+ promptPlaceholder: "Describe your presentation",
32
+ suggestedPromptsLabel: "Suggested prompts",
33
+ sidebarItems: [{ label: "Decks", to: "/home", icon: IconHome }],
34
+ templatesLabel: "Templates",
35
+ recentLabel: "Recent",
36
+ browseAllLabel: "Browse all",
37
+ skipPromptLabel: "Skip prompt",
38
+ promptDraftScope: "slides:new:viewer-a:org-a",
39
+ promptHandoffScope: "viewer-a:org-a",
40
+ suggestions: [],
41
+ renderComposer: (props) => <textarea aria-label={props.ariaLabel} />,
42
+ };
43
+ }
44
+
45
+ describe("AppShellSkeleton first-paint home before first run", () => {
46
+ afterEach(() => {
47
+ document.documentElement.removeAttribute(FIRST_RUN_PENDING_ATTRIBUTE);
48
+ document.body.innerHTML = "";
49
+ });
50
+
51
+ function paint() {
52
+ document.body.innerHTML = renderToStaticMarkup(
53
+ <MemoryRouter>
54
+ <AppShellSkeleton
55
+ layout="prompt-library"
56
+ firstPaintHome={firstPaintFixture()}
57
+ />
58
+ </MemoryRouter>,
59
+ );
60
+ const display = (selector: string) =>
61
+ getComputedStyle(document.querySelector<HTMLElement>(selector)!).display;
62
+ return {
63
+ home: display("[data-agent-native-first-paint-home]"),
64
+ skeleton: display("[data-agent-native-first-run-skeleton]"),
65
+ };
66
+ }
67
+
68
+ it("paints the home when first run is not pending", () => {
69
+ expect(paint()).toEqual({ home: "contents", skeleton: "none" });
70
+ });
71
+
72
+ it("paints the plain skeleton instead of the home while first run is pending", () => {
73
+ document.documentElement.setAttribute(FIRST_RUN_PENDING_ATTRIBUTE, "");
74
+ expect(paint()).toEqual({ home: "none", skeleton: "contents" });
75
+ expect(
76
+ document.querySelector(
77
+ "[data-agent-native-first-run-skeleton] .agent-prompt-home-hero",
78
+ ),
79
+ ).toBeNull();
80
+ });
81
+ });
82
+
24
83
  describe("AppShellSkeleton home layout", () => {
25
84
  it("paints the home hero and resource footer beside the sidebar, with no header row", () => {
26
85
  const shell = render("home");
@@ -15,6 +15,7 @@ import { AgentSuggestionBar } from "../../composer/AgentSuggestionBar.js";
15
15
  import type { PromptComposerProps } from "../../composer/index.js";
16
16
  import type { TiptapComposerHandle } from "../../composer/TiptapComposer.js";
17
17
  import { Button } from "../../ui/button.js";
18
+ import { FIRST_RUN_PENDING_ATTRIBUTE } from "../onboarding/first-run-first-paint.js";
18
19
  import { AppSidebar, AppSidebarFooter } from "./AppSidebar.js";
19
20
  import { ClientOnly } from "./ClientOnly.js";
20
21
 
@@ -1598,7 +1599,30 @@ export function AppShellSkeleton({
1598
1599
  ),
1599
1600
  welcome: <WelcomeLayout />,
1600
1601
  };
1601
- const content = layout ? layouts[layout] : null;
1602
+ const layoutContent = layout ? layouts[layout] : null;
1603
+ // A first-paint home is the app's real home. When first run may start, the
1604
+ // role question comes next, so the plain skeleton stands in for it.
1605
+ const content =
1606
+ firstPaintHome && layout === "prompt-library" ? (
1607
+ <>
1608
+ <div
1609
+ data-agent-native-first-paint-home=""
1610
+ style={{ display: "contents" }}
1611
+ >
1612
+ {layoutContent}
1613
+ </div>
1614
+ <div
1615
+ data-agent-native-first-run-skeleton=""
1616
+ role="status"
1617
+ aria-label={ariaLabel}
1618
+ style={{ display: "none" }}
1619
+ >
1620
+ <PromptLibraryLayout />
1621
+ </div>
1622
+ </>
1623
+ ) : (
1624
+ layoutContent
1625
+ );
1602
1626
 
1603
1627
  return (
1604
1628
  <div
@@ -1619,6 +1643,12 @@ export function AppShellSkeleton({
1619
1643
  html[${MCP_APP_WIDGET_EMBED_ATTRIBUTE}] [data-agent-native-app-skeleton] > :not(style) {
1620
1644
  display: none !important;
1621
1645
  }
1646
+ html[${FIRST_RUN_PENDING_ATTRIBUTE}] [data-agent-native-first-paint-home] {
1647
+ display: none !important;
1648
+ }
1649
+ html[${FIRST_RUN_PENDING_ATTRIBUTE}] [data-agent-native-first-run-skeleton] {
1650
+ display: contents !important;
1651
+ }
1622
1652
  [data-agent-native-skeleton-block] {
1623
1653
  animation: an-app-shell-skeleton-pulse 1.2s ease-in-out infinite;
1624
1654
  }
@@ -1471,12 +1471,12 @@
1471
1471
  --agentkit-composer-primary-control-size,
1472
1472
  var(--agent-kit-composer-control-size)
1473
1473
  );
1474
- border-radius: 999px;
1474
+ border-radius: var(--agent-kit-radius-sm, 0.5rem);
1475
1475
  }
1476
1476
 
1477
1477
  .agent-composer-root:not(.agent-composer-root--hero)
1478
1478
  .agent-composer-send-button {
1479
- border-radius: 999px;
1479
+ border-radius: var(--agent-kit-radius-sm, 0.5rem);
1480
1480
  }
1481
1481
 
1482
1482
  /* 12px text: plain muted-foreground misses 4.5:1 on dark composer surfaces. */
@@ -231,10 +231,10 @@ describe("agent-native shell surface tokens", () => {
231
231
  );
232
232
 
233
233
  expect(tokens).toMatch(
234
- /:root\s*\{[\s\S]*?--agent-kit-composer-surface: var\(--agent-kit-raised-surface\);[\s\S]*?--agent-kit-composer-border-mix: 82%;[\s\S]*?--agent-kit-composer-focus-ring-mix: 40%;[\s\S]*?--agent-kit-composer-border-color: color-mix\([\s\S]*?--agent-kit-composer-focus-border-color: color-mix\(/s,
234
+ /:root\s*\{[\s\S]*?--agent-kit-composer-surface: var\(--agent-kit-raised-surface\);[\s\S]*?--agent-kit-composer-border-mix: 82%;[\s\S]*?--agent-kit-composer-focus-ring-mix: 70%;[\s\S]*?--agent-kit-composer-border-color: color-mix\([\s\S]*?--agent-kit-composer-focus-border-color: color-mix\(/s,
235
235
  );
236
236
  expect(tokens).toMatch(
237
- /:is\(\.dark, :root\[data-theme="dark"\]:not\(\.light\)\)\s*\{[\s\S]*?--agent-kit-composer-surface: var\(--agent-kit-subtle-surface\);[\s\S]*?--agent-kit-composer-border-mix: 80%;[\s\S]*?--agent-kit-composer-focus-ring-mix: 40%;[\s\S]*?--agent-kit-composer-border-color: color-mix\([\s\S]*?--agent-kit-composer-focus-border-color: color-mix\(/s,
237
+ /:is\(\.dark, :root\[data-theme="dark"\]:not\(\.light\)\)\s*\{[\s\S]*?--agent-kit-composer-surface: var\(--agent-kit-subtle-surface\);[\s\S]*?--agent-kit-composer-border-mix: 80%;[\s\S]*?--agent-kit-composer-focus-ring-mix: 70%;[\s\S]*?--agent-kit-composer-border-color: color-mix\([\s\S]*?--agent-kit-composer-focus-border-color: color-mix\(/s,
238
238
  );
239
239
  expect(css).toMatch(
240
240
  /background:\s*var\(\s*--agent-kit-composer-surface,\s*var\(--agent-kit-raised-surface\)\s*\);/,
@@ -14,10 +14,20 @@
14
14
  --agent-kit-accent: hsl(var(--primary));
15
15
  --agent-kit-accent-text: hsl(var(--primary-foreground));
16
16
  --agent-kit-danger: hsl(var(--destructive));
17
+ /* Themes size --destructive as a fill; as text it can sit under 3:1. */
18
+ --agent-kit-danger-text: color-mix(
19
+ in srgb,
20
+ hsl(var(--destructive)) 60%,
21
+ hsl(var(--foreground))
22
+ );
17
23
  --agent-kit-success: hsl(var(--success, var(--primary)));
18
24
  --agent-kit-warning-color: hsl(var(--agent-kit-warning));
19
25
  --agent-kit-focus: hsl(var(--ring));
26
+ --agent-kit-progress-color: hsl(217 91% 60%);
27
+ --agent-kit-diff-added-color: hsl(var(--agent-kit-positive));
28
+ --agent-kit-diff-removed-color: hsl(var(--destructive));
20
29
 
30
+ --agent-kit-body-font-size: 0.875rem;
21
31
  --agent-kit-density-font-size: 0.8125rem;
22
32
  --agent-kit-density-line-height: 1.25rem;
23
33
  --agent-kit-supporting-font-size: 0.75rem;
@@ -43,10 +53,16 @@
43
53
  --agent-kit-composer-block-padding-start: 0.5rem;
44
54
  --agent-kit-composer-block-padding-end: 1rem;
45
55
  --agent-kit-composer-min-height: 4.75rem;
46
- --agent-kit-composer-radius: 1.25rem;
56
+ /* agentkit/react/styles.css maps elements onto this scale. */
57
+ --agent-kit-radius-xs: 0.25rem;
58
+ --agent-kit-radius-sm: 0.5rem;
59
+ --agent-kit-radius-md: 0.75rem;
60
+ --agent-kit-radius-lg: 1rem;
61
+ --agent-kit-composer-radius: var(--agent-kit-radius-lg);
47
62
  --agent-kit-composer-surface: var(--agent-kit-raised-surface);
48
63
  --agent-kit-composer-border-mix: 82%;
49
- --agent-kit-composer-focus-ring-mix: 40%;
64
+ /* Keeps the focus border at 3:1+; the editor has no other focus indicator. */
65
+ --agent-kit-composer-focus-ring-mix: 70%;
50
66
  --agent-kit-composer-border-color: color-mix(
51
67
  in srgb,
52
68
  hsl(var(--border)) var(--agent-kit-composer-border-mix),
@@ -104,9 +120,10 @@
104
120
  }
105
121
 
106
122
  :is(.dark, :root[data-theme="dark"]:not(.light)) {
123
+ --agent-kit-progress-color: hsl(213 94% 68%);
107
124
  --agent-kit-composer-surface: var(--agent-kit-subtle-surface);
108
125
  --agent-kit-composer-border-mix: 80%;
109
- --agent-kit-composer-focus-ring-mix: 40%;
126
+ --agent-kit-composer-focus-ring-mix: 70%;
110
127
  --agent-kit-composer-border-color: color-mix(
111
128
  in srgb,
112
129
  hsl(var(--border)) var(--agent-kit-composer-border-mix),
@@ -68,7 +68,9 @@ describe("AgentSuggestionBar", () => {
68
68
  expect(buttons).toHaveLength(2);
69
69
  expect(bar?.className).toContain("py-2");
70
70
  expect(bar?.className).toContain("min-w-0");
71
- expect(buttons[0]?.className).toContain("rounded-full");
71
+ expect(buttons[0]?.className).toContain(
72
+ "rounded-[var(--agent-kit-radius-xs,0.25rem)]",
73
+ );
72
74
  expect(buttons[0]?.className).toContain("whitespace-nowrap");
73
75
  expect(buttons[0]?.className).not.toContain("max-w-");
74
76
  expect(buttons[0]?.className).toContain("text-foreground");
@@ -224,7 +224,10 @@ export function AgentSuggestionBar({
224
224
  key={index}
225
225
  aria-hidden="true"
226
226
  data-agent-suggestion-placeholder="true"
227
- className={cn("h-6 shrink-0 rounded-full", width)}
227
+ className={cn(
228
+ "h-6 shrink-0 rounded-[var(--agent-kit-radius-xs,0.25rem)]",
229
+ width,
230
+ )}
228
231
  />
229
232
  ))
230
233
  : items.map((suggestion, index) => (
@@ -252,7 +255,7 @@ export function AgentSuggestionBar({
252
255
  data-agent-suggestion-position={index + 1}
253
256
  // The scroller clips overflow, so the focus ring sits inside.
254
257
  className={cn(
255
- "agent-kit-caption-copy snap-start inline-flex h-6 shrink-0 items-center justify-center rounded-full border border-border bg-transparent px-2.5 py-0 text-center font-normal text-foreground shadow-none hover:bg-accent hover:text-accent-foreground focus-visible:ring-inset focus-visible:ring-offset-0 whitespace-nowrap",
258
+ "agent-kit-caption-copy snap-start inline-flex h-6 shrink-0 items-center justify-center rounded-[var(--agent-kit-radius-xs,0.25rem)] border border-border bg-transparent px-2.5 py-0 text-center font-normal text-foreground shadow-none hover:bg-accent hover:text-accent-foreground focus-visible:ring-inset focus-visible:ring-offset-0 whitespace-nowrap",
256
259
  size === "comfortable" && "h-8 px-3 text-sm",
257
260
  )}
258
261
  >
@@ -828,7 +828,7 @@ export function ComposerContextMenu({
828
828
  type="button"
829
829
  variant="ghost"
830
830
  size="icon"
831
- className="size-[var(--agentkit-composer-toolbar-control-size,1.5rem)] shrink-0 rounded-[var(--agentkit-composer-control-radius,var(--radius-md))] text-muted-foreground hover:text-foreground"
831
+ className="size-[var(--agentkit-composer-toolbar-control-size,1.5rem)] shrink-0 rounded-[var(--agentkit-composer-control-radius,var(--agent-kit-radius-xs,0.25rem))] text-muted-foreground hover:text-foreground aria-expanded:bg-accent aria-expanded:text-accent-foreground"
832
832
  data-agent-composer-slot="plus-button"
833
833
  disabled={disabled}
834
834
  aria-label={label}
@@ -924,7 +924,7 @@ export function ComposerContextMenu({
924
924
  <div
925
925
  role="presentation"
926
926
  aria-hidden="true"
927
- className="px-2 py-1 text-sm text-destructive"
927
+ className="px-2 py-1 text-sm agent-kit-tone-warning"
928
928
  >
929
929
  {searchError}
930
930
  </div>
@@ -973,7 +973,7 @@ export function ComposerContextMenu({
973
973
  <div
974
974
  role="presentation"
975
975
  aria-hidden="true"
976
- className="px-2 py-1 text-sm text-destructive"
976
+ className="px-2 py-1 text-sm agent-kit-tone-warning"
977
977
  >
978
978
  {integrationStatus.error}
979
979
  </div>
@@ -1050,7 +1050,7 @@ export function ComposerContextMenu({
1050
1050
  />
1051
1051
  )}
1052
1052
  {error && (
1053
- <span role="alert" className="text-xs text-destructive">
1053
+ <span role="alert" className="text-xs agent-kit-tone-warning">
1054
1054
  {error}
1055
1055
  </span>
1056
1056
  )}
@@ -104,7 +104,10 @@ export function ComposerContextPicker({
104
104
  <>
105
105
  {actionError && (
106
106
  <>
107
- <div role="alert" className="p-3 text-sm text-destructive">
107
+ <div
108
+ role="alert"
109
+ className="p-3 text-sm agent-kit-tone-warning"
110
+ >
108
111
  {actionError.message}
109
112
  </div>
110
113
  {actionError.retry && (
@@ -133,7 +136,10 @@ export function ComposerContextPicker({
133
136
  <>
134
137
  {error ? (
135
138
  <>
136
- <div role="alert" className="p-3 text-sm text-destructive">
139
+ <div
140
+ role="alert"
141
+ className="p-3 text-sm agent-kit-tone-warning"
142
+ >
137
143
  {error}
138
144
  </div>
139
145
  {retry && (
@@ -164,7 +164,7 @@ export function ComposerContextPickerDialog({
164
164
  </div>
165
165
  <CommandList aria-label={title}>
166
166
  {loading || searchPending ? null : error ? (
167
- <div role="alert" className="p-3 text-destructive">
167
+ <div role="alert" className="p-3 agent-kit-tone-warning">
168
168
  {error}
169
169
  </div>
170
170
  ) : !items.length ? null : (
@@ -289,7 +289,10 @@ export function ComposerContextPickerDialog({
289
289
  }}
290
290
  />
291
291
  {validation && (
292
- <p id={`${id}-validation`} className="text-sm text-destructive">
292
+ <p
293
+ id={`${id}-validation`}
294
+ className="text-sm agent-kit-tone-warning"
295
+ >
293
296
  {validation}
294
297
  </p>
295
298
  )}
@@ -15,6 +15,7 @@ import {
15
15
  TooltipTrigger,
16
16
  } from "../ui/tooltip.js";
17
17
  import { cn } from "../utils.js";
18
+ import { COMPOSER_POPOVER_SURFACE_CLASS } from "./popover-surface.js";
18
19
 
19
20
  export interface ComposerModeOption {
20
21
  /** Stable host-defined mode identifier. */
@@ -75,7 +76,7 @@ export function ComposerModePicker({
75
76
  side="top"
76
77
  align="start"
77
78
  collisionPadding={8}
78
- className="agent-composer-mode-picker-menu min-w-48"
79
+ className={`agent-composer-mode-picker-menu min-w-48 ${COMPOSER_POPOVER_SURFACE_CLASS}`}
79
80
  >
80
81
  {/* Hosts may render this picker outside a TooltipProvider. */}
81
82
  <TooltipProvider>
@@ -497,7 +497,7 @@ export function useComposerDefaultActions({
497
497
  className={cn(
498
498
  "break-words text-xs",
499
499
  skillUploadStatus.kind === "err"
500
- ? "text-destructive"
500
+ ? "agent-kit-tone-warning"
501
501
  : "text-muted-foreground",
502
502
  )}
503
503
  >
@@ -30,7 +30,7 @@ export function MentionChip({
30
30
  <span
31
31
  {...props}
32
32
  className={cn(
33
- "mx-0.5 inline-flex max-w-[200px] items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 align-middle text-xs font-medium text-foreground",
33
+ "mx-1 inline-flex max-w-[200px] items-center h-5 gap-1 rounded-[var(--agent-kit-radius-xs,0.25rem)] border border-border bg-muted/50 px-2 text-xs leading-4 font-medium text-foreground align-middle",
34
34
  className,
35
35
  )}
36
36
  >
@@ -1,10 +1,11 @@
1
1
  // @vitest-environment happy-dom
2
2
 
3
- import { act } from "react";
3
+ import { act, createRef } from "react";
4
4
  import { createRoot, type Root } from "react-dom/client";
5
5
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
6
 
7
- import { MentionPopover } from "./MentionPopover.js";
7
+ import { MentionPopover, type MentionPopoverRef } from "./MentionPopover.js";
8
+ import { ComposerRuntimeAdaptersProvider } from "./runtime-adapters.js";
8
9
  import type { MentionItem } from "./types.js";
9
10
 
10
11
  let container: HTMLDivElement;
@@ -74,3 +75,108 @@ describe("mention sections", () => {
74
75
  expect(rowLabels(true)).toEqual(["Alice", "Claude Haiku 5.5"]);
75
76
  });
76
77
  });
78
+
79
+ describe("listbox semantics", () => {
80
+ it("exposes the rows as options and reports the highlighted one", () => {
81
+ const popover = createRef<MentionPopoverRef>();
82
+ const onActiveOptionChange = vi.fn();
83
+ act(() => {
84
+ root.render(
85
+ <MentionPopover
86
+ ref={popover}
87
+ type="@"
88
+ position={{ top: 400, left: 0, width: 320 }}
89
+ mentionItems={items}
90
+ skills={[]}
91
+ isLoading={false}
92
+ query=""
93
+ onSelectMention={() => undefined}
94
+ onSelectSkill={() => undefined}
95
+ onClose={() => undefined}
96
+ listboxId="mentions"
97
+ onActiveOptionChange={onActiveOptionChange}
98
+ />,
99
+ );
100
+ });
101
+ const listbox = document.getElementById("mentions");
102
+ expect(listbox?.getAttribute("role")).toBe("listbox");
103
+ expect(listbox?.getAttribute("aria-label")).toBe("Add context");
104
+ const options = [...document.querySelectorAll('[role="option"]')];
105
+ expect(options.map((option) => option.id)).toEqual([
106
+ "mentions-option-0",
107
+ "mentions-option-1",
108
+ ]);
109
+ expect(
110
+ options.map((option) => option.getAttribute("aria-selected")),
111
+ ).toEqual(["true", "false"]);
112
+ const group = options[0]?.closest('[role="group"]');
113
+ expect(
114
+ document.getElementById(group?.getAttribute("aria-labelledby") ?? "")
115
+ ?.textContent,
116
+ ).toBe("Agents");
117
+ expect(onActiveOptionChange).toHaveBeenLastCalledWith("mentions-option-0");
118
+
119
+ act(() => popover.current?.moveDown());
120
+ expect(onActiveOptionChange).toHaveBeenLastCalledWith("mentions-option-1");
121
+ expect(
122
+ document
123
+ .getElementById("mentions-option-1")
124
+ ?.getAttribute("aria-selected"),
125
+ ).toBe("true");
126
+
127
+ act(() => root.render(<></>));
128
+ expect(onActiveOptionChange).toHaveBeenLastCalledWith(undefined);
129
+ });
130
+ });
131
+
132
+ describe("provider section names", () => {
133
+ it("translates a provider label that is a catalog key and keeps a plain one", () => {
134
+ const providerItems: MentionItem[] = [
135
+ {
136
+ id: "chat:1",
137
+ label: "Planning chat",
138
+ source: "chats",
139
+ refType: "chat",
140
+ section: "composerSources.group",
141
+ },
142
+ {
143
+ id: "mail:1",
144
+ label: "Weekly digest",
145
+ source: "mail",
146
+ refType: "email",
147
+ section: "Emails",
148
+ },
149
+ ];
150
+ act(() => {
151
+ root.render(
152
+ <ComposerRuntimeAdaptersProvider
153
+ adapters={{
154
+ translate: (key, options) =>
155
+ key === "composerSources.group"
156
+ ? "Conversations"
157
+ : String(options?.defaultValue ?? key),
158
+ }}
159
+ >
160
+ <MentionPopover
161
+ type="@"
162
+ position={{ top: 400, left: 0, width: 320 }}
163
+ mentionItems={providerItems}
164
+ skills={[]}
165
+ isLoading={false}
166
+ query=""
167
+ onSelectMention={() => undefined}
168
+ onSelectSkill={() => undefined}
169
+ onClose={() => undefined}
170
+ keepSectionOrder
171
+ />
172
+ </ComposerRuntimeAdaptersProvider>,
173
+ );
174
+ });
175
+ const headers = [...document.querySelectorAll('[role="group"]')].map(
176
+ (group) =>
177
+ document.getElementById(group.getAttribute("aria-labelledby") ?? "")
178
+ ?.textContent,
179
+ );
180
+ expect(headers).toEqual(["Conversations", "Emails"]);
181
+ });
182
+ });