@agent-native/core 0.4.5 → 0.6.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 (1015) hide show
  1. package/README.md +15 -43
  2. package/dist/a2a/agent-card.d.ts.map +1 -1
  3. package/dist/a2a/agent-card.js +12 -1
  4. package/dist/a2a/agent-card.js.map +1 -1
  5. package/dist/a2a/client.d.ts +18 -0
  6. package/dist/a2a/client.d.ts.map +1 -1
  7. package/dist/a2a/client.js +62 -4
  8. package/dist/a2a/client.js.map +1 -1
  9. package/dist/a2a/handlers.d.ts +6 -3
  10. package/dist/a2a/handlers.d.ts.map +1 -1
  11. package/dist/a2a/handlers.js +45 -39
  12. package/dist/a2a/handlers.js.map +1 -1
  13. package/dist/a2a/index.d.ts +2 -2
  14. package/dist/a2a/index.d.ts.map +1 -1
  15. package/dist/a2a/index.js +3 -3
  16. package/dist/a2a/index.js.map +1 -1
  17. package/dist/a2a/server.d.ts +11 -2
  18. package/dist/a2a/server.d.ts.map +1 -1
  19. package/dist/a2a/server.js +99 -14
  20. package/dist/a2a/server.js.map +1 -1
  21. package/dist/a2a/task-store.d.ts +6 -6
  22. package/dist/a2a/task-store.d.ts.map +1 -1
  23. package/dist/a2a/task-store.js +102 -42
  24. package/dist/a2a/task-store.js.map +1 -1
  25. package/dist/a2a/types.d.ts +3 -0
  26. package/dist/a2a/types.d.ts.map +1 -1
  27. package/dist/action.d.ts +80 -0
  28. package/dist/action.d.ts.map +1 -0
  29. package/dist/action.js +232 -0
  30. package/dist/action.js.map +1 -0
  31. package/dist/agent/engine/ai-sdk-engine.d.ts +24 -0
  32. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -0
  33. package/dist/agent/engine/ai-sdk-engine.js +302 -0
  34. package/dist/agent/engine/ai-sdk-engine.js.map +1 -0
  35. package/dist/agent/engine/anthropic-engine.d.ts +24 -0
  36. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -0
  37. package/dist/agent/engine/anthropic-engine.js +169 -0
  38. package/dist/agent/engine/anthropic-engine.js.map +1 -0
  39. package/dist/agent/engine/builtin.d.ts +12 -0
  40. package/dist/agent/engine/builtin.d.ts.map +1 -0
  41. package/dist/agent/engine/builtin.js +72 -0
  42. package/dist/agent/engine/builtin.js.map +1 -0
  43. package/dist/agent/engine/index.d.ts +9 -0
  44. package/dist/agent/engine/index.d.ts.map +1 -0
  45. package/dist/agent/engine/index.js +8 -0
  46. package/dist/agent/engine/index.js.map +1 -0
  47. package/dist/agent/engine/registry.d.ts +61 -0
  48. package/dist/agent/engine/registry.d.ts.map +1 -0
  49. package/dist/agent/engine/registry.js +101 -0
  50. package/dist/agent/engine/registry.js.map +1 -0
  51. package/dist/agent/engine/translate-ai-sdk.d.ts +20 -0
  52. package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -0
  53. package/dist/agent/engine/translate-ai-sdk.js +174 -0
  54. package/dist/agent/engine/translate-ai-sdk.js.map +1 -0
  55. package/dist/agent/engine/translate-anthropic.d.ts +23 -0
  56. package/dist/agent/engine/translate-anthropic.d.ts.map +1 -0
  57. package/dist/agent/engine/translate-anthropic.js +140 -0
  58. package/dist/agent/engine/translate-anthropic.js.map +1 -0
  59. package/dist/agent/engine/types.d.ts +168 -0
  60. package/dist/agent/engine/types.d.ts.map +1 -0
  61. package/dist/agent/engine/types.js +13 -0
  62. package/dist/agent/engine/types.js.map +1 -0
  63. package/dist/agent/index.d.ts +2 -2
  64. package/dist/agent/index.d.ts.map +1 -1
  65. package/dist/agent/index.js.map +1 -1
  66. package/dist/agent/production-agent.d.ts +69 -7
  67. package/dist/agent/production-agent.d.ts.map +1 -1
  68. package/dist/agent/production-agent.js +480 -127
  69. package/dist/agent/production-agent.js.map +1 -1
  70. package/dist/agent/run-manager.d.ts +43 -0
  71. package/dist/agent/run-manager.d.ts.map +1 -0
  72. package/dist/agent/run-manager.js +364 -0
  73. package/dist/agent/run-manager.js.map +1 -0
  74. package/dist/agent/run-store.d.ts +26 -0
  75. package/dist/agent/run-store.d.ts.map +1 -0
  76. package/dist/agent/run-store.js +145 -0
  77. package/dist/agent/run-store.js.map +1 -0
  78. package/dist/agent/thread-data-builder.d.ts +31 -0
  79. package/dist/agent/thread-data-builder.d.ts.map +1 -0
  80. package/dist/agent/thread-data-builder.js +91 -0
  81. package/dist/agent/thread-data-builder.js.map +1 -0
  82. package/dist/agent/types.d.ts +73 -1
  83. package/dist/agent/types.d.ts.map +1 -1
  84. package/dist/application-state/emitter.d.ts +3 -2
  85. package/dist/application-state/emitter.d.ts.map +1 -1
  86. package/dist/application-state/emitter.js +14 -4
  87. package/dist/application-state/emitter.js.map +1 -1
  88. package/dist/application-state/handlers.d.ts +8 -8
  89. package/dist/application-state/handlers.d.ts.map +1 -1
  90. package/dist/application-state/handlers.js +15 -17
  91. package/dist/application-state/handlers.js.map +1 -1
  92. package/dist/application-state/script-helpers.d.ts +1 -1
  93. package/dist/application-state/script-helpers.d.ts.map +1 -1
  94. package/dist/application-state/script-helpers.js +56 -8
  95. package/dist/application-state/script-helpers.js.map +1 -1
  96. package/dist/application-state/store.d.ts +4 -3
  97. package/dist/application-state/store.d.ts.map +1 -1
  98. package/dist/application-state/store.js +31 -59
  99. package/dist/application-state/store.js.map +1 -1
  100. package/dist/chat-threads/emitter.d.ts +9 -0
  101. package/dist/chat-threads/emitter.d.ts.map +1 -0
  102. package/dist/chat-threads/emitter.js +14 -0
  103. package/dist/chat-threads/emitter.js.map +1 -0
  104. package/dist/chat-threads/store.d.ts +42 -0
  105. package/dist/chat-threads/store.d.ts.map +1 -0
  106. package/dist/chat-threads/store.js +156 -0
  107. package/dist/chat-threads/store.js.map +1 -0
  108. package/dist/cli/create.d.ts +8 -2
  109. package/dist/cli/create.d.ts.map +1 -1
  110. package/dist/cli/create.js +288 -47
  111. package/dist/cli/create.js.map +1 -1
  112. package/dist/cli/index.js +49 -9
  113. package/dist/cli/index.js.map +1 -1
  114. package/dist/cli/setup-agents.d.ts +11 -0
  115. package/dist/cli/setup-agents.d.ts.map +1 -0
  116. package/dist/cli/setup-agents.js +123 -0
  117. package/dist/cli/setup-agents.js.map +1 -0
  118. package/dist/client/AgentPanel.d.ts +13 -2
  119. package/dist/client/AgentPanel.d.ts.map +1 -1
  120. package/dist/client/AgentPanel.js +771 -38
  121. package/dist/client/AgentPanel.js.map +1 -1
  122. package/dist/client/AgentTaskCard.d.ts +12 -0
  123. package/dist/client/AgentTaskCard.d.ts.map +1 -0
  124. package/dist/client/AgentTaskCard.js +146 -0
  125. package/dist/client/AgentTaskCard.js.map +1 -0
  126. package/dist/client/AssistantChat.d.ts +36 -3
  127. package/dist/client/AssistantChat.d.ts.map +1 -1
  128. package/dist/client/AssistantChat.js +838 -86
  129. package/dist/client/AssistantChat.js.map +1 -1
  130. package/dist/client/ClientOnly.d.ts +14 -0
  131. package/dist/client/ClientOnly.d.ts.map +1 -0
  132. package/dist/client/ClientOnly.js +17 -0
  133. package/dist/client/ClientOnly.js.map +1 -0
  134. package/dist/client/CommandMenu.d.ts +71 -0
  135. package/dist/client/CommandMenu.d.ts.map +1 -0
  136. package/dist/client/CommandMenu.js +257 -0
  137. package/dist/client/CommandMenu.js.map +1 -0
  138. package/dist/client/DefaultSpinner.d.ts +7 -0
  139. package/dist/client/DefaultSpinner.d.ts.map +1 -0
  140. package/dist/client/DefaultSpinner.js +28 -0
  141. package/dist/client/DefaultSpinner.js.map +1 -0
  142. package/dist/client/MultiTabAssistantChat.d.ts +40 -2
  143. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  144. package/dist/client/MultiTabAssistantChat.js +630 -59
  145. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  146. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  147. package/dist/client/PoweredByBadge.js +4 -3
  148. package/dist/client/PoweredByBadge.js.map +1 -1
  149. package/dist/client/Turnstile.d.ts.map +1 -1
  150. package/dist/client/Turnstile.js +2 -3
  151. package/dist/client/Turnstile.js.map +1 -1
  152. package/dist/client/active-run-state.d.ts +10 -0
  153. package/dist/client/active-run-state.d.ts.map +1 -0
  154. package/dist/client/active-run-state.js +32 -0
  155. package/dist/client/active-run-state.js.map +1 -0
  156. package/dist/client/agent-chat-adapter.d.ts +2 -1
  157. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  158. package/dist/client/agent-chat-adapter.js +145 -130
  159. package/dist/client/agent-chat-adapter.js.map +1 -1
  160. package/dist/client/agent-chat.d.ts +14 -1
  161. package/dist/client/agent-chat.d.ts.map +1 -1
  162. package/dist/client/agent-chat.js +6 -4
  163. package/dist/client/agent-chat.js.map +1 -1
  164. package/dist/client/components/ApiKeySettings.d.ts +2 -2
  165. package/dist/client/components/ApiKeySettings.js +4 -4
  166. package/dist/client/components/ApiKeySettings.js.map +1 -1
  167. package/dist/client/components/CodeAgentIndicator.d.ts +14 -0
  168. package/dist/client/components/CodeAgentIndicator.d.ts.map +1 -0
  169. package/dist/client/components/CodeAgentIndicator.js +29 -0
  170. package/dist/client/components/CodeAgentIndicator.js.map +1 -0
  171. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  172. package/dist/client/components/CodeRequiredDialog.js +4 -3
  173. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  174. package/dist/client/composer/MentionPopover.d.ts +29 -0
  175. package/dist/client/composer/MentionPopover.d.ts.map +1 -0
  176. package/dist/client/composer/MentionPopover.js +160 -0
  177. package/dist/client/composer/MentionPopover.js.map +1 -0
  178. package/dist/client/composer/TiptapComposer.d.ts +26 -0
  179. package/dist/client/composer/TiptapComposer.d.ts.map +1 -0
  180. package/dist/client/composer/TiptapComposer.js +545 -0
  181. package/dist/client/composer/TiptapComposer.js.map +1 -0
  182. package/dist/client/composer/extensions/FileReference.d.ts +3 -0
  183. package/dist/client/composer/extensions/FileReference.d.ts.map +1 -0
  184. package/dist/client/composer/extensions/FileReference.js +36 -0
  185. package/dist/client/composer/extensions/FileReference.js.map +1 -0
  186. package/dist/client/composer/extensions/MentionReference.d.ts +3 -0
  187. package/dist/client/composer/extensions/MentionReference.d.ts.map +1 -0
  188. package/dist/client/composer/extensions/MentionReference.js +63 -0
  189. package/dist/client/composer/extensions/MentionReference.js.map +1 -0
  190. package/dist/client/composer/extensions/SkillReference.d.ts +3 -0
  191. package/dist/client/composer/extensions/SkillReference.d.ts.map +1 -0
  192. package/dist/client/composer/extensions/SkillReference.js +40 -0
  193. package/dist/client/composer/extensions/SkillReference.js.map +1 -0
  194. package/dist/client/composer/index.d.ts +8 -0
  195. package/dist/client/composer/index.d.ts.map +1 -0
  196. package/dist/client/composer/index.js +7 -0
  197. package/dist/client/composer/index.js.map +1 -0
  198. package/dist/client/composer/types.d.ts +37 -0
  199. package/dist/client/composer/types.d.ts.map +1 -0
  200. package/dist/client/composer/types.js +2 -0
  201. package/dist/client/composer/types.js.map +1 -0
  202. package/dist/client/composer/use-file-search.d.ts +6 -0
  203. package/dist/client/composer/use-file-search.d.ts.map +1 -0
  204. package/dist/client/composer/use-file-search.js +40 -0
  205. package/dist/client/composer/use-file-search.js.map +1 -0
  206. package/dist/client/composer/use-mention-search.d.ts +6 -0
  207. package/dist/client/composer/use-mention-search.d.ts.map +1 -0
  208. package/dist/client/composer/use-mention-search.js +72 -0
  209. package/dist/client/composer/use-mention-search.js.map +1 -0
  210. package/dist/client/composer/use-skills.d.ts +7 -0
  211. package/dist/client/composer/use-skills.d.ts.map +1 -0
  212. package/dist/client/composer/use-skills.js +38 -0
  213. package/dist/client/composer/use-skills.js.map +1 -0
  214. package/dist/client/frame-protocol.d.ts +54 -0
  215. package/dist/client/frame-protocol.d.ts.map +1 -0
  216. package/dist/client/frame-protocol.js +9 -0
  217. package/dist/client/frame-protocol.js.map +1 -0
  218. package/dist/client/frame.d.ts +56 -0
  219. package/dist/client/frame.d.ts.map +1 -0
  220. package/dist/client/{harness.js → frame.js} +49 -26
  221. package/dist/client/frame.js.map +1 -0
  222. package/dist/client/index.d.ts +15 -6
  223. package/dist/client/index.d.ts.map +1 -1
  224. package/dist/client/index.js +13 -5
  225. package/dist/client/index.js.map +1 -1
  226. package/dist/client/integrations/IntegrationCard.d.ts +6 -0
  227. package/dist/client/integrations/IntegrationCard.d.ts.map +1 -0
  228. package/dist/client/integrations/IntegrationCard.js +45 -0
  229. package/dist/client/integrations/IntegrationCard.js.map +1 -0
  230. package/dist/client/integrations/IntegrationsPanel.d.ts +2 -0
  231. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -0
  232. package/dist/client/integrations/IntegrationsPanel.js +149 -0
  233. package/dist/client/integrations/IntegrationsPanel.js.map +1 -0
  234. package/dist/client/integrations/index.d.ts +4 -0
  235. package/dist/client/integrations/index.d.ts.map +1 -0
  236. package/dist/client/integrations/index.js +3 -0
  237. package/dist/client/integrations/index.js.map +1 -0
  238. package/dist/client/integrations/useIntegrationStatus.d.ts +15 -0
  239. package/dist/client/integrations/useIntegrationStatus.d.ts.map +1 -0
  240. package/dist/client/integrations/useIntegrationStatus.js +37 -0
  241. package/dist/client/integrations/useIntegrationStatus.js.map +1 -0
  242. package/dist/client/org/InvitationBanner.d.ts +9 -0
  243. package/dist/client/org/InvitationBanner.d.ts.map +1 -0
  244. package/dist/client/org/InvitationBanner.js +17 -0
  245. package/dist/client/org/InvitationBanner.js.map +1 -0
  246. package/dist/client/org/OrgSwitcher.d.ts +14 -0
  247. package/dist/client/org/OrgSwitcher.d.ts.map +1 -0
  248. package/dist/client/org/OrgSwitcher.js +51 -0
  249. package/dist/client/org/OrgSwitcher.js.map +1 -0
  250. package/dist/client/org/TeamPage.d.ts +23 -0
  251. package/dist/client/org/TeamPage.d.ts.map +1 -0
  252. package/dist/client/org/TeamPage.js +145 -0
  253. package/dist/client/org/TeamPage.js.map +1 -0
  254. package/dist/client/org/hooks.d.ts +14 -0
  255. package/dist/client/org/hooks.d.ts.map +1 -0
  256. package/dist/client/org/hooks.js +101 -0
  257. package/dist/client/org/hooks.js.map +1 -0
  258. package/dist/client/org/index.d.ts +6 -0
  259. package/dist/client/org/index.d.ts.map +1 -0
  260. package/dist/client/org/index.js +6 -0
  261. package/dist/client/org/index.js.map +1 -0
  262. package/dist/client/resources/ResourceEditor.d.ts +14 -0
  263. package/dist/client/resources/ResourceEditor.d.ts.map +1 -0
  264. package/dist/client/resources/ResourceEditor.js +932 -0
  265. package/dist/client/resources/ResourceEditor.js.map +1 -0
  266. package/dist/client/resources/ResourceTree.d.ts +17 -0
  267. package/dist/client/resources/ResourceTree.d.ts.map +1 -0
  268. package/dist/client/resources/ResourceTree.js +137 -0
  269. package/dist/client/resources/ResourceTree.js.map +1 -0
  270. package/dist/client/resources/ResourcesPanel.d.ts +2 -0
  271. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -0
  272. package/dist/client/resources/ResourcesPanel.js +366 -0
  273. package/dist/client/resources/ResourcesPanel.js.map +1 -0
  274. package/dist/client/resources/index.d.ts +5 -0
  275. package/dist/client/resources/index.d.ts.map +1 -0
  276. package/dist/client/resources/index.js +5 -0
  277. package/dist/client/resources/index.js.map +1 -0
  278. package/dist/client/resources/use-resources.d.ts +55 -0
  279. package/dist/client/resources/use-resources.d.ts.map +1 -0
  280. package/dist/client/resources/use-resources.js +102 -0
  281. package/dist/client/resources/use-resources.js.map +1 -0
  282. package/dist/client/sse-event-processor.d.ts +58 -0
  283. package/dist/client/sse-event-processor.d.ts.map +1 -0
  284. package/dist/client/sse-event-processor.js +300 -0
  285. package/dist/client/sse-event-processor.js.map +1 -0
  286. package/dist/client/terminal/AgentTerminal.d.ts +5 -5
  287. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  288. package/dist/client/terminal/AgentTerminal.js +25 -20
  289. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  290. package/dist/client/use-action.d.ts +51 -0
  291. package/dist/client/use-action.d.ts.map +1 -0
  292. package/dist/client/use-action.js +102 -0
  293. package/dist/client/use-action.js.map +1 -0
  294. package/dist/client/use-agent-chat.d.ts +1 -1
  295. package/dist/client/use-agent-chat.d.ts.map +1 -1
  296. package/dist/client/use-agent-chat.js +3 -3
  297. package/dist/client/use-agent-chat.js.map +1 -1
  298. package/dist/client/use-avatar.d.ts +15 -0
  299. package/dist/client/use-avatar.d.ts.map +1 -0
  300. package/dist/client/use-avatar.js +116 -0
  301. package/dist/client/use-avatar.js.map +1 -0
  302. package/dist/client/use-chat-threads.d.ts +36 -0
  303. package/dist/client/use-chat-threads.d.ts.map +1 -0
  304. package/dist/client/use-chat-threads.js +191 -0
  305. package/dist/client/use-chat-threads.js.map +1 -0
  306. package/dist/client/use-db-sync.d.ts +35 -0
  307. package/dist/client/use-db-sync.d.ts.map +1 -0
  308. package/dist/client/use-db-sync.js +74 -0
  309. package/dist/client/use-db-sync.js.map +1 -0
  310. package/dist/client/use-dev-mode.d.ts +4 -2
  311. package/dist/client/use-dev-mode.d.ts.map +1 -1
  312. package/dist/client/use-dev-mode.js +41 -12
  313. package/dist/client/use-dev-mode.js.map +1 -1
  314. package/dist/client/use-send-to-agent-chat.d.ts +7 -4
  315. package/dist/client/use-send-to-agent-chat.d.ts.map +1 -1
  316. package/dist/client/use-send-to-agent-chat.js +31 -10
  317. package/dist/client/use-send-to-agent-chat.js.map +1 -1
  318. package/dist/client/use-session.d.ts +1 -1
  319. package/dist/client/use-session.js +2 -2
  320. package/dist/client/use-session.js.map +1 -1
  321. package/dist/client/useProductionAgent.d.ts +1 -1
  322. package/dist/client/useProductionAgent.d.ts.map +1 -1
  323. package/dist/client/useProductionAgent.js +38 -3
  324. package/dist/client/useProductionAgent.js.map +1 -1
  325. package/dist/collab/awareness.d.ts +41 -0
  326. package/dist/collab/awareness.d.ts.map +1 -0
  327. package/dist/collab/awareness.js +82 -0
  328. package/dist/collab/awareness.js.map +1 -0
  329. package/dist/collab/client.d.ts +49 -0
  330. package/dist/collab/client.d.ts.map +1 -0
  331. package/dist/collab/client.js +250 -0
  332. package/dist/collab/client.js.map +1 -0
  333. package/dist/collab/emitter.d.ts +12 -0
  334. package/dist/collab/emitter.d.ts.map +1 -0
  335. package/dist/collab/emitter.js +16 -0
  336. package/dist/collab/emitter.js.map +1 -0
  337. package/dist/collab/index.d.ts +7 -0
  338. package/dist/collab/index.d.ts.map +1 -0
  339. package/dist/collab/index.js +14 -0
  340. package/dist/collab/index.js.map +1 -0
  341. package/dist/collab/routes.d.ts +69 -0
  342. package/dist/collab/routes.d.ts.map +1 -0
  343. package/dist/collab/routes.js +98 -0
  344. package/dist/collab/routes.js.map +1 -0
  345. package/dist/collab/storage.d.ts +18 -0
  346. package/dist/collab/storage.d.ts.map +1 -0
  347. package/dist/collab/storage.js +94 -0
  348. package/dist/collab/storage.js.map +1 -0
  349. package/dist/collab/text-to-yjs.d.ts +23 -0
  350. package/dist/collab/text-to-yjs.d.ts.map +1 -0
  351. package/dist/collab/text-to-yjs.js +63 -0
  352. package/dist/collab/text-to-yjs.js.map +1 -0
  353. package/dist/collab/xml-ops.d.ts +20 -0
  354. package/dist/collab/xml-ops.d.ts.map +1 -0
  355. package/dist/collab/xml-ops.js +59 -0
  356. package/dist/collab/xml-ops.js.map +1 -0
  357. package/dist/collab/ydoc-manager.d.ts +52 -0
  358. package/dist/collab/ydoc-manager.d.ts.map +1 -0
  359. package/dist/collab/ydoc-manager.js +154 -0
  360. package/dist/collab/ydoc-manager.js.map +1 -0
  361. package/dist/credentials/index.d.ts +18 -0
  362. package/dist/credentials/index.d.ts.map +1 -0
  363. package/dist/credentials/index.js +32 -0
  364. package/dist/credentials/index.js.map +1 -0
  365. package/dist/db/client.d.ts +45 -0
  366. package/dist/db/client.d.ts.map +1 -0
  367. package/dist/db/client.js +289 -0
  368. package/dist/db/client.js.map +1 -0
  369. package/dist/db/create-get-db.d.ts.map +1 -1
  370. package/dist/db/create-get-db.js +103 -16
  371. package/dist/db/create-get-db.js.map +1 -1
  372. package/dist/db/index.d.ts +10 -6
  373. package/dist/db/index.d.ts.map +1 -1
  374. package/dist/db/index.js +10 -4
  375. package/dist/db/index.js.map +1 -1
  376. package/dist/db/migrations.d.ts +9 -1
  377. package/dist/db/migrations.d.ts.map +1 -1
  378. package/dist/db/migrations.js +67 -41
  379. package/dist/db/migrations.js.map +1 -1
  380. package/dist/db/schema.d.ts +52 -0
  381. package/dist/db/schema.d.ts.map +1 -0
  382. package/dist/db/schema.js +72 -0
  383. package/dist/db/schema.js.map +1 -0
  384. package/dist/deploy/build.js +636 -42
  385. package/dist/deploy/build.js.map +1 -1
  386. package/dist/deploy/route-discovery.d.ts +25 -3
  387. package/dist/deploy/route-discovery.d.ts.map +1 -1
  388. package/dist/deploy/route-discovery.js +135 -24
  389. package/dist/deploy/route-discovery.js.map +1 -1
  390. package/dist/index.browser.d.ts +3 -1
  391. package/dist/index.browser.d.ts.map +1 -1
  392. package/dist/index.browser.js +5 -1
  393. package/dist/index.browser.js.map +1 -1
  394. package/dist/index.d.ts +4 -3
  395. package/dist/index.d.ts.map +1 -1
  396. package/dist/index.js +3 -2
  397. package/dist/index.js.map +1 -1
  398. package/dist/integrations/adapters/slack.d.ts +10 -0
  399. package/dist/integrations/adapters/slack.d.ts.map +1 -0
  400. package/dist/integrations/adapters/slack.js +215 -0
  401. package/dist/integrations/adapters/slack.js.map +1 -0
  402. package/dist/integrations/adapters/telegram.d.ts +12 -0
  403. package/dist/integrations/adapters/telegram.d.ts.map +1 -0
  404. package/dist/integrations/adapters/telegram.js +184 -0
  405. package/dist/integrations/adapters/telegram.js.map +1 -0
  406. package/dist/integrations/adapters/whatsapp.d.ts +14 -0
  407. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -0
  408. package/dist/integrations/adapters/whatsapp.js +205 -0
  409. package/dist/integrations/adapters/whatsapp.js.map +1 -0
  410. package/dist/integrations/config-store.d.ts +24 -0
  411. package/dist/integrations/config-store.d.ts.map +1 -0
  412. package/dist/integrations/config-store.js +92 -0
  413. package/dist/integrations/config-store.js.map +1 -0
  414. package/dist/integrations/index.d.ts +8 -0
  415. package/dist/integrations/index.d.ts.map +1 -0
  416. package/dist/integrations/index.js +10 -0
  417. package/dist/integrations/index.js.map +1 -0
  418. package/dist/integrations/plugin.d.ts +20 -0
  419. package/dist/integrations/plugin.d.ts.map +1 -0
  420. package/dist/integrations/plugin.js +213 -0
  421. package/dist/integrations/plugin.js.map +1 -0
  422. package/dist/integrations/thread-mapping-store.d.ts +25 -0
  423. package/dist/integrations/thread-mapping-store.d.ts.map +1 -0
  424. package/dist/integrations/thread-mapping-store.js +95 -0
  425. package/dist/integrations/thread-mapping-store.js.map +1 -0
  426. package/dist/integrations/types.d.ts +111 -0
  427. package/dist/integrations/types.d.ts.map +1 -0
  428. package/dist/integrations/types.js +2 -0
  429. package/dist/integrations/types.js.map +1 -0
  430. package/dist/integrations/webhook-handler.d.ts +31 -0
  431. package/dist/integrations/webhook-handler.d.ts.map +1 -0
  432. package/dist/integrations/webhook-handler.js +210 -0
  433. package/dist/integrations/webhook-handler.js.map +1 -0
  434. package/dist/jobs/cron.d.ts +14 -0
  435. package/dist/jobs/cron.d.ts.map +1 -0
  436. package/dist/jobs/cron.js +100 -0
  437. package/dist/jobs/cron.js.map +1 -0
  438. package/dist/jobs/index.d.ts +4 -0
  439. package/dist/jobs/index.d.ts.map +1 -0
  440. package/dist/jobs/index.js +4 -0
  441. package/dist/jobs/index.js.map +1 -0
  442. package/dist/jobs/scheduler.d.ts +29 -0
  443. package/dist/jobs/scheduler.d.ts.map +1 -0
  444. package/dist/jobs/scheduler.js +205 -0
  445. package/dist/jobs/scheduler.js.map +1 -0
  446. package/dist/jobs/tools.d.ts +3 -0
  447. package/dist/jobs/tools.d.ts.map +1 -0
  448. package/dist/jobs/tools.js +192 -0
  449. package/dist/jobs/tools.js.map +1 -0
  450. package/dist/mcp/index.d.ts +3 -0
  451. package/dist/mcp/index.d.ts.map +1 -0
  452. package/dist/mcp/index.js +2 -0
  453. package/dist/mcp/index.js.map +1 -0
  454. package/dist/mcp/server.d.ts +26 -0
  455. package/dist/mcp/server.d.ts.map +1 -0
  456. package/dist/mcp/server.js +182 -0
  457. package/dist/mcp/server.js.map +1 -0
  458. package/dist/oauth-tokens/index.d.ts +1 -1
  459. package/dist/oauth-tokens/index.d.ts.map +1 -1
  460. package/dist/oauth-tokens/index.js +1 -1
  461. package/dist/oauth-tokens/index.js.map +1 -1
  462. package/dist/oauth-tokens/store.d.ts +5 -0
  463. package/dist/oauth-tokens/store.d.ts.map +1 -1
  464. package/dist/oauth-tokens/store.js +67 -82
  465. package/dist/oauth-tokens/store.js.map +1 -1
  466. package/dist/org/context.d.ts +11 -0
  467. package/dist/org/context.d.ts.map +1 -0
  468. package/dist/org/context.js +61 -0
  469. package/dist/org/context.js.map +1 -0
  470. package/dist/org/handlers.d.ts +66 -0
  471. package/dist/org/handlers.d.ts.map +1 -0
  472. package/dist/org/handlers.js +306 -0
  473. package/dist/org/handlers.js.map +1 -0
  474. package/dist/org/index.d.ts +7 -0
  475. package/dist/org/index.d.ts.map +1 -0
  476. package/dist/org/index.js +11 -0
  477. package/dist/org/index.js.map +1 -0
  478. package/dist/org/migrations.d.ts +10 -0
  479. package/dist/org/migrations.d.ts.map +1 -0
  480. package/dist/org/migrations.js +39 -0
  481. package/dist/org/migrations.js.map +1 -0
  482. package/dist/org/plugin.d.ts +26 -0
  483. package/dist/org/plugin.d.ts.map +1 -0
  484. package/dist/org/plugin.js +94 -0
  485. package/dist/org/plugin.js.map +1 -0
  486. package/dist/org/schema.d.ts +301 -0
  487. package/dist/org/schema.d.ts.map +1 -0
  488. package/dist/org/schema.js +23 -0
  489. package/dist/org/schema.js.map +1 -0
  490. package/dist/org/types.d.ts +42 -0
  491. package/dist/org/types.d.ts.map +1 -0
  492. package/dist/org/types.js +5 -0
  493. package/dist/org/types.js.map +1 -0
  494. package/dist/resources/emitter.d.ts +13 -0
  495. package/dist/resources/emitter.d.ts.map +1 -0
  496. package/dist/resources/emitter.js +32 -0
  497. package/dist/resources/emitter.js.map +1 -0
  498. package/dist/resources/handlers.d.ts +54 -0
  499. package/dist/resources/handlers.d.ts.map +1 -0
  500. package/dist/resources/handlers.js +292 -0
  501. package/dist/resources/handlers.js.map +1 -0
  502. package/dist/resources/index.d.ts +5 -0
  503. package/dist/resources/index.d.ts.map +1 -0
  504. package/dist/resources/index.js +5 -0
  505. package/dist/resources/index.js.map +1 -0
  506. package/dist/resources/script-helpers.d.ts +24 -0
  507. package/dist/resources/script-helpers.d.ts.map +1 -0
  508. package/dist/resources/script-helpers.js +36 -0
  509. package/dist/resources/script-helpers.js.map +1 -0
  510. package/dist/resources/store.d.ts +40 -0
  511. package/dist/resources/store.d.ts.map +1 -0
  512. package/dist/resources/store.js +497 -0
  513. package/dist/resources/store.js.map +1 -0
  514. package/dist/scripts/agent-engines/list-agent-engines.d.ts +7 -0
  515. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -0
  516. package/dist/scripts/agent-engines/list-agent-engines.js +42 -0
  517. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -0
  518. package/dist/scripts/agent-engines/set-agent-engine.d.ts +7 -0
  519. package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -0
  520. package/dist/scripts/agent-engines/set-agent-engine.js +57 -0
  521. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -0
  522. package/dist/scripts/agent-engines/test-agent-engine.d.ts +7 -0
  523. package/dist/scripts/agent-engines/test-agent-engine.d.ts.map +1 -0
  524. package/dist/scripts/agent-engines/test-agent-engine.js +102 -0
  525. package/dist/scripts/agent-engines/test-agent-engine.js.map +1 -0
  526. package/dist/scripts/call-agent.d.ts +5 -0
  527. package/dist/scripts/call-agent.d.ts.map +1 -0
  528. package/dist/scripts/call-agent.js +111 -0
  529. package/dist/scripts/call-agent.js.map +1 -0
  530. package/dist/scripts/chat/index.d.ts +2 -0
  531. package/dist/scripts/chat/index.d.ts.map +1 -0
  532. package/dist/scripts/chat/index.js +5 -0
  533. package/dist/scripts/chat/index.js.map +1 -0
  534. package/dist/scripts/chat/open-chat.d.ts +11 -0
  535. package/dist/scripts/chat/open-chat.d.ts.map +1 -0
  536. package/dist/scripts/chat/open-chat.js +48 -0
  537. package/dist/scripts/chat/open-chat.js.map +1 -0
  538. package/dist/scripts/chat/search-chats.d.ts +10 -0
  539. package/dist/scripts/chat/search-chats.d.ts.map +1 -0
  540. package/dist/scripts/chat/search-chats.js +89 -0
  541. package/dist/scripts/chat/search-chats.js.map +1 -0
  542. package/dist/scripts/core-scripts.d.ts.map +1 -1
  543. package/dist/scripts/core-scripts.js +4 -0
  544. package/dist/scripts/core-scripts.js.map +1 -1
  545. package/dist/scripts/db/check-scoping.d.ts +14 -0
  546. package/dist/scripts/db/check-scoping.d.ts.map +1 -0
  547. package/dist/scripts/db/check-scoping.js +174 -0
  548. package/dist/scripts/db/check-scoping.js.map +1 -0
  549. package/dist/scripts/db/exec.d.ts +7 -2
  550. package/dist/scripts/db/exec.d.ts.map +1 -1
  551. package/dist/scripts/db/exec.js +143 -36
  552. package/dist/scripts/db/exec.js.map +1 -1
  553. package/dist/scripts/db/index.d.ts.map +1 -1
  554. package/dist/scripts/db/index.js +2 -0
  555. package/dist/scripts/db/index.js.map +1 -1
  556. package/dist/scripts/db/patch.d.ts +50 -0
  557. package/dist/scripts/db/patch.d.ts.map +1 -0
  558. package/dist/scripts/db/patch.js +392 -0
  559. package/dist/scripts/db/patch.js.map +1 -0
  560. package/dist/scripts/db/query.d.ts +7 -2
  561. package/dist/scripts/db/query.d.ts.map +1 -1
  562. package/dist/scripts/db/query.js +89 -45
  563. package/dist/scripts/db/query.js.map +1 -1
  564. package/dist/scripts/db/schema.d.ts +2 -2
  565. package/dist/scripts/db/schema.d.ts.map +1 -1
  566. package/dist/scripts/db/schema.js +145 -6
  567. package/dist/scripts/db/schema.js.map +1 -1
  568. package/dist/scripts/db/scoping.d.ts +42 -0
  569. package/dist/scripts/db/scoping.d.ts.map +1 -0
  570. package/dist/scripts/db/scoping.js +216 -0
  571. package/dist/scripts/db/scoping.js.map +1 -0
  572. package/dist/scripts/dev/index.d.ts +2 -2
  573. package/dist/scripts/dev/index.d.ts.map +1 -1
  574. package/dist/scripts/dev/index.js +65 -2
  575. package/dist/scripts/dev/index.js.map +1 -1
  576. package/dist/scripts/dev/list-files.d.ts +2 -2
  577. package/dist/scripts/dev/read-file.d.ts +2 -2
  578. package/dist/scripts/dev/read-file.js +1 -1
  579. package/dist/scripts/dev/read-file.js.map +1 -1
  580. package/dist/scripts/dev/search-files.d.ts +2 -2
  581. package/dist/scripts/dev/search-files.js +1 -1
  582. package/dist/scripts/dev/search-files.js.map +1 -1
  583. package/dist/scripts/dev/shell.d.ts +2 -2
  584. package/dist/scripts/dev/shell.js +1 -1
  585. package/dist/scripts/dev/shell.js.map +1 -1
  586. package/dist/scripts/dev/write-file.d.ts +2 -2
  587. package/dist/scripts/dev/write-file.js +1 -1
  588. package/dist/scripts/dev/write-file.js.map +1 -1
  589. package/dist/scripts/parse-args.d.ts +14 -0
  590. package/dist/scripts/parse-args.d.ts.map +1 -0
  591. package/dist/scripts/parse-args.js +45 -0
  592. package/dist/scripts/parse-args.js.map +1 -0
  593. package/dist/scripts/resources/delete.d.ts +10 -0
  594. package/dist/scripts/resources/delete.d.ts.map +1 -0
  595. package/dist/scripts/resources/delete.js +38 -0
  596. package/dist/scripts/resources/delete.js.map +1 -0
  597. package/dist/scripts/resources/index.d.ts +2 -0
  598. package/dist/scripts/resources/index.d.ts.map +1 -0
  599. package/dist/scripts/resources/index.js +8 -0
  600. package/dist/scripts/resources/index.js.map +1 -0
  601. package/dist/scripts/resources/list.d.ts +10 -0
  602. package/dist/scripts/resources/list.d.ts.map +1 -0
  603. package/dist/scripts/resources/list.js +57 -0
  604. package/dist/scripts/resources/list.js.map +1 -0
  605. package/dist/scripts/resources/migrate-learnings.d.ts +10 -0
  606. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -0
  607. package/dist/scripts/resources/migrate-learnings.js +23 -0
  608. package/dist/scripts/resources/migrate-learnings.js.map +1 -0
  609. package/dist/scripts/resources/read.d.ts +10 -0
  610. package/dist/scripts/resources/read.d.ts.map +1 -0
  611. package/dist/scripts/resources/read.js +59 -0
  612. package/dist/scripts/resources/read.js.map +1 -0
  613. package/dist/scripts/resources/write.d.ts +10 -0
  614. package/dist/scripts/resources/write.d.ts.map +1 -0
  615. package/dist/scripts/resources/write.js +67 -0
  616. package/dist/scripts/resources/write.js.map +1 -0
  617. package/dist/scripts/runner.d.ts +7 -7
  618. package/dist/scripts/runner.d.ts.map +1 -1
  619. package/dist/scripts/runner.js +78 -29
  620. package/dist/scripts/runner.js.map +1 -1
  621. package/dist/scripts/utils.d.ts +5 -10
  622. package/dist/scripts/utils.d.ts.map +1 -1
  623. package/dist/scripts/utils.js +7 -43
  624. package/dist/scripts/utils.js.map +1 -1
  625. package/dist/server/action-discovery.d.ts +40 -0
  626. package/dist/server/action-discovery.d.ts.map +1 -0
  627. package/dist/server/action-discovery.js +257 -0
  628. package/dist/server/action-discovery.js.map +1 -0
  629. package/dist/server/action-routes.d.ts +15 -0
  630. package/dist/server/action-routes.d.ts.map +1 -0
  631. package/dist/server/action-routes.js +105 -0
  632. package/dist/server/action-routes.js.map +1 -0
  633. package/dist/server/agent-chat-plugin.d.ts +32 -23
  634. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  635. package/dist/server/agent-chat-plugin.js +1983 -39
  636. package/dist/server/agent-chat-plugin.js.map +1 -1
  637. package/dist/server/agent-discovery.d.ts +21 -0
  638. package/dist/server/agent-discovery.d.ts.map +1 -0
  639. package/dist/server/agent-discovery.js +197 -0
  640. package/dist/server/agent-discovery.js.map +1 -0
  641. package/dist/server/agent-teams.d.ts +70 -0
  642. package/dist/server/agent-teams.d.ts.map +1 -0
  643. package/dist/server/agent-teams.js +367 -0
  644. package/dist/server/agent-teams.js.map +1 -0
  645. package/dist/server/agents-bundle.d.ts +87 -0
  646. package/dist/server/agents-bundle.d.ts.map +1 -0
  647. package/dist/server/agents-bundle.js +231 -0
  648. package/dist/server/agents-bundle.js.map +1 -0
  649. package/dist/server/auth-plugin.d.ts +5 -0
  650. package/dist/server/auth-plugin.d.ts.map +1 -1
  651. package/dist/server/auth-plugin.js +13 -3
  652. package/dist/server/auth-plugin.js.map +1 -1
  653. package/dist/server/auth.d.ts +54 -31
  654. package/dist/server/auth.d.ts.map +1 -1
  655. package/dist/server/auth.js +671 -294
  656. package/dist/server/auth.js.map +1 -1
  657. package/dist/server/better-auth-instance.d.ts +72 -0
  658. package/dist/server/better-auth-instance.d.ts.map +1 -0
  659. package/dist/server/better-auth-instance.js +144 -0
  660. package/dist/server/better-auth-instance.js.map +1 -0
  661. package/dist/server/collab-plugin.d.ts +29 -0
  662. package/dist/server/collab-plugin.d.ts.map +1 -0
  663. package/dist/server/collab-plugin.js +85 -0
  664. package/dist/server/collab-plugin.js.map +1 -0
  665. package/dist/server/core-routes-plugin.d.ts +54 -0
  666. package/dist/server/core-routes-plugin.d.ts.map +1 -0
  667. package/dist/server/core-routes-plugin.js +195 -0
  668. package/dist/server/core-routes-plugin.js.map +1 -0
  669. package/dist/server/create-server.d.ts +5 -5
  670. package/dist/server/create-server.d.ts.map +1 -1
  671. package/dist/server/create-server.js +44 -21
  672. package/dist/server/create-server.js.map +1 -1
  673. package/dist/server/framework-request-handler.d.ts +47 -0
  674. package/dist/server/framework-request-handler.d.ts.map +1 -0
  675. package/dist/server/framework-request-handler.js +168 -0
  676. package/dist/server/framework-request-handler.js.map +1 -0
  677. package/dist/server/google-auth-plugin.d.ts +4 -0
  678. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  679. package/dist/server/google-auth-plugin.js +16 -15
  680. package/dist/server/google-auth-plugin.js.map +1 -1
  681. package/dist/server/google-oauth.d.ts +72 -0
  682. package/dist/server/google-oauth.d.ts.map +1 -0
  683. package/dist/server/google-oauth.js +209 -0
  684. package/dist/server/google-oauth.js.map +1 -0
  685. package/dist/server/h3-helpers.d.ts +23 -0
  686. package/dist/server/h3-helpers.d.ts.map +1 -0
  687. package/dist/server/h3-helpers.js +37 -0
  688. package/dist/server/h3-helpers.js.map +1 -0
  689. package/dist/server/index.d.ts +17 -5
  690. package/dist/server/index.d.ts.map +1 -1
  691. package/dist/server/index.js +19 -4
  692. package/dist/server/index.js.map +1 -1
  693. package/dist/server/local-migration.d.ts +32 -0
  694. package/dist/server/local-migration.d.ts.map +1 -0
  695. package/dist/server/local-migration.js +205 -0
  696. package/dist/server/local-migration.js.map +1 -0
  697. package/dist/server/oauth-helpers.d.ts +14 -0
  698. package/dist/server/oauth-helpers.d.ts.map +1 -0
  699. package/dist/server/oauth-helpers.js +23 -0
  700. package/dist/server/oauth-helpers.js.map +1 -0
  701. package/dist/server/onboarding-html.d.ts +24 -0
  702. package/dist/server/onboarding-html.d.ts.map +1 -0
  703. package/dist/server/onboarding-html.js +347 -0
  704. package/dist/server/onboarding-html.js.map +1 -0
  705. package/dist/server/poll.d.ts +45 -0
  706. package/dist/server/poll.d.ts.map +1 -0
  707. package/dist/server/poll.js +96 -0
  708. package/dist/server/poll.js.map +1 -0
  709. package/dist/server/resources-plugin.d.ts +27 -0
  710. package/dist/server/resources-plugin.d.ts.map +1 -0
  711. package/dist/server/resources-plugin.js +75 -0
  712. package/dist/server/resources-plugin.js.map +1 -0
  713. package/dist/server/schema-prompt.d.ts +16 -0
  714. package/dist/server/schema-prompt.d.ts.map +1 -0
  715. package/dist/server/schema-prompt.js +275 -0
  716. package/dist/server/schema-prompt.js.map +1 -0
  717. package/dist/server/script-discovery.d.ts +6 -0
  718. package/dist/server/script-discovery.d.ts.map +1 -0
  719. package/dist/server/script-discovery.js +6 -0
  720. package/dist/server/script-discovery.js.map +1 -0
  721. package/dist/server/sse.d.ts +4 -21
  722. package/dist/server/sse.d.ts.map +1 -1
  723. package/dist/server/sse.js +2 -30
  724. package/dist/server/sse.js.map +1 -1
  725. package/dist/server/ssr-handler.d.ts +6 -0
  726. package/dist/server/ssr-handler.d.ts.map +1 -0
  727. package/dist/server/ssr-handler.js +55 -0
  728. package/dist/server/ssr-handler.js.map +1 -0
  729. package/dist/settings/handlers.d.ts +6 -6
  730. package/dist/settings/handlers.d.ts.map +1 -1
  731. package/dist/settings/handlers.js +9 -6
  732. package/dist/settings/handlers.js.map +1 -1
  733. package/dist/settings/index.d.ts +2 -1
  734. package/dist/settings/index.d.ts.map +1 -1
  735. package/dist/settings/index.js +2 -0
  736. package/dist/settings/index.js.map +1 -1
  737. package/dist/settings/org-settings.d.ts +22 -0
  738. package/dist/settings/org-settings.d.ts.map +1 -0
  739. package/dist/settings/org-settings.js +45 -0
  740. package/dist/settings/org-settings.js.map +1 -0
  741. package/dist/settings/store.d.ts +6 -2
  742. package/dist/settings/store.d.ts.map +1 -1
  743. package/dist/settings/store.js +26 -63
  744. package/dist/settings/store.js.map +1 -1
  745. package/dist/settings/user-settings.d.ts +3 -2
  746. package/dist/settings/user-settings.d.ts.map +1 -1
  747. package/dist/settings/user-settings.js +5 -5
  748. package/dist/settings/user-settings.js.map +1 -1
  749. package/dist/shared/agent-chat.d.ts +5 -5
  750. package/dist/shared/agent-chat.d.ts.map +1 -1
  751. package/dist/shared/agent-chat.js +8 -8
  752. package/dist/shared/agent-chat.js.map +1 -1
  753. package/dist/shared/agent-env.d.ts +1 -1
  754. package/dist/shared/agent-env.js +1 -1
  755. package/dist/shared/runtime.d.ts +14 -0
  756. package/dist/shared/runtime.d.ts.map +1 -0
  757. package/dist/shared/runtime.js +25 -0
  758. package/dist/shared/runtime.js.map +1 -0
  759. package/dist/tailwind.preset.d.ts +7 -6
  760. package/dist/tailwind.preset.d.ts.map +1 -1
  761. package/dist/tailwind.preset.js +18 -1
  762. package/dist/tailwind.preset.js.map +1 -1
  763. package/dist/templates/default/.agents/skills/actions/SKILL.md +142 -0
  764. package/dist/templates/default/.agents/skills/agent-engines/SKILL.md +127 -0
  765. package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +50 -0
  766. package/dist/templates/default/.agents/skills/create-skill/SKILL.md +167 -0
  767. package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +90 -0
  768. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +69 -0
  769. package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +183 -0
  770. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +112 -0
  771. package/dist/templates/default/.agents/skills/security/SKILL.md +108 -0
  772. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +79 -0
  773. package/{src/templates/default/.agents/skills/files-as-database → dist/templates/default/.agents/skills/storing-data}/SKILL.md +2 -2
  774. package/dist/templates/default/.claude/settings.json +100 -0
  775. package/dist/templates/default/.env.example +5 -0
  776. package/dist/templates/default/.prettierrc +5 -0
  777. package/dist/templates/default/AGENTS.md +110 -0
  778. package/dist/templates/default/DEVELOPING.md +117 -0
  779. package/dist/templates/default/_gitignore +37 -0
  780. package/{src/templates/default/scripts → dist/templates/default/actions}/hello.ts +1 -1
  781. package/dist/templates/default/actions/navigate.ts +53 -0
  782. package/dist/templates/default/actions/view-screen.ts +39 -0
  783. package/dist/templates/default/app/entry.client.tsx +4 -0
  784. package/dist/templates/default/app/entry.server.tsx +56 -0
  785. package/dist/templates/default/app/global.css +95 -0
  786. package/dist/templates/default/app/lib/utils.ts +1 -0
  787. package/dist/templates/default/app/root.tsx +107 -0
  788. package/dist/templates/default/app/routes/_index.tsx +62 -0
  789. package/dist/templates/default/app/routes.ts +4 -0
  790. package/dist/templates/default/app/vite-env.d.ts +6 -0
  791. package/dist/templates/default/components.json +20 -0
  792. package/dist/templates/default/data/.gitkeep +0 -0
  793. package/dist/templates/default/data/sync-config.json +1 -0
  794. package/dist/templates/default/learnings.defaults.md +5 -0
  795. package/dist/templates/default/learnings.md +0 -0
  796. package/dist/templates/default/package.json +46 -0
  797. package/dist/templates/default/postcss.config.js +6 -0
  798. package/dist/templates/default/public/icon-180.svg +4 -0
  799. package/dist/templates/default/public/icon-192.svg +4 -0
  800. package/dist/templates/default/public/icon-512.svg +4 -0
  801. package/dist/templates/default/public/manifest.json +13 -0
  802. package/dist/templates/default/react-router.config.ts +6 -0
  803. package/dist/templates/default/server/middleware/auth.ts +15 -0
  804. package/dist/templates/default/server/plugins/.gitkeep +0 -0
  805. package/dist/templates/default/server/routes/[...page].get.ts +5 -0
  806. package/dist/templates/default/server/routes/api/hello.get.ts +5 -0
  807. package/dist/templates/default/shared/api.ts +6 -0
  808. package/dist/templates/default/ssr-entry.ts +20 -0
  809. package/dist/templates/default/tailwind.config.ts +7 -0
  810. package/dist/templates/default/tsconfig.json +11 -0
  811. package/dist/templates/default/vite.config.ts +6 -0
  812. package/dist/templates/templates/default/.agents/skills/actions/SKILL.md +142 -0
  813. package/dist/templates/templates/default/.agents/skills/agent-engines/SKILL.md +127 -0
  814. package/dist/templates/templates/default/.agents/skills/capture-learnings/SKILL.md +50 -0
  815. package/dist/templates/templates/default/.agents/skills/create-skill/SKILL.md +167 -0
  816. package/dist/templates/templates/default/.agents/skills/delegate-to-agent/SKILL.md +90 -0
  817. package/dist/templates/templates/default/.agents/skills/frontend-design/SKILL.md +69 -0
  818. package/dist/templates/templates/default/.agents/skills/real-time-collab/SKILL.md +183 -0
  819. package/dist/templates/templates/default/.agents/skills/real-time-sync/SKILL.md +112 -0
  820. package/dist/templates/templates/default/.agents/skills/security/SKILL.md +108 -0
  821. package/dist/templates/templates/default/.agents/skills/self-modifying-code/SKILL.md +79 -0
  822. package/dist/templates/templates/default/.agents/skills/storing-data/SKILL.md +110 -0
  823. package/dist/templates/templates/default/.claude/settings.json +100 -0
  824. package/dist/templates/templates/default/.env.example +5 -0
  825. package/dist/templates/templates/default/.ignore +0 -0
  826. package/dist/templates/templates/default/.prettierrc +5 -0
  827. package/dist/templates/templates/default/AGENTS.md +110 -0
  828. package/dist/templates/templates/default/DEVELOPING.md +117 -0
  829. package/dist/templates/templates/default/_gitignore +37 -0
  830. package/dist/templates/templates/default/actions/hello.ts +20 -0
  831. package/dist/templates/templates/default/actions/navigate.ts +53 -0
  832. package/dist/templates/templates/default/actions/run.ts +2 -0
  833. package/dist/templates/templates/default/actions/view-screen.ts +39 -0
  834. package/dist/templates/templates/default/app/entry.client.tsx +4 -0
  835. package/dist/templates/templates/default/app/entry.server.tsx +56 -0
  836. package/dist/templates/templates/default/app/global.css +95 -0
  837. package/dist/templates/templates/default/app/lib/utils.ts +1 -0
  838. package/dist/templates/templates/default/app/root.tsx +107 -0
  839. package/dist/templates/templates/default/app/routes/_index.tsx +62 -0
  840. package/dist/templates/templates/default/app/routes.ts +4 -0
  841. package/dist/templates/templates/default/app/vite-env.d.ts +6 -0
  842. package/dist/templates/templates/default/components.json +20 -0
  843. package/dist/templates/templates/default/data/.gitkeep +0 -0
  844. package/dist/templates/templates/default/data/sync-config.json +1 -0
  845. package/dist/templates/templates/default/learnings.defaults.md +5 -0
  846. package/dist/templates/templates/default/learnings.md +0 -0
  847. package/dist/templates/templates/default/package.json +46 -0
  848. package/dist/templates/templates/default/postcss.config.js +6 -0
  849. package/dist/templates/templates/default/public/icon-180.svg +4 -0
  850. package/dist/templates/templates/default/public/icon-192.svg +4 -0
  851. package/dist/templates/templates/default/public/icon-512.svg +4 -0
  852. package/dist/templates/templates/default/public/manifest.json +13 -0
  853. package/dist/templates/templates/default/react-router.config.ts +6 -0
  854. package/dist/templates/templates/default/server/middleware/auth.ts +15 -0
  855. package/dist/templates/templates/default/server/plugins/.gitkeep +0 -0
  856. package/dist/templates/templates/default/server/routes/[...page].get.ts +5 -0
  857. package/dist/templates/templates/default/server/routes/api/hello.get.ts +5 -0
  858. package/dist/templates/templates/default/shared/api.ts +6 -0
  859. package/dist/templates/templates/default/ssr-entry.ts +20 -0
  860. package/dist/templates/templates/default/tailwind.config.ts +7 -0
  861. package/dist/templates/templates/default/tsconfig.json +11 -0
  862. package/dist/templates/templates/default/vite.config.ts +6 -0
  863. package/dist/terminal/cli-registry.d.ts +2 -2
  864. package/dist/terminal/cli-registry.d.ts.map +1 -1
  865. package/dist/terminal/cli-registry.js +8 -8
  866. package/dist/terminal/cli-registry.js.map +1 -1
  867. package/dist/terminal/pty-server.d.ts +1 -1
  868. package/dist/terminal/pty-server.d.ts.map +1 -1
  869. package/dist/terminal/pty-server.js +94 -18
  870. package/dist/terminal/pty-server.js.map +1 -1
  871. package/dist/terminal/terminal-plugin.d.ts +1 -10
  872. package/dist/terminal/terminal-plugin.d.ts.map +1 -1
  873. package/dist/terminal/terminal-plugin.js +77 -28
  874. package/dist/terminal/terminal-plugin.js.map +1 -1
  875. package/dist/usage/store.d.ts +29 -0
  876. package/dist/usage/store.d.ts.map +1 -0
  877. package/dist/usage/store.js +102 -0
  878. package/dist/usage/store.js.map +1 -0
  879. package/dist/vite/action-types-plugin.d.ts +13 -0
  880. package/dist/vite/action-types-plugin.d.ts.map +1 -0
  881. package/dist/vite/action-types-plugin.js +132 -0
  882. package/dist/vite/action-types-plugin.js.map +1 -0
  883. package/dist/vite/agents-bundle-plugin.d.ts +3 -0
  884. package/dist/vite/agents-bundle-plugin.d.ts.map +1 -0
  885. package/dist/vite/agents-bundle-plugin.js +87 -0
  886. package/dist/vite/agents-bundle-plugin.js.map +1 -0
  887. package/dist/vite/client.d.ts +5 -0
  888. package/dist/vite/client.d.ts.map +1 -1
  889. package/dist/vite/client.js +310 -19
  890. package/dist/vite/client.js.map +1 -1
  891. package/dist/vite/index.d.ts +2 -1
  892. package/dist/vite/index.d.ts.map +1 -1
  893. package/dist/vite/index.js +2 -1
  894. package/dist/vite/index.js.map +1 -1
  895. package/package.json +78 -14
  896. package/src/templates/default/.agents/skills/actions/SKILL.md +142 -0
  897. package/src/templates/default/.agents/skills/agent-engines/SKILL.md +127 -0
  898. package/src/templates/default/.agents/skills/create-skill/SKILL.md +1 -1
  899. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +1 -1
  900. package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +183 -0
  901. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +112 -0
  902. package/src/templates/default/.agents/skills/security/SKILL.md +108 -0
  903. package/src/templates/default/.agents/skills/storing-data/SKILL.md +110 -0
  904. package/src/templates/default/.claude/settings.json +13 -0
  905. package/src/templates/default/AGENTS.md +72 -164
  906. package/src/templates/default/DEVELOPING.md +117 -0
  907. package/src/templates/default/actions/hello.ts +20 -0
  908. package/src/templates/default/actions/navigate.ts +53 -0
  909. package/src/templates/default/actions/run.ts +2 -0
  910. package/src/templates/default/actions/view-screen.ts +39 -0
  911. package/src/templates/default/app/global.css +2 -2
  912. package/src/templates/default/app/root.tsx +19 -16
  913. package/src/templates/default/app/routes/_index.tsx +1 -1
  914. package/src/templates/default/package.json +6 -2
  915. package/src/templates/default/server/middleware/auth.ts +15 -0
  916. package/src/templates/default/server/plugins/.gitkeep +0 -0
  917. package/src/templates/default/server/routes/[...page].get.ts +2 -9
  918. package/src/templates/default/ssr-entry.ts +20 -0
  919. package/dist/a2a/middleware.d.ts +0 -3
  920. package/dist/a2a/middleware.d.ts.map +0 -1
  921. package/dist/a2a/middleware.js +0 -36
  922. package/dist/a2a/middleware.js.map +0 -1
  923. package/dist/adapters/convex/adapter.d.ts +0 -24
  924. package/dist/adapters/convex/adapter.d.ts.map +0 -1
  925. package/dist/adapters/convex/adapter.js +0 -125
  926. package/dist/adapters/convex/adapter.js.map +0 -1
  927. package/dist/adapters/convex/index.d.ts +0 -4
  928. package/dist/adapters/convex/index.d.ts.map +0 -1
  929. package/dist/adapters/convex/index.js +0 -3
  930. package/dist/adapters/convex/index.js.map +0 -1
  931. package/dist/adapters/drizzle/adapter.d.ts +0 -36
  932. package/dist/adapters/drizzle/adapter.d.ts.map +0 -1
  933. package/dist/adapters/drizzle/adapter.js +0 -210
  934. package/dist/adapters/drizzle/adapter.js.map +0 -1
  935. package/dist/adapters/drizzle/index.d.ts +0 -3
  936. package/dist/adapters/drizzle/index.d.ts.map +0 -1
  937. package/dist/adapters/drizzle/index.js +0 -3
  938. package/dist/adapters/drizzle/index.js.map +0 -1
  939. package/dist/adapters/drizzle/schema.d.ts +0 -146
  940. package/dist/adapters/drizzle/schema.d.ts.map +0 -1
  941. package/dist/adapters/drizzle/schema.js +0 -20
  942. package/dist/adapters/drizzle/schema.js.map +0 -1
  943. package/dist/adapters/firestore/adapter.d.ts +0 -48
  944. package/dist/adapters/firestore/adapter.d.ts.map +0 -1
  945. package/dist/adapters/firestore/adapter.js +0 -62
  946. package/dist/adapters/firestore/adapter.js.map +0 -1
  947. package/dist/adapters/firestore/index.d.ts +0 -4
  948. package/dist/adapters/firestore/index.d.ts.map +0 -1
  949. package/dist/adapters/firestore/index.js +0 -3
  950. package/dist/adapters/firestore/index.js.map +0 -1
  951. package/dist/adapters/supabase/adapter.d.ts +0 -43
  952. package/dist/adapters/supabase/adapter.d.ts.map +0 -1
  953. package/dist/adapters/supabase/adapter.js +0 -137
  954. package/dist/adapters/supabase/adapter.js.map +0 -1
  955. package/dist/adapters/supabase/index.d.ts +0 -3
  956. package/dist/adapters/supabase/index.d.ts.map +0 -1
  957. package/dist/adapters/supabase/index.js +0 -3
  958. package/dist/adapters/supabase/index.js.map +0 -1
  959. package/dist/adapters/sync/config.d.ts +0 -40
  960. package/dist/adapters/sync/config.d.ts.map +0 -1
  961. package/dist/adapters/sync/config.js +0 -209
  962. package/dist/adapters/sync/config.js.map +0 -1
  963. package/dist/adapters/sync/create-file-sync.d.ts +0 -32
  964. package/dist/adapters/sync/create-file-sync.d.ts.map +0 -1
  965. package/dist/adapters/sync/create-file-sync.js +0 -218
  966. package/dist/adapters/sync/create-file-sync.js.map +0 -1
  967. package/dist/adapters/sync/file-sync.d.ts +0 -94
  968. package/dist/adapters/sync/file-sync.d.ts.map +0 -1
  969. package/dist/adapters/sync/file-sync.js +0 -671
  970. package/dist/adapters/sync/file-sync.js.map +0 -1
  971. package/dist/adapters/sync/index.d.ts +0 -6
  972. package/dist/adapters/sync/index.d.ts.map +0 -1
  973. package/dist/adapters/sync/index.js +0 -6
  974. package/dist/adapters/sync/index.js.map +0 -1
  975. package/dist/adapters/sync/merge.d.ts +0 -21
  976. package/dist/adapters/sync/merge.d.ts.map +0 -1
  977. package/dist/adapters/sync/merge.js +0 -132
  978. package/dist/adapters/sync/merge.js.map +0 -1
  979. package/dist/adapters/sync/types.d.ts +0 -62
  980. package/dist/adapters/sync/types.d.ts.map +0 -1
  981. package/dist/adapters/sync/types.js +0 -23
  982. package/dist/adapters/sync/types.js.map +0 -1
  983. package/dist/client/harness.d.ts +0 -48
  984. package/dist/client/harness.d.ts.map +0 -1
  985. package/dist/client/harness.js.map +0 -1
  986. package/dist/client/use-file-sync-status.d.ts +0 -21
  987. package/dist/client/use-file-sync-status.d.ts.map +0 -1
  988. package/dist/client/use-file-sync-status.js +0 -65
  989. package/dist/client/use-file-sync-status.js.map +0 -1
  990. package/dist/client/use-file-watcher.d.ts +0 -23
  991. package/dist/client/use-file-watcher.d.ts.map +0 -1
  992. package/dist/client/use-file-watcher.js +0 -50
  993. package/dist/client/use-file-watcher.js.map +0 -1
  994. package/dist/server/default-watcher.d.ts +0 -17
  995. package/dist/server/default-watcher.d.ts.map +0 -1
  996. package/dist/server/default-watcher.js +0 -37
  997. package/dist/server/default-watcher.js.map +0 -1
  998. package/dist/server/file-sync-plugin.d.ts +0 -7
  999. package/dist/server/file-sync-plugin.d.ts.map +0 -1
  1000. package/dist/server/file-sync-plugin.js +0 -38
  1001. package/dist/server/file-sync-plugin.js.map +0 -1
  1002. package/dist/vite/dev-api-server.d.ts +0 -10
  1003. package/dist/vite/dev-api-server.d.ts.map +0 -1
  1004. package/dist/vite/dev-api-server.js +0 -160
  1005. package/dist/vite/dev-api-server.js.map +0 -1
  1006. package/src/templates/default/.agents/skills/scripts/SKILL.md +0 -121
  1007. package/src/templates/default/.agents/skills/sse-file-watcher/SKILL.md +0 -80
  1008. package/src/templates/default/server/plugins/agent-chat.ts +0 -1
  1009. package/src/templates/default/server/plugins/auth.ts +0 -1
  1010. package/src/templates/default/server/plugins/file-sync.ts +0 -1
  1011. package/src/templates/default/server/plugins/terminal.ts +0 -1
  1012. package/src/templates/default/server/routes/api/events.get.ts +0 -3
  1013. package/src/templates/default/server/routes/api/file-sync/status.get.ts +0 -4
  1014. /package/{src/templates/default/application-state/.gitkeep → dist/templates/default/.ignore} +0 -0
  1015. /package/{src/templates/default/scripts → dist/templates/default/actions}/run.ts +0 -0
