@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
@@ -616,6 +616,41 @@ describe("AgentKit composer context submission", () => {
616
616
  },
617
617
  );
618
618
 
619
+ it.each(["immediate", "queued"] as const)(
620
+ "sends a custom agent mention as a run reference on %s submissions",
621
+ async (intent) => {
622
+ const runtime = transport();
623
+ if (intent === "queued") withActiveRun(runtime);
624
+ client = new AgentKitClient({ transport: runtime });
625
+ if (intent === "queued") await client.loadThread("thread-1");
626
+ await act(async () =>
627
+ root.render(
628
+ <AgentKitProvider controller={client} threadId="thread-1">
629
+ <AgentKitComposer autoFocus={false} />
630
+ </AgentKitProvider>,
631
+ ),
632
+ );
633
+ const researcher = {
634
+ type: "custom-agent" as const,
635
+ path: "agents/researcher.md",
636
+ name: "Researcher",
637
+ source: "agent:custom",
638
+ refType: "custom-agent",
639
+ refId: "researcher",
640
+ };
641
+ await act(async () => {
642
+ await capture.props!.onSubmit("Find sources", [], [researcher], {
643
+ intent,
644
+ });
645
+ });
646
+ const input =
647
+ intent === "queued"
648
+ ? runtime.queueMessage.mock.calls[0][0]
649
+ : runtime.startRun.mock.calls[0][0];
650
+ expect(input.references).toEqual([researcher]);
651
+ },
652
+ );
653
+
619
654
  it.each(["immediate", "queued"] as const)(
620
655
  "includes mode instructions without context items in %s submissions",
621
656
  async (intent) => {
@@ -0,0 +1,353 @@
1
+ import {
2
+ IconAlertTriangle,
3
+ IconChevronDown,
4
+ IconChevronRight,
5
+ } from "@tabler/icons-react";
6
+ import { useId, useState, type CSSProperties, type ReactNode } from "react";
7
+
8
+ import { COMPOSER_POPOVER_SURFACE_CLASS } from "../../../composer/popover-surface.js";
9
+ import {
10
+ fallbackContextTranslate,
11
+ type ContextTranslate,
12
+ } from "../../../context-ui/types.js";
13
+ import { Button } from "../../../ui/button.js";
14
+ import {
15
+ Popover,
16
+ PopoverContent,
17
+ PopoverTrigger,
18
+ } from "../../../ui/popover.js";
19
+ import { Spinner } from "../../../ui/spinner.js";
20
+ import {
21
+ Tooltip,
22
+ TooltipContent,
23
+ TooltipProvider,
24
+ TooltipTrigger,
25
+ } from "../../../ui/tooltip.js";
26
+
27
+ export const CONTEXT_USAGE_WARNING_FRACTION = 0.8;
28
+
29
+ export interface ContextUsageSegmentView {
30
+ kind: string;
31
+ label: string;
32
+ tokens: number;
33
+ color?: string | undefined;
34
+ colorClass?: string | undefined;
35
+ }
36
+
37
+ export type ContextCompactState =
38
+ | { state: "idle" }
39
+ | { state: "running" }
40
+ | { state: "done"; message: string }
41
+ | { state: "error"; message: string };
42
+
43
+ /** 779.8k, 1M, 1.05M: the window's own unit, never "1000k". */
44
+ export function formatContextWindowTokens(tokens: number): string {
45
+ const value = Math.max(0, Math.round(tokens));
46
+ if (value >= 1_000_000) return `${Number((value / 1_000_000).toFixed(2))}M`;
47
+ if (value >= 1000) return `${Number((value / 1000).toFixed(1))}k`;
48
+ return String(value);
49
+ }
50
+
51
+ export function contextUsagePercent(
52
+ usedTokens: number,
53
+ windowTokens: number,
54
+ ): number {
55
+ return Math.round((usedTokens / windowTokens) * 100);
56
+ }
57
+
58
+ function formatWindowShare(tokens: number, windowTokens: number): string {
59
+ return `${((Math.max(0, tokens) / windowTokens) * 100).toFixed(1)}%`;
60
+ }
61
+
62
+ const CONTEXT_RING_RADIUS = 7;
63
+ const CONTEXT_RING_CIRCUMFERENCE = 2 * Math.PI * CONTEXT_RING_RADIUS;
64
+
65
+ export function contextRingDashOffset(fraction: number): number {
66
+ const share = Math.min(1, Math.max(0, fraction));
67
+ return CONTEXT_RING_CIRCUMFERENCE * (1 - share);
68
+ }
69
+
70
+ function segmentStyle(
71
+ segment: Pick<ContextUsageSegmentView, "color">,
72
+ width?: string,
73
+ ): CSSProperties | undefined {
74
+ if (!segment.color && !width) return undefined;
75
+ return {
76
+ ...(segment.color ? { background: segment.color } : {}),
77
+ ...(width ? { width } : {}),
78
+ };
79
+ }
80
+
81
+ // Never pad a small share or round the caps: a short dash on a track reads as a spinner.
82
+ function ContextRing({
83
+ fraction,
84
+ warning,
85
+ }: {
86
+ fraction: number;
87
+ warning: boolean;
88
+ }) {
89
+ return (
90
+ <svg
91
+ aria-hidden="true"
92
+ viewBox="0 0 20 20"
93
+ className="agentkit-context-ring"
94
+ data-context-ring=""
95
+ >
96
+ <circle
97
+ cx="10"
98
+ cy="10"
99
+ r={CONTEXT_RING_RADIUS}
100
+ fill="none"
101
+ strokeWidth="3"
102
+ className="agentkit-context-ring-track"
103
+ data-context-ring-track=""
104
+ />
105
+ <circle
106
+ cx="10"
107
+ cy="10"
108
+ r={CONTEXT_RING_RADIUS}
109
+ fill="none"
110
+ strokeWidth="3"
111
+ strokeLinecap="butt"
112
+ strokeDasharray={CONTEXT_RING_CIRCUMFERENCE}
113
+ strokeDashoffset={contextRingDashOffset(fraction)}
114
+ className="agentkit-context-ring-fill"
115
+ data-warning={warning ? "true" : undefined}
116
+ data-context-ring-fill=""
117
+ />
118
+ </svg>
119
+ );
120
+ }
121
+
122
+ /** Opens `children`, usually `ContextUsagePanel`, in a popover. */
123
+ export function ContextUsageRing({
124
+ usedTokens,
125
+ windowTokens,
126
+ open,
127
+ onOpenChange,
128
+ children,
129
+ translate = fallbackContextTranslate,
130
+ }: {
131
+ usedTokens: number;
132
+ windowTokens: number;
133
+ open: boolean;
134
+ onOpenChange: (open: boolean) => void;
135
+ children: ReactNode;
136
+ translate?: ContextTranslate;
137
+ }) {
138
+ const fraction = usedTokens / windowTokens;
139
+ const warning = fraction >= CONTEXT_USAGE_WARNING_FRACTION;
140
+ const label = translate("agentChat.contextRing.usedLabel", {
141
+ defaultValue: "Context {{percent}}% used",
142
+ percent: contextUsagePercent(usedTokens, windowTokens),
143
+ });
144
+ return (
145
+ <TooltipProvider delayDuration={200}>
146
+ <Popover open={open} onOpenChange={onOpenChange}>
147
+ <Tooltip>
148
+ <TooltipTrigger asChild>
149
+ <PopoverTrigger asChild>
150
+ <button
151
+ type="button"
152
+ aria-label={label}
153
+ data-agent-composer-slot="context-ring"
154
+ data-warning={warning ? "true" : undefined}
155
+ data-state={open ? "open" : "closed"}
156
+ className="agentkit-context-ring-trigger"
157
+ >
158
+ <ContextRing fraction={fraction} warning={warning} />
159
+ </button>
160
+ </PopoverTrigger>
161
+ </TooltipTrigger>
162
+ <TooltipContent>{label}</TooltipContent>
163
+ </Tooltip>
164
+ <PopoverContent
165
+ side="top"
166
+ align="end"
167
+ sideOffset={6}
168
+ collisionPadding={8}
169
+ data-agent-native-composer-popover="true"
170
+ // Portaled outside the chat, so it needs `agentkit-tokens` itself.
171
+ className={`agentkit-tokens w-[min(calc(100vw-2rem),22rem)] ${COMPOSER_POPOVER_SURFACE_CLASS}`}
172
+ >
173
+ {children}
174
+ </PopoverContent>
175
+ </Popover>
176
+ </TooltipProvider>
177
+ );
178
+ }
179
+
180
+ export function ContextUsagePanel({
181
+ usedTokens,
182
+ windowTokens,
183
+ segments,
184
+ tokensUntilAutoCompact,
185
+ compact,
186
+ onCompact,
187
+ translate = fallbackContextTranslate,
188
+ }: {
189
+ usedTokens: number;
190
+ windowTokens: number;
191
+ segments: readonly ContextUsageSegmentView[];
192
+ /** Omitted when no automatic threshold applies or it could not be read. */
193
+ tokensUntilAutoCompact?: number | undefined;
194
+ compact: ContextCompactState;
195
+ onCompact?: (() => void) | undefined;
196
+ translate?: ContextTranslate;
197
+ }) {
198
+ const [expanded, setExpanded] = useState(false);
199
+ const breakdownId = useId();
200
+ const percent = contextUsagePercent(usedTokens, windowTokens);
201
+ const warning = usedTokens / windowTokens >= CONTEXT_USAGE_WARNING_FRACTION;
202
+ const barTotal = Math.max(usedTokens, windowTokens);
203
+ const breakdownLabel = translate("agentChat.contextRing.breakdown", {
204
+ defaultValue: "Breakdown",
205
+ });
206
+ const rows: ContextUsageSegmentView[] = [
207
+ ...segments,
208
+ {
209
+ kind: "free-space",
210
+ label: translate("agentChat.contextRing.freeSpace", {
211
+ defaultValue: "Free space",
212
+ }),
213
+ tokens: Math.max(0, windowTokens - usedTokens),
214
+ },
215
+ ];
216
+ return (
217
+ <div className="agentkit-context-usage" data-context-usage-panel="">
218
+ <div className="agentkit-context-usage-header">
219
+ <span className="agentkit-context-usage-title">
220
+ {translate("agentChat.contextRing.title", {
221
+ defaultValue: "Context window",
222
+ })}
223
+ </span>
224
+ <span className="agentkit-context-usage-total">
225
+ {translate("agentChat.contextRing.usage", {
226
+ defaultValue: "{{used}} / {{window}} ({{percent}}%)",
227
+ used: formatContextWindowTokens(usedTokens),
228
+ window: formatContextWindowTokens(windowTokens),
229
+ percent,
230
+ })}
231
+ </span>
232
+ <Button
233
+ type="button"
234
+ variant="ghost"
235
+ size="icon-xs"
236
+ className="agentkit-context-usage-toggle rounded-[var(--agent-kit-radius-xs,0.25rem)]"
237
+ aria-label={breakdownLabel}
238
+ aria-expanded={expanded}
239
+ aria-controls={breakdownId}
240
+ onClick={() => setExpanded((current) => !current)}
241
+ >
242
+ {expanded ? (
243
+ <IconChevronDown aria-hidden="true" className="agentkit-icon" />
244
+ ) : (
245
+ <IconChevronRight aria-hidden="true" className="agentkit-icon" />
246
+ )}
247
+ </Button>
248
+ </div>
249
+ <div
250
+ role="img"
251
+ aria-label={segments
252
+ .map(
253
+ (segment) =>
254
+ `${segment.label} ${formatContextWindowTokens(segment.tokens)}`,
255
+ )
256
+ .join(", ")}
257
+ className="agentkit-context-usage-bar"
258
+ data-context-usage-bar=""
259
+ >
260
+ {segments.map((segment) => (
261
+ <span
262
+ key={segment.kind}
263
+ data-context-usage-segment={segment.kind}
264
+ className={segment.colorClass}
265
+ style={segmentStyle(
266
+ segment,
267
+ `${(segment.tokens / barTotal) * 100}%`,
268
+ )}
269
+ />
270
+ ))}
271
+ </div>
272
+ <div
273
+ id={breakdownId}
274
+ hidden={!expanded}
275
+ className="agentkit-context-usage-breakdown"
276
+ data-context-usage-breakdown=""
277
+ >
278
+ <table>
279
+ <tbody>
280
+ {rows.map((row) => (
281
+ <tr key={row.kind} data-context-usage-row={row.kind}>
282
+ <td>
283
+ <span
284
+ aria-hidden="true"
285
+ data-context-usage-swatch=""
286
+ className={
287
+ row.colorClass
288
+ ? `agentkit-context-usage-swatch ${row.colorClass}`
289
+ : "agentkit-context-usage-swatch"
290
+ }
291
+ style={segmentStyle(row)}
292
+ />
293
+ </td>
294
+ <td>{row.label}</td>
295
+ <td>{formatContextWindowTokens(row.tokens)}</td>
296
+ <td>{formatWindowShare(row.tokens, windowTokens)}</td>
297
+ </tr>
298
+ ))}
299
+ </tbody>
300
+ </table>
301
+ </div>
302
+ {tokensUntilAutoCompact !== undefined ? (
303
+ <p
304
+ className="agentkit-context-usage-caption"
305
+ data-warning={warning ? "true" : undefined}
306
+ >
307
+ {warning ? (
308
+ <IconAlertTriangle aria-hidden="true" className="agentkit-icon" />
309
+ ) : null}
310
+ {translate("agentChat.contextRing.untilAutoCompact", {
311
+ defaultValue: "{{tokens}} until auto-compact",
312
+ tokens: formatContextWindowTokens(tokensUntilAutoCompact),
313
+ })}
314
+ </p>
315
+ ) : null}
316
+ {compact.state === "done" ? (
317
+ <p role="status" className="agentkit-context-usage-caption">
318
+ {compact.message}
319
+ </p>
320
+ ) : null}
321
+ {compact.state === "error" ? (
322
+ <p
323
+ role="alert"
324
+ className="agentkit-context-usage-caption"
325
+ data-warning="true"
326
+ >
327
+ <IconAlertTriangle aria-hidden="true" className="agentkit-icon" />
328
+ <span>{compact.message}</span>
329
+ </p>
330
+ ) : null}
331
+ {onCompact ? (
332
+ <div className="agentkit-context-usage-actions">
333
+ <Button
334
+ type="button"
335
+ variant="outline"
336
+ size="xs"
337
+ className="rounded-[var(--agent-kit-radius-xs,0.25rem)]"
338
+ disabled={compact.state === "running"}
339
+ aria-busy={compact.state === "running" || undefined}
340
+ onClick={onCompact}
341
+ >
342
+ {compact.state === "running" ? (
343
+ <Spinner className="size-3" />
344
+ ) : null}
345
+ {translate("agentChat.contextRing.compactNow", {
346
+ defaultValue: "Compact now",
347
+ })}
348
+ </Button>
349
+ </div>
350
+ ) : null}
351
+ </div>
352
+ );
353
+ }
@@ -47,6 +47,7 @@ import {
47
47
  } from "react";
48
48
 
49
49
  import type { AgentChatDataChartLayout } from "./data-chart-layout.js";
50
+ import { formatAgentKitDuration } from "./duration.js";
50
51
  import type { AgentMessageContentOrderResolver } from "./message-content-order.js";
51
52
  import {
52
53
  AGENTKIT_CLIENT_REQUEST_ID_METADATA_KEY,
@@ -263,6 +264,23 @@ export interface AgentKitLabels {
263
264
  workStepReadPagesOther: string;
264
265
  workStepFetchedOne: string;
265
266
  workStepFetchedOther: string;
267
+ /** A message's citations: "Used 1 source", "Used {{count}} sources". */
268
+ workStepSourcesOne: string;
269
+ workStepSourcesOther: string;
270
+ /** A folded run of two or more framework frames in a stack trace. */
271
+ workStepFrameworkFrames: string;
272
+ workStepCopyStackTrace: string;
273
+ /** Takes {{code}}; shown only for a nonzero exit. */
274
+ workStepTerminalExitCode: string;
275
+ workStepTerminalTimedOut: string;
276
+ workStepTerminalEarlierLines: string;
277
+ workStepCopyOutput: string;
278
+ /** A file change cut short in what was kept. */
279
+ workStepFilePartial: string;
280
+ workStepFileMoreLines: string;
281
+ /** Screen-reader prefix for an added or removed diff line. */
282
+ workStepLineAdded: string;
283
+ workStepLineRemoved: string;
266
284
  workStepReadFilesOne: string;
267
285
  workStepReadFilesOther: string;
268
286
  workStepEditedOne: string;
@@ -286,6 +304,19 @@ export interface AgentKitLabels {
286
304
  durationSecondShort: string;
287
305
  agents: string;
288
306
  tasks: string;
307
+ tasksProgress: string;
308
+ question: string;
309
+ questionProgress: string;
310
+ questionProgressLabel: string;
311
+ questionOwnResponse: string;
312
+ questionAnswer: string;
313
+ questionSkip: string;
314
+ questionNext: string;
315
+ questionSend: string;
316
+ questionRecommended: string;
317
+ questionDismiss: string;
318
+ questionChooseFiles: string;
319
+ questionRemoveFile: string;
289
320
  toolInput?: string;
290
321
  toolResult?: string;
291
322
  activityValueIdentifierHidden?: string;
@@ -383,6 +414,8 @@ export interface AgentKitLabels {
383
414
  dropFilesToAttach: string;
384
415
  dropFileFailed: string;
385
416
  scrollToBottom: string;
417
+ /** Skip link past the transcript; visible only when focused. */
418
+ skipToComposer: string;
386
419
  formatTimestamp?: (createdAt: string) => string;
387
420
  error: string;
388
421
  renderError: string;
@@ -399,6 +432,8 @@ export interface AgentKitLabels {
399
432
  agentResumed: string;
400
433
  agentMessaged: string;
401
434
  agentDelegated: string;
435
+ agentWorking: string;
436
+ agentWorkedFor: string;
402
437
  agentPaused: string;
403
438
  agentCompleted: string;
404
439
  agentFailed: string;
@@ -474,6 +509,18 @@ export const defaultAgentKitLabels: ResolvedAgentKitLabels = {
474
509
  workStepReadPagesOther: "Read {{count}} pages",
475
510
  workStepFetchedOne: "Fetched 1 URL",
476
511
  workStepFetchedOther: "Fetched {{count}} URLs",
512
+ workStepSourcesOne: "Used 1 source",
513
+ workStepSourcesOther: "Used {{count}} sources",
514
+ workStepFrameworkFrames: "{{count}} framework frames",
515
+ workStepCopyStackTrace: "Copy stack trace",
516
+ workStepTerminalExitCode: "Exit code {{code}}",
517
+ workStepTerminalTimedOut: "Timed out",
518
+ workStepTerminalEarlierLines: "Show {{count}} earlier lines",
519
+ workStepCopyOutput: "Copy output",
520
+ workStepFilePartial: "Partial",
521
+ workStepFileMoreLines: "Show {{count}} more lines",
522
+ workStepLineAdded: "Added",
523
+ workStepLineRemoved: "Removed",
477
524
  workStepReadFilesOne: "Read 1 file",
478
525
  workStepReadFilesOther: "Read {{count}} files",
479
526
  workStepEditedOne: "Edited 1 file",
@@ -496,6 +543,19 @@ export const defaultAgentKitLabels: ResolvedAgentKitLabels = {
496
543
  durationSecondShort: "s",
497
544
  agents: "Agent collaboration",
498
545
  tasks: "Agent tasks",
546
+ tasksProgress: "{{completed}} of {{total}} done",
547
+ question: "Question",
548
+ questionProgress: "{{current}}/{{total}}",
549
+ questionProgressLabel: "{{current}} of {{total}}",
550
+ questionOwnResponse: "Or write your own response",
551
+ questionAnswer: "Write your answer",
552
+ questionSkip: "Skip",
553
+ questionNext: "Next",
554
+ questionSend: "Send",
555
+ questionRecommended: "Recommended",
556
+ questionDismiss: "Dismiss questions",
557
+ questionChooseFiles: "Choose files…",
558
+ questionRemoveFile: "Remove {{name}}",
499
559
  toolInput: "Input",
500
560
  toolResult: "Result",
501
561
  activityValueIdentifierHidden: "[Identifier hidden]",
@@ -590,6 +650,7 @@ export const defaultAgentKitLabels: ResolvedAgentKitLabels = {
590
650
  dropFilesToAttach: "Drop files to attach",
591
651
  dropFileFailed: "Could not add the dropped file. Try a different format.",
592
652
  scrollToBottom: "Scroll to bottom",
653
+ skipToComposer: "Skip to message box",
593
654
  error: "Something went wrong",
594
655
  renderError: "This content couldn’t be displayed.",
595
656
  runFailed: "Run failed",
@@ -605,6 +666,8 @@ export const defaultAgentKitLabels: ResolvedAgentKitLabels = {
605
666
  agentResumed: "resumed working",
606
667
  agentMessaged: "sent a message",
607
668
  agentDelegated: "delegated work",
669
+ agentWorking: "working",
670
+ agentWorkedFor: "worked for {{duration}}",
608
671
  agentPaused: "paused",
609
672
  agentCompleted: "finished",
610
673
  agentFailed: "needs attention",
@@ -710,6 +773,10 @@ export interface AgentKitProviderProps {
710
773
  workedForRowLayout?: AgentChatWorkedForRowLayout;
711
774
  dataChartLayout?: AgentChatDataChartLayout;
712
775
  formatWorkedForDuration?: (durationMs: number) => string;
776
+ /** Detail beside an interaction row's label; undefined keeps its own. */
777
+ formatAgentInteractionDetail?: (
778
+ interaction: AgentInteraction,
779
+ ) => string | undefined;
713
780
  /** Display name for a model id in run details; the id shows without it. */
714
781
  formatModelName?: (model: string) => string;
715
782
  onClientEffect?: (effect: {
@@ -738,7 +805,7 @@ export interface AgentKitThreadLoadState {
738
805
  retry?: () => void;
739
806
  }
740
807
 
741
- interface ResolvedAgentKitLabels extends AgentKitLabels {
808
+ export interface ResolvedAgentKitLabels extends AgentKitLabels {
742
809
  toolInput: string;
743
810
  toolResult: string;
744
811
  queueSendNow: string;
@@ -768,6 +835,9 @@ export interface AgentKitContextValue {
768
835
  workedForRowLayout?: AgentChatWorkedForRowLayout;
769
836
  dataChartLayout?: AgentChatDataChartLayout;
770
837
  formatWorkedForDuration?: (durationMs: number) => string;
838
+ formatAgentInteractionDetail?: (
839
+ interaction: AgentInteraction,
840
+ ) => string | undefined;
771
841
  formatModelName?: (model: string) => string;
772
842
  registerComposerFocus: (threadId: ThreadId, focus: () => void) => () => void;
773
843
  requestComposerFocus: (threadId: ThreadId) => void;
@@ -856,6 +926,7 @@ export function AgentKitProvider({
856
926
  workedForRowLayout: workedForRowLayoutInput,
857
927
  dataChartLayout: dataChartLayoutInput,
858
928
  formatWorkedForDuration,
929
+ formatAgentInteractionDetail,
859
930
  formatModelName: formatModelNameInput,
860
931
  onClientEffect: onClientEffectInput,
861
932
  threadLoad,
@@ -971,6 +1042,7 @@ export function AgentKitProvider({
971
1042
  workedForRowLayout,
972
1043
  dataChartLayout,
973
1044
  formatWorkedForDuration,
1045
+ formatAgentInteractionDetail,
974
1046
  formatModelName,
975
1047
  registerComposerFocus,
976
1048
  requestComposerFocus,
@@ -994,6 +1066,7 @@ export function AgentKitProvider({
994
1066
  workedForRowLayout,
995
1067
  dataChartLayout,
996
1068
  formatWorkedForDuration,
1069
+ formatAgentInteractionDetail,
997
1070
  formatModelName,
998
1071
  registerComposerFocus,
999
1072
  requestComposerFocus,
@@ -1135,6 +1208,25 @@ function useAgentKitControllerSnapshot(
1135
1208
  );
1136
1209
  }
1137
1210
 
1211
+ /** Falls back to English defaults so parts also work outside a provider. */
1212
+ export function useAgentKitLabels(): ResolvedAgentKitLabels {
1213
+ return useContext(AgentKitContext)?.labels ?? defaultAgentKitLabels;
1214
+ }
1215
+
1216
+ export function useAgentKitDurationFormat(): (durationMs: number) => string {
1217
+ const value = useContext(AgentKitContext);
1218
+ const labels = value?.labels ?? defaultAgentKitLabels;
1219
+ return (
1220
+ value?.formatWorkedForDuration ??
1221
+ ((durationMs) =>
1222
+ formatAgentKitDuration(durationMs, {
1223
+ hour: labels.durationHourShort,
1224
+ minute: labels.durationMinuteShort,
1225
+ second: labels.durationSecondShort,
1226
+ }))
1227
+ );
1228
+ }
1229
+
1138
1230
  export function useAgentKit(): AgentKitContextValue {
1139
1231
  const value = useContext(AgentKitContext);
1140
1232
  if (!value) throw new Error("AgentKit hooks require an AgentKitProvider.");
@@ -0,0 +1,42 @@
1
+ import {
2
+ createContext,
3
+ useContext,
4
+ useEffect,
5
+ useRef,
6
+ useState,
7
+ type RefObject,
8
+ } from "react";
9
+
10
+ import { scheduleIdleMount } from "./idle-mount.js";
11
+
12
+ /** True while a long thread opens, so closed rows can mount later. */
13
+ export const AgentKitDeferClosedContentContext = createContext(false);
14
+
15
+ /**
16
+ * Keeps closed content mounted for find-in-page; in a long thread it mounts
17
+ * at idle, so the history paints first.
18
+ */
19
+ export function useUntilFoundContent(
20
+ open: boolean,
21
+ onReveal: (() => void) | undefined,
22
+ ): { ref: RefObject<HTMLDivElement | null>; mounted: boolean } {
23
+ const ref = useRef<HTMLDivElement>(null);
24
+ const revealRef = useRef(onReveal);
25
+ revealRef.current = onReveal;
26
+ const deferClosed = useContext(AgentKitDeferClosedContentContext);
27
+ const [contentMounted, setContentMounted] = useState(open || !deferClosed);
28
+ if (open && !contentMounted) setContentMounted(true);
29
+ useEffect(() => {
30
+ if (contentMounted) return;
31
+ return scheduleIdleMount(() => setContentMounted(true));
32
+ }, [contentMounted]);
33
+ useEffect(() => {
34
+ const element = ref.current;
35
+ if (!element || open) return;
36
+ element.setAttribute("hidden", "until-found");
37
+ const reveal = () => revealRef.current?.();
38
+ element.addEventListener("beforematch", reveal);
39
+ return () => element.removeEventListener("beforematch", reveal);
40
+ }, [open]);
41
+ return { ref, mounted: contentMounted || open };
42
+ }