@agent-native/core 0.14.8 → 0.15.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 (544) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/builder-engine.js +30 -9
  4. package/dist/agent/engine/builder-engine.js.map +1 -1
  5. package/dist/agent/engine/registry.d.ts.map +1 -1
  6. package/dist/agent/engine/registry.js +14 -4
  7. package/dist/agent/engine/registry.js.map +1 -1
  8. package/dist/agent/production-agent.d.ts.map +1 -1
  9. package/dist/agent/production-agent.js +71 -4
  10. package/dist/agent/production-agent.js.map +1 -1
  11. package/dist/agent/types.d.ts +9 -0
  12. package/dist/agent/types.d.ts.map +1 -1
  13. package/dist/agent/types.js.map +1 -1
  14. package/dist/appearance/actions/change-appearance.d.ts +3 -0
  15. package/dist/appearance/actions/change-appearance.d.ts.map +1 -0
  16. package/dist/appearance/actions/change-appearance.js +29 -0
  17. package/dist/appearance/actions/change-appearance.js.map +1 -0
  18. package/dist/chat-threads/store.d.ts +53 -2
  19. package/dist/chat-threads/store.d.ts.map +1 -1
  20. package/dist/chat-threads/store.js +172 -12
  21. package/dist/chat-threads/store.js.map +1 -1
  22. package/dist/cli/create.d.ts.map +1 -1
  23. package/dist/cli/create.js +114 -37
  24. package/dist/cli/create.js.map +1 -1
  25. package/dist/cli/index.js +30 -4
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/cli/workspace-dev.d.ts +25 -1
  28. package/dist/cli/workspace-dev.d.ts.map +1 -1
  29. package/dist/cli/workspace-dev.js +275 -49
  30. package/dist/cli/workspace-dev.js.map +1 -1
  31. package/dist/client/AgentPanel.d.ts +23 -4
  32. package/dist/client/AgentPanel.d.ts.map +1 -1
  33. package/dist/client/AgentPanel.js +276 -53
  34. package/dist/client/AgentPanel.js.map +1 -1
  35. package/dist/client/AppearancePicker.d.ts +11 -0
  36. package/dist/client/AppearancePicker.d.ts.map +1 -0
  37. package/dist/client/AppearancePicker.js +16 -0
  38. package/dist/client/AppearancePicker.js.map +1 -0
  39. package/dist/client/AssistantChat.d.ts +35 -0
  40. package/dist/client/AssistantChat.d.ts.map +1 -1
  41. package/dist/client/AssistantChat.js +315 -32
  42. package/dist/client/AssistantChat.js.map +1 -1
  43. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  44. package/dist/client/ConnectBuilderCard.js +5 -2
  45. package/dist/client/ConnectBuilderCard.js.map +1 -1
  46. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  47. package/dist/client/ErrorBoundary.js +8 -10
  48. package/dist/client/ErrorBoundary.js.map +1 -1
  49. package/dist/client/FeedbackButton.d.ts.map +1 -1
  50. package/dist/client/FeedbackButton.js +1 -1
  51. package/dist/client/FeedbackButton.js.map +1 -1
  52. package/dist/client/MultiTabAssistantChat.d.ts +13 -1
  53. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  54. package/dist/client/MultiTabAssistantChat.js +217 -38
  55. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  56. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  57. package/dist/client/NewWorkspaceAppFlow.js +37 -14
  58. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  59. package/dist/client/agent-chat-adapter.d.ts +5 -0
  60. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  61. package/dist/client/agent-chat-adapter.js +4 -0
  62. package/dist/client/agent-chat-adapter.js.map +1 -1
  63. package/dist/client/agent-sidebar-state.d.ts +12 -0
  64. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  65. package/dist/client/agent-sidebar-state.js +8 -0
  66. package/dist/client/agent-sidebar-state.js.map +1 -1
  67. package/dist/client/analytics.d.ts.map +1 -1
  68. package/dist/client/analytics.js +175 -3
  69. package/dist/client/analytics.js.map +1 -1
  70. package/dist/client/appearance.d.ts +40 -0
  71. package/dist/client/appearance.d.ts.map +1 -0
  72. package/dist/client/appearance.js +114 -0
  73. package/dist/client/appearance.js.map +1 -0
  74. package/dist/client/builder-frame.d.ts +1 -0
  75. package/dist/client/builder-frame.d.ts.map +1 -1
  76. package/dist/client/builder-frame.js +19 -9
  77. package/dist/client/builder-frame.js.map +1 -1
  78. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  79. package/dist/client/components/CodeRequiredDialog.js +10 -2
  80. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  81. package/dist/client/components/ui/dropdown-menu.js +2 -2
  82. package/dist/client/components/ui/dropdown-menu.js.map +1 -1
  83. package/dist/client/components/ui/hover-card.js +1 -1
  84. package/dist/client/components/ui/hover-card.js.map +1 -1
  85. package/dist/client/components/ui/popover.js +1 -1
  86. package/dist/client/components/ui/popover.js.map +1 -1
  87. package/dist/client/composer/PromptComposer.d.ts +7 -0
  88. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  89. package/dist/client/composer/PromptComposer.js +63 -32
  90. package/dist/client/composer/PromptComposer.js.map +1 -1
  91. package/dist/client/composer/TiptapComposer.d.ts +5 -0
  92. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  93. package/dist/client/composer/TiptapComposer.js +36 -6
  94. package/dist/client/composer/TiptapComposer.js.map +1 -1
  95. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  96. package/dist/client/composer/useVoiceDictation.js +13 -1
  97. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  98. package/dist/client/dev-mode.d.ts +14 -0
  99. package/dist/client/dev-mode.d.ts.map +1 -0
  100. package/dist/client/dev-mode.js +14 -0
  101. package/dist/client/dev-mode.js.map +1 -0
  102. package/dist/client/error-format.d.ts +3 -2
  103. package/dist/client/error-format.d.ts.map +1 -1
  104. package/dist/client/error-format.js +9 -2
  105. package/dist/client/error-format.js.map +1 -1
  106. package/dist/client/extensions/EmbeddedTool.d.ts +20 -0
  107. package/dist/client/extensions/EmbeddedTool.d.ts.map +1 -0
  108. package/dist/client/extensions/EmbeddedTool.js +199 -0
  109. package/dist/client/extensions/EmbeddedTool.js.map +1 -0
  110. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  111. package/dist/client/extensions/ExtensionViewer.js +24 -2
  112. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  113. package/dist/client/extensions/ToolEditor.d.ts +5 -0
  114. package/dist/client/extensions/ToolEditor.d.ts.map +1 -0
  115. package/dist/client/extensions/ToolEditor.js +129 -0
  116. package/dist/client/extensions/ToolEditor.js.map +1 -0
  117. package/dist/client/extensions/ToolViewer.d.ts +5 -0
  118. package/dist/client/extensions/ToolViewer.d.ts.map +1 -0
  119. package/dist/client/extensions/ToolViewer.js +400 -0
  120. package/dist/client/extensions/ToolViewer.js.map +1 -0
  121. package/dist/client/extensions/ToolViewerPage.d.ts +2 -0
  122. package/dist/client/extensions/ToolViewerPage.d.ts.map +1 -0
  123. package/dist/client/extensions/ToolViewerPage.js +24 -0
  124. package/dist/client/extensions/ToolViewerPage.js.map +1 -0
  125. package/dist/client/extensions/ToolsListPage.d.ts +2 -0
  126. package/dist/client/extensions/ToolsListPage.d.ts.map +1 -0
  127. package/dist/client/extensions/ToolsListPage.js +67 -0
  128. package/dist/client/extensions/ToolsListPage.js.map +1 -0
  129. package/dist/client/extensions/ToolsSidebarSection.d.ts +2 -0
  130. package/dist/client/extensions/ToolsSidebarSection.d.ts.map +1 -0
  131. package/dist/client/extensions/ToolsSidebarSection.js +236 -0
  132. package/dist/client/extensions/ToolsSidebarSection.js.map +1 -0
  133. package/dist/client/extensions/tool-order.d.ts +7 -0
  134. package/dist/client/extensions/tool-order.d.ts.map +1 -0
  135. package/dist/client/extensions/tool-order.js +47 -0
  136. package/dist/client/extensions/tool-order.js.map +1 -0
  137. package/dist/client/index.d.ts +8 -1
  138. package/dist/client/index.d.ts.map +1 -1
  139. package/dist/client/index.js +7 -0
  140. package/dist/client/index.js.map +1 -1
  141. package/dist/client/onboarding/OnboardingPanel.js +1 -0
  142. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  143. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  144. package/dist/client/org/InvitationBanner.js +23 -2
  145. package/dist/client/org/InvitationBanner.js.map +1 -1
  146. package/dist/client/org/OrgSwitcher.d.ts +5 -4
  147. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  148. package/dist/client/org/OrgSwitcher.js +57 -9
  149. package/dist/client/org/OrgSwitcher.js.map +1 -1
  150. package/dist/client/org/hooks.d.ts.map +1 -1
  151. package/dist/client/org/hooks.js +10 -6
  152. package/dist/client/org/hooks.js.map +1 -1
  153. package/dist/client/org/workspace-app-links.d.ts +31 -0
  154. package/dist/client/org/workspace-app-links.d.ts.map +1 -0
  155. package/dist/client/org/workspace-app-links.js +268 -0
  156. package/dist/client/org/workspace-app-links.js.map +1 -0
  157. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  158. package/dist/client/resources/ResourcesPanel.js +18 -5
  159. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  160. package/dist/client/resources/use-resources.d.ts +18 -13
  161. package/dist/client/resources/use-resources.d.ts.map +1 -1
  162. package/dist/client/resources/use-resources.js +24 -6
  163. package/dist/client/resources/use-resources.js.map +1 -1
  164. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  165. package/dist/client/settings/BackgroundAgentSection.js +9 -1
  166. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  167. package/dist/client/settings/BrowserSection.d.ts.map +1 -1
  168. package/dist/client/settings/BrowserSection.js +16 -1
  169. package/dist/client/settings/BrowserSection.js.map +1 -1
  170. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  171. package/dist/client/settings/SettingsPanel.js +4 -1
  172. package/dist/client/settings/SettingsPanel.js.map +1 -1
  173. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  174. package/dist/client/settings/VoiceTranscriptionSection.js +5 -5
  175. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  176. package/dist/client/settings/useBuilderStatus.d.ts +8 -0
  177. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  178. package/dist/client/settings/useBuilderStatus.js +50 -13
  179. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  180. package/dist/client/settings/useBuilderStatus.spec.d.ts +2 -0
  181. package/dist/client/settings/useBuilderStatus.spec.d.ts.map +1 -0
  182. package/dist/client/settings/useBuilderStatus.spec.js +64 -0
  183. package/dist/client/settings/useBuilderStatus.spec.js.map +1 -0
  184. package/dist/client/sharing/ShareButton.d.ts +5 -0
  185. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  186. package/dist/client/sharing/ShareButton.js +60 -6
  187. package/dist/client/sharing/ShareButton.js.map +1 -1
  188. package/dist/client/theme.js +1 -1
  189. package/dist/client/theme.js.map +1 -1
  190. package/dist/client/tools/EmbeddedTool.d.ts +20 -0
  191. package/dist/client/tools/EmbeddedTool.d.ts.map +1 -0
  192. package/dist/client/tools/EmbeddedTool.js +199 -0
  193. package/dist/client/tools/EmbeddedTool.js.map +1 -0
  194. package/dist/client/tools/ExtensionSlot.d.ts +27 -0
  195. package/dist/client/tools/ExtensionSlot.d.ts.map +1 -0
  196. package/dist/client/tools/ExtensionSlot.js +96 -0
  197. package/dist/client/tools/ExtensionSlot.js.map +1 -0
  198. package/dist/client/tools/ToolEditor.d.ts +5 -0
  199. package/dist/client/tools/ToolEditor.d.ts.map +1 -0
  200. package/dist/client/tools/ToolEditor.js +129 -0
  201. package/dist/client/tools/ToolEditor.js.map +1 -0
  202. package/dist/client/tools/ToolViewer.d.ts +5 -0
  203. package/dist/client/tools/ToolViewer.d.ts.map +1 -0
  204. package/dist/client/tools/ToolViewer.js +400 -0
  205. package/dist/client/tools/ToolViewer.js.map +1 -0
  206. package/dist/client/tools/ToolViewerPage.d.ts +2 -0
  207. package/dist/client/tools/ToolViewerPage.d.ts.map +1 -0
  208. package/dist/client/tools/ToolViewerPage.js +24 -0
  209. package/dist/client/tools/ToolViewerPage.js.map +1 -0
  210. package/dist/client/tools/ToolsListPage.d.ts +2 -0
  211. package/dist/client/tools/ToolsListPage.d.ts.map +1 -0
  212. package/dist/client/tools/ToolsListPage.js +67 -0
  213. package/dist/client/tools/ToolsListPage.js.map +1 -0
  214. package/dist/client/tools/ToolsSidebarSection.d.ts +2 -0
  215. package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -0
  216. package/dist/client/tools/ToolsSidebarSection.js +236 -0
  217. package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
  218. package/dist/client/tools/iframe-bridge.d.ts +38 -0
  219. package/dist/client/tools/iframe-bridge.d.ts.map +1 -0
  220. package/dist/client/tools/iframe-bridge.js +207 -0
  221. package/dist/client/tools/iframe-bridge.js.map +1 -0
  222. package/dist/client/tools/index.d.ts +8 -0
  223. package/dist/client/tools/index.d.ts.map +1 -0
  224. package/dist/client/tools/index.js +8 -0
  225. package/dist/client/tools/index.js.map +1 -0
  226. package/dist/client/tools/tool-order.d.ts +7 -0
  227. package/dist/client/tools/tool-order.d.ts.map +1 -0
  228. package/dist/client/tools/tool-order.js +47 -0
  229. package/dist/client/tools/tool-order.js.map +1 -0
  230. package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
  231. package/dist/client/transcription/BuilderTranscriptionCta.js +2 -3
  232. package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
  233. package/dist/client/use-change-version.d.ts +46 -0
  234. package/dist/client/use-change-version.d.ts.map +1 -0
  235. package/dist/client/use-change-version.js +135 -0
  236. package/dist/client/use-change-version.js.map +1 -0
  237. package/dist/client/use-chat-threads.d.ts +16 -2
  238. package/dist/client/use-chat-threads.d.ts.map +1 -1
  239. package/dist/client/use-chat-threads.js +87 -12
  240. package/dist/client/use-chat-threads.js.map +1 -1
  241. package/dist/client/use-chat-threads.spec.d.ts +2 -0
  242. package/dist/client/use-chat-threads.spec.d.ts.map +1 -0
  243. package/dist/client/use-chat-threads.spec.js +85 -0
  244. package/dist/client/use-chat-threads.spec.js.map +1 -0
  245. package/dist/client/use-db-sync.d.ts +5 -2
  246. package/dist/client/use-db-sync.d.ts.map +1 -1
  247. package/dist/client/use-db-sync.js +41 -16
  248. package/dist/client/use-db-sync.js.map +1 -1
  249. package/dist/client/use-pinch-zoom.d.ts +35 -0
  250. package/dist/client/use-pinch-zoom.d.ts.map +1 -0
  251. package/dist/client/use-pinch-zoom.js +105 -0
  252. package/dist/client/use-pinch-zoom.js.map +1 -0
  253. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  254. package/dist/deploy/workspace-deploy.js +99 -5
  255. package/dist/deploy/workspace-deploy.js.map +1 -1
  256. package/dist/extensions/actions.d.ts.map +1 -1
  257. package/dist/extensions/actions.js +3 -0
  258. package/dist/extensions/actions.js.map +1 -1
  259. package/dist/extensions/store.d.ts +5 -0
  260. package/dist/extensions/store.d.ts.map +1 -1
  261. package/dist/extensions/store.js +16 -1
  262. package/dist/extensions/store.js.map +1 -1
  263. package/dist/file-upload/actions/upload-image.d.ts +3 -0
  264. package/dist/file-upload/actions/upload-image.d.ts.map +1 -0
  265. package/dist/file-upload/actions/upload-image.js +145 -0
  266. package/dist/file-upload/actions/upload-image.js.map +1 -0
  267. package/dist/file-upload/builder.d.ts.map +1 -1
  268. package/dist/file-upload/builder.js +31 -11
  269. package/dist/file-upload/builder.js.map +1 -1
  270. package/dist/file-upload/index.d.ts +1 -0
  271. package/dist/file-upload/index.d.ts.map +1 -1
  272. package/dist/file-upload/index.js +1 -0
  273. package/dist/file-upload/index.js.map +1 -1
  274. package/dist/file-upload/pre-upload-attachments.d.ts +39 -0
  275. package/dist/file-upload/pre-upload-attachments.d.ts.map +1 -0
  276. package/dist/file-upload/pre-upload-attachments.js +110 -0
  277. package/dist/file-upload/pre-upload-attachments.js.map +1 -0
  278. package/dist/file-upload/registry.d.ts.map +1 -1
  279. package/dist/file-upload/registry.js +8 -7
  280. package/dist/file-upload/registry.js.map +1 -1
  281. package/dist/onboarding/default-steps.js +1 -1
  282. package/dist/onboarding/default-steps.js.map +1 -1
  283. package/dist/org/context.d.ts +15 -1
  284. package/dist/org/context.d.ts.map +1 -1
  285. package/dist/org/context.js +25 -0
  286. package/dist/org/context.js.map +1 -1
  287. package/dist/org/handlers.d.ts +2 -2
  288. package/dist/org/handlers.d.ts.map +1 -1
  289. package/dist/org/handlers.js +3 -17
  290. package/dist/org/handlers.js.map +1 -1
  291. package/dist/org/index.d.ts +1 -1
  292. package/dist/org/index.d.ts.map +1 -1
  293. package/dist/org/index.js +1 -1
  294. package/dist/org/index.js.map +1 -1
  295. package/dist/resources/handlers.d.ts +6 -0
  296. package/dist/resources/handlers.d.ts.map +1 -1
  297. package/dist/resources/handlers.js +30 -6
  298. package/dist/resources/handlers.js.map +1 -1
  299. package/dist/resources/script-helpers.d.ts +11 -2
  300. package/dist/resources/script-helpers.d.ts.map +1 -1
  301. package/dist/resources/script-helpers.js +20 -3
  302. package/dist/resources/script-helpers.js.map +1 -1
  303. package/dist/resources/store.d.ts +28 -3
  304. package/dist/resources/store.d.ts.map +1 -1
  305. package/dist/resources/store.js +170 -20
  306. package/dist/resources/store.js.map +1 -1
  307. package/dist/scripts/resources/list.d.ts +1 -1
  308. package/dist/scripts/resources/list.d.ts.map +1 -1
  309. package/dist/scripts/resources/list.js +16 -4
  310. package/dist/scripts/resources/list.js.map +1 -1
  311. package/dist/scripts/resources/write.d.ts +1 -1
  312. package/dist/scripts/resources/write.d.ts.map +1 -1
  313. package/dist/scripts/resources/write.js +47 -3
  314. package/dist/scripts/resources/write.js.map +1 -1
  315. package/dist/server/action-discovery.d.ts.map +1 -1
  316. package/dist/server/action-discovery.js +8 -3
  317. package/dist/server/action-discovery.js.map +1 -1
  318. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  319. package/dist/server/agent-chat-plugin.js +214 -25
  320. package/dist/server/agent-chat-plugin.js.map +1 -1
  321. package/dist/server/agent-discovery.d.ts +35 -0
  322. package/dist/server/agent-discovery.d.ts.map +1 -1
  323. package/dist/server/agent-discovery.js +139 -8
  324. package/dist/server/agent-discovery.js.map +1 -1
  325. package/dist/server/app-url.d.ts +12 -6
  326. package/dist/server/app-url.d.ts.map +1 -1
  327. package/dist/server/app-url.js +58 -11
  328. package/dist/server/app-url.js.map +1 -1
  329. package/dist/server/auth.d.ts +22 -0
  330. package/dist/server/auth.d.ts.map +1 -1
  331. package/dist/server/auth.js +316 -65
  332. package/dist/server/auth.js.map +1 -1
  333. package/dist/server/better-auth-instance.d.ts +0 -4
  334. package/dist/server/better-auth-instance.d.ts.map +1 -1
  335. package/dist/server/better-auth-instance.js +0 -3
  336. package/dist/server/better-auth-instance.js.map +1 -1
  337. package/dist/server/builder-browser.d.ts.map +1 -1
  338. package/dist/server/builder-browser.js +23 -0
  339. package/dist/server/builder-browser.js.map +1 -1
  340. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  341. package/dist/server/core-routes-plugin.js +29 -14
  342. package/dist/server/core-routes-plugin.js.map +1 -1
  343. package/dist/server/credential-provider.d.ts +14 -0
  344. package/dist/server/credential-provider.d.ts.map +1 -1
  345. package/dist/server/credential-provider.js +88 -11
  346. package/dist/server/credential-provider.js.map +1 -1
  347. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  348. package/dist/server/google-auth-plugin.js +65 -17
  349. package/dist/server/google-auth-plugin.js.map +1 -1
  350. package/dist/server/google-oauth.d.ts.map +1 -1
  351. package/dist/server/google-oauth.js +47 -17
  352. package/dist/server/google-oauth.js.map +1 -1
  353. package/dist/server/index.d.ts +1 -1
  354. package/dist/server/index.d.ts.map +1 -1
  355. package/dist/server/index.js +1 -1
  356. package/dist/server/index.js.map +1 -1
  357. package/dist/server/local-migration.d.ts +41 -0
  358. package/dist/server/local-migration.d.ts.map +1 -0
  359. package/dist/server/local-migration.js +235 -0
  360. package/dist/server/local-migration.js.map +1 -0
  361. package/dist/server/oauth-public-origin.d.ts.map +1 -1
  362. package/dist/server/oauth-public-origin.js +19 -1
  363. package/dist/server/oauth-public-origin.js.map +1 -1
  364. package/dist/server/onboarding-html.d.ts.map +1 -1
  365. package/dist/server/onboarding-html.js +74 -19
  366. package/dist/server/onboarding-html.js.map +1 -1
  367. package/dist/server/poll.d.ts.map +1 -1
  368. package/dist/server/poll.js +20 -5
  369. package/dist/server/poll.js.map +1 -1
  370. package/dist/server/request-context.d.ts +8 -0
  371. package/dist/server/request-context.d.ts.map +1 -1
  372. package/dist/server/request-context.js.map +1 -1
  373. package/dist/shared/index.d.ts +2 -0
  374. package/dist/shared/index.d.ts.map +1 -1
  375. package/dist/shared/index.js +2 -0
  376. package/dist/shared/index.js.map +1 -1
  377. package/dist/shared/llm-connection.d.ts +10 -0
  378. package/dist/shared/llm-connection.d.ts.map +1 -0
  379. package/dist/shared/llm-connection.js +29 -0
  380. package/dist/shared/llm-connection.js.map +1 -0
  381. package/dist/shared/workspace-app-audience.d.ts +25 -0
  382. package/dist/shared/workspace-app-audience.d.ts.map +1 -0
  383. package/dist/shared/workspace-app-audience.js +126 -0
  384. package/dist/shared/workspace-app-audience.js.map +1 -0
  385. package/dist/shared/workspace-app-id.d.ts +1 -1
  386. package/dist/shared/workspace-app-id.d.ts.map +1 -1
  387. package/dist/shared/workspace-app-id.js +1 -0
  388. package/dist/shared/workspace-app-id.js.map +1 -1
  389. package/dist/sharing/access.d.ts.map +1 -1
  390. package/dist/sharing/access.js +46 -5
  391. package/dist/sharing/access.js.map +1 -1
  392. package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -1
  393. package/dist/sharing/actions/list-resource-shares.js +8 -1
  394. package/dist/sharing/actions/list-resource-shares.js.map +1 -1
  395. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  396. package/dist/sharing/actions/set-resource-visibility.js +12 -3
  397. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  398. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  399. package/dist/sharing/actions/share-resource.js +50 -1
  400. package/dist/sharing/actions/share-resource.js.map +1 -1
  401. package/dist/sharing/registry.d.ts +26 -0
  402. package/dist/sharing/registry.d.ts.map +1 -1
  403. package/dist/sharing/registry.js.map +1 -1
  404. package/dist/styles/agent-native.css +91 -0
  405. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
  406. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
  407. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
  408. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
  409. package/dist/templates/default/AGENTS.md +22 -19
  410. package/dist/templates/default/actions/navigate.ts +3 -0
  411. package/dist/templates/default/app/hooks/use-navigation-state.ts +29 -5
  412. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
  413. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
  414. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
  415. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
  416. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
  417. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
  418. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
  419. package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
  420. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
  421. package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
  422. package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
  423. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
  424. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
  425. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
  426. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
  427. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
  428. package/dist/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
  429. package/dist/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
  430. package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
  431. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
  432. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
  433. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
  434. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
  435. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
  436. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
  437. package/dist/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
  438. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
  439. package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
  440. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
  441. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
  442. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
  443. package/dist/templates/workspace-core/AGENTS.md +16 -1
  444. package/dist/templates/workspace-root/AGENTS.md +35 -0
  445. package/dist/templates/workspace-root/README.md +7 -0
  446. package/dist/tools/actions.d.ts +3 -0
  447. package/dist/tools/actions.d.ts.map +1 -0
  448. package/dist/tools/actions.js +272 -0
  449. package/dist/tools/actions.js.map +1 -0
  450. package/dist/tools/fetch-tool.d.ts +23 -0
  451. package/dist/tools/fetch-tool.d.ts.map +1 -0
  452. package/dist/tools/fetch-tool.js +178 -0
  453. package/dist/tools/fetch-tool.js.map +1 -0
  454. package/dist/tools/html-shell.d.ts +45 -0
  455. package/dist/tools/html-shell.d.ts.map +1 -0
  456. package/dist/tools/html-shell.js +514 -0
  457. package/dist/tools/html-shell.js.map +1 -0
  458. package/dist/tools/proxy-security.d.ts +12 -0
  459. package/dist/tools/proxy-security.d.ts.map +1 -0
  460. package/dist/tools/proxy-security.js +158 -0
  461. package/dist/tools/proxy-security.js.map +1 -0
  462. package/dist/tools/routes.d.ts +2 -0
  463. package/dist/tools/routes.d.ts.map +1 -0
  464. package/dist/tools/routes.js +627 -0
  465. package/dist/tools/routes.js.map +1 -0
  466. package/dist/tools/schema.d.ts +664 -0
  467. package/dist/tools/schema.d.ts.map +1 -0
  468. package/dist/tools/schema.js +146 -0
  469. package/dist/tools/schema.js.map +1 -0
  470. package/dist/tools/slots/routes.d.ts +15 -0
  471. package/dist/tools/slots/routes.d.ts.map +1 -0
  472. package/dist/tools/slots/routes.js +94 -0
  473. package/dist/tools/slots/routes.js.map +1 -0
  474. package/dist/tools/slots/schema.d.ts +303 -0
  475. package/dist/tools/slots/schema.d.ts.map +1 -0
  476. package/dist/tools/slots/schema.js +76 -0
  477. package/dist/tools/slots/schema.js.map +1 -0
  478. package/dist/tools/slots/store.d.ts +66 -0
  479. package/dist/tools/slots/store.d.ts.map +1 -0
  480. package/dist/tools/slots/store.js +227 -0
  481. package/dist/tools/slots/store.js.map +1 -0
  482. package/dist/tools/store.d.ts +40 -0
  483. package/dist/tools/store.d.ts.map +1 -0
  484. package/dist/tools/store.js +193 -0
  485. package/dist/tools/store.js.map +1 -0
  486. package/dist/tools/theme.d.ts +2 -0
  487. package/dist/tools/theme.d.ts.map +1 -0
  488. package/dist/tools/theme.js +67 -0
  489. package/dist/tools/theme.js.map +1 -0
  490. package/dist/tools/url-safety.d.ts +24 -0
  491. package/dist/tools/url-safety.d.ts.map +1 -0
  492. package/dist/tools/url-safety.js +224 -0
  493. package/dist/tools/url-safety.js.map +1 -0
  494. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  495. package/dist/vite/action-types-plugin.js +4 -0
  496. package/dist/vite/action-types-plugin.js.map +1 -1
  497. package/docs/content/authentication.md +36 -0
  498. package/docs/content/creating-templates.md +15 -0
  499. package/docs/content/dispatch.md +3 -3
  500. package/docs/content/multi-app-workspace.md +5 -0
  501. package/docs/content/tracking.md +12 -0
  502. package/docs/content/workspace-management.md +39 -4
  503. package/package.json +15 -12
  504. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
  505. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
  506. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
  507. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
  508. package/src/templates/default/AGENTS.md +22 -19
  509. package/src/templates/default/actions/navigate.ts +3 -0
  510. package/src/templates/default/app/hooks/use-navigation-state.ts +29 -5
  511. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
  512. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
  513. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
  514. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
  515. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
  516. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
  517. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
  518. package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
  519. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
  520. package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
  521. package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
  522. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
  523. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
  524. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
  525. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
  526. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
  527. package/src/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
  528. package/src/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
  529. package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
  530. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
  531. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
  532. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
  533. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
  534. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
  535. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
  536. package/src/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
  537. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
  538. package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
  539. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
  540. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
  541. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
  542. package/src/templates/workspace-core/AGENTS.md +16 -1
  543. package/src/templates/workspace-root/AGENTS.md +35 -0
  544. package/src/templates/workspace-root/README.md +7 -0