@@ -1,55 +1,313 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState, useRef, useEffect, useCallback, useMemo, forwardRef, useImperativeHandle, } from "react";
3
- import { AssistantRuntimeProvider, useLocalRuntime, useThreadRuntime, useThread, useMessageRuntime, ThreadPrimitive, ComposerPrimitive, MessagePrimitive, } from "@assistant-ui/react";
3
+ import { AssistantRuntimeProvider, useLocalRuntime, useThreadRuntime, useThread, useAui, useComposer, useMessageRuntime, ThreadPrimitive, ComposerPrimitive, MessagePrimitive, } from "@assistant-ui/react";
4
+ import { SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, CompositeAttachmentAdapter, } from "@assistant-ui/react";
5
+ import { MarkdownTextPrimitive } from "@assistant-ui/react-markdown";
6
+ import ReactMarkdown from "react-markdown";
7
+ import remarkGfm from "remark-gfm";
4
8
  import { createAgentChatAdapter } from "./agent-chat-adapter.js";
9
+ import { readSSEStreamRaw } from "./sse-event-processor.js";
5
10
  import { cn } from "./utils.js";
6
- // ─── Icons ──────────────────────────────────────────────────────────────────
7
- function SparklesIcon({ className }) {
8
- return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: _jsx("path", { d: "M12 3l1.912 5.813a2 2 0 0 0 1.275 1.275L21 12l-5.813 1.912a2 2 0 0 0-1.275 1.275L12 21l-1.912-5.813a2 2 0 0 0-1.275-1.275L3 12l5.813-1.912a2 2 0 0 0 1.275-1.275L12 3z" }) }));
11
+ import { AgentTaskCard } from "./AgentTaskCard.js";
12
+ import { TiptapComposer, } from "./composer/TiptapComposer.js";
13
+ import { IconSparkles, IconX, IconPlayerStop, IconCheck, IconChevronDown, IconCopy, IconTerminal, IconLoader2, IconCircleX, IconSquareFilled, IconClock, IconFile, IconFolder, IconFileText, IconCheckbox, IconMail, IconUser, IconPresentation, IconStack2, IconMessageChatbot, IconLock, } from "@tabler/icons-react";
14
+ // ─── Markdown Text ──────────────────────────────────────────────────────────
15
+ const markdownStyles = `
16
+ .agent-markdown > :first-child { margin-top: 0; }
17
+ .agent-markdown > :last-child { margin-bottom: 0; }
18
+ .agent-markdown p { margin: 0.5em 0; }
19
+ .agent-markdown ul, .agent-markdown ol { margin: 0.5em 0; padding-left: 1.5em; }
20
+ .agent-markdown li { margin: 0.2em 0; }
21
+ .agent-markdown li > p { margin: 0; }
22
+ .agent-markdown h1 { font-size: 1.25em; font-weight: 600; margin: 0.75em 0 0.25em; }
23
+ .agent-markdown h2 { font-size: 1.125em; font-weight: 600; margin: 0.75em 0 0.25em; }
24
+ .agent-markdown h3 { font-size: 1em; font-weight: 600; margin: 0.75em 0 0.25em; }
25
+ .agent-markdown strong { font-weight: 600; }
26
+ .agent-markdown em { font-style: italic; }
27
+ .agent-markdown code { font-size: 0.875em; padding: 0.15em 0.35em; border-radius: 0.25em; background: var(--color-muted, hsl(0 0% 15%)); }
28
+ .agent-markdown pre { margin: 0.5em 0; padding: 0.75em 1em; border-radius: 0.375em; background: var(--color-muted, hsl(0 0% 15%)); overflow-x: auto; }
29
+ .agent-markdown pre code { padding: 0; background: transparent; font-size: 0.8125em; }
30
+ .agent-markdown hr { border: none; border-top: 1px solid var(--color-border, hsl(0 0% 20%)); margin: 0.75em 0; }
31
+ .agent-markdown a { text-decoration: underline; text-underline-offset: 2px; }
32
+ .agent-markdown blockquote { border-left: 2px solid var(--color-border, hsl(0 0% 20%)); padding-left: 0.75em; margin: 0.5em 0; opacity: 0.8; }
33
+ .agent-markdown table { border-collapse: collapse; margin: 0.5em 0; font-size: 0.875em; }
34
+ .agent-markdown th, .agent-markdown td { border: 1px solid var(--color-border, hsl(0 0% 20%)); padding: 0.35em 0.65em; text-align: left; }
35
+ .agent-markdown th { font-weight: 600; background: var(--color-muted, hsl(0 0% 15%)); }
36
+ `;
37
+ let stylesInjected = false;
38
+ function injectMarkdownStyles() {
39
+ if (stylesInjected || typeof document === "undefined")
40
+ return;
41
+ stylesInjected = true;
42
+ const style = document.createElement("style");
43
+ style.textContent = markdownStyles;
44
+ document.head.appendChild(style);
9
45
  }
