@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
@@ -9,7 +9,7 @@ import {
9
9
  IconTool,
10
10
  IconX,
11
11
  IconClipboardList,
12
- IconAlertCircle,
12
+ IconAlertTriangle,
13
13
  IconLoader2,
14
14
  IconRefresh,
15
15
  } from "@tabler/icons-react";
@@ -26,6 +26,7 @@ import React, {
26
26
  useEffect,
27
27
  useLayoutEffect,
28
28
  useCallback,
29
+ useId,
29
30
  useImperativeHandle,
30
31
  useMemo,
31
32
  } from "react";
@@ -48,7 +49,6 @@ import {
48
49
  DropdownMenuSubTrigger,
49
50
  DropdownMenuTrigger,
50
51
  } from "../ui/dropdown-menu.js";
51
- import { Popover, PopoverAnchor, PopoverContent } from "../ui/popover.js";
52
52
  import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip.js";
53
53
  import { formatAttachmentError } from "./attachment-accept.js";
54
54
  import { ComposerNotice } from "./composer-notice.js";
@@ -78,16 +78,12 @@ import {
78
78
  isClaudeCodeAgentId,
79
79
  resolvePreferredAgentModel,
80
80
  } from "./model-selection.js";
81
- import {
82
- hasModelDetails,
83
- RecommendedBadge,
84
- ModelDetailsCard,
85
- } from "./ModelPickerParts.js";
86
81
  import {
87
82
  createPastedAttachmentFile,
88
83
  readClipboardPaste,
89
84
  shouldConvertClipboardToAttachment,
90
85
  } from "./pasted-text.js";
86
+ import { COMPOSER_POPOVER_SURFACE_CLASS } from "./popover-surface.js";
91
87
  import {
92
88
  AGENT_CHAT_INSERT_REFERENCE_EVENT,
93
89
  AGENT_CHAT_INSERT_REFERENCE_MESSAGE_TYPE,
@@ -532,10 +528,11 @@ function referenceFromComposerReference(
532
528
  name: ref.label,
533
529
  source: ref.source || "",
534
530
  refType: ref.refType,
535
- refId: ref.refId || undefined,
536
- slotKey: ref.slotKey,
537
- slotLabel: ref.slotLabel,
538
- metadata: ref.metadata,
531
+ // Chip attrs default to null; the run protocol rejects null optionals.
532
+ ...(ref.refId ? { refId: ref.refId } : {}),
533
+ ...(ref.slotKey ? { slotKey: ref.slotKey } : {}),
534
+ ...(ref.slotLabel ? { slotLabel: ref.slotLabel } : {}),
535
+ ...(ref.metadata ? { metadata: ref.metadata } : {}),
539
536
  };
540
537
  }
541
538
 