@@ -0,0 +1,8 @@
1
+ export { ToolsSidebarSection } from "./ToolsSidebarSection.js";
2
+ export { ToolViewer, type ToolViewerProps } from "./ToolViewer.js";
3
+ export { ToolEditor, type ToolEditorProps } from "./ToolEditor.js";
4
+ export { ToolsListPage } from "./ToolsListPage.js";
5
+ export { ToolViewerPage } from "./ToolViewerPage.js";
6
+ export { EmbeddedTool, type EmbeddedToolProps } from "./EmbeddedTool.js";
7
+ export { ExtensionSlot, type ExtensionSlotProps } from "./ExtensionSlot.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { ToolsSidebarSection } from "./ToolsSidebarSection.js";
2
+ export { ToolViewer } from "./ToolViewer.js";
3
+ export { ToolEditor } from "./ToolEditor.js";
4
+ export { ToolsListPage } from "./ToolsListPage.js";
5
+ export { ToolViewerPage } from "./ToolViewerPage.js";
6
+ export { EmbeddedTool } from "./EmbeddedTool.js";
7
+ export { ExtensionSlot } from "./ExtensionSlot.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC","sourcesContent":["export { ToolsSidebarSection } from \"./ToolsSidebarSection.js\";\nexport { ToolViewer, type ToolViewerProps } from \"./ToolViewer.js\";\nexport { ToolEditor, type ToolEditorProps } from \"./ToolEditor.js\";\nexport { ToolsListPage } from \"./ToolsListPage.js\";\nexport { ToolViewerPage } from \"./ToolViewerPage.js\";\nexport { EmbeddedTool, type EmbeddedToolProps } from \"./EmbeddedTool.js\";\nexport { ExtensionSlot, type ExtensionSlotProps } from \"./ExtensionSlot.js\";\n"]}
@@ -0,0 +1,7 @@
1
+ export declare const TOOLS_ORDER_CHANGE_EVENT = "tools-order-change";
2
+ export declare function getToolsOrder(): string[];
3
+ export declare function setToolsOrder(order: string[]): void;
4
+ export declare function applyToolsOrder<T extends {
5
+ id: string;
6
+ }>(items: T[], savedOrder: string[]): T[];
7
+ //# sourceMappingURL=tool-order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-order.d.ts","sourceRoot":"","sources":["../../../src/client/tools/tool-order.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAI7D,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAYxC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAU5C;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACtD,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,MAAM,EAAE,GACnB,CAAC,EAAE,CAeL"}
@@ -0,0 +1,47 @@
1
+ export const TOOLS_ORDER_CHANGE_EVENT = "tools-order-change";
2
+ const TOOLS_ORDER_KEY = "tools-order";
3
+ export function getToolsOrder() {
4
+ if (typeof window === "undefined")
5
+ return [];
6
+ try {
7
+ const raw = window.localStorage.getItem(TOOLS_ORDER_KEY);
8
+ if (!raw)
9
+ return [];
10
+ const parsed = JSON.parse(raw);
11
+ return Array.isArray(parsed)
12
+ ? parsed.filter((id) => typeof id === "string")
13
+ : [];
14
+ }
15
+ catch {
16
+ return [];
17
+ }
18
+ }
19
+ export function setToolsOrder(order) {
20
+ if (typeof window === "undefined")
21
+ return;
22
+ try {
23
+ window.localStorage.setItem(TOOLS_ORDER_KEY, JSON.stringify(order));
24
+ window.dispatchEvent(new CustomEvent(TOOLS_ORDER_CHANGE_EVENT, { detail: order }));
25
+ }
26
+ catch {
27
+ // localStorage unavailable / quota — ignore, order is best-effort
28
+ }
29
+ }
30
+ export function applyToolsOrder(items, savedOrder) {
31
+ if (savedOrder.length === 0)
32
+ return items;
33
+ const idToItem = new Map(items.map((item) => [item.id, item]));
34
+ const ordered = [];
35
+ for (const id of savedOrder) {
36
+ const item = idToItem.get(id);
37
+ if (item) {
38
+ ordered.push(item);
39
+ idToItem.delete(id);
40
+ }
41
+ }
42
+ for (const item of idToItem.values()) {
43
+ ordered.push(item);
44
+ }
45
+ return ordered;
46
+ }
47
+ //# sourceMappingURL=tool-order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-order.js","sourceRoot":"","sources":["../../../src/client/tools/tool-order.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AAE7D,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC;YAC/C,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAe;IAC3C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAC7D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAU,EACV,UAAoB;IAEpB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["export const TOOLS_ORDER_CHANGE_EVENT = \"tools-order-change\";\n\nconst TOOLS_ORDER_KEY = \"tools-order\";\n\nexport function getToolsOrder(): string[] {\n if (typeof window === \"undefined\") return [];\n try {\n const raw = window.localStorage.getItem(TOOLS_ORDER_KEY);\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed)\n ? parsed.filter((id) => typeof id === \"string\")\n : [];\n } catch {\n return [];\n }\n}\n\nexport function setToolsOrder(order: string[]) {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(TOOLS_ORDER_KEY, JSON.stringify(order));\n window.dispatchEvent(\n new CustomEvent(TOOLS_ORDER_CHANGE_EVENT, { detail: order }),\n );\n } catch {\n // localStorage unavailable / quota — ignore, order is best-effort\n }\n}\n\nexport function applyToolsOrder<T extends { id: string }>(\n items: T[],\n savedOrder: string[],\n): T[] {\n if (savedOrder.length === 0) return items;\n const idToItem = new Map(items.map((item) => [item.id, item]));\n const ordered: T[] = [];\n for (const id of savedOrder) {\n const item = idToItem.get(id);\n if (item) {\n ordered.push(item);\n idToItem.delete(id);\n }\n }\n for (const item of idToItem.values()) {\n ordered.push(item);\n }\n return ordered;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BuilderTranscriptionCta.d.ts","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wBAAgB,uBAAuB,4CAoGtC"}
1
+ {"version":3,"file":"BuilderTranscriptionCta.d.ts","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wBAAgB,uBAAuB,4CA+FtC"}
@@ -9,7 +9,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
9
  import { useCallback, useEffect, useRef, useState } from "react";