10
- function SendIcon({ className }) {
11
- return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: _jsx("path", { d: "M5 12h14M12 5l7 7-7 7" }) }));
12
- }
13
- function StopIcon({ className }) {
14
- return (_jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", className: className, children: _jsx("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }) }));
15
- }
16
- function CheckIcon({ className }) {
17
- return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: _jsx("path", { d: "M20 6L9 17l-5-5" }) }));
46
+ function MarkdownText() {
47
+ useEffect(() => {
48
+ injectMarkdownStyles();
49
+ }, []);
50
+ return (_jsx(MarkdownTextPrimitive, { smooth: true, className: "agent-markdown break-words", remarkPlugins: [remarkGfm] }));
18
51
  }
19
- function ChevronDownIcon({ className }) {
20
- return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: _jsx("path", { d: "m6 9 6 6 6-6" }) }));
52
+ // ─── Composer Attachment Preview ─────────────────────────────────────────────
53
+ function getImageAttachmentSrc(attachment) {
54
+ if (attachment.type !== "image")
55
+ return null;
56
+ if ("file" in attachment && attachment.file) {
57
+ return URL.createObjectURL(attachment.file);
58
+ }
59
+ const imagePart = attachment.content?.find((part) => part.type === "image");
60
+ return imagePart && "image" in imagePart ? imagePart.image : null;
21
61
  }
