@agent-native/core 0.46.0 → 0.48.1

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 (837) hide show
  1. package/bin/agent-native.js +41 -0
  2. package/dist/a2a/handlers.js +2 -2
  3. package/dist/a2a/handlers.js.map +1 -1
  4. package/dist/a2a/server.js +2 -2
  5. package/dist/a2a/server.js.map +1 -1
  6. package/dist/action.d.ts +43 -2
  7. package/dist/action.d.ts.map +1 -1
  8. package/dist/action.js.map +1 -1
  9. package/dist/agent/context-xray/actions/context-evict.d.ts +7 -1
  10. package/dist/agent/context-xray/actions/context-evict.d.ts.map +1 -1
  11. package/dist/agent/context-xray/actions/context-manifest-get.d.ts +4 -1
  12. package/dist/agent/context-xray/actions/context-manifest-get.d.ts.map +1 -1
  13. package/dist/agent/context-xray/actions/context-pin.d.ts +7 -1
  14. package/dist/agent/context-xray/actions/context-pin.d.ts.map +1 -1
  15. package/dist/agent/context-xray/actions/context-report.d.ts +12 -1
  16. package/dist/agent/context-xray/actions/context-report.d.ts.map +1 -1
  17. package/dist/agent/context-xray/actions/context-restore.d.ts +7 -1
  18. package/dist/agent/context-xray/actions/context-restore.d.ts.map +1 -1
  19. package/dist/agent/context-xray/apply-directives.d.ts.map +1 -1
  20. package/dist/agent/context-xray/apply-directives.js.map +1 -1
  21. package/dist/agent/context-xray/schema.d.ts +10 -10
  22. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  23. package/dist/agent/engine/ai-sdk-engine.js +26 -3
  24. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  25. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  26. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  27. package/dist/agent/engine/builder-engine.d.ts +1 -1
  28. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  29. package/dist/agent/engine/builder-engine.js +47 -8
  30. package/dist/agent/engine/builder-engine.js.map +1 -1
  31. package/dist/agent/engine/builtin.js +1 -1
  32. package/dist/agent/engine/builtin.js.map +1 -1
  33. package/dist/agent/engine/output-tokens.d.ts +1 -1
  34. package/dist/agent/engine/output-tokens.d.ts.map +1 -1
  35. package/dist/agent/engine/output-tokens.js +6 -2
  36. package/dist/agent/engine/output-tokens.js.map +1 -1
  37. package/dist/agent/engine/registry.d.ts.map +1 -1
  38. package/dist/agent/engine/registry.js +7 -4
  39. package/dist/agent/engine/registry.js.map +1 -1
  40. package/dist/agent/engine/types.d.ts +19 -0
  41. package/dist/agent/engine/types.d.ts.map +1 -1
  42. package/dist/agent/engine/types.js +6 -0
  43. package/dist/agent/engine/types.js.map +1 -1
  44. package/dist/agent/model-config.d.ts +22 -14
  45. package/dist/agent/model-config.d.ts.map +1 -1
  46. package/dist/agent/model-config.js +113 -8
  47. package/dist/agent/model-config.js.map +1 -1
  48. package/dist/agent/production-agent.d.ts +47 -1
  49. package/dist/agent/production-agent.d.ts.map +1 -1
  50. package/dist/agent/production-agent.js +267 -46
  51. package/dist/agent/production-agent.js.map +1 -1
  52. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  53. package/dist/agent/run-loop-with-resume.js +10 -0
  54. package/dist/agent/run-loop-with-resume.js.map +1 -1
  55. package/dist/agent/run-manager.d.ts +1 -0
  56. package/dist/agent/run-manager.d.ts.map +1 -1
  57. package/dist/agent/run-manager.js +36 -9
  58. package/dist/agent/run-manager.js.map +1 -1
  59. package/dist/agent/run-store.d.ts +47 -4
  60. package/dist/agent/run-store.d.ts.map +1 -1
  61. package/dist/agent/run-store.js +154 -4
  62. package/dist/agent/run-store.js.map +1 -1
  63. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  64. package/dist/agent/thread-data-builder.js +57 -2
  65. package/dist/agent/thread-data-builder.js.map +1 -1
  66. package/dist/agent/types.d.ts +3 -0
  67. package/dist/agent/types.d.ts.map +1 -1
  68. package/dist/agent/types.js.map +1 -1
  69. package/dist/agent-web/generator.d.ts +3 -3
  70. package/dist/appearance/actions/change-appearance.d.ts +6 -1
  71. package/dist/appearance/actions/change-appearance.d.ts.map +1 -1
  72. package/dist/application-state/handlers.d.ts +2 -2
  73. package/dist/application-state/handlers.d.ts.map +1 -1
  74. package/dist/application-state/store.d.ts.map +1 -1
  75. package/dist/application-state/store.js +17 -0
  76. package/dist/application-state/store.js.map +1 -1
  77. package/dist/catalog.json +2 -1
  78. package/dist/cli/code-agent-commands.d.ts.map +1 -1
  79. package/dist/cli/code-agent-commands.js +2 -0
  80. package/dist/cli/code-agent-commands.js.map +1 -1
  81. package/dist/cli/code-agent-connector.js +7 -13
  82. package/dist/cli/code-agent-connector.js.map +1 -1
  83. package/dist/cli/code-agent-executor.d.ts +54 -2
  84. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  85. package/dist/cli/code-agent-executor.js +504 -48
  86. package/dist/cli/code-agent-executor.js.map +1 -1
  87. package/dist/cli/code-agent-runs.d.ts +13 -0
  88. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  89. package/dist/cli/code-agent-runs.js +36 -0
  90. package/dist/cli/code-agent-runs.js.map +1 -1
  91. package/dist/cli/code.js +59 -5
  92. package/dist/cli/code.js.map +1 -1
  93. package/dist/cli/connect.js +141 -3
  94. package/dist/cli/connect.js.map +1 -1
  95. package/dist/cli/index.js +0 -0
  96. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  97. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  98. package/dist/cli/recap.js +476 -46
  99. package/dist/cli/recap.js.map +1 -1
  100. package/dist/cli/skills.js +331 -179
  101. package/dist/cli/skills.js.map +1 -1
  102. package/dist/client/AgentPanel.d.ts.map +1 -1
  103. package/dist/client/AgentPanel.js +29 -2
  104. package/dist/client/AgentPanel.js.map +1 -1
  105. package/dist/client/AgentTaskCard.d.ts.map +1 -1
  106. package/dist/client/AgentTaskCard.js +17 -2
  107. package/dist/client/AgentTaskCard.js.map +1 -1
  108. package/dist/client/AssistantChat.d.ts +1 -1
  109. package/dist/client/AssistantChat.d.ts.map +1 -1
  110. package/dist/client/AssistantChat.js +310 -1732
  111. package/dist/client/AssistantChat.js.map +1 -1
  112. package/dist/client/CommandMenu.d.ts +1 -1
  113. package/dist/client/CommandMenu.d.ts.map +1 -1
  114. package/dist/client/CommandMenu.js +1 -1
  115. package/dist/client/CommandMenu.js.map +1 -1
  116. package/dist/client/HighlightedCodeBlock.d.ts +40 -0
  117. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -0
  118. package/dist/client/HighlightedCodeBlock.js +110 -0
  119. package/dist/client/HighlightedCodeBlock.js.map +1 -0
  120. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  121. package/dist/client/MultiTabAssistantChat.js +8 -1
  122. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  123. package/dist/client/PoweredByBadge.d.ts +2 -2
  124. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  125. package/dist/client/RunStuckBanner.d.ts +1 -1
  126. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  127. package/dist/client/StarfieldBackground.d.ts.map +1 -1
  128. package/dist/client/StarfieldBackground.js +10 -5
  129. package/dist/client/StarfieldBackground.js.map +1 -1
  130. package/dist/client/Turnstile.d.ts +1 -1
  131. package/dist/client/Turnstile.d.ts.map +1 -1
  132. package/dist/client/agent-chat-adapter.d.ts +3 -2
  133. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  134. package/dist/client/agent-chat-adapter.js +13 -9
  135. package/dist/client/agent-chat-adapter.js.map +1 -1
  136. package/dist/client/app-providers.d.ts +99 -0
  137. package/dist/client/app-providers.d.ts.map +1 -0
  138. package/dist/client/app-providers.js +19 -0
  139. package/dist/client/app-providers.js.map +1 -0
  140. package/dist/client/assistant-ui-recovery.d.ts +1 -1
  141. package/dist/client/auth-redirect-url.d.ts +1 -1
  142. package/dist/client/auth-redirect-url.d.ts.map +1 -1
  143. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts +0 -19
  144. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
  145. package/dist/client/blocks/library/AnnotatedCodeBlock.js +141 -55
  146. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
  147. package/dist/client/blocks/library/DiffBlock.js +1 -1
  148. package/dist/client/blocks/library/DiffBlock.js.map +1 -1
  149. package/dist/client/blocks/library/FileTreeBlock.d.ts.map +1 -1
  150. package/dist/client/blocks/library/FileTreeBlock.js +1 -1
  151. package/dist/client/blocks/library/FileTreeBlock.js.map +1 -1
  152. package/dist/client/blocks/library/HighlightedCode.d.ts.map +1 -1
  153. package/dist/client/blocks/library/HighlightedCode.js +5 -3
  154. package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
  155. package/dist/client/blocks/library/annotation-rail.d.ts +5 -4
  156. package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
  157. package/dist/client/blocks/library/annotation-rail.js +22 -3
  158. package/dist/client/blocks/library/annotation-rail.js.map +1 -1
  159. package/dist/client/blocks/library/diagram.js +1 -1
  160. package/dist/client/blocks/library/diagram.js.map +1 -1
  161. package/dist/client/blocks/library/diff.config.d.ts +3 -2
  162. package/dist/client/blocks/library/diff.config.d.ts.map +1 -1
  163. package/dist/client/blocks/library/diff.config.js +4 -3
  164. package/dist/client/blocks/library/diff.config.js.map +1 -1
  165. package/dist/client/blocks/library/question-form.d.ts.map +1 -1
  166. package/dist/client/blocks/library/question-form.js +2 -1
  167. package/dist/client/blocks/library/question-form.js.map +1 -1
  168. package/dist/client/blocks/library/wireframe-kit.d.ts +1 -1
  169. package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
  170. package/dist/client/blocks/library/wireframe.js +1 -1
  171. package/dist/client/blocks/library/wireframe.js.map +1 -1
  172. package/dist/client/chat/attachment-adapters.d.ts +58 -0
  173. package/dist/client/chat/attachment-adapters.d.ts.map +1 -0
  174. package/dist/client/chat/attachment-adapters.js +331 -0
  175. package/dist/client/chat/attachment-adapters.js.map +1 -0
  176. package/dist/client/chat/index.d.ts +13 -0
  177. package/dist/client/chat/index.d.ts.map +1 -0
  178. package/dist/client/chat/index.js +13 -0
  179. package/dist/client/chat/index.js.map +1 -0
  180. package/dist/client/chat/markdown-renderer.d.ts +49 -0
  181. package/dist/client/chat/markdown-renderer.d.ts.map +1 -0
  182. package/dist/client/chat/markdown-renderer.js +391 -0
  183. package/dist/client/chat/markdown-renderer.js.map +1 -0
  184. package/dist/client/chat/message-components.d.ts +35 -0
  185. package/dist/client/chat/message-components.d.ts.map +1 -0
  186. package/dist/client/chat/message-components.js +452 -0
  187. package/dist/client/chat/message-components.js.map +1 -0
  188. package/dist/client/chat/repo-helpers.d.ts +41 -0
  189. package/dist/client/chat/repo-helpers.d.ts.map +1 -0
  190. package/dist/client/chat/repo-helpers.js +61 -0
  191. package/dist/client/chat/repo-helpers.js.map +1 -0
  192. package/dist/client/chat/run-recovery.d.ts +41 -0
  193. package/dist/client/chat/run-recovery.d.ts.map +1 -0
  194. package/dist/client/chat/run-recovery.js +348 -0
  195. package/dist/client/chat/run-recovery.js.map +1 -0
  196. package/dist/client/chat/tool-call-display.d.ts +34 -0
  197. package/dist/client/chat/tool-call-display.d.ts.map +1 -0
  198. package/dist/client/chat/tool-call-display.js +284 -0
  199. package/dist/client/chat/tool-call-display.js.map +1 -0
  200. package/dist/client/code-agent-chat-adapter.d.ts.map +1 -1
  201. package/dist/client/code-agent-chat-adapter.js +20 -0
  202. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  203. package/dist/client/collab/index.d.ts +10 -0
  204. package/dist/client/collab/index.d.ts.map +1 -0
  205. package/dist/client/collab/index.js +10 -0
  206. package/dist/client/collab/index.js.map +1 -0
  207. package/dist/client/components/AgentPresenceChip.d.ts +1 -1
  208. package/dist/client/components/AgentPresenceChip.d.ts.map +1 -1
  209. package/dist/client/components/ApiKeySettings.d.ts +1 -1
  210. package/dist/client/components/ApiKeySettings.d.ts.map +1 -1
  211. package/dist/client/components/CodeAgentIndicator.d.ts +1 -1
  212. package/dist/client/components/CodeAgentIndicator.d.ts.map +1 -1
  213. package/dist/client/components/CodeRequiredDialog.d.ts +1 -1
  214. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  215. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  216. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  217. package/dist/client/components/PresenceBar.d.ts +1 -1
  218. package/dist/client/components/PresenceBar.d.ts.map +1 -1
  219. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  220. package/dist/client/composer/PromptComposer.js +6 -26
  221. package/dist/client/composer/PromptComposer.js.map +1 -1
  222. package/dist/client/composer/TiptapComposer.d.ts +8 -2
  223. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  224. package/dist/client/composer/TiptapComposer.js +21 -9
  225. package/dist/client/composer/TiptapComposer.js.map +1 -1
  226. package/dist/client/composer/VoiceButton.d.ts +2 -2
  227. package/dist/client/composer/VoiceButton.d.ts.map +1 -1
  228. package/dist/client/composer/index.d.ts +1 -1
  229. package/dist/client/composer/index.d.ts.map +1 -1
  230. package/dist/client/composer/index.js +1 -1
  231. package/dist/client/composer/index.js.map +1 -1
  232. package/dist/client/composer/use-skills.d.ts +1 -1
  233. package/dist/client/context-xray/ContextMeter.d.ts +1 -1
  234. package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
  235. package/dist/client/context-xray/ContextMeter.js +3 -3
  236. package/dist/client/context-xray/ContextMeter.js.map +1 -1
  237. package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
  238. package/dist/client/context-xray/ContextXRayPanel.js +4 -3
  239. package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
  240. package/dist/client/context-xray/format.d.ts +11 -0
  241. package/dist/client/context-xray/format.d.ts.map +1 -1
  242. package/dist/client/context-xray/format.js +16 -0
  243. package/dist/client/context-xray/format.js.map +1 -1
  244. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  245. package/dist/client/conversation/AgentConversation.js +8 -53
  246. package/dist/client/conversation/AgentConversation.js.map +1 -1
  247. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -1
  248. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  249. package/dist/client/conversation/use-near-bottom-autoscroll.js +14 -1
  250. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  251. package/dist/client/create-query-client.d.ts +28 -0
  252. package/dist/client/create-query-client.d.ts.map +1 -0
  253. package/dist/client/create-query-client.js +78 -0
  254. package/dist/client/create-query-client.js.map +1 -0
  255. package/dist/client/db-admin/DevDatabaseLink.d.ts +1 -1
  256. package/dist/client/db-admin/DevDatabaseLink.d.ts.map +1 -1
  257. package/dist/client/db-admin/RowSidePanel.d.ts +1 -1
  258. package/dist/client/db-admin/RowSidePanel.d.ts.map +1 -1
  259. package/dist/client/db-admin/RowSidePanel.js +2 -2
  260. package/dist/client/db-admin/RowSidePanel.js.map +1 -1
  261. package/dist/client/db-admin/TableEditor.d.ts +1 -1
  262. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  263. package/dist/client/db-admin/TableEditor.js +1 -1
  264. package/dist/client/db-admin/TableEditor.js.map +1 -1
  265. package/dist/client/db-admin/cell-format.d.ts +1 -1
  266. package/dist/client/db-admin/cell-format.d.ts.map +1 -1
  267. package/dist/client/dev-overlay/DevOverlay.d.ts +1 -1
  268. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
  269. package/dist/client/editor/index.d.ts +2 -0
  270. package/dist/client/editor/index.d.ts.map +1 -0
  271. package/dist/client/editor/index.js +2 -0
  272. package/dist/client/editor/index.js.map +1 -0
  273. package/dist/client/error-format.d.ts.map +1 -1
  274. package/dist/client/error-format.js +4 -0
  275. package/dist/client/error-format.js.map +1 -1
  276. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts +1 -1
  277. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
  278. package/dist/client/extensions/EmbeddedExtension.d.ts +1 -1
  279. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  280. package/dist/client/extensions/ExtensionSlot.d.ts +1 -1
  281. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  282. package/dist/client/extensions/ExtensionViewerPage.d.ts +1 -1
  283. package/dist/client/extensions/ExtensionViewerPage.d.ts.map +1 -1
  284. package/dist/client/guided-questions.d.ts +6 -6
  285. package/dist/client/host-bridge.d.ts.map +1 -1
  286. package/dist/client/host-bridge.js +2 -0
  287. package/dist/client/host-bridge.js.map +1 -1
  288. package/dist/client/index.d.ts +7 -6
  289. package/dist/client/index.d.ts.map +1 -1
  290. package/dist/client/index.js +5 -3
  291. package/dist/client/index.js.map +1 -1
  292. package/dist/client/onboarding/OnboardingBanner.d.ts +1 -1
  293. package/dist/client/onboarding/OnboardingBanner.d.ts.map +1 -1
  294. package/dist/client/onboarding/OnboardingPanel.d.ts +1 -1
  295. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  296. package/dist/client/onboarding/SetupButton.d.ts +1 -1
  297. package/dist/client/onboarding/SetupButton.d.ts.map +1 -1
  298. package/dist/client/org/InvitationBanner.d.ts +1 -1
  299. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  300. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  301. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  302. package/dist/client/org/RequireActiveOrg.d.ts +1 -1
  303. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  304. package/dist/client/org/hooks.d.ts +3 -3
  305. package/dist/client/org/hooks.d.ts.map +1 -1
  306. package/dist/client/progress/RunsTray.d.ts +2 -2
  307. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  308. package/dist/client/progress/RunsTray.js +34 -9
  309. package/dist/client/progress/RunsTray.js.map +1 -1
  310. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  311. package/dist/client/resources/ResourceEditor.js +1 -1
  312. package/dist/client/resources/ResourceEditor.js.map +1 -1
  313. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  314. package/dist/client/resources/ResourcesPanel.js +2 -0
  315. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  316. package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts +1 -1
  317. package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts.map +1 -1
  318. package/dist/client/rich-markdown-editor/CodeBlockNode.d.ts.map +1 -1
  319. package/dist/client/rich-markdown-editor/CodeBlockNode.js +2 -1
  320. package/dist/client/rich-markdown-editor/CodeBlockNode.js.map +1 -1
  321. package/dist/client/rich-markdown-editor/ImageExtension.d.ts.map +1 -1
  322. package/dist/client/rich-markdown-editor/ImageExtension.js +2 -1
  323. package/dist/client/rich-markdown-editor/ImageExtension.js.map +1 -1
  324. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts +1 -1
  325. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -1
  326. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +1 -1
  327. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  328. package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts +1 -1
  329. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  330. package/dist/client/rich-markdown-editor/SharedRichEditor.js +2 -3
  331. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  332. package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts +1 -1
  333. package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts.map +1 -1
  334. package/dist/client/route-state.d.ts +12 -2
  335. package/dist/client/route-state.d.ts.map +1 -1
  336. package/dist/client/route-state.js +1 -1
  337. package/dist/client/route-state.js.map +1 -1
  338. package/dist/client/route-warmup.d.ts +1 -1
  339. package/dist/client/route-warmup.d.ts.map +1 -1
  340. package/dist/client/settings/VoiceTranscriptionSection.js +1 -1
  341. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  342. package/dist/client/settings/useBuilderStatus.d.ts +2 -2
  343. package/dist/client/sharing/ShareDialog.d.ts +1 -1
  344. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  345. package/dist/client/sse-event-processor.d.ts +8 -0
  346. package/dist/client/sse-event-processor.d.ts.map +1 -1
  347. package/dist/client/sse-event-processor.js +33 -10
  348. package/dist/client/sse-event-processor.js.map +1 -1
  349. package/dist/client/terminal/AgentTerminal.d.ts +1 -1
  350. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  351. package/dist/client/terminal/AgentTerminal.js +4 -2
  352. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  353. package/dist/client/tool-cells/BashCell.d.ts +25 -0
  354. package/dist/client/tool-cells/BashCell.d.ts.map +1 -0
  355. package/dist/client/tool-cells/BashCell.js +49 -0
  356. package/dist/client/tool-cells/BashCell.js.map +1 -0
  357. package/dist/client/tool-cells/EditCell.d.ts +24 -0
  358. package/dist/client/tool-cells/EditCell.d.ts.map +1 -0
  359. package/dist/client/tool-cells/EditCell.js +126 -0
  360. package/dist/client/tool-cells/EditCell.js.map +1 -0
  361. package/dist/client/tool-cells/FilesChangedSummary.d.ts +13 -0
  362. package/dist/client/tool-cells/FilesChangedSummary.d.ts.map +1 -0
  363. package/dist/client/tool-cells/FilesChangedSummary.js +98 -0
  364. package/dist/client/tool-cells/FilesChangedSummary.js.map +1 -0
  365. package/dist/client/tool-cells/WriteCell.d.ts +17 -0
  366. package/dist/client/tool-cells/WriteCell.d.ts.map +1 -0
  367. package/dist/client/tool-cells/WriteCell.js +26 -0
  368. package/dist/client/tool-cells/WriteCell.js.map +1 -0
  369. package/dist/client/tool-cells/index.d.ts +8 -0
  370. package/dist/client/tool-cells/index.d.ts.map +1 -0
  371. package/dist/client/tool-cells/index.js +5 -0
  372. package/dist/client/tool-cells/index.js.map +1 -0
  373. package/dist/client/transcription/BuilderTranscriptionCta.d.ts +1 -1
  374. package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
  375. package/dist/client/use-chat-threads.d.ts +1 -1
  376. package/dist/client/use-chat-threads.d.ts.map +1 -1
  377. package/dist/client/use-chat-threads.js +11 -8
  378. package/dist/client/use-chat-threads.js.map +1 -1
  379. package/dist/client/use-db-sync.d.ts +2 -0
  380. package/dist/client/use-db-sync.d.ts.map +1 -1
  381. package/dist/client/use-db-sync.js +329 -302
  382. package/dist/client/use-db-sync.js.map +1 -1
  383. package/dist/code-agents/transcript-normalizer.d.ts +15 -1
  384. package/dist/code-agents/transcript-normalizer.d.ts.map +1 -1
  385. package/dist/code-agents/transcript-normalizer.js +47 -0
  386. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  387. package/dist/coding-tools/index.d.ts +75 -0
  388. package/dist/coding-tools/index.d.ts.map +1 -1
  389. package/dist/coding-tools/index.js +137 -10
  390. package/dist/coding-tools/index.js.map +1 -1
  391. package/dist/coding-tools/run-code.d.ts +40 -0
  392. package/dist/coding-tools/run-code.d.ts.map +1 -0
  393. package/dist/coding-tools/run-code.js +511 -0
  394. package/dist/coding-tools/run-code.js.map +1 -0
  395. package/dist/collab/client.d.ts.map +1 -1
  396. package/dist/collab/client.js +15 -9
  397. package/dist/collab/client.js.map +1 -1
  398. package/dist/collab/ydoc-manager.d.ts +1 -1
  399. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  400. package/dist/collab/ydoc-manager.js +1 -1
  401. package/dist/collab/ydoc-manager.js.map +1 -1
  402. package/dist/db/client.d.ts +9 -1
  403. package/dist/db/client.d.ts.map +1 -1
  404. package/dist/db/client.js +204 -48
  405. package/dist/db/client.js.map +1 -1
  406. package/dist/db/create-get-db.d.ts +38 -0
  407. package/dist/db/create-get-db.d.ts.map +1 -1
  408. package/dist/db/create-get-db.js +204 -4
  409. package/dist/db/create-get-db.js.map +1 -1
  410. package/dist/db/migrations.d.ts.map +1 -1
  411. package/dist/db/migrations.js +159 -67
  412. package/dist/db/migrations.js.map +1 -1
  413. package/dist/demo/actions/toggle-demo-mode.d.ts +6 -1
  414. package/dist/demo/actions/toggle-demo-mode.d.ts.map +1 -1
  415. package/dist/deploy/build.d.ts.map +1 -1
  416. package/dist/deploy/build.js +80 -39
  417. package/dist/deploy/build.js.map +1 -1
  418. package/dist/deploy/workspace-deploy.js +20 -10
  419. package/dist/deploy/workspace-deploy.js.map +1 -1
  420. package/dist/extensions/fetch-tool.d.ts.map +1 -1
  421. package/dist/extensions/fetch-tool.js +62 -7
  422. package/dist/extensions/fetch-tool.js.map +1 -1
  423. package/dist/extensions/schema.d.ts +51 -51
  424. package/dist/extensions/slots/schema.d.ts +13 -13
  425. package/dist/extensions/web-search-tool.d.ts +41 -0
  426. package/dist/extensions/web-search-tool.d.ts.map +1 -0
  427. package/dist/extensions/web-search-tool.js +200 -0
  428. package/dist/extensions/web-search-tool.js.map +1 -0
  429. package/dist/file-upload/actions/upload-image.d.ts +26 -1
  430. package/dist/file-upload/actions/upload-image.d.ts.map +1 -1
  431. package/dist/file-upload/index.d.ts +1 -1
  432. package/dist/file-upload/index.d.ts.map +1 -1
  433. package/dist/file-upload/index.js +1 -1
  434. package/dist/file-upload/index.js.map +1 -1
  435. package/dist/file-upload/pre-upload-attachments.d.ts +37 -0
  436. package/dist/file-upload/pre-upload-attachments.d.ts.map +1 -1
  437. package/dist/file-upload/pre-upload-attachments.js +79 -19
  438. package/dist/file-upload/pre-upload-attachments.js.map +1 -1
  439. package/dist/index.d.ts +1 -1
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js.map +1 -1
  442. package/dist/integrations/adapters/slack.js +1 -1
  443. package/dist/integrations/adapters/slack.js.map +1 -1
  444. package/dist/integrations/plugin.js +1 -1
  445. package/dist/integrations/plugin.js.map +1 -1
  446. package/dist/jobs/scheduler.js +70 -21
  447. package/dist/jobs/scheduler.js.map +1 -1
  448. package/dist/mcp/actions/create-org-service-token.d.ts +14 -0
  449. package/dist/mcp/actions/create-org-service-token.d.ts.map +1 -0
  450. package/dist/mcp/actions/create-org-service-token.js +74 -0
  451. package/dist/mcp/actions/create-org-service-token.js.map +1 -0
  452. package/dist/mcp/actions/list-org-service-tokens.d.ts +17 -0
  453. package/dist/mcp/actions/list-org-service-tokens.d.ts.map +1 -0
  454. package/dist/mcp/actions/list-org-service-tokens.js +42 -0
  455. package/dist/mcp/actions/list-org-service-tokens.js.map +1 -0
  456. package/dist/mcp/actions/revoke-org-service-token.d.ts +7 -0
  457. package/dist/mcp/actions/revoke-org-service-token.d.ts.map +1 -0
  458. package/dist/mcp/actions/revoke-org-service-token.js +28 -0
  459. package/dist/mcp/actions/revoke-org-service-token.js.map +1 -0
  460. package/dist/mcp/actions/service-token-access.d.ts +24 -0
  461. package/dist/mcp/actions/service-token-access.d.ts.map +1 -0
  462. package/dist/mcp/actions/service-token-access.js +63 -0
  463. package/dist/mcp/actions/service-token-access.js.map +1 -0
  464. package/dist/mcp/build-server.d.ts +42 -11
  465. package/dist/mcp/build-server.d.ts.map +1 -1
  466. package/dist/mcp/build-server.js +53 -3
  467. package/dist/mcp/build-server.js.map +1 -1
  468. package/dist/mcp/connect-route.d.ts +35 -0
  469. package/dist/mcp/connect-route.d.ts.map +1 -1
  470. package/dist/mcp/connect-route.js +57 -2
  471. package/dist/mcp/connect-route.js.map +1 -1
  472. package/dist/mcp/connect-store.d.ts +43 -0
  473. package/dist/mcp/connect-store.d.ts.map +1 -1
  474. package/dist/mcp/connect-store.js +129 -12
  475. package/dist/mcp/connect-store.js.map +1 -1
  476. package/dist/mcp/oauth-token.d.ts +10 -0
  477. package/dist/mcp/oauth-token.d.ts.map +1 -1
  478. package/dist/mcp/oauth-token.js +2 -0
  479. package/dist/mcp/oauth-token.js.map +1 -1
  480. package/dist/mcp/server.d.ts.map +1 -1
  481. package/dist/mcp/server.js +3 -0
  482. package/dist/mcp/server.js.map +1 -1
  483. package/dist/mcp-client/routes.js +1 -1
  484. package/dist/mcp-client/routes.js.map +1 -1
  485. package/dist/org/context.d.ts +4 -0
  486. package/dist/org/context.d.ts.map +1 -1
  487. package/dist/org/context.js +10 -0
  488. package/dist/org/context.js.map +1 -1
  489. package/dist/org/handlers.d.ts +11 -7
  490. package/dist/org/handlers.d.ts.map +1 -1
  491. package/dist/org/handlers.js +0 -8
  492. package/dist/org/handlers.js.map +1 -1
  493. package/dist/org/migrations.d.ts.map +1 -1
  494. package/dist/org/migrations.js +8 -0
  495. package/dist/org/migrations.js.map +1 -1
  496. package/dist/org/schema.d.ts +15 -15
  497. package/dist/progress/actions.d.ts.map +1 -1
  498. package/dist/progress/actions.js +13 -5
  499. package/dist/progress/actions.js.map +1 -1
  500. package/dist/provider-api/actions/delete-staged-dataset.d.ts +9 -0
  501. package/dist/provider-api/actions/delete-staged-dataset.d.ts.map +1 -0
  502. package/dist/provider-api/actions/delete-staged-dataset.js +35 -0
  503. package/dist/provider-api/actions/delete-staged-dataset.js.map +1 -0
  504. package/dist/provider-api/actions/list-staged-datasets.d.ts +15 -0
  505. package/dist/provider-api/actions/list-staged-datasets.d.ts.map +1 -0
  506. package/dist/provider-api/actions/list-staged-datasets.js +41 -0
  507. package/dist/provider-api/actions/list-staged-datasets.js.map +1 -0
  508. package/dist/provider-api/actions/query-staged-dataset.d.ts +29 -0
  509. package/dist/provider-api/actions/query-staged-dataset.d.ts.map +1 -0
  510. package/dist/provider-api/actions/query-staged-dataset.js +116 -0
  511. package/dist/provider-api/actions/query-staged-dataset.js.map +1 -0
  512. package/dist/provider-api/custom-registry.d.ts +92 -0
  513. package/dist/provider-api/custom-registry.d.ts.map +1 -0
  514. package/dist/provider-api/custom-registry.js +289 -0
  515. package/dist/provider-api/custom-registry.js.map +1 -0
  516. package/dist/provider-api/index.d.ts +88 -52
  517. package/dist/provider-api/index.d.ts.map +1 -1
  518. package/dist/provider-api/index.js +569 -23
  519. package/dist/provider-api/index.js.map +1 -1
  520. package/dist/provider-api/staged-datasets-aggregate.d.ts +46 -0
  521. package/dist/provider-api/staged-datasets-aggregate.d.ts.map +1 -0
  522. package/dist/provider-api/staged-datasets-aggregate.js +209 -0
  523. package/dist/provider-api/staged-datasets-aggregate.js.map +1 -0
  524. package/dist/provider-api/staged-datasets-store.d.ts +76 -0
  525. package/dist/provider-api/staged-datasets-store.d.ts.map +1 -0
  526. package/dist/provider-api/staged-datasets-store.js +319 -0
  527. package/dist/provider-api/staged-datasets-store.js.map +1 -0
  528. package/dist/provider-api/staging.d.ts +100 -0
  529. package/dist/provider-api/staging.d.ts.map +1 -0
  530. package/dist/provider-api/staging.js +281 -0
  531. package/dist/provider-api/staging.js.map +1 -0
  532. package/dist/resources/handlers.d.ts.map +1 -1
  533. package/dist/resources/handlers.js +13 -1
  534. package/dist/resources/handlers.js.map +1 -1
  535. package/dist/scripts/call-agent.d.ts.map +1 -1
  536. package/dist/scripts/call-agent.js +1 -2
  537. package/dist/scripts/call-agent.js.map +1 -1
  538. package/dist/scripts/resources/migrate-learnings.d.ts +1 -1
  539. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
  540. package/dist/scripts/resources/migrate-learnings.js +1 -1
  541. package/dist/scripts/resources/migrate-learnings.js.map +1 -1
  542. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  543. package/dist/secrets/register-framework-secrets.js +36 -3
  544. package/dist/secrets/register-framework-secrets.js.map +1 -1
  545. package/dist/secrets/schema.d.ts +7 -7
  546. package/dist/server/action-discovery.d.ts.map +1 -1
  547. package/dist/server/action-discovery.js +14 -0
  548. package/dist/server/action-discovery.js.map +1 -1
  549. package/dist/server/action-routes.d.ts.map +1 -1
  550. package/dist/server/action-routes.js +3 -2
  551. package/dist/server/action-routes.js.map +1 -1
  552. package/dist/server/agent-chat-plugin.d.ts +69 -0
  553. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  554. package/dist/server/agent-chat-plugin.js +369 -179
  555. package/dist/server/agent-chat-plugin.js.map +1 -1
  556. package/dist/server/agent-discovery.d.ts.map +1 -1
  557. package/dist/server/agent-discovery.js +13 -16
  558. package/dist/server/agent-discovery.js.map +1 -1
  559. package/dist/server/agent-teams-run-queue.d.ts +31 -8
  560. package/dist/server/agent-teams-run-queue.d.ts.map +1 -1
  561. package/dist/server/agent-teams-run-queue.js +61 -18
  562. package/dist/server/agent-teams-run-queue.js.map +1 -1
  563. package/dist/server/agent-teams.d.ts +27 -1
  564. package/dist/server/agent-teams.d.ts.map +1 -1
  565. package/dist/server/agent-teams.js +214 -14
  566. package/dist/server/agent-teams.js.map +1 -1
  567. package/dist/server/app-base-path.d.ts +20 -0
  568. package/dist/server/app-base-path.d.ts.map +1 -1
  569. package/dist/server/app-base-path.js +36 -0
  570. package/dist/server/app-base-path.js.map +1 -1
  571. package/dist/server/attachment-actions.d.ts +43 -0
  572. package/dist/server/attachment-actions.d.ts.map +1 -0
  573. package/dist/server/attachment-actions.js +214 -0
  574. package/dist/server/attachment-actions.js.map +1 -0
  575. package/dist/server/auth.js +1 -1
  576. package/dist/server/auth.js.map +1 -1
  577. package/dist/server/complete-text.d.ts +56 -0
  578. package/dist/server/complete-text.d.ts.map +1 -0
  579. package/dist/server/complete-text.js +147 -0
  580. package/dist/server/complete-text.js.map +1 -0
  581. package/dist/server/core-routes-plugin.d.ts +1 -0
  582. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  583. package/dist/server/core-routes-plugin.js +37 -27
  584. package/dist/server/core-routes-plugin.js.map +1 -1
  585. package/dist/server/cors-origins.d.ts.map +1 -1
  586. package/dist/server/cors-origins.js +6 -1
  587. package/dist/server/cors-origins.js.map +1 -1
  588. package/dist/server/create-server.d.ts.map +1 -1
  589. package/dist/server/create-server.js +2 -1
  590. package/dist/server/create-server.js.map +1 -1
  591. package/dist/server/csrf.d.ts +1 -1
  592. package/dist/server/csrf.d.ts.map +1 -1
  593. package/dist/server/email-actions.d.ts +19 -0
  594. package/dist/server/email-actions.d.ts.map +1 -0
  595. package/dist/server/email-actions.js +191 -0
  596. package/dist/server/email-actions.js.map +1 -0
  597. package/dist/server/embed-route.js +1 -1
  598. package/dist/server/embed-route.js.map +1 -1
  599. package/dist/server/embed-session.d.ts.map +1 -1
  600. package/dist/server/embed-session.js +5 -1
  601. package/dist/server/embed-session.js.map +1 -1
  602. package/dist/server/entry-server.d.ts +24 -0
  603. package/dist/server/entry-server.d.ts.map +1 -0
  604. package/dist/server/entry-server.js +54 -0
  605. package/dist/server/entry-server.js.map +1 -0
  606. package/dist/server/framework-request-handler.d.ts.map +1 -1
  607. package/dist/server/framework-request-handler.js +2 -10
  608. package/dist/server/framework-request-handler.js.map +1 -1
  609. package/dist/server/google-oauth.d.ts.map +1 -1
  610. package/dist/server/google-oauth.js +2 -9
  611. package/dist/server/google-oauth.js.map +1 -1
  612. package/dist/server/google-realtime-session.d.ts.map +1 -1
  613. package/dist/server/google-realtime-session.js +6 -4
  614. package/dist/server/google-realtime-session.js.map +1 -1
  615. package/dist/server/h3-helpers.d.ts +39 -0
  616. package/dist/server/h3-helpers.d.ts.map +1 -1
  617. package/dist/server/h3-helpers.js +104 -1
  618. package/dist/server/h3-helpers.js.map +1 -1
  619. package/dist/server/index.d.ts +2 -1
  620. package/dist/server/index.d.ts.map +1 -1
  621. package/dist/server/index.js +2 -1
  622. package/dist/server/index.js.map +1 -1
  623. package/dist/server/onboarding-html.d.ts.map +1 -1
  624. package/dist/server/onboarding-html.js +1 -8
  625. package/dist/server/onboarding-html.js.map +1 -1
  626. package/dist/server/open-route.d.ts.map +1 -1
  627. package/dist/server/open-route.js +1 -0
  628. package/dist/server/open-route.js.map +1 -1
  629. package/dist/server/prompts/framework-core-compact.d.ts +19 -0
  630. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -0
  631. package/dist/server/prompts/framework-core-compact.js +69 -0
  632. package/dist/server/prompts/framework-core-compact.js.map +1 -0
  633. package/dist/server/prompts/framework-core.d.ts +26 -0
  634. package/dist/server/prompts/framework-core.d.ts.map +1 -0
  635. package/dist/server/prompts/framework-core.js +130 -0
  636. package/dist/server/prompts/framework-core.js.map +1 -0
  637. package/dist/server/prompts/index.d.ts +9 -0
  638. package/dist/server/prompts/index.d.ts.map +1 -0
  639. package/dist/server/prompts/index.js +9 -0
  640. package/dist/server/prompts/index.js.map +1 -0
  641. package/dist/server/prompts/model-overlays.d.ts +18 -0
  642. package/dist/server/prompts/model-overlays.d.ts.map +1 -0
  643. package/dist/server/prompts/model-overlays.js +46 -0
  644. package/dist/server/prompts/model-overlays.js.map +1 -0
  645. package/dist/server/prompts/shared-rules.d.ts +29 -0
  646. package/dist/server/prompts/shared-rules.d.ts.map +1 -0
  647. package/dist/server/prompts/shared-rules.js +54 -0
  648. package/dist/server/prompts/shared-rules.js.map +1 -0
  649. package/dist/server/security-headers.d.ts +7 -1
  650. package/dist/server/security-headers.d.ts.map +1 -1
  651. package/dist/server/security-headers.js +11 -0
  652. package/dist/server/security-headers.js.map +1 -1
  653. package/dist/server/ssr-handler.d.ts.map +1 -1
  654. package/dist/server/ssr-handler.js +135 -46
  655. package/dist/server/ssr-handler.js.map +1 -1
  656. package/dist/server/transcribe-voice.d.ts.map +1 -1
  657. package/dist/server/transcribe-voice.js +7 -4
  658. package/dist/server/transcribe-voice.js.map +1 -1
  659. package/dist/settings/store.d.ts.map +1 -1
  660. package/dist/settings/store.js +9 -0
  661. package/dist/settings/store.js.map +1 -1
  662. package/dist/shared/markdown-block-split.d.ts +39 -0
  663. package/dist/shared/markdown-block-split.d.ts.map +1 -0
  664. package/dist/shared/markdown-block-split.js +97 -0
  665. package/dist/shared/markdown-block-split.js.map +1 -0
  666. package/dist/shared/reasoning-effort.js +13 -1
  667. package/dist/shared/reasoning-effort.js.map +1 -1
  668. package/dist/shared/streaming-text-smoothing.d.ts +18 -0
  669. package/dist/shared/streaming-text-smoothing.d.ts.map +1 -1
  670. package/dist/shared/streaming-text-smoothing.js +70 -4
  671. package/dist/shared/streaming-text-smoothing.js.map +1 -1
  672. package/dist/sharing/actions/list-resource-shares.d.ts +24 -1
  673. package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -1
  674. package/dist/sharing/actions/set-resource-visibility.d.ts +8 -1
  675. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  676. package/dist/sharing/actions/share-resource.d.ts +12 -1
  677. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  678. package/dist/sharing/actions/unshare-resource.d.ts +8 -1
  679. package/dist/sharing/actions/unshare-resource.d.ts.map +1 -1
  680. package/dist/sharing/schema.d.ts +10 -10
  681. package/dist/styles/agent-conversation.css +239 -0
  682. package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  683. package/dist/templates/default/AGENTS.md +1 -1
  684. package/dist/templates/default/DEVELOPING.md +19 -0
  685. package/dist/templates/default/app/entry.client.tsx +4 -1
  686. package/dist/templates/default/app/entry.server.tsx +4 -56
  687. package/dist/templates/default/app/global.css +3 -2
  688. package/dist/templates/default/app/root.tsx +8 -24
  689. package/dist/templates/default/app/routes/_index.tsx +0 -13
  690. package/dist/templates/default/package.json +6 -5
  691. package/dist/templates/default/tsconfig.json +2 -1
  692. package/dist/templates/starter-shell-sync.spec.ts +118 -0
  693. package/dist/templates/ui-primitives-sync.spec.ts +399 -0
  694. package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  695. package/dist/terminal/pty-server.js +1 -1
  696. package/dist/terminal/pty-server.js.map +1 -1
  697. package/dist/triggers/dispatcher.js +1 -1
  698. package/dist/triggers/dispatcher.js.map +1 -1
  699. package/dist/usage/store.d.ts.map +1 -1
  700. package/dist/usage/store.js +60 -7
  701. package/dist/usage/store.js.map +1 -1
  702. package/dist/vite/client.d.ts.map +1 -1
  703. package/dist/vite/client.js +44 -12
  704. package/dist/vite/client.js.map +1 -1
  705. package/dist/workspace-files/index.d.ts +4 -0
  706. package/dist/workspace-files/index.d.ts.map +1 -0
  707. package/dist/workspace-files/index.js +4 -0
  708. package/dist/workspace-files/index.js.map +1 -0
  709. package/dist/workspace-files/schema.d.ts +195 -0
  710. package/dist/workspace-files/schema.d.ts.map +1 -0
  711. package/dist/workspace-files/schema.js +48 -0
  712. package/dist/workspace-files/schema.js.map +1 -0
  713. package/dist/workspace-files/store.d.ts +89 -0
  714. package/dist/workspace-files/store.d.ts.map +1 -0
  715. package/dist/workspace-files/store.js +298 -0
  716. package/dist/workspace-files/store.js.map +1 -0
  717. package/dist/workspace-files/tool.d.ts +15 -0
  718. package/dist/workspace-files/tool.d.ts.map +1 -0
  719. package/dist/workspace-files/tool.js +225 -0
  720. package/dist/workspace-files/tool.js.map +1 -0
  721. package/docs/content/a2a-protocol.md +18 -12
  722. package/docs/content/actions.md +42 -10
  723. package/docs/content/agent-mentions.md +7 -8
  724. package/docs/content/agent-teams.md +23 -37
  725. package/docs/content/agent-web-surfaces.md +18 -9
  726. package/docs/content/authentication.md +6 -17
  727. package/docs/content/automations.md +43 -15
  728. package/docs/content/cli-adapters.md +25 -24
  729. package/docs/content/client.md +66 -17
  730. package/docs/content/cloneable-saas.md +19 -23
  731. package/docs/content/code-agents-ui.md +3 -31
  732. package/docs/content/components.md +308 -0
  733. package/docs/content/context-awareness.md +4 -0
  734. package/docs/content/creating-templates.md +4 -2
  735. package/docs/content/cross-app-sso.md +45 -19
  736. package/docs/content/database.md +26 -1
  737. package/docs/content/deployment.md +3 -1
  738. package/docs/content/dispatch.md +9 -37
  739. package/docs/content/drop-in-agent.md +123 -2
  740. package/docs/content/embedding-sdk.md +35 -0
  741. package/docs/content/extensions.md +2 -2
  742. package/docs/content/external-agents.md +86 -171
  743. package/docs/content/faq.md +6 -27
  744. package/docs/content/frames.md +9 -12
  745. package/docs/content/getting-started.md +80 -77
  746. package/docs/content/key-concepts.md +29 -19
  747. package/docs/content/mcp-apps.md +103 -0
  748. package/docs/content/mcp-clients.md +2 -2
  749. package/docs/content/mcp-protocol.md +40 -17
  750. package/docs/content/messaging.md +11 -4
  751. package/docs/content/migration-workbench.md +4 -47
  752. package/docs/content/multi-app-workspace.md +48 -17
  753. package/docs/content/multi-tenancy.md +1 -1
  754. package/docs/content/notifications.md +8 -6
  755. package/docs/content/observability.md +26 -15
  756. package/docs/content/onboarding.md +7 -1
  757. package/docs/content/pr-visual-recap.md +203 -23
  758. package/docs/content/progress.md +5 -5
  759. package/docs/content/pure-agent-apps.md +3 -1
  760. package/docs/content/real-time-collaboration.md +106 -0
  761. package/docs/content/recurring-jobs.md +17 -1
  762. package/docs/content/security.md +17 -3
  763. package/docs/content/server.md +39 -3
  764. package/docs/content/sharing.md +20 -1
  765. package/docs/content/skills-guide.md +151 -125
  766. package/docs/content/template-analytics.md +8 -0
  767. package/docs/content/template-assets.md +2 -0
  768. package/docs/content/template-brain.md +59 -3
  769. package/docs/content/template-calendar.md +8 -0
  770. package/docs/content/template-clips.md +11 -2
  771. package/docs/content/template-content.md +24 -4
  772. package/docs/content/template-design.md +19 -17
  773. package/docs/content/template-dispatch.md +2 -0
  774. package/docs/content/template-forms.md +28 -1
  775. package/docs/content/template-mail.md +17 -0
  776. package/docs/content/template-plan.md +177 -10
  777. package/docs/content/template-slides.md +51 -12
  778. package/docs/content/template-videos.md +17 -0
  779. package/docs/content/tracking.md +17 -13
  780. package/docs/content/using-your-agent.md +15 -5
  781. package/docs/content/voice-input.md +1 -1
  782. package/docs/content/what-is-agent-native.md +5 -6
  783. package/docs/content/workspace-connections.md +138 -424
  784. package/docs/content/workspace-management.md +12 -128
  785. package/docs/content/workspace.md +125 -199
  786. package/docs/content/writing-agent-instructions.md +17 -1
  787. package/package.json +26 -6
  788. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  789. package/src/templates/default/AGENTS.md +1 -1
  790. package/src/templates/default/DEVELOPING.md +19 -0
  791. package/src/templates/default/app/entry.client.tsx +4 -1
  792. package/src/templates/default/app/entry.server.tsx +4 -56
  793. package/src/templates/default/app/global.css +3 -2
  794. package/src/templates/default/app/root.tsx +8 -24
  795. package/src/templates/default/app/routes/_index.tsx +0 -13
  796. package/src/templates/default/package.json +6 -5
  797. package/src/templates/default/tsconfig.json +2 -1
  798. package/src/templates/starter-shell-sync.spec.ts +118 -0
  799. package/src/templates/ui-primitives-sync.spec.ts +399 -0
  800. package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  801. package/tsconfig.base.json +2 -10
  802. package/dist/cli/app-skill.d.ts +0 -157
  803. package/dist/cli/app-skill.d.ts.map +0 -1
  804. package/dist/cli/audit-agent-web.d.ts +0 -2
  805. package/dist/cli/audit-agent-web.d.ts.map +0 -1
  806. package/dist/cli/code-agent-connector.d.ts +0 -17
  807. package/dist/cli/code-agent-connector.d.ts.map +0 -1
  808. package/dist/cli/code.d.ts +0 -66
  809. package/dist/cli/code.d.ts.map +0 -1
  810. package/dist/cli/connect.d.ts +0 -140
  811. package/dist/cli/connect.d.ts.map +0 -1
  812. package/dist/cli/context-xray-local.d.ts +0 -16
  813. package/dist/cli/context-xray-local.d.ts.map +0 -1
  814. package/dist/cli/create-workspace.d.ts +0 -8
  815. package/dist/cli/create-workspace.d.ts.map +0 -1
  816. package/dist/cli/index.d.ts +0 -3
  817. package/dist/cli/index.d.ts.map +0 -1
  818. package/dist/cli/info.d.ts +0 -2
  819. package/dist/cli/info.d.ts.map +0 -1
  820. package/dist/cli/mcp-config-writers.d.ts +0 -82
  821. package/dist/cli/mcp-config-writers.d.ts.map +0 -1
  822. package/dist/cli/mcp.d.ts +0 -16
  823. package/dist/cli/mcp.d.ts.map +0 -1
  824. package/dist/cli/migrate.d.ts +0 -38
  825. package/dist/cli/migrate.d.ts.map +0 -1
  826. package/dist/cli/plan-local.d.ts +0 -43
  827. package/dist/cli/plan-local.d.ts.map +0 -1
  828. package/dist/cli/plan-publish-store.d.ts +0 -62
  829. package/dist/cli/plan-publish-store.d.ts.map +0 -1
  830. package/dist/cli/pr-visual-recap-workflow.d.ts +0 -11
  831. package/dist/cli/pr-visual-recap-workflow.d.ts.map +0 -1
  832. package/dist/cli/recap.d.ts +0 -297
  833. package/dist/cli/recap.d.ts.map +0 -1
  834. package/dist/cli/skills.d.ts +0 -162
  835. package/dist/cli/skills.d.ts.map +0 -1
  836. package/dist/cli/workspace-dev.d.ts +0 -96
  837. package/dist/cli/workspace-dev.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChat.js","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport {\n AssistantRuntimeProvider,\n useLocalRuntime,\n useThreadRuntime,\n useThread,\n useAui,\n useComposer,\n useComposerRuntime,\n useMessagePartText,\n useMessageRuntime,\n ThreadPrimitive,\n MessagePrimitive,\n} from \"@assistant-ui/react\";\nimport type {\n AttachmentAdapter,\n ChatModelAdapter,\n CompleteAttachment,\n ExportedMessageRepository,\n PendingAttachment,\n ToolCallMessagePartProps,\n Attachment,\n} from \"@assistant-ui/react\";\nimport { CompositeAttachmentAdapter } from \"@assistant-ui/react\";\nimport ReactMarkdown, { defaultUrlTransform } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport {\n createAgentChatAdapter,\n type AgentChatSurfaceKind,\n} from \"./agent-chat-adapter.js\";\nimport {\n appendAgentChatContextToMessage,\n formatAgentChatContextItemsForPrompt,\n normalizeAgentChatContextItem,\n publishAgentChatContextItems,\n refreshAgentChatContext,\n type AgentChatContextItem,\n} from \"./agent-chat.js\";\nimport {\n useAgentDynamicSuggestionsResult,\n type AgentDynamicSuggestionsOption,\n} from \"./dynamic-suggestions.js\";\nimport type { ReasoningEffort } from \"../shared/reasoning-effort.js\";\nimport {\n initialSmoothStreamingGraphemeCount,\n SMOOTH_STREAMING_COMMIT_INTERVAL_MS,\n smoothStreamingPunctuationDelayMs,\n smoothStreamingRevealCount,\n splitStreamingTextGraphemes,\n} from \"../shared/streaming-text-smoothing.js\";\nimport type { AgentMcpAppPayload } from \"../mcp-client/app-result.js\";\nimport type {\n ChatThreadScope,\n ChatThreadSnapshot,\n} from \"./use-chat-threads.js\";\nimport { getActiveRun } from \"./active-run-state.js\";\nimport {\n AgentAutoContinueSignal,\n type ContentPart,\n readSSEStreamRaw,\n} from \"./sse-event-processor.js\";\nimport { captureError } from \"./analytics.js\";\nimport {\n AssistantMessageListErrorBoundary,\n AssistantUiStaleIndexErrorBoundary,\n} from \"./assistant-ui-recovery.js\";\nimport { cn } from \"./utils.js\";\nimport { writeClipboardText } from \"./clipboard.js\";\nimport { useNearBottomAutoscroll } from \"./conversation/index.js\";\nimport { TextAttachmentAdapter } from \"./composer/attachment-accept.js\";\nimport { AgentTaskCard } from \"./AgentTaskCard.js\";\nimport { ConnectBuilderCard } from \"./ConnectBuilderCard.js\";\nimport { McpAppRenderer } from \"./mcp-apps/McpAppRenderer.js\";\nimport { humanizeToolName } from \"./tool-display.js\";\nimport { useBuilderConnectFlow } from \"./settings/useBuilderStatus.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./components/ui/dropdown-menu.js\";\nimport { IframeEmbed, parseEmbedBody } from \"./IframeEmbed.js\";\nimport {\n GuidedQuestionFlow,\n useGuidedQuestionFlow,\n} from \"./guided-questions.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport {\n saveAgentEngineApiKey,\n type AgentEngineProvider,\n} from \"./agent-engine-key.js\";\nimport {\n BUILDER_SPACE_SETTINGS_URL,\n NEW_CHAT_ACTION_HREF,\n} from \"./error-format.js\";\nimport { ThumbsFeedback } from \"./observability/ThumbsFeedback.js\";\nimport {\n TiptapComposer,\n type ComposerSubmitIntent,\n type TiptapComposerHandle,\n} from \"./composer/TiptapComposer.js\";\nimport { AgentComposerFrame } from \"./composer/AgentComposerFrame.js\";\nimport type {\n AgentComposerLayoutVariant,\n Reference,\n} from \"./composer/types.js\";\nimport { isPastedTextAttachmentName } from \"./composer/pasted-text.js\";\nimport { PastedTextChip } from \"./composer/PastedTextChip.js\";\nimport { ContextMeter } from \"./context-xray/ContextMeter.js\";\nimport {\n IconMessage,\n IconX,\n IconPlayerStop,\n IconCheck,\n IconChevronDown,\n IconCopy,\n IconTerminal,\n IconLoader2,\n IconCircleX,\n IconSquareFilled,\n IconClock,\n IconFile,\n IconFolder,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconStack2,\n IconMessageChatbot,\n IconArrowBackUp,\n IconExternalLink,\n IconKey,\n IconDots,\n IconGitFork,\n IconId,\n IconQuote,\n IconGauge,\n IconArrowRight,\n IconSettings,\n IconAlertTriangle,\n IconRefresh,\n IconPlayerPlay,\n IconClipboardList,\n IconSearch,\n IconArrowsMaximize,\n IconArrowsMinimize,\n IconPlus,\n} from \"@tabler/icons-react\";\n\nexport {\n AssistantMessageListErrorBoundary,\n AssistantUiStaleIndexErrorBoundary,\n assistantUiRecoverableRenderErrorKind,\n isAssistantUiRecoverableRenderError,\n isAssistantUiStaleIndexError,\n} from \"./assistant-ui-recovery.js\";\n\nclass DownscalingImageAttachmentAdapter implements AttachmentAdapter {\n public accept = \"image/*\";\n\n public async add(state: { file: File }): Promise<PendingAttachment> {\n return {\n id: state.file.name,\n type: \"image\",\n name: state.file.name,\n contentType: state.file.type,\n file: state.file,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [\n {\n type: \"image\",\n image: await getImageFileDataURL(attachment.file),\n },\n ],\n };\n }\n\n public async remove() {\n // noop\n }\n}\n\nclass BinaryDocumentAttachmentAdapter implements AttachmentAdapter {\n public accept = \"application/pdf,.pdf\";\n\n public async add(state: { file: File }): Promise<PendingAttachment> {\n return {\n id: state.file.name,\n type: \"document\",\n name: state.file.name,\n contentType: inferDocumentContentType(state.file),\n file: state.file,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [\n {\n type: \"file\",\n filename: attachment.name,\n data: await getFileDataURL(attachment.file),\n mimeType: inferDocumentContentType(attachment.file),\n },\n ],\n };\n }\n\n public async remove() {\n // noop\n }\n}\n\nfunction inferDocumentContentType(file: File): string {\n if (file.type) return file.type;\n if (file.name.toLowerCase().endsWith(\".pdf\")) return \"application/pdf\";\n return \"application/octet-stream\";\n}\n\nfunction getFileDataURL(file: File | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n}\n\n// Anthropic / OpenAI vision inputs choke on multi-megabyte images, and\n// base64-encoding a raw screenshot eats enough heap to crash the composer\n// (PayloadTooLarge / \"Maximum call stack\" in serializers). Downscale large\n// images on the client before we ever serialize them.\nconst MAX_IMAGE_BYTES = 4 * 1024 * 1024;\nconst MAX_IMAGE_DIMENSION = 2048;\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(\"Failed to decode pasted image\"));\n img.src = url;\n });\n}\n\nasync function getImageFileDataURL(file: File): Promise<string> {\n if (file.size <= MAX_IMAGE_BYTES) {\n return getFileDataURL(file);\n }\n if (typeof document === \"undefined\" || typeof Image === \"undefined\") {\n return getFileDataURL(file);\n }\n const objectUrl = URL.createObjectURL(file);\n try {\n const img = await loadImage(objectUrl);\n const ratio = Math.min(\n MAX_IMAGE_DIMENSION / img.naturalWidth,\n MAX_IMAGE_DIMENSION / img.naturalHeight,\n 1,\n );\n const width = Math.max(1, Math.round(img.naturalWidth * ratio));\n const height = Math.max(1, Math.round(img.naturalHeight * ratio));\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return getFileDataURL(file);\n }\n ctx.drawImage(img, 0, 0, width, height);\n const useJpeg =\n file.type !== \"image/png\" || file.size > MAX_IMAGE_BYTES * 2;\n return canvas.toDataURL(useJpeg ? \"image/jpeg\" : \"image/png\", 0.85);\n } catch {\n return getFileDataURL(file);\n } finally {\n URL.revokeObjectURL(objectUrl);\n }\n}\n\ntype QueuedAttachment = CompleteAttachment;\ntype AgentRequestMode = \"act\" | \"plan\";\nexport type AgentRecoveryAction = \"continue\" | \"retry\";\n\nfunction imageContentTypeFromDataUrl(dataUrl: string): string {\n const match = /^data:([^;,]+)/.exec(dataUrl);\n return match?.[1] || \"image/jpeg\";\n}\n\nfunction imageExtensionFromContentType(contentType: string): string {\n if (contentType === \"image/png\") return \"png\";\n if (contentType === \"image/webp\") return \"webp\";\n if (contentType === \"image/gif\") return \"gif\";\n return \"jpg\";\n}\n\nfunction createAgentImageAttachments(\n images?: readonly string[],\n): QueuedAttachment[] | undefined {\n const validImages = (images ?? []).filter((image) => image.trim().length > 0);\n if (validImages.length === 0) return undefined;\n\n return validImages.map((image, index) => {\n const contentType = imageContentTypeFromDataUrl(image);\n const extension = imageExtensionFromContentType(contentType);\n const name = `image-${index + 1}.${extension}`;\n return {\n id: `agent-chat-image-${index + 1}`,\n type: \"image\",\n name,\n contentType,\n status: { type: \"complete\" },\n content: [{ type: \"image\", image }],\n };\n });\n}\n\nfunction createUserMessageRunConfig(\n references?: Reference[],\n requestMode?: AgentRequestMode,\n recoveryAction?: AgentRecoveryAction,\n trackInRunsTray?: boolean,\n) {\n const custom: {\n references?: Reference[];\n requestMode?: AgentRequestMode;\n trackInRunsTray?: boolean;\n } = {};\n if (references && references.length > 0) {\n custom.references = references;\n }\n if (requestMode) {\n custom.requestMode = requestMode;\n }\n if (trackInRunsTray) {\n custom.trackInRunsTray = true;\n }\n const options: {\n runConfig?: { custom: typeof custom };\n metadata?: { custom: { agentNativeRecoveryAction: AgentRecoveryAction } };\n } = {};\n if (Object.keys(custom).length > 0) {\n options.runConfig = { custom };\n }\n if (recoveryAction) {\n options.metadata = {\n custom: { agentNativeRecoveryAction: recoveryAction },\n };\n }\n return options;\n}\n\nfunction escapeQueuedAttachmentAttribute(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n}\n\nfunction isTextLikeFile(file: File): boolean {\n if (file.type.startsWith(\"text/\")) return true;\n if (file.type === \"application/json\") return true;\n return /\\.(txt|md|markdown|csv|json|yaml|yml)$/i.test(file.name);\n}\n\nfunction textFileAttachmentEnvelope(file: File, text: string): string {\n const contentType = file.type || \"text/plain\";\n return `<attachment name=\"${escapeQueuedAttachmentAttribute(file.name)}\" contentType=\"${escapeQueuedAttachmentAttribute(contentType)}\">\\n${text}\\n</attachment>`;\n}\n\nfunction serializeAttachmentContentPart(\n part: Record<string, unknown>,\n): QueuedAttachment[\"content\"][number] | null {\n if (part.type === \"image\" && typeof part.image === \"string\") {\n return { type: \"image\", image: part.image };\n }\n if (part.type === \"text\" && typeof part.text === \"string\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"file\" && typeof part.data === \"string\") {\n return {\n type: \"file\",\n data: part.data,\n mimeType:\n typeof part.mimeType === \"string\"\n ? part.mimeType\n : \"application/octet-stream\",\n ...(typeof part.filename === \"string\" ? { filename: part.filename } : {}),\n };\n }\n return null;\n}\n\nasync function serializeQueuedAttachments(\n attachments?: ReadonlyArray<unknown>,\n): Promise<QueuedAttachment[] | undefined> {\n const queued: QueuedAttachment[] = [];\n for (const raw of attachments ?? []) {\n const attachment = raw as Partial<Attachment> & { file?: File };\n const name = attachment.name || attachment.file?.name || \"attachment\";\n const id = attachment.id || name;\n const type = attachment.type || \"file\";\n const contentType = attachment.contentType || attachment.file?.type;\n\n if (Array.isArray(attachment.content) && attachment.content.length > 0) {\n const content = attachment.content\n .map((part) =>\n serializeAttachmentContentPart(part as Record<string, unknown>),\n )\n .filter((part): part is QueuedAttachment[\"content\"][number] => !!part);\n if (content.length > 0) {\n queued.push({\n id,\n type,\n name,\n contentType,\n status: { type: \"complete\" },\n content,\n });\n }\n continue;\n }\n\n if (typeof File !== \"undefined\" && attachment.file instanceof File) {\n const file = attachment.file;\n if (file.type.startsWith(\"image/\")) {\n queued.push({\n id,\n type: \"image\",\n name,\n contentType: file.type,\n status: { type: \"complete\" },\n content: [{ type: \"image\", image: await getImageFileDataURL(file) }],\n });\n } else if (isTextLikeFile(file)) {\n queued.push({\n id,\n type: \"file\",\n name,\n contentType: file.type || \"text/plain\",\n status: { type: \"complete\" },\n content: [\n {\n type: \"text\",\n text: textFileAttachmentEnvelope(file, await file.text()),\n },\n ],\n });\n } else {\n queued.push({\n id,\n type: \"document\",\n name,\n contentType: inferDocumentContentType(file),\n status: { type: \"complete\" },\n content: [\n {\n type: \"file\",\n filename: file.name,\n data: await getFileDataURL(file),\n mimeType: inferDocumentContentType(file),\n },\n ],\n });\n }\n }\n }\n\n return queued.length > 0 ? queued : undefined;\n}\n\n// ─── Markdown Text ──────────────────────────────────────────────────────────\n\nconst markdownStyles = `\n.agent-markdown > :first-child { margin-top: 0; }\n.agent-markdown > :last-child { margin-bottom: 0; }\n.agent-markdown p { margin: 0.5em 0; }\n.agent-markdown ul, .agent-markdown ol { margin: 0.5em 0; padding-left: 1.5em; }\n.agent-markdown li { margin: 0.2em 0; }\n.agent-markdown li > p { margin: 0; }\n.agent-markdown h1 { font-size: 1.25em; font-weight: 600; margin: 0.75em 0 0.25em; }\n.agent-markdown h2 { font-size: 1.125em; font-weight: 600; margin: 0.75em 0 0.25em; }\n.agent-markdown h3 { font-size: 1em; font-weight: 600; margin: 0.75em 0 0.25em; }\n.agent-markdown strong { font-weight: 600; }\n.agent-markdown em { font-style: italic; }\n.agent-markdown code { font-size: 0.875em; padding: 0.15em 0.35em; border-radius: 0.25em; background: hsl(var(--muted, 0 0% 15%)); color: hsl(var(--foreground, 0 0% 90%)); border: 1px solid hsl(var(--border, 0 0% 80%)); }\n.agent-markdown pre { margin: 0.5em 0; padding: 0.75em 1em; border-radius: 0.375em; background: hsl(var(--muted, 0 0% 15%)); color: hsl(var(--foreground, 0 0% 90%)); overflow-x: auto; border: 1px solid hsl(var(--border, 0 0% 80%)); }\n.agent-markdown pre code { padding: 0; background: transparent; font-size: 0.8125em; color: inherit; border: none; }\n.agent-markdown-shiki { margin: 0.5em 0; border-radius: 0.375em; overflow: hidden; font-size: 0.8125em; }\n.agent-markdown-shiki pre { margin: 0; padding: 0.75em 1em; overflow-x: auto; background: var(--shiki-light-bg); color: var(--shiki-light); }\n.agent-markdown-shiki pre code { background: transparent; padding: 0; font-size: inherit; color: inherit; }\n.agent-markdown-shiki pre span { color: var(--shiki-light); background: var(--shiki-light-bg); }\n.dark .agent-markdown-shiki pre { background: var(--shiki-dark-bg); color: var(--shiki-dark); }\n.dark .agent-markdown-shiki pre span { color: var(--shiki-dark); background: var(--shiki-dark-bg); }\n@media (prefers-color-scheme: dark) { :root:not(.light) .agent-markdown-shiki pre { background: var(--shiki-dark-bg); color: var(--shiki-dark); } :root:not(.light) .agent-markdown-shiki pre span { color: var(--shiki-dark); background: var(--shiki-dark-bg); } }\n.agent-tool-code .agent-markdown-shiki { margin: 0; border-radius: 0; min-width: max-content; }\n.agent-tool-code .agent-markdown-shiki pre { padding: 0.75rem; border: 0; background: transparent; }\n.agent-tool-code .agent-markdown-shiki pre span { background: transparent; }\n.agent-tool-code pre { margin: 0; min-width: max-content; padding: 0.75rem; background: transparent; color: inherit; }\n.agent-tool-code mark { border-radius: 0.1875rem; background: rgba(245, 158, 11, 0.25); color: inherit; }\n.agent-markdown hr { border: none; border-top: 1px solid hsl(var(--border, 0 0% 20%)); margin: 0.75em 0 1em; }\n.agent-markdown a { text-decoration: underline; text-underline-offset: 2px; }\n.agent-markdown a.agent-markdown-cta { text-decoration: none; }\n.agent-markdown blockquote { border-left: 2px solid hsl(var(--border, 0 0% 20%)); padding-left: 0.75em; margin: 0.5em 0; opacity: 0.8; }\n.agent-markdown table { border-collapse: collapse; margin: 0.5em 0; font-size: 0.875em; }\n.agent-markdown th, .agent-markdown td { border: 1px solid hsl(var(--border, 0 0% 20%)); padding: 0.35em 0.65em; text-align: left; }\n.agent-markdown th { font-weight: 600; background: hsl(var(--muted, 0 0% 15%)); color: hsl(var(--foreground, 0 0% 90%)); }\n.agent-markdown[data-streaming=\"true\"] > :last-child:not(pre):not(table)::after { content: \"\"; display: inline-block; width: 0.42em; height: 1em; margin-left: 0.12em; border-radius: 999px; background: currentColor; opacity: 0.35; transform: translateY(0.16em); animation: agent-markdown-stream-caret 1.15s ease-in-out infinite; }\n@keyframes agent-markdown-stream-caret { 0%, 100% { opacity: 0.2; } 50% { opacity: 0.58; } }\n@media (prefers-reduced-motion: reduce) { .agent-markdown[data-streaming=\"true\"] > :last-child:not(pre):not(table)::after { animation: none; opacity: 0.28; } }\n`;\n\n/**\n * Pending selection context — written to application_state when the user\n * presses Cmd+I with text selected on the page. The agent's next turn picks\n * it up via the `selectionContextPromise` in production-agent. The pill\n * below tells the user the context is attached and lets them clear it.\n */\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\nconst ACTIVE_RUN_CLEAR_TIMEOUT_MS = 5_000;\nconst ACTIVE_RUN_POLL_INTERVAL_MS = 150;\n\ntype ActiveRunLookup = {\n active?: boolean;\n runId?: string;\n threadId?: string;\n status?: string;\n heartbeatAt?: number | null;\n};\n\nfunction activeRunLooksStale(runInfo: ActiveRunLookup): boolean {\n const heartbeatAt =\n typeof runInfo.heartbeatAt === \"number\" ? runInfo.heartbeatAt : null;\n return (\n runInfo.status === \"running\" &&\n heartbeatAt != null &&\n Date.now() - heartbeatAt > 5000\n );\n}\n\nfunction repoHasAssistantMessage(repo: any): boolean {\n return repo?.messages?.some(\n (m: { message?: { role?: string }; role?: string }) =>\n (m.message?.role ?? m.role) === \"assistant\",\n );\n}\n\nfunction getRepoMessages(repo: any): any[] {\n return Array.isArray(repo?.messages) ? repo.messages : [];\n}\n\nfunction getRepoMessage(entry: any): any {\n return entry?.message ?? entry;\n}\n\nfunction isAssistantMessageTerminal(message: any): boolean {\n const statusType =\n message?.status && typeof message.status === \"object\"\n ? message.status.type\n : undefined;\n return statusType === \"complete\" || statusType === \"incomplete\";\n}\n\nfunction repoTextLength(repo: any): number {\n let length = 0;\n for (const entry of getRepoMessages(repo)) {\n const message = getRepoMessage(entry);\n const content = message?.content;\n if (typeof content === \"string\") {\n length += content.length;\n } else if (Array.isArray(content)) {\n for (const part of content) {\n if (part?.type === \"text\" && typeof part.text === \"string\") {\n length += part.text.length;\n }\n }\n }\n }\n return length;\n}\n\nfunction repoTerminalAssistantCount(repo: any): number {\n return getRepoMessages(repo).filter((entry) => {\n const message = getRepoMessage(entry);\n return message?.role === \"assistant\" && isAssistantMessageTerminal(message);\n }).length;\n}\n\nfunction shouldImportServerThreadData(currentRepo: any, incomingRepo: any) {\n const incomingCount = getRepoMessages(incomingRepo).length;\n if (incomingCount === 0) return false;\n\n const currentCount = getRepoMessages(currentRepo).length;\n if (currentCount === 0) return true;\n if (incomingCount < currentCount) return false;\n\n if (incomingCount === currentCount) {\n const currentTerminalAssistants = repoTerminalAssistantCount(currentRepo);\n const incomingTerminalAssistants = repoTerminalAssistantCount(incomingRepo);\n if (incomingTerminalAssistants < currentTerminalAssistants) {\n return false;\n }\n if (\n incomingTerminalAssistants <= currentTerminalAssistants &&\n repoTextLength(incomingRepo) < repoTextLength(currentRepo)\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction cloneContentParts(content: ContentPart[]): ContentPart[] {\n return content.map((part) =>\n part.type === \"text\"\n ? { ...part }\n : {\n ...part,\n args: { ...part.args },\n ...(part.mcpApp ? { mcpApp: { ...part.mcpApp } } : {}),\n },\n );\n}\n\nfunction clearPendingSelection() {\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n {\n method: \"DELETE\",\n keepalive: true,\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"agent-panel:selection-cleared\"));\n }\n}\n\nasync function waitForThreadRunToClear(apiUrl: string, threadId?: string) {\n if (!threadId) return;\n const deadline = Date.now() + ACTIVE_RUN_CLEAR_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n try {\n const res = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (res.ok) {\n const info = await res.json();\n const heartbeatAt =\n typeof info?.heartbeatAt === \"number\" ? info.heartbeatAt : null;\n const stale =\n info?.status === \"running\" &&\n heartbeatAt != null &&\n Date.now() - heartbeatAt > 5000;\n if (!info?.active || info?.status !== \"running\" || stale) return;\n }\n } catch {\n // Transient poll failure — try again until the short grace period ends.\n }\n\n await new Promise((resolve) =>\n window.setTimeout(resolve, ACTIVE_RUN_POLL_INTERVAL_MS),\n );\n }\n}\n\ninterface FormattedMessageTimestamp {\n short: string;\n full: string;\n}\n\nfunction coerceMessageDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction isSameCalendarDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction formatMessageTimestamp(\n value: unknown,\n): FormattedMessageTimestamp | null {\n const date = coerceMessageDate(value);\n if (!date) return null;\n\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const time = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n\n let short: string;\n if (isSameCalendarDay(date, now)) {\n short = time;\n } else if (isSameCalendarDay(date, yesterday)) {\n short = `Yesterday ${time}`;\n } else if (date.getFullYear() === now.getFullYear()) {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n }).format(date)}, ${time}`;\n } else {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date)}, ${time}`;\n }\n\n return {\n short,\n full: new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date),\n };\n}\n\nfunction MessageTimestamp({\n timestamp,\n className,\n}: {\n timestamp: FormattedMessageTimestamp;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"text-[11px] leading-none text-muted-foreground\",\n className,\n )}\n title={timestamp.full}\n >\n {timestamp.short}\n </span>\n );\n}\n\nfunction SelectionAttachedPill() {\n const [length, setLength] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n )\n .then((r) => (r.ok && r.status !== 204 ? r.json() : null))\n .then((data) => {\n if (cancelled) return;\n const text =\n (data?.value?.text as string | undefined) ??\n (data?.text as string | undefined);\n if (text) setLength(text.length);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n function onAttached(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (typeof detail?.length === \"number\") setLength(detail.length);\n }\n function onCleared() {\n setLength(null);\n }\n window.addEventListener(\"agent-panel:selection-attached\", onAttached);\n window.addEventListener(\"agent-panel:selection-cleared\", onCleared);\n return () => {\n window.removeEventListener(\"agent-panel:selection-attached\", onAttached);\n window.removeEventListener(\"agent-panel:selection-cleared\", onCleared);\n };\n }, []);\n\n if (length === null || length === 0) return null;\n\n return (\n <div className=\"shrink-0 px-3 pt-1.5 -mb-1\">\n <div className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-[11px] text-muted-foreground\">\n <IconQuote size={11} />\n <span>{length.toLocaleString()} chars of selection attached</span>\n <button\n type=\"button\"\n aria-label=\"Clear selection context\"\n onClick={() => {\n setLength(null);\n clearPendingSelection();\n }}\n className=\"flex h-4 w-4 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/60\"\n >\n <IconX size={11} />\n </button>\n </div>\n </div>\n );\n}\n\nlet stylesInjected = false;\nfunction injectMarkdownStyles() {\n if (stylesInjected || typeof document === \"undefined\") return;\n stylesInjected = true;\n const style = document.createElement(\"style\");\n style.textContent = markdownStyles;\n document.head.appendChild(style);\n}\n\nfunction extractCodeText(child: React.ReactNode): string {\n if (typeof child === \"string\") return child;\n if (Array.isArray(child)) return child.map(extractCodeText).join(\"\");\n if (React.isValidElement(child)) {\n const props = child.props as { children?: React.ReactNode };\n return extractCodeText(props.children);\n }\n return \"\";\n}\n\n// Lazy-loaded shiki highlighter using the fine-grained API so we only ship\n// the languages and themes we actually use (instead of shiki's full ~30 MB\n// bundle of every grammar). This is required to keep the Cloudflare Pages\n// Functions bundle under the 25 MiB limit.\ntype ShikiHighlighter = {\n codeToHtml: (\n code: string,\n options: {\n lang: string;\n themes: { light: string; dark: string };\n defaultColor?: false | \"light\" | \"dark\";\n },\n ) => string | Promise<string>;\n getLoadedLanguages: () => string[];\n};\n\nlet highlighterLoader: Promise<ShikiHighlighter> | null = null;\nfunction loadHighlighter(): Promise<ShikiHighlighter> {\n if (!highlighterLoader) {\n highlighterLoader = (async () => {\n const [{ createHighlighterCore }, { createOnigurumaEngine }] =\n await Promise.all([\n import(\"shiki/core\"),\n import(\"shiki/engine/oniguruma\"),\n ]);\n return createHighlighterCore({\n themes: [\n import(\"shiki/themes/github-light-default.mjs\"),\n import(\"shiki/themes/github-dark-default.mjs\"),\n ],\n langs: [\n import(\"shiki/langs/javascript.mjs\"),\n import(\"shiki/langs/typescript.mjs\"),\n import(\"shiki/langs/jsx.mjs\"),\n import(\"shiki/langs/tsx.mjs\"),\n import(\"shiki/langs/json.mjs\"),\n import(\"shiki/langs/css.mjs\"),\n import(\"shiki/langs/html.mjs\"),\n import(\"shiki/langs/markdown.mjs\"),\n import(\"shiki/langs/bash.mjs\"),\n import(\"shiki/langs/shellscript.mjs\"),\n import(\"shiki/langs/python.mjs\"),\n import(\"shiki/langs/yaml.mjs\"),\n import(\"shiki/langs/sql.mjs\"),\n ],\n engine: createOnigurumaEngine(import(\"shiki/wasm\")),\n }) as unknown as Promise<ShikiHighlighter>;\n })().catch((error) => {\n // Reset on failure so a future code block can retry instead of\n // silently failing forever on a stale chunk / network blip.\n highlighterLoader = null;\n throw error;\n });\n }\n return highlighterLoader;\n}\n\nimport { PROVIDER_ENV_VARS } from \"../agent/engine/provider-env-vars.js\";\n\nconst PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);\n\n// Map a few common aliases to languages we bundled above.\nconst LANG_ALIASES: Record<string, string> = {\n js: \"javascript\",\n ts: \"typescript\",\n sh: \"bash\",\n shell: \"bash\",\n zsh: \"bash\",\n py: \"python\",\n yml: \"yaml\",\n md: \"markdown\",\n bq: \"sql\",\n bigquery: \"sql\",\n};\n\nfunction HighlightedCodeBlock({ code, lang }: { code: string; lang: string }) {\n const [html, setHtml] = useState<string | null>(null);\n useEffect(() => {\n let cancelled = false;\n loadHighlighter()\n .then((highlighter) => {\n const requested = (lang || \"text\").toLowerCase();\n const resolved = LANG_ALIASES[requested] ?? requested;\n const loaded = highlighter.getLoadedLanguages();\n const finalLang = loaded.includes(resolved) ? resolved : \"text\";\n return highlighter.codeToHtml(code, {\n lang: finalLang,\n themes: {\n light: \"github-light-default\",\n dark: \"github-dark-default\",\n },\n defaultColor: false,\n });\n })\n .then((out) => {\n if (!cancelled) setHtml(out);\n })\n .catch(() => {\n // Unknown language or other shiki failure — fall back to plain pre.\n if (!cancelled) setHtml(null);\n });\n return () => {\n cancelled = true;\n };\n }, [code, lang]);\n\n if (html) {\n return (\n <div\n className=\"agent-markdown-shiki\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n return (\n <pre>\n <code className={lang ? `language-${lang}` : undefined}>{code}</code>\n </pre>\n );\n}\n\nconst CTA_BUTTON_CLASSES =\n \"agent-markdown-cta mt-1 inline-flex items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background no-underline shadow-sm transition-colors hover:bg-foreground/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background cursor-pointer\";\n\nconst markdownComponents = {\n a(props: React.AnchorHTMLAttributes<HTMLAnchorElement>) {\n const {\n href,\n children,\n className,\n rel: _rel,\n target: _target,\n ...rest\n } = props;\n if (href === NEW_CHAT_ACTION_HREF) {\n // In-app action: dispatch a CustomEvent that MultiTabAssistantChat\n // listens for and opens a new chat tab. Not an external navigation.\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n window.dispatchEvent(new CustomEvent(\"agent-chat:new-chat\"));\n }}\n className={cn(CTA_BUTTON_CLASSES, className)}\n >\n <IconPlus size={13} strokeWidth={2} aria-hidden=\"true\" />\n <span>{children}</span>\n </button>\n );\n }\n const isBuilderCta = isBuilderErrorCtaHref(href);\n if (!isBuilderCta) {\n return (\n <a href={href} className={className} {...rest}>\n {children}\n </a>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={cn(CTA_BUTTON_CLASSES, className)}\n {...rest}\n >\n <span>{children}</span>\n <IconExternalLink size={13} strokeWidth={2} aria-hidden=\"true\" />\n </a>\n );\n },\n pre(props: React.HTMLAttributes<HTMLPreElement>) {\n const { children, ...rest } = props;\n if (React.isValidElement(children)) {\n const childProps = children.props as {\n className?: string;\n children?: React.ReactNode;\n };\n const className = childProps.className || \"\";\n if (/\\blanguage-embed\\b/.test(className)) {\n const body = extractCodeText(childProps.children);\n const parsed = parseEmbedBody(body);\n return (\n <IframeEmbed {...(parsed as Parameters<typeof IframeEmbed>[0])} />\n );\n }\n const langMatch = className.match(/\\blanguage-([\\w+-]+)\\b/);\n if (langMatch) {\n const code = extractCodeText(childProps.children).replace(/\\n$/, \"\");\n return <HighlightedCodeBlock code={code} lang={langMatch[1]} />;\n }\n }\n return <pre {...rest}>{children}</pre>;\n },\n};\n\nfunction isBuilderErrorCtaHref(href: string | undefined): boolean {\n if (!href) return false;\n try {\n const url = new URL(href);\n if (url.protocol !== \"https:\" || url.hostname !== \"builder.io\") {\n return false;\n }\n return (\n url.href === BUILDER_SPACE_SETTINGS_URL ||\n url.pathname === \"/account/billing\" ||\n /^\\/app\\/organizations\\/[^/]+\\/billing$/.test(url.pathname)\n );\n } catch {\n return false;\n }\n}\n\n// react-markdown's defaultUrlTransform strips href values whose protocol\n// isn't on its safe list (https, mailto, etc.). Our in-app pseudo-href\n// `agent-native:new-chat` would be blanked out by that, so let it through\n// while delegating every other URL to the default transform for sanitization.\nfunction markdownUrlTransform(value: string): string {\n if (value === NEW_CHAT_ACTION_HREF) return value;\n return defaultUrlTransform(value);\n}\n\nconst TextStreamingContext = React.createContext(false);\n\nfunction usePrefersReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(() =>\n typeof window !== \"undefined\" && window.matchMedia\n ? window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n : false,\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return undefined;\n\n const media = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const handleChange = () => setPrefersReducedMotion(media.matches);\n handleChange();\n\n if (typeof media.addEventListener === \"function\") {\n media.addEventListener(\"change\", handleChange);\n return () => media.removeEventListener(\"change\", handleChange);\n }\n\n media.addListener(handleChange);\n return () => media.removeListener(handleChange);\n }, []);\n\n return prefersReducedMotion;\n}\n\nfunction sliceGraphemes(\n targetText: string,\n graphemes: readonly string[],\n count: number,\n): string {\n if (count >= graphemes.length) return targetText;\n if (count <= 0) return \"\";\n return graphemes.slice(0, count).join(\"\");\n}\n\nfunction useSmoothStreamingText(\n targetText: string,\n streaming: boolean,\n resetKey: string,\n): string {\n const prefersReducedMotion = usePrefersReducedMotion();\n const [visibleText, setVisibleText] = useState(() => {\n if (!streaming || prefersReducedMotion) return targetText;\n const graphemes = splitStreamingTextGraphemes(targetText);\n return sliceGraphemes(\n targetText,\n graphemes,\n initialSmoothStreamingGraphemeCount(graphemes),\n );\n });\n const visibleTextRef = useRef(visibleText);\n const visibleCountRef = useRef(\n splitStreamingTextGraphemes(visibleText).length,\n );\n const targetTextRef = useRef(targetText);\n const targetGraphemesRef = useRef(splitStreamingTextGraphemes(targetText));\n const frameRef = useRef<number | null>(null);\n const lastCommitAtRef = useRef(0);\n const pauseUntilRef = useRef(0);\n const resetKeyRef = useRef(resetKey);\n const stepRef = useRef<(time: number) => void>(() => {});\n\n const commitVisibleCount = useCallback((nextCount: number) => {\n const graphemes = targetGraphemesRef.current;\n const boundedCount = Math.max(0, Math.min(nextCount, graphemes.length));\n const nextText = sliceGraphemes(\n targetTextRef.current,\n graphemes,\n boundedCount,\n );\n visibleCountRef.current = boundedCount;\n if (visibleTextRef.current !== nextText) {\n visibleTextRef.current = nextText;\n setVisibleText(nextText);\n }\n }, []);\n\n const cancelFrame = useCallback(() => {\n if (\n frameRef.current != null &&\n typeof window !== \"undefined\" &&\n typeof window.cancelAnimationFrame === \"function\"\n ) {\n window.cancelAnimationFrame(frameRef.current);\n }\n frameRef.current = null;\n pauseUntilRef.current = 0;\n }, []);\n\n const scheduleFrame = useCallback(() => {\n if (frameRef.current != null) return;\n if (\n typeof window === \"undefined\" ||\n typeof window.requestAnimationFrame !== \"function\"\n ) {\n commitVisibleCount(targetGraphemesRef.current.length);\n return;\n }\n\n frameRef.current = window.requestAnimationFrame((time) => {\n frameRef.current = null;\n stepRef.current(time);\n });\n }, [commitVisibleCount]);\n\n stepRef.current = (time) => {\n const targetGraphemes = targetGraphemesRef.current;\n const backlog = targetGraphemes.length - visibleCountRef.current;\n if (backlog <= 0) {\n pauseUntilRef.current = 0;\n return;\n }\n\n if (pauseUntilRef.current > time) {\n scheduleFrame();\n return;\n }\n\n const lastCommitAt =\n lastCommitAtRef.current || time - SMOOTH_STREAMING_COMMIT_INTERVAL_MS;\n if (\n time - lastCommitAt < SMOOTH_STREAMING_COMMIT_INTERVAL_MS &&\n backlog > 1\n ) {\n scheduleFrame();\n return;\n }\n\n const revealCount = smoothStreamingRevealCount({\n backlog,\n elapsedMs: Math.min(120, Math.max(8, time - lastCommitAt)),\n });\n\n if (revealCount > 0) {\n const nextCount = visibleCountRef.current + revealCount;\n commitVisibleCount(nextCount);\n lastCommitAtRef.current = time;\n const nextBacklog = targetGraphemes.length - visibleCountRef.current;\n const pauseMs = smoothStreamingPunctuationDelayMs(\n targetGraphemes[visibleCountRef.current - 1],\n nextBacklog,\n );\n pauseUntilRef.current = pauseMs > 0 ? time + pauseMs : 0;\n }\n\n if (visibleCountRef.current < targetGraphemes.length) {\n scheduleFrame();\n } else {\n pauseUntilRef.current = 0;\n }\n };\n\n useEffect(() => {\n const targetGraphemes = splitStreamingTextGraphemes(targetText);\n targetTextRef.current = targetText;\n targetGraphemesRef.current = targetGraphemes;\n\n const keyChanged = resetKeyRef.current !== resetKey;\n resetKeyRef.current = resetKey;\n\n if (!streaming || prefersReducedMotion) {\n cancelFrame();\n commitVisibleCount(targetGraphemes.length);\n return;\n }\n\n const visibleNoLongerMatchesTarget =\n visibleTextRef.current.length > 0 &&\n !targetText.startsWith(visibleTextRef.current);\n\n if (\n visibleNoLongerMatchesTarget ||\n visibleCountRef.current > targetGraphemes.length ||\n (keyChanged && visibleTextRef.current.length === 0)\n ) {\n commitVisibleCount(initialSmoothStreamingGraphemeCount(targetGraphemes));\n lastCommitAtRef.current = 0;\n pauseUntilRef.current = 0;\n }\n\n if (visibleCountRef.current < targetGraphemes.length) {\n scheduleFrame();\n }\n }, [\n targetText,\n streaming,\n prefersReducedMotion,\n resetKey,\n cancelFrame,\n commitVisibleCount,\n scheduleFrame,\n ]);\n\n useEffect(() => cancelFrame, [cancelFrame]);\n\n return visibleText;\n}\n\nfunction SmoothMarkdownText({\n text,\n streaming,\n resetKey,\n statusType = \"complete\",\n}: {\n text: string;\n streaming: boolean;\n resetKey: string;\n statusType?: string;\n}) {\n useEffect(() => {\n injectMarkdownStyles();\n }, []);\n\n const visibleText = useSmoothStreamingText(text, streaming, resetKey);\n const isVisuallyStreaming = streaming && visibleText !== text;\n\n return (\n <div\n className=\"agent-markdown break-words\"\n data-status={statusType}\n data-streaming={isVisuallyStreaming ? \"true\" : undefined}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {visibleText}\n </ReactMarkdown>\n </div>\n );\n}\n\nfunction MarkdownText() {\n const textPart = useMessagePartText();\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const thread = useThread();\n const textStreaming = React.useContext(TextStreamingContext);\n const lastMessage = thread.messages[thread.messages.length - 1];\n const isLastAssistantMessage =\n message.role === \"assistant\" && lastMessage?.id === message.id;\n const statusType =\n textPart.status?.type ?? message.status?.type ?? \"complete\";\n\n return (\n <SmoothMarkdownText\n text={textPart.text}\n streaming={textStreaming && isLastAssistantMessage}\n resetKey={`${message.id}:${statusType}`}\n statusType={statusType}\n />\n );\n}\n\n// ─── Composer Attachment Preview ─────────────────────────────────────────────\n\nfunction getImageAttachmentSrc(attachment: Attachment): string | null {\n if (attachment.type !== \"image\") return null;\n\n if (\"file\" in attachment && attachment.file) {\n return URL.createObjectURL(attachment.file);\n }\n\n const imagePart = attachment.content?.find((part) => part.type === \"image\");\n return imagePart && \"image\" in imagePart ? imagePart.image : null;\n}\n\nfunction ComposerAttachmentPreviewCard({\n attachment,\n onRemove,\n}: {\n attachment: Attachment;\n onRemove: (id: string) => void;\n}) {\n const [imageSrc, setImageSrc] = useState<string | null>(null);\n\n useEffect(() => {\n const nextSrc = getImageAttachmentSrc(attachment);\n setImageSrc(nextSrc);\n\n return () => {\n if (nextSrc?.startsWith(\"blob:\")) {\n URL.revokeObjectURL(nextSrc);\n }\n };\n }, [attachment]);\n\n if (isPastedTextAttachmentName(attachment.name)) {\n return <PastedTextChip attachment={attachment} onRemove={onRemove} />;\n }\n\n const isImage = !!imageSrc;\n\n return (\n <div\n className={cn(\n \"group relative overflow-hidden border border-border/70 bg-muted/50 text-foreground\",\n isImage\n ? \"h-20 w-20 rounded-xl shadow-[0_12px_30px_-18px_rgba(0,0,0,0.7)]\"\n : \"inline-flex max-w-[220px] items-center gap-2 rounded-lg px-2.5 py-2 text-xs\",\n )}\n >\n {isImage ? (\n <>\n <img\n src={imageSrc}\n alt={attachment.name}\n className=\"h-full w-full object-cover\"\n />\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent px-2 py-1.5\">\n <div className=\"truncate text-[10px] font-medium text-white/95\">\n {attachment.name}\n </div>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-background text-[10px] font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {attachment.name.split(\".\").pop() || \"file\"}\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium\">{attachment.name}</div>\n <div className=\"text-[11px] text-muted-foreground\">\n {attachment.contentType || attachment.type}\n </div>\n </div>\n </>\n )}\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n className={cn(\n \"absolute flex h-6 w-6 items-center justify-center rounded-full border border-border/60 bg-background/95 text-muted-foreground shadow-sm transition hover:text-foreground\",\n isImage\n ? \"right-1.5 top-1.5 opacity-100 md:opacity-0 md:group-hover:opacity-100\"\n : \"right-1.5 top-1.5\",\n )}\n aria-label={`Remove ${attachment.name}`}\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\nfunction ComposerAttachmentPreviewStrip() {\n const attachments = useComposer((state) => state.attachments);\n const aui = useAui();\n\n const handleRemove = useCallback(\n (id: string) => {\n void aui.composer().attachment({ id }).remove();\n },\n [aui],\n );\n\n if (attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2 px-2 pt-2\">\n {attachments.map((attachment) => (\n <ComposerAttachmentPreviewCard\n key={attachment.id}\n attachment={attachment}\n onRemove={handleRemove}\n />\n ))}\n </div>\n );\n}\n\n// Provides the parent's combined running state to tool-call renderers so they\n// can stop spinning when the user clicks stop. `thread.isRunning` alone misses\n// the force-stopped case; `part.result === undefined` alone ignores stop.\nconst ChatRunningContext = React.createContext(false);\n\n// ─── Tool Call Display ──────────────────────────────────────────────────────\n// Shared presentational component for rendering a tool call pill + result.\n// Used by both the normal message path (ToolCallFallback) and the reconnect\n// stream path (ReconnectStreamMessage). All state is passed as props — no\n// assistant-ui hooks here.\n\ntype ToolDetailSection = \"input\" | \"result\";\ntype ToolDetailPayload = {\n section: ToolDetailSection;\n title: string;\n text: string;\n copyText: string;\n lang: string;\n};\n\nfunction stringifyToolValue(value: unknown, pretty = false): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, pretty ? 2 : 0);\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction looksLikeSql(text: string): boolean {\n return /^\\s*(select|with|insert|update|delete|merge|create|alter|drop|explain|declare|begin)\\b/i.test(\n text,\n );\n}\n\nfunction parseJsonText(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed || !/^[{[]/.test(trimmed)) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n}\n\nfunction inferToolTextLanguage(\n text: string,\n key?: string,\n toolName?: string,\n): string {\n const keyName = (key ?? \"\").toLowerCase();\n const tool = (toolName ?? \"\").toLowerCase();\n if (\n keyName === \"sql\" ||\n keyName.endsWith(\"sql\") ||\n keyName === \"query\" ||\n tool.includes(\"bigquery\") ||\n tool.includes(\"db-query\") ||\n looksLikeSql(text)\n ) {\n return \"sql\";\n }\n return parseJsonText(text) ? \"json\" : \"text\";\n}\n\nfunction formatToolTextValue(\n value: unknown,\n key?: string,\n toolName?: string,\n): { text: string; lang: string } {\n if (typeof value === \"string\") {\n const parsed = parseJsonText(value);\n if (parsed) {\n return { text: JSON.stringify(parsed, null, 2), lang: \"json\" };\n }\n return {\n text: value,\n lang: inferToolTextLanguage(value, key, toolName),\n };\n }\n return { text: stringifyToolValue(value, true), lang: \"json\" };\n}\n\nfunction toolInputPayload(\n toolName: string,\n args: Record<string, unknown>,\n): ToolDetailPayload | null {\n const entries = Object.entries(args);\n if (entries.length === 0) return null;\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n const formatted = formatToolTextValue(value, key, toolName);\n const normalizedKey = key.toLowerCase();\n const keyLabel =\n normalizedKey === \"sql\" || normalizedKey.endsWith(\"sql\") ? \"SQL\" : key;\n return {\n section: \"input\",\n title: `Input - ${keyLabel}`,\n text: formatted.text,\n copyText:\n typeof value === \"string\" ? value : stringifyToolValue(value, true),\n lang: formatted.lang,\n };\n }\n return {\n section: \"input\",\n title: \"Input\",\n text: JSON.stringify(args, null, 2),\n copyText: JSON.stringify(args, null, 2),\n lang: \"json\",\n };\n}\n\nfunction toolResultPayload(\n result: string | undefined,\n): ToolDetailPayload | null {\n if (result === undefined) return null;\n const formatted = formatToolTextValue(result);\n return {\n section: \"result\",\n title: \"Result\",\n text: formatted.text,\n copyText: result,\n lang: formatted.lang,\n };\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction countTextMatches(text: string, query: string): number {\n const needle = query.trim();\n if (!needle) return 0;\n return Array.from(text.matchAll(new RegExp(escapeRegExp(needle), \"gi\")))\n .length;\n}\n\nfunction renderHighlightedSearchText(\n text: string,\n query: string,\n): React.ReactNode {\n const needle = query.trim();\n if (!needle) return text;\n const regex = new RegExp(escapeRegExp(needle), \"gi\");\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text))) {\n if (match.index > lastIndex) {\n parts.push(text.slice(lastIndex, match.index));\n }\n parts.push(<mark key={`${match.index}-${match[0]}`}>{match[0]}</mark>);\n lastIndex = match.index + match[0].length;\n if (match[0].length === 0) regex.lastIndex += 1;\n }\n if (lastIndex < text.length) parts.push(text.slice(lastIndex));\n return parts;\n}\n\nfunction ToolDetailViewer({ payload }: { payload: ToolDetailPayload }) {\n const [expanded, setExpanded] = useState(false);\n const [searchOpen, setSearchOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [copied, setCopied] = useState(false);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const matchCount = useMemo(\n () => countTextMatches(payload.text, search),\n [payload.text, search],\n );\n\n useEffect(() => {\n return () => {\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n };\n }, []);\n\n const copyValue = useCallback(async () => {\n try {\n if (await writeClipboardText(payload.copyText)) {\n setCopied(true);\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n copyResetRef.current = setTimeout(() => setCopied(false), 1200);\n }\n } catch {\n // Clipboard failures should not interrupt chat rendering.\n }\n }, [payload.copyText]);\n\n return (\n <div className=\"rounded-md border border-border/50 bg-background/60\">\n <div className=\"flex min-h-9 flex-wrap items-center gap-2 border-b border-border/50 px-2.5 py-1.5\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-[11px] font-medium text-foreground/85\">\n {payload.title}\n </span>\n {payload.lang !== \"text\" && (\n <span className=\"shrink-0 rounded border border-border/60 px-1 py-0.5 font-mono text-[9px] uppercase leading-none text-muted-foreground\">\n {payload.lang}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => setSearchOpen((v) => !v)}\n aria-label={`Search ${payload.title.toLowerCase()}`}\n aria-pressed={searchOpen}\n className={cn(\n \"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\",\n searchOpen && \"bg-accent text-foreground\",\n )}\n >\n <IconSearch size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-label={expanded ? \"Shrink code viewer\" : \"Expand code viewer\"}\n aria-pressed={expanded}\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {expanded ? (\n <IconArrowsMinimize size={12} />\n ) : (\n <IconArrowsMaximize size={12} />\n )}\n </button>\n <button\n type=\"button\"\n onClick={copyValue}\n className=\"inline-flex h-6 items-center gap-1 rounded-md px-1.5 font-sans text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {copied ? <IconCheck size={12} /> : <IconCopy size={12} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n {searchOpen && (\n <div className=\"flex items-center gap-2 border-b border-border/50 px-2.5 py-2\">\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Find\"\n className=\"h-7 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none placeholder:text-muted-foreground focus:ring-1 focus:ring-ring\"\n />\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {search.trim() ? matchCount : \"\"}\n </span>\n </div>\n )}\n <div\n className={cn(\n \"agent-tool-code overflow-auto font-mono text-[11px] leading-relaxed text-foreground\",\n expanded ? \"max-h-[70vh]\" : \"max-h-72\",\n )}\n >\n {search.trim() ? (\n <pre>\n <code>{renderHighlightedSearchText(payload.text, search)}</code>\n </pre>\n ) : (\n <HighlightedCodeBlock code={payload.text} lang={payload.lang} />\n )}\n </div>\n </div>\n );\n}\n\nfunction ToolCallDisplay({\n toolName,\n argsText,\n args,\n result,\n mcpApp,\n isRunning,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n mcpApp?: AgentMcpAppPayload;\n isRunning: boolean;\n}) {\n const streamRef = useRef<HTMLDivElement>(null);\n const isAgentCall = toolName.startsWith(\"agent:\");\n const [expanded, setExpanded] = useState(isAgentCall);\n const agentName = isAgentCall ? toolName.slice(6) : null;\n const isAgentError = isAgentCall && result === \"Error calling agent\";\n const agentStreamText = isAgentCall ? (argsText ?? \"\") : \"\";\n const hasStreamText = agentStreamText.length > 0;\n const hasArgs = !isAgentCall && Object.keys(args).length > 0;\n\n // NOTE: All hooks must be above any conditional returns\n useEffect(() => {\n if (isAgentCall && isRunning && streamRef.current) {\n streamRef.current.scrollTop = streamRef.current.scrollHeight;\n }\n }, [agentStreamText, isAgentCall, isRunning]);\n\n // Render connect-builder as ConnectBuilderCard once the result is available\n if (toolName === \"connect-builder\" && result) {\n try {\n const parsed = JSON.parse(result);\n if (parsed?.kind === \"connect-builder-card\") {\n return (\n <ConnectBuilderCard\n configured={!!parsed.configured}\n builderEnabled={parsed.builderEnabled !== false}\n // Ignore saved cliAuthUrl values from older tool results. They\n // contain signed callback state and can expire while a chat sits\n // open; the card's hook fetches a fresh signed URL on mount/click.\n connectUrl={parsed.connectUrl || \"\"}\n orgName={parsed.orgName ?? null}\n prompt={typeof parsed.prompt === \"string\" ? parsed.prompt : \"\"}\n />\n );\n }\n } catch {\n // fall through to default pill rendering\n }\n }\n\n // Render agent-teams spawn as AgentTaskCard once the result is available\n if (\n toolName === \"agent-teams\" &&\n (args as Record<string, string>)?.action === \"spawn\" &&\n result\n ) {\n try {\n const parsed = JSON.parse(result);\n if (parsed.taskId && parsed.threadId) {\n return (\n <AgentTaskCard\n taskId={parsed.taskId}\n threadId={parsed.threadId}\n description={\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"Sub-agent task\"\n }\n onOpen={(tid) => {\n window.dispatchEvent(\n new CustomEvent(\"agent-task-open\", {\n detail: {\n threadId: tid,\n description:\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"\",\n name: parsed.name || \"\",\n },\n }),\n );\n }}\n />\n );\n }\n } catch {\n // Fall through to default pill rendering\n }\n }\n\n const inputPayload = hasArgs ? toolInputPayload(toolName, args) : null;\n const resultPayload = toolResultPayload(result);\n\n const displayName = isAgentCall\n ? isRunning\n ? `Asking ${agentName}...`\n : isAgentError\n ? `Error asking ${agentName}`\n : `Asked ${agentName}`\n : humanizeToolName(toolName);\n\n const canExpand = isAgentCall\n ? hasStreamText\n : hasArgs || result !== undefined;\n const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;\n\n return (\n <div className=\"my-1 overflow-hidden\">\n {mcpApp && <McpAppRenderer app={mcpApp} className=\"mb-1.5\" />}\n <button\n onClick={() => canExpand && setExpanded(!isExpanded)}\n aria-expanded={canExpand ? isExpanded : undefined}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left overflow-hidden\",\n isRunning\n ? \"bg-muted text-muted-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-accent\",\n )}\n >\n <span className=\"shrink-0\">\n {isRunning ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : isAgentError ? (\n <IconCircleX className=\"h-3 w-3 text-destructive\" />\n ) : result !== undefined ? (\n <IconCheck className=\"h-3 w-3 text-emerald-500\" />\n ) : (\n <IconSquareFilled className=\"h-3 w-3 text-muted-foreground\" />\n )}\n </span>\n <span className=\"truncate min-w-0\">\n <span className=\"font-medium\">{displayName}</span>\n </span>\n {canExpand && (\n <IconChevronDown\n className={cn(\n \"ml-auto h-3 w-3 shrink-0 opacity-40\",\n isExpanded && \"rotate-180\",\n )}\n />\n )}\n </button>\n {isExpanded && isAgentCall && hasStreamText && (\n <div\n ref={streamRef}\n className=\"mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none\"\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {agentStreamText}\n </ReactMarkdown>\n </div>\n )}\n {isExpanded && !isAgentCall && (hasArgs || result !== undefined) && (\n <div className=\"mt-1 space-y-2 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground\">\n {inputPayload && <ToolDetailViewer payload={inputPayload} />}\n {resultPayload && <ToolDetailViewer payload={resultPayload} />}\n </div>\n )}\n </div>\n );\n}\n\nfunction ToolCallFallback({\n toolName,\n args,\n argsText,\n result,\n ...rest\n}: ToolCallMessagePartProps & { mcpApp?: AgentMcpAppPayload }) {\n const chatRunning = React.useContext(ChatRunningContext);\n const isRunning = result === undefined && chatRunning;\n return (\n <ToolCallDisplay\n toolName={toolName}\n args={args as Record<string, unknown>}\n argsText={argsText}\n result={\n typeof result === \"string\"\n ? result\n : result !== undefined\n ? JSON.stringify(result)\n : undefined\n }\n mcpApp={rest.mcpApp}\n isRunning={isRunning}\n />\n );\n}\n\n// ─── Reconnect Stream Message ───────────────────────────────────────────────\n// Renders the agent's in-progress response during reconnection (outside\n// assistant-ui's runtime). Uses the same visual styling as normal messages.\n\nfunction ReconnectStreamMessage({ content }: { content: ContentPart[] }) {\n const chatRunning = React.useContext(ChatRunningContext);\n\n return (\n <div className=\"flex justify-start\">\n <div className=\"max-w-[95%] text-sm leading-relaxed text-foreground space-y-1\">\n {content.map((part, i) => {\n if (part.type === \"text\") {\n return (\n <SmoothMarkdownText\n key={`reconnect-text-${i}`}\n text={part.text}\n streaming={chatRunning}\n resetKey={`reconnect-text-${i}`}\n statusType={chatRunning ? \"running\" : \"complete\"}\n />\n );\n }\n if (part.type === \"tool-call\") {\n return (\n <ToolCallDisplay\n key={`reconnect-tool-${i}`}\n toolName={part.toolName}\n argsText={part.argsText}\n args={part.args}\n result={part.result}\n mcpApp={part.mcpApp}\n isRunning={part.result === undefined && chatRunning}\n />\n );\n }\n return null;\n })}\n </div>\n </div>\n );\n}\n\n// ─── Message Components ─────────────────────────────────────────────────────\n\nconst mentionIconProps = {\n size: 14,\n className: \"shrink-0 text-muted-foreground\",\n};\n\nfunction MentionChipIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...mentionIconProps} />;\n case \"document\":\n return <IconFileText {...mentionIconProps} />;\n case \"form\":\n return <IconCheckbox {...mentionIconProps} />;\n case \"email\":\n return <IconMail {...mentionIconProps} />;\n case \"user\":\n return <IconUser {...mentionIconProps} />;\n case \"deck\":\n return <IconPresentation {...mentionIconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...mentionIconProps} />;\n case \"file\":\n return <IconFile {...mentionIconProps} />;\n default:\n return <IconStack2 {...mentionIconProps} />;\n }\n}\n\n// Matches rich mention format: @[label|icon] or plain @word\nconst richMentionPattern = /@\\[([^\\]|]+)\\|([^\\]]+)\\]/g;\nconst plainMentionPattern = /((?:^|(?<=\\s))@(\\w+))/g;\n\nfunction UserMessageText({ text }: { text: string }) {\n // Strip injected <context>...</context> blocks before display\n const displayText = displayableUserMessageText(text);\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let hasRichMentions = false;\n\n // First try rich mentions (@[label|icon])\n richMentionPattern.lastIndex = 0;\n while ((match = richMentionPattern.exec(displayText)) !== null) {\n hasRichMentions = true;\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const label = match[1];\n const icon = match[2];\n parts.push(\n <span\n key={matchStart}\n 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-all\"\n data-mention-label={label}\n >\n <MentionChipIcon icon={icon} />\n <span className=\"truncate\">{label}</span>\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (hasRichMentions) {\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n return <>{parts}</>;\n }\n\n // Fallback: plain @word mentions (for older messages)\n plainMentionPattern.lastIndex = 0;\n while ((match = plainMentionPattern.exec(displayText)) !== null) {\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const mentionName = match[2];\n parts.push(\n <span\n key={matchStart}\n 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 select-all\"\n data-mention-label={mentionName}\n >\n @{mentionName}\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n\n return <>{parts.length > 0 ? parts : displayText}</>;\n}\n\nexport function displayableUserMessageText(text: string): string {\n return text.replace(/<context>[\\s\\S]*?<\\/context>\\n?/g, \"\").trim();\n}\n\nfunction UserMessageAttachments() {\n const messageRuntime = useMessageRuntime();\n const msg = messageRuntime.getState();\n // assistant-ui stores user attachments on msg.attachments (separate from content).\n // Each attachment has: { id, type, name, contentType?, content: MessagePart[] }.\n // Image adapters put a {type:\"image\", image:\"data:...\"} part in content; text\n // adapters put a {type:\"text\", text:\"<attachment>...\"} part. Fall back to a\n // file chip when there's no inline image.\n const attachments = (msg as { attachments?: readonly Attachment[] })\n .attachments;\n if (!attachments || attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap justify-end gap-1.5 mb-1.5\">\n {attachments.map((att) => {\n if (isPastedTextAttachmentName(att.name)) {\n return <PastedTextChip key={att.id} attachment={att} compact />;\n }\n\n const imagePart = att.content?.find(\n (p): p is { type: \"image\"; image: string } =>\n p.type === \"image\" && \"image\" in p && !!p.image,\n );\n if (imagePart) {\n return (\n <div\n key={att.id}\n className=\"h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50\"\n title={att.name}\n >\n <img\n src={imagePart.image}\n alt={att.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n );\n }\n return (\n <div\n key={att.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/70 bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground\"\n title={att.name}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate max-w-[120px]\">{att.name || \"file\"}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction UserMessage() {\n const [expanded, setExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(message.createdAt);\n const hasDisplayableText =\n message.content\n ?.filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .some((part) => displayableUserMessageText(part.text).length > 0) ??\n false;\n\n useEffect(() => {\n const el = contentRef.current;\n if (!el || !hasDisplayableText) return;\n\n const measure = () => {\n setIsExpandable(el.scrollHeight > 200);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasDisplayableText]);\n\n return (\n <div\n className=\"group flex justify-end\"\n style={{ contentVisibility: \"auto\" }}\n >\n <div className=\"max-w-[85%]\">\n <UserMessageAttachments />\n {hasDisplayableText && (\n <div\n className=\"relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground\"\n onCopy={(e) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const fragment = selection.getRangeAt(0).cloneContents();\n const mentions = fragment.querySelectorAll(\n \"[data-mention-label]\",\n );\n if (mentions.length === 0) return;\n e.preventDefault();\n mentions.forEach((el) => {\n el.textContent = `@${el.getAttribute(\"data-mention-label\")}`;\n });\n const div = document.createElement(\"div\");\n div.appendChild(fragment);\n e.clipboardData.setData(\"text/plain\", div.textContent || \"\");\n }}\n >\n <div\n ref={contentRef}\n className={cn(\n \"whitespace-pre-wrap break-words\",\n !expanded && isExpandable && \"max-h-[200px] overflow-hidden\",\n )}\n >\n <MessagePrimitive.Parts\n components={{\n Text: UserMessageText,\n }}\n />\n </div>\n {!expanded && isExpandable && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-14 rounded-b-lg bg-gradient-to-t from-accent via-accent/90 to-transparent\" />\n )}\n </div>\n )}\n {hasDisplayableText && isExpandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"mt-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Collapse\" : \"Expand\"}\n </button>\n )}\n {timestamp && (\n <div className=\"mt-1 flex justify-end\">\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\nconst CheckpointContext = React.createContext<{\n apiUrl: string;\n devMode: boolean;\n threadId?: string;\n} | null>(null);\n\nconst MessageActionsContext = React.createContext<{\n onForkChat?: () => void | boolean | Promise<void | boolean>;\n} | null>(null);\n\nfunction MessageActionsMenu({\n showRevert,\n onRevert,\n}: {\n showRevert?: boolean;\n onRevert?: () => void;\n} = {}) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState<string | null>(null);\n const messageRuntime = useMessageRuntime();\n const actionsCtx = React.useContext(MessageActionsContext);\n const timestamp = formatMessageTimestamp(messageRuntime.getState().createdAt);\n\n const handleCopyMessage = useCallback(() => {\n const m = messageRuntime.getState();\n const text = m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n void writeClipboardText(text).then((ok) => {\n if (!ok) return;\n setCopied(\"message\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleCopyRequestId = useCallback(() => {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | {\n custom?: { runId?: unknown };\n runId?: unknown;\n }\n | undefined;\n // Live yields put the trace ID at metadata.custom.runId; server-persisted\n // messages put it at metadata.runId. If neither is present (e.g. the run\n // is still in flight and this is the first message), fall back to the\n // active-run state so a hung / mid-stream chat still surfaces a usable\n // trace ID. Last resort is the assistant-ui local message id.\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n (typeof window !== \"undefined\" ? getActiveRun()?.runId : null) ||\n m.id ||\n \"\";\n void writeClipboardText(runId).then((ok) => {\n if (!ok) return;\n setCopied(\"id\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleForkChat = useCallback(() => {\n setOpen(false);\n actionsCtx?.onForkChat?.();\n }, [actionsCtx]);\n\n const handleRevert = useCallback(() => {\n setOpen(false);\n onRevert?.();\n }, [onRevert]);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n aria-label=\"Message actions\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground\",\n open && \"bg-accent text-foreground\",\n )}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={6}\n className=\"w-48 rounded-lg border-border p-1.5 shadow-xl\"\n >\n {actionsCtx?.onForkChat && (\n <DropdownMenuItem onSelect={handleForkChat}>\n <IconGitFork className=\"h-3.5 w-3.5\" />\n Fork Chat\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyMessage();\n }}\n >\n {copied === \"message\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"message\" ? \"Copied!\" : \"Copy Message\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyRequestId();\n }}\n >\n {copied === \"id\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconId className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"id\" ? \"Copied!\" : \"Copy Request ID\"}\n </DropdownMenuItem>\n {showRevert && (\n <DropdownMenuItem onSelect={handleRevert}>\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Revert to here\n </DropdownMenuItem>\n )}\n {timestamp && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"px-2 py-1 text-[11px] font-normal text-muted-foreground\">\n Sent {timestamp.short}\n </DropdownMenuLabel>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction AssistantMessage() {\n const [restoreState, setRestoreState] = useState<\n \"idle\" | \"confirming\" | \"restoring\"\n >(\"idle\");\n const messageRuntime = useMessageRuntime();\n const thread = useThread();\n const chatRunning = React.useContext(ChatRunningContext);\n const msg = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(msg.createdAt);\n const isLast =\n thread.messages.length > 0 &&\n thread.messages[thread.messages.length - 1].id === msg.id;\n const isComplete = !isLast || !chatRunning;\n const cpCtx = React.useContext(CheckpointContext);\n\n const handleRestore = useCallback(async () => {\n if (restoreState === \"idle\") {\n setRestoreState(\"confirming\");\n return;\n }\n if (restoreState !== \"confirming\" || !cpCtx) return;\n setRestoreState(\"restoring\");\n try {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n null;\n if (!runId) {\n setRestoreState(\"idle\");\n return;\n }\n const tid = cpCtx.threadId || \"\";\n const res = await fetch(\n `${cpCtx.apiUrl}/checkpoints?threadId=${encodeURIComponent(tid)}`,\n );\n const checkpoints: any[] = res.ok ? await res.json() : [];\n const checkpoint = checkpoints.find((cp: any) => cp.runId === runId);\n if (!checkpoint) {\n setRestoreState(\"idle\");\n return;\n }\n const restoreRes = await fetch(`${cpCtx.apiUrl}/checkpoints/restore`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ checkpointId: checkpoint.id }),\n });\n if (restoreRes.ok) {\n window.location.reload();\n } else {\n setRestoreState(\"idle\");\n }\n } catch {\n setRestoreState(\"idle\");\n }\n }, [restoreState, cpCtx, messageRuntime]);\n\n const cancelRestore = useCallback(() => {\n setRestoreState(\"idle\");\n }, []);\n\n const showRestore = cpCtx?.devMode && isComplete && !isLast;\n\n return (\n <div\n className=\"group relative\"\n style={{ contentVisibility: isComplete ? \"auto\" : \"visible\" }}\n >\n <div className=\"max-w-[95%] text-sm leading-relaxed text-foreground\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: {\n Fallback: ToolCallFallback,\n },\n }}\n />\n </div>\n {isComplete && (\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <MessageActionsMenu\n showRevert={showRestore && restoreState === \"idle\"}\n onRevert={handleRestore}\n />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n {showRestore && restoreState === \"confirming\" ? (\n <div className=\"flex items-center gap-1 text-xs\">\n <button\n onClick={handleRestore}\n className=\"rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90\"\n >\n Restore to here?\n </button>\n <button\n onClick={cancelRestore}\n className=\"rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n </div>\n ) : showRestore && restoreState === \"restoring\" ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n Restoring...\n </span>\n ) : (\n <ThumbsFeedback\n threadId={cpCtx?.threadId ?? \"\"}\n runId={(() => {\n const meta = messageRuntime.getState().metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n return (\n (typeof meta?.custom?.runId === \"string\" &&\n meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n \"\"\n );\n })()}\n messageSeq={thread.messages.findIndex((m) => m.id === msg.id)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Thinking Indicator ─────────────────────────────────────────────────────\n\nfunction RunningActivityStatus({ label }: { label: string }) {\n return (\n <div className=\"agent-running-activity shrink-0 px-4 pb-2\">\n <ThinkingIndicator label={label} />\n </div>\n );\n}\n\nfunction ThinkingIndicator({ label = \"Thinking\" }: { label?: string } = {}) {\n const [dots, setDots] = useState(0);\n useEffect(() => {\n const interval = setInterval(() => {\n setDots((d) => (d + 1) % 4);\n }, 400);\n return () => clearInterval(interval);\n }, []);\n return (\n <div className=\"flex items-center text-muted-foreground\">\n <span className=\"text-xs\">\n {label}\n {\".\".repeat(dots)}\n </span>\n </div>\n );\n}\n\n// ─── Builder.io Connect CTA (shared by setup + usage-limit cards) ───────────\n//\n// Renders a single row with left-aligned copy and a right-aligned action.\n// Click opens the Builder CLI-auth popup via the shared\n// `useBuilderConnectFlow` hook (which owns the synchronous window.open,\n// the 2s status poll, and the focus-refresh). On success the hook broadcasts\n// a config-change event and this card clears its local `missingApiKey` gate\n// so the user can start chatting without a full-page reload.\n//\n// Desktop note: when this component runs inside the Electron shell, the\n// window.open call is intercepted by the main process's webview popup handler,\n// which opens the flow in an Electron BrowserWindow that shares the webview's\n// session. See packages/desktop-app/src/main/index.ts.\n\nfunction BuilderConnectCta({\n variant = \"primary\",\n onConnected,\n}: {\n variant?: \"primary\" | \"compact\";\n onConnected?: () => void;\n}) {\n const { configured, orgName, connecting, error, start } =\n useBuilderConnectFlow({\n trackingSource: \"assistant_chat_builder_cta\",\n onConnected,\n });\n\n const containerClass =\n variant === \"compact\"\n ? \"rounded-md border border-border px-3 py-2.5\"\n : \"flex items-center gap-3 rounded-md border border-border px-3 py-3\";\n\n if (configured) {\n return (\n <div className={containerClass}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-foreground\">Builder.io</div>\n <p className=\"text-[11px] text-muted-foreground mt-0.5\">\n {orgName ? `Connected — ${orgName}` : \"Connected\"}\n </p>\n </div>\n <span className=\"ml-auto inline-flex items-center gap-1 shrink-0 rounded-md bg-emerald-500/10 px-2 py-0.5 text-[10px] font-medium text-emerald-500\">\n <IconCheck size={10} />\n Connected\n </span>\n </div>\n );\n }\n\n return (\n <div className={containerClass}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-foreground\">\n Connect Builder.io\n </div>\n <p className=\"text-[11px] text-muted-foreground mt-0.5 max-w-[220px]\">\n Free credits for LLM, hosting, and more — no API key needed\n </p>\n {error && <p className=\"mt-1 text-[10px] text-destructive\">{error}</p>}\n </div>\n <button\n type=\"button\"\n onClick={() => start()}\n disabled={connecting}\n className=\"ml-auto inline-flex items-center gap-1 shrink-0 rounded-md bg-foreground px-3 py-1.5 text-[11px] font-medium no-underline text-background hover:opacity-90 disabled:opacity-60 disabled:cursor-wait\"\n aria-busy={connecting}\n >\n {connecting ? (\n <>\n <IconLoader2 size={10} className=\"animate-spin\" />\n Waiting…\n </>\n ) : (\n <>\n Connect\n <IconExternalLink size={10} />\n </>\n )}\n </button>\n </div>\n );\n}\n\n// ─── Builder Setup Card ─────────────────────────────────────────────────────\n\nfunction BuilderSetupCard({\n onConnected,\n bouncePulse,\n}: {\n onConnected?: () => void;\n bouncePulse?: number;\n}) {\n // Progressive disclosure: the card leads with the one-click Builder connect.\n // The bring-your-own-key path stays tucked behind a single link so the chat\n // stays clean for people who connect Builder or never use the side chat at\n // all (they can keep driving the plan from their own coding agent).\n const [keyOpen, setKeyOpen] = useState(false);\n\n const cardRef = useRef<HTMLDivElement>(null);\n // Replay the bounce keyframe each time bouncePulse increments. Toggling the\n // class off-then-on (with a forced reflow) restarts the animation even when\n // the value changes back-to-back.\n useEffect(() => {\n if (!bouncePulse) return;\n const el = cardRef.current;\n if (!el) return;\n el.classList.remove(\"animate-bounce-once\");\n void el.offsetWidth;\n el.classList.add(\"animate-bounce-once\");\n }, [bouncePulse]);\n\n return (\n <div\n ref={cardRef}\n className=\"mx-4 my-6 rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted\">\n <IconMessage className=\"h-4.5 w-4.5 text-muted-foreground\" />\n </div>\n <div>\n <h3 className=\"text-sm font-medium text-foreground\">\n Turn on the side chat\n </h3>\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n One click to connect Builder for free hosted access — no API key or\n account needed.\n </p>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n <BuilderConnectCta onConnected={onConnected} />\n\n {keyOpen ? (\n <ApiKeyConnect onConnected={onConnected} />\n ) : (\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={() => setKeyOpen(true)}\n className=\"text-[11px] text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n Or paste your own Anthropic or OpenAI key\n </button>\n </div>\n )}\n\n <p className=\"text-center text-[11px] leading-relaxed text-muted-foreground\">\n You can skip this and keep editing the plan with your own coding\n agent.\n </p>\n </div>\n </div>\n );\n}\n\n// ─── Inline BYOK (Anthropic / OpenAI) ───────────────────────────────────────\n\nconst API_KEY_PROVIDERS: Array<{\n value: AgentEngineProvider;\n label: string;\n placeholder: string;\n}> = [\n { value: \"anthropic\", label: \"Anthropic\", placeholder: \"sk-ant-…\" },\n { value: \"openai\", label: \"OpenAI\", placeholder: \"sk-…\" },\n];\n\nfunction ApiKeyConnect({ onConnected }: { onConnected?: () => void }) {\n const [provider, setProvider] = useState<AgentEngineProvider>(\"anthropic\");\n const [apiKey, setApiKey] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const active = API_KEY_PROVIDERS.find((p) => p.value === provider)!;\n\n const handleSave = useCallback(async () => {\n if (!apiKey.trim() || saving) return;\n setSaving(true);\n setError(null);\n try {\n await saveAgentEngineApiKey({ provider, apiKey });\n setApiKey(\"\");\n onConnected?.();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Could not save the key.\");\n } finally {\n setSaving(false);\n }\n }, [apiKey, onConnected, provider, saving]);\n\n return (\n <div className=\"rounded-md border border-border bg-background/60 p-3\">\n <div className=\"mb-2 flex items-center gap-1.5 text-[11px] font-medium text-foreground\">\n <IconKey size={12} strokeWidth={1.9} />\n Use your own API key\n </div>\n <p className=\"mb-2.5 text-[11px] leading-relaxed text-muted-foreground\">\n Stored locally for this app only — no account required.\n </p>\n <div\n role=\"tablist\"\n aria-label=\"API key provider\"\n className=\"mb-2 inline-flex rounded-md border border-border bg-muted/40 p-0.5\"\n >\n {API_KEY_PROVIDERS.map((option) => {\n const selected = option.value === provider;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => {\n setProvider(option.value);\n setError(null);\n }}\n className={cn(\n \"rounded px-2.5 py-1 text-[11px] font-medium transition-colors\",\n selected\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"password\"\n value={apiKey}\n autoComplete=\"off\"\n spellCheck={false}\n placeholder={active.placeholder}\n onChange={(e) => {\n setApiKey(e.target.value);\n if (error) setError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleSave();\n }\n }}\n className=\"h-8 min-w-0 flex-1 rounded-md border border-input bg-background px-2.5 text-[12px] text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\"\n />\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={!apiKey.trim() || saving}\n className=\"inline-flex h-8 shrink-0 items-center gap-1 rounded-md bg-foreground px-3 text-[11px] font-medium text-background hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60\"\n >\n {saving ? (\n <>\n <IconLoader2 size={11} className=\"animate-spin\" />\n Saving…\n </>\n ) : (\n \"Save\"\n )}\n </button>\n </div>\n {error ? (\n <p className=\"mt-2 text-[11px] text-destructive\">{error}</p>\n ) : null}\n </div>\n );\n}\n\n// ─── Loop Limit Continue Card ───────────────────────────────────────────────\n\ntype LoopLimitInfo = { maxIterations?: number };\ntype RunErrorInfo = {\n message: string;\n details?: string;\n errorCode?: string;\n runId?: string;\n recoverable?: boolean;\n};\n\ninterface AgentLoopSettingsResponse {\n maxIterations: number;\n defaultMaxIterations: number;\n minMaxIterations: number;\n maxMaxIterations: number;\n scope: \"org\" | \"user\" | \"default\";\n source: \"org\" | \"user\" | \"env\" | \"default\";\n canUpdate: boolean;\n orgName?: string | null;\n role?: string | null;\n}\n\nfunction getLoopLimitMetadata(message: unknown): LoopLimitInfo | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { loopLimit?: LoopLimitInfo };\n loopLimit?: LoopLimitInfo;\n }\n | undefined;\n const loopLimit = meta?.custom?.loopLimit ?? meta?.loopLimit;\n if (!loopLimit || typeof loopLimit !== \"object\") return null;\n return {\n ...(typeof loopLimit.maxIterations === \"number\"\n ? { maxIterations: loopLimit.maxIterations }\n : {}),\n };\n}\n\nfunction getRunErrorMetadata(message: unknown): RunErrorInfo | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { runError?: RunErrorInfo; runId?: unknown };\n runError?: RunErrorInfo;\n runId?: unknown;\n }\n | undefined;\n const runError = meta?.custom?.runError ?? meta?.runError;\n if (!runError || typeof runError !== \"object\") return null;\n const messageText =\n typeof runError.message === \"string\" ? runError.message : \"\";\n if (!messageText) return null;\n const runId =\n typeof runError.runId === \"string\"\n ? runError.runId\n : typeof meta?.custom?.runId === \"string\"\n ? meta.custom.runId\n : typeof meta?.runId === \"string\"\n ? meta.runId\n : undefined;\n return {\n message: messageText,\n ...(typeof runError.details === \"string\"\n ? { details: runError.details }\n : {}),\n ...(typeof runError.errorCode === \"string\"\n ? { errorCode: runError.errorCode }\n : {}),\n ...(runId ? { runId } : {}),\n ...(runError.recoverable ? { recoverable: true } : {}),\n };\n}\n\nfunction getRequestModeMetadata(message: unknown): AgentRequestMode | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { requestMode?: unknown };\n requestMode?: unknown;\n }\n | undefined;\n const requestMode = meta?.custom?.requestMode ?? meta?.requestMode;\n return requestMode === \"act\" || requestMode === \"plan\" ? requestMode : null;\n}\n\nfunction isBuilderReconnectRunError(info: RunErrorInfo): boolean {\n const code = (info.errorCode ?? \"\").toLowerCase();\n const message = info.message.toLowerCase();\n const isAuthCode =\n code === \"authentication_error\" ||\n code === \"unauthorized\" ||\n code === \"http_401\" ||\n code === \"http_403\";\n return (\n code === \"builder_auth_error\" ||\n message.includes(\"builder authentication failed\") ||\n (isAuthCode &&\n (message.includes(\"invalid token\") ||\n message.includes(\"personal access token\")))\n );\n}\n\nfunction isProviderQueryRunError(info: RunErrorInfo): boolean {\n const text = [info.errorCode, info.message, info.details]\n .filter(Boolean)\n .join(\"\\n\")\n .toLowerCase();\n return (\n text.includes(\"bigquery\") ||\n text.includes(\"sql\") ||\n text.includes(\"query\") ||\n text.includes(\"schema\") ||\n text.includes(\"syntax\") ||\n text.includes(\"unknown column\") ||\n text.includes(\"unknown table\") ||\n text.includes(\"type mismatch\")\n );\n}\n\nfunction isConnectionRecoveryRunError(info: RunErrorInfo): boolean {\n const code = (info.errorCode ?? \"\").toLowerCase();\n const message = info.message.toLowerCase();\n return (\n code === \"connection_error\" ||\n message.includes(\"connection kept failing\") ||\n message.includes(\"automatic recovery attempts\")\n );\n}\n\nfunction getMessageText(message: unknown): string {\n const msg = (message as { message?: unknown })?.message ?? message;\n const content = (msg as { content?: unknown })?.content;\n if (Array.isArray(content)) {\n return content\n .filter((p: any) => p?.type === \"text\" && typeof p.text === \"string\")\n .map((p: any) => p.text)\n .join(\"\\n\")\n .trim();\n }\n return typeof content === \"string\" ? content.trim() : \"\";\n}\n\nfunction contentPartFollowKey(part: any): string {\n const type = typeof part?.type === \"string\" ? part.type : \"unknown\";\n if (type === \"text\") return `t:${String(part.text ?? \"\").length}`;\n if (type === \"tool-call\") {\n return [\n \"tool\",\n part.toolCallId ?? \"\",\n part.toolName ?? \"\",\n part.status?.type ?? \"\",\n String(part.argsText ?? \"\").length,\n String(part.result ?? \"\").length,\n part.mcpApp ? 1 : 0,\n ].join(\":\");\n }\n if (type === \"image\") return `image:${String(part.image ?? \"\").length}`;\n return `${type}:${String(part.text ?? part.result ?? \"\").length}`;\n}\n\nfunction contentFollowKey(content: unknown): string {\n if (typeof content === \"string\") return `t:${content.length}`;\n if (Array.isArray(content))\n return content.map(contentPartFollowKey).join(\"|\");\n return \"\";\n}\n\nfunction messageFollowKey(message: unknown): string {\n const msg = ((message as { message?: unknown })?.message ?? message) as {\n id?: unknown;\n role?: unknown;\n status?: { type?: unknown; reason?: unknown };\n content?: unknown;\n };\n return [\n String(msg?.id ?? \"\"),\n String(msg?.role ?? \"\"),\n String(msg?.status?.type ?? \"\"),\n String(msg?.status?.reason ?? \"\"),\n contentFollowKey(msg?.content),\n ].join(\",\");\n}\n\nfunction queuedMessageFollowKey(message: {\n id: string;\n text: string;\n images?: string[];\n attachments?: QueuedAttachment[];\n references?: Reference[];\n requestMode?: AgentRequestMode;\n recoveryAction?: AgentRecoveryAction;\n}): string {\n return [\n message.id,\n message.text.length,\n message.images?.length ?? 0,\n message.attachments?.length ?? 0,\n message.references?.length ?? 0,\n message.requestMode ?? \"\",\n message.recoveryAction ?? \"\",\n ].join(\":\");\n}\n\nfunction reconnectContentFollowKey(content: ContentPart[]): string {\n return content.map(contentPartFollowKey).join(\"|\");\n}\n\nconst RECOVERY_USER_MESSAGE_PREFIXES = [\n \"Continue from where you left off\",\n \"Continue from where you stopped\",\n \"Retry the previous request from a clean approach\",\n];\n\nfunction getRecoveryActionMetadata(\n message: unknown,\n): AgentRecoveryAction | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | { custom?: { agentNativeRecoveryAction?: unknown } }\n | undefined;\n const action = meta?.custom?.agentNativeRecoveryAction;\n return action === \"continue\" || action === \"retry\" ? action : null;\n}\n\nfunction isRecoveryUserMessage(message: unknown): boolean {\n if (getRecoveryActionMetadata(message)) return true;\n const text = getMessageText(message);\n return RECOVERY_USER_MESSAGE_PREFIXES.some((prefix) =>\n text.startsWith(prefix),\n );\n}\n\nexport function latestNonRecoveryUserMessageText(\n messages: readonly unknown[],\n): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i] as { role?: unknown };\n if (message?.role !== \"user\") continue;\n if (isRecoveryUserMessage(message)) continue;\n const text = getMessageText(message);\n if (text) return text;\n }\n return \"\";\n}\n\nfunction RunErrorRecoveryCard({\n info,\n onContinue,\n onRetry,\n onFork,\n onDismiss,\n}: {\n info: RunErrorInfo;\n onContinue: () => void;\n onRetry: () => void;\n onFork?: () => void | boolean | Promise<void | boolean>;\n onDismiss: () => void;\n}) {\n const [detailsOpen, setDetailsOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n const [forking, setForking] = useState(false);\n const [forkError, setForkError] = useState<string | null>(null);\n const builderReconnect = useBuilderConnectFlow({\n trackingSource: \"assistant_chat_reconnect_error\",\n });\n const canRecover = info.recoverable === true;\n const shouldShowBuilderReconnect = isBuilderReconnectRunError(info);\n const builderReconnectResolved =\n shouldShowBuilderReconnect &&\n builderReconnect.hasFetchedStatus &&\n builderReconnect.configured;\n const isQueryError = isProviderQueryRunError(info);\n const isConnectionRecoveryError = isConnectionRecoveryRunError(info);\n const copyLabel =\n info.runId || info.errorCode || info.details ? \"Copy debug\" : \"Copy\";\n const copyDetails = useCallback(() => {\n const text = [\n info.message,\n info.errorCode ? `Code: ${info.errorCode}` : \"\",\n info.runId ? `Run: ${info.runId}` : \"\",\n info.details ? `Details:\\n${info.details}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n void writeClipboardText(text).then((ok) => {\n if (!ok) return;\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n });\n }, [info]);\n const startNewChat = useCallback(() => {\n window.dispatchEvent(new CustomEvent(\"agent-chat:new-chat\"));\n onDismiss();\n }, [onDismiss]);\n\n const handleFork = useCallback(async () => {\n if (!onFork || forking) return;\n setForking(true);\n setForkError(null);\n try {\n const result = await onFork();\n if (result === false) {\n setForkError(\"Could not fork this chat. Try starting a new chat.\");\n }\n } catch {\n setForkError(\"Could not fork this chat. Try starting a new chat.\");\n } finally {\n setForking(false);\n }\n }, [forking, onFork]);\n\n useEffect(() => {\n if (builderReconnectResolved) {\n onDismiss();\n }\n }, [builderReconnectResolved, onDismiss]);\n\n return (\n <div className=\"rounded-lg border border-amber-500/25 bg-amber-500/[0.06] p-3 text-sm\">\n <div className=\"flex items-start gap-2\">\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-amber-500/10 text-amber-700 dark:text-amber-300\">\n <IconAlertTriangle size={14} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-foreground\">\n {canRecover\n ? \"The agent stopped before finishing\"\n : \"The agent hit an error\"}\n </div>\n <p className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {info.message}\n </p>\n {shouldShowBuilderReconnect && !builderReconnectResolved && (\n <p className=\"mt-2 text-xs leading-relaxed text-muted-foreground\">\n The current Builder.io or model-provider credential was rejected.\n Reconnect Builder.io, then retry this message.\n </p>\n )}\n {isConnectionRecoveryError && (\n <p className=\"mt-2 text-xs leading-relaxed text-muted-foreground\">\n If retry lands on the same error, start a new chat session and\n continue from what already changed.\n </p>\n )}\n {(info.runId || info.errorCode || info.details) && (\n <button\n type=\"button\"\n onClick={() => setDetailsOpen((v) => !v)}\n className=\"mt-2 inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n size={12}\n className={cn(\n \"transition-transform\",\n detailsOpen && \"rotate-180\",\n )}\n />\n Details\n </button>\n )}\n {detailsOpen && (\n <div className=\"mt-2 rounded-md border border-border/60 bg-background/70 p-2 font-mono text-[11px] leading-relaxed text-muted-foreground\">\n {info.runId && <div>run: {info.runId}</div>}\n {info.errorCode && <div>code: {info.errorCode}</div>}\n {info.details && (\n <pre className=\"mt-2 max-h-28 overflow-auto whitespace-pre-wrap break-words font-mono\">\n {info.details}\n </pre>\n )}\n </div>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-background/80 hover:text-foreground\"\n >\n <IconX size={14} />\n </button>\n </div>\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {shouldShowBuilderReconnect && !builderReconnectResolved && (\n <button\n type=\"button\"\n onClick={() => builderReconnect.start()}\n disabled={builderReconnect.connecting}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90 disabled:cursor-wait disabled:opacity-70\"\n >\n {builderReconnect.connecting ? (\n <IconLoader2 size={13} className=\"animate-spin\" />\n ) : (\n <IconExternalLink size={13} />\n )}\n {builderReconnect.connecting\n ? \"Connecting Builder.io\"\n : \"Reconnect Builder.io\"}\n </button>\n )}\n {canRecover && (\n <>\n <button\n type=\"button\"\n onClick={onContinue}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90\"\n >\n <IconPlayerPlay size={13} />\n Continue\n </button>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n <IconRefresh size={13} />\n {isQueryError ? \"Diagnose and retry\" : \"Retry\"}\n </button>\n </>\n )}\n {canRecover && isConnectionRecoveryError && (\n <button\n type=\"button\"\n onClick={startNewChat}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n <IconPlus size={13} />\n New chat\n </button>\n )}\n {canRecover && onFork && !isConnectionRecoveryError && (\n <button\n type=\"button\"\n onClick={handleFork}\n disabled={forking}\n title=\"Fork this conversation into a separate chat thread.\"\n aria-label=\"Fork this conversation into a separate chat thread\"\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent disabled:cursor-wait disabled:opacity-70\"\n >\n {forking ? (\n <IconLoader2 size={13} className=\"animate-spin\" />\n ) : (\n <IconGitFork size={13} />\n )}\n {forking ? \"Forking...\" : \"Fork chat\"}\n </button>\n )}\n <button\n type=\"button\"\n onClick={copyDetails}\n className=\"ml-auto inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-xs font-medium text-muted-foreground hover:bg-background/80 hover:text-foreground\"\n >\n {copied ? <IconCheck size={13} /> : <IconCopy size={13} />}\n {copied ? \"Copied\" : copyLabel}\n </button>\n </div>\n {shouldShowBuilderReconnect && builderReconnect.error && (\n <p className=\"mt-2 text-xs leading-relaxed text-red-500\">\n {builderReconnect.error}\n </p>\n )}\n {forkError && (\n <p className=\"mt-2 text-xs leading-relaxed text-red-500\">{forkError}</p>\n )}\n </div>\n );\n}\n\nfunction LoopLimitContinueCard({\n info,\n onContinue,\n}: {\n info: LoopLimitInfo;\n onContinue: () => void;\n}) {\n const [settings, setSettings] = useState<AgentLoopSettingsResponse | null>(\n null,\n );\n const [value, setValue] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/agent-loop-settings\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data: AgentLoopSettingsResponse | null) => {\n if (cancelled || !data) return;\n setSettings(data);\n setValue(String(data.maxIterations));\n })\n .catch(() => {\n if (!cancelled) setValue(String(info.maxIterations ?? \"\"));\n });\n return () => {\n cancelled = true;\n };\n }, [info.maxIterations]);\n\n useEffect(() => load(), [load]);\n\n const currentLimit = settings?.maxIterations ?? info.maxIterations;\n const numericValue = Number(value);\n const hasPendingChange =\n !!settings &&\n settings.canUpdate &&\n Number.isInteger(numericValue) &&\n numericValue !== settings.maxIterations;\n const scopeLabel =\n settings?.scope === \"org\"\n ? settings.orgName\n ? `${settings.orgName} org`\n : \"org\"\n : \"your account\";\n\n const saveLimit = useCallback(async (): Promise<boolean> => {\n if (!settings?.canUpdate) return false;\n setSaving(true);\n setSaved(false);\n setError(null);\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/agent-loop-settings\"),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ maxIterations: numericValue }),\n },\n );\n const body = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(body?.error ?? `Save failed (${res.status})`);\n }\n setSettings(body as AgentLoopSettingsResponse);\n setValue(String((body as AgentLoopSettingsResponse).maxIterations));\n setSaved(true);\n window.dispatchEvent(\n new CustomEvent(\"agent-loop-settings:changed\", { detail: body }),\n );\n setTimeout(() => setSaved(false), 2000);\n return true;\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Save failed\");\n return false;\n } finally {\n setSaving(false);\n }\n }, [numericValue, settings?.canUpdate]);\n\n const handleContinue = useCallback(async () => {\n if (hasPendingChange) {\n const ok = await saveLimit();\n if (!ok) return;\n }\n onContinue();\n }, [hasPendingChange, onContinue, saveLimit]);\n\n const openSettings = useCallback(() => {\n try {\n window.location.hash = \"agent-limits\";\n } catch {}\n window.dispatchEvent(new CustomEvent(\"agent-panel:open-settings\"));\n }, []);\n\n return (\n <div className=\"rounded-lg border border-amber-500/25 bg-amber-500/[0.06] px-3 py-3 shadow-sm\">\n <div className=\"flex items-start gap-2.5\">\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-amber-500/10 text-amber-600 dark:text-amber-400\">\n <IconGauge size={14} />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground\">\n Step limit reached\n </p>\n <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">\n The agent used{\" \"}\n {currentLimit\n ? `${currentLimit.toLocaleString()} steps`\n : \"all available steps\"}\n . Keep going in a fresh turn, or raise the {scopeLabel} limit first.\n </p>\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-wrap items-end gap-2\">\n <label className=\"min-w-[116px] flex-1 space-y-1\">\n <span className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n Max steps\n </span>\n <input\n type=\"number\"\n min={settings?.minMaxIterations ?? 1}\n max={settings?.maxMaxIterations ?? 1000}\n value={value}\n disabled={!settings?.canUpdate || saving}\n onChange={(e) => {\n setValue(e.target.value);\n setError(null);\n }}\n className=\"h-8 w-full rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none focus:ring-1 focus:ring-ring disabled:opacity-60\"\n />\n </label>\n <button\n type=\"button\"\n onClick={saveLimit}\n disabled={!hasPendingChange || saving}\n className=\"inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-foreground hover:bg-accent disabled:opacity-50\"\n >\n {saving ? (\n <IconLoader2 size={12} className=\"animate-spin\" />\n ) : saved ? (\n <IconCheck size={12} />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={openSettings}\n className=\"inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <IconSettings size={12} />\n Settings\n </button>\n <button\n type=\"button\"\n onClick={handleContinue}\n disabled={saving}\n className=\"ml-auto inline-flex h-8 items-center gap-1 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90 disabled:opacity-60\"\n >\n {hasPendingChange ? \"Save and keep going\" : \"Keep going\"}\n <IconArrowRight size={12} />\n </button>\n </div>\n\n {settings && !settings.canUpdate && (\n <p className=\"mt-2 text-[11px] text-muted-foreground\">\n Only organization owners and admins can change this limit.\n </p>\n )}\n {error && <p className=\"mt-2 text-[11px] text-destructive\">{error}</p>}\n </div>\n );\n}\n\nfunction PlanModeCallout({\n canImplementPlan,\n onImplementPlan,\n onSwitchToAct,\n}: {\n canImplementPlan: boolean;\n onImplementPlan: () => void;\n onSwitchToAct: () => void;\n}) {\n return (\n <div className=\"shrink-0 px-3 pt-2\">\n <div className=\"rounded-lg border border-blue-500/25 bg-blue-500/[0.06] px-3 py-2.5 shadow-sm\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-blue-500/10 text-blue-600 dark:text-blue-300\">\n <IconClipboardList size={15} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {canImplementPlan ? \"Plan ready\" : \"Plan mode is on\"}\n </p>\n <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">\n {canImplementPlan\n ? \"Switch to Act and run the proposed plan.\"\n : \"The next turn will stay read-only until you switch to Act.\"}\n </p>\n </div>\n {canImplementPlan ? (\n <button\n type=\"button\"\n onClick={onImplementPlan}\n className=\"inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90\"\n >\n <IconPlayerPlay size={13} />\n Implement Plan\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onSwitchToAct}\n className=\"inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Act\n <IconArrowRight size={13} />\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Main Component ─────────────────────────────────────────────────────────\n\nexport interface AssistantChatHandle {\n /** Programmatically send a message into this chat */\n sendMessage(\n text: string,\n images?: string[],\n options?: { trackInRunsTray?: boolean },\n ): void;\n /** Programmatically prefill the composer without submitting. */\n prefillMessage(text: string): void;\n /** Add or replace keyed context for the next composer submission. */\n setComposerContextItem(item: AgentChatContextItem): void;\n /** Remove a keyed context item from the composer. */\n removeComposerContextItem(key: string): void;\n /** Clear all staged context items from the composer. */\n clearComposerContextItems(): void;\n /** Programmatically send a recovery prompt without replacing the original request. */\n sendRecoveryMessage(\n text: string,\n recoveryAction: AgentRecoveryAction,\n images?: string[],\n ): void;\n /** Queue a message to send after the current run finishes */\n queueMessage(text: string, images?: string[]): void;\n /** Whether the chat is currently running */\n isRunning(): boolean;\n /** Focus the composer input */\n focusComposer(): void;\n /** Export the currently visible client-side thread for operations like fork. */\n exportThreadSnapshot(): ChatThreadSnapshot | null;\n}\n\nexport interface AssistantChatAdapterContext {\n apiUrl: string;\n tabId?: string;\n threadId?: string;\n modelRef: { current: string | undefined };\n engineRef: { current: string | undefined };\n effortRef: { current: ReasoningEffort | undefined };\n execModeRef: { current: \"build\" | \"plan\" | undefined };\n browserTabId?: string;\n scopeRef: { current: ChatThreadScope | null | undefined };\n surface: AgentChatSurfaceKind;\n}\n\nexport interface AssistantChatProps {\n /** API endpoint URL. Default: \"/_agent-native/agent-chat\" */\n apiUrl?: string;\n /** Stable tab identifier passed to the adapter for event correlation */\n tabId?: string;\n /** Stable browser tab id used for tab-scoped app-state context. */\n browserTabId?: string;\n /** Thread ID for SQL-backed persistence. When set, messages are loaded from and saved to the server. */\n threadId?: string;\n /** Resource scope to include with chat requests for server-side context. */\n contextScope?: ChatThreadScope | null;\n /** Whether this chat owns the active visible composer context snapshot. */\n isActiveComposer?: boolean;\n /**\n * Identifies which surface hosts this chat. Defaults to \"app\", which keeps\n * dev filesystem/bash code-editing tools out of in-product sidebars.\n */\n agentChatSurface?: AgentChatSurfaceKind;\n /** Placeholder text for empty state */\n emptyStateText?: string;\n /** Suggestion prompts shown when no messages */\n suggestions?: string[];\n /** Context-aware suggestions merged with `suggestions`. Enabled by default. */\n dynamicSuggestions?: AgentDynamicSuggestionsOption;\n /** Optional content rendered in the empty state, above the suggestion buttons.\n * Used by MultiTabAssistantChat to surface \"previous chats for this design\"\n * when the current thread is empty but the scope has other threads. */\n emptyStateAddon?: React.ReactNode;\n /** Whether to show the header bar. Default: true */\n showHeader?: boolean;\n /** CSS class for the outer container */\n className?: string;\n /** Callback when user clicks \"Use CLI\" button */\n onSwitchToCli?: () => void;\n /** Callback when message count changes */\n onMessageCountChange?: (count: number) => void;\n /** Callback to save thread data to the server (provided by useChatThreads) */\n onSaveThread?: (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => void;\n /** Callback to generate a title from the first user message */\n onGenerateTitle?: (threadId: string, message: string) => void;\n /** Optional content rendered just above the composer input */\n composerSlot?: React.ReactNode;\n /** Class applied to the shared composer area for host-specific sizing/skin. */\n composerAreaClassName?: string;\n /** Placeholder for the shared composer in its normal idle state. */\n composerPlaceholder?: string;\n /** Visual density for the shared composer shell. */\n composerLayoutVariant?: AgentComposerLayoutVariant;\n /** Center the composer on a fresh empty chat instead of pinning it low. */\n centerComposerWhenEmpty?: boolean;\n /** Hide the default empty-state icon/text/suggestions for custom start screens. */\n emptyStateDisplay?: \"default\" | \"hidden\";\n /** Optional content rendered inside the composer toolbar after the attach button. */\n composerToolbarSlot?: React.ReactNode;\n /** Optional action rendered beside the voice/send controls. */\n composerExtraActionButton?: React.ReactNode;\n /** Disable the composer for capability-gated surfaces while still showing history. */\n composerDisabled?: boolean;\n /** Placeholder to show while the composer is disabled by the host surface. */\n composerDisabledPlaceholder?: string;\n /** When true, skip the restore skeleton (used for freshly created threads with no messages) */\n isNewThread?: boolean;\n /** Called when a slash command (e.g. /clear, /help) is executed */\n onSlashCommand?: (command: string) => void;\n /** Current execution mode (build/plan) */\n execMode?: \"build\" | \"plan\";\n /** Callback to change execution mode */\n onExecModeChange?: (mode: \"build\" | \"plan\") => void;\n /** Disable Plan mode while leaving Act mode available. */\n planModeDisabled?: boolean;\n /** Explanation shown next to the disabled Plan option. */\n planModeDisabledReason?: string;\n /** Selected model override for this conversation (undefined = use server default) */\n selectedModel?: string;\n /** Default model from server config (shown in picker when no override is set) */\n defaultModel?: string;\n /** Selected engine override for this conversation */\n selectedEngine?: string;\n /** Selected reasoning effort override for this conversation */\n selectedEffort?: ReasoningEffort;\n /** Available engine/model list for the model picker */\n availableModels?: Array<{\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n }>;\n /** Callback when user picks a model from the picker */\n onModelChange?: (model: string, engine: string) => void;\n /** Callback when user picks a reasoning effort from the picker */\n onEffortChange?: (effort: ReasoningEffort) => void;\n /** Callback when user clicks \"Fork Chat\" in the message actions menu */\n onForkChat?: () => void | boolean | Promise<void | boolean>;\n /** Override Builder/provider connect routing for embedded hosts. */\n onConnectProvider?: () => void;\n /**\n * Controls the shared composer + menu. Sidebar keeps the full menu by default;\n * hosts without the sidebar provider stack can use upload-only.\n */\n plusMenuMode?: \"full\" | \"upload-only\" | \"hidden\";\n /**\n * Enable framework provider/env status checks. Embedded hosts that provide\n * model/provider state through another transport can disable these probes.\n */\n providerStatusChecksEnabled?: boolean;\n /**\n * Advanced host override for non-HTTP transports. Defaults to the production\n * sidebar SSE adapter when omitted.\n */\n createAdapter?: (context: AssistantChatAdapterContext) => ChatModelAdapter;\n /**\n * Explicitly recreate an injected adapter when the host transport identity\n * changes. Omit for the production sidebar so parent rerenders do not reset\n * active chats.\n */\n adapterReloadKey?: unknown;\n /**\n * Advanced host override for thread replay. Defaults to SQL thread fetch when\n * `threadId` is set, or sessionStorage for legacy tab chats.\n */\n loadHistoryRepository?: () => Promise<ExportedMessageRepository | null>;\n /** Re-run `loadHistoryRepository` when the host's external transcript changes. */\n historyReloadKey?: string | number | null;\n /** Smooth the last assistant message while an external transcript is updating. */\n externalStreaming?: boolean;\n}\n\nexport const CHAT_STORAGE_PREFIX = \"agent-chat:\";\n\n/** Remove persisted chat for a given tabId (or \"default\"). */\nexport function clearChatStorage(tabId?: string) {\n try {\n sessionStorage.removeItem(`${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`);\n } catch {}\n}\n\n/**\n * Ensure all messages in a thread repository have required fields.\n * assistant-ui accesses `message.metadata.submittedFeedback` and\n * `lastMessage.status.type` without null-checking, so server-constructed\n * messages missing these fields crash.\n */\nfunction ensureMessageMetadata(repo: any): any {\n if (!repo?.messages || !Array.isArray(repo.messages)) return repo;\n for (const entry of repo.messages) {\n // Handle both wrapped ({ message: { ... } }) and flat ({ role, ... }) formats\n const msg = entry?.message ?? entry;\n if (!msg) continue;\n if (!msg.metadata) {\n msg.metadata = {};\n }\n if (msg.role === \"assistant\") {\n const statusType =\n msg.status && typeof msg.status === \"object\"\n ? (msg.status as { type?: unknown }).type\n : undefined;\n const isTerminal =\n statusType === \"complete\" || statusType === \"incomplete\";\n if (!isTerminal) {\n const runError =\n msg.metadata?.custom?.runError ?? msg.metadata?.runError;\n msg.status = runError\n ? { type: \"incomplete\", reason: \"error\" }\n : { type: \"complete\", reason: \"stop\" };\n }\n }\n }\n return repo;\n}\n\n// Re-export for backwards compatibility\nimport {\n extractThreadMeta,\n normalizeThreadRepository,\n} from \"../agent/thread-data-builder.js\";\nexport { extractThreadMeta };\n\nconst AssistantChatInner = forwardRef<\n AssistantChatHandle,\n AssistantChatProps & { apiUrl: string }\n>(function AssistantChatInner(\n {\n emptyStateText,\n suggestions,\n dynamicSuggestions,\n emptyStateAddon,\n showHeader = true,\n onSwitchToCli,\n className,\n apiUrl,\n tabId,\n browserTabId,\n threadId,\n contextScope,\n isActiveComposer = true,\n onMessageCountChange,\n onSaveThread,\n onGenerateTitle,\n composerSlot,\n composerAreaClassName,\n composerPlaceholder,\n composerLayoutVariant = \"default\",\n centerComposerWhenEmpty = false,\n emptyStateDisplay = \"default\",\n composerToolbarSlot,\n composerExtraActionButton,\n composerDisabled = false,\n composerDisabledPlaceholder,\n isNewThread,\n onSlashCommand,\n execMode,\n onExecModeChange,\n planModeDisabled,\n planModeDisabledReason,\n selectedModel,\n defaultModel,\n selectedEngine,\n selectedEffort,\n availableModels,\n onModelChange,\n onEffortChange,\n onForkChat,\n onConnectProvider,\n plusMenuMode = \"full\",\n providerStatusChecksEnabled = true,\n loadHistoryRepository,\n historyReloadKey,\n externalStreaming = false,\n },\n ref,\n) {\n const thread = useThread();\n const threadRuntime = useThreadRuntime();\n const composerRuntime = useComposerRuntime();\n const isRuntimeRunning = thread.isRunning;\n const messages = thread.messages;\n const { suggestions: resolvedSuggestions } = useAgentDynamicSuggestionsResult(\n {\n staticSuggestions: suggestions,\n dynamicSuggestions,\n browserTabId,\n scope: contextScope,\n enabled: messages.length === 0,\n },\n );\n const messageListResetKey = useMemo(\n () => messages.map((message) => message.id).join(\"|\"),\n [messages],\n );\n\n // Chat-wide drag-and-drop: users expect to drop a file anywhere on the agent\n // sidebar (thread, header, composer) and have it attach — same as ChatGPT,\n // Claude.ai, Linear, Slack, etc. Tiptap's own `handleDrop` only fires inside\n // the contenteditable; drops on the message thread or the composer\n // attachment strip otherwise navigate to the file (browser default), which\n // is why \"upload does nothing\" — the chat refreshes to the dropped image.\n const [dropActive, setDropActive] = useState(false);\n const dropDepthRef = useRef(0);\n const handleChatDragEnter = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n e.preventDefault();\n dropDepthRef.current += 1;\n setDropActive(true);\n }, []);\n const handleChatDragOver = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n }, []);\n const handleChatDragLeave = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n dropDepthRef.current = Math.max(0, dropDepthRef.current - 1);\n if (dropDepthRef.current === 0) setDropActive(false);\n }, []);\n const handleChatDropCapture = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n dropDepthRef.current = 0;\n setDropActive(false);\n }, []);\n const handleChatDrop = useCallback(\n (e: React.DragEvent) => {\n const files = Array.from(e.dataTransfer?.files ?? []);\n if (files.length === 0) return;\n dropDepthRef.current = 0;\n setDropActive(false);\n if (e.defaultPrevented) return;\n e.preventDefault();\n e.stopPropagation();\n // Mirror TiptapComposer's paste/drop name-uniqueness so consecutive\n // screenshots (all named `image.png`) don't collide on the\n // SimpleImageAttachmentAdapter id.\n const attachments = files.map((file) => {\n if (!file.type.startsWith(\"image/\")) return file;\n const uniqueName = `${Date.now()}-${Math.random().toString(36).slice(2)}-${file.name}`;\n return new File([file], uniqueName, { type: file.type });\n });\n void Promise.all(\n attachments.map((file) => composerRuntime.addAttachment(file)),\n ).catch((error) => {\n console.error(\"Error adding dropped chat attachment:\", error);\n });\n },\n [composerRuntime],\n );\n\n // Patch the underlying assistant-ui MessageRepository so addOrUpdateMessage\n // can't throw \"Parent message not found\" mid-run. assistant-ui calls\n // `repository.clear()` from `runtime.import()` and from `resetHead(null)`,\n // and on a few async paths (history-adapter load, branch reset, repeat\n // imports) the repo can be cleared between the `append` that added the\n // user message and the `performRoundtrip` call that tries to record the\n // assistant placeholder against that user message's id. The internal-bug\n // throw turns into an unhandled rejection that Sentry captures from the\n // assets.agent-native.com prompt composer (AGENT-NATIVE-BROWSER-18). Fix\n // it by relinking to the current head whenever the requested parent has\n // gone missing instead of throwing.\n useEffect(() => {\n const repo = (threadRuntime as any)?.__internal_threadBinding?.getState?.()\n ?.repository as\n | { addOrUpdateMessage?: (parentId: any, message: any) => void }\n | undefined;\n if (!repo || typeof repo.addOrUpdateMessage !== \"function\") return;\n const patched = repo as any;\n if (patched.__agentNativePatched) return;\n patched.__agentNativePatched = true;\n const original = repo.addOrUpdateMessage.bind(repo);\n repo.addOrUpdateMessage = function (parentId: any, message: any) {\n try {\n return original(parentId, message);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (parentId && msg.includes(\"Parent message not found\")) {\n const fallbackParent = (this as any).head?.current?.id ?? null;\n if (fallbackParent && fallbackParent !== parentId) {\n return original(fallbackParent, message);\n }\n return original(null, message);\n }\n throw err;\n }\n };\n }, [threadRuntime]);\n const [missingApiKey, setMissingApiKey] = useState(false);\n const isComposerDisabled = missingApiKey || composerDisabled;\n // Increments each time the user clicks the (disabled) composer while no LLM\n // is connected — `BuilderSetupCard` watches this to replay a one-shot bounce.\n const [missingKeyBouncePulse, setMissingKeyBouncePulse] = useState(0);\n const [authError, setAuthError] = useState<{\n sessionExpired?: boolean;\n } | null>(null);\n const [authSessionAvailable, setAuthSessionAvailable] = useState(false);\n const [queuedMessages, setQueuedMessages] = useState<\n Array<{\n id: string;\n text: string;\n images?: string[];\n attachments?: QueuedAttachment[];\n references?: Reference[];\n requestMode?: AgentRequestMode;\n recoveryAction?: AgentRecoveryAction;\n trackInRunsTray?: boolean;\n }>\n >([]);\n const [composerContextItems, setComposerContextItems] = useState<\n AgentChatContextItem[]\n >([]);\n const composerContextItemsRef = useRef<AgentChatContextItem[]>([]);\n const isActiveComposerRef = useRef(isActiveComposer);\n isActiveComposerRef.current = isActiveComposer;\n const publishComposerContextItems = useCallback(\n (items: AgentChatContextItem[]) => {\n if (!isActiveComposerRef.current) return;\n publishAgentChatContextItems(items);\n },\n [],\n );\n const updateComposerContextItems = useCallback(\n (updater: (previous: AgentChatContextItem[]) => AgentChatContextItem[]) => {\n setComposerContextItems((previous) => {\n const next = updater(previous);\n composerContextItemsRef.current = next;\n publishComposerContextItems(next);\n return next;\n });\n },\n [publishComposerContextItems],\n );\n const stageComposerContextItem = useCallback(\n (rawItem: AgentChatContextItem) => {\n const item = normalizeAgentChatContextItem(rawItem);\n if (!item) return;\n updateComposerContextItems((previous) => {\n const index = previous.findIndex((current) => current.key === item.key);\n if (index === -1) return [...previous, item];\n return previous.map((current, currentIndex) =>\n currentIndex === index ? item : current,\n );\n });\n },\n [updateComposerContextItems],\n );\n const removeComposerContextItem = useCallback(\n (key: string) => {\n updateComposerContextItems((previous) =>\n previous.filter((item) => item.key !== key),\n );\n },\n [updateComposerContextItems],\n );\n const buildComposerContextSubmission = useCallback((text: string) => {\n const context = formatAgentChatContextItemsForPrompt(\n composerContextItemsRef.current,\n );\n if (!context) return { text, includesContext: false };\n return {\n text: appendAgentChatContextToMessage(text, context),\n includesContext: true,\n };\n }, []);\n\n useEffect(() => {\n if (!isActiveComposer) return;\n let cancelled = false;\n void refreshAgentChatContext().then((state) => {\n if (cancelled || !isActiveComposerRef.current) return;\n composerContextItemsRef.current = state.items;\n setComposerContextItems(state.items);\n });\n return () => {\n cancelled = true;\n };\n }, [isActiveComposer]);\n // Tracks the JSON of the last queue we successfully persisted so the\n // debounced save effect can skip no-op writes (e.g. restore-from-server\n // on mount, or queue state that hasn't actually changed).\n const lastPersistedQueueRef = useRef<string>(\"[]\");\n // Cheap change-guard for `importThreadData`. The real-time sync layer\n // refetches `/threads/:id` (or re-runs `loadHistoryRepository`) on poll /\n // change ticks, on reconnect, and whenever the host's transcript bumps\n // `historyReloadKey`. On a long thread the JSON.parse +\n // normalizeThreadRepository + threadRuntime.export()/import round-trip is\n // CPU-bound and triggers re-render churn even when the content is byte-for-\n // byte identical to what we last imported. We hash the raw incoming payload\n // and skip the whole pipeline when it hasn't advanced, returning the\n // already-imported repo so callers (e.g. the reconnect loop's\n // repoHasAssistantMessage check) see consistent data. Any real change — a\n // new message, an arriving tool result, the server replacing an optimistic\n // copy, or switching threads — produces a different signal and falls\n // through to a full import.\n const lastImportedSignatureRef = useRef<string | null>(null);\n const lastImportedRepoRef = useRef<any>(null);\n const [showContinue, setShowContinue] = useState(false);\n const [loopLimitInfo, setLoopLimitInfo] = useState<LoopLimitInfo | null>(\n null,\n );\n const [runErrorInfo, setRunErrorInfo] = useState<RunErrorInfo | null>(null);\n const [dismissedRunErrorKey, setDismissedRunErrorKey] = useState<\n string | null\n >(null);\n const userStoppedRunRef = useRef<{\n at: number;\n runId?: string;\n } | null>(null);\n const [isReconnecting, setIsReconnecting] = useState(false);\n const [reconnectContent, setReconnectContent] = useState<ContentPart[]>([]);\n // When stop is clicked during reconnect, keep content visible (don't wipe it)\n const [reconnectFrozen, setReconnectFrozen] = useState(false);\n const reconnectRunIdRef = useRef<string | null>(null);\n const reconnectAbortRef = useRef<AbortController | null>(null);\n // Nuclear stop: user clicked stop. Clears the stop button/indicator AND\n // lets new submissions go through immediately — prevents the \"stuck\n // queueing forever\" state where isReconnecting or isRuntimeRunning gets\n // wedged (e.g. after a tab refresh + stop during reconnect).\n const [forceStopped, setForceStopped] = useState(false);\n // Real running state — drives submission/queue gating. Treat reconnecting\n // to an active run the same as running, UNLESS the user has explicitly\n // clicked stop (forceStopped).\n const isRunning = !forceStopped && (isRuntimeRunning || isReconnecting);\n const textStreaming = isRunning || externalStreaming;\n // UI-only running state — drives the stop button and thinking indicator.\n const showRunningInUI = isRunning;\n const wasRunningRef = useRef(false);\n const lastBroadcastRunningRef = useRef(isRunning);\n const tiptapRef = useRef<TiptapComposerHandle>(null);\n\n useEffect(() => {\n if (lastBroadcastRunningRef.current === isRunning) return;\n lastBroadcastRunningRef.current = isRunning;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning, tabId: tabId || threadId },\n }),\n );\n }, [isRunning, tabId, threadId]);\n\n // ─── Chat persistence ──────────────────────────────────────────────\n const hasRestoredRef = useRef(false);\n const [isRestoring, setIsRestoring] = useState(\n !!(threadId || loadHistoryRepository) && !isNewThread,\n );\n const onSaveThreadRef = useRef(onSaveThread);\n onSaveThreadRef.current = onSaveThread;\n const onGenerateTitleRef = useRef(onGenerateTitle);\n onGenerateTitleRef.current = onGenerateTitle;\n const titleGeneratedRef = useRef(false);\n\n const importThreadData = useCallback(\n (threadData: unknown, options?: { markTitleGenerated?: boolean }): any => {\n // Cheap-signal short-circuit: if the raw payload is identical to the\n // last one we imported, there is nothing new to parse, normalize, or\n // re-import into the runtime. Reuse the already-imported repo so callers\n // still get back a stable result without the CPU + re-render cost. We\n // still honor `markTitleGenerated` because a re-fetch carrying the same\n // content can legitimately confirm a title is settled.\n const signature =\n typeof threadData === \"string\"\n ? threadData\n : (() => {\n try {\n return JSON.stringify(threadData);\n } catch {\n return null;\n }\n })();\n if (\n signature !== null &&\n signature === lastImportedSignatureRef.current\n ) {\n if (options?.markTitleGenerated) {\n titleGeneratedRef.current = true;\n }\n return lastImportedRepoRef.current;\n }\n\n const repo = normalizeThreadRepository(\n typeof threadData === \"string\" ? JSON.parse(threadData) : threadData,\n );\n // Whether this payload settled into the runtime (either imported, or\n // had no messages to import). Only then is it safe to remember its\n // signature as the canonical \"last imported\" — a payload that\n // `shouldImportServerThreadData` deliberately rejected (e.g. it\n // regressed message count) must NOT be cached, so an identical re-fetch\n // re-evaluates against the runtime exactly as before instead of\n // short-circuiting to the rejected repo.\n let settled = true;\n if (repo?.messages?.length > 0) {\n let shouldImport = true;\n try {\n shouldImport = shouldImportServerThreadData(\n normalizeThreadRepository(threadRuntime.export()),\n repo,\n );\n } catch {\n shouldImport = true;\n }\n if (shouldImport) {\n if (options?.markTitleGenerated) {\n titleGeneratedRef.current = true;\n }\n threadRuntime.import(ensureMessageMetadata(repo));\n } else {\n settled = false;\n }\n }\n if (Array.isArray(repo?.queuedMessages)) {\n setQueuedMessages(repo.queuedMessages);\n lastPersistedQueueRef.current = JSON.stringify(repo.queuedMessages);\n }\n if (settled && signature !== null) {\n lastImportedSignatureRef.current = signature;\n lastImportedRepoRef.current = repo;\n }\n return repo;\n },\n [threadRuntime],\n );\n\n const refreshThreadFromServer = useCallback(async (): Promise<any | null> => {\n if (loadHistoryRepository) {\n try {\n const repo = await loadHistoryRepository();\n if (!repo) return null;\n return importThreadData(repo);\n } catch {\n return null;\n }\n }\n if (!threadId) return null;\n try {\n const refreshRes = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n );\n if (!refreshRes.ok) return null;\n const refreshData = await refreshRes.json();\n if (!refreshData.threadData) return null;\n return importThreadData(refreshData.threadData);\n } catch {\n return null;\n }\n }, [apiUrl, importThreadData, loadHistoryRepository, threadId]);\n\n const wasRecentlyStoppedRun = useCallback((runId?: string): boolean => {\n const stopped = userStoppedRunRef.current;\n return Boolean(\n stopped &&\n Date.now() - stopped.at < 10_000 &&\n (!stopped.runId || !runId || stopped.runId === runId),\n );\n }, []);\n\n const startReconnectToRun = useCallback(\n (runInfo: ActiveRunLookup): boolean => {\n if (!threadId || !runInfo.runId || runInfo.status !== \"running\") {\n return false;\n }\n const runId = String(runInfo.runId);\n if (wasRecentlyStoppedRun(runId)) return false;\n if (reconnectRunIdRef.current === runId) return true;\n\n reconnectRunIdRef.current = runId;\n setIsReconnecting(true);\n setReconnectFrozen(false);\n setReconnectContent([]);\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: true, tabId: tabId || threadId },\n }),\n );\n\n const abortCtrl = new AbortController();\n reconnectAbortRef.current = abortCtrl;\n\n const watchdog = setInterval(async () => {\n try {\n const res = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (!res.ok) {\n abortCtrl.abort();\n clearInterval(watchdog);\n return;\n }\n const info = (await res.json()) as ActiveRunLookup;\n if (info.status !== \"running\" || activeRunLooksStale(info)) {\n abortCtrl.abort();\n clearInterval(watchdog);\n }\n } catch {\n // Network blip — keep polling.\n }\n }, 1000);\n\n let reconnectTimedOut = false;\n const maxReconnectTimer = setTimeout(() => {\n reconnectTimedOut = true;\n abortCtrl.abort();\n clearInterval(watchdog);\n }, 20_000);\n\n const streamReconnect = async () => {\n let noProgressDuringReconnect = false;\n let latestContent: ContentPart[] = [];\n try {\n const sseRes = await fetch(\n `${apiUrl}/runs/${encodeURIComponent(runId)}/events?after=0`,\n { signal: abortCtrl.signal },\n );\n if (sseRes.ok && sseRes.body) {\n const content: ContentPart[] = [];\n latestContent = content;\n const toolCallCounter = { value: 0 };\n\n let rafPending = false;\n let latestSnapshot: ContentPart[] = [];\n const scheduleUpdate = (snapshot: ContentPart[]) => {\n latestSnapshot = snapshot;\n if (rafPending) return;\n rafPending = true;\n requestAnimationFrame(() => {\n rafPending = false;\n setReconnectContent(latestSnapshot);\n });\n };\n\n await readSSEStreamRaw(\n sseRes.body,\n content,\n toolCallCounter,\n tabId,\n scheduleUpdate,\n );\n setReconnectContent([...content]);\n }\n } catch (err) {\n if (\n err instanceof AgentAutoContinueSignal &&\n err.reason === \"no_progress\"\n ) {\n noProgressDuringReconnect = true;\n } else if (\n reconnectTimedOut &&\n err instanceof Error &&\n err.name === \"AbortError\"\n ) {\n noProgressDuringReconnect = true;\n }\n } finally {\n clearInterval(watchdog);\n clearTimeout(maxReconnectTimer);\n }\n\n if (noProgressDuringReconnect && reconnectRunIdRef.current === runId) {\n captureError(new Error(\"agent-chat:reconnect_no_progress\"), {\n tags: {\n context: \"agent-native-chat\",\n errorCode: \"reconnect_no_progress\",\n reconnectTimedOut: String(reconnectTimedOut),\n },\n extra: {\n runId,\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n contentLength: latestContent.length,\n },\n });\n try {\n await fetch(`${apiUrl}/runs/${encodeURIComponent(runId)}/abort`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reason: \"no_progress\" }),\n });\n } catch {\n // Best effort — the important part is unwinding the UI.\n }\n setReconnectContent([...latestContent]);\n setReconnectFrozen(latestContent.length > 0);\n setRunErrorInfo({\n message:\n \"The previous agent run stopped producing visible progress while reconnecting, so it was stopped before it could keep looping.\",\n errorCode: \"reconnect_no_progress\",\n recoverable: true,\n runId,\n });\n setDismissedRunErrorKey(null);\n reconnectAbortRef.current = null;\n setIsReconnecting(false);\n reconnectRunIdRef.current = null;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: false, tabId: tabId || threadId },\n }),\n );\n return;\n }\n\n setReconnectFrozen(true);\n let loaded = false;\n for (let attempt = 0; attempt < 10; attempt++) {\n await new Promise((r) => setTimeout(r, 500));\n if (reconnectRunIdRef.current !== runId) break;\n const repo = await refreshThreadFromServer();\n if (repoHasAssistantMessage(repo)) {\n setReconnectContent([]);\n setReconnectFrozen(false);\n loaded = true;\n break;\n }\n }\n\n if (reconnectRunIdRef.current === runId) {\n reconnectAbortRef.current = null;\n setIsReconnecting(false);\n reconnectRunIdRef.current = null;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: false, tabId: tabId || threadId },\n }),\n );\n }\n if (!loaded) {\n await refreshThreadFromServer();\n }\n };\n\n void streamReconnect();\n return true;\n },\n [apiUrl, refreshThreadFromServer, tabId, threadId, wasRecentlyStoppedRun],\n );\n\n const reconnectActiveRunForThread =\n useCallback(async (): Promise<boolean> => {\n if (!threadId) return false;\n try {\n const runRes = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (!runRes.ok) return false;\n const runInfo = (await runRes.json()) as ActiveRunLookup;\n if (\n !runInfo.active ||\n runInfo.status !== \"running\" ||\n activeRunLooksStale(runInfo)\n ) {\n await refreshThreadFromServer();\n return false;\n }\n return startReconnectToRun(runInfo);\n } catch {\n return false;\n }\n }, [apiUrl, refreshThreadFromServer, startReconnectToRun, threadId]);\n\n // Restore messages from server on mount (when threadId is set). The\n // server is the single source of truth — we don't hydrate from localStorage\n // first, so what the user sees in the chat panel always matches what the\n // history list (and the agent) sees on disk.\n useEffect(() => {\n if (hasRestoredRef.current) return;\n hasRestoredRef.current = true;\n\n if (loadHistoryRepository) {\n (async () => {\n try {\n const repo = await loadHistoryRepository();\n if (repo) {\n importThreadData(repo, { markTitleGenerated: true });\n }\n titleGeneratedRef.current = true;\n } catch {\n // Start fresh\n } finally {\n setIsRestoring(false);\n }\n })();\n } else if (threadId && isNewThread) {\n // Client-created empty tabs do not have a server row until the first\n // message is sent. Avoid probing /threads/:id on mount; that request\n // can only 404 and makes normal app startup look broken in DevTools.\n setIsRestoring(false);\n } else if (threadId) {\n (async () => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n );\n if (res.ok) {\n const data = await res.json();\n if (data.threadData) {\n importThreadData(data.threadData, { markTitleGenerated: true });\n }\n // Also skip title generation if thread already has a title\n if (data.title) {\n titleGeneratedRef.current = true;\n }\n }\n } catch {\n // Start fresh\n } finally {\n // Clear the skeleton as soon as the persisted messages are imported.\n // The active-run reconnect probe below must NOT gate first paint — it\n // only matters when a run is mid-flight (e.g. after a hot reload), and\n // it streams on top of the already-rendered messages.\n setIsRestoring(false);\n }\n // Reconnect to an in-progress run after the skeleton has cleared, so a\n // background `/runs/active` probe never delays showing the conversation.\n try {\n await reconnectActiveRunForThread();\n } catch {\n // No active run to reconnect to.\n }\n })();\n } else {\n // Legacy: restore from sessionStorage\n const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`;\n try {\n const saved = sessionStorage.getItem(storageKey);\n if (saved) {\n const repo = JSON.parse(saved);\n if (repo?.messages?.length > 0) {\n threadRuntime.import(ensureMessageMetadata(repo));\n }\n }\n } catch {}\n setIsRestoring(false);\n }\n }, [\n threadId,\n tabId,\n apiUrl,\n threadRuntime,\n importThreadData,\n reconnectActiveRunForThread,\n loadHistoryRepository,\n isNewThread,\n ]);\n\n useEffect(() => {\n if (\n !loadHistoryRepository ||\n !hasRestoredRef.current ||\n isRestoring ||\n isRunning\n ) {\n return;\n }\n let cancelled = false;\n void loadHistoryRepository()\n .then((repo) => {\n if (cancelled || !repo) return;\n importThreadData(repo, { markTitleGenerated: true });\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [\n historyReloadKey,\n importThreadData,\n isRestoring,\n isRunning,\n loadHistoryRepository,\n ]);\n\n // If assistant-ui stops the local runtime while the background server run is\n // still alive, immediately switch into the same reconnect path used after a\n // reload. Otherwise the composer unlocks, the next send hits a 409, and the\n // user sees \"still working\" even though the UI stopped updating.\n const prevRuntimeRunningForReconnectRef = useRef(isRuntimeRunning);\n useEffect(() => {\n const wasRuntimeRunning = prevRuntimeRunningForReconnectRef.current;\n prevRuntimeRunningForReconnectRef.current = isRuntimeRunning;\n if (\n !wasRuntimeRunning ||\n isRuntimeRunning ||\n !threadId ||\n forceStopped ||\n isReconnecting ||\n wasRecentlyStoppedRun()\n ) {\n return;\n }\n\n let cancelled = false;\n const timer = window.setTimeout(() => {\n if (!cancelled) {\n void reconnectActiveRunForThread();\n }\n }, 250);\n return () => {\n cancelled = true;\n window.clearTimeout(timer);\n };\n }, [\n forceStopped,\n isReconnecting,\n isRuntimeRunning,\n reconnectActiveRunForThread,\n threadId,\n wasRecentlyStoppedRun,\n ]);\n\n // Generate a title when the first user message is sent\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (titleGeneratedRef.current) return;\n if (messages.length === 0) return;\n\n const firstUserMsg = messages.find((m) => m.role === \"user\");\n if (!firstUserMsg) return;\n\n // Extract text from the first user message\n const text =\n \"content\" in firstUserMsg\n ? Array.isArray(firstUserMsg.content)\n ? firstUserMsg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\" \")\n : typeof firstUserMsg.content === \"string\"\n ? firstUserMsg.content\n : \"\"\n : \"\";\n\n if (!text.trim()) return;\n titleGeneratedRef.current = true;\n if (threadId) {\n onGenerateTitleRef.current?.(threadId, text.trim());\n }\n }, [messages, threadId]);\n\n // Periodically save thread data while the agent is running so refreshes\n // don't lose messages. Saves every 5 seconds while running.\n const savedTitleRef = useRef(\"\");\n const lastSaveTimeRef = useRef(0);\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (!isRunning) return;\n if (messages.length === 0) return;\n if (!threadId || !onSaveThreadRef.current) return;\n\n const now = Date.now();\n const timeSinceLastSave = now - lastSaveTimeRef.current;\n if (timeSinceLastSave < 5000) return;\n\n const repo = threadRuntime.export();\n const { title, preview } = extractThreadMeta(repo);\n\n lastSaveTimeRef.current = now;\n savedTitleRef.current = title;\n onSaveThreadRef.current(threadId, {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n });\n }, [messages, isRunning, threadId, threadRuntime]);\n\n // Persist full thread data after each completed response\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (isRunning) return;\n if (messages.length === 0) return;\n\n const repo = threadRuntime.export();\n\n if (threadId && onSaveThreadRef.current) {\n // Save to server via the hook callback\n const { title, preview } = extractThreadMeta(repo);\n savedTitleRef.current = title;\n onSaveThreadRef.current(threadId, {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n });\n } else {\n // Legacy: save to sessionStorage\n const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`;\n try {\n sessionStorage.setItem(storageKey, JSON.stringify(repo));\n } catch {}\n }\n }, [messages, isRunning, threadId, tabId, threadRuntime]);\n\n useEffect(() => {\n onMessageCountChange?.(messages.length);\n }, [messages.length, onMessageCountChange]);\n\n // Persist queued messages to the server so they survive reloads. Debounced\n // to 300ms so typing-and-queuing-rapidly doesn't hammer the endpoint.\n // Stores them in thread_data.queuedMessages via POST /threads/:id/queued.\n useEffect(() => {\n if (!threadId) return;\n if (!hasRestoredRef.current) return;\n const serialized = JSON.stringify(queuedMessages);\n if (serialized === lastPersistedQueueRef.current) return;\n const timer = setTimeout(() => {\n (async () => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/queued`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ queuedMessages }),\n },\n );\n if (res.ok) {\n lastPersistedQueueRef.current = serialized;\n }\n } catch {\n // Best-effort — next queue change will retry.\n }\n })();\n }, 300);\n return () => clearTimeout(timer);\n }, [queuedMessages, threadId, apiUrl]);\n\n // Listen for missing API key events from the adapter\n useEffect(() => {\n const handler = () => setMissingApiKey(true);\n window.addEventListener(\"agent-chat:missing-api-key\", handler);\n return () =>\n window.removeEventListener(\"agent-chat:missing-api-key\", handler);\n }, []);\n\n const handleBuilderConnected = useCallback(() => {\n setMissingApiKey(false);\n }, []);\n\n // Check on mount and whenever SettingsPanel dispatches\n // `agent-engine:configured-changed` so the gate flips live without reload.\n useEffect(() => {\n if (!providerStatusChecksEnabled) {\n setMissingApiKey(false);\n return;\n }\n let cancelled = false;\n const check = async () => {\n const [envKeys, builderStatus, engineStatus] = await Promise.all([\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/agent-engine/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ]);\n if (cancelled) return;\n // All three status endpoints failed — avoid flashing the gate on a\n // transient network error.\n if (envKeys == null && builderStatus == null && engineStatus == null) {\n return;\n }\n const keys = (envKeys ?? []) as Array<{\n key: string;\n configured: boolean;\n }>;\n const llmKeys = keys.filter((k) => PROVIDER_ENV_VAR_SET.has(k.key));\n const anyConfigured =\n llmKeys.some((k) => k.configured) ||\n builderStatus?.configured === true ||\n engineStatus?.configured === true;\n setMissingApiKey(!anyConfigured);\n };\n check();\n window.addEventListener(\"agent-engine:configured-changed\", check);\n return () => {\n cancelled = true;\n window.removeEventListener(\"agent-engine:configured-changed\", check);\n };\n }, [providerStatusChecksEnabled]);\n\n // Listen for auth error events from the adapter\n const checkAuthSession = useCallback(async () => {\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/auth/session\"), {\n cache: \"no-store\",\n });\n if (!res.ok) return false;\n const data = await res.json().catch(() => null);\n const hasSession = !!data && !data.error;\n setAuthSessionAvailable(hasSession);\n if (hasSession) {\n setAuthError(null);\n }\n return hasSession;\n } catch {\n return false;\n }\n }, []);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as\n | {\n reason?: string;\n tabId?: string;\n threadId?: string;\n }\n | undefined;\n const eventTabId =\n typeof detail?.tabId === \"string\" ? detail.tabId : null;\n const eventThreadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : null;\n if (\n (eventTabId || eventThreadId) &&\n eventTabId !== tabId &&\n eventThreadId !== threadId\n ) {\n return;\n }\n setAuthSessionAvailable(false);\n setAuthError({ sessionExpired: detail?.reason === \"session-expired\" });\n void checkAuthSession();\n };\n window.addEventListener(\"agent-chat:auth-error\", handler);\n return () => window.removeEventListener(\"agent-chat:auth-error\", handler);\n }, [checkAuthSession, tabId, threadId]);\n\n useEffect(() => {\n if (!authError) return;\n // Auto-recovery (`checkAuthSession`) runs immediately + at 250ms. If the\n // card is still showing 3 seconds later, recovery failed and the user\n // is about to hit \"Refresh chat\" — that's the \"Reload UI required\"\n // symptom we want signal on.\n const stuckCapture = window.setTimeout(() => {\n captureError(new Error(\"agent-chat:auth_error_card_stuck\"), {\n tags: {\n context: \"agent-native-chat\",\n errorCode: \"auth_error_card\",\n sessionAvailable: String(authSessionAvailable),\n sessionExpired: String(!!authError.sessionExpired),\n },\n extra: {\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n },\n });\n }, 3000);\n const handler = () => void checkAuthSession();\n const timer = window.setTimeout(handler, 250);\n window.addEventListener(\"focus\", handler);\n window.addEventListener(\"agent-engine:configured-changed\", handler);\n return () => {\n window.clearTimeout(stuckCapture);\n window.clearTimeout(timer);\n window.removeEventListener(\"focus\", handler);\n window.removeEventListener(\"agent-engine:configured-changed\", handler);\n };\n }, [authError, authSessionAvailable, checkAuthSession, tabId, threadId]);\n\n // Listen for loop-limit events from the adapter\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!tabId || detail?.tabId === tabId) {\n setLoopLimitInfo({\n ...(typeof detail?.maxIterations === \"number\"\n ? { maxIterations: detail.maxIterations }\n : {}),\n });\n setShowContinue(true);\n }\n };\n window.addEventListener(\"agent-chat:loop-limit\", handler);\n return () => window.removeEventListener(\"agent-chat:loop-limit\", handler);\n }, [tabId]);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as RunErrorInfo & {\n tabId?: string;\n };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n if (!detail?.message) return;\n const stopped = userStoppedRunRef.current;\n if (\n stopped &&\n Date.now() - stopped.at < 10_000 &&\n (!stopped.runId || !detail.runId || stopped.runId === detail.runId)\n ) {\n return;\n }\n setRunErrorInfo({\n message: detail.message,\n ...(detail.details ? { details: detail.details } : {}),\n ...(detail.errorCode ? { errorCode: detail.errorCode } : {}),\n ...(detail.runId ? { runId: detail.runId } : {}),\n ...(detail.recoverable ? { recoverable: detail.recoverable } : {}),\n });\n setDismissedRunErrorKey(null);\n };\n window.addEventListener(\"agent-chat:run-error\", handler);\n return () => window.removeEventListener(\"agent-chat:run-error\", handler);\n }, [tabId]);\n\n // Auto-dequeue: when agent finishes running, send the next queued message\n useEffect(() => {\n if (wasRunningRef.current && !isRunning && queuedMessages.length > 0) {\n const [next, ...rest] = queuedMessages;\n setQueuedMessages(rest);\n // Small delay to let the runtime settle after completion\n setTimeout(() => {\n void (async () => {\n // In serverless/cross-isolate deployments the client can receive the\n // terminal SSE event a beat before SQL has marked the previous run\n // complete. Starting the queued turn during that window can reconnect\n // to the old run and replay the old answer under the new prompt.\n await waitForThreadRunToClear(apiUrl, threadId);\n const imageAttachments = createAgentImageAttachments(next.images);\n const messageAttachments =\n next.attachments && next.attachments.length > 0\n ? next.attachments\n : (imageAttachments ?? []);\n threadRuntime.append({\n role: \"user\",\n content: [{ type: \"text\", text: next.text }],\n ...(messageAttachments.length > 0\n ? { attachments: messageAttachments }\n : {}),\n ...createUserMessageRunConfig(\n next.references,\n next.requestMode,\n next.recoveryAction,\n next.trackInRunsTray,\n ),\n } as Parameters<typeof threadRuntime.append>[0]);\n })();\n }, 100);\n }\n wasRunningRef.current = isRunning;\n }, [apiUrl, isRunning, queuedMessages, threadId, threadRuntime]);\n\n // Clear frozen reconnect content + forceStopped only on the false→true\n // transition of isRuntimeRunning (i.e. a NEW run is actually starting).\n // Reacting to \"isRuntimeRunning is currently true\" would clear the\n // nuclear-stop flag immediately after the user clicks stop, since\n // cancellation is async and isRuntimeRunning is still true at that moment.\n const prevIsRuntimeRunningRef = useRef(isRuntimeRunning);\n useEffect(() => {\n const wasRunning = prevIsRuntimeRunningRef.current;\n prevIsRuntimeRunningRef.current = isRuntimeRunning;\n if (isRuntimeRunning && !wasRunning) {\n if (reconnectFrozen) {\n setReconnectFrozen(false);\n setReconnectContent([]);\n }\n if (forceStopped) {\n setForceStopped(false);\n }\n }\n }, [isRuntimeRunning, reconnectFrozen, forceStopped]);\n\n // Same transition guard for isReconnecting: only clear forceStopped on\n // the false→true edge (a new reconnect starting on page load).\n const prevIsReconnectingRef = useRef(isReconnecting);\n useEffect(() => {\n const wasReconnecting = prevIsReconnectingRef.current;\n prevIsReconnectingRef.current = isReconnecting;\n if (isReconnecting && !wasReconnecting && forceStopped) {\n setForceStopped(false);\n }\n }, [isReconnecting, forceStopped]);\n\n const materializeFrozenReconnectContent = useCallback(() => {\n if (!reconnectFrozen || reconnectContent.length === 0) return;\n try {\n const repo = normalizeThreadRepository(threadRuntime.export());\n const messages = getRepoMessages(repo);\n const lastEntry = messages[messages.length - 1];\n const lastMessage = getRepoMessage(lastEntry);\n const parentId =\n typeof repo.headId === \"string\"\n ? repo.headId\n : typeof lastMessage?.id === \"string\"\n ? lastMessage.id\n : null;\n const runId = runErrorInfo?.runId ?? reconnectRunIdRef.current;\n const id = `reconnect-${runId ?? Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n repo.messages = [\n ...messages,\n {\n parentId,\n message: {\n id,\n role: \"assistant\",\n createdAt: new Date(),\n content: cloneContentParts(reconnectContent),\n status: { type: \"complete\", reason: \"stop\" },\n metadata: {\n custom: {\n reconnectFrozen: true,\n ...(runId ? { runId } : {}),\n },\n },\n },\n },\n ];\n repo.headId = id;\n\n threadRuntime.import(ensureMessageMetadata(repo));\n setReconnectFrozen(false);\n setReconnectContent([]);\n } catch (err) {\n captureError(err, {\n tags: {\n source: \"agent-chat-client\",\n phase: \"materialize-reconnect-content\",\n },\n extra: {\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n reconnectParts: reconnectContent.length,\n },\n });\n }\n }, [\n reconnectFrozen,\n reconnectContent,\n runErrorInfo?.runId,\n tabId,\n threadId,\n threadRuntime,\n ]);\n\n const addToQueue = useCallback(\n async (\n text: string,\n images?: string[],\n references?: Reference[],\n attachments?: ReadonlyArray<unknown>,\n requestMode?: AgentRequestMode,\n intent: ComposerSubmitIntent = \"queued\",\n recoveryAction?: AgentRecoveryAction,\n includeComposerContext = false,\n trackInRunsTray = false,\n ) => {\n materializeFrozenReconnectContent();\n setShowContinue(false);\n setLoopLimitInfo(null);\n setRunErrorInfo(null);\n setDismissedRunErrorKey(null);\n userStoppedRunRef.current = null;\n // Selection context attached via Cmd+I is one-shot — clear it as soon\n // as the user actually sends a message so it can't be re-used.\n clearPendingSelection();\n // Sending a message is an explicit user action — always anchor to the\n // bottom so the new message and any reply land in view, even if the\n // user had scrolled up to read history. The sticky-bottom override\n // exists to stop streaming from yanking the viewport, not to swallow\n // direct sends.\n markNearBottom();\n const submitted = includeComposerContext\n ? buildComposerContextSubmission(text)\n : { text, includesContext: false };\n const submittedText = submitted.text;\n const queuedAttachments = await serializeQueuedAttachments(attachments);\n const imageAttachments = createAgentImageAttachments(images);\n const messageAttachments = [\n ...(queuedAttachments ?? []),\n ...(imageAttachments ?? []),\n ];\n // Snapshot the exec mode at enqueue time when the caller didn't\n // pass an explicit override. Without this, a plan-mode message that\n // sits in the queue runs as 'act' if the user flips the global toggle\n // before the queue flushes — turning a read-only message into a write.\n const effectiveRequestMode: AgentRequestMode | undefined =\n requestMode ??\n (execMode === \"plan\"\n ? \"plan\"\n : execMode === \"build\"\n ? \"act\"\n : undefined);\n if (isRunning && intent === \"queued\") {\n setQueuedMessages((prev) => [\n ...prev,\n {\n id:\n typeof crypto !== \"undefined\" && crypto.randomUUID\n ? crypto.randomUUID()\n : `q-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n text: submittedText,\n images,\n attachments:\n messageAttachments.length > 0 ? messageAttachments : undefined,\n references,\n requestMode: effectiveRequestMode,\n recoveryAction,\n trackInRunsTray,\n },\n ]);\n } else {\n threadRuntime.append({\n role: \"user\",\n content: [{ type: \"text\", text: submittedText }],\n ...(messageAttachments.length > 0\n ? { attachments: messageAttachments }\n : {}),\n ...createUserMessageRunConfig(\n references,\n effectiveRequestMode,\n recoveryAction,\n trackInRunsTray,\n ),\n } as Parameters<typeof threadRuntime.append>[0]);\n }\n if (submitted.includesContext) {\n updateComposerContextItems(() => []);\n }\n },\n [\n buildComposerContextSubmission,\n execMode,\n isRunning,\n materializeFrozenReconnectContent,\n threadRuntime,\n updateComposerContextItems,\n ],\n );\n\n // Expose imperative handle\n useImperativeHandle(\n ref,\n () => ({\n sendMessage(\n text: string,\n images?: string[],\n options?: { trackInRunsTray?: boolean },\n ) {\n addToQueue(\n text,\n images,\n undefined,\n undefined,\n undefined,\n \"queued\",\n undefined,\n false,\n options?.trackInRunsTray === true,\n );\n },\n prefillMessage(text: string) {\n tiptapRef.current?.setText(text);\n tiptapRef.current?.focus();\n },\n setComposerContextItem(item: AgentChatContextItem) {\n stageComposerContextItem(item);\n tiptapRef.current?.focus();\n },\n removeComposerContextItem(key: string) {\n removeComposerContextItem(key);\n },\n clearComposerContextItems() {\n updateComposerContextItems(() => []);\n },\n sendRecoveryMessage(\n text: string,\n recoveryAction: AgentRecoveryAction,\n images?: string[],\n ) {\n addToQueue(\n text,\n images,\n undefined,\n undefined,\n undefined,\n \"queued\",\n recoveryAction,\n );\n },\n queueMessage(text: string, images?: string[]) {\n addToQueue(text, images);\n },\n isRunning() {\n return thread.isRunning;\n },\n focusComposer() {\n tiptapRef.current?.focus();\n },\n exportThreadSnapshot() {\n if (messages.length === 0) return null;\n const repo = threadRuntime.export();\n const { title, preview } = extractThreadMeta(repo);\n return {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n };\n },\n }),\n [\n addToQueue,\n messages.length,\n stageComposerContextItem,\n thread.isRunning,\n threadRuntime,\n ],\n );\n\n const autoscrollFollowKey = useMemo(\n () =>\n [\n messages.map(messageFollowKey).join(\";\"),\n `q:${queuedMessages.map(queuedMessageFollowKey).join(\"|\")}`,\n `r:${reconnectContentFollowKey(reconnectContent)}`,\n ].join(\";;\"),\n [messages, queuedMessages, reconnectContent],\n );\n\n const {\n scrollRef,\n isNearBottomRef,\n showScrollToBottom,\n markNearBottom,\n scrollToBottom,\n scrollToBottomAfterPaint,\n } = useNearBottomAutoscroll<HTMLDivElement>({\n followKey: autoscrollFollowKey,\n streaming: textStreaming,\n });\n\n const scrollToBottomWhileLayoutSettles = useCallback(() => {\n scrollToBottomAfterPaint();\n const el = scrollRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return undefined;\n\n let stopped = false;\n const observer = new ResizeObserver(() => {\n if (!stopped && isNearBottomRef.current) scrollToBottom();\n });\n observer.observe(el);\n const timeout = window.setTimeout(() => {\n stopped = true;\n observer.disconnect();\n if (isNearBottomRef.current) scrollToBottom();\n }, 1600);\n\n return () => {\n stopped = true;\n window.clearTimeout(timeout);\n observer.disconnect();\n };\n }, [isNearBottomRef, scrollToBottom, scrollToBottomAfterPaint]);\n\n // Scroll to bottom when a restored thread finishes loading\n const wasRestoringRef = useRef(isRestoring);\n useEffect(() => {\n const wasRestoring = wasRestoringRef.current;\n wasRestoringRef.current = isRestoring;\n if (wasRestoring && !isRestoring) {\n return scrollToBottomWhileLayoutSettles();\n }\n }, [isRestoring, scrollToBottomWhileLayoutSettles]);\n\n useEffect(() => {\n if (!textStreaming && isNearBottomRef.current) {\n scrollToBottomAfterPaint();\n }\n }, [textStreaming, scrollToBottomAfterPaint]);\n\n const { isDevMode: cpDevMode } = useDevMode(apiUrl);\n const checkpointCtx = useMemo(\n () => ({ apiUrl, devMode: cpDevMode, threadId }),\n [apiUrl, cpDevMode, threadId],\n );\n const messageActionsCtx = useMemo(() => ({ onForkChat }), [onForkChat]);\n const lastMessageLoopLimit = useMemo(() => {\n const last = messages[messages.length - 1];\n if (!last || last.role !== \"assistant\") return null;\n return getLoopLimitMetadata(last);\n }, [messages]);\n const lastMessageRunError = useMemo(() => {\n const last = messages[messages.length - 1];\n if (!last || last.role !== \"assistant\") return null;\n return getRunErrorMetadata(last);\n }, [messages]);\n const lastUserText = useMemo(\n () => latestNonRecoveryUserMessageText(messages),\n [messages],\n );\n const latestMessage = messages[messages.length - 1];\n const latestMessageRole = latestMessage?.role;\n const latestAssistantWasPlan =\n latestMessageRole === \"assistant\" &&\n getRequestModeMetadata(latestMessage) === \"plan\";\n const showPlanModeCallout =\n execMode === \"plan\" &&\n !planModeDisabled &&\n !isComposerDisabled &&\n !showRunningInUI;\n const canImplementPlan = showPlanModeCallout && latestAssistantWasPlan;\n const contextXRayEnabled = Boolean(\n threadId &&\n (messages.length > 0 || isReconnecting || reconnectContent.length > 0),\n );\n const handleImplementPlan = useCallback(() => {\n onExecModeChange?.(\"build\");\n void addToQueue(\n \"Implement the plan.\",\n undefined,\n undefined,\n undefined,\n \"act\",\n );\n }, [addToQueue, onExecModeChange]);\n const handleSwitchToAct = useCallback(() => {\n onExecModeChange?.(\"build\");\n }, [onExecModeChange]);\n const visibleLoopLimit = showContinue\n ? (loopLimitInfo ?? lastMessageLoopLimit ?? {})\n : lastMessageLoopLimit;\n const visibleRunError = runErrorInfo ?? lastMessageRunError;\n const visibleRunErrorKey = visibleRunError\n ? `${visibleRunError.runId ?? \"\"}:${visibleRunError.errorCode ?? \"\"}:${visibleRunError.message}`\n : null;\n const shouldShowRunError =\n !!visibleRunError &&\n !showRunningInUI &&\n visibleRunErrorKey !== dismissedRunErrorKey &&\n !(\n userStoppedRunRef.current &&\n Date.now() - userStoppedRunRef.current.at < 10_000 &&\n (!userStoppedRunRef.current.runId ||\n !visibleRunError.runId ||\n userStoppedRunRef.current.runId === visibleRunError.runId)\n );\n const isFreshEmptyChat =\n messages.length === 0 &&\n !isRestoring &&\n !isReconnecting &&\n !authError &&\n !missingApiKey;\n const centeredEmptyState = centerComposerWhenEmpty && isFreshEmptyChat;\n\n // Clarifying-question surface: the `ask-question` action writes a\n // GuidedQuestionPayload to application_state under \"guided-questions\". The\n // hook polls that key, and on submit/skip composes the answer as a normal\n // user turn (via the shared sendToAgentChat) and clears the persisted key so\n // the question does not reappear.\n const {\n questions: guidedQuestions,\n title: guidedQuestionsTitle,\n description: guidedQuestionsDescription,\n skipLabel: guidedQuestionsSkipLabel,\n submitLabel: guidedQuestionsSubmitLabel,\n handleSubmit: handleGuidedQuestionsSubmit,\n handleSkip: handleGuidedQuestionsSkip,\n } = useGuidedQuestionFlow({\n stateKey: \"guided-questions\",\n queryKey: [\"guided-questions\"],\n ...(browserTabId ? { browserTabId } : {}),\n });\n\n return (\n <CheckpointContext.Provider value={checkpointCtx}>\n <MessageActionsContext.Provider value={messageActionsCtx}>\n <ChatRunningContext.Provider value={isRunning}>\n <TextStreamingContext.Provider value={textStreaming}>\n <div\n data-agent-empty-state={\n centeredEmptyState ? \"centered\" : undefined\n }\n className={cn(\n \"relative flex flex-1 flex-col h-full min-h-0 text-foreground\",\n className,\n )}\n onDragEnter={handleChatDragEnter}\n onDragOver={handleChatDragOver}\n onDragLeave={handleChatDragLeave}\n onDropCapture={handleChatDropCapture}\n onDrop={handleChatDrop}\n >\n {dropActive && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-50 flex items-center justify-center rounded-md border-2 border-dashed border-primary/70 bg-primary/5 backdrop-blur-[1px]\"\n >\n <span className=\"rounded-md bg-background/90 px-3 py-1.5 text-xs font-medium text-foreground shadow-sm\">\n Drop to attach\n </span>\n </div>\n )}\n {showHeader && (\n <div className=\"flex h-11 shrink-0 items-center justify-between border-b border-border px-4\">\n <span className=\"text-[13px] font-medium text-muted-foreground\">\n Agent\n </span>\n <div className=\"flex items-center gap-1\">\n {onSwitchToCli && (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={onSwitchToCli}\n aria-label=\"Switch to CLI\"\n className=\"flex items-center gap-1 text-[12px] text-muted-foreground hover:text-foreground px-2 py-1 rounded-md hover:bg-accent\"\n >\n <IconTerminal className=\"h-3.5 w-3.5\" />\n CLI\n </button>\n </TooltipTrigger>\n <TooltipContent>Switch to CLI</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </div>\n )}\n\n {/* Messages area */}\n <div\n ref={scrollRef}\n className=\"agent-chat-scroll flex-1 overflow-y-auto overflow-x-hidden min-h-0\"\n >\n {authError ? (\n <div className=\"flex flex-col items-center justify-center h-full px-4 gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n {authSessionAvailable ? (\n <IconRefresh className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <IconMessage className=\"h-5 w-5 text-muted-foreground\" />\n )}\n </div>\n <div className=\"text-center max-w-[280px]\">\n <p className=\"text-sm font-medium text-foreground mb-1\">\n {authSessionAvailable\n ? \"Chat session needs refresh\"\n : authError.sessionExpired\n ? \"Session expired\"\n : \"Authentication required\"}\n </p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n {authSessionAvailable\n ? \"You're signed in, but this chat connection needs to reconnect.\"\n : authError.sessionExpired\n ? \"Your session may have expired. Log out and log back in to reconnect.\"\n : \"You need to log in to use the agent.\"}\n </p>\n </div>\n <div className=\"flex gap-2\">\n {!authError.sessionExpired && !authSessionAvailable && (\n <button\n onClick={() => {\n const ret =\n window.location.pathname + window.location.search;\n window.location.href =\n agentNativePath(\"/_agent-native/sign-in\") +\n `?return=${encodeURIComponent(ret)}`;\n }}\n className=\"text-xs text-background bg-foreground hover:opacity-90 px-3 py-1.5 rounded-md\"\n >\n Log in\n </button>\n )}\n {authError.sessionExpired && !authSessionAvailable && (\n <button\n onClick={async () => {\n try {\n await fetch(\n agentNativePath(\"/_agent-native/auth/logout\"),\n {\n method: \"POST\",\n },\n );\n } catch {}\n window.location.reload();\n }}\n className=\"text-xs text-destructive hover:text-destructive/80 px-3 py-1.5 rounded-md border border-destructive/30 hover:bg-destructive/10\"\n >\n Log out\n </button>\n )}\n <button\n onClick={() => {\n setAuthError(null);\n window.location.reload();\n }}\n className={\n authSessionAvailable\n ? \"text-xs text-background bg-foreground hover:opacity-90 px-3 py-1.5 rounded-md\"\n : \"text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md border border-border hover:bg-accent\"\n }\n >\n Refresh chat\n </button>\n </div>\n </div>\n ) : missingApiKey && messages.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full px-2\">\n <BuilderSetupCard\n onConnected={handleBuilderConnected}\n bouncePulse={missingKeyBouncePulse}\n />\n </div>\n ) : isRestoring ? (\n <div className=\"flex flex-col gap-3 p-4\">\n <div className=\"flex justify-end\">\n <div className=\"h-8 w-32 rounded-lg bg-muted animate-pulse\" />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"h-4 w-48 rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-64 rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-40 rounded bg-muted animate-pulse\" />\n </div>\n </div>\n ) : messages.length === 0 && !isReconnecting ? (\n <div\n className={cn(\n \"agent-empty-state\",\n emptyStateDisplay === \"hidden\"\n ? \"sr-only\"\n : \"flex h-full flex-col items-center justify-center gap-4 px-4 py-16\",\n )}\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n <IconMessage className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"sr-only\">\n {emptyStateText ?? \"How can I help you?\"}\n </p>\n {emptyStateAddon}\n {resolvedSuggestions && resolvedSuggestions.length > 0 ? (\n <div className=\"flex flex-col gap-1.5 w-full max-w-[280px]\">\n {resolvedSuggestions.map((suggestion) => (\n <button\n key={suggestion}\n onClick={() => {\n threadRuntime.append({\n role: \"user\",\n content: [{ type: \"text\", text: suggestion }],\n });\n }}\n className=\"w-full rounded-lg border border-border px-3 py-2 text-left text-[13px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ) : (\n <div className=\"agent-thread-content flex flex-col gap-4 px-4 py-4\">\n <AssistantMessageListErrorBoundary\n resetKey={messageListResetKey}\n >\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n AssistantMessage,\n }}\n />\n </AssistantMessageListErrorBoundary>\n {missingApiKey && (\n <BuilderSetupCard\n onConnected={handleBuilderConnected}\n bouncePulse={missingKeyBouncePulse}\n />\n )}\n {visibleLoopLimit && !showRunningInUI && (\n <LoopLimitContinueCard\n info={visibleLoopLimit}\n onContinue={() => {\n setShowContinue(false);\n setLoopLimitInfo(null);\n addToQueue(\n \"Continue from where you left off.\",\n undefined,\n undefined,\n undefined,\n undefined,\n \"queued\",\n \"continue\",\n );\n }}\n />\n )}\n {shouldShowRunError && visibleRunError && (\n <RunErrorRecoveryCard\n info={visibleRunError}\n onContinue={() => {\n setRunErrorInfo(null);\n addToQueue(\n \"Continue from where you stopped. Use the partial work above, verify what succeeded, and finish the original request. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. Prefer dedicated app actions over raw database edits when they exist.\",\n undefined,\n undefined,\n undefined,\n undefined,\n \"queued\",\n \"continue\",\n );\n }}\n onRetry={() => {\n setRunErrorInfo(null);\n addToQueue(\n lastUserText\n ? `Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.\\n\\nOriginal request:\\n\\n${lastUserText}`\n : \"Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.\",\n undefined,\n undefined,\n undefined,\n undefined,\n \"queued\",\n \"retry\",\n );\n }}\n onFork={onForkChat}\n onDismiss={() => {\n if (visibleRunErrorKey) {\n setDismissedRunErrorKey(visibleRunErrorKey);\n }\n setRunErrorInfo(null);\n }}\n />\n )}\n {(isReconnecting || reconnectFrozen) &&\n reconnectContent.length > 0 && (\n <ReconnectStreamMessage content={reconnectContent} />\n )}\n {queuedMessages.map((msg) => {\n const displayText = msg.text\n .replace(/<context>[\\s\\S]*?<\\/context>\\n?/g, \"\")\n .trim();\n return (\n <div key={msg.id} className=\"flex justify-end group\">\n <div className=\"relative max-w-[85%] rounded-lg bg-accent/50 text-foreground/60 px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words\">\n <div className=\"flex items-center gap-1.5 text-[10px] text-muted-foreground mb-1 font-medium uppercase tracking-wide\">\n <IconClock className=\"h-3 w-3\" />\n Queued\n </div>\n {displayText}\n {msg.images && msg.images.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mt-1.5\">\n {msg.images.map((img, j) => (\n <img\n key={j}\n src={img}\n alt=\"\"\n className=\"h-12 w-12 rounded object-cover border border-border/50\"\n />\n ))}\n </div>\n )}\n <button\n type=\"button\"\n onClick={() =>\n setQueuedMessages((prev) =>\n prev.filter((m) => m.id !== msg.id),\n )\n }\n aria-label=\"Remove from queue\"\n className=\"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:text-foreground hover:bg-accent shadow-sm\"\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Scroll to bottom button */}\n {showScrollToBottom && (\n <div className=\"shrink-0 flex justify-center -mb-1\">\n <button\n type=\"button\"\n onClick={scrollToBottom}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent\"\n aria-label=\"Scroll to bottom\"\n >\n <IconChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </div>\n )}\n\n {composerSlot}\n {guidedQuestions && guidedQuestions.length > 0 && (\n <div className=\"shrink-0 px-3 pb-2 pt-1\">\n <div className=\"rounded-lg border border-border bg-card/60 shadow-sm\">\n <GuidedQuestionFlow\n questions={guidedQuestions}\n onSubmit={handleGuidedQuestionsSubmit}\n onSkip={handleGuidedQuestionsSkip}\n {...(guidedQuestionsTitle\n ? { title: guidedQuestionsTitle }\n : {})}\n {...(guidedQuestionsDescription\n ? { description: guidedQuestionsDescription }\n : {})}\n {...(guidedQuestionsSkipLabel\n ? { skipLabel: guidedQuestionsSkipLabel }\n : {})}\n {...(guidedQuestionsSubmitLabel\n ? { submitLabel: guidedQuestionsSubmitLabel }\n : {})}\n className=\"h-auto items-stretch justify-stretch bg-transparent\"\n />\n </div>\n </div>\n )}\n {showPlanModeCallout && (\n <PlanModeCallout\n canImplementPlan={canImplementPlan}\n onImplementPlan={handleImplementPlan}\n onSwitchToAct={handleSwitchToAct}\n />\n )}\n <SelectionAttachedPill />\n {/* Keep live run progress pinned in the composer footer. */}\n {showRunningInUI && (\n <RunningActivityStatus\n label={isReconnecting ? \"Reconnecting\" : \"Thinking\"}\n />\n )}\n {/* Input area */}\n <AgentComposerFrame\n layoutVariant={composerLayoutVariant}\n className={cn(\n composerAreaClassName,\n missingApiKey && \"cursor-pointer\",\n isComposerDisabled && \"opacity-70\",\n )}\n onClick={\n missingApiKey\n ? () => setMissingKeyBouncePulse((p) => p + 1)\n : undefined\n }\n >\n <ComposerAttachmentPreviewStrip />\n <TiptapComposer\n focusRef={tiptapRef}\n disabled={isComposerDisabled}\n placeholder={\n missingApiKey\n ? \"Connect an AI engine above to start chatting…\"\n : composerDisabled\n ? (composerDisabledPlaceholder ??\n \"Open Desktop to use this chat.\")\n : isRunning\n ? queuedMessages.length > 0\n ? `${queuedMessages.length} queued — send a follow-up...`\n : \"Send a follow-up...\"\n : composerPlaceholder\n }\n onSubmit={\n isRunning || composerContextItems.length > 0\n ? (text, references, attachments, options) =>\n void addToQueue(\n text,\n undefined,\n references.length > 0 ? references : undefined,\n attachments,\n undefined,\n options?.intent ?? \"immediate\",\n undefined,\n true,\n )\n : undefined\n }\n onSlashCommand={onSlashCommand}\n execMode={execMode}\n onExecModeChange={onExecModeChange}\n planModeDisabled={planModeDisabled}\n planModeDisabledReason={planModeDisabledReason}\n selectedModel={selectedModel ?? defaultModel}\n selectedEffort={selectedEffort}\n availableModels={availableModels}\n onModelChange={onModelChange}\n onEffortChange={onEffortChange}\n onConnectProvider={onConnectProvider}\n toolbarSlot={composerToolbarSlot}\n contextItems={composerContextItems}\n onRemoveContextItem={removeComposerContextItem}\n plusMenuMode={plusMenuMode}\n layoutVariant={composerLayoutVariant}\n providerConnectStatusEnabled={providerStatusChecksEnabled}\n draftScope={threadId || tabId}\n interceptBuildRequestsForBuilder\n extraActionButton={\n contextXRayEnabled ||\n composerExtraActionButton ||\n showRunningInUI ? (\n <>\n {contextXRayEnabled && (\n <ContextMeter threadId={threadId} />\n )}\n {composerExtraActionButton}\n {showRunningInUI && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n // Nuclear stop: flip forceStopped so isRunning is false\n // immediately. This unblocks submission even if the\n // runtime or reconnect state is stuck.\n setForceStopped(true);\n const activeRun = getActiveRun();\n const runIdToAbort =\n reconnectRunIdRef.current ??\n activeRun?.runId;\n userStoppedRunRef.current = {\n at: Date.now(),\n ...(runIdToAbort\n ? { runId: runIdToAbort }\n : {}),\n };\n setRunErrorInfo(null);\n setDismissedRunErrorKey(null);\n if (runIdToAbort) {\n fetch(\n `${apiUrl}/runs/${encodeURIComponent(runIdToAbort)}/abort`,\n { method: \"POST\" },\n ).catch(() => {});\n }\n\n if (isReconnecting) {\n reconnectAbortRef.current?.abort();\n reconnectAbortRef.current = null;\n reconnectRunIdRef.current = null;\n setIsReconnecting(false);\n setReconnectFrozen(\n reconnectContent.length > 0,\n );\n }\n\n threadRuntime.cancelRun();\n\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: {\n isRunning: false,\n tabId: tabId || threadId,\n },\n }),\n );\n }}\n className=\"shrink-0 flex h-7 w-7 items-center justify-center rounded-md bg-muted text-foreground hover:bg-muted/80\"\n >\n <IconPlayerStop className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Stop generating</TooltipContent>\n </Tooltip>\n )}\n </>\n ) : undefined\n }\n />\n </AgentComposerFrame>\n </div>\n </TextStreamingContext.Provider>\n </ChatRunningContext.Provider>\n </MessageActionsContext.Provider>\n </CheckpointContext.Provider>\n );\n});\n\nexport const AssistantChat = forwardRef<\n AssistantChatHandle,\n AssistantChatProps\n>(function AssistantChat(\n {\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n tabId,\n browserTabId,\n threadId,\n contextScope,\n isActiveComposer,\n ...props\n },\n ref,\n) {\n const modelRef = useRef<string | undefined>(props.selectedModel);\n modelRef.current = props.selectedModel;\n const engineRef = useRef<string | undefined>(props.selectedEngine);\n engineRef.current = props.selectedEngine;\n const effortRef = useRef<ReasoningEffort | undefined>(props.selectedEffort);\n effortRef.current = props.selectedEffort;\n const execModeRef = useRef<\"build\" | \"plan\" | undefined>(props.execMode);\n execModeRef.current = props.execMode;\n const scopeRef = useRef<ChatThreadScope | null | undefined>(contextScope);\n scopeRef.current = contextScope;\n const surface = props.agentChatSurface ?? \"app\";\n const createAdapterRef = useRef(props.createAdapter);\n createAdapterRef.current = props.createAdapter;\n\n const adapter = useMemo(\n () => {\n const context: AssistantChatAdapterContext = {\n apiUrl,\n tabId,\n threadId,\n modelRef,\n engineRef,\n effortRef,\n execModeRef,\n browserTabId,\n scopeRef,\n surface,\n };\n const createAdapter = createAdapterRef.current;\n return createAdapter\n ? createAdapter(context)\n : createAgentChatAdapter(context);\n },\n // Adapter factories must be memoized and use refs for changing values.\n // `adapterReloadKey` is an explicit opt-in for embedded hosts whose\n // transport identity can change without changing tab/thread ids.\n [apiUrl, tabId, threadId, browserTabId, surface, props.adapterReloadKey],\n );\n const attachmentAdapter = useMemo(\n () =>\n new CompositeAttachmentAdapter([\n new DownscalingImageAttachmentAdapter(),\n new BinaryDocumentAttachmentAdapter(),\n new TextAttachmentAdapter(),\n ]),\n [],\n );\n const runtime = useLocalRuntime(adapter, {\n adapters: { attachments: attachmentAdapter },\n });\n\n return (\n <AssistantRuntimeProvider runtime={runtime}>\n <TooltipProvider delayDuration={200}>\n <ThreadPrimitive.Root className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n <AssistantUiStaleIndexErrorBoundary\n resetKey={`${tabId ?? \"\"}:${threadId ?? \"\"}`}\n componentName=\"AssistantChat\"\n >\n <AssistantChatInner\n ref={ref}\n {...props}\n browserTabId={browserTabId}\n contextScope={contextScope}\n isActiveComposer={isActiveComposer}\n apiUrl={apiUrl}\n tabId={tabId}\n threadId={threadId}\n />\n </AssistantUiStaleIndexErrorBoundary>\n </ThreadPrimitive.Root>\n </TooltipProvider>\n </AssistantRuntimeProvider>\n );\n});\n"]}
1
+ {"version":3,"file":"AssistantChat.js","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport {\n AssistantRuntimeProvider,\n useLocalRuntime,\n useThreadRuntime,\n useThread,\n useAui,\n useComposer,\n useComposerRuntime,\n ThreadPrimitive,\n} from \"@assistant-ui/react\";\nimport type {\n Attachment,\n ChatModelAdapter,\n ExportedMessageRepository,\n} from \"@assistant-ui/react\";\nimport { CompositeAttachmentAdapter } from \"@assistant-ui/react\";\nimport {\n createAgentChatAdapter,\n type AgentChatSurfaceKind,\n} from \"./agent-chat-adapter.js\";\nimport {\n appendAgentChatContextToMessage,\n formatAgentChatContextItemsForPrompt,\n normalizeAgentChatContextItem,\n publishAgentChatContextItems,\n refreshAgentChatContext,\n type AgentChatContextItem,\n} from \"./agent-chat.js\";\nimport {\n useAgentDynamicSuggestionsResult,\n type AgentDynamicSuggestionsOption,\n} from \"./dynamic-suggestions.js\";\nimport type { ReasoningEffort } from \"../shared/reasoning-effort.js\";\nimport type {\n ChatThreadScope,\n ChatThreadSnapshot,\n} from \"./use-chat-threads.js\";\nimport { PROVIDER_ENV_VARS } from \"../agent/engine/provider-env-vars.js\";\nimport { getActiveRun } from \"./active-run-state.js\";\nimport {\n AgentAutoContinueSignal,\n type ContentPart,\n readSSEStreamRaw,\n} from \"./sse-event-processor.js\";\nimport { captureError } from \"./analytics.js\";\nimport {\n AssistantMessageListErrorBoundary,\n AssistantUiStaleIndexErrorBoundary,\n} from \"./assistant-ui-recovery.js\";\nimport { cn } from \"./utils.js\";\nimport { useNearBottomAutoscroll } from \"./conversation/index.js\";\nimport { TextAttachmentAdapter } from \"./composer/attachment-accept.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport {\n GuidedQuestionFlow,\n useGuidedQuestionFlow,\n} from \"./guided-questions.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport {\n TiptapComposer,\n type ComposerSubmitIntent,\n type TiptapComposerHandle,\n} from \"./composer/TiptapComposer.js\";\nimport { AgentComposerFrame } from \"./composer/AgentComposerFrame.js\";\nimport type {\n AgentComposerLayoutVariant,\n Reference,\n} from \"./composer/types.js\";\nimport { isPastedTextAttachmentName } from \"./composer/pasted-text.js\";\nimport { PastedTextChip } from \"./composer/PastedTextChip.js\";\nimport { ContextMeter } from \"./context-xray/ContextMeter.js\";\nimport {\n IconMessage,\n IconX,\n IconPlayerStop,\n IconChevronDown,\n IconTerminal,\n IconClock,\n IconAlertTriangle,\n IconRefresh,\n} from \"@tabler/icons-react\";\n// ─── chat/ module imports ─────────────────────────────────────────────────────\nimport {\n DownscalingImageAttachmentAdapter,\n BinaryDocumentAttachmentAdapter,\n MAX_ESTIMATED_BODY_BYTES,\n AGGRESSIVE_MAX_IMAGE_DIMENSION,\n AGGRESSIVE_JPEG_QUALITY,\n transcodeImageToDataURL,\n createAgentImageAttachments,\n serializeQueuedAttachments,\n estimateAttachmentBodyBytes,\n type QueuedAttachment,\n} from \"./chat/attachment-adapters.js\";\nimport { TextStreamingContext } from \"./chat/markdown-renderer.js\";\nimport {\n ChatRunningContext,\n ReconnectStreamMessage,\n} from \"./chat/tool-call-display.js\";\nimport {\n CheckpointContext,\n MessageActionsContext,\n UserMessage,\n AssistantMessage,\n SelectionAttachedPill,\n RunningActivityStatus,\n} from \"./chat/message-components.js\";\nimport {\n BuilderSetupCard,\n LoopLimitContinueCard,\n RunErrorRecoveryCard,\n PlanModeCallout,\n getLoopLimitMetadata,\n getRunErrorMetadata,\n getRequestModeMetadata,\n type LoopLimitInfo,\n type RunErrorInfo,\n} from \"./chat/run-recovery.js\";\nimport {\n repoHasAssistantMessage,\n getRepoMessages,\n getRepoMessage,\n shouldImportServerThreadData,\n} from \"./chat/repo-helpers.js\";\n\nexport {\n AssistantMessageListErrorBoundary,\n AssistantUiStaleIndexErrorBoundary,\n assistantUiRecoverableRenderErrorKind,\n isAssistantUiRecoverableRenderError,\n isAssistantUiStaleIndexError,\n} from \"./assistant-ui-recovery.js\";\n\nexport { displayableUserMessageText } from \"./chat/message-components.js\";\n\ntype AgentRequestMode = \"act\" | \"plan\";\nexport type AgentRecoveryAction = \"continue\" | \"retry\";\n\nfunction createUserMessageRunConfig(\n references?: Reference[],\n requestMode?: AgentRequestMode,\n recoveryAction?: AgentRecoveryAction,\n trackInRunsTray?: boolean,\n) {\n const custom: {\n references?: Reference[];\n requestMode?: AgentRequestMode;\n trackInRunsTray?: boolean;\n } = {};\n if (references && references.length > 0) {\n custom.references = references;\n }\n if (requestMode) {\n custom.requestMode = requestMode;\n }\n if (trackInRunsTray) {\n custom.trackInRunsTray = true;\n }\n const options: {\n runConfig?: { custom: typeof custom };\n metadata?: { custom: { agentNativeRecoveryAction: AgentRecoveryAction } };\n } = {};\n if (Object.keys(custom).length > 0) {\n options.runConfig = { custom };\n }\n if (recoveryAction) {\n options.metadata = {\n custom: { agentNativeRecoveryAction: recoveryAction },\n };\n }\n return options;\n}\n\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\nconst ACTIVE_RUN_CLEAR_TIMEOUT_MS = 5_000;\nconst ACTIVE_RUN_POLL_INTERVAL_MS = 150;\n\ntype ActiveRunLookup = {\n active?: boolean;\n runId?: string;\n threadId?: string;\n status?: string;\n heartbeatAt?: number | null;\n};\n\nfunction activeRunLooksStale(runInfo: ActiveRunLookup): boolean {\n const heartbeatAt =\n typeof runInfo.heartbeatAt === \"number\" ? runInfo.heartbeatAt : null;\n return (\n runInfo.status === \"running\" &&\n heartbeatAt != null &&\n Date.now() - heartbeatAt > 5000\n );\n}\n\nfunction cloneContentParts(content: ContentPart[]): ContentPart[] {\n return content.map((part) =>\n part.type === \"text\"\n ? { ...part }\n : {\n ...part,\n args: { ...part.args },\n ...(part.mcpApp ? { mcpApp: { ...part.mcpApp } } : {}),\n },\n );\n}\n\nfunction clearPendingSelection() {\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n {\n method: \"DELETE\",\n keepalive: true,\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"agent-panel:selection-cleared\"));\n }\n}\n\nasync function waitForThreadRunToClear(apiUrl: string, threadId?: string) {\n if (!threadId) return;\n const deadline = Date.now() + ACTIVE_RUN_CLEAR_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n try {\n const res = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (res.ok) {\n const info = await res.json();\n const heartbeatAt =\n typeof info?.heartbeatAt === \"number\" ? info.heartbeatAt : null;\n const stale =\n info?.status === \"running\" &&\n heartbeatAt != null &&\n Date.now() - heartbeatAt > 5000;\n if (!info?.active || info?.status !== \"running\" || stale) return;\n }\n } catch {\n // Transient poll failure — try again until the short grace period ends.\n }\n\n await new Promise((resolve) =>\n window.setTimeout(resolve, ACTIVE_RUN_POLL_INTERVAL_MS),\n );\n }\n}\n\nconst PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);\n\n// ─── Composer Attachment Preview ─────────────────────────────────────────────\n\nfunction getImageAttachmentSrc(attachment: Attachment): string | null {\n if (attachment.type !== \"image\") return null;\n\n // Prefer the hosted URL when the server already uploaded this attachment.\n const uploadUrl = (attachment as any).metadata?.uploadUrl as\n | string\n | undefined;\n if (uploadUrl) return uploadUrl;\n\n if (\"file\" in attachment && attachment.file) {\n return URL.createObjectURL(attachment.file);\n }\n\n const imagePart = attachment.content?.find((part) => part.type === \"image\");\n return imagePart && \"image\" in imagePart ? imagePart.image : null;\n}\n\nfunction ComposerAttachmentPreviewCard({\n attachment,\n onRemove,\n}: {\n attachment: Attachment;\n onRemove: (id: string) => void;\n}) {\n const [imageSrc, setImageSrc] = useState<string | null>(null);\n\n useEffect(() => {\n const nextSrc = getImageAttachmentSrc(attachment);\n setImageSrc(nextSrc);\n\n return () => {\n if (nextSrc?.startsWith(\"blob:\")) {\n URL.revokeObjectURL(nextSrc);\n }\n };\n }, [attachment]);\n\n if (isPastedTextAttachmentName(attachment.name)) {\n return <PastedTextChip attachment={attachment} onRemove={onRemove} />;\n }\n\n const isImage = !!imageSrc;\n\n return (\n <div\n className={cn(\n \"group relative overflow-hidden border border-border/70 bg-muted/50 text-foreground\",\n isImage\n ? \"h-20 w-20 rounded-xl shadow-[0_12px_30px_-18px_rgba(0,0,0,0.7)]\"\n : \"inline-flex max-w-[220px] items-center gap-2 rounded-lg px-2.5 py-2 text-xs\",\n )}\n >\n {isImage ? (\n <>\n <img\n src={imageSrc}\n alt={attachment.name}\n className=\"h-full w-full object-cover\"\n />\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent px-2 py-1.5\">\n <div className=\"truncate text-[10px] font-medium text-white/95\">\n {attachment.name}\n </div>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-background text-[10px] font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {attachment.name.split(\".\").pop() || \"file\"}\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium\">{attachment.name}</div>\n <div className=\"text-[11px] text-muted-foreground\">\n {attachment.contentType || attachment.type}\n </div>\n </div>\n </>\n )}\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n className={cn(\n \"absolute flex h-6 w-6 items-center justify-center rounded-full border border-border/60 bg-background/95 text-muted-foreground shadow-sm transition hover:text-foreground\",\n isImage\n ? \"right-1.5 top-1.5 opacity-100 md:opacity-0 md:group-hover:opacity-100\"\n : \"right-1.5 top-1.5\",\n )}\n aria-label={`Remove ${attachment.name}`}\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\nfunction ComposerAttachmentPreviewStrip() {\n const attachments = useComposer((state) => state.attachments);\n const aui = useAui();\n\n const handleRemove = useCallback(\n (id: string) => {\n void aui.composer().attachment({ id }).remove();\n },\n [aui],\n );\n\n if (attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2 px-2 pt-2\">\n {attachments.map((attachment) => (\n <ComposerAttachmentPreviewCard\n key={attachment.id}\n attachment={attachment}\n onRemove={handleRemove}\n />\n ))}\n </div>\n );\n}\n\nfunction getMessageText(message: unknown): string {\n const msg = (message as { message?: unknown })?.message ?? message;\n const content = (msg as { content?: unknown })?.content;\n if (Array.isArray(content)) {\n return content\n .filter((p: any) => p?.type === \"text\" && typeof p.text === \"string\")\n .map((p: any) => p.text)\n .join(\"\\n\")\n .trim();\n }\n return typeof content === \"string\" ? content.trim() : \"\";\n}\n\nfunction contentPartFollowKey(part: any): string {\n const type = typeof part?.type === \"string\" ? part.type : \"unknown\";\n if (type === \"text\") return `t:${String(part.text ?? \"\").length}`;\n if (type === \"tool-call\") {\n return [\n \"tool\",\n part.toolCallId ?? \"\",\n part.toolName ?? \"\",\n part.status?.type ?? \"\",\n String(part.argsText ?? \"\").length,\n String(part.result ?? \"\").length,\n part.mcpApp ? 1 : 0,\n ].join(\":\");\n }\n if (type === \"image\") return `image:${String(part.image ?? \"\").length}`;\n return `${type}:${String(part.text ?? part.result ?? \"\").length}`;\n}\n\nfunction contentFollowKey(content: unknown): string {\n if (typeof content === \"string\") return `t:${content.length}`;\n if (Array.isArray(content))\n return content.map(contentPartFollowKey).join(\"|\");\n return \"\";\n}\n\nfunction messageFollowKey(message: unknown): string {\n const msg = ((message as { message?: unknown })?.message ?? message) as {\n id?: unknown;\n role?: unknown;\n status?: { type?: unknown; reason?: unknown };\n content?: unknown;\n };\n return [\n String(msg?.id ?? \"\"),\n String(msg?.role ?? \"\"),\n String(msg?.status?.type ?? \"\"),\n String(msg?.status?.reason ?? \"\"),\n contentFollowKey(msg?.content),\n ].join(\",\");\n}\n\nfunction queuedMessageFollowKey(message: {\n id: string;\n text: string;\n images?: string[];\n attachments?: QueuedAttachment[];\n references?: Reference[];\n requestMode?: AgentRequestMode;\n recoveryAction?: AgentRecoveryAction;\n}): string {\n return [\n message.id,\n message.text.length,\n message.images?.length ?? 0,\n message.attachments?.length ?? 0,\n message.references?.length ?? 0,\n message.requestMode ?? \"\",\n message.recoveryAction ?? \"\",\n ].join(\":\");\n}\n\nfunction reconnectContentFollowKey(content: ContentPart[]): string {\n return content.map(contentPartFollowKey).join(\"|\");\n}\n\nconst RECOVERY_USER_MESSAGE_PREFIXES = [\n \"Continue from where you left off\",\n \"Continue from where you stopped\",\n \"Retry the previous request from a clean approach\",\n];\n\nfunction getRecoveryActionMetadata(\n message: unknown,\n): AgentRecoveryAction | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | { custom?: { agentNativeRecoveryAction?: unknown } }\n | undefined;\n const action = meta?.custom?.agentNativeRecoveryAction;\n return action === \"continue\" || action === \"retry\" ? action : null;\n}\n\nfunction isRecoveryUserMessage(message: unknown): boolean {\n if (getRecoveryActionMetadata(message)) return true;\n const text = getMessageText(message);\n return RECOVERY_USER_MESSAGE_PREFIXES.some((prefix) =>\n text.startsWith(prefix),\n );\n}\n\nexport function latestNonRecoveryUserMessageText(\n messages: readonly unknown[],\n): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i] as { role?: unknown };\n if (message?.role !== \"user\") continue;\n if (isRecoveryUserMessage(message)) continue;\n const text = getMessageText(message);\n if (text) return text;\n }\n return \"\";\n}\n\n// ─── Main Component ─────────────────────────────────────────────────────────\n\nexport interface AssistantChatHandle {\n /** Programmatically send a message into this chat */\n sendMessage(\n text: string,\n images?: string[],\n options?: { trackInRunsTray?: boolean },\n ): void;\n /** Programmatically prefill the composer without submitting. */\n prefillMessage(text: string): void;\n /** Add or replace keyed context for the next composer submission. */\n setComposerContextItem(item: AgentChatContextItem): void;\n /** Remove a keyed context item from the composer. */\n removeComposerContextItem(key: string): void;\n /** Clear all staged context items from the composer. */\n clearComposerContextItems(): void;\n /** Programmatically send a recovery prompt without replacing the original request. */\n sendRecoveryMessage(\n text: string,\n recoveryAction: AgentRecoveryAction,\n images?: string[],\n ): void;\n /** Queue a message to send after the current run finishes */\n queueMessage(text: string, images?: string[]): void;\n /** Whether the chat is currently running */\n isRunning(): boolean;\n /** Focus the composer input */\n focusComposer(): void;\n /** Export the currently visible client-side thread for operations like fork. */\n exportThreadSnapshot(): ChatThreadSnapshot | null;\n}\n\nexport interface AssistantChatAdapterContext {\n apiUrl: string;\n tabId?: string;\n threadId?: string;\n modelRef: { current: string | undefined };\n engineRef: { current: string | undefined };\n effortRef: { current: ReasoningEffort | undefined };\n execModeRef: { current: \"build\" | \"plan\" | undefined };\n browserTabId?: string;\n scopeRef: { current: ChatThreadScope | null | undefined };\n surface: AgentChatSurfaceKind;\n}\n\nexport interface AssistantChatProps {\n /** API endpoint URL. Default: \"/_agent-native/agent-chat\" */\n apiUrl?: string;\n /** Stable tab identifier passed to the adapter for event correlation */\n tabId?: string;\n /** Stable browser tab id used for tab-scoped app-state context. */\n browserTabId?: string;\n /** Thread ID for SQL-backed persistence. When set, messages are loaded from and saved to the server. */\n threadId?: string;\n /** Resource scope to include with chat requests for server-side context. */\n contextScope?: ChatThreadScope | null;\n /** Whether this chat owns the active visible composer context snapshot. */\n isActiveComposer?: boolean;\n /**\n * Identifies which surface hosts this chat. Defaults to \"app\", which keeps\n * dev filesystem/bash code-editing tools out of in-product sidebars.\n */\n agentChatSurface?: AgentChatSurfaceKind;\n /** Placeholder text for empty state */\n emptyStateText?: string;\n /** Suggestion prompts shown when no messages */\n suggestions?: string[];\n /** Context-aware suggestions merged with `suggestions`. Enabled by default. */\n dynamicSuggestions?: AgentDynamicSuggestionsOption;\n /** Optional content rendered in the empty state, above the suggestion buttons.\n * Used by MultiTabAssistantChat to surface \"previous chats for this design\"\n * when the current thread is empty but the scope has other threads. */\n emptyStateAddon?: React.ReactNode;\n /** Whether to show the header bar. Default: true */\n showHeader?: boolean;\n /** CSS class for the outer container */\n className?: string;\n /** Callback when user clicks \"Use CLI\" button */\n onSwitchToCli?: () => void;\n /** Callback when message count changes */\n onMessageCountChange?: (count: number) => void;\n /** Callback to save thread data to the server (provided by useChatThreads) */\n onSaveThread?: (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => void;\n /** Callback to generate a title from the first user message */\n onGenerateTitle?: (threadId: string, message: string) => void;\n /** Optional content rendered just above the composer input */\n composerSlot?: React.ReactNode;\n /** Class applied to the shared composer area for host-specific sizing/skin. */\n composerAreaClassName?: string;\n /** Placeholder for the shared composer in its normal idle state. */\n composerPlaceholder?: string;\n /** Visual density for the shared composer shell. */\n composerLayoutVariant?: AgentComposerLayoutVariant;\n /** Center the composer on a fresh empty chat instead of pinning it low. */\n centerComposerWhenEmpty?: boolean;\n /** Hide the default empty-state icon/text/suggestions for custom start screens. */\n emptyStateDisplay?: \"default\" | \"hidden\";\n /** Optional content rendered inside the composer toolbar after the attach button. */\n composerToolbarSlot?: React.ReactNode;\n /** Optional action rendered beside the voice/send controls. */\n composerExtraActionButton?: React.ReactNode;\n /** Disable the composer for capability-gated surfaces while still showing history. */\n composerDisabled?: boolean;\n /** Placeholder to show while the composer is disabled by the host surface. */\n composerDisabledPlaceholder?: string;\n /** When true, skip the restore skeleton (used for freshly created threads with no messages) */\n isNewThread?: boolean;\n /** Called when a slash command (e.g. /clear, /help) is executed */\n onSlashCommand?: (command: string) => void;\n /** Current execution mode (build/plan) */\n execMode?: \"build\" | \"plan\";\n /** Callback to change execution mode */\n onExecModeChange?: (mode: \"build\" | \"plan\") => void;\n /** Disable Plan mode while leaving Act mode available. */\n planModeDisabled?: boolean;\n /** Explanation shown next to the disabled Plan option. */\n planModeDisabledReason?: string;\n /** Selected model override for this conversation (undefined = use server default) */\n selectedModel?: string;\n /** Default model from server config (shown in picker when no override is set) */\n defaultModel?: string;\n /** Selected engine override for this conversation */\n selectedEngine?: string;\n /** Selected reasoning effort override for this conversation */\n selectedEffort?: ReasoningEffort;\n /** Available engine/model list for the model picker */\n availableModels?: Array<{\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n }>;\n /** Callback when user picks a model from the picker */\n onModelChange?: (model: string, engine: string) => void;\n /** Callback when user picks a reasoning effort from the picker */\n onEffortChange?: (effort: ReasoningEffort) => void;\n /** Callback when user clicks \"Fork Chat\" in the message actions menu */\n onForkChat?: () => void | boolean | Promise<void | boolean>;\n /** Override Builder/provider connect routing for embedded hosts. */\n onConnectProvider?: () => void;\n /**\n * Controls the shared composer + menu. Sidebar keeps the full menu by default;\n * hosts without the sidebar provider stack can use upload-only.\n */\n plusMenuMode?: \"full\" | \"upload-only\" | \"hidden\";\n /**\n * Enable framework provider/env status checks. Embedded hosts that provide\n * model/provider state through another transport can disable these probes.\n */\n providerStatusChecksEnabled?: boolean;\n /**\n * Advanced host override for non-HTTP transports. Defaults to the production\n * sidebar SSE adapter when omitted.\n */\n createAdapter?: (context: AssistantChatAdapterContext) => ChatModelAdapter;\n /**\n * Explicitly recreate an injected adapter when the host transport identity\n * changes. Omit for the production sidebar so parent rerenders do not reset\n * active chats.\n */\n adapterReloadKey?: unknown;\n /**\n * Advanced host override for thread replay. Defaults to SQL thread fetch when\n * `threadId` is set, or sessionStorage for legacy tab chats.\n */\n loadHistoryRepository?: () => Promise<ExportedMessageRepository | null>;\n /** Re-run `loadHistoryRepository` when the host's external transcript changes. */\n historyReloadKey?: string | number | null;\n /** Smooth the last assistant message while an external transcript is updating. */\n externalStreaming?: boolean;\n}\n\nexport const CHAT_STORAGE_PREFIX = \"agent-chat:\";\n\n/** Remove persisted chat for a given tabId (or \"default\"). */\nexport function clearChatStorage(tabId?: string) {\n try {\n sessionStorage.removeItem(`${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`);\n } catch {}\n}\n\n/**\n * Ensure all messages in a thread repository have required fields.\n * assistant-ui accesses `message.metadata.submittedFeedback` and\n * `lastMessage.status.type` without null-checking, so server-constructed\n * messages missing these fields crash.\n */\nfunction ensureMessageMetadata(repo: any): any {\n if (!repo?.messages || !Array.isArray(repo.messages)) return repo;\n for (const entry of repo.messages) {\n // Handle both wrapped ({ message: { ... } }) and flat ({ role, ... }) formats\n const msg = entry?.message ?? entry;\n if (!msg) continue;\n if (!msg.metadata) {\n msg.metadata = {};\n }\n if (msg.role === \"assistant\") {\n const statusType =\n msg.status && typeof msg.status === \"object\"\n ? (msg.status as { type?: unknown }).type\n : undefined;\n const isTerminal =\n statusType === \"complete\" || statusType === \"incomplete\";\n if (!isTerminal) {\n const runError =\n msg.metadata?.custom?.runError ?? msg.metadata?.runError;\n msg.status = runError\n ? { type: \"incomplete\", reason: \"error\" }\n : { type: \"complete\", reason: \"stop\" };\n }\n }\n }\n return repo;\n}\n\n// Re-export for backwards compatibility\nimport {\n extractThreadMeta,\n normalizeThreadRepository,\n} from \"../agent/thread-data-builder.js\";\nexport { extractThreadMeta };\n\n/**\n * Strip raw base64 payload from attachment content parts when a hosted URL\n * already exists in the same content entry. This keeps the periodic thread\n * save payload compact — the server already stored the URL reference when it\n * processed the POST, and re-shipping multi-megabyte base64 strings on every\n * 5-second poll save balloons the SQL thread_data column unnecessarily.\n *\n * Only strips the raw base64 data-URL string from `content[].image` / `content[].data`\n * when a `metadata.uploadUrl` reference is present on the same attachment object,\n * so the transcript can still render from the hosted URL after hydration.\n */\nfunction stripBase64FromRepo(repo: unknown): unknown {\n if (!repo || typeof repo !== \"object\") return repo;\n const r = repo as Record<string, unknown>;\n if (!Array.isArray(r.messages)) return repo;\n\n const messages = r.messages.map((entry: unknown) => {\n if (!entry || typeof entry !== \"object\") return entry;\n const e = entry as Record<string, unknown>;\n const msg = (e.message ?? e) as Record<string, unknown> | null;\n if (!msg || typeof msg !== \"object\") return entry;\n\n const attachments = msg.attachments;\n if (!Array.isArray(attachments)) return entry;\n\n const strippedAttachments = attachments.map((att: unknown) => {\n if (!att || typeof att !== \"object\") return att;\n const a = att as Record<string, unknown>;\n const meta = a.metadata as Record<string, unknown> | undefined;\n // Only strip when we have a hosted upload URL confirmed by the server.\n if (!meta?.uploadUrl) return att;\n\n if (!Array.isArray(a.content)) return att;\n const strippedContent = a.content.map((part: unknown) => {\n if (!part || typeof part !== \"object\") return part;\n const p = part as Record<string, unknown>;\n // Replace the raw base64 image data-URL with the hosted URL.\n if (\n p.type === \"image\" &&\n typeof p.image === \"string\" &&\n p.image.startsWith(\"data:\")\n ) {\n return { ...p, image: meta.uploadUrl };\n }\n // Replace the raw base64 file data with a stripped marker.\n if (\n p.type === \"file\" &&\n typeof p.data === \"string\" &&\n p.data.startsWith(\"data:\")\n ) {\n const { data: _d, ...rest } = p;\n return { ...rest, url: meta.uploadUrl };\n }\n return part;\n });\n return { ...a, content: strippedContent };\n });\n\n const strippedMsg = { ...msg, attachments: strippedAttachments };\n if (e.message !== undefined) {\n return { ...e, message: strippedMsg };\n }\n return strippedMsg;\n });\n\n return { ...r, messages };\n}\n\nconst AssistantChatInner = forwardRef<\n AssistantChatHandle,\n AssistantChatProps & { apiUrl: string }\n>(function AssistantChatInner(\n {\n emptyStateText,\n suggestions,\n dynamicSuggestions,\n emptyStateAddon,\n showHeader = true,\n onSwitchToCli,\n className,\n apiUrl,\n tabId,\n browserTabId,\n threadId,\n contextScope,\n isActiveComposer = true,\n onMessageCountChange,\n onSaveThread,\n onGenerateTitle,\n composerSlot,\n composerAreaClassName,\n composerPlaceholder,\n composerLayoutVariant = \"default\",\n centerComposerWhenEmpty = false,\n emptyStateDisplay = \"default\",\n composerToolbarSlot,\n composerExtraActionButton,\n composerDisabled = false,\n composerDisabledPlaceholder,\n isNewThread,\n onSlashCommand,\n execMode,\n onExecModeChange,\n planModeDisabled,\n planModeDisabledReason,\n selectedModel,\n defaultModel,\n selectedEffort,\n availableModels,\n onModelChange,\n onEffortChange,\n onForkChat,\n onConnectProvider,\n plusMenuMode = \"full\",\n providerStatusChecksEnabled = true,\n loadHistoryRepository,\n historyReloadKey,\n externalStreaming = false,\n },\n ref,\n) {\n const thread = useThread();\n const threadRuntime = useThreadRuntime();\n const composerRuntime = useComposerRuntime();\n const isRuntimeRunning = thread.isRunning;\n const messages = thread.messages;\n const { suggestions: resolvedSuggestions } = useAgentDynamicSuggestionsResult(\n {\n staticSuggestions: suggestions,\n dynamicSuggestions,\n browserTabId,\n scope: contextScope,\n enabled: messages.length === 0,\n },\n );\n const messageListResetKey = useMemo(\n () => messages.map((message) => message.id).join(\"|\"),\n [messages],\n );\n\n // Chat-wide drag-and-drop: users expect to drop a file anywhere on the agent\n // sidebar (thread, header, composer) and have it attach — same as ChatGPT,\n // Claude.ai, Linear, Slack, etc. Tiptap's own `handleDrop` only fires inside\n // the contenteditable; drops on the message thread or the composer\n // attachment strip otherwise navigate to the file (browser default), which\n // is why \"upload does nothing\" — the chat refreshes to the dropped image.\n const [dropActive, setDropActive] = useState(false);\n // Inline error shown just above the composer for attachment failures\n // (unsupported format, size cap, body-size rejection, drop errors).\n // Cleared on the next message send.\n const [composerError, setComposerError] = useState<string | null>(null);\n const dropDepthRef = useRef(0);\n const handleChatDragEnter = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n e.preventDefault();\n dropDepthRef.current += 1;\n setDropActive(true);\n }, []);\n const handleChatDragOver = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n }, []);\n const handleChatDragLeave = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n dropDepthRef.current = Math.max(0, dropDepthRef.current - 1);\n if (dropDepthRef.current === 0) setDropActive(false);\n }, []);\n const handleChatDropCapture = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n dropDepthRef.current = 0;\n setDropActive(false);\n }, []);\n const handleChatDrop = useCallback(\n (e: React.DragEvent) => {\n const files = Array.from(e.dataTransfer?.files ?? []);\n if (files.length === 0) return;\n dropDepthRef.current = 0;\n setDropActive(false);\n if (e.defaultPrevented) return;\n e.preventDefault();\n e.stopPropagation();\n // Mirror TiptapComposer's paste/drop name-uniqueness so consecutive\n // screenshots (all named `image.png`) don't collide on the\n // SimpleImageAttachmentAdapter id.\n const attachments = files.map((file) => {\n if (!file.type.startsWith(\"image/\")) return file;\n const uniqueName = `${Date.now()}-${Math.random().toString(36).slice(2)}-${file.name}`;\n return new File([file], uniqueName, { type: file.type });\n });\n void Promise.all(\n attachments.map((file) => composerRuntime.addAttachment(file)),\n ).catch((error) => {\n const msg =\n error instanceof Error\n ? error.message\n : \"Could not add the dropped file. Try a different format.\";\n setComposerError(msg);\n });\n },\n [composerRuntime, setComposerError],\n );\n\n // Patch the underlying assistant-ui MessageRepository so addOrUpdateMessage\n // can't throw \"Parent message not found\" mid-run. assistant-ui calls\n // `repository.clear()` from `runtime.import()` and from `resetHead(null)`,\n // and on a few async paths (history-adapter load, branch reset, repeat\n // imports) the repo can be cleared between the `append` that added the\n // user message and the `performRoundtrip` call that tries to record the\n // assistant placeholder against that user message's id. The internal-bug\n // throw turns into an unhandled rejection that Sentry captures from the\n // assets.agent-native.com prompt composer (AGENT-NATIVE-BROWSER-18). Fix\n // it by relinking to the current head whenever the requested parent has\n // gone missing instead of throwing.\n useEffect(() => {\n const repo = (threadRuntime as any)?.__internal_threadBinding?.getState?.()\n ?.repository as\n | { addOrUpdateMessage?: (parentId: any, message: any) => void }\n | undefined;\n if (!repo || typeof repo.addOrUpdateMessage !== \"function\") return;\n const patched = repo as any;\n if (patched.__agentNativePatched) return;\n patched.__agentNativePatched = true;\n const original = repo.addOrUpdateMessage.bind(repo);\n repo.addOrUpdateMessage = function (parentId: any, message: any) {\n try {\n return original(parentId, message);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (parentId && msg.includes(\"Parent message not found\")) {\n const fallbackParent = (this as any).head?.current?.id ?? null;\n if (fallbackParent && fallbackParent !== parentId) {\n return original(fallbackParent, message);\n }\n return original(null, message);\n }\n throw err;\n }\n };\n }, [threadRuntime]);\n const [missingApiKey, setMissingApiKey] = useState(false);\n const isComposerDisabled = missingApiKey || composerDisabled;\n // Increments each time the user clicks the (disabled) composer while no LLM\n // is connected — `BuilderSetupCard` watches this to replay a one-shot bounce.\n const [missingKeyBouncePulse, setMissingKeyBouncePulse] = useState(0);\n const [authError, setAuthError] = useState<{\n sessionExpired?: boolean;\n } | null>(null);\n const [authSessionAvailable, setAuthSessionAvailable] = useState(false);\n const [queuedMessages, setQueuedMessages] = useState<\n Array<{\n id: string;\n text: string;\n images?: string[];\n attachments?: QueuedAttachment[];\n references?: Reference[];\n requestMode?: AgentRequestMode;\n recoveryAction?: AgentRecoveryAction;\n trackInRunsTray?: boolean;\n }>\n >([]);\n const [composerContextItems, setComposerContextItems] = useState<\n AgentChatContextItem[]\n >([]);\n const composerContextItemsRef = useRef<AgentChatContextItem[]>([]);\n const isActiveComposerRef = useRef(isActiveComposer);\n isActiveComposerRef.current = isActiveComposer;\n const publishComposerContextItems = useCallback(\n (items: AgentChatContextItem[]) => {\n if (!isActiveComposerRef.current) return;\n publishAgentChatContextItems(items);\n },\n [],\n );\n const updateComposerContextItems = useCallback(\n (updater: (previous: AgentChatContextItem[]) => AgentChatContextItem[]) => {\n setComposerContextItems((previous) => {\n const next = updater(previous);\n composerContextItemsRef.current = next;\n publishComposerContextItems(next);\n return next;\n });\n },\n [publishComposerContextItems],\n );\n const stageComposerContextItem = useCallback(\n (rawItem: AgentChatContextItem) => {\n const item = normalizeAgentChatContextItem(rawItem);\n if (!item) return;\n updateComposerContextItems((previous) => {\n const index = previous.findIndex((current) => current.key === item.key);\n if (index === -1) return [...previous, item];\n return previous.map((current, currentIndex) =>\n currentIndex === index ? item : current,\n );\n });\n },\n [updateComposerContextItems],\n );\n const removeComposerContextItem = useCallback(\n (key: string) => {\n updateComposerContextItems((previous) =>\n previous.filter((item) => item.key !== key),\n );\n },\n [updateComposerContextItems],\n );\n const buildComposerContextSubmission = useCallback((text: string) => {\n const context = formatAgentChatContextItemsForPrompt(\n composerContextItemsRef.current,\n );\n if (!context) return { text, includesContext: false };\n return {\n text: appendAgentChatContextToMessage(text, context),\n includesContext: true,\n };\n }, []);\n\n useEffect(() => {\n if (!isActiveComposer) return;\n let cancelled = false;\n void refreshAgentChatContext().then((state) => {\n if (cancelled || !isActiveComposerRef.current) return;\n composerContextItemsRef.current = state.items;\n setComposerContextItems(state.items);\n });\n return () => {\n cancelled = true;\n };\n }, [isActiveComposer]);\n // Tracks the JSON of the last queue we successfully persisted so the\n // debounced save effect can skip no-op writes (e.g. restore-from-server\n // on mount, or queue state that hasn't actually changed).\n const lastPersistedQueueRef = useRef<string>(\"[]\");\n // Cheap change-guard for `importThreadData`. The real-time sync layer\n // refetches `/threads/:id` (or re-runs `loadHistoryRepository`) on poll /\n // change ticks, on reconnect, and whenever the host's transcript bumps\n // `historyReloadKey`. On a long thread the JSON.parse +\n // normalizeThreadRepository + threadRuntime.export()/import round-trip is\n // CPU-bound and triggers re-render churn even when the content is byte-for-\n // byte identical to what we last imported. We hash the raw incoming payload\n // and skip the whole pipeline when it hasn't advanced, returning the\n // already-imported repo so callers (e.g. the reconnect loop's\n // repoHasAssistantMessage check) see consistent data. Any real change — a\n // new message, an arriving tool result, the server replacing an optimistic\n // copy, or switching threads — produces a different signal and falls\n // through to a full import.\n const lastImportedSignatureRef = useRef<string | null>(null);\n const lastImportedRepoRef = useRef<any>(null);\n const [showContinue, setShowContinue] = useState(false);\n const [loopLimitInfo, setLoopLimitInfo] = useState<LoopLimitInfo | null>(\n null,\n );\n const [runErrorInfo, setRunErrorInfo] = useState<RunErrorInfo | null>(null);\n const [dismissedRunErrorKey, setDismissedRunErrorKey] = useState<\n string | null\n >(null);\n const userStoppedRunRef = useRef<{\n at: number;\n runId?: string;\n } | null>(null);\n const [isReconnecting, setIsReconnecting] = useState(false);\n // Last activity label emitted by agent-chat:activity events (tool name / step label).\n const [activityLabel, setActivityLabel] = useState<string | null>(null);\n // True during the 250ms continuation window and startup of the next chunk\n // (adapter's auto-continue delay before POSTing the next chunk).\n const [isAutoResuming, setIsAutoResuming] = useState(false);\n const [reconnectContent, setReconnectContent] = useState<ContentPart[]>([]);\n // When stop is clicked during reconnect, keep content visible (don't wipe it)\n const [reconnectFrozen, setReconnectFrozen] = useState(false);\n const reconnectRunIdRef = useRef<string | null>(null);\n const reconnectAbortRef = useRef<AbortController | null>(null);\n // Nuclear stop: user clicked stop. Clears the stop button/indicator AND\n // lets new submissions go through immediately — prevents the \"stuck\n // queueing forever\" state where isReconnecting or isRuntimeRunning gets\n // wedged (e.g. after a tab refresh + stop during reconnect).\n const [forceStopped, setForceStopped] = useState(false);\n // Real running state — drives submission/queue gating. Treat reconnecting\n // to an active run the same as running, UNLESS the user has explicitly\n // clicked stop (forceStopped).\n const isRunning = !forceStopped && (isRuntimeRunning || isReconnecting);\n const textStreaming = isRunning || externalStreaming;\n // UI-only running state — drives the stop button and thinking indicator.\n const showRunningInUI = isRunning;\n const wasRunningRef = useRef(false);\n const lastBroadcastRunningRef = useRef(isRunning);\n const tiptapRef = useRef<TiptapComposerHandle>(null);\n // Stable ref to the \"stop active run\" action so addToQueue can abort\n // a running turn without adding many unstable closure deps to its dep list.\n const stopActiveRunRef = useRef<() => void>(() => {});\n\n useEffect(() => {\n if (lastBroadcastRunningRef.current === isRunning) return;\n lastBroadcastRunningRef.current = isRunning;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning, tabId: tabId || threadId },\n }),\n );\n }, [isRunning, tabId, threadId]);\n\n // ─── Chat persistence ──────────────────────────────────────────────\n const hasRestoredRef = useRef(false);\n const [isRestoring, setIsRestoring] = useState(\n !!(threadId || loadHistoryRepository) && !isNewThread,\n );\n const onSaveThreadRef = useRef(onSaveThread);\n onSaveThreadRef.current = onSaveThread;\n const onGenerateTitleRef = useRef(onGenerateTitle);\n onGenerateTitleRef.current = onGenerateTitle;\n const titleGeneratedRef = useRef(false);\n\n const importThreadData = useCallback(\n (threadData: unknown, options?: { markTitleGenerated?: boolean }): any => {\n // Cheap-signal short-circuit: if the raw payload is identical to the\n // last one we imported, there is nothing new to parse, normalize, or\n // re-import into the runtime. Reuse the already-imported repo so callers\n // still get back a stable result without the CPU + re-render cost. We\n // still honor `markTitleGenerated` because a re-fetch carrying the same\n // content can legitimately confirm a title is settled.\n const signature =\n typeof threadData === \"string\"\n ? threadData\n : (() => {\n try {\n return JSON.stringify(threadData);\n } catch {\n return null;\n }\n })();\n if (\n signature !== null &&\n signature === lastImportedSignatureRef.current\n ) {\n if (options?.markTitleGenerated) {\n titleGeneratedRef.current = true;\n }\n return lastImportedRepoRef.current;\n }\n\n const repo = normalizeThreadRepository(\n typeof threadData === \"string\" ? JSON.parse(threadData) : threadData,\n );\n // Whether this payload settled into the runtime (either imported, or\n // had no messages to import). Only then is it safe to remember its\n // signature as the canonical \"last imported\" — a payload that\n // `shouldImportServerThreadData` deliberately rejected (e.g. it\n // regressed message count) must NOT be cached, so an identical re-fetch\n // re-evaluates against the runtime exactly as before instead of\n // short-circuiting to the rejected repo.\n let settled = true;\n if (repo?.messages?.length > 0) {\n let shouldImport = true;\n try {\n shouldImport = shouldImportServerThreadData(\n normalizeThreadRepository(threadRuntime.export()),\n repo,\n );\n } catch {\n shouldImport = true;\n }\n if (shouldImport) {\n if (options?.markTitleGenerated) {\n titleGeneratedRef.current = true;\n }\n threadRuntime.import(ensureMessageMetadata(repo));\n } else {\n settled = false;\n }\n }\n if (Array.isArray(repo?.queuedMessages)) {\n setQueuedMessages(repo.queuedMessages);\n lastPersistedQueueRef.current = JSON.stringify(repo.queuedMessages);\n }\n if (settled && signature !== null) {\n lastImportedSignatureRef.current = signature;\n lastImportedRepoRef.current = repo;\n }\n return repo;\n },\n [threadRuntime],\n );\n\n const refreshThreadFromServer = useCallback(async (): Promise<any | null> => {\n if (loadHistoryRepository) {\n try {\n const repo = await loadHistoryRepository();\n if (!repo) return null;\n return importThreadData(repo);\n } catch {\n return null;\n }\n }\n if (!threadId) return null;\n try {\n const refreshRes = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n );\n if (!refreshRes.ok) return null;\n const refreshData = await refreshRes.json();\n if (!refreshData.threadData) return null;\n return importThreadData(refreshData.threadData);\n } catch {\n return null;\n }\n }, [apiUrl, importThreadData, loadHistoryRepository, threadId]);\n\n const wasRecentlyStoppedRun = useCallback((runId?: string): boolean => {\n const stopped = userStoppedRunRef.current;\n return Boolean(\n stopped &&\n Date.now() - stopped.at < 10_000 &&\n (!stopped.runId || !runId || stopped.runId === runId),\n );\n }, []);\n\n const startReconnectToRun = useCallback(\n (runInfo: ActiveRunLookup): boolean => {\n if (!threadId || !runInfo.runId || runInfo.status !== \"running\") {\n return false;\n }\n const runId = String(runInfo.runId);\n if (wasRecentlyStoppedRun(runId)) return false;\n if (reconnectRunIdRef.current === runId) return true;\n\n reconnectRunIdRef.current = runId;\n setIsReconnecting(true);\n setReconnectFrozen(false);\n setReconnectContent([]);\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: true, tabId: tabId || threadId },\n }),\n );\n\n const abortCtrl = new AbortController();\n reconnectAbortRef.current = abortCtrl;\n\n const watchdog = setInterval(async () => {\n try {\n const res = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (!res.ok) {\n abortCtrl.abort();\n clearInterval(watchdog);\n return;\n }\n const info = (await res.json()) as ActiveRunLookup;\n if (info.status !== \"running\" || activeRunLooksStale(info)) {\n abortCtrl.abort();\n clearInterval(watchdog);\n }\n } catch {\n // Network blip — keep polling.\n }\n }, 1000);\n\n let reconnectTimedOut = false;\n const maxReconnectTimer = setTimeout(() => {\n reconnectTimedOut = true;\n abortCtrl.abort();\n clearInterval(watchdog);\n }, 20_000);\n\n const streamReconnect = async () => {\n let noProgressDuringReconnect = false;\n let latestContent: ContentPart[] = [];\n try {\n const sseRes = await fetch(\n `${apiUrl}/runs/${encodeURIComponent(runId)}/events?after=0`,\n { signal: abortCtrl.signal },\n );\n if (sseRes.ok && sseRes.body) {\n const content: ContentPart[] = [];\n latestContent = content;\n const toolCallCounter = { value: 0 };\n\n let rafPending = false;\n let latestSnapshot: ContentPart[] = [];\n const scheduleUpdate = (snapshot: ContentPart[]) => {\n latestSnapshot = snapshot;\n if (rafPending) return;\n rafPending = true;\n requestAnimationFrame(() => {\n rafPending = false;\n setReconnectContent(latestSnapshot);\n });\n };\n\n await readSSEStreamRaw(\n sseRes.body,\n content,\n toolCallCounter,\n tabId,\n scheduleUpdate,\n );\n setReconnectContent([...content]);\n }\n } catch (err) {\n if (\n err instanceof AgentAutoContinueSignal &&\n err.reason === \"no_progress\"\n ) {\n noProgressDuringReconnect = true;\n } else if (\n reconnectTimedOut &&\n err instanceof Error &&\n err.name === \"AbortError\"\n ) {\n noProgressDuringReconnect = true;\n }\n } finally {\n clearInterval(watchdog);\n clearTimeout(maxReconnectTimer);\n }\n\n if (noProgressDuringReconnect && reconnectRunIdRef.current === runId) {\n captureError(new Error(\"agent-chat:reconnect_no_progress\"), {\n tags: {\n context: \"agent-native-chat\",\n errorCode: \"reconnect_no_progress\",\n reconnectTimedOut: String(reconnectTimedOut),\n },\n extra: {\n runId,\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n contentLength: latestContent.length,\n },\n });\n try {\n await fetch(`${apiUrl}/runs/${encodeURIComponent(runId)}/abort`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reason: \"no_progress\" }),\n });\n } catch {\n // Best effort — the important part is unwinding the UI.\n }\n setReconnectContent([...latestContent]);\n setReconnectFrozen(latestContent.length > 0);\n setRunErrorInfo({\n message:\n \"The previous agent run stopped producing visible progress while reconnecting, so it was stopped before it could keep looping.\",\n errorCode: \"reconnect_no_progress\",\n recoverable: true,\n runId,\n });\n setDismissedRunErrorKey(null);\n reconnectAbortRef.current = null;\n setIsReconnecting(false);\n reconnectRunIdRef.current = null;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: false, tabId: tabId || threadId },\n }),\n );\n return;\n }\n\n setReconnectFrozen(true);\n let loaded = false;\n for (let attempt = 0; attempt < 10; attempt++) {\n await new Promise((r) => setTimeout(r, 500));\n if (reconnectRunIdRef.current !== runId) break;\n const repo = await refreshThreadFromServer();\n if (repoHasAssistantMessage(repo)) {\n setReconnectContent([]);\n setReconnectFrozen(false);\n loaded = true;\n break;\n }\n }\n\n if (reconnectRunIdRef.current === runId) {\n reconnectAbortRef.current = null;\n setIsReconnecting(false);\n reconnectRunIdRef.current = null;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: false, tabId: tabId || threadId },\n }),\n );\n }\n if (!loaded) {\n await refreshThreadFromServer();\n }\n };\n\n void streamReconnect();\n return true;\n },\n [apiUrl, refreshThreadFromServer, tabId, threadId, wasRecentlyStoppedRun],\n );\n\n const reconnectActiveRunForThread =\n useCallback(async (): Promise<boolean> => {\n if (!threadId) return false;\n try {\n const runRes = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (!runRes.ok) return false;\n const runInfo = (await runRes.json()) as ActiveRunLookup;\n if (\n !runInfo.active ||\n runInfo.status !== \"running\" ||\n activeRunLooksStale(runInfo)\n ) {\n await refreshThreadFromServer();\n return false;\n }\n return startReconnectToRun(runInfo);\n } catch {\n return false;\n }\n }, [apiUrl, refreshThreadFromServer, startReconnectToRun, threadId]);\n\n // Restore messages from server on mount (when threadId is set). The\n // server is the single source of truth — we don't hydrate from localStorage\n // first, so what the user sees in the chat panel always matches what the\n // history list (and the agent) sees on disk.\n useEffect(() => {\n if (hasRestoredRef.current) return;\n hasRestoredRef.current = true;\n\n if (loadHistoryRepository) {\n (async () => {\n try {\n const repo = await loadHistoryRepository();\n if (repo) {\n importThreadData(repo, { markTitleGenerated: true });\n }\n titleGeneratedRef.current = true;\n } catch {\n // Start fresh\n } finally {\n setIsRestoring(false);\n }\n })();\n } else if (threadId && isNewThread) {\n // Client-created empty tabs do not have a server row until the first\n // message is sent. Avoid probing /threads/:id on mount; that request\n // can only 404 and makes normal app startup look broken in DevTools.\n setIsRestoring(false);\n } else if (threadId) {\n (async () => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n );\n if (res.ok) {\n const data = await res.json();\n if (data.threadData) {\n importThreadData(data.threadData, { markTitleGenerated: true });\n }\n // Also skip title generation if thread already has a title\n if (data.title) {\n titleGeneratedRef.current = true;\n }\n }\n } catch {\n // Start fresh\n } finally {\n // Clear the skeleton as soon as the persisted messages are imported.\n // The active-run reconnect probe below must NOT gate first paint — it\n // only matters when a run is mid-flight (e.g. after a hot reload), and\n // it streams on top of the already-rendered messages.\n setIsRestoring(false);\n }\n // Reconnect to an in-progress run after the skeleton has cleared, so a\n // background `/runs/active` probe never delays showing the conversation.\n try {\n await reconnectActiveRunForThread();\n } catch {\n // No active run to reconnect to.\n }\n })();\n } else {\n // Legacy: restore from sessionStorage\n const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`;\n try {\n const saved = sessionStorage.getItem(storageKey);\n if (saved) {\n const repo = JSON.parse(saved);\n if (repo?.messages?.length > 0) {\n threadRuntime.import(ensureMessageMetadata(repo));\n }\n }\n } catch {}\n setIsRestoring(false);\n }\n }, [\n threadId,\n tabId,\n apiUrl,\n threadRuntime,\n importThreadData,\n reconnectActiveRunForThread,\n loadHistoryRepository,\n isNewThread,\n ]);\n\n useEffect(() => {\n if (\n !loadHistoryRepository ||\n !hasRestoredRef.current ||\n isRestoring ||\n isRunning\n ) {\n return;\n }\n let cancelled = false;\n void loadHistoryRepository()\n .then((repo) => {\n if (cancelled || !repo) return;\n importThreadData(repo, { markTitleGenerated: true });\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [\n historyReloadKey,\n importThreadData,\n isRestoring,\n isRunning,\n loadHistoryRepository,\n ]);\n\n // If assistant-ui stops the local runtime while the background server run is\n // still alive, immediately switch into the same reconnect path used after a\n // reload. Otherwise the composer unlocks, the next send hits a 409, and the\n // user sees \"still working\" even though the UI stopped updating.\n const prevRuntimeRunningForReconnectRef = useRef(isRuntimeRunning);\n useEffect(() => {\n const wasRuntimeRunning = prevRuntimeRunningForReconnectRef.current;\n prevRuntimeRunningForReconnectRef.current = isRuntimeRunning;\n if (\n !wasRuntimeRunning ||\n isRuntimeRunning ||\n !threadId ||\n forceStopped ||\n isReconnecting ||\n wasRecentlyStoppedRun()\n ) {\n return;\n }\n\n let cancelled = false;\n const timer = window.setTimeout(() => {\n if (!cancelled) {\n void reconnectActiveRunForThread();\n }\n }, 250);\n return () => {\n cancelled = true;\n window.clearTimeout(timer);\n };\n }, [\n forceStopped,\n isReconnecting,\n isRuntimeRunning,\n reconnectActiveRunForThread,\n threadId,\n wasRecentlyStoppedRun,\n ]);\n\n // Generate a title when the first user message is sent\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (titleGeneratedRef.current) return;\n if (messages.length === 0) return;\n\n const firstUserMsg = messages.find((m) => m.role === \"user\");\n if (!firstUserMsg) return;\n\n // Extract text from the first user message\n const text =\n \"content\" in firstUserMsg\n ? Array.isArray(firstUserMsg.content)\n ? firstUserMsg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\" \")\n : typeof firstUserMsg.content === \"string\"\n ? firstUserMsg.content\n : \"\"\n : \"\";\n\n if (!text.trim()) return;\n titleGeneratedRef.current = true;\n if (threadId) {\n onGenerateTitleRef.current?.(threadId, text.trim());\n }\n }, [messages, threadId]);\n\n // Periodically save thread data while the agent is running so refreshes\n // don't lose messages. Saves every 5 seconds while running.\n const savedTitleRef = useRef(\"\");\n const lastSaveTimeRef = useRef(0);\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (!isRunning) return;\n if (messages.length === 0) return;\n if (!threadId || !onSaveThreadRef.current) return;\n\n const now = Date.now();\n const timeSinceLastSave = now - lastSaveTimeRef.current;\n if (timeSinceLastSave < 5000) return;\n\n const repo = threadRuntime.export();\n const { title, preview } = extractThreadMeta(repo);\n\n lastSaveTimeRef.current = now;\n savedTitleRef.current = title;\n onSaveThreadRef.current(threadId, {\n threadData: JSON.stringify(stripBase64FromRepo(repo)),\n title,\n preview,\n messageCount: messages.length,\n });\n }, [messages, isRunning, threadId, threadRuntime]);\n\n // Persist full thread data after each completed response\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (isRunning) return;\n if (messages.length === 0) return;\n\n const repo = threadRuntime.export();\n\n if (threadId && onSaveThreadRef.current) {\n // Save to server via the hook callback\n const { title, preview } = extractThreadMeta(repo);\n savedTitleRef.current = title;\n onSaveThreadRef.current(threadId, {\n threadData: JSON.stringify(stripBase64FromRepo(repo)),\n title,\n preview,\n messageCount: messages.length,\n });\n } else {\n // Legacy: save to sessionStorage\n const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`;\n try {\n sessionStorage.setItem(storageKey, JSON.stringify(repo));\n } catch {}\n }\n }, [messages, isRunning, threadId, tabId, threadRuntime]);\n\n useEffect(() => {\n onMessageCountChange?.(messages.length);\n }, [messages.length, onMessageCountChange]);\n\n // Persist queued messages to the server so they survive reloads. Debounced\n // to 300ms so typing-and-queuing-rapidly doesn't hammer the endpoint.\n // Stores them in thread_data.queuedMessages via POST /threads/:id/queued.\n useEffect(() => {\n if (!threadId) return;\n if (!hasRestoredRef.current) return;\n const serialized = JSON.stringify(queuedMessages);\n if (serialized === lastPersistedQueueRef.current) return;\n const timer = setTimeout(() => {\n (async () => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/queued`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ queuedMessages }),\n },\n );\n if (res.ok) {\n lastPersistedQueueRef.current = serialized;\n }\n } catch {\n // Best-effort — next queue change will retry.\n }\n })();\n }, 300);\n return () => clearTimeout(timer);\n }, [queuedMessages, threadId, apiUrl]);\n\n // Listen for missing API key events from the adapter\n useEffect(() => {\n const handler = () => setMissingApiKey(true);\n window.addEventListener(\"agent-chat:missing-api-key\", handler);\n return () =>\n window.removeEventListener(\"agent-chat:missing-api-key\", handler);\n }, []);\n\n const handleBuilderConnected = useCallback(() => {\n setMissingApiKey(false);\n }, []);\n\n // Check on mount and whenever SettingsPanel dispatches\n // `agent-engine:configured-changed` so the gate flips live without reload.\n useEffect(() => {\n if (!providerStatusChecksEnabled) {\n setMissingApiKey(false);\n return;\n }\n let cancelled = false;\n const check = async () => {\n const [envKeys, builderStatus, engineStatus] = await Promise.all([\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/agent-engine/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ]);\n if (cancelled) return;\n // All three status endpoints failed — avoid flashing the gate on a\n // transient network error.\n if (envKeys == null && builderStatus == null && engineStatus == null) {\n return;\n }\n const keys = (envKeys ?? []) as Array<{\n key: string;\n configured: boolean;\n }>;\n const llmKeys = keys.filter((k) => PROVIDER_ENV_VAR_SET.has(k.key));\n const anyConfigured =\n llmKeys.some((k) => k.configured) ||\n builderStatus?.configured === true ||\n engineStatus?.configured === true;\n setMissingApiKey(!anyConfigured);\n };\n check();\n window.addEventListener(\"agent-engine:configured-changed\", check);\n return () => {\n cancelled = true;\n window.removeEventListener(\"agent-engine:configured-changed\", check);\n };\n }, [providerStatusChecksEnabled]);\n\n // Listen for auth error events from the adapter\n const checkAuthSession = useCallback(async () => {\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/auth/session\"), {\n cache: \"no-store\",\n });\n if (!res.ok) return false;\n const data = await res.json().catch(() => null);\n const hasSession = !!data && !data.error;\n setAuthSessionAvailable(hasSession);\n if (hasSession) {\n setAuthError(null);\n }\n return hasSession;\n } catch {\n return false;\n }\n }, []);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as\n | {\n reason?: string;\n tabId?: string;\n threadId?: string;\n }\n | undefined;\n const eventTabId =\n typeof detail?.tabId === \"string\" ? detail.tabId : null;\n const eventThreadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : null;\n if (\n (eventTabId || eventThreadId) &&\n eventTabId !== tabId &&\n eventThreadId !== threadId\n ) {\n return;\n }\n setAuthSessionAvailable(false);\n setAuthError({ sessionExpired: detail?.reason === \"session-expired\" });\n void checkAuthSession();\n };\n window.addEventListener(\"agent-chat:auth-error\", handler);\n return () => window.removeEventListener(\"agent-chat:auth-error\", handler);\n }, [checkAuthSession, tabId, threadId]);\n\n useEffect(() => {\n if (!authError) return;\n // Auto-recovery (`checkAuthSession`) runs immediately + at 250ms. If the\n // card is still showing 3 seconds later, recovery failed and the user\n // is about to hit \"Refresh chat\" — that's the \"Reload UI required\"\n // symptom we want signal on.\n const stuckCapture = window.setTimeout(() => {\n captureError(new Error(\"agent-chat:auth_error_card_stuck\"), {\n tags: {\n context: \"agent-native-chat\",\n errorCode: \"auth_error_card\",\n sessionAvailable: String(authSessionAvailable),\n sessionExpired: String(!!authError.sessionExpired),\n },\n extra: {\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n },\n });\n }, 3000);\n const handler = () => void checkAuthSession();\n const timer = window.setTimeout(handler, 250);\n window.addEventListener(\"focus\", handler);\n window.addEventListener(\"agent-engine:configured-changed\", handler);\n return () => {\n window.clearTimeout(stuckCapture);\n window.clearTimeout(timer);\n window.removeEventListener(\"focus\", handler);\n window.removeEventListener(\"agent-engine:configured-changed\", handler);\n };\n }, [authError, authSessionAvailable, checkAuthSession, tabId, threadId]);\n\n // Listen for loop-limit events from the adapter\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!tabId || detail?.tabId === tabId) {\n setLoopLimitInfo({\n ...(typeof detail?.maxIterations === \"number\"\n ? { maxIterations: detail.maxIterations }\n : {}),\n });\n setShowContinue(true);\n }\n };\n window.addEventListener(\"agent-chat:loop-limit\", handler);\n return () => window.removeEventListener(\"agent-chat:loop-limit\", handler);\n }, [tabId]);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as RunErrorInfo & {\n tabId?: string;\n };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n if (!detail?.message) return;\n const stopped = userStoppedRunRef.current;\n if (\n stopped &&\n Date.now() - stopped.at < 10_000 &&\n (!stopped.runId || !detail.runId || stopped.runId === detail.runId)\n ) {\n return;\n }\n setRunErrorInfo({\n message: detail.message,\n ...(detail.details ? { details: detail.details } : {}),\n ...(detail.errorCode ? { errorCode: detail.errorCode } : {}),\n ...(detail.runId ? { runId: detail.runId } : {}),\n ...(detail.recoverable ? { recoverable: detail.recoverable } : {}),\n });\n setDismissedRunErrorKey(null);\n };\n window.addEventListener(\"agent-chat:run-error\", handler);\n return () => window.removeEventListener(\"agent-chat:run-error\", handler);\n }, [tabId]);\n\n // Track the most recent activity label for the running indicator.\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as {\n label?: string;\n tool?: string;\n tabId?: string;\n };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n if (typeof detail?.label === \"string\" && detail.label.trim()) {\n setActivityLabel(detail.label.trim());\n setIsAutoResuming(false);\n }\n };\n window.addEventListener(\"agent-chat:activity\", handler);\n return () => window.removeEventListener(\"agent-chat:activity\", handler);\n }, [tabId]);\n\n // Clear the activity label when the server clears a corrective draft.\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as { tabId?: string };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n setActivityLabel(null);\n };\n window.addEventListener(\"agent-chat:activity-clear\", handler);\n return () =>\n window.removeEventListener(\"agent-chat:activity-clear\", handler);\n }, [tabId]);\n\n // Show \"Resuming…\" during the adapter's auto-continuation window (the\n // ~250ms gap between the end of one serverless chunk and the POST for the\n // next). The adapter dispatches `agent-chat:auto-continue` at that moment.\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as { tabId?: string };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n setIsAutoResuming(true);\n setActivityLabel(null);\n };\n window.addEventListener(\"agent-chat:auto-continue\", handler);\n return () =>\n window.removeEventListener(\"agent-chat:auto-continue\", handler);\n }, [tabId]);\n\n // Clear auto-resume / activity label when the run stops.\n useEffect(() => {\n if (!isRunning) {\n setIsAutoResuming(false);\n setActivityLabel(null);\n }\n }, [isRunning]);\n\n // Auto-dequeue: when agent finishes running, send the next queued message\n useEffect(() => {\n if (wasRunningRef.current && !isRunning && queuedMessages.length > 0) {\n const [next, ...rest] = queuedMessages;\n setQueuedMessages(rest);\n // Small delay to let the runtime settle after completion\n setTimeout(() => {\n void (async () => {\n // In serverless/cross-isolate deployments the client can receive the\n // terminal SSE event a beat before SQL has marked the previous run\n // complete. Starting the queued turn during that window can reconnect\n // to the old run and replay the old answer under the new prompt.\n await waitForThreadRunToClear(apiUrl, threadId);\n const imageAttachments = createAgentImageAttachments(next.images);\n const messageAttachments =\n next.attachments && next.attachments.length > 0\n ? next.attachments\n : (imageAttachments ?? []);\n threadRuntime.append({\n role: \"user\",\n content: [{ type: \"text\", text: next.text }],\n ...(messageAttachments.length > 0\n ? { attachments: messageAttachments }\n : {}),\n ...createUserMessageRunConfig(\n next.references,\n next.requestMode,\n next.recoveryAction,\n next.trackInRunsTray,\n ),\n } as Parameters<typeof threadRuntime.append>[0]);\n })();\n }, 100);\n }\n wasRunningRef.current = isRunning;\n }, [apiUrl, isRunning, queuedMessages, threadId, threadRuntime]);\n\n // Clear frozen reconnect content + forceStopped only on the false→true\n // transition of isRuntimeRunning (i.e. a NEW run is actually starting).\n // Reacting to \"isRuntimeRunning is currently true\" would clear the\n // nuclear-stop flag immediately after the user clicks stop, since\n // cancellation is async and isRuntimeRunning is still true at that moment.\n const prevIsRuntimeRunningRef = useRef(isRuntimeRunning);\n useEffect(() => {\n const wasRunning = prevIsRuntimeRunningRef.current;\n prevIsRuntimeRunningRef.current = isRuntimeRunning;\n if (isRuntimeRunning && !wasRunning) {\n if (reconnectFrozen) {\n setReconnectFrozen(false);\n setReconnectContent([]);\n }\n if (forceStopped) {\n setForceStopped(false);\n }\n }\n }, [isRuntimeRunning, reconnectFrozen, forceStopped]);\n\n // Same transition guard for isReconnecting: only clear forceStopped on\n // the false→true edge (a new reconnect starting on page load).\n const prevIsReconnectingRef = useRef(isReconnecting);\n useEffect(() => {\n const wasReconnecting = prevIsReconnectingRef.current;\n prevIsReconnectingRef.current = isReconnecting;\n if (isReconnecting && !wasReconnecting && forceStopped) {\n setForceStopped(false);\n }\n }, [isReconnecting, forceStopped]);\n\n const materializeFrozenReconnectContent = useCallback(() => {\n if (!reconnectFrozen || reconnectContent.length === 0) return;\n try {\n const repo = normalizeThreadRepository(threadRuntime.export());\n const messages = getRepoMessages(repo);\n const lastEntry = messages[messages.length - 1];\n const lastMessage = getRepoMessage(lastEntry);\n const parentId =\n typeof repo.headId === \"string\"\n ? repo.headId\n : typeof lastMessage?.id === \"string\"\n ? lastMessage.id\n : null;\n const runId = runErrorInfo?.runId ?? reconnectRunIdRef.current;\n const id = `reconnect-${runId ?? Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n repo.messages = [\n ...messages,\n {\n parentId,\n message: {\n id,\n role: \"assistant\",\n createdAt: new Date(),\n content: cloneContentParts(reconnectContent),\n status: { type: \"complete\", reason: \"stop\" },\n metadata: {\n custom: {\n reconnectFrozen: true,\n ...(runId ? { runId } : {}),\n },\n },\n },\n },\n ];\n repo.headId = id;\n\n threadRuntime.import(ensureMessageMetadata(repo));\n setReconnectFrozen(false);\n setReconnectContent([]);\n } catch (err) {\n captureError(err, {\n tags: {\n source: \"agent-chat-client\",\n phase: \"materialize-reconnect-content\",\n },\n extra: {\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n reconnectParts: reconnectContent.length,\n },\n });\n }\n }, [\n reconnectFrozen,\n reconnectContent,\n runErrorInfo?.runId,\n tabId,\n threadId,\n threadRuntime,\n ]);\n\n // Abort the active server run (identical to what the Stop button does) so\n // an immediate-while-running send can proceed cleanly without a 409 race.\n // Captured in a stable ref so addToQueue can call it without listing\n // all the stop-related state in its own dep array.\n const stopActiveRun = useCallback(() => {\n setForceStopped(true);\n const activeRun = getActiveRun();\n const runIdToAbort = reconnectRunIdRef.current ?? activeRun?.runId;\n userStoppedRunRef.current = {\n at: Date.now(),\n ...(runIdToAbort ? { runId: runIdToAbort } : {}),\n };\n setRunErrorInfo(null);\n setDismissedRunErrorKey(null);\n if (runIdToAbort) {\n fetch(`${apiUrl}/runs/${encodeURIComponent(runIdToAbort)}/abort`, {\n method: \"POST\",\n }).catch(() => {});\n }\n if (isReconnecting) {\n reconnectAbortRef.current?.abort();\n reconnectAbortRef.current = null;\n reconnectRunIdRef.current = null;\n setIsReconnecting(false);\n setReconnectFrozen(reconnectContent.length > 0);\n }\n threadRuntime.cancelRun();\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: false, tabId: tabId || threadId },\n }),\n );\n }\n }, [\n apiUrl,\n isReconnecting,\n reconnectContent.length,\n tabId,\n threadId,\n threadRuntime,\n ]);\n // Keep the ref current so addToQueue can call it without a stale closure.\n stopActiveRunRef.current = stopActiveRun;\n\n const addToQueue = useCallback(\n async (\n text: string,\n images?: string[],\n references?: Reference[],\n attachments?: ReadonlyArray<unknown>,\n requestMode?: AgentRequestMode,\n intent: ComposerSubmitIntent = \"queued\",\n recoveryAction?: AgentRecoveryAction,\n includeComposerContext = false,\n trackInRunsTray = false,\n ) => {\n materializeFrozenReconnectContent();\n setShowContinue(false);\n setLoopLimitInfo(null);\n setRunErrorInfo(null);\n setDismissedRunErrorKey(null);\n setComposerError(null);\n userStoppedRunRef.current = null;\n // Selection context attached via Cmd+I is one-shot — clear it as soon\n // as the user actually sends a message so it can't be re-used.\n clearPendingSelection();\n // Sending a message is an explicit user action — always anchor to the\n // bottom so the new message and any reply land in view, even if the\n // user had scrolled up to read history. The sticky-bottom override\n // exists to stop streaming from yanking the viewport, not to swallow\n // direct sends.\n markNearBottom();\n const submitted = includeComposerContext\n ? buildComposerContextSubmission(text)\n : { text, includesContext: false };\n const submittedText = submitted.text;\n let queuedAttachments: Awaited<\n ReturnType<typeof serializeQueuedAttachments>\n >;\n try {\n queuedAttachments = await serializeQueuedAttachments(attachments);\n } catch (err) {\n const msg =\n err instanceof Error\n ? err.message\n : \"Attachment could not be processed.\";\n setComposerError(msg);\n return;\n }\n const imageAttachments = createAgentImageAttachments(images);\n const allAttachments = [\n ...(queuedAttachments ?? []),\n ...(imageAttachments ?? []),\n ];\n\n // ── Body-size guard (Fix 3) ─────────────────────────────────────\n // Estimate the total serialized attachment payload. If it exceeds the\n // Vercel/Netlify body limit, progressively re-compress images until\n // the payload fits, then reject the largest remaining file if still over.\n let messageAttachments = allAttachments;\n {\n const allDataUrls = allAttachments.flatMap((a) =>\n a.content\n .filter(\n (c): c is { type: \"image\"; image: string } => c.type === \"image\",\n )\n .map((c) => c.image),\n );\n if (\n estimateAttachmentBodyBytes(allDataUrls) > MAX_ESTIMATED_BODY_BYTES\n ) {\n // Re-compress image attachments more aggressively.\n const recompressed: typeof allAttachments = [];\n let stillOver = false;\n for (const att of allAttachments) {\n if (\n att.type === \"image\" &&\n att.content.length === 1 &&\n att.content[0].type === \"image\"\n ) {\n // Find the original File from the queued attachments input.\n const rawAtt = (attachments ?? []).find(\n (r) => (r as any).id === att.id,\n ) as { file?: File } | undefined;\n const rawFile = rawAtt?.file;\n if (rawFile && typeof document !== \"undefined\") {\n try {\n const recompressedUrl = await transcodeImageToDataURL(\n rawFile,\n {\n maxDimension: AGGRESSIVE_MAX_IMAGE_DIMENSION,\n jpegQuality: AGGRESSIVE_JPEG_QUALITY,\n },\n );\n recompressed.push({\n ...att,\n content: [{ type: \"image\", image: recompressedUrl }],\n });\n continue;\n } catch {\n // Could not recompress — keep original and flag overflow\n stillOver = true;\n }\n } else {\n stillOver = true;\n }\n }\n recompressed.push(att);\n }\n // Re-estimate after recompression.\n const recompressedUrls = recompressed.flatMap((a) =>\n a.content\n .filter(\n (c): c is { type: \"image\"; image: string } =>\n c.type === \"image\",\n )\n .map((c) => c.image),\n );\n if (\n stillOver ||\n estimateAttachmentBodyBytes(recompressedUrls) >\n MAX_ESTIMATED_BODY_BYTES\n ) {\n // Find the largest attachment and reject it.\n let largestIdx = -1;\n let largestSize = 0;\n for (let i = 0; i < recompressed.length; i++) {\n const url =\n recompressed[i].content.find(\n (c): c is { type: \"image\"; image: string } =>\n c.type === \"image\",\n )?.image ?? \"\";\n if (url.length > largestSize) {\n largestSize = url.length;\n largestIdx = i;\n }\n }\n if (largestIdx >= 0) {\n const rejected = recompressed[largestIdx];\n setComposerError(\n `\"${rejected.name}\" makes the message too large to send (combined attachments must be under ${Math.round(MAX_ESTIMATED_BODY_BYTES / 1024 / 1024)} MB). Remove it or use a smaller image.`,\n );\n return;\n }\n }\n messageAttachments = recompressed;\n }\n }\n // ── End body-size guard ──────────────────────────────────────────\n // Snapshot the exec mode at enqueue time when the caller didn't\n // pass an explicit override. Without this, a plan-mode message that\n // sits in the queue runs as 'act' if the user flips the global toggle\n // before the queue flushes — turning a read-only message into a write.\n const effectiveRequestMode: AgentRequestMode | undefined =\n requestMode ??\n (execMode === \"plan\"\n ? \"plan\"\n : execMode === \"build\"\n ? \"act\"\n : undefined);\n if (isRunning && intent === \"immediate\") {\n // Mid-run Enter race fix: immediately abort the active server run,\n // wait for it to clear, then send — mirroring what the auto-dequeue\n // path already does safely. Without this, assistant-ui's append()\n // would cancel the adapter run locally but the server run would keep\n // going; the new POST would then 409, reconnect to the OLD run, and\n // replay the old answer under the new prompt.\n setQueuedMessages((prev) => [\n ...prev,\n {\n id:\n typeof crypto !== \"undefined\" && crypto.randomUUID\n ? crypto.randomUUID()\n : `q-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n text: submittedText,\n images,\n attachments:\n messageAttachments.length > 0 ? messageAttachments : undefined,\n references,\n requestMode: effectiveRequestMode,\n recoveryAction,\n trackInRunsTray,\n },\n ]);\n // Abort the server run (same as Stop button). This flips forceStopped\n // → isRunning=false → auto-dequeue fires → waitForThreadRunToClear →\n // append. The abort is fire-and-forget; waitForThreadRunToClear does\n // the actual wait.\n stopActiveRunRef.current();\n } else if (isRunning && intent === \"queued\") {\n setQueuedMessages((prev) => [\n ...prev,\n {\n id:\n typeof crypto !== \"undefined\" && crypto.randomUUID\n ? crypto.randomUUID()\n : `q-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n text: submittedText,\n images,\n attachments:\n messageAttachments.length > 0 ? messageAttachments : undefined,\n references,\n requestMode: effectiveRequestMode,\n recoveryAction,\n trackInRunsTray,\n },\n ]);\n } else {\n threadRuntime.append({\n role: \"user\",\n content: [{ type: \"text\", text: submittedText }],\n ...(messageAttachments.length > 0\n ? { attachments: messageAttachments }\n : {}),\n ...createUserMessageRunConfig(\n references,\n effectiveRequestMode,\n recoveryAction,\n trackInRunsTray,\n ),\n } as Parameters<typeof threadRuntime.append>[0]);\n }\n if (submitted.includesContext) {\n updateComposerContextItems(() => []);\n }\n },\n [\n buildComposerContextSubmission,\n execMode,\n isRunning,\n materializeFrozenReconnectContent,\n threadRuntime,\n updateComposerContextItems,\n ],\n );\n\n // Expose imperative handle\n useImperativeHandle(\n ref,\n () => ({\n sendMessage(\n text: string,\n images?: string[],\n options?: { trackInRunsTray?: boolean },\n ) {\n addToQueue(\n text,\n images,\n undefined,\n undefined,\n undefined,\n \"queued\",\n undefined,\n false,\n options?.trackInRunsTray === true,\n );\n },\n prefillMessage(text: string) {\n tiptapRef.current?.setText(text);\n tiptapRef.current?.focus();\n },\n setComposerContextItem(item: AgentChatContextItem) {\n stageComposerContextItem(item);\n tiptapRef.current?.focus();\n },\n removeComposerContextItem(key: string) {\n removeComposerContextItem(key);\n },\n clearComposerContextItems() {\n updateComposerContextItems(() => []);\n },\n sendRecoveryMessage(\n text: string,\n recoveryAction: AgentRecoveryAction,\n images?: string[],\n ) {\n addToQueue(\n text,\n images,\n undefined,\n undefined,\n undefined,\n \"queued\",\n recoveryAction,\n );\n },\n queueMessage(text: string, images?: string[]) {\n addToQueue(text, images);\n },\n isRunning() {\n return thread.isRunning;\n },\n focusComposer() {\n tiptapRef.current?.focus();\n },\n exportThreadSnapshot() {\n if (messages.length === 0) return null;\n const repo = threadRuntime.export();\n const { title, preview } = extractThreadMeta(repo);\n return {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n };\n },\n }),\n [\n addToQueue,\n messages.length,\n stageComposerContextItem,\n thread.isRunning,\n threadRuntime,\n ],\n );\n\n const autoscrollFollowKey = useMemo(\n () =>\n [\n messages.map(messageFollowKey).join(\";\"),\n `q:${queuedMessages.map(queuedMessageFollowKey).join(\"|\")}`,\n `r:${reconnectContentFollowKey(reconnectContent)}`,\n ].join(\";;\"),\n [messages, queuedMessages, reconnectContent],\n );\n\n const {\n scrollRef,\n isNearBottomRef,\n showScrollToBottom,\n markNearBottom,\n scrollToBottom,\n scrollToBottomAfterPaint,\n } = useNearBottomAutoscroll<HTMLDivElement>({\n followKey: autoscrollFollowKey,\n streaming: textStreaming,\n });\n\n const scrollToBottomWhileLayoutSettles = useCallback(() => {\n scrollToBottomAfterPaint();\n const el = scrollRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return undefined;\n\n let stopped = false;\n const observer = new ResizeObserver(() => {\n if (!stopped && isNearBottomRef.current) scrollToBottom();\n });\n observer.observe(el);\n const timeout = window.setTimeout(() => {\n stopped = true;\n observer.disconnect();\n if (isNearBottomRef.current) scrollToBottom();\n }, 1600);\n\n return () => {\n stopped = true;\n window.clearTimeout(timeout);\n observer.disconnect();\n };\n }, [isNearBottomRef, scrollToBottom, scrollToBottomAfterPaint]);\n\n // Scroll to bottom when a restored thread finishes loading\n const wasRestoringRef = useRef(isRestoring);\n useEffect(() => {\n const wasRestoring = wasRestoringRef.current;\n wasRestoringRef.current = isRestoring;\n if (wasRestoring && !isRestoring) {\n return scrollToBottomWhileLayoutSettles();\n }\n }, [isRestoring, scrollToBottomWhileLayoutSettles]);\n\n useEffect(() => {\n if (!textStreaming && isNearBottomRef.current) {\n scrollToBottomAfterPaint();\n }\n }, [textStreaming, scrollToBottomAfterPaint]);\n\n const { isDevMode: cpDevMode } = useDevMode(apiUrl);\n const checkpointCtx = useMemo(\n () => ({ apiUrl, devMode: cpDevMode, threadId }),\n [apiUrl, cpDevMode, threadId],\n );\n const messageActionsCtx = useMemo(() => ({ onForkChat }), [onForkChat]);\n const lastMessageLoopLimit = useMemo(() => {\n const last = messages[messages.length - 1];\n if (!last || last.role !== \"assistant\") return null;\n return getLoopLimitMetadata(last);\n }, [messages]);\n const lastMessageRunError = useMemo(() => {\n const last = messages[messages.length - 1];\n if (!last || last.role !== \"assistant\") return null;\n return getRunErrorMetadata(last);\n }, [messages]);\n const lastUserText = useMemo(\n () => latestNonRecoveryUserMessageText(messages),\n [messages],\n );\n const latestMessage = messages[messages.length - 1];\n const latestMessageRole = latestMessage?.role;\n const latestAssistantWasPlan =\n latestMessageRole === \"assistant\" &&\n getRequestModeMetadata(latestMessage) === \"plan\";\n const showPlanModeCallout =\n execMode === \"plan\" &&\n !planModeDisabled &&\n !isComposerDisabled &&\n !showRunningInUI;\n const canImplementPlan = showPlanModeCallout && latestAssistantWasPlan;\n const contextXRayEnabled = Boolean(\n threadId &&\n (messages.length > 0 || isReconnecting || reconnectContent.length > 0),\n );\n const handleImplementPlan = useCallback(() => {\n onExecModeChange?.(\"build\");\n void addToQueue(\n \"Implement the plan.\",\n undefined,\n undefined,\n undefined,\n \"act\",\n );\n }, [addToQueue, onExecModeChange]);\n const handleSwitchToAct = useCallback(() => {\n onExecModeChange?.(\"build\");\n }, [onExecModeChange]);\n const visibleLoopLimit = showContinue\n ? (loopLimitInfo ?? lastMessageLoopLimit ?? {})\n : lastMessageLoopLimit;\n const visibleRunError = runErrorInfo ?? lastMessageRunError;\n const visibleRunErrorKey = visibleRunError\n ? `${visibleRunError.runId ?? \"\"}:${visibleRunError.errorCode ?? \"\"}:${visibleRunError.message}`\n : null;\n const shouldShowRunError =\n !!visibleRunError &&\n !showRunningInUI &&\n visibleRunErrorKey !== dismissedRunErrorKey &&\n !(\n userStoppedRunRef.current &&\n Date.now() - userStoppedRunRef.current.at < 10_000 &&\n (!userStoppedRunRef.current.runId ||\n !visibleRunError.runId ||\n userStoppedRunRef.current.runId === visibleRunError.runId)\n );\n const isFreshEmptyChat =\n messages.length === 0 &&\n !isRestoring &&\n !isReconnecting &&\n !authError &&\n !missingApiKey;\n const centeredEmptyState = centerComposerWhenEmpty && isFreshEmptyChat;\n\n // Clarifying-question surface: the `ask-question` action writes a\n // GuidedQuestionPayload to application_state under \"guided-questions\". The\n // hook polls that key, and on submit/skip composes the answer as a normal\n // user turn (via the shared sendToAgentChat) and clears the persisted key so\n // the question does not reappear.\n const {\n questions: guidedQuestions,\n title: guidedQuestionsTitle,\n description: guidedQuestionsDescription,\n skipLabel: guidedQuestionsSkipLabel,\n submitLabel: guidedQuestionsSubmitLabel,\n handleSubmit: handleGuidedQuestionsSubmit,\n handleSkip: handleGuidedQuestionsSkip,\n } = useGuidedQuestionFlow({\n stateKey: \"guided-questions\",\n queryKey: [\"guided-questions\"],\n ...(browserTabId ? { browserTabId } : {}),\n });\n\n return (\n <CheckpointContext.Provider value={checkpointCtx}>\n <MessageActionsContext.Provider value={messageActionsCtx}>\n <ChatRunningContext.Provider value={isRunning}>\n <TextStreamingContext.Provider value={textStreaming}>\n <div\n data-agent-empty-state={\n centeredEmptyState ? \"centered\" : undefined\n }\n className={cn(\n \"relative flex flex-1 flex-col h-full min-h-0 text-foreground\",\n className,\n )}\n onDragEnter={handleChatDragEnter}\n onDragOver={handleChatDragOver}\n onDragLeave={handleChatDragLeave}\n onDropCapture={handleChatDropCapture}\n onDrop={handleChatDrop}\n >\n {dropActive && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-50 flex items-center justify-center rounded-md border-2 border-dashed border-primary/70 bg-primary/5 backdrop-blur-[1px]\"\n >\n <span className=\"rounded-md bg-background/90 px-3 py-1.5 text-xs font-medium text-foreground shadow-sm\">\n Drop to attach\n </span>\n </div>\n )}\n {showHeader && (\n <div className=\"flex h-11 shrink-0 items-center justify-between border-b border-border px-4\">\n <span className=\"text-[13px] font-medium text-muted-foreground\">\n Agent\n </span>\n <div className=\"flex items-center gap-1\">\n {onSwitchToCli && (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={onSwitchToCli}\n aria-label=\"Switch to CLI\"\n className=\"flex items-center gap-1 text-[12px] text-muted-foreground hover:text-foreground px-2 py-1 rounded-md hover:bg-accent\"\n >\n <IconTerminal className=\"h-3.5 w-3.5\" />\n CLI\n </button>\n </TooltipTrigger>\n <TooltipContent>Switch to CLI</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </div>\n )}\n\n {/* Messages area */}\n <div\n ref={scrollRef}\n className=\"agent-chat-scroll flex-1 overflow-y-auto overflow-x-hidden min-h-0\"\n >\n {authError ? (\n <div className=\"flex flex-col items-center justify-center h-full px-4 gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n {authSessionAvailable ? (\n <IconRefresh className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <IconMessage className=\"h-5 w-5 text-muted-foreground\" />\n )}\n </div>\n <div className=\"text-center max-w-[280px]\">\n <p className=\"text-sm font-medium text-foreground mb-1\">\n {authSessionAvailable\n ? \"Chat session needs refresh\"\n : authError.sessionExpired\n ? \"Session expired\"\n : \"Authentication required\"}\n </p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n {authSessionAvailable\n ? \"You're signed in, but this chat connection needs to reconnect.\"\n : authError.sessionExpired\n ? \"Your session may have expired. Log out and log back in to reconnect.\"\n : \"You need to log in to use the agent.\"}\n </p>\n </div>\n <div className=\"flex gap-2\">\n {!authError.sessionExpired && !authSessionAvailable && (\n <button\n onClick={() => {\n const ret =\n window.location.pathname + window.location.search;\n window.location.href =\n agentNativePath(\"/_agent-native/sign-in\") +\n `?return=${encodeURIComponent(ret)}`;\n }}\n className=\"text-xs text-background bg-foreground hover:opacity-90 px-3 py-1.5 rounded-md\"\n >\n Log in\n </button>\n )}\n {authError.sessionExpired && !authSessionAvailable && (\n <button\n onClick={async () => {\n try {\n await fetch(\n agentNativePath(\"/_agent-native/auth/logout\"),\n {\n method: \"POST\",\n },\n );\n } catch {}\n window.location.reload();\n }}\n className=\"text-xs text-destructive hover:text-destructive/80 px-3 py-1.5 rounded-md border border-destructive/30 hover:bg-destructive/10\"\n >\n Log out\n </button>\n )}\n <button\n onClick={() => {\n setAuthError(null);\n window.location.reload();\n }}\n className={\n authSessionAvailable\n ? \"text-xs text-background bg-foreground hover:opacity-90 px-3 py-1.5 rounded-md\"\n : \"text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md border border-border hover:bg-accent\"\n }\n >\n Refresh chat\n </button>\n </div>\n </div>\n ) : missingApiKey && messages.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full px-2\">\n <BuilderSetupCard\n onConnected={handleBuilderConnected}\n bouncePulse={missingKeyBouncePulse}\n />\n </div>\n ) : isRestoring ? (\n <div className=\"flex flex-col gap-3 p-4\">\n <div className=\"flex justify-end\">\n <div className=\"h-8 w-32 rounded-lg bg-muted animate-pulse\" />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"h-4 w-48 rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-64 rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-40 rounded bg-muted animate-pulse\" />\n </div>\n </div>\n ) : messages.length === 0 && !isReconnecting ? (\n <div\n className={cn(\n \"agent-empty-state\",\n emptyStateDisplay === \"hidden\"\n ? \"sr-only\"\n : \"flex h-full flex-col items-center justify-center gap-4 px-4 py-16\",\n )}\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n <IconMessage className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"sr-only\">\n {emptyStateText ?? \"How can I help you?\"}\n </p>\n {emptyStateAddon}\n {resolvedSuggestions && resolvedSuggestions.length > 0 ? (\n <div className=\"flex flex-col gap-1.5 w-full max-w-[280px]\">\n {resolvedSuggestions.map((suggestion) => (\n <button\n key={suggestion}\n onClick={() => {\n threadRuntime.append({\n role: \"user\",\n content: [{ type: \"text\", text: suggestion }],\n });\n }}\n className=\"w-full rounded-lg border border-border px-3 py-2 text-left text-[13px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ) : (\n <div className=\"agent-thread-content flex flex-col gap-4 px-4 py-4\">\n <AssistantMessageListErrorBoundary\n resetKey={messageListResetKey}\n >\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n AssistantMessage,\n }}\n />\n </AssistantMessageListErrorBoundary>\n {missingApiKey && (\n <BuilderSetupCard\n onConnected={handleBuilderConnected}\n bouncePulse={missingKeyBouncePulse}\n />\n )}\n {visibleLoopLimit && !showRunningInUI && (\n <LoopLimitContinueCard\n info={visibleLoopLimit}\n onContinue={() => {\n setShowContinue(false);\n setLoopLimitInfo(null);\n addToQueue(\n \"Continue from where you left off.\",\n undefined,\n undefined,\n undefined,\n undefined,\n \"queued\",\n \"continue\",\n );\n }}\n />\n )}\n {shouldShowRunError && visibleRunError && (\n <RunErrorRecoveryCard\n info={visibleRunError}\n onContinue={() => {\n setRunErrorInfo(null);\n addToQueue(\n \"Continue from where you stopped. Use the partial work above, verify what succeeded, and finish the original request. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. Prefer dedicated app actions over raw database edits when they exist.\",\n undefined,\n undefined,\n undefined,\n undefined,\n \"queued\",\n \"continue\",\n );\n }}\n onRetry={() => {\n setRunErrorInfo(null);\n addToQueue(\n lastUserText\n ? `Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.\\n\\nOriginal request:\\n\\n${lastUserText}`\n : \"Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.\",\n undefined,\n undefined,\n undefined,\n undefined,\n \"queued\",\n \"retry\",\n );\n }}\n onFork={onForkChat}\n onDismiss={() => {\n if (visibleRunErrorKey) {\n setDismissedRunErrorKey(visibleRunErrorKey);\n }\n setRunErrorInfo(null);\n }}\n />\n )}\n {(isReconnecting || reconnectFrozen) &&\n reconnectContent.length > 0 && (\n <ReconnectStreamMessage content={reconnectContent} />\n )}\n {queuedMessages.map((msg) => {\n const displayText = msg.text\n .replace(/<context>[\\s\\S]*?<\\/context>\\n?/g, \"\")\n .trim();\n return (\n <div key={msg.id} className=\"flex justify-end group\">\n <div className=\"relative max-w-[85%] rounded-lg bg-accent/50 text-foreground/60 px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words\">\n <div className=\"flex items-center gap-1.5 text-[10px] text-muted-foreground mb-1 font-medium uppercase tracking-wide\">\n <IconClock className=\"h-3 w-3\" />\n Queued\n </div>\n {displayText}\n {msg.images && msg.images.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mt-1.5\">\n {msg.images.map((img, j) => (\n <img\n key={j}\n src={img}\n alt=\"\"\n className=\"h-12 w-12 rounded object-cover border border-border/50\"\n />\n ))}\n </div>\n )}\n <button\n type=\"button\"\n onClick={() =>\n setQueuedMessages((prev) =>\n prev.filter((m) => m.id !== msg.id),\n )\n }\n aria-label=\"Remove from queue\"\n className=\"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:text-foreground hover:bg-accent shadow-sm\"\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Scroll to bottom button */}\n {showScrollToBottom && (\n <div className=\"shrink-0 flex justify-center -mb-1\">\n <button\n type=\"button\"\n onClick={scrollToBottom}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent\"\n aria-label=\"Scroll to bottom\"\n >\n <IconChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </div>\n )}\n\n {composerSlot}\n {guidedQuestions && guidedQuestions.length > 0 && (\n <div className=\"shrink-0 px-3 pb-2 pt-1\">\n <div className=\"rounded-lg border border-border bg-card/60 shadow-sm\">\n <GuidedQuestionFlow\n questions={guidedQuestions}\n onSubmit={handleGuidedQuestionsSubmit}\n onSkip={handleGuidedQuestionsSkip}\n {...(guidedQuestionsTitle\n ? { title: guidedQuestionsTitle }\n : {})}\n {...(guidedQuestionsDescription\n ? { description: guidedQuestionsDescription }\n : {})}\n {...(guidedQuestionsSkipLabel\n ? { skipLabel: guidedQuestionsSkipLabel }\n : {})}\n {...(guidedQuestionsSubmitLabel\n ? { submitLabel: guidedQuestionsSubmitLabel }\n : {})}\n className=\"h-auto items-stretch justify-stretch bg-transparent\"\n />\n </div>\n </div>\n )}\n {showPlanModeCallout && (\n <PlanModeCallout\n canImplementPlan={canImplementPlan}\n onImplementPlan={handleImplementPlan}\n onSwitchToAct={handleSwitchToAct}\n />\n )}\n <SelectionAttachedPill />\n {/* Keep live run progress pinned in the composer footer. */}\n {showRunningInUI && (\n <RunningActivityStatus\n label={\n isReconnecting\n ? \"Reconnecting\"\n : isAutoResuming\n ? \"Resuming\"\n : (activityLabel ?? \"Thinking\")\n }\n />\n )}\n {/* Inline attachment / body-size error */}\n {composerError && (\n <div\n role=\"alert\"\n className=\"shrink-0 mx-3 mb-1.5 flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\"\n >\n <IconAlertTriangle className=\"h-3.5 w-3.5 mt-0.5 shrink-0\" />\n <span className=\"flex-1 leading-snug\">{composerError}</span>\n <button\n type=\"button\"\n aria-label=\"Dismiss error\"\n onClick={() => setComposerError(null)}\n className=\"shrink-0 opacity-70 hover:opacity-100\"\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n {/* Input area */}\n <AgentComposerFrame\n layoutVariant={composerLayoutVariant}\n className={cn(\n composerAreaClassName,\n missingApiKey && \"cursor-pointer\",\n isComposerDisabled && \"opacity-70\",\n )}\n onClick={\n missingApiKey\n ? () => setMissingKeyBouncePulse((p) => p + 1)\n : undefined\n }\n >\n <ComposerAttachmentPreviewStrip />\n <TiptapComposer\n focusRef={tiptapRef}\n disabled={isComposerDisabled}\n placeholder={\n missingApiKey\n ? \"Connect an AI engine above to start chatting…\"\n : composerDisabled\n ? (composerDisabledPlaceholder ??\n \"Open Desktop to use this chat.\")\n : isRunning\n ? queuedMessages.length > 0\n ? `${queuedMessages.length} queued — send a follow-up...`\n : \"Send a follow-up...\"\n : composerPlaceholder\n }\n onSubmit={\n isRunning || composerContextItems.length > 0\n ? (text, references, attachments, options) =>\n void addToQueue(\n text,\n undefined,\n references.length > 0 ? references : undefined,\n attachments,\n undefined,\n options?.intent ?? \"immediate\",\n undefined,\n true,\n )\n : undefined\n }\n onSlashCommand={onSlashCommand}\n execMode={execMode}\n onExecModeChange={onExecModeChange}\n planModeDisabled={planModeDisabled}\n planModeDisabledReason={planModeDisabledReason}\n selectedModel={selectedModel ?? defaultModel}\n selectedEffort={selectedEffort}\n availableModels={availableModels}\n onModelChange={onModelChange}\n onEffortChange={onEffortChange}\n onConnectProvider={onConnectProvider}\n toolbarSlot={composerToolbarSlot}\n contextItems={composerContextItems}\n onRemoveContextItem={removeComposerContextItem}\n plusMenuMode={plusMenuMode}\n layoutVariant={composerLayoutVariant}\n providerConnectStatusEnabled={providerStatusChecksEnabled}\n draftScope={threadId || tabId}\n interceptBuildRequestsForBuilder\n onAttachmentError={setComposerError}\n extraActionButton={\n contextXRayEnabled ||\n composerExtraActionButton ||\n showRunningInUI ? (\n <>\n {contextXRayEnabled && (\n <ContextMeter threadId={threadId} />\n )}\n {composerExtraActionButton}\n {showRunningInUI && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={stopActiveRun}\n className=\"shrink-0 flex h-7 w-7 items-center justify-center rounded-md bg-muted text-foreground hover:bg-muted/80\"\n >\n <IconPlayerStop className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Stop generating</TooltipContent>\n </Tooltip>\n )}\n </>\n ) : undefined\n }\n />\n </AgentComposerFrame>\n </div>\n </TextStreamingContext.Provider>\n </ChatRunningContext.Provider>\n </MessageActionsContext.Provider>\n </CheckpointContext.Provider>\n );\n});\n\nexport const AssistantChat = forwardRef<\n AssistantChatHandle,\n AssistantChatProps\n>(function AssistantChat(\n {\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n tabId,\n browserTabId,\n threadId,\n contextScope,\n isActiveComposer,\n ...props\n },\n ref,\n) {\n const modelRef = useRef<string | undefined>(props.selectedModel);\n modelRef.current = props.selectedModel;\n const engineRef = useRef<string | undefined>(props.selectedEngine);\n engineRef.current = props.selectedEngine;\n const effortRef = useRef<ReasoningEffort | undefined>(props.selectedEffort);\n effortRef.current = props.selectedEffort;\n const execModeRef = useRef<\"build\" | \"plan\" | undefined>(props.execMode);\n execModeRef.current = props.execMode;\n const scopeRef = useRef<ChatThreadScope | null | undefined>(contextScope);\n scopeRef.current = contextScope;\n const surface = props.agentChatSurface ?? \"app\";\n const createAdapterRef = useRef(props.createAdapter);\n createAdapterRef.current = props.createAdapter;\n\n const adapter = useMemo(\n () => {\n const context: AssistantChatAdapterContext = {\n apiUrl,\n tabId,\n threadId,\n modelRef,\n engineRef,\n effortRef,\n execModeRef,\n browserTabId,\n scopeRef,\n surface,\n };\n const createAdapter = createAdapterRef.current;\n return createAdapter\n ? createAdapter(context)\n : createAgentChatAdapter(context);\n },\n // Adapter factories must be memoized and use refs for changing values.\n // `adapterReloadKey` is an explicit opt-in for embedded hosts whose\n // transport identity can change without changing tab/thread ids.\n [apiUrl, tabId, threadId, browserTabId, surface, props.adapterReloadKey],\n );\n const attachmentAdapter = useMemo(\n () =>\n new CompositeAttachmentAdapter([\n new DownscalingImageAttachmentAdapter(),\n new BinaryDocumentAttachmentAdapter(),\n new TextAttachmentAdapter(),\n ]),\n [],\n );\n const runtime = useLocalRuntime(adapter, {\n adapters: { attachments: attachmentAdapter },\n });\n\n return (\n <AssistantRuntimeProvider runtime={runtime}>\n <TooltipProvider delayDuration={200}>\n <ThreadPrimitive.Root className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n <AssistantUiStaleIndexErrorBoundary\n resetKey={`${tabId ?? \"\"}:${threadId ?? \"\"}`}\n componentName=\"AssistantChat\"\n >\n <AssistantChatInner\n ref={ref}\n {...props}\n browserTabId={browserTabId}\n contextScope={contextScope}\n isActiveComposer={isActiveComposer}\n apiUrl={apiUrl}\n tabId={tabId}\n threadId={threadId}\n />\n </AssistantUiStaleIndexErrorBoundary>\n </ThreadPrimitive.Root>\n </TooltipProvider>\n </AssistantRuntimeProvider>\n );\n});\n"]}