10
10
  import { IconBolt, IconExternalLink, IconLoader2 } from "@tabler/icons-react";
11
11
  import { agentNativePath } from "../api-path.js";
12
- import { getCallbackOrigin } from "../frame.js";
12
+ import { openBuilderConnectPopup } from "../settings/useBuilderStatus.js";
13
13
  export function BuilderTranscriptionCta() {
14
14
  const [configured, setConfigured] = useState(null);
15
15
  const [connecting, setConnecting] = useState(false);
@@ -44,8 +44,7 @@ export function BuilderTranscriptionCta() {
44
44
  clearInterval(pollRef.current);
45
45
  setConnecting(true);
46
46
  setError(null);
47
- const origin = getCallbackOrigin() || window.location.origin;
48
- window.open(new URL(agentNativePath("/_agent-native/builder/connect"), origin).href, "_blank", "noopener,noreferrer");
47
+ openBuilderConnectPopup({ source: "builder_transcription_cta" });
49
48
  const start = Date.now();
50
49
  pollRef.current = setInterval(async () => {
51
50
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"BuilderTranscriptionCta.js","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Lightweight inline CTA that nudges users to connect Builder.io for\n * higher-quality transcription. Renders nothing when Builder is already\n * connected.\n *\n * Drop this next to transcript displays in any template.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { IconBolt, IconExternalLink, IconLoader2 } from \"@tabler/icons-react\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { getCallbackOrigin } from \"../frame.js\";\n\nexport function BuilderTranscriptionCta() {\n const [configured, setConfigured] = useState<boolean | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) =>\n r.ok\n ? (r.json() as Promise<{ configured: boolean; envManaged?: boolean }>)\n : null,\n )\n .then((s) => {\n if (!mountedRef.current) return;\n // Env-managed mode counts as configured for the CTA — the deploy\n // already routes transcription through Builder, no per-user prompt.\n setConfigured(!!(s?.configured || s?.envManaged));\n })\n .catch(() => {\n if (mountedRef.current) setConfigured(false);\n });\n return () => {\n mountedRef.current = false;\n if (pollRef.current) clearInterval(pollRef.current);\n };\n }, []);\n\n const handleConnect = useCallback(() => {\n if (pollRef.current) clearInterval(pollRef.current);\n setConnecting(true);\n setError(null);\n\n const origin = getCallbackOrigin() || window.location.origin;\n window.open(\n new URL(agentNativePath(\"/_agent-native/builder/connect\"), origin).href,\n \"_blank\",\n \"noopener,noreferrer\",\n );\n\n const start = Date.now();\n pollRef.current = setInterval(async () => {\n try {\n const r = await fetch(agentNativePath(\"/_agent-native/builder/status\"));\n if (!r.ok) return;\n const s = (await r.json()) as { configured: boolean };\n if (!mountedRef.current) {\n clearInterval(pollRef.current!);\n return;\n }\n if (s.configured) {\n clearInterval(pollRef.current!);\n setConfigured(true);\n setConnecting(false);\n } else if (Date.now() - start > 5 * 60 * 1000) {\n clearInterval(pollRef.current!);\n setConnecting(false);\n setError(\n \"Didn't hear back from Builder. Allow popups and try again.\",\n );\n }\n } catch {\n // transient — keep polling\n }\n }, 2000);\n }, []);\n\n // Already connected or still loading — render nothing\n if (configured === null || configured) return null;\n\n return (\n <div className=\"flex items-center gap-2 rounded-md border border-border/50 bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n <IconBolt\n size={14}\n className=\"shrink-0 text-muted-foreground/70\"\n aria-hidden=\"true\"\n />\n <span className=\"flex-1\">\n {connecting\n ? \"Waiting for Builder.io…\"\n : \"Connect Builder.io for higher-quality transcription — free credits, no API key needed.\"}\n </span>\n {error ? (\n <span className=\"text-destructive text-[10px]\">{error}</span>\n ) : connecting ? (\n <IconLoader2 size={12} className=\"shrink-0 animate-spin\" />\n ) : (\n <button\n type=\"button\"\n onClick={handleConnect}\n className=\"ml-auto shrink-0 inline-flex items-center gap-1 rounded bg-foreground px-2 py-1 text-[10px] font-semibold text-background hover:opacity-90 transition-opacity\"\n >\n Connect\n <IconExternalLink size={10} />\n </button>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"BuilderTranscriptionCta.js","sourceRoot":"","sources":["../../../src/client/transcription/BuilderTranscriptionCta.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Lightweight inline CTA that nudges users to connect Builder.io for\n * higher-quality transcription. Renders nothing when Builder is already\n * connected.\n *\n * Drop this next to transcript displays in any template.\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { IconBolt, IconExternalLink, IconLoader2 } from \"@tabler/icons-react\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { openBuilderConnectPopup } from \"../settings/useBuilderStatus.js\";\n\nexport function BuilderTranscriptionCta() {\n const [configured, setConfigured] = useState<boolean | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) =>\n r.ok\n ? (r.json() as Promise<{ configured: boolean; envManaged?: boolean }>)\n : null,\n )\n .then((s) => {\n if (!mountedRef.current) return;\n // Env-managed mode counts as configured for the CTA — the deploy\n // already routes transcription through Builder, no per-user prompt.\n setConfigured(!!(s?.configured || s?.envManaged));\n })\n .catch(() => {\n if (mountedRef.current) setConfigured(false);\n });\n return () => {\n mountedRef.current = false;\n if (pollRef.current) clearInterval(pollRef.current);\n };\n }, []);\n\n const handleConnect = useCallback(() => {\n if (pollRef.current) clearInterval(pollRef.current);\n setConnecting(true);\n setError(null);\n\n openBuilderConnectPopup({ source: \"builder_transcription_cta\" });\n\n const start = Date.now();\n pollRef.current = setInterval(async () => {\n try {\n const r = await fetch(agentNativePath(\"/_agent-native/builder/status\"));\n if (!r.ok) return;\n const s = (await r.json()) as { configured: boolean };\n if (!mountedRef.current) {\n clearInterval(pollRef.current!);\n return;\n }\n if (s.configured) {\n clearInterval(pollRef.current!);\n setConfigured(true);\n setConnecting(false);\n } else if (Date.now() - start > 5 * 60 * 1000) {\n clearInterval(pollRef.current!);\n setConnecting(false);\n setError(\n \"Didn't hear back from Builder. Allow popups and try again.\",\n );\n }\n } catch {\n // transient — keep polling\n }\n }, 2000);\n }, []);\n\n // Already connected or still loading — render nothing\n if (configured === null || configured) return null;\n\n return (\n <div className=\"flex items-center gap-2 rounded-md border border-border/50 bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n <IconBolt\n size={14}\n className=\"shrink-0 text-muted-foreground/70\"\n aria-hidden=\"true\"\n />\n <span className=\"flex-1\">\n {connecting\n ? \"Waiting for Builder.io…\"\n : \"Connect Builder.io for higher-quality transcription — free credits, no API key needed.\"}\n </span>\n {error ? (\n <span className=\"text-destructive text-[10px]\">{error}</span>\n ) : connecting ? (\n <IconLoader2 size={12} className=\"shrink-0 animate-spin\" />\n ) : (\n <button\n type=\"button\"\n onClick={handleConnect}\n className=\"ml-auto shrink-0 inline-flex items-center gap-1 rounded bg-foreground px-2 py-1 text-[10px] font-semibold text-background hover:opacity-90 transition-opacity\"\n >\n Connect\n <IconExternalLink size={10} />\n </button>\n )}\n </div>\n );\n}\n"]}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Advance a source counter. Called by `useDbSync` for every change event;
3
+ * may also be called from templates that learn of a server-side change via
4
+ * a custom path (e.g. an in-process mutation that already happened — bump
5
+ * the counter so other components refetch without waiting for the poll
6
+ * cycle).
7
+ */
8
+ export declare function bumpChangeVersion(source: string, version: number): boolean;
9
+ /**
10
+ * Get the current counter for a source without subscribing. Use inside
11
+ * event handlers / callbacks; in render code use `useChangeVersion`.
12
+ */
13
+ export declare function getChangeVersion(source: string): number;
14
+ /**
15
+ * Subscribe to a source's change counter. Returns an integer that
16
+ * increments every time the server emits an event with `source === <source>`
17
+ * — including (by design) the agent's own action calls, since the agent
18
+ * runner emits `source: "action"` after every successful mutating action.
19
+ *
20
+ * Fold the return value into a React Query `queryKey` to make the query
21
+ * refetch whenever that source advances:
22
+ *
23
+ * ```ts
24
+ * const v = useChangeVersion("dashboards");
25
+ * useQuery({
26
+ * queryKey: ["dashboard", id, v],
27
+ * queryFn: () => fetchDashboard(id),
28
+ * placeholderData: keepPreviousData,
29
+ * });
30
+ * ```
31
+ */
32
+ export declare function useChangeVersion(source: string): number;
33
+ /**
34
+ * Convenience for queries that should refetch on multiple sources — returns
35
+ * the sum of each source's counter so React Query treats every advance as a
36
+ * key change.
37
+ *
38
+ * ```ts
39
+ * const v = useChangeVersions(["dashboards", "action"]);
40
+ * useQuery({ queryKey: ["dashboard", id, v], ... });
41
+ * ```
42
+ */
43
+ export declare function useChangeVersions(sources: readonly string[]): number;
44
+ /** Internal test helper — reset all counters. Do not use in app code. */
45
+ export declare function _resetChangeVersionStoreForTests(): void;
46
+ //# sourceMappingURL=use-change-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-change-version.d.ts","sourceRoot":"","sources":["../../src/client/use-change-version.ts"],"names":[],"mappings":"AAgFA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMpE;AAED,yEAAyE;AACzE,wBAAgB,gCAAgC,IAAI,IAAI,CAKvD"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Per-source change counters — the framework's "agent writes show up
3
+ * immediately" primitive.
4
+ *
5
+ * Every server-side mutation emits a `recordChange({ source, ... })` event.
6
+ * `useDbSync` (in this folder) calls `bumpChangeVersion(source, version)` for
7
+ * each event it sees over SSE or `/poll`. Hooks `useChangeVersion(source)`
8
+ * and `useChangeVersions(sources)` expose a per-source integer that
9
+ * advances every time that source has new activity.
10
+ *
11
+ * Templates fold these counters into their React Query `queryKey` — when the
12
+ * counter advances, the key changes, and React Query refetches that one
13
+ * query. No template needs to enumerate query keys in `useDbSync`; no full
14
+ * cache invalidate is required.
15
+ *
16
+ * ```ts
17
+ * const v = useChangeVersion("dashboards");
18
+ * const dashboard = useQuery({
19
+ * queryKey: ["dashboard", id, v],
20
+ * queryFn: () => fetchDashboard(id),
21
+ * placeholderData: keepPreviousData, // no flicker on refetch
22
+ * });
23
+ * ```
24
+ *
25
+ * The agent's `update-dashboard` action emits `{ source: "dashboards" }`
26
+ * (from `upsertDashboard`'s `recordChange` call) AND
27
+ * `{ source: "action" }` (from the agent runner's post-tool emit). Either
28
+ * triggers a refetch when the relevant counter is in the query key.
29
+ *
30
+ * **Cost is bounded:** only queries that opted into a specific source
31
+ * refetch when that source fires. A poll heartbeat with no event does
32
+ * nothing.
33
+ */
34
+ import { useSyncExternalStore } from "react";
35
+ class ChangeVersionStore {
36
+ versions = new Map();
37
+ listeners = new Set();
38
+ cachedSnapshots = new Map();
39
+ /**
40
+ * Advance the counter for `source` to at least `version`. Returns true if
41
+ * the counter actually moved (so callers can avoid spurious work).
42
+ */
43
+ bump(source, version) {
44
+ if (!source)
45
+ return false;
46
+ const current = this.versions.get(source) ?? 0;
47
+ if (version > current) {
48
+ this.versions.set(source, version);
49
+ this.cachedSnapshots.set(source, version);
50
+ this.notify();
51
+ return true;
52
+ }
53
+ return false;
54
+ }
55
+ get(source) {
56
+ // useSyncExternalStore requires reference-stable snapshots for unchanged
57
+ // values, so we serve from a cached map that we only update inside
58
+ // `bump`.
59
+ const cached = this.cachedSnapshots.get(source);
60
+ if (cached !== undefined)
61
+ return cached;
62
+ this.cachedSnapshots.set(source, 0);
63
+ return 0;
64
+ }
65
+ subscribe(listener) {
66
+ this.listeners.add(listener);
67
+ return () => {
68
+ this.listeners.delete(listener);
69
+ };
70
+ }
71
+ notify() {
72
+ for (const listener of this.listeners)
73
+ listener();
74
+ }
75
+ }
76
+ const store = new ChangeVersionStore();
77
+ /**
78
+ * Advance a source counter. Called by `useDbSync` for every change event;
79
+ * may also be called from templates that learn of a server-side change via
80
+ * a custom path (e.g. an in-process mutation that already happened — bump
81
+ * the counter so other components refetch without waiting for the poll
82
+ * cycle).
83
+ */
84
+ export function bumpChangeVersion(source, version) {
85
+ return store.bump(source, version);
86
+ }
87
+ /**
88
+ * Get the current counter for a source without subscribing. Use inside
89
+ * event handlers / callbacks; in render code use `useChangeVersion`.
90
+ */
91
+ export function getChangeVersion(source) {
92
+ return store.get(source);
93
+ }
94
+ /**
95
+ * Subscribe to a source's change counter. Returns an integer that
96
+ * increments every time the server emits an event with `source === <source>`
97
+ * — including (by design) the agent's own action calls, since the agent
98
+ * runner emits `source: "action"` after every successful mutating action.
99
+ *
100
+ * Fold the return value into a React Query `queryKey` to make the query
101
+ * refetch whenever that source advances:
102
+ *
103
+ * ```ts
104
+ * const v = useChangeVersion("dashboards");
105
+ * useQuery({
106
+ * queryKey: ["dashboard", id, v],
107
+ * queryFn: () => fetchDashboard(id),
108
+ * placeholderData: keepPreviousData,
109
+ * });
110
+ * ```
111
+ */
112
+ export function useChangeVersion(source) {
113
+ return useSyncExternalStore((cb) => store.subscribe(cb), () => store.get(source), () => 0);
114
+ }
115
+ /**
116
+ * Convenience for queries that should refetch on multiple sources — returns
117
+ * the sum of each source's counter so React Query treats every advance as a
118
+ * key change.
119
+ *
120
+ * ```ts
121
+ * const v = useChangeVersions(["dashboards", "action"]);
122
+ * useQuery({ queryKey: ["dashboard", id, v], ... });
123
+ * ```
124
+ */
125
+ export function useChangeVersions(sources) {
126
+ return useSyncExternalStore((cb) => store.subscribe(cb), () => sources.reduce((sum, src) => sum + store.get(src), 0), () => 0);
127
+ }
128
+ /** Internal test helper — reset all counters. Do not use in app code. */
129
+ export function _resetChangeVersionStoreForTests() {
130
+ // @ts-expect-error reaching past private to clear state in tests
131
+ store.versions.clear();
132
+ // @ts-expect-error reaching past private to clear state in tests
133
+ store.cachedSnapshots.clear();
134
+ }
135
+ //# sourceMappingURL=use-change-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-change-version.js","sourceRoot":"","sources":["../../src/client/use-change-version.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Per-source change counters — the framework's \"agent writes show up\n * immediately\" primitive.\n *\n * Every server-side mutation emits a `recordChange({ source, ... })` event.\n * `useDbSync` (in this folder) calls `bumpChangeVersion(source, version)` for\n * each event it sees over SSE or `/poll`. Hooks `useChangeVersion(source)`\n * and `useChangeVersions(sources)` expose a per-source integer that\n * advances every time that source has new activity.\n *\n * Templates fold these counters into their React Query `queryKey` — when the\n * counter advances, the key changes, and React Query refetches that one\n * query. No template needs to enumerate query keys in `useDbSync`; no full\n * cache invalidate is required.\n *\n * ```ts\n * const v = useChangeVersion(\"dashboards\");\n * const dashboard = useQuery({\n * queryKey: [\"dashboard\", id, v],\n * queryFn: () => fetchDashboard(id),\n * placeholderData: keepPreviousData, // no flicker on refetch\n * });\n * ```\n *\n * The agent's `update-dashboard` action emits `{ source: \"dashboards\" }`\n * (from `upsertDashboard`'s `recordChange` call) AND\n * `{ source: \"action\" }` (from the agent runner's post-tool emit). Either\n * triggers a refetch when the relevant counter is in the query key.\n *\n * **Cost is bounded:** only queries that opted into a specific source\n * refetch when that source fires. A poll heartbeat with no event does\n * nothing.\n */\nimport { useSyncExternalStore } from \"react\";\n\nclass ChangeVersionStore {\n private versions = new Map<string, number>();\n private listeners = new Set<() => void>();\n private cachedSnapshots = new Map<string, number>();\n\n /**\n * Advance the counter for `source` to at least `version`. Returns true if\n * the counter actually moved (so callers can avoid spurious work).\n */\n bump(source: string, version: number): boolean {\n if (!source) return false;\n const current = this.versions.get(source) ?? 0;\n if (version > current) {\n this.versions.set(source, version);\n this.cachedSnapshots.set(source, version);\n this.notify();\n return true;\n }\n return false;\n }\n\n get(source: string): number {\n // useSyncExternalStore requires reference-stable snapshots for unchanged\n // values, so we serve from a cached map that we only update inside\n // `bump`.\n const cached = this.cachedSnapshots.get(source);\n if (cached !== undefined) return cached;\n this.cachedSnapshots.set(source, 0);\n return 0;\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify() {\n for (const listener of this.listeners) listener();\n }\n}\n\nconst store = new ChangeVersionStore();\n\n/**\n * Advance a source counter. Called by `useDbSync` for every change event;\n * may also be called from templates that learn of a server-side change via\n * a custom path (e.g. an in-process mutation that already happened — bump\n * the counter so other components refetch without waiting for the poll\n * cycle).\n */\nexport function bumpChangeVersion(source: string, version: number): boolean {\n return store.bump(source, version);\n}\n\n/**\n * Get the current counter for a source without subscribing. Use inside\n * event handlers / callbacks; in render code use `useChangeVersion`.\n */\nexport function getChangeVersion(source: string): number {\n return store.get(source);\n}\n\n/**\n * Subscribe to a source's change counter. Returns an integer that\n * increments every time the server emits an event with `source === <source>`\n * — including (by design) the agent's own action calls, since the agent\n * runner emits `source: \"action\"` after every successful mutating action.\n *\n * Fold the return value into a React Query `queryKey` to make the query\n * refetch whenever that source advances:\n *\n * ```ts\n * const v = useChangeVersion(\"dashboards\");\n * useQuery({\n * queryKey: [\"dashboard\", id, v],\n * queryFn: () => fetchDashboard(id),\n * placeholderData: keepPreviousData,\n * });\n * ```\n */\nexport function useChangeVersion(source: string): number {\n return useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.get(source),\n () => 0,\n );\n}\n\n/**\n * Convenience for queries that should refetch on multiple sources — returns\n * the sum of each source's counter so React Query treats every advance as a\n * key change.\n *\n * ```ts\n * const v = useChangeVersions([\"dashboards\", \"action\"]);\n * useQuery({ queryKey: [\"dashboard\", id, v], ... });\n * ```\n */\nexport function useChangeVersions(sources: readonly string[]): number {\n return useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => sources.reduce((sum, src) => sum + store.get(src), 0),\n () => 0,\n );\n}\n\n/** Internal test helper — reset all counters. Do not use in app code. */\nexport function _resetChangeVersionStoreForTests(): void {\n // @ts-expect-error reaching past private to clear state in tests\n store.versions.clear();\n // @ts-expect-error reaching past private to clear state in tests\n store.cachedSnapshots.clear();\n}\n"]}
@@ -1,3 +1,8 @@
1
+ export interface ChatThreadScope {
2
+ type: string;
3
+ id: string;
4
+ label?: string;
5
+ }
1
6
  export interface ChatThreadSummary {
2
7
  id: string;
3
8
  title: string;
@@ -5,6 +10,7 @@ export interface ChatThreadSummary {
5
10
  messageCount: number;
6
11
  createdAt: number;
7
12
  updatedAt: number;
13
+ scope: ChatThreadScope | null;
8
14
  }
9
15
  export interface ChatThreadData {
10
16
  id: string;
@@ -15,15 +21,23 @@ export interface ChatThreadData {
15
21
  messageCount: number;
16
22
  createdAt: number;
17
23
  updatedAt: number;
24
+ scope: ChatThreadScope | null;
25
+ }
26
+ export interface ChatThreadSnapshot {
27
+ threadData: string;
28
+ title: string;
29
+ preview: string;
30
+ messageCount: number;
18
31
  }
19
- export declare function useChatThreads(apiUrl?: string, storageKey?: string): {
32
+ export declare function useChatThreads(apiUrl?: string, storageKey?: string, scope?: ChatThreadScope | null): {
20
33
  threads: ChatThreadSummary[];
21
34
  activeThreadId: string;
22
35
  isLoading: boolean;
23
36
  createThread: (preferredId?: string) => Promise<string | null>;
24
37
  switchThread: (id: string) => void;
25
38
  deleteThread: (id: string) => Promise<void>;
26
- forkThread: (sourceId: string) => Promise<string | null>;
39
+ detachThread: (threadId: string) => Promise<void>;
40
+ forkThread: (sourceId: string, sourceSnapshot?: ChatThreadSnapshot | null) => Promise<string | null>;
27
41
  saveThreadData: (id: string, data: {
28
42
  threadData: string;
29
43
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"use-chat-threads.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,cAAc,CAC5B,MAAM,SAA+C,EACrD,UAAU,CAAC,EAAE,MAAM;;;;iCA+JF,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;uBAmBV,MAAM;uBAK/B,MAAM;2BAuGA,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;yBA9E1C,MAAM,QACJ;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;8BAgDc,MAAM,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;2BAiEnD,MAAM,KAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;;sBAzJ9C,MAAM;EA0Ld"}
1
+ {"version":3,"file":"use-chat-threads.d.ts","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AASD,wBAAgB,cAAc,CAC5B,MAAM,SAA+C,EACrD,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI;;;;iCAyMb,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;uBAuCV,MAAM;uBAK/B,MAAM;6BAzBA,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;2BA6I3B,MAAM,mBACC,kBAAkB,GAAG,IAAI,KACzC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;yBApFnB,MAAM,QACJ;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;8BAmDc,MAAM,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;2BA2EnD,MAAM,KAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;;sBA/K9C,MAAM;EAiNd"}
@@ -1,10 +1,22 @@
1
- import { useState, useEffect, useCallback, useRef } from "react";
1
+ import { useState, useEffect, useCallback, useRef, useMemo } from "react";
2
2
  import { agentNativePath } from "./api-path.js";
3
3
  const ACTIVE_THREAD_KEY = "agent-chat-active-thread";
4
- export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-chat"), storageKey) {
5
- const activeThreadKey = storageKey
6
- ? `${ACTIVE_THREAD_KEY}:${storageKey}`
7
- : ACTIVE_THREAD_KEY;
4
+ function scopeKeySegment(scope) {
5
+ if (!scope)
6
+ return "";
7
+ return `:scope:${scope.type}:${scope.id}`;
8
+ }
9
+ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-chat"), storageKey, scope) {
10
+ // Each (storageKey, scope) pair gets its own active-thread localStorage
11
+ // key, so navigating between decks/designs/dashboards lands on whatever
12
+ // thread the user had open last *for that resource* — not whichever
13
+ // thread was active globally.
14
+ const activeThreadKey = useMemo(() => {
15
+ const scopePart = scopeKeySegment(scope);
16
+ return storageKey
17
+ ? `${ACTIVE_THREAD_KEY}:${storageKey}${scopePart}`
18
+ : `${ACTIVE_THREAD_KEY}${scopePart}`;
19
+ }, [storageKey, scope?.type, scope?.id]);
8
20
  const [threads, setThreads] = useState([]);
9
21
  // IDs we generated client-side this session — consumers use this to know
10
22
  // whether to skip the per-thread restore skeleton, and we use it to
@@ -33,8 +45,24 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
33
45
  const fetchedRef = useRef(false);
34
46
  const activeThreadIdRef = useRef(activeThreadId);
35
47
  activeThreadIdRef.current = activeThreadId;
36
- // Persist active thread ID
48
+ // Persist active thread ID — and rehydrate on scope flips. When the
49
+ // user navigates from deck A to deck B, `activeThreadKey` changes; we
50
+ // need to re-read whatever thread was last active for B *before*
51
+ // persisting back, otherwise we'd write A's id under B's key on the
52
+ // very next render. The ref-and-branch pattern below keeps the two
53
+ // concerns in one effect without racing them.
54
+ const persistedKeyRef = useRef(activeThreadKey);
37
55
  useEffect(() => {
56
+ if (persistedKeyRef.current !== activeThreadKey) {
57
+ persistedKeyRef.current = activeThreadKey;
58
+ try {
59
+ setActiveThreadId(localStorage.getItem(activeThreadKey));
60
+ }
61
+ catch {
62
+ setActiveThreadId(null);
63
+ }
64
+ return;
65
+ }
38
66
  try {
39
67
  if (activeThreadId) {
40
68
  localStorage.setItem(activeThreadKey, activeThreadId);
@@ -79,6 +107,15 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
79
107
  if (local.title)
80
108
  next.title = local.title;
81
109
  }
110
+ // Preserve optimistic scope: when the server creates the row
111
+ // on first message it does so without scope, and the next PUT
112
+ // (saveThreadData) writes the local scope back. In the brief
113
+ // window between those, the server list returns scope: null
114
+ // while the user is clearly working inside a deck — keep the
115
+ // local value so the tab bar doesn't blink unscoped.
116
+ if (local.scope && !server.scope) {
117
+ next.scope = local.scope;
118
+ }
82
119
  return next;
83
120
  });
84
121
  return [...optimisticOnly, ...merged];
@@ -89,6 +126,12 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
89
126
  return undefined;
90
127
  }
91
128
  }, [apiUrl]);
129
+ // Latest scope as a ref so `createThread` (a useCallback that we don't
130
+ // want to depend on scope identity) reads the current value at call
131
+ // time. The scope a new chat inherits is the one in effect when the +
132
+ // button is clicked, not when the hook first mounted.
133
+ const scopeRef = useRef(scope);
134
+ scopeRef.current = scope;
92
135
  // Add a client-generated thread to the local list optimistically.
93
136
  //
94
137
  // Critically, this does NOT `POST /threads` to the server — that path was
@@ -98,7 +141,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
98
141
  // sends their first message (`persistSubmittedUserMessage` →
99
142
  // `createThread`), so the client doesn't need to pre-create it. This
100
143
  // makes the threads table reflect real conversations only.
101
- const addOptimisticThread = useCallback((id) => {
144
+ const addOptimisticThread = useCallback((id, threadScope) => {
102
145
  const now = Date.now();
103
146
  const optimistic = {
104
147
  id,
@@ -107,6 +150,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
107
150
  messageCount: 0,
108
151
  createdAt: now,
109
152
  updatedAt: now,
153
+ scope: threadScope,
110
154
  };
111
155
  setThreads((prev) => prev.some((t) => t.id === id) ? prev : [optimistic, ...prev]);
112
156
  }, []);
@@ -148,7 +192,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
148
192
  if (typeof crypto !== "undefined" && crypto.randomUUID) {
149
193
  const id = crypto.randomUUID();
150
194
  newlyCreatedRef.current.add(id);
151
- addOptimisticThread(id);
195
+ addOptimisticThread(id, scopeRef.current ?? null);
152
196
  setActiveThreadId(id);
153
197
  }
154
198
  }
@@ -162,10 +206,25 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
162
206
  // clicks "+" but never chats.
163
207
  const id = preferredId || crypto.randomUUID();
164
208
  newlyCreatedRef.current.add(id);
165
- addOptimisticThread(id);
209
+ addOptimisticThread(id, scopeRef.current ?? null);
166
210
  setActiveThreadId(id);
167
211
  return Promise.resolve(id);
168
212
  }, [addOptimisticThread]);
213
+ // Drop a thread's scope so it becomes a general (cross-resource) chat.
214
+ // This is the "Detach from <deck>" escape hatch in the UI. The PUT
215
+ // also bumps the thread's updatedAt so it surfaces in the All Chats
216
+ // list right away.
217
+ const detachThread = useCallback(async (threadId) => {
218
+ try {
219
+ await fetch(`${apiUrl}/threads/${encodeURIComponent(threadId)}`, {
220
+ method: "PUT",
221
+ headers: { "Content-Type": "application/json" },
222
+ body: JSON.stringify({ scope: null }),
223
+ });
224
+ setThreads((prev) => prev.map((t) => (t.id === threadId ? { ...t, scope: null } : t)));
225
+ }
226
+ catch { }
227
+ }, [apiUrl]);
169
228
  const isNewThread = useCallback((id) => newlyCreatedRef.current.has(id), []);
170
229
  const switchThread = useCallback((id) => {
171
230
  setActiveThreadId(id);
@@ -192,12 +251,21 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
192
251
  return next;
193
252
  });
194
253
  }, [apiUrl, activeThreadId, createThread]);
254
+ // Ref to look up the latest scope of a known thread inside
255
+ // saveThreadData without making the callback re-create on every
256
+ // setThreads. The thread's scope is owned by createThread /
257
+ // detachThread / fetchThreads — saveThreadData just mirrors it on
258
+ // every save so the server eventually catches up after
259
+ // persistSubmittedUserMessage creates the row sans scope.
260
+ const threadsRef = useRef(threads);
261
+ threadsRef.current = threads;
195
262
  const saveThreadData = useCallback(async (id, data) => {
196
263
  try {
264
+ const localScope = threadsRef.current.find((t) => t.id === id)?.scope ?? null;
197
265
  await fetch(`${apiUrl}/threads/${encodeURIComponent(id)}`, {
198
266
  method: "PUT",
199
267
  headers: { "Content-Type": "application/json" },
200
- body: JSON.stringify(data),
268
+ body: JSON.stringify({ ...data, scope: localScope }),
201
269
  });
202
270
  // Update local thread list metadata. If the thread isn't in our
203
271
  // local list yet (an optimistic-only thread that the server just
@@ -227,6 +295,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
227
295
  messageCount: data.messageCount ?? 0,
228
296
  createdAt: now,
229
297
  updatedAt: now,
298
+ scope: scopeRef.current ?? null,
230
299
  },
231
300
  ...prev,
232
301
  ];
@@ -255,13 +324,17 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
255
324
  return null;
256
325
  }
257
326
  }, [apiUrl]);
258
- const forkThread = useCallback(async (sourceId) => {
327
+ const forkThread = useCallback(async (sourceId, sourceSnapshot) => {
259
328
  const id = crypto.randomUUID();
260
329
  try {
330
+ const localScope = threadsRef.current.find((t) => t.id === sourceId)?.scope ?? null;
331
+ const source = sourceSnapshot && sourceSnapshot.messageCount > 0
332
+ ? { ...sourceSnapshot, scope: localScope }
333
+ : undefined;
261
334
  const res = await fetch(`${apiUrl}/threads/${encodeURIComponent(sourceId)}/fork`, {
262
335
  method: "POST",
263
336
  headers: { "Content-Type": "application/json" },
264
- body: JSON.stringify({ id }),
337
+ body: JSON.stringify({ id, ...(source ? { source } : {}) }),
265
338
  });
266
339
  if (!res.ok) {
267
340
  // Surface failures so a click on the Fork button isn't a silent
@@ -278,6 +351,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
278
351
  messageCount: thread.messageCount,
279
352
  createdAt: thread.createdAt,
280
353
  updatedAt: thread.updatedAt,
354
+ scope: thread.scope ?? null,
281
355
  },
282
356
  ...prev,
283
357
  ]);
@@ -310,6 +384,7 @@ export function useChatThreads(apiUrl = agentNativePath("/_agent-native/agent-ch
310
384
  createThread,
311
385
  switchThread,
312
386
  deleteThread: removeThread,
387
+ detachThread,
313
388
  forkThread,
314
389
  saveThreadData,
315
390
  generateTitle,