22
- function ArrowDownIcon({ className }) {
23
- return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: _jsx("path", { d: "M12 5v14M19 12l-7 7-7-7" }) }));
62
+ function ComposerAttachmentPreviewCard({ attachment, onRemove, }) {
63
+ const [imageSrc, setImageSrc] = useState(null);
64
+ useEffect(() => {
65
+ const nextSrc = getImageAttachmentSrc(attachment);
66
+ setImageSrc(nextSrc);
67
+ return () => {
68
+ if (nextSrc?.startsWith("blob:")) {
69
+ URL.revokeObjectURL(nextSrc);
70
+ }
71
+ };
72
+ }, [attachment]);
73
+ const isImage = !!imageSrc;
74
+ return (_jsxs("div", { className: cn("group relative overflow-hidden border border-border/70 bg-muted/50 text-foreground", isImage
75
+ ? "h-20 w-20 rounded-xl shadow-[0_12px_30px_-18px_rgba(0,0,0,0.7)]"
76
+ : "inline-flex max-w-[220px] items-center gap-2 rounded-lg px-2.5 py-2 text-xs"), children: [isImage ? (_jsxs(_Fragment, { children: [_jsx("img", { src: imageSrc, alt: attachment.name, className: "h-full w-full object-cover" }), _jsx("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", children: _jsx("div", { className: "truncate text-[10px] font-medium text-white/95", children: attachment.name }) })] })) : (_jsxs(_Fragment, { children: [_jsx("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", children: attachment.name.split(".").pop() || "file" }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate font-medium", children: attachment.name }), _jsx("div", { className: "text-[11px] text-muted-foreground", children: attachment.contentType || attachment.type })] })] })), _jsx("button", { type: "button", onClick: () => onRemove(attachment.id), className: cn("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", isImage
77
+ ? "right-1.5 top-1.5 opacity-100 md:opacity-0 md:group-hover:opacity-100"
78
+ : "right-1.5 top-1.5"), "aria-label": `Remove ${attachment.name}`, children: _jsx(IconX, { className: "h-3 w-3" }) })] }));
24
79
  }