@@ -1135,7 +1132,7 @@ function ComposerChip({
1135
1132
  return (
1136
1133
  <span
1137
1134
  data-agent-composer-slot={slot}
1138
- className="inline-flex h-6 items-center gap-1 rounded-md border border-border bg-muted/50 px-1.5 text-xs font-medium text-foreground"
1135
+ className="inline-flex h-6 items-center gap-1 rounded-[var(--agent-kit-radius-xs,0.25rem)] border border-border bg-muted/50 px-1.5 text-xs font-medium text-foreground"
1139
1136
  >
1140
1137
  <Icon className="h-3 w-3 text-muted-foreground" />
1141
1138
  {label}
@@ -1143,7 +1140,7 @@ function ComposerChip({
1143
1140
  type="button"
1144
1141
  onClick={onRemove}
1145
1142
  aria-label={removeLabel}
1146
- className="-my-1 -me-1.5 flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-sm text-muted-foreground hover:text-foreground"
1143
+ className="-my-1 -me-1.5 flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-[var(--agent-kit-radius-xs,0.25rem)] text-muted-foreground hover:text-foreground"
1147
1144
  >
1148
1145
  <IconX aria-hidden="true" className="h-3 w-3" />
1149
1146
  </button>
@@ -1700,9 +1697,7 @@ export const MODEL_SELECTOR_POPOVER_STYLE = {
1700
1697
 
1701
1698
  type ModelPickerSection = "more" | "effort" | "image" | "agent" | "mode";
1702
1699
  const MODEL_PICKER_STACK_BELOW_PX = 544;
1703
- // The shared menu primitives as they come; only the stacking order and a
1704
- // scrollable height are added, since the composer sits above app overlays.
1705
- const MODEL_SELECTOR_MENU_CLASS = "z-[9999] overflow-y-auto";
1700
+ const MODEL_SELECTOR_MENU_CLASS = COMPOSER_POPOVER_SURFACE_CLASS;
1706
1701
  const MODEL_PICKER_TWO_LINE_ITEM_CLASS = "flex-col items-start gap-0 py-1.5";
1707
1702
 
1708
1703
  /**
@@ -1866,10 +1861,6 @@ interface ModelPickerRow {
1866
1861
  model: string;
1867
1862
  engine: string;
1868
1863
  label: string;
1869
- /** The card's title: the row's name without a provider suffix. */
1870
- cardName: string;
1871
- /** Marked with the Recommended badge (Auto). */
1872
- recommended?: boolean;
1873
1864
  description?: ComposerModelDescription | undefined;
1874
1865
  identity: string;
1875
1866
  recommendedRank?: number | undefined;
@@ -1938,7 +1929,6 @@ function ModelSelector({
1938
1929
  }) {
1939
1930
  const adapters = useComposerRuntimeAdapters();
1940
1931
  const t = adapters.translate;
1941
- const formatNumber = adapters.formatNumber;
1942
1932
  const reasoning = adapters.models?.reasoning;
1943
1933
  const engineNames = useMemo(
1944
1934
  () => engines.map((group) => group.engine),
@@ -2057,8 +2047,6 @@ function ModelSelector({
2057
2047
  const [openSection, setOpenSection] = useState<ModelPickerSection | null>(
2058
2048
  null,
2059
2049
  );
2060
- const [highlightedRow, setHighlightedRow] = useState<string | null>(null);
2061
- const [moreSide, setMoreSide] = useState<"left" | "right">("right");
2062
2050
  const sectionTriggerRefs = useRef<
2063
2051
  Partial<Record<ModelPickerSection, HTMLDivElement | null>>
2064
2052
  >({});
@@ -2068,7 +2056,6 @@ function ModelSelector({
2068
2056
  if (controlledOpen === undefined) setInternalOpen(nextOpen);
2069
2057
  if (!nextOpen) {
2070
2058
  setOpenSection(null);
2071
- setHighlightedRow(null);
2072
2059
  }
2073
2060
  onModelSelectorOpenChange?.(nextOpen);
2074
2061
  },
@@ -2141,7 +2128,6 @@ function ModelSelector({
2141
2128
  model: candidate,
2142
2129
  engine: group.engine,
2143
2130
  label,
2144
- cardName: label,
2145
2131
  description,
2146
2132
  identity: description?.catalogId ?? candidate,
2147
2133
  recommendedRank: description?.recommended
@@ -2181,8 +2167,6 @@ function ModelSelector({
2181
2167
  model: "auto",
2182
2168
  engine: autoModelGroup.engine,
2183
2169
  label: t("agentChat.composer.auto", { defaultValue: "Auto" }),
2184
- cardName: t("agentChat.composer.auto", { defaultValue: "Auto" }),
2185
- recommended: description?.recommended === true,
2186
2170
  description,
2187
2171
  identity: "auto",
2188
2172
  };
@@ -2270,8 +2254,7 @@ function ModelSelector({
2270
2254
  }
2271
2255
 
2272
2256
  // Two menus side by side need about 34rem; below that a submenu cannot
2273
- // clear the viewport on either side, so the sections stack in one menu and
2274
- // the model card, which needs the same room, stays hidden.
2257
+ // clear the viewport on either side, so the sections stack in one menu.
2275
2258
  const stacked =
2276
2259
  open &&
2277
2260
  typeof window !== "undefined" &&
@@ -2318,7 +2301,7 @@ function ModelSelector({
2318
2301
  {!onConnectProvider && builderFlow.error && (
2319
2302
  <p
2320
2303
  role="alert"
2321
- className="px-2 pb-2 agent-kit-caption-copy text-destructive"
2304
+ className="px-2 pb-2 agent-kit-caption-copy agent-kit-tone-warning"
2322
2305
  >
2323
2306
  {builderFlow.error}
2324
2307
  </p>
@@ -2378,7 +2361,7 @@ function ModelSelector({
2378
2361
  >
2379
2362
  <span className="min-w-0 flex-1 truncate">{agent.label}</span>
2380
2363
  {statusLabel ? (
2381
- <span className="ms-auto max-w-[6rem] shrink-0 truncate agent-kit-micro-copy text-muted-foreground/70">
2364
+ <span className="ms-auto max-w-[6rem] shrink-0 truncate agent-kit-micro-copy text-muted-foreground">
2382
2365
  {statusLabel}
2383
2366
  </span>
2384
2367
  ) : null}
@@ -2449,91 +2432,26 @@ function ModelSelector({
2449
2432
 
2450
2433
  const renderModelRow = (
2451
2434
  row: ModelPickerRow,
2452
- cardSide: "left" | "right",
2453
- options: { shortcut?: number; section?: ModelPickerSection } = {},
2435
+ options: { shortcut?: number } = {},
2454
2436
  ) => {
2455
- const { shortcut, section } = options;
2437
+ const { shortcut } = options;
2456
2438
  const selected = isSelectedRow(row);
2457
- const details = hasModelDetails(row.description)
2458
- ? row.description
2459
- : undefined;
2460
- const cardOpen = !stacked && details && highlightedRow === row.key;
2461
- const cardId = `${row.key}-card`;
2462
- const item = (
2439
+ return (
2463
2440
  <DropdownMenuItem
2464
2441
  key={row.key}
2465
2442
  role="menuitemradio"
2466
2443
  aria-checked={selected}
2467
- aria-describedby={cardOpen ? cardId : undefined}
2444
+ // Digits 1-9 pick these rows; announced, not printed beside every name.
2445
+ aria-keyshortcuts={shortcut === undefined ? undefined : `${shortcut}`}
2468
2446
  data-agent-composer-model-row={row.model}
2469
2447
  onSelect={() => selectModel(row.model, row.engine)}
2470
- onFocus={(event) => {
2471
- setHighlightedRow(row.key);
2472
- // A submenu row's card goes on the far side of its submenu.
2473
- const side = event.currentTarget
2474
- .closest("[data-agent-composer-model-panel]")
2475
- ?.getAttribute("data-side");
2476
- if (side === "left" || side === "right") setMoreSide(side);
2477
- }}
2478
- onBlur={() =>
2479
- setHighlightedRow((current) => (current === row.key ? null : current))
2480
- }
2481
2448
  >
2482
- <span className="flex min-w-0 flex-1 items-center gap-2">
2483
- <span className="truncate">{row.label}</span>
2484
- {row.recommended ? <RecommendedBadge t={t} /> : null}
2485
- </span>
2486
- {shortcut !== undefined ? (
2487
- // One trailing column: the current row's check takes the place of
2488
- // its number, at the same width, so no row shifts.
2489
- <DropdownMenuShortcut>
2490
- {selected ? <IconCheck aria-hidden="true" /> : shortcut}
2491
- </DropdownMenuShortcut>
2492
- ) : (
2493
- <DropdownMenuTrailing>
2494
- {selected ? <IconCheck aria-hidden="true" /> : null}
2495
- </DropdownMenuTrailing>
2496
- )}
2449
+ <span className="min-w-0 flex-1 truncate">{row.label}</span>
2450
+ <DropdownMenuTrailing>
2451
+ {selected ? <IconCheck aria-hidden="true" /> : null}
2452
+ </DropdownMenuTrailing>
2497
2453
  </DropdownMenuItem>
2498
2454
  );
2499
- if (!details || stacked) return item;
2500
- return (
2501
- <Popover key={row.key} open={Boolean(cardOpen)}>
2502
- <PopoverAnchor asChild>{item}</PopoverAnchor>
2503
- <PopoverContent
2504
- id={cardId}
2505
- role="tooltip"
2506
- side={cardSide}
2507
- align="start"
2508
- sideOffset={8}
2509
- collisionPadding={8}
2510
- // The card describes the focused row; focus stays in the menu.
2511
- onOpenAutoFocus={(event) => event.preventDefault()}
2512
- onCloseAutoFocus={(event) => event.preventDefault()}
2513
- // The card is the top layer, so it receives the Escape meant for
2514
- // the menu under it: close that menu, one level at a time.
2515
- onEscapeKeyDown={(event) => {
2516
- if (!section) {
2517
- setPickerOpen(false);
2518
- return;
2519
- }
2520
- event.preventDefault();
2521
- setHighlightedRow(null);
2522
- setOpenSection(null);
2523
- sectionTriggerRefs.current[section]?.focus();
2524
- }}
2525
- data-agent-native-composer-popover="true"
2526
- className="pointer-events-none z-[9999]"
2527
- >
2528
- <ModelDetailsCard
2529
- name={row.cardName}
2530
- description={details}
2531
- t={t}
2532
- formatNumber={formatNumber}
2533
- />
2534
- </PopoverContent>
2535
- </Popover>
2536
- );
2537
2455
  };
2538
2456
 
2539
2457
  const showModelList =
@@ -2572,24 +2490,20 @@ function ModelSelector({
2572
2490
  defaultValue: "No OpenAI models configured",
2573
2491
  })}
2574
2492
  </span>
2575
- <span className="shrink-0 agent-kit-caption-copy text-muted-foreground/70">
2493
+ <span className="shrink-0 agent-kit-caption-copy text-muted-foreground">
2576
2494
  Configure
2577
2495
  </span>
2578
2496
  </DropdownMenuItem>
2579
2497
  )}
2580
2498
  {shortcutRows.map((row, index) =>
2581
- renderModelRow(row, "left", { shortcut: index + 1 }),
2499
+ renderModelRow(row, { shortcut: index + 1 }),
2582
2500
  )}
2583
2501
  </>
2584
2502
  );
2585
2503
 
2586
2504
  const moreItems =
2587
2505
  moreRows.length > 0 ? (
2588
- <>
2589
- {moreRows.map((row) =>
2590
- renderModelRow(row, moreSide, stacked ? {} : { section: "more" }),
2591
- )}
2592
- </>
2506
+ <>{moreRows.map((row) => renderModelRow(row))}</>
2593
2507
  ) : null;
2594
2508
 
2595
2509
  const imageItems =
@@ -2651,11 +2565,8 @@ function ModelSelector({
2651
2565
  setPickerOpen(false);
2652
2566
  }}
2653
2567
  >
2654
- <span className="flex min-w-0 flex-1 items-center gap-2">
2655
- <span className="truncate">{effortLabel(level)}</span>
2656
- {level === providerDefaultEffort ? (
2657
- <RecommendedBadge t={t} />
2658
- ) : null}
2568
+ <span className="min-w-0 flex-1 truncate">
2569
+ {effortLabel(level)}
2659
2570
  </span>
2660
2571
  <DropdownMenuTrailing>
2661
2572
  {selected ? <IconCheck aria-hidden="true" /> : null}
@@ -2818,7 +2729,7 @@ function ModelSelector({
2818
2729
  })}: ${effortValueLabel}`
2819
2730
  : ""
2820
2731
  }`}
2821
- className="agent-composer-model-button flex min-w-[var(--agentkit-composer-model-min-width,min(8rem,100%))] max-w-[var(--agentkit-composer-model-max-width,none)] shrink items-center gap-1 overflow-hidden rounded-[var(--agentkit-composer-control-radius,var(--radius-md))] px-[var(--agentkit-composer-toolbar-control-padding-inline,0.5rem)] py-1 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground"
2732
+ className="agent-composer-model-button flex min-w-[var(--agentkit-composer-model-min-width,min(8rem,100%))] max-w-[var(--agentkit-composer-model-max-width,none)] shrink items-center gap-1 overflow-hidden rounded-[var(--agentkit-composer-control-radius,var(--agent-kit-radius-xs,0.25rem))] px-[var(--agentkit-composer-toolbar-control-padding-inline,0.5rem)] py-1 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground aria-expanded:bg-accent/50 aria-expanded:text-foreground"
2822
2733
  >
2823
2734
  <span className="agent-composer-model-name min-w-0 truncate text-foreground">
2824
2735
  {selectedAgentOption?.icon ? (
@@ -3097,6 +3008,10 @@ function TiptapComposerSurface({
3097
3008
  id: string;
3098
3009
  } | null>(null);
3099
3010
  const popoverRef = useRef<MentionPopoverRef>(null);
3011
+ const mentionListboxId = useId();
3012
+ const [activeMentionOptionId, setActiveMentionOptionId] = useState<
3013
+ string | undefined
3014
+ >(undefined);
3100
3015
  const composerRuntime = useComposerRuntime();
3101
3016
  const lastComposerRuntimeSyncRef = useRef<{
3102
3017
  text: string;
@@ -3787,6 +3702,7 @@ function TiptapComposerSurface({
3787
3702
  attributes: {
3788
3703
  "aria-label": ariaLabel ?? resolvedPlaceholder,
3789
3704
  "aria-multiline": "true",
3705
+ "aria-autocomplete": "list",
3790
3706
  // Context controls can be off while the editor still takes a draft.
3791
3707
  "aria-disabled": String(editorLocked),
3792
3708
  role: "textbox",
@@ -3794,8 +3710,10 @@ function TiptapComposerSurface({
3794
3710
  "data-agent-composer-slot": "editor-input",
3795
3711
  // Page-level paste listeners defer to a composer that claims pastes.
3796
3712
  ...(onPasteContext ? { "data-claims-paste": "true" } : {}),
3713
+ // Each paragraph takes its direction from its first letter; an empty
3714
+ // draft keeps the page's direction for the placeholder.
3797
3715
  class:
3798
- "agent-composer-prosemirror flex-1 resize-none bg-transparent text-[length:var(--agentkit-composer-font-size,0.875rem)] text-foreground outline-none leading-[var(--agentkit-composer-line-height,1.625rem)] min-h-[var(--agentkit-composer-editor-min-height,3.25rem)] max-h-[var(--agentkit-composer-editor-max-height,10rem)] overflow-y-auto [&>p.is-editor-empty:first-child]:before:pointer-events-none [&>p.is-editor-empty:first-child]:before:float-start [&>p.is-editor-empty:first-child]:before:h-0 [&>p.is-editor-empty:first-child]:before:text-muted-foreground [&>p.is-editor-empty:first-child]:before:content-[attr(data-placeholder)]",
3716
+ "agent-composer-prosemirror [&>*]:[unicode-bidi:plaintext] flex-1 resize-none bg-transparent text-[length:var(--agentkit-composer-font-size,0.875rem)] text-foreground outline-none leading-[var(--agentkit-composer-line-height,1.625rem)] min-h-[var(--agentkit-composer-editor-min-height,3.25rem)] max-h-[var(--agentkit-composer-editor-max-height,10rem)] overflow-y-auto [&>p.is-editor-empty:first-child]:before:pointer-events-none [&>p.is-editor-empty:first-child]:before:float-start [&>p.is-editor-empty:first-child]:before:h-0 [&>p.is-editor-empty:first-child]:before:text-muted-foreground [&>p.is-editor-empty:first-child]:before:content-[attr(data-placeholder)]",
3799
3717
  },
3800
3718
  handleDOMEvents: {
3801
3719
  compositionstart: () => {
@@ -4901,25 +4819,7 @@ function TiptapComposerSurface({
4901
4819
  source: node.attrs.source || "codebase",
4902
4820
  });
4903
4821
  } else if (node.type.name === "mentionReference") {
4904
- const refType = node.attrs.refType;
4905
- references.push({
4906
- type:
4907
- refType === "file"
4908
- ? "file"
4909
- : refType === "agent"
4910
- ? "agent"
4911
- : refType === "custom-agent"
4912
- ? "custom-agent"
4913
- : "mention",
4914
- path: node.attrs.refPath || "",
4915
- name: node.attrs.label,
4916
- source: node.attrs.source,
4917
- refType: node.attrs.refType,
4918
- refId: node.attrs.refId,
4919
- slotKey: node.attrs.slotKey,
4920
- slotLabel: node.attrs.slotLabel,
4921
- metadata: node.attrs.metadata,
4922
- });
4822
+ references.push(referenceFromComposerReference(node.attrs));
4923
4823
  } else if (node.type.name === "skillReference") {
4924
4824
  references.push({
4925
4825
  type: "skill",
@@ -6478,6 +6378,18 @@ function TiptapComposerSurface({
6478
6378
  });
6479
6379
  }, [editor, editorLocked]);
6480
6380
 
6381
+ // The editor ignores attributes it did not set, so these follow the panel without a re-render.
6382
+ const mentionPanelOpen = popover !== null;
6383
+ useEffect(() => {
6384
+ if (!isComposerEditorUsable(editor)) return;
6385
+ const dom = editor.view.dom;
6386
+ if (mentionPanelOpen) dom.setAttribute("aria-controls", mentionListboxId);
6387
+ else dom.removeAttribute("aria-controls");
6388
+ if (mentionPanelOpen && activeMentionOptionId)
6389
+ dom.setAttribute("aria-activedescendant", activeMentionOptionId);
6390
+ else dom.removeAttribute("aria-activedescendant");
6391
+ }, [editor, mentionPanelOpen, mentionListboxId, activeMentionOptionId]);
6392
+
6481
6393
  const launchersDisabled = disabled || contextControlsDisabled;
6482
6394
 
6483
6395
  const contextLauncherItems = useMemo(() => {
@@ -6696,7 +6608,7 @@ function TiptapComposerSurface({
6696
6608
  {slotReferences.map((ref) => (
6697
6609
  <span
6698
6610
  key={ref.slotKey}
6699
- className="inline-flex max-w-full items-center gap-1.5 rounded-md border border-border bg-background px-2 py-0.5 agent-kit-caption-copy font-medium text-foreground shadow-sm"
6611
+ className="inline-flex h-5 max-w-full items-center gap-1 rounded-[var(--agent-kit-radius-xs,0.25rem)] border border-border bg-background px-2 text-xs leading-4 font-medium text-foreground shadow-sm"
6700
6612
  >
6701
6613
  <MentionItemMedia
6702
6614
  media={ref.media}
@@ -6723,7 +6635,7 @@ function TiptapComposerSurface({
6723
6635
  defaultValue: "Remove {{name}} reference",
6724
6636
  name: slotReferenceTitle(ref),
6725
6637
  })}
6726
- className="-my-1 -me-1.5 flex size-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground"
6638
+ className="-my-1 -me-1.5 flex size-6 shrink-0 items-center justify-center rounded-[var(--agent-kit-radius-xs,0.25rem)] text-muted-foreground hover:bg-accent hover:text-foreground"
6727
6639
  >
6728
6640
  <IconX aria-hidden="true" className="h-3 w-3" />
6729
6641
  </button>
@@ -6738,7 +6650,7 @@ function TiptapComposerSurface({
6738
6650
  data-state={
6739
6651
  selectedContextItemKey === item.key ? "selected" : undefined
6740
6652
  }
6741
- className={`inline-flex max-w-full items-center gap-1.5 rounded-md border px-2 py-0.5 agent-kit-caption-copy font-medium text-foreground ${
6653
+ className={`inline-flex h-5 max-w-full items-center gap-1 rounded-[var(--agent-kit-radius-xs,0.25rem)] border px-2 text-xs leading-4 font-medium text-foreground ${
6742
6654
  selectedContextItemKey === item.key
6743
6655
  ? "border-ring bg-accent ring-2 ring-ring/40"
6744
6656
  : "border-border bg-muted/50"
@@ -6752,16 +6664,20 @@ function TiptapComposerSurface({
6752
6664
  className="size-3 shrink-0 animate-spin motion-reduce:animate-none text-muted-foreground"
6753
6665
  />
6754
6666
  ) : item.status === "error" ? (
6755
- <IconAlertCircle
6667
+ <IconAlertTriangle
6756
6668
  aria-label={t("agentChat.composer.contextError", {
6757
6669
  defaultValue: "Context failed",
6758
6670
  })}
6759
- className="size-3 shrink-0 text-destructive"
6671
+ className="size-3 shrink-0 text-[hsl(var(--agent-kit-warning))]"
6760
6672
  />
6761
6673
  ) : (
6762
6674
  <IconClipboardList className="h-3 w-3 shrink-0 text-muted-foreground" />
6763
6675
  )}
6764
6676
  <span className="min-w-0 truncate">{item.title}</span>
6677
+ {/* A title attribute only reaches a pointer, so the reason is read here. */}
6678
+ {item.status === "error" && item.statusMessage ? (
6679
+ <span className="sr-only">{item.statusMessage}</span>
6680
+ ) : null}
6765
6681
  {onRemoveContextItem && item.removable !== false ? (
6766
6682
  <button
6767
6683
  type="button"
@@ -6774,7 +6690,7 @@ function TiptapComposerSurface({
6774
6690
  defaultValue: "Remove {{name}} context",
6775
6691
  name: item.title,
6776
6692
  })}
6777
- className="-my-1 -me-1.5 flex size-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground"
6693
+ className="-my-1 -me-1.5 flex size-6 shrink-0 items-center justify-center rounded-[var(--agent-kit-radius-xs,0.25rem)] text-muted-foreground hover:bg-accent hover:text-foreground"
6778
6694
  >
6779
6695
  <IconX aria-hidden="true" className="h-3 w-3" />
6780
6696
  </button>
@@ -6790,7 +6706,7 @@ function TiptapComposerSurface({
6790
6706
  defaultValue: "Retry {{name}} context",
6791
6707
  name: item.title,
6792
6708
  })}
6793
- className="flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground"
6709
+ className="flex size-6 shrink-0 items-center justify-center rounded-[var(--agent-kit-radius-xs,0.25rem)] text-muted-foreground hover:bg-accent hover:text-foreground"
6794
6710
  >
6795
6711
  <IconRefresh aria-hidden="true" className="size-3.5" />
6796
6712
  </button>
@@ -6800,6 +6716,11 @@ function TiptapComposerSurface({
6800
6716
  defaultValue: "Retry {{name}} context",
6801
6717
  name: item.title,
6802
6718
  })}
6719
+ {item.statusMessage ? (
6720
+ <span className="block text-muted-foreground">
6721
+ {item.statusMessage}
6722
+ </span>
6723
+ ) : null}
6803
6724
  </TooltipContent>
6804
6725
  </Tooltip>
6805
6726
  ) : null}
@@ -7027,6 +6948,8 @@ function TiptapComposerSurface({
7027
6948
  onSelectSkill={handleSelectSkill}
7028
6949
  onSelectCommand={handleSelectCommand}
7029
6950
  onClose={closePopover}
6951
+ listboxId={mentionListboxId}
6952
+ onActiveOptionChange={setActiveMentionOptionId}
7030
6953
  />
7031
6954
  </>
7032
6955
  );
@@ -32,6 +32,8 @@ export interface VoiceButtonProps {
32
32
  className?: string;
33
33
  /** Show a live voice-chat session's controls in this slot (default: true). */
34
34
  voiceChat?: boolean;
35
+ /** Name the ⌘⇧M shortcut (default: true); off outside the composer, which it dictates into. */
36
+ showShortcut?: boolean;
35
37
  }
36
38
 
37
39
  /**
@@ -45,6 +47,7 @@ export function VoiceButton({
45
47
  disabled,
46
48
  className,
47
49
  voiceChat = true,
50
+ showShortcut = true,
48
51
  }: VoiceButtonProps) {
49
52
  const t = useComposerRuntimeAdapters().translate;
50
53
  const realtimeVoice = useRealtimeVoiceModeOptional();
@@ -61,10 +64,12 @@ export function VoiceButton({
61
64
  }
62
65
 
63
66
  const shortcut = supportChecked && isMac ? "⌘⇧M" : "Ctrl+Shift+M";
64
- const label = t("agentChat.voice.dictation.start", {
65
- shortcut,
66
- defaultValue: `Dictate (${shortcut})`,
67
- });
67
+ const label = showShortcut
68
+ ? t("agentChat.voice.dictation.start", {
69
+ shortcut,
70
+ defaultValue: `Dictate (${shortcut})`,
71
+ })
72
+ : t("agentChat.voice.dictation.startPlain", { defaultValue: "Dictate" });
68
73
 
69
74
  return (
70
75
  <Tooltip>
@@ -180,7 +185,7 @@ export function VoiceDictationPill({ voice }: VoiceRecordingOverlayProps) {
180
185
  aria-label={t("agentChat.voice.dictation.recording", {
181
186
  defaultValue: "Dictating",
182
187
  })}
183
- className="flex h-[var(--agentkit-composer-toolbar-control-size,1.5rem)] w-[4.5rem] shrink-0 items-center justify-between gap-1.5 overflow-hidden rounded-full bg-muted ps-2.5 pe-0.5 text-foreground transition-[width,background-color] duration-150 ease-out starting:w-[var(--agentkit-composer-toolbar-control-size,1.5rem)] starting:bg-transparent motion-reduce:transition-none"
188
+ className="flex h-[var(--agentkit-composer-toolbar-control-size,1.5rem)] w-[4.5rem] shrink-0 items-center justify-between gap-1.5 overflow-hidden rounded-[var(--agent-kit-radius-xs,0.25rem)] bg-muted ps-2.5 pe-0.5 text-foreground transition-[width,background-color] duration-150 ease-out starting:w-[var(--agentkit-composer-toolbar-control-size,1.5rem)] starting:bg-transparent motion-reduce:transition-none"
184
189
  >
185
190
  {transcribing ? (
186
191
  <span
@@ -208,7 +213,7 @@ export function VoiceDictationPill({ voice }: VoiceRecordingOverlayProps) {
208
213
  data-agent-composer-slot="voice-stop"
209
214
  onClick={state === "recording" ? stop : cancel}
210
215
  aria-label={controlLabel}
211
- className="flex size-[calc(var(--agentkit-composer-toolbar-control-size,1.5rem)-0.25rem)] shrink-0 items-center justify-center rounded-full bg-foreground text-background transition-colors duration-150 hover:bg-foreground/80"
216
+ className="flex size-[calc(var(--agentkit-composer-toolbar-control-size,1.5rem)-0.25rem)] shrink-0 items-center justify-center rounded-[calc(var(--agent-kit-radius-xs,0.25rem)-2px)] bg-foreground text-background transition-colors duration-150 hover:bg-foreground/80"
212
217
  >
213
218
  {transcribing ? (
214
219
  <IconX aria-hidden="true" className="size-3" />
@@ -334,7 +339,7 @@ function ComposerPrimaryButton({
334
339
  aria-busy={busy || undefined}
335
340
  data-agent-composer-slot="send-button"
336
341
  data-composer-primary={mode}
337
- className="agent-composer-send-button shrink-0 flex size-[var(--agentkit-composer-primary-control-size,1.75rem)] items-center justify-center rounded-full bg-primary text-primary-foreground hover:opacity-90 transition-[opacity,transform] duration-150 active:scale-[0.97] disabled:opacity-30 disabled:cursor-not-allowed"
342
+ className="agent-composer-send-button shrink-0 flex size-[var(--agentkit-composer-primary-control-size,1.75rem)] items-center justify-center rounded-[var(--agent-kit-radius-sm,0.5rem)] bg-primary text-primary-foreground hover:opacity-90 transition-[opacity,transform] duration-150 active:scale-[0.97] disabled:opacity-30 disabled:cursor-not-allowed"
338
343
  >
339
344
  {/* Keyed so the glyph swap replays the entry transition in place. */}
340
345
  <span
@@ -127,7 +127,7 @@ export function ComposerNotice({
127
127
  data-notice={noticeId}
128
128
  role={role ?? (tone === "danger" ? "alert" : "status")}
129
129
  className={cn(
130
- "agent-composer-notice flex min-w-0 items-start gap-2 rounded-md border px-3 py-1.5 text-xs leading-5 text-foreground",
130
+ "agent-composer-notice flex min-w-0 items-start gap-2 rounded-[var(--agent-kit-radius-sm,0.5rem)] border px-3 py-1.5 text-xs leading-5 text-foreground",
131
131
  tone === "danger"
132
132
  ? "border-destructive/30 bg-destructive/5"
133
133
  : "border-[hsl(var(--agent-kit-warning)/0.4)] bg-[hsl(var(--agent-kit-warning)/0.1)]",
@@ -139,7 +139,7 @@ export function ComposerNotice({
139
139
  className={cn(
140
140
  "mt-1 size-4 shrink-0",
141
141
  tone === "danger"
142
- ? "text-destructive"
142
+ ? "text-[color:var(--agent-kit-danger-text)]"
143
143
  : "text-[hsl(var(--agent-kit-warning))]",
144
144
  )}
145
145
  />
@@ -167,7 +167,7 @@ export function ComposerNotice({
167
167
  aria-label={dismissLabel}
168
168
  title={dismissLabel}
169
169
  onClick={onDismiss}
170
- className="-me-1.5 flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
170
+ className="-me-1.5 flex size-6 shrink-0 items-center justify-center rounded-[var(--agent-kit-radius-xs,0.25rem)] text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
171
171
  >
172
172
  <IconX aria-hidden="true" className="size-4" />
173
173
  </button>
@@ -10,7 +10,7 @@ const FileReferenceComponent = ({ node }: { node: any }) => {
10
10
  return (
11
11
  <NodeViewWrapper as="span" className="inline">
12
12
  <span
13
- className="inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[200px] select-none"
13
+ className="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 select-none"
14
14
  title={node.attrs.path}
15
15
  >
16
16
  {isFolder ? (
@@ -14,7 +14,7 @@ const SkillReferenceComponent = ({ node }: { node: any }) => {
14
14
  return (
15
15
  <NodeViewWrapper as="span" className="inline">
16
16
  <span
17
- className="inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[160px] select-none"
17
+ className="mx-1 inline-flex max-w-[160px] 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 select-none"
18
18
  title={node.attrs.path}
19
19
  >
20
20
  <IconStack2 size={14} className="shrink-0 text-muted-foreground" />
@@ -4,4 +4,4 @@
4
4
  * their defaults and the caller's layout classes.
5
5
  */
6
6
  export const COMPOSER_POPOVER_SURFACE_CLASS =
7
- "z-[9999] max-h-[min(27.5rem,calc(var(--agent-native-viewport-height,100dvh)-2rem))] overflow-y-auto rounded-[var(--radius-lg,var(--radius,0.75rem))] border border-[color:color-mix(in_srgb,var(--agent-kit-border,color-mix(in_srgb,CanvasText_16%,transparent))_80%,transparent)] bg-[color:var(--agent-kit-popover-surface,var(--agent-kit-raised-surface,Canvas))] p-1 text-[color:var(--agent-kit-popover-text,var(--agent-kit-text,CanvasText))] shadow-(--agent-kit-overlay-elevation) [font:inherit]";
7
+ "z-[9999] max-h-[min(27.5rem,calc(var(--agent-native-viewport-height,100dvh)-2rem))] overflow-y-auto rounded-[var(--agent-kit-radius-sm,0.5rem)] [&_[role^=menuitem]]:rounded-[var(--agent-kit-radius-xs,0.25rem)] border border-[color:var(--agent-kit-border,color-mix(in_srgb,CanvasText_16%,transparent))] bg-[color:var(--agent-kit-popover-surface,var(--agent-kit-raised-surface,Canvas))] p-1 text-[color:var(--agent-kit-popover-text,var(--agent-kit-text,CanvasText))] shadow-(--agent-kit-overlay-elevation) [font:inherit]";