25
- function CopyIcon({ className }) {
26
- return (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), _jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }));
80
+ function ComposerAttachmentPreviewStrip() {
81
+ const attachments = useComposer((state) => state.attachments);
82
+ const aui = useAui();
83
+ const handleRemove = useCallback((id) => {
84
+ void aui.composer().attachment({ id }).remove();
85
+ }, [aui]);
86
+ if (attachments.length === 0)
87
+ return null;
88
+ return (_jsx("div", { className: "flex flex-wrap gap-2 px-2 pt-2", children: attachments.map((attachment) => (_jsx(ComposerAttachmentPreviewCard, { attachment: attachment, onRemove: handleRemove }, attachment.id))) }));
27
89
  }
28
- // ─── Tool Call Fallback ─────────────────────────────────────────────────────
29
- function ToolCallFallback({ toolName, args, result, }) {
30
- const [expanded, setExpanded] = useState(false);
31
- const isRunning = result === undefined;
32
- const argsStr = Object.entries(args)
33
- .map(([k, v]) => `${k}=${typeof v === "string" ? v : JSON.stringify(v)}`)
34
- .join(", ");
35
- return (_jsxs("div", { className: "my-1", children: [_jsxs("button", { onClick: () => setExpanded(!expanded), className: cn("flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left", isRunning
36
- ? "bg-amber-500/10 text-amber-400"
37
- : "bg-muted text-muted-foreground hover:bg-accent"), children: [_jsx("span", { className: "shrink-0", children: isRunning ? (_jsx("svg", { className: "h-3 w-3 animate-spin", viewBox: "0 0 24 24", fill: "none", children: _jsx("circle", { cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "3", strokeDasharray: "31 62" }) })) : (_jsx(CheckIcon, { className: "h-3 w-3 text-emerald-500" })) }), _jsxs("span", { className: "truncate", children: [_jsx("span", { className: "font-medium", children: toolName }), argsStr && _jsxs("span", { className: "opacity-60 ml-1", children: ["(", argsStr, ")"] })] }), !isRunning && (_jsx(ChevronDownIcon, { className: cn("ml-auto h-3 w-3 shrink-0 opacity-40", expanded && "rotate-180") }))] }), expanded && result !== undefined && (_jsx("div", { className: "mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs font-mono text-muted-foreground whitespace-pre-wrap break-all max-h-48 overflow-y-auto", children: typeof result === "string"
90
+ // ─── Tool Call Display ──────────────────────────────────────────────────────
91
+ // Shared presentational component for rendering a tool call pill + result.
92
+ // Used by both the normal message path (ToolCallFallback) and the reconnect
93
+ // stream path (ReconnectStreamMessage). All state is passed as props — no
94
+ // assistant-ui hooks here.
95
+ function ToolCallDisplay({ toolName, argsText, args, result, isRunning, }) {
96
+ const streamRef = useRef(null);
97
+ const isAgentCall = toolName.startsWith("agent:");
98
+ const [expanded, setExpanded] = useState(isAgentCall);
99
+ const agentName = isAgentCall ? toolName.slice(6) : null;
100
+ const isAgentError = isAgentCall && result === "Error calling agent";
101
+ const agentStreamText = isAgentCall ? (argsText ?? "") : "";
102
+ const hasStreamText = agentStreamText.length > 0;
103
+ // NOTE: All hooks must be above any conditional returns
104
+ useEffect(() => {
105
+ if (isAgentCall && isRunning && streamRef.current) {
106
+ streamRef.current.scrollTop = streamRef.current.scrollHeight;
107
+ }
108
+ }, [agentStreamText, isAgentCall, isRunning]);
109
+ // Render spawn-task as AgentTaskCard once the result is available
110
+ if (toolName === "spawn-task" && result) {
111
+ try {
112
+ const parsed = JSON.parse(result);
113
+ if (parsed.taskId && parsed.threadId) {
114
+ return (_jsx(AgentTaskCard, { taskId: parsed.taskId, threadId: parsed.threadId, description: parsed.description ||
115
+ args?.task ||
116
+ "Sub-agent task", onOpen: (tid) => {
117
+ window.dispatchEvent(new CustomEvent("agent-task-open", {
118
+ detail: {
119
+ threadId: tid,
120
+ description: parsed.description ||
121
+ args?.task ||
122
+ "",
123
+ name: parsed.name || "",
124
+ },
125
+ }));
126
+ } }));
127
+ }
128
+ }
129
+ catch {
130
+ // Fall through to default pill rendering
131
+ }
132
+ }
133
+ const argsStr = isAgentCall
134
+ ? ""
135
+ : Object.entries(args)
136
+ .map(([k, v]) => `${k}=${typeof v === "string" ? v : JSON.stringify(v)}`)
137
+ .join(", ");
138
+ const displayName = isAgentCall
139
+ ? isRunning
140
+ ? `Asking ${agentName}...`
141
+ : isAgentError
142
+ ? `Error asking ${agentName}`
143
+ : `Asked ${agentName}`
144
+ : toolName;
145
+ const canExpand = isAgentCall ? hasStreamText : result !== undefined;
146
+ const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;
147
+ return (_jsxs("div", { className: "my-1 overflow-hidden", children: [_jsxs("button", { onClick: () => canExpand && setExpanded(!isExpanded), className: cn("flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left overflow-hidden", isRunning
148
+ ? "bg-muted text-muted-foreground"
149
+ : "bg-muted text-muted-foreground hover:bg-accent"), children: [_jsx("span", { className: "shrink-0", children: isRunning ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : isAgentError ? (_jsx(IconCircleX, { className: "h-3 w-3 text-destructive" })) : result !== undefined ? (_jsx(IconCheck, { className: "h-3 w-3 text-emerald-500" })) : (_jsx(IconSquareFilled, { className: "h-3 w-3 text-muted-foreground" })) }), _jsxs("span", { className: "truncate min-w-0", children: [_jsx("span", { className: "font-medium", children: displayName }), argsStr && _jsxs("span", { className: "opacity-60 ml-1", children: ["(", argsStr, ")"] })] }), canExpand && !isRunning && (_jsx(IconChevronDown, { className: cn("ml-auto h-3 w-3 shrink-0 opacity-40", isExpanded && "rotate-180") }))] }), isExpanded && isAgentCall && hasStreamText && (_jsx("div", { ref: streamRef, 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", children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], children: agentStreamText }) })), isExpanded && !isAgentCall && result !== undefined && (_jsx("div", { className: "mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs font-mono text-muted-foreground whitespace-pre-wrap break-all max-h-48 overflow-y-auto", children: typeof result === "string"
38
150
  ? result
39
151
  : JSON.stringify(result, null, 2) }))] }));
40
152
  }
153
+ function ToolCallFallback({ toolName, args, argsText, result, }) {
154
+ const thread = useThread();
155
+ const isRunning = result === undefined && thread.isRunning;
156
+ return (_jsx(ToolCallDisplay, { toolName: toolName, args: args, argsText: argsText, result: typeof result === "string"
157
+ ? result
158
+ : result !== undefined
159
+ ? JSON.stringify(result)
160
+ : undefined, isRunning: isRunning }));
161
+ }
162
+ // ─── Reconnect Stream Message ───────────────────────────────────────────────
163
+ // Renders the agent's in-progress response during reconnection (outside
164
+ // assistant-ui's runtime). Uses the same visual styling as normal messages.
165
+ function ReconnectStreamMessage({ content }) {
166
+ const endRef = useRef(null);
167
+ useEffect(() => {
168
+ endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" });
169
+ }, [content]);
170
+ return (_jsx("div", { className: "flex justify-start", children: _jsxs("div", { className: "max-w-[95%] text-sm leading-relaxed text-foreground space-y-1", children: [content.map((part, i) => {
171
+ if (part.type === "text") {
172
+ return (_jsx("div", { className: "agent-markdown break-words", children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], children: part.text }) }, `reconnect-text-${i}`));
173
+ }
174
+ if (part.type === "tool-call") {
175
+ return (_jsx(ToolCallDisplay, { toolName: part.toolName, argsText: part.argsText, args: part.args, result: part.result, isRunning: part.result === undefined }, `reconnect-tool-${i}`));
176
+ }
177
+ return null;
178
+ }), _jsx("div", { ref: endRef })] }) }));
179
+ }
41
180
  // ─── Message Components ─────────────────────────────────────────────────────
181
+ const mentionIconProps = {
182
+ size: 14,
183
+ className: "shrink-0 text-muted-foreground",
184
+ };
185
+ function MentionChipIcon({ icon }) {
186
+ switch (icon) {
187
+ case "folder":
188
+ return _jsx(IconFolder, { ...mentionIconProps });
189
+ case "document":
190
+ return _jsx(IconFileText, { ...mentionIconProps });
191
+ case "form":
192
+ return _jsx(IconCheckbox, { ...mentionIconProps });
193
+ case "email":
194
+ return _jsx(IconMail, { ...mentionIconProps });
195
+ case "user":
196
+ return _jsx(IconUser, { ...mentionIconProps });
197
+ case "deck":
198
+ return _jsx(IconPresentation, { ...mentionIconProps });
199
+ case "agent":
200
+ return _jsx(IconMessageChatbot, { ...mentionIconProps });
201
+ case "file":
202
+ return _jsx(IconFile, { ...mentionIconProps });
203
+ default:
204
+ return _jsx(IconStack2, { ...mentionIconProps });
205
+ }
206
+ }
207
+ // Matches rich mention format: @[label|icon] or plain @word
208
+ const richMentionPattern = /@\[([^\]|]+)\|([^\]]+)\]/g;
209
+ const plainMentionPattern = /((?:^|(?<=\s))@(\w+))/g;
210
+ function UserMessageText({ text }) {
211
+ // Strip injected <context>...</context> blocks before display
212
+ const displayText = text
213
+ .replace(/<context>[\s\S]*?<\/context>\n?/g, "")
214
+ .trim();
215
+ const parts = [];
216
+ let lastIndex = 0;
217
+ let match;
218
+ let hasRichMentions = false;
219
+ // First try rich mentions (@[label|icon])
220
+ richMentionPattern.lastIndex = 0;
221
+ while ((match = richMentionPattern.exec(displayText)) !== null) {
222
+ hasRichMentions = true;
223
+ const matchStart = match.index;
224
+ if (matchStart > lastIndex) {
225
+ parts.push(displayText.slice(lastIndex, matchStart));
226
+ }
227
+ const label = match[1];
228
+ const icon = match[2];
229
+ parts.push(_jsxs("span", { 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", "data-mention-label": label, children: [_jsx(MentionChipIcon, { icon: icon }), _jsx("span", { className: "truncate", children: label })] }, matchStart));
230
+ lastIndex = matchStart + match[0].length;
231
+ }
232
+ if (hasRichMentions) {
233
+ if (lastIndex < displayText.length) {
234
+ parts.push(displayText.slice(lastIndex));
235
+ }
236
+ return _jsx(_Fragment, { children: parts });
237
+ }
238
+ // Fallback: plain @word mentions (for older messages)
239
+ plainMentionPattern.lastIndex = 0;
240
+ while ((match = plainMentionPattern.exec(displayText)) !== null) {
241
+ const matchStart = match.index;
242
+ if (matchStart > lastIndex) {
243
+ parts.push(displayText.slice(lastIndex, matchStart));
244
+ }
245
+ const mentionName = match[2];
246
+ parts.push(_jsxs("span", { 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", "data-mention-label": mentionName, children: ["@", mentionName] }, matchStart));
247
+ lastIndex = matchStart + match[0].length;
248
+ }
249
+ if (lastIndex < displayText.length) {
250
+ parts.push(displayText.slice(lastIndex));
251
+ }
252
+ return _jsx(_Fragment, { children: parts.length > 0 ? parts : displayText });
253
+ }
254
+ function UserMessageAttachments() {
255
+ const messageRuntime = useMessageRuntime();
256
+ const msg = messageRuntime.getState();
257
+ // Content parts may include image/file types from attachments
258
+ const parts = msg.content;
259
+ const images = parts.filter((p) => p.type === "image" && p.image);
260
+ const files = parts.filter((p) => p.type === "file");
261
+ if (images.length === 0 && files.length === 0)
262
+ return null;
263
+ return (_jsxs("div", { className: "flex flex-wrap justify-end gap-1.5 mb-1.5", children: [images.map((img, i) => (_jsx("div", { className: "h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50", children: _jsx("img", { src: img.image, alt: "attachment", className: "h-full w-full object-cover" }) }, i))), files.map((file, i) => (_jsxs("div", { 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", children: [_jsx(IconFile, { className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "truncate max-w-[120px]", children: file.name || "file" })] }, `f-${i}`)))] }));
264
+ }
42
265
  function UserMessage() {
43
- return (_jsx("div", { className: "flex justify-end", children: _jsx("div", { className: "max-w-[85%] rounded-lg bg-accent text-foreground px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words", children: _jsx(MessagePrimitive.Parts, { components: {
44
- Text: ({ text }) => _jsx(_Fragment, { children: text }),
45
- } }) }) }));
266
+ const [expanded, setExpanded] = useState(false);
267
+ const [isExpandable, setIsExpandable] = useState(false);
268
+ const contentRef = useRef(null);
269
+ useEffect(() => {
270
+ const el = contentRef.current;
271
+ if (!el)
272
+ return;
273
+ const measure = () => {
274
+ setIsExpandable(el.scrollHeight > 200);
275
+ };
276
+ measure();
277
+ const observer = new ResizeObserver(measure);
278
+ observer.observe(el);
279
+ return () => observer.disconnect();
280
+ }, []);
281
+ return (_jsx("div", { className: "flex justify-end", style: { contentVisibility: "auto" }, children: _jsxs("div", { className: "max-w-[85%]", children: [_jsx(UserMessageAttachments, {}), _jsxs("div", { className: "relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground", onCopy: (e) => {
282
+ const selection = window.getSelection();
283
+ if (!selection || selection.rangeCount === 0)
284
+ return;
285
+ const fragment = selection.getRangeAt(0).cloneContents();
286
+ const mentions = fragment.querySelectorAll("[data-mention-label]");
287
+ if (mentions.length === 0)
288
+ return;
289
+ e.preventDefault();
290
+ mentions.forEach((el) => {
291
+ el.textContent = `@${el.getAttribute("data-mention-label")}`;
292
+ });
293
+ const div = document.createElement("div");
294
+ div.appendChild(fragment);
295
+ e.clipboardData.setData("text/plain", div.textContent || "");
296
+ }, children: [_jsx("div", { ref: contentRef, className: cn("whitespace-pre-wrap break-words", !expanded && isExpandable && "max-h-[200px] overflow-hidden"), children: _jsx(MessagePrimitive.Parts, { components: {
297
+ Text: UserMessageText,
298
+ } }) }), !expanded && isExpandable && (_jsx("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" }))] }), isExpandable && (_jsxs("button", { type: "button", onClick: () => setExpanded((prev) => !prev), 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", children: [_jsx(IconChevronDown, { className: cn("h-3.5 w-3.5 transition-transform", expanded && "rotate-180") }), expanded ? "Collapse" : "Expand"] }))] }) }));
46
299
  }
47
300
  function AssistantMessage() {
48
301
  const [copied, setCopied] = useState(false);
49
302
  const messageRuntime = useMessageRuntime();
303
+ const thread = useThread();
304
+ const msg = messageRuntime.getState();
305
+ const isLast = thread.messages.length > 0 &&
306
+ thread.messages[thread.messages.length - 1].id === msg.id;
307
+ const isComplete = !isLast || !thread.isRunning;
50
308
  const handleCopy = useCallback(() => {
51
- const msg = messageRuntime.getState();
52
- const text = msg.content
309
+ const m = messageRuntime.getState();
310
+ const text = m.content
53
311
  .filter((p) => p.type === "text")
54
312
  .map((p) => p.text)
55
313
  .join("\n");
@@ -57,16 +315,23 @@ function AssistantMessage() {
57
315
  setCopied(true);
58
316
  setTimeout(() => setCopied(false), 2000);
59
317
  }, [messageRuntime]);
60
- return (_jsxs("div", { className: "group relative", children: [_jsx("div", { className: "max-w-[95%] text-sm leading-relaxed text-foreground", children: _jsx(MessagePrimitive.Parts, { components: {
61
- Text: ({ text }) => (_jsx("div", { className: "whitespace-pre-wrap break-words", children: text })),
318
+ return (_jsxs("div", { className: "group relative", style: { contentVisibility: isComplete ? "auto" : "visible" }, children: [_jsx("div", { className: "max-w-[95%] text-sm leading-relaxed text-foreground", children: _jsx(MessagePrimitive.Parts, { components: {
319
+ Text: MarkdownText,
62
320
  tools: {
63
321
  Fallback: ToolCallFallback,
64
322
  },
65
- } }) }), _jsx("div", { className: "mt-1 flex items-center gap-0.5 opacity-0 group-hover:opacity-100", children: _jsx("button", { onClick: handleCopy, className: "flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", children: copied ? (_jsx(CheckIcon, { className: "h-3.5 w-3.5" })) : (_jsx(CopyIcon, { className: "h-3.5 w-3.5" })) }) })] }));
323
+ } }) }), isComplete && (_jsx("div", { className: "mt-1 flex items-center gap-0.5 opacity-0 group-hover:opacity-100", children: _jsx("button", { onClick: handleCopy, className: "flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", children: copied ? (_jsx(IconCheck, { className: "h-3 w-3" })) : (_jsx(IconCopy, { className: "h-3 w-3" })) }) }))] }));
66
324
  }
67
325
  // ─── Thinking Indicator ─────────────────────────────────────────────────────
68
326
  function ThinkingIndicator() {
69
- return (_jsxs("div", { className: "flex items-center gap-1.5 text-muted-foreground py-2", children: [_jsx("div", { className: "flex gap-1", children: [0, 1, 2].map((i) => (_jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-current opacity-40 animate-bounce", style: { animationDelay: `${i * 0.15}s` } }, i))) }), _jsx("span", { className: "text-xs", children: "Thinking..." })] }));
327
+ const [dots, setDots] = useState(0);
328
+ useEffect(() => {
329
+ const interval = setInterval(() => {
330
+ setDots((d) => (d + 1) % 4);
331
+ }, 400);
332
+ return () => clearInterval(interval);
333
+ }, []);
334
+ return (_jsx("div", { className: "flex items-center text-muted-foreground", children: _jsxs("span", { className: "text-xs", children: ["Thinking", ".".repeat(dots)] }) }));
70
335
  }
71
336
  // ─── API Key Setup Card ─────────────────────────────────────────────────────
72
337
  function ApiKeySetupCard({ apiUrl }) {
@@ -100,9 +365,9 @@ function ApiKeySetupCard({ apiUrl }) {
100
365
  }
101
366
  };
102
367
  if (saved) {
103
- return (_jsx("div", { className: "mx-4 my-6 rounded-lg border border-emerald-500/30 bg-emerald-500/5 p-4", children: _jsxs("div", { className: "flex items-center gap-2 text-sm text-emerald-400", children: [_jsx(CheckIcon, { className: "h-4 w-4" }), "API key saved. Reloading..."] }) }));
368
+ return (_jsx("div", { className: "mx-4 my-6 rounded-lg border border-emerald-500/30 bg-emerald-500/5 p-4", children: _jsxs("div", { className: "flex items-center gap-2 text-sm text-emerald-400", children: [_jsx(IconCheck, { className: "h-4 w-4" }), "API key saved. Reloading..."] }) }));
104
369
  }
105
- return (_jsxs("div", { className: "mx-4 my-6 rounded-lg border border-border bg-card p-5", children: [_jsxs("div", { className: "flex items-center gap-3 mb-3", children: [_jsx("div", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted", children: _jsx(SparklesIcon, { className: "h-4.5 w-4.5 text-muted-foreground" }) }), _jsxs("div", { children: [_jsx("h3", { className: "text-sm font-medium text-foreground", children: "Connect your AI" }), _jsx("p", { className: "text-xs text-muted-foreground mt-0.5", children: "Add an Anthropic API key to enable the agent" })] })] }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "rounded-md bg-muted/50 px-3 py-2.5 text-xs text-muted-foreground leading-relaxed", children: [_jsxs("p", { children: ["1. Go to", " ", _jsx("a", { href: "https://console.anthropic.com/settings/keys", target: "_blank", rel: "noopener noreferrer", className: "underline text-foreground/80 hover:text-foreground", children: "console.anthropic.com/settings/keys" })] }), _jsx("p", { className: "mt-1", children: "2. Create a new API key and paste it below" })] }), _jsx("input", { type: "password", value: apiKey, onChange: (e) => {
370
+ return (_jsxs("div", { className: "mx-4 my-6 rounded-lg border border-border bg-card p-5", children: [_jsxs("div", { className: "flex items-center gap-3 mb-3", children: [_jsx("div", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted", children: _jsx(IconSparkles, { className: "h-4.5 w-4.5 text-muted-foreground" }) }), _jsxs("div", { children: [_jsx("h3", { className: "text-sm font-medium text-foreground", children: "Connect your AI" }), _jsx("p", { className: "text-xs text-muted-foreground mt-0.5", children: "Add an Anthropic API key to enable the agent" })] })] }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "rounded-md bg-muted/50 px-3 py-2.5 text-xs text-muted-foreground leading-relaxed", children: [_jsxs("p", { children: ["1. Go to", " ", _jsx("a", { href: "https://console.anthropic.com/settings/keys", target: "_blank", rel: "noopener noreferrer", className: "underline text-foreground/80 hover:text-foreground", children: "console.anthropic.com/settings/keys" })] }), _jsx("p", { className: "mt-1", children: "2. Create a new API key and paste it below" })] }), _jsx("input", { type: "password", value: apiKey, onChange: (e) => {
106
371
  setApiKey(e.target.value);
107
372
  setError(null);
108
373
  }, onKeyDown: (e) => {
@@ -110,50 +375,386 @@ function ApiKeySetupCard({ apiUrl }) {
110
375
  handleSave();
111
376
  }, placeholder: "sk-ant-...", className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/50 outline-none focus:ring-1 focus:ring-ring", autoComplete: "off" }), error && _jsx("p", { className: "text-xs text-destructive", children: error }), _jsx("button", { onClick: handleSave, disabled: saving || !apiKey.trim(), className: "w-full rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90 disabled:opacity-40 disabled:cursor-not-allowed", children: saving ? "Saving..." : "Save API key" })] })] }));
112
377
  }
113
- // ─── Main Component ─────────────────────────────────────────────────────────
114
- // ─── Terminal Icon ──────────────────────────────────────────────────────────
115
- function TerminalIcon({ className }) {
116
- return (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("polyline", { points: "4 17 10 11 4 5" }), _jsx("line", { x1: "12", y1: "19", x2: "20", y2: "19" })] }));
117
- }
118
- // ─── Queue Composer ──────────────────────────────────────────────────────────
119
- // Custom composer shown while the agent is running. Uses a plain textarea
120
- // (not ComposerPrimitive) so we can submit without interrupting the active run.
121
- function QueueComposer({ composerRef, addToQueue, queuedCount, }) {
122
- const [value, setValue] = useState("");
123
- const handleSubmit = useCallback(() => {
124
- const text = value.trim();
125
- if (!text)
126
- return;
127
- addToQueue(text);
128
- setValue("");
129
- // Re-focus after submit
130
- setTimeout(() => composerRef.current?.focus(), 0);
131
- }, [value, addToQueue, composerRef]);
132
- return (_jsxs("div", { className: "flex items-center gap-2 rounded-lg border border-input bg-background px-3 py-2 focus-within:ring-1 focus-within:ring-ring", children: [_jsx("textarea", { ref: composerRef, value: value, onChange: (e) => setValue(e.target.value), onKeyDown: (e) => {
133
- if (e.key === "Enter" && !e.shiftKey) {
134
- e.preventDefault();
135
- handleSubmit();
136
- }
137
- }, placeholder: queuedCount > 0
138
- ? `${queuedCount} queued — type another...`
139
- : "Queue a message...", className: "flex-1 resize-none bg-transparent text-sm text-foreground placeholder:text-muted-foreground outline-none leading-relaxed min-h-[24px] max-h-[120px]", rows: 1 }), _jsx("button", { onClick: handleSubmit, disabled: !value.trim(), className: "shrink-0 flex h-8 w-8 items-center justify-center rounded-md bg-primary/70 text-primary-foreground hover:bg-primary disabled:opacity-30 disabled:cursor-not-allowed", title: "Queue message", children: _jsx(SendIcon, { className: "h-3.5 w-3.5" }) })] }));
378
+ // ─── Builder.io CTA Card (usage limit / code changes / CLI) ─────────────────
379
+ export function BuilderCtaCard({ reason, usageCents, limitCents, }) {
380
+ const appName = typeof window !== "undefined"
381
+ ? window.location.hostname.split(".")[0]
382
+ : "app";
383
+ const cloneCommand = `npx agent-native create ${appName}`;
384
+ const title = reason === "usage_limit"
385
+ ? "Free usage limit reached"
386
+ : reason === "code_changes"
387
+ ? "Code changes require a local setup"
388
+ : "Get full access";
389
+ const description = reason === "usage_limit"
390
+ ? `You've used $${((usageCents ?? 0) / 100).toFixed(2)} of your $${((limitCents ?? 100) / 100).toFixed(2)} free tier. Connect to Builder.io for unlimited usage, or clone this app to run it locally with your own API key.`
391
+ : reason === "code_changes"
392
+ ? "This app is running in hosted mode. To make code changes, connect to Builder.io or clone and run locally."
393
+ : "This hosted app has limited AI features. Connect to Builder.io for the full experience, or clone and run locally with your own API key.";
394
+ return (_jsxs("div", { className: "mx-4 my-6 rounded-lg border border-border bg-card p-5", children: [_jsxs("div", { className: "flex items-center gap-3 mb-3", children: [_jsx("div", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted", children: _jsx(IconSparkles, { className: "h-4.5 w-4.5 text-muted-foreground" }) }), _jsxs("div", { children: [_jsx("h3", { className: "text-sm font-medium text-foreground", children: title }), _jsx("p", { className: "text-xs text-muted-foreground mt-0.5", children: description })] })] }), _jsxs("div", { className: "space-y-2.5", children: [_jsx("a", { href: "https://www.builder.io/m/agent-native", target: "_blank", rel: "noopener noreferrer", className: "flex w-full items-center justify-center rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90", children: "Connect to Builder.io" }), _jsxs("div", { className: "relative", children: [_jsx("div", { className: "absolute inset-0 flex items-center", children: _jsx("span", { className: "w-full border-t border-border" }) }), _jsx("div", { className: "relative flex justify-center text-xs", children: _jsx("span", { className: "bg-card px-2 text-muted-foreground", children: "or" }) })] }), _jsxs("div", { className: "rounded-md bg-muted/50 px-3 py-2.5", children: [_jsx("p", { className: "text-xs text-muted-foreground mb-1.5", children: "Clone and run locally:" }), _jsx("code", { className: "block text-xs text-foreground/80 font-mono break-all select-all", children: cloneCommand })] })] })] }));
140
395
  }
141
- const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateText, suggestions, showHeader = true, showDevHint = true, onSwitchToCli, className, apiUrl = "/api/agent-chat", }, ref) {
396
+ export const CHAT_STORAGE_PREFIX = "agent-chat:";
397
+ /** Remove persisted chat for a given tabId (or "default"). */
398
+ export function clearChatStorage(tabId) {
399
+ try {
400
+ sessionStorage.removeItem(`${CHAT_STORAGE_PREFIX}${tabId || "default"}`);
401
+ }
402
+ catch { }
403
+ }
404
+ /**
405
+ * Ensure all messages in a thread repository have `metadata: {}`.
406
+ * assistant-ui's _getMessageRuntime accesses `message.metadata.submittedFeedback`
407
+ * without null-checking, so server-constructed messages without metadata crash.
408
+ */
409
+ function ensureMessageMetadata(repo) {
410
+ if (!repo?.messages || !Array.isArray(repo.messages))
411
+ return repo;
412
+ for (const entry of repo.messages) {
413
+ // Handle both wrapped ({ message: { ... } }) and flat ({ role, ... }) formats
414
+ const msg = entry?.message ?? entry;
415
+ if (msg && !msg.metadata) {
416
+ msg.metadata = {};
417
+ }
418
+ }
419
+ return repo;
420
+ }
421
+ // Re-export for backwards compatibility
422
+ import { extractThreadMeta } from "../agent/thread-data-builder.js";
423
+ export { extractThreadMeta };
424
+ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateText, suggestions, showHeader = true, onSwitchToCli, className, apiUrl, tabId, threadId, onMessageCountChange, onSaveThread, onGenerateTitle, composerSlot, isNewThread, onSlashCommand, execMode, onExecModeChange, }, ref) {
142
425
  const scrollRef = useRef(null);
143
426
  const thread = useThread();
144
427
  const threadRuntime = useThreadRuntime();
145
- const isRunning = thread.isRunning;
428
+ const isRuntimeRunning = thread.isRunning;
146
429
  const messages = thread.messages;
147
430
  const [missingApiKey, setMissingApiKey] = useState(false);
431
+ const [authError, setAuthError] = useState(null);
432
+ const [usageLimitReached, setUsageLimitReached] = useState(null);
148
433
  const [queuedMessages, setQueuedMessages] = useState([]);
434
+ const [showContinue, setShowContinue] = useState(false);
435
+ const [isReconnecting, setIsReconnecting] = useState(false);
436
+ const [reconnectContent, setReconnectContent] = useState([]);
437
+ // When stop is clicked during reconnect, keep content visible (don't wipe it)
438
+ const [reconnectFrozen, setReconnectFrozen] = useState(false);
439
+ const reconnectRunIdRef = useRef(null);
440
+ const reconnectAbortRef = useRef(null);
441
+ // Nuclear stop: user clicked stop but runtime hasn't cleared yet.
442
+ // This ONLY affects UI display (button + thinking indicator). Submission
443
+ // and queue gating still use the real `isRunning` so we never overlap a
444
+ // new run on top of one that's still cancelling on the server.
445
+ const [forceStopped, setForceStopped] = useState(false);
446
+ // Real running state — drives submission/queue gating. Treat reconnecting
447
+ // to an active run the same as running.
448
+ const isRunning = isRuntimeRunning || isReconnecting;
449
+ // UI-only running state — drives the stop button and thinking indicator.
450
+ // forceStopped lets us flip the indicator off immediately even if the
451
+ // underlying runtime or reconnect state hasn't caught up yet.
452
+ const showRunningInUI = !forceStopped && isRunning;
149
453
  const wasRunningRef = useRef(false);
150
- const composerRef = useRef(null);
454
+ const tiptapRef = useRef(null);
455
+ // ─── Chat persistence ──────────────────────────────────────────────
456
+ const hasRestoredRef = useRef(false);
457
+ const [isRestoring, setIsRestoring] = useState(!!threadId && !isNewThread);
458
+ const onSaveThreadRef = useRef(onSaveThread);
459
+ onSaveThreadRef.current = onSaveThread;
460
+ const onGenerateTitleRef = useRef(onGenerateTitle);
461
+ onGenerateTitleRef.current = onGenerateTitle;
462
+ const titleGeneratedRef = useRef(false);
463
+ // Restore messages from server on mount (when threadId is set)
464
+ useEffect(() => {
465
+ if (hasRestoredRef.current)
466
+ return;
467
+ hasRestoredRef.current = true;
468
+ if (threadId) {
469
+ // Load from server
470
+ (async () => {
471
+ try {
472
+ const res = await fetch(`${apiUrl}/threads/${encodeURIComponent(threadId)}`);
473
+ if (!res.ok)
474
+ return;
475
+ const data = await res.json();
476
+ if (data.threadData) {
477
+ const repo = typeof data.threadData === "string"
478
+ ? JSON.parse(data.threadData)
479
+ : data.threadData;
480
+ if (repo?.messages?.length > 0) {
481
+ titleGeneratedRef.current = true; // Don't re-generate for restored threads
482
+ threadRuntime.import(ensureMessageMetadata(repo));
483
+ }
484
+ }
485
+ // Also skip title generation if thread already has a title
486
+ if (data.title) {
487
+ titleGeneratedRef.current = true;
488
+ }
489
+ // Check if there's an active run for this thread (e.g. after hot reload)
490
+ try {
491
+ const runRes = await fetch(`${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`);
492
+ if (runRes.ok) {
493
+ const runInfo = await runRes.json();
494
+ // If the run already completed, just re-fetch thread data
495
+ // (don't enter "Thinking." reconnection mode)
496
+ if (runInfo.status !== "running") {
497
+ try {
498
+ const refreshRes = await fetch(`${apiUrl}/threads/${encodeURIComponent(threadId)}`);
499
+ if (refreshRes.ok) {
500
+ const refreshData = await refreshRes.json();
501
+ if (refreshData.threadData) {
502
+ const repo = typeof refreshData.threadData === "string"
503
+ ? JSON.parse(refreshData.threadData)
504
+ : refreshData.threadData;
505
+ if (repo?.messages?.length > 0) {
506
+ threadRuntime.import(ensureMessageMetadata(repo));
507
+ }
508
+ }
509
+ }
510
+ }
511
+ catch { }
512
+ // Skip reconnection entirely
513
+ }
514
+ else {
515
+ // Agent is still running — subscribe to live SSE stream
516
+ reconnectRunIdRef.current = runInfo.runId;
517
+ setIsReconnecting(true);
518
+ setReconnectContent([]);
519
+ // Signal tab running indicator
520
+ window.dispatchEvent(new CustomEvent("builder.chatRunning", {
521
+ detail: { isRunning: true, tabId: tabId || threadId },
522
+ }));
523
+ // Create AbortController before the async call so stop button
524
+ // can abort it even if clicked before the function body runs.
525
+ const abortCtrl = new AbortController();
526
+ reconnectAbortRef.current = abortCtrl;
527
+ const streamReconnect = async () => {
528
+ try {
529
+ const sseRes = await fetch(`${apiUrl}/runs/${encodeURIComponent(runInfo.runId)}/events?after=0`, { signal: abortCtrl.signal });
530
+ if (sseRes.ok && sseRes.body) {
531
+ const content = [];
532
+ const toolCallCounter = { value: 0 };
533
+ // Throttle React state updates via requestAnimationFrame
534
+ let rafPending = false;
535
+ let latestSnapshot = [];
536
+ const scheduleUpdate = (snapshot) => {
537
+ latestSnapshot = snapshot;
538
+ if (!rafPending) {
539
+ rafPending = true;
540
+ requestAnimationFrame(() => {
541
+ rafPending = false;
542
+ setReconnectContent(latestSnapshot);
543
+ });
544
+ }
545
+ };
546
+ await readSSEStreamRaw(sseRes.body, content, toolCallCounter, tabId, scheduleUpdate);
547
+ // Final update with complete content
548
+ setReconnectContent([...content]);
549
+ }
550
+ }
551
+ catch {
552
+ // Stream error or abort — fall through to re-fetch
553
+ }
554
+ // Poll for thread data — server's updateThreadData may not have
555
+ // committed yet when the SSE `done` event fires, so retry until
556
+ // an assistant message appears (up to ~5 s) before clearing.
557
+ setReconnectFrozen(true);
558
+ let loaded = false;
559
+ for (let attempt = 0; attempt < 10; attempt++) {
560
+ await new Promise((r) => setTimeout(r, 500));
561
+ // If the stop button fired mid-poll, bail out
562
+ if (!reconnectRunIdRef.current)
563
+ break;
564
+ try {
565
+ const refreshRes = await fetch(`${apiUrl}/threads/${encodeURIComponent(threadId)}`);
566
+ if (refreshRes.ok) {
567
+ const refreshData = await refreshRes.json();
568
+ if (refreshData.threadData) {
569
+ const repo = typeof refreshData.threadData === "string"
570
+ ? JSON.parse(refreshData.threadData)
571
+ : refreshData.threadData;
572
+ const hasAssistant = repo?.messages?.some((m) => (m.message?.role ?? m.role) === "assistant");
573
+ if (hasAssistant) {
574
+ threadRuntime.import(ensureMessageMetadata(repo));
575
+ setReconnectContent([]);
576
+ setReconnectFrozen(false);
577
+ loaded = true;
578
+ break;
579
+ }
580
+ }
581
+ }
582
+ }
583
+ catch { }
584
+ }
585
+ // Only clean up if the stop button hasn't already done it
586
+ if (reconnectRunIdRef.current) {
587
+ reconnectAbortRef.current = null;
588
+ // If loaded=true, reconnectContent already cleared above.
589
+ // If loaded=false (timeout), keep content frozen so user sees what happened.
590
+ setIsReconnecting(false);
591
+ reconnectRunIdRef.current = null;
592
+ window.dispatchEvent(new CustomEvent("builder.chatRunning", {
593
+ detail: { isRunning: false, tabId: tabId || threadId },
594
+ }));
595
+ }
596
+ };
597
+ streamReconnect();
598
+ } // end else (running)
599
+ }
600
+ }
601
+ catch {
602
+ // No active run — nothing to reconnect to
603
+ }
604
+ }
605
+ catch {
606
+ // Start fresh
607
+ }
608
+ finally {
609
+ setIsRestoring(false);
610
+ }
611
+ })();
612
+ }
613
+ else {
614
+ // Legacy: restore from sessionStorage
615
+ const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || "default"}`;
616
+ try {
617
+ const saved = sessionStorage.getItem(storageKey);
618
+ if (saved) {
619
+ const repo = JSON.parse(saved);
620
+ if (repo?.messages?.length > 0) {
621
+ threadRuntime.import(ensureMessageMetadata(repo));
622
+ }
623
+ }
624
+ }
625
+ catch { }
626
+ setIsRestoring(false);
627
+ }
628
+ }, [threadId, tabId, apiUrl, threadRuntime]);
629
+ // Generate a title when the first user message is sent
630
+ useEffect(() => {
631
+ if (!hasRestoredRef.current)
632
+ return;
633
+ if (titleGeneratedRef.current)
634
+ return;
635
+ if (messages.length === 0)
636
+ return;
637
+ const firstUserMsg = messages.find((m) => m.role === "user");
638
+ if (!firstUserMsg)
639
+ return;
640
+ // Extract text from the first user message
641
+ const text = "content" in firstUserMsg
642
+ ? Array.isArray(firstUserMsg.content)
643
+ ? firstUserMsg.content
644
+ .filter((p) => p.type === "text")
645
+ .map((p) => p.text)
646
+ .join(" ")
647
+ : typeof firstUserMsg.content === "string"
648
+ ? firstUserMsg.content
649
+ : ""
650
+ : "";
651
+ if (!text.trim())
652
+ return;
653
+ titleGeneratedRef.current = true;
654
+ if (threadId) {
655
+ onGenerateTitleRef.current?.(threadId, text.trim());
656
+ }
657
+ }, [messages, threadId]);
658
+ // Periodically save thread data while the agent is running so refreshes
659
+ // don't lose messages. Saves every 5 seconds while running.
660
+ const savedTitleRef = useRef("");
661
+ const lastSaveTimeRef = useRef(0);
662
+ useEffect(() => {
663
+ if (!hasRestoredRef.current)
664
+ return;
665
+ if (!isRunning)
666
+ return;
667
+ if (messages.length === 0)
668
+ return;
669
+ if (!threadId || !onSaveThreadRef.current)
670
+ return;
671
+ const now = Date.now();
672
+ const timeSinceLastSave = now - lastSaveTimeRef.current;
673
+ if (timeSinceLastSave < 5000)
674
+ return;
675
+ const repo = threadRuntime.export();
676
+ const { title, preview } = extractThreadMeta(repo);
677
+ if (!title)
678
+ return;
679
+ lastSaveTimeRef.current = now;
680
+ savedTitleRef.current = title;
681
+ onSaveThreadRef.current(threadId, {
682
+ threadData: JSON.stringify(repo),
683
+ title,
684
+ preview,
685
+ messageCount: messages.length,
686
+ });
687
+ }, [messages, isRunning, threadId, threadRuntime]);
688
+ // Persist full thread data after each completed response
689
+ useEffect(() => {
690
+ if (!hasRestoredRef.current)
691
+ return;
692
+ if (isRunning)
693
+ return;
694
+ if (messages.length === 0)
695
+ return;
696
+ const repo = threadRuntime.export();
697
+ if (threadId && onSaveThreadRef.current) {
698
+ // Save to server via the hook callback
699
+ const { title, preview } = extractThreadMeta(repo);
700
+ savedTitleRef.current = title;
701
+ onSaveThreadRef.current(threadId, {
702
+ threadData: JSON.stringify(repo),
703
+ title,
704
+ preview,
705
+ messageCount: messages.length,
706
+ });
707
+ }
708
+ else {
709
+ // Legacy: save to sessionStorage
710
+ const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || "default"}`;
711
+ try {
712
+ sessionStorage.setItem(storageKey, JSON.stringify(repo));
713
+ }
714
+ catch { }
715
+ }
716
+ }, [messages, isRunning, threadId, tabId, threadRuntime]);
717
+ useEffect(() => {
718
+ onMessageCountChange?.(messages.length);
719
+ }, [messages.length, onMessageCountChange]);
151
720
  // Listen for missing API key events from the adapter
152
721
  useEffect(() => {
153
722
  const handler = () => setMissingApiKey(true);
154
723
  window.addEventListener("agent-chat:missing-api-key", handler);
155
724
  return () => window.removeEventListener("agent-chat:missing-api-key", handler);
156
725
  }, []);
726
+ // Listen for auth error events from the adapter
727
+ useEffect(() => {
728
+ const handler = (e) => {
729
+ const detail = e.detail;
730
+ setAuthError({ sessionExpired: detail?.reason === "session-expired" });
731
+ };
732
+ window.addEventListener("agent-chat:auth-error", handler);
733
+ return () => window.removeEventListener("agent-chat:auth-error", handler);
734
+ }, []);
735
+ // Listen for usage limit reached events from the adapter
736
+ useEffect(() => {
737
+ const handler = (e) => {
738
+ const detail = e.detail;
739
+ setUsageLimitReached({
740
+ usageCents: detail?.usageCents ?? 0,
741
+ limitCents: detail?.limitCents ?? 100,
742
+ });
743
+ };
744
+ window.addEventListener("agent-chat:usage-limit-reached", handler);
745
+ return () => window.removeEventListener("agent-chat:usage-limit-reached", handler);
746
+ }, []);
747
+ // Listen for loop-limit events from the adapter
748
+ useEffect(() => {
749
+ const handler = (e) => {
750
+ const detail = e.detail;
751
+ if (!tabId || detail?.tabId === tabId) {
752
+ setShowContinue(true);
753
+ }
754
+ };
755
+ window.addEventListener("agent-chat:loop-limit", handler);
756
+ return () => window.removeEventListener("agent-chat:loop-limit", handler);
757
+ }, [tabId]);
157
758
  // Auto-dequeue: when agent finishes running, send the next queued message
158
759
  useEffect(() => {
159
760
  if (wasRunningRef.current && !isRunning && queuedMessages.length > 0) {
@@ -161,23 +762,65 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
161
762
  setQueuedMessages(rest);
162
763
  // Small delay to let the runtime settle after completion
163
764
  setTimeout(() => {
765
+ const content = [{ type: "text", text: next.text }];
766
+ if (next.images) {
767
+ for (const img of next.images) {
768
+ content.push({ type: "image", image: img });
769
+ }
770
+ }
164
771
  threadRuntime.append({
165
772
  role: "user",
166
- content: [{ type: "text", text: next }],
773
+ content,
774
+ ...(next.references && next.references.length > 0
775
+ ? { runConfig: { custom: { references: next.references } } }
776
+ : {}),
167
777
  });
168
778
  }, 100);
169
779
  }
170
780
  wasRunningRef.current = isRunning;
171
781
  }, [isRunning, queuedMessages, threadRuntime]);
172
- const addToQueue = useCallback((text) => {
782
+ // Clear frozen reconnect content + forceStopped only on the false→true
783
+ // transition of isRuntimeRunning (i.e. a NEW run is actually starting).
784
+ // Reacting to "isRuntimeRunning is currently true" would clear the
785
+ // nuclear-stop flag immediately after the user clicks stop, since
786
+ // cancellation is async and isRuntimeRunning is still true at that moment.
787
+ const prevIsRuntimeRunningRef = useRef(isRuntimeRunning);
788
+ useEffect(() => {
789
+ const wasRunning = prevIsRuntimeRunningRef.current;
790
+ prevIsRuntimeRunningRef.current = isRuntimeRunning;
791
+ if (isRuntimeRunning && !wasRunning) {
792
+ if (reconnectFrozen) {
793
+ setReconnectFrozen(false);
794
+ setReconnectContent([]);
795
+ }
796
+ if (forceStopped) {
797
+ setForceStopped(false);
798
+ }
799
+ }
800
+ }, [isRuntimeRunning, reconnectFrozen, forceStopped]);
801
+ // Same transition guard for isReconnecting: only clear forceStopped on
802
+ // the false→true edge (a new reconnect starting on page load).
803
+ const prevIsReconnectingRef = useRef(isReconnecting);
804
+ useEffect(() => {
805
+ const wasReconnecting = prevIsReconnectingRef.current;
806
+ prevIsReconnectingRef.current = isReconnecting;
807
+ if (isReconnecting && !wasReconnecting && forceStopped) {
808
+ setForceStopped(false);
809
+ }
810
+ }, [isReconnecting, forceStopped]);
811
+ const addToQueue = useCallback((text, images, references) => {
812
+ setShowContinue(false);
173
813
  if (isRunning) {
174
- setQueuedMessages((prev) => [...prev, text]);
814
+ setQueuedMessages((prev) => [...prev, { text, images, references }]);
175
815
  }
176
816
  else {
177
- threadRuntime.append({
178
- role: "user",
179
- content: [{ type: "text", text }],
180
- });
817
+ const content = [{ type: "text", text }];
818
+ if (images) {
819
+ for (const img of images) {
820
+ content.push({ type: "image", image: img });
821
+ }
822
+ }
823
+ threadRuntime.append({ role: "user", content });
181
824
  }
182
825
  }, [isRunning, threadRuntime]);
183
826
  // Expose imperative handle
@@ -191,27 +834,136 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
191
834
  isRunning() {
192
835
  return thread.isRunning;
193
836
  },
837
+ focusComposer() {
838
+ tiptapRef.current?.focus();
839
+ },
194
840
  }), [addToQueue, thread.isRunning]);
195
- // Auto-scroll on new messages or queued messages
841
+ // Track whether user has scrolled away from bottom
842
+ const isNearBottomRef = useRef(true);
843
+ const [showScrollToBottom, setShowScrollToBottom] = useState(false);
196
844
  useEffect(() => {
845
+ const el = scrollRef.current;
846
+ if (!el)
847
+ return;
848
+ function onScroll() {
849
+ if (!el)
850
+ return;
851
+ const threshold = 40;
852
+ const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < threshold;
853
+ isNearBottomRef.current = nearBottom;
854
+ setShowScrollToBottom(!nearBottom && messages.length > 0);
855
+ }
856
+ el.addEventListener("scroll", onScroll, { passive: true });
857
+ return () => el.removeEventListener("scroll", onScroll);
858
+ }, [messages.length]);
859
+ const scrollToBottom = useCallback(() => {
197
860
  const el = scrollRef.current;
198
861
  if (el) {
199
862
  el.scrollTop = el.scrollHeight;
863
+ isNearBottomRef.current = true;
864
+ setShowScrollToBottom(false);
865
+ }
866
+ }, []);
867
+ // Scroll to bottom when a restored thread finishes loading
868
+ const wasRestoringRef = useRef(isRestoring);
869
+ useEffect(() => {
870
+ if (wasRestoringRef.current && !isRestoring) {
871
+ requestAnimationFrame(() => {
872
+ scrollToBottom();
873
+ });
874
+ }
875
+ wasRestoringRef.current = isRestoring;
876
+ }, [isRestoring, scrollToBottom]);
877
+ // Auto-scroll on new messages or queued messages (only if near bottom)
878
+ useEffect(() => {
879
+ const el = scrollRef.current;
880
+ if (el && isNearBottomRef.current) {
881
+ el.scrollTop = el.scrollHeight;
200
882
  }
201
- }, [messages, isRunning, queuedMessages]);
202
- return (_jsxs("div", { className: cn("flex flex-1 flex-col h-full min-h-0 text-foreground", className), children: [showHeader && (_jsxs("div", { className: "flex h-11 shrink-0 items-center justify-between border-b border-border px-4", children: [_jsx("span", { className: "text-[13px] font-medium text-muted-foreground", children: "Agent" }), _jsxs("div", { className: "flex items-center gap-1", children: [onSwitchToCli && (_jsxs("button", { onClick: onSwitchToCli, className: "flex items-center gap-1 text-[12px] text-muted-foreground hover:text-foreground px-2 py-1 rounded-md hover:bg-accent", title: "Switch to CLI", children: [_jsx(TerminalIcon, { className: "h-3.5 w-3.5" }), "CLI"] })), messages.length > 0 && (_jsx("button", { onClick: () => window.location.reload(), className: "text-[12px] text-muted-foreground hover:text-foreground px-2 py-1 rounded-md hover:bg-accent", children: "Clear" }))] })] })), _jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto min-h-0", children: missingApiKey ? (_jsx("div", { className: "flex flex-col items-center justify-center h-full px-2", children: _jsx(ApiKeySetupCard, { apiUrl: apiUrl }) })) : messages.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center gap-4 py-16 px-4 h-full", children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-muted", children: _jsx(SparklesIcon, { className: "h-5 w-5 text-muted-foreground" }) }), _jsx("p", { className: "text-sm text-muted-foreground text-center max-w-[240px]", children: emptyStateText ?? "How can I help you?" }), suggestions && suggestions.length > 0 && (_jsx("div", { className: "flex flex-col gap-1.5 w-full max-w-[280px]", children: suggestions.map((suggestion) => (_jsx("button", { onClick: () => {
883
+ }, [messages, queuedMessages]);
884
+ // Continuous auto-scroll while streaming (only if near bottom)
885
+ useEffect(() => {
886
+ if (!isRunning)
887
+ return;
888
+ const el = scrollRef.current;
889
+ if (!el)
890
+ return;
891
+ const interval = setInterval(() => {
892
+ if (isNearBottomRef.current) {
893
+ el.scrollTop = el.scrollHeight;
894
+ }
895
+ }, 100);
896
+ return () => clearInterval(interval);
897
+ }, [isRunning]);
898
+ return (_jsxs("div", { className: cn("flex flex-1 flex-col h-full min-h-0 text-foreground", className), children: [showHeader && (_jsxs("div", { className: "flex h-11 shrink-0 items-center justify-between border-b border-border px-4", children: [_jsx("span", { className: "text-[13px] font-medium text-muted-foreground", children: "Agent" }), _jsx("div", { className: "flex items-center gap-1", children: onSwitchToCli && (_jsxs("button", { onClick: onSwitchToCli, className: "flex items-center gap-1 text-[12px] text-muted-foreground hover:text-foreground px-2 py-1 rounded-md hover:bg-accent", title: "Switch to CLI", children: [_jsx(IconTerminal, { className: "h-3.5 w-3.5" }), "CLI"] })) })] })), _jsx("div", { ref: scrollRef, className: "flex-1 overflow-y-auto overflow-x-hidden min-h-0", children: authError ? (_jsxs("div", { className: "flex flex-col items-center justify-center h-full px-4 gap-3", children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-destructive/10", children: _jsx(IconLock, { className: "h-5 w-5 text-destructive" }) }), _jsxs("div", { className: "text-center max-w-[280px]", children: [_jsx("p", { className: "text-sm font-medium text-foreground mb-1", children: authError.sessionExpired
899
+ ? "Session expired"
900
+ : "Authentication required" }), _jsx("p", { className: "text-xs text-muted-foreground leading-relaxed", children: authError.sessionExpired ? ("Your session may have expired. Log out and log back in to reconnect.") : (_jsxs(_Fragment, { children: ["You need to log in to use the agent. If you're running locally, add", " ", _jsx("code", { className: "bg-muted px-1 py-0.5 rounded text-[10px]", children: "AUTH_MODE=local" }), " ", "to your", " ", _jsx("code", { className: "bg-muted px-1 py-0.5 rounded text-[10px]", children: ".env" }), " ", "file and restart the dev server."] })) })] }), _jsxs("div", { className: "flex gap-2", children: [authError.sessionExpired && (_jsx("button", { onClick: async () => {
901
+ try {
902
+ await fetch("/_agent-native/auth/logout", {
903
+ method: "POST",
904
+ });
905
+ }
906
+ catch { }
907
+ window.location.reload();
908
+ }, className: "text-xs text-destructive hover:text-destructive/80 px-3 py-1.5 rounded-md border border-destructive/30 hover:bg-destructive/10", children: "Log out" })), _jsx("button", { onClick: () => {
909
+ setAuthError(null);
910
+ window.location.reload();
911
+ }, className: "text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md border border-border hover:bg-accent", children: "Retry" })] })] })) : missingApiKey ? (_jsx("div", { className: "flex flex-col items-center justify-center h-full px-2", children: _jsx(ApiKeySetupCard, { apiUrl: apiUrl }) })) : usageLimitReached ? (_jsx("div", { className: "flex flex-col items-center justify-center h-full px-2", children: _jsx(BuilderCtaCard, { reason: "usage_limit", usageCents: usageLimitReached.usageCents, limitCents: usageLimitReached.limitCents }) })) : isRestoring ? (_jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "flex justify-end", children: _jsx("div", { className: "h-8 w-32 rounded-lg bg-muted animate-pulse" }) }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("div", { className: "h-4 w-48 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-4 w-64 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-4 w-40 rounded bg-muted animate-pulse" })] })] })) : messages.length === 0 && !isReconnecting ? (_jsxs("div", { className: "flex flex-col items-center justify-center gap-4 py-16 px-4 h-full", children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-muted", children: _jsx(IconSparkles, { className: "h-5 w-5 text-muted-foreground" }) }), _jsx("p", { className: "text-sm text-muted-foreground text-center max-w-[240px]", children: emptyStateText ?? "How can I help you?" }), suggestions && suggestions.length > 0 && (_jsx("div", { className: "flex flex-col gap-1.5 w-full max-w-[280px]", children: suggestions.map((suggestion) => (_jsx("button", { onClick: () => {
203
912
  threadRuntime.append({
204
913
  role: "user",
205
914
  content: [{ type: "text", text: suggestion }],
206
915
  });
207
- }, 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", children: suggestion }, suggestion))) })), showDevHint && onSwitchToCli && (_jsxs("p", { className: "text-xs text-muted-foreground/60 text-center max-w-[260px] mt-2", children: ["In dev mode you can also use the", " ", _jsx("button", { onClick: onSwitchToCli, className: "underline hover:text-muted-foreground", children: "CLI terminal" }), " ", "for full Claude Code capabilities."] }))] })) : (_jsxs("div", { className: "flex flex-col gap-4 px-4 py-4", children: [_jsx(ThreadPrimitive.Messages, { components: {
916
+ }, 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", children: suggestion }, suggestion))) }))] })) : (_jsxs("div", { className: "flex flex-col gap-4 px-4 py-4", children: [_jsx(ThreadPrimitive.Messages, { components: {
208
917
  UserMessage,
209
918
  AssistantMessage,
210
- } }), isRunning && _jsx(ThinkingIndicator, {}), queuedMessages.map((msg, i) => (_jsx("div", { className: "flex justify-end", children: _jsxs("div", { className: "max-w-[85%] rounded-lg bg-accent/50 text-foreground/60 px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-muted-foreground mb-1 font-medium uppercase tracking-wide", children: [_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", className: "h-3 w-3", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("polyline", { points: "12 6 12 12 16 14" })] }), "Queued"] }), msg] }) }, `queued-${i}`)))] })) }), _jsx("div", { className: "shrink-0 border-t border-border px-3 py-3", children: isRunning ? (_jsx(QueueComposer, { composerRef: composerRef, addToQueue: addToQueue, queuedCount: queuedMessages.length })) : (_jsxs(ComposerPrimitive.Root, { className: "flex items-center gap-2 rounded-lg border border-input bg-background px-3 py-2 focus-within:ring-1 focus-within:ring-ring", children: [_jsx(ComposerPrimitive.Input, { placeholder: "Message agent...", submitMode: "enter", cancelOnEscape: true, className: "flex-1 resize-none bg-transparent text-sm text-foreground placeholder:text-muted-foreground outline-none leading-relaxed min-h-[24px] max-h-[120px]", rows: 1 }), _jsx(ComposerPrimitive.Send, { asChild: true, children: _jsx("button", { className: "shrink-0 flex h-8 w-8 items-center justify-center rounded-md bg-primary text-primary-foreground hover:opacity-90 disabled:opacity-30 disabled:cursor-not-allowed", children: _jsx(SendIcon, { className: "h-3.5 w-3.5" }) }) })] })) })] }));
919
+ } }), showContinue && !showRunningInUI && (_jsx("div", { className: "flex justify-center py-2", children: _jsx("button", { type: "button", onClick: () => {
920
+ setShowContinue(false);
921
+ addToQueue("Continue from where you left off.");
922
+ }, className: "rounded-lg border border-border bg-background px-4 py-2 text-sm font-medium text-foreground hover:bg-accent", children: "Continue" }) })), (isReconnecting || reconnectFrozen) &&
923
+ reconnectContent.length > 0 && (_jsx(ReconnectStreamMessage, { content: reconnectContent })), showRunningInUI && _jsx(ThinkingIndicator, {}), queuedMessages.map((msg, i) => (_jsx("div", { className: "flex justify-end", children: _jsxs("div", { className: "max-w-[85%] rounded-lg bg-accent/50 text-foreground/60 px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-muted-foreground mb-1 font-medium uppercase tracking-wide", children: [_jsx(IconClock, { className: "h-3 w-3" }), "Queued"] }), msg.text, msg.images && msg.images.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-1.5 mt-1.5", children: msg.images.map((img, j) => (_jsx("img", { src: img, alt: "", className: "h-12 w-12 rounded object-cover border border-border/50" }, j))) }))] }) }, `queued-${i}`)))] })) }), showScrollToBottom && (_jsx("div", { className: "shrink-0 flex justify-center -mb-1", children: _jsx("button", { type: "button", onClick: scrollToBottom, className: "flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent", "aria-label": "Scroll to bottom", children: _jsx(IconChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" }) }) })), composerSlot, _jsx("div", { className: "shrink-0 px-3 py-2", children: _jsxs(ComposerPrimitive.Root, { className: "flex flex-col rounded-lg border border-input bg-background focus-within:ring-1 focus-within:ring-ring", children: [_jsx(ComposerAttachmentPreviewStrip, {}), _jsx(TiptapComposer, { focusRef: tiptapRef, placeholder: isRunning
924
+ ? queuedMessages.length > 0
925
+ ? `${queuedMessages.length} queued — type another...`
926
+ : "Queue a message..."
927
+ : undefined, onSubmit: isRunning
928
+ ? (text, references) => addToQueue(text, undefined, references.length > 0 ? references : undefined)
929
+ : undefined, onSlashCommand: onSlashCommand, execMode: execMode, onExecModeChange: onExecModeChange, actionButton: showRunningInUI ? (_jsx("button", { onClick: () => {
930
+ // Immediately force the indicator off — belt-and-suspenders
931
+ // so the UI is never stuck even if the runtime or reconnect
932
+ // state takes time (or fails) to clear on its own.
933
+ setForceStopped(true);
934
+ if (isReconnecting) {
935
+ // Abort the server-side run (fire-and-forget)
936
+ if (reconnectRunIdRef.current) {
937
+ fetch(`${apiUrl}/runs/${encodeURIComponent(reconnectRunIdRef.current)}/abort`, { method: "POST" });
938
+ }
939
+ // Abort the client-side SSE stream
940
+ reconnectAbortRef.current?.abort();
941
+ reconnectAbortRef.current = null;
942
+ reconnectRunIdRef.current = null;
943
+ setIsReconnecting(false);
944
+ // Keep reconnectContent visible (frozen) — don't wipe it
945
+ setReconnectFrozen(reconnectContent.length > 0);
946
+ }
947
+ // Always try to cancel the runtime run too (handles the
948
+ // normal non-reconnect path and is a no-op if not running)
949
+ threadRuntime.cancelRun();
950
+ window.dispatchEvent(new CustomEvent("builder.chatRunning", {
951
+ detail: {
952
+ isRunning: false,
953
+ tabId: tabId || threadId,
954
+ },
955
+ }));
956
+ }, className: "shrink-0 flex h-7 w-7 items-center justify-center rounded-md bg-primary text-primary-foreground hover:opacity-90", title: "Stop generating", children: _jsx(IconPlayerStop, { className: "h-3.5 w-3.5" }) })) : undefined })] }) })] }));
211
957
  });
212
- export const AssistantChat = forwardRef(function AssistantChat({ apiUrl, tabId, ...props }, ref) {
213
- const adapter = useMemo(() => createAgentChatAdapter({ apiUrl, tabId }), [apiUrl, tabId]);
214
- const runtime = useLocalRuntime(adapter);
215
- return (_jsx(AssistantRuntimeProvider, { runtime: runtime, children: _jsx(ThreadPrimitive.Root, { className: "flex flex-1 flex-col h-full min-h-0", children: _jsx(AssistantChatInner, { ref: ref, ...props, apiUrl: apiUrl }) }) }));
958
+ export const AssistantChat = forwardRef(function AssistantChat({ apiUrl = "/_agent-native/agent-chat", tabId, threadId, ...props }, ref) {
959
+ const adapter = useMemo(() => createAgentChatAdapter({ apiUrl, tabId, threadId }), [apiUrl, tabId, threadId]);
960
+ const attachmentAdapter = useMemo(() => new CompositeAttachmentAdapter([
961
+ new SimpleImageAttachmentAdapter(),
962
+ new SimpleTextAttachmentAdapter(),
963
+ ]), []);
964
+ const runtime = useLocalRuntime(adapter, {
965
+ adapters: { attachments: attachmentAdapter },
966
+ });
967
+ return (_jsx(AssistantRuntimeProvider, { runtime: runtime, children: _jsx(ThreadPrimitive.Root, { className: "flex flex-1 flex-col h-full min-h-0 overflow-x-hidden", children: _jsx(AssistantChatInner, { ref: ref, ...props, apiUrl: apiUrl, tabId: tabId, threadId: threadId }) }) }));
216
968
  });
217
969
  //# sourceMappingURL=AssistantChat.js.map