@agent-native/core 0.7.14 → 0.7.15

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 (737) hide show
  1. package/README.md +56 -6
  2. package/dist/a2a/handlers.d.ts.map +1 -1
  3. package/dist/a2a/handlers.js +149 -24
  4. package/dist/a2a/handlers.js.map +1 -1
  5. package/dist/a2a/server.d.ts.map +1 -1
  6. package/dist/a2a/server.js +166 -51
  7. package/dist/a2a/server.js.map +1 -1
  8. package/dist/a2a/task-store.d.ts +10 -1
  9. package/dist/a2a/task-store.d.ts.map +1 -1
  10. package/dist/a2a/task-store.js +36 -2
  11. package/dist/a2a/task-store.js.map +1 -1
  12. package/dist/agent/default-model.d.ts +21 -0
  13. package/dist/agent/default-model.d.ts.map +1 -0
  14. package/dist/agent/default-model.js +21 -0
  15. package/dist/agent/default-model.js.map +1 -0
  16. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  17. package/dist/agent/engine/ai-sdk-engine.js +7 -4
  18. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  19. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  20. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  21. package/dist/agent/engine/anthropic-engine.js +10 -4
  22. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  23. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  24. package/dist/agent/engine/builder-engine.js +4 -1
  25. package/dist/agent/engine/builder-engine.js.map +1 -1
  26. package/dist/agent/engine/builtin.js +1 -1
  27. package/dist/agent/engine/builtin.js.map +1 -1
  28. package/dist/agent/engine/registry.d.ts +27 -7
  29. package/dist/agent/engine/registry.d.ts.map +1 -1
  30. package/dist/agent/engine/registry.js +101 -20
  31. package/dist/agent/engine/registry.js.map +1 -1
  32. package/dist/agent/index.d.ts +1 -0
  33. package/dist/agent/index.d.ts.map +1 -1
  34. package/dist/agent/index.js +1 -0
  35. package/dist/agent/index.js.map +1 -1
  36. package/dist/agent/production-agent.d.ts +25 -3
  37. package/dist/agent/production-agent.d.ts.map +1 -1
  38. package/dist/agent/production-agent.js +227 -36
  39. package/dist/agent/production-agent.js.map +1 -1
  40. package/dist/application-state/handlers.d.ts.map +1 -1
  41. package/dist/application-state/handlers.js +10 -6
  42. package/dist/application-state/handlers.js.map +1 -1
  43. package/dist/application-state/script-helpers.d.ts +1 -1
  44. package/dist/application-state/script-helpers.d.ts.map +1 -1
  45. package/dist/application-state/script-helpers.js +12 -8
  46. package/dist/application-state/script-helpers.js.map +1 -1
  47. package/dist/application-state/store.d.ts.map +1 -1
  48. package/dist/application-state/store.js +19 -10
  49. package/dist/application-state/store.js.map +1 -1
  50. package/dist/chat-threads/store.d.ts.map +1 -1
  51. package/dist/chat-threads/store.js +4 -1
  52. package/dist/chat-threads/store.js.map +1 -1
  53. package/dist/cli/create.d.ts.map +1 -1
  54. package/dist/cli/create.js +79 -13
  55. package/dist/cli/create.js.map +1 -1
  56. package/dist/cli/index.js +97 -39
  57. package/dist/cli/index.js.map +1 -1
  58. package/dist/cli/templates-meta.d.ts +4 -0
  59. package/dist/cli/templates-meta.d.ts.map +1 -1
  60. package/dist/cli/templates-meta.js +56 -12
  61. package/dist/cli/templates-meta.js.map +1 -1
  62. package/dist/cli/workspacify.d.ts +2 -0
  63. package/dist/cli/workspacify.d.ts.map +1 -1
  64. package/dist/cli/workspacify.js +5 -4
  65. package/dist/cli/workspacify.js.map +1 -1
  66. package/dist/client/AgentPanel.d.ts +5 -2
  67. package/dist/client/AgentPanel.d.ts.map +1 -1
  68. package/dist/client/AgentPanel.js +61 -23
  69. package/dist/client/AgentPanel.js.map +1 -1
  70. package/dist/client/AgentTaskCard.d.ts.map +1 -1
  71. package/dist/client/AgentTaskCard.js +3 -2
  72. package/dist/client/AgentTaskCard.js.map +1 -1
  73. package/dist/client/AssistantChat.d.ts.map +1 -1
  74. package/dist/client/AssistantChat.js +79 -16
  75. package/dist/client/AssistantChat.js.map +1 -1
  76. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  77. package/dist/client/ConnectBuilderCard.js +2 -1
  78. package/dist/client/ConnectBuilderCard.js.map +1 -1
  79. package/dist/client/DefaultSpinner.d.ts +1 -1
  80. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  81. package/dist/client/DefaultSpinner.js +2 -9
  82. package/dist/client/DefaultSpinner.js.map +1 -1
  83. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  84. package/dist/client/MultiTabAssistantChat.js +20 -19
  85. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  86. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  87. package/dist/client/agent-chat-adapter.js +2 -1
  88. package/dist/client/agent-chat-adapter.js.map +1 -1
  89. package/dist/client/agent-chat.d.ts.map +1 -1
  90. package/dist/client/agent-chat.js +3 -1
  91. package/dist/client/agent-chat.js.map +1 -1
  92. package/dist/client/analytics.d.ts.map +1 -1
  93. package/dist/client/analytics.js +70 -1
  94. package/dist/client/analytics.js.map +1 -1
  95. package/dist/client/api-path.d.ts +5 -0
  96. package/dist/client/api-path.d.ts.map +1 -0
  97. package/dist/client/api-path.js +48 -0
  98. package/dist/client/api-path.js.map +1 -0
  99. package/dist/client/components/ApiKeySettings.d.ts.map +1 -1
  100. package/dist/client/components/ApiKeySettings.js +3 -2
  101. package/dist/client/components/ApiKeySettings.js.map +1 -1
  102. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  103. package/dist/client/components/CodeRequiredDialog.js +3 -2
  104. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  105. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  106. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  107. package/dist/client/composer/TiptapComposer.js +9 -8
  108. package/dist/client/composer/TiptapComposer.js.map +1 -1
  109. package/dist/client/composer/draft-key.d.ts +2 -0
  110. package/dist/client/composer/draft-key.d.ts.map +1 -0
  111. package/dist/client/composer/draft-key.js +8 -0
  112. package/dist/client/composer/draft-key.js.map +1 -0
  113. package/dist/client/composer/use-file-search.d.ts.map +1 -1
  114. package/dist/client/composer/use-file-search.js +2 -1
  115. package/dist/client/composer/use-file-search.js.map +1 -1
  116. package/dist/client/composer/use-mention-search.d.ts.map +1 -1
  117. package/dist/client/composer/use-mention-search.js +2 -1
  118. package/dist/client/composer/use-mention-search.js.map +1 -1
  119. package/dist/client/composer/use-skills.d.ts.map +1 -1
  120. package/dist/client/composer/use-skills.js +2 -1
  121. package/dist/client/composer/use-skills.js.map +1 -1
  122. package/dist/client/composer/useVoiceDictation.d.ts +1 -1
  123. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  124. package/dist/client/composer/useVoiceDictation.js +16 -8
  125. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  126. package/dist/client/dev-mode.d.ts +14 -0
  127. package/dist/client/dev-mode.d.ts.map +1 -0
  128. package/dist/client/dev-mode.js +14 -0
  129. package/dist/client/dev-mode.js.map +1 -0
  130. package/dist/client/dev-overlay/DevOverlay.d.ts +26 -0
  131. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -0
  132. package/dist/client/dev-overlay/DevOverlay.js +315 -0
  133. package/dist/client/dev-overlay/DevOverlay.js.map +1 -0
  134. package/dist/client/dev-overlay/builtins.d.ts +6 -0
  135. package/dist/client/dev-overlay/builtins.d.ts.map +1 -0
  136. package/dist/client/dev-overlay/builtins.js +35 -0
  137. package/dist/client/dev-overlay/builtins.js.map +1 -0
  138. package/dist/client/dev-overlay/index.d.ts +6 -0
  139. package/dist/client/dev-overlay/index.d.ts.map +1 -0
  140. package/dist/client/dev-overlay/index.js +5 -0
  141. package/dist/client/dev-overlay/index.js.map +1 -0
  142. package/dist/client/dev-overlay/registry.d.ts +13 -0
  143. package/dist/client/dev-overlay/registry.d.ts.map +1 -0
  144. package/dist/client/dev-overlay/registry.js +63 -0
  145. package/dist/client/dev-overlay/registry.js.map +1 -0
  146. package/dist/client/dev-overlay/types.d.ts +56 -0
  147. package/dist/client/dev-overlay/types.d.ts.map +1 -0
  148. package/dist/client/dev-overlay/types.js +9 -0
  149. package/dist/client/dev-overlay/types.js.map +1 -0
  150. package/dist/client/dev-overlay/use-dev-option.d.ts +12 -0
  151. package/dist/client/dev-overlay/use-dev-option.d.ts.map +1 -0
  152. package/dist/client/dev-overlay/use-dev-option.js +73 -0
  153. package/dist/client/dev-overlay/use-dev-option.js.map +1 -0
  154. package/dist/client/dev-overlay/use-dev-overlay-shortcut.d.ts +6 -0
  155. package/dist/client/dev-overlay/use-dev-overlay-shortcut.d.ts.map +1 -0
  156. package/dist/client/dev-overlay/use-dev-overlay-shortcut.js +29 -0
  157. package/dist/client/dev-overlay/use-dev-overlay-shortcut.js.map +1 -0
  158. package/dist/client/frame.d.ts +1 -0
  159. package/dist/client/frame.d.ts.map +1 -1
  160. package/dist/client/frame.js +32 -11
  161. package/dist/client/frame.js.map +1 -1
  162. package/dist/client/index.d.ts +4 -0
  163. package/dist/client/index.d.ts.map +1 -1
  164. package/dist/client/index.js +4 -0
  165. package/dist/client/index.js.map +1 -1
  166. package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
  167. package/dist/client/integrations/IntegrationCard.js +3 -2
  168. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  169. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  170. package/dist/client/integrations/IntegrationsPanel.js +3 -2
  171. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  172. package/dist/client/integrations/useIntegrationStatus.d.ts.map +1 -1
  173. package/dist/client/integrations/useIntegrationStatus.js +2 -1
  174. package/dist/client/integrations/useIntegrationStatus.js.map +1 -1
  175. package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
  176. package/dist/client/notifications/NotificationsBell.js +26 -8
  177. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  178. package/dist/client/observability/ThumbsFeedback.d.ts.map +1 -1
  179. package/dist/client/observability/ThumbsFeedback.js +2 -1
  180. package/dist/client/observability/ThumbsFeedback.js.map +1 -1
  181. package/dist/client/observability/useObservability.d.ts.map +1 -1
  182. package/dist/client/observability/useObservability.js +2 -1
  183. package/dist/client/observability/useObservability.js.map +1 -1
  184. package/dist/client/onboarding/OnboardingPanel.d.ts +0 -7
  185. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  186. package/dist/client/onboarding/OnboardingPanel.js +20 -10
  187. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  188. package/dist/client/onboarding/index.d.ts +1 -0
  189. package/dist/client/onboarding/index.d.ts.map +1 -1
  190. package/dist/client/onboarding/index.js +1 -0
  191. package/dist/client/onboarding/index.js.map +1 -1
  192. package/dist/client/onboarding/use-onboarding.d.ts +1 -7
  193. package/dist/client/onboarding/use-onboarding.d.ts.map +1 -1
  194. package/dist/client/onboarding/use-onboarding.js +27 -13
  195. package/dist/client/onboarding/use-onboarding.js.map +1 -1
  196. package/dist/client/onboarding/use-preview-mode.d.ts +10 -0
  197. package/dist/client/onboarding/use-preview-mode.d.ts.map +1 -0
  198. package/dist/client/onboarding/use-preview-mode.js +35 -0
  199. package/dist/client/onboarding/use-preview-mode.js.map +1 -0
  200. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  201. package/dist/client/org/OrgSwitcher.js +2 -1
  202. package/dist/client/org/OrgSwitcher.js.map +1 -1
  203. package/dist/client/org/TeamPage.d.ts.map +1 -1
  204. package/dist/client/org/TeamPage.js +7 -5
  205. package/dist/client/org/TeamPage.js.map +1 -1
  206. package/dist/client/org/hooks.d.ts.map +1 -1
  207. package/dist/client/org/hooks.js +2 -1
  208. package/dist/client/org/hooks.js.map +1 -1
  209. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  210. package/dist/client/progress/RunsTray.js +2 -1
  211. package/dist/client/progress/RunsTray.js.map +1 -1
  212. package/dist/client/resources/McpServerDetail.d.ts +0 -8
  213. package/dist/client/resources/McpServerDetail.d.ts.map +1 -1
  214. package/dist/client/resources/McpServerDetail.js +6 -1
  215. package/dist/client/resources/McpServerDetail.js.map +1 -1
  216. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  217. package/dist/client/resources/ResourceEditor.js +2 -1
  218. package/dist/client/resources/ResourceEditor.js.map +1 -1
  219. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  220. package/dist/client/resources/ResourcesPanel.js +2 -1
  221. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  222. package/dist/client/resources/use-mcp-servers.d.ts.map +1 -1
  223. package/dist/client/resources/use-mcp-servers.js +7 -2
  224. package/dist/client/resources/use-mcp-servers.js.map +1 -1
  225. package/dist/client/resources/use-resources.d.ts.map +1 -1
  226. package/dist/client/resources/use-resources.js +9 -7
  227. package/dist/client/resources/use-resources.js.map +1 -1
  228. package/dist/client/settings/AgentsSection.d.ts.map +1 -1
  229. package/dist/client/settings/AgentsSection.js +7 -5
  230. package/dist/client/settings/AgentsSection.js.map +1 -1
  231. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  232. package/dist/client/settings/AutomationsSection.js +9 -5
  233. package/dist/client/settings/AutomationsSection.js.map +1 -1
  234. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  235. package/dist/client/settings/BackgroundAgentSection.js +2 -1
  236. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  237. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  238. package/dist/client/settings/SecretsSection.js +12 -4
  239. package/dist/client/settings/SecretsSection.js.map +1 -1
  240. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  241. package/dist/client/settings/SettingsPanel.js +15 -23
  242. package/dist/client/settings/SettingsPanel.js.map +1 -1
  243. package/dist/client/settings/UsageSection.d.ts.map +1 -1
  244. package/dist/client/settings/UsageSection.js +2 -1
  245. package/dist/client/settings/UsageSection.js.map +1 -1
  246. package/dist/client/settings/VoiceTranscriptionSection.d.ts +2 -4
  247. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  248. package/dist/client/settings/VoiceTranscriptionSection.js +66 -23
  249. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  250. package/dist/client/settings/useBuilderStatus.d.ts +9 -0
  251. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  252. package/dist/client/settings/useBuilderStatus.js +31 -3
  253. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  254. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  255. package/dist/client/sharing/ShareButton.js +7 -2
  256. package/dist/client/sharing/ShareButton.js.map +1 -1
  257. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  258. package/dist/client/sharing/ShareDialog.js +4 -3
  259. package/dist/client/sharing/ShareDialog.js.map +1 -1
  260. package/dist/client/terminal/AgentTerminal.d.ts +1 -0
  261. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  262. package/dist/client/terminal/AgentTerminal.js +12 -8
  263. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  264. package/dist/client/tools/EmbeddedTool.d.ts +20 -0
  265. package/dist/client/tools/EmbeddedTool.d.ts.map +1 -0
  266. package/dist/client/tools/EmbeddedTool.js +113 -0
  267. package/dist/client/tools/EmbeddedTool.js.map +1 -0
  268. package/dist/client/tools/ExtensionSlot.d.ts +27 -0
  269. package/dist/client/tools/ExtensionSlot.d.ts.map +1 -0
  270. package/dist/client/tools/ExtensionSlot.js +96 -0
  271. package/dist/client/tools/ExtensionSlot.js.map +1 -0
  272. package/dist/client/tools/ToolEditor.d.ts.map +1 -1
  273. package/dist/client/tools/ToolEditor.js +5 -4
  274. package/dist/client/tools/ToolEditor.js.map +1 -1
  275. package/dist/client/tools/ToolViewer.d.ts.map +1 -1
  276. package/dist/client/tools/ToolViewer.js +10 -44
  277. package/dist/client/tools/ToolViewer.js.map +1 -1
  278. package/dist/client/tools/ToolViewerPage.d.ts.map +1 -1
  279. package/dist/client/tools/ToolViewerPage.js +2 -1
  280. package/dist/client/tools/ToolViewerPage.js.map +1 -1
  281. package/dist/client/tools/ToolsListPage.d.ts.map +1 -1
  282. package/dist/client/tools/ToolsListPage.js +3 -2
  283. package/dist/client/tools/ToolsListPage.js.map +1 -1
  284. package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -1
  285. package/dist/client/tools/ToolsSidebarSection.js +4 -3
  286. package/dist/client/tools/ToolsSidebarSection.js.map +1 -1
  287. package/dist/client/tools/iframe-bridge.d.ts +16 -0
  288. package/dist/client/tools/iframe-bridge.d.ts.map +1 -0
  289. package/dist/client/tools/iframe-bridge.js +118 -0
  290. package/dist/client/tools/iframe-bridge.js.map +1 -0
  291. package/dist/client/tools/index.d.ts +2 -0
  292. package/dist/client/tools/index.d.ts.map +1 -1
  293. package/dist/client/tools/index.js +2 -0
  294. package/dist/client/tools/index.js.map +1 -1
  295. package/dist/client/use-action.d.ts.map +1 -1
  296. package/dist/client/use-action.js +2 -1
  297. package/dist/client/use-action.js.map +1 -1
  298. package/dist/client/use-avatar.d.ts.map +1 -1
  299. package/dist/client/use-avatar.js +3 -2
  300. package/dist/client/use-avatar.js.map +1 -1
  301. package/dist/client/use-builder-enabled.d.ts.map +1 -1
  302. package/dist/client/use-builder-enabled.js +2 -1
  303. package/dist/client/use-builder-enabled.js.map +1 -1
  304. package/dist/client/use-chat-threads.d.ts.map +1 -1
  305. package/dist/client/use-chat-threads.js +2 -1
  306. package/dist/client/use-chat-threads.js.map +1 -1
  307. package/dist/client/use-db-sync.d.ts.map +1 -1
  308. package/dist/client/use-db-sync.js +3 -2
  309. package/dist/client/use-db-sync.js.map +1 -1
  310. package/dist/client/use-dev-mode.d.ts.map +1 -1
  311. package/dist/client/use-dev-mode.js +2 -1
  312. package/dist/client/use-dev-mode.js.map +1 -1
  313. package/dist/client/use-send-to-agent-chat.d.ts.map +1 -1
  314. package/dist/client/use-send-to-agent-chat.js +3 -1
  315. package/dist/client/use-send-to-agent-chat.js.map +1 -1
  316. package/dist/client/use-session.d.ts.map +1 -1
  317. package/dist/client/use-session.js +2 -1
  318. package/dist/client/use-session.js.map +1 -1
  319. package/dist/client/useProductionAgent.d.ts.map +1 -1
  320. package/dist/client/useProductionAgent.js +2 -1
  321. package/dist/client/useProductionAgent.js.map +1 -1
  322. package/dist/collab/client.d.ts.map +1 -1
  323. package/dist/collab/client.js +3 -2
  324. package/dist/collab/client.js.map +1 -1
  325. package/dist/credentials/index.d.ts +27 -10
  326. package/dist/credentials/index.d.ts.map +1 -1
  327. package/dist/credentials/index.js +61 -19
  328. package/dist/credentials/index.js.map +1 -1
  329. package/dist/db/client.d.ts.map +1 -1
  330. package/dist/db/client.js +10 -1
  331. package/dist/db/client.js.map +1 -1
  332. package/dist/db/migrations.d.ts +13 -5
  333. package/dist/db/migrations.d.ts.map +1 -1
  334. package/dist/db/migrations.js +9 -2
  335. package/dist/db/migrations.js.map +1 -1
  336. package/dist/deploy/build.d.ts +12 -1
  337. package/dist/deploy/build.d.ts.map +1 -1
  338. package/dist/deploy/build.js +195 -23
  339. package/dist/deploy/build.js.map +1 -1
  340. package/dist/file-upload/registry.d.ts.map +1 -1
  341. package/dist/file-upload/registry.js +25 -1
  342. package/dist/file-upload/registry.js.map +1 -1
  343. package/dist/index.d.ts +1 -1
  344. package/dist/index.d.ts.map +1 -1
  345. package/dist/index.js +1 -1
  346. package/dist/index.js.map +1 -1
  347. package/dist/integrations/adapters/email.d.ts.map +1 -1
  348. package/dist/integrations/adapters/email.js +152 -32
  349. package/dist/integrations/adapters/email.js.map +1 -1
  350. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  351. package/dist/integrations/adapters/slack.js +190 -32
  352. package/dist/integrations/adapters/slack.js.map +1 -1
  353. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  354. package/dist/integrations/adapters/telegram.js +37 -2
  355. package/dist/integrations/adapters/telegram.js.map +1 -1
  356. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  357. package/dist/integrations/adapters/whatsapp.js +91 -12
  358. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  359. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  360. package/dist/integrations/google-docs-poller.js +5 -2
  361. package/dist/integrations/google-docs-poller.js.map +1 -1
  362. package/dist/integrations/internal-token.d.ts.map +1 -1
  363. package/dist/integrations/internal-token.js +17 -1
  364. package/dist/integrations/internal-token.js.map +1 -1
  365. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
  366. package/dist/integrations/pending-tasks-retry-job.js +18 -7
  367. package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
  368. package/dist/integrations/pending-tasks-store.d.ts +16 -0
  369. package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
  370. package/dist/integrations/pending-tasks-store.js +58 -5
  371. package/dist/integrations/pending-tasks-store.js.map +1 -1
  372. package/dist/integrations/plugin.d.ts.map +1 -1
  373. package/dist/integrations/plugin.js +198 -15
  374. package/dist/integrations/plugin.js.map +1 -1
  375. package/dist/integrations/types.d.ts +33 -2
  376. package/dist/integrations/types.d.ts.map +1 -1
  377. package/dist/integrations/webhook-handler.d.ts +6 -0
  378. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  379. package/dist/integrations/webhook-handler.js +141 -61
  380. package/dist/integrations/webhook-handler.js.map +1 -1
  381. package/dist/jobs/cron.d.ts.map +1 -1
  382. package/dist/jobs/cron.js +12 -4
  383. package/dist/jobs/cron.js.map +1 -1
  384. package/dist/jobs/scheduler.d.ts.map +1 -1
  385. package/dist/jobs/scheduler.js +141 -16
  386. package/dist/jobs/scheduler.js.map +1 -1
  387. package/dist/jobs/tools.d.ts.map +1 -1
  388. package/dist/jobs/tools.js +94 -3
  389. package/dist/jobs/tools.js.map +1 -1
  390. package/dist/mcp/server.d.ts.map +1 -1
  391. package/dist/mcp/server.js +128 -62
  392. package/dist/mcp/server.js.map +1 -1
  393. package/dist/mcp-client/hub-routes.d.ts +14 -0
  394. package/dist/mcp-client/hub-routes.d.ts.map +1 -1
  395. package/dist/mcp-client/hub-routes.js +42 -2
  396. package/dist/mcp-client/hub-routes.js.map +1 -1
  397. package/dist/mcp-client/index.d.ts +1 -1
  398. package/dist/mcp-client/index.d.ts.map +1 -1
  399. package/dist/mcp-client/index.js +1 -1
  400. package/dist/mcp-client/index.js.map +1 -1
  401. package/dist/mcp-client/manager.d.ts.map +1 -1
  402. package/dist/mcp-client/manager.js +28 -3
  403. package/dist/mcp-client/manager.js.map +1 -1
  404. package/dist/mcp-client/remote-store.d.ts +49 -1
  405. package/dist/mcp-client/remote-store.d.ts.map +1 -1
  406. package/dist/mcp-client/remote-store.js +253 -6
  407. package/dist/mcp-client/remote-store.js.map +1 -1
  408. package/dist/mcp-client/routes.d.ts.map +1 -1
  409. package/dist/mcp-client/routes.js +11 -9
  410. package/dist/mcp-client/routes.js.map +1 -1
  411. package/dist/mcp-client/visibility.d.ts +7 -3
  412. package/dist/mcp-client/visibility.d.ts.map +1 -1
  413. package/dist/mcp-client/visibility.js +16 -7
  414. package/dist/mcp-client/visibility.js.map +1 -1
  415. package/dist/notifications/actions.d.ts.map +1 -1
  416. package/dist/notifications/actions.js +7 -1
  417. package/dist/notifications/actions.js.map +1 -1
  418. package/dist/notifications/routes.d.ts +1 -1
  419. package/dist/notifications/routes.d.ts.map +1 -1
  420. package/dist/notifications/routes.js +20 -3
  421. package/dist/notifications/routes.js.map +1 -1
  422. package/dist/notifications/store.d.ts.map +1 -1
  423. package/dist/notifications/store.js +6 -1
  424. package/dist/notifications/store.js.map +1 -1
  425. package/dist/oauth-tokens/store.d.ts +43 -2
  426. package/dist/oauth-tokens/store.d.ts.map +1 -1
  427. package/dist/oauth-tokens/store.js +83 -14
  428. package/dist/oauth-tokens/store.js.map +1 -1
  429. package/dist/observability/experiments.js +5 -5
  430. package/dist/observability/experiments.js.map +1 -1
  431. package/dist/observability/routes.d.ts.map +1 -1
  432. package/dist/observability/routes.js +37 -8
  433. package/dist/observability/routes.js.map +1 -1
  434. package/dist/observability/store.d.ts.map +1 -1
  435. package/dist/observability/store.js +19 -3
  436. package/dist/observability/store.js.map +1 -1
  437. package/dist/observability/types.d.ts +7 -0
  438. package/dist/observability/types.d.ts.map +1 -1
  439. package/dist/observability/types.js.map +1 -1
  440. package/dist/onboarding/default-steps.d.ts.map +1 -1
  441. package/dist/onboarding/default-steps.js +1 -2
  442. package/dist/onboarding/default-steps.js.map +1 -1
  443. package/dist/onboarding/plugin.d.ts.map +1 -1
  444. package/dist/onboarding/plugin.js +63 -32
  445. package/dist/onboarding/plugin.js.map +1 -1
  446. package/dist/onboarding/types.d.ts +6 -1
  447. package/dist/onboarding/types.d.ts.map +1 -1
  448. package/dist/org/accept-pending.d.ts.map +1 -1
  449. package/dist/org/accept-pending.js +2 -1
  450. package/dist/org/accept-pending.js.map +1 -1
  451. package/dist/progress/actions.d.ts.map +1 -1
  452. package/dist/progress/actions.js +10 -1
  453. package/dist/progress/actions.js.map +1 -1
  454. package/dist/progress/routes.d.ts +1 -1
  455. package/dist/progress/routes.d.ts.map +1 -1
  456. package/dist/progress/routes.js +20 -3
  457. package/dist/progress/routes.js.map +1 -1
  458. package/dist/progress/store.d.ts.map +1 -1
  459. package/dist/progress/store.js +6 -1
  460. package/dist/progress/store.js.map +1 -1
  461. package/dist/resources/handlers.d.ts.map +1 -1
  462. package/dist/resources/handlers.js +35 -7
  463. package/dist/resources/handlers.js.map +1 -1
  464. package/dist/resources/script-helpers.d.ts.map +1 -1
  465. package/dist/resources/script-helpers.js +15 -3
  466. package/dist/resources/script-helpers.js.map +1 -1
  467. package/dist/resources/store.d.ts.map +1 -1
  468. package/dist/resources/store.js +12 -4
  469. package/dist/resources/store.js.map +1 -1
  470. package/dist/scripts/call-agent.d.ts +1 -0
  471. package/dist/scripts/call-agent.d.ts.map +1 -1
  472. package/dist/scripts/call-agent.js +78 -40
  473. package/dist/scripts/call-agent.js.map +1 -1
  474. package/dist/scripts/chat/search-chats.d.ts.map +1 -1
  475. package/dist/scripts/chat/search-chats.js +3 -2
  476. package/dist/scripts/chat/search-chats.js.map +1 -1
  477. package/dist/scripts/db/exec.d.ts +1 -1
  478. package/dist/scripts/db/exec.d.ts.map +1 -1
  479. package/dist/scripts/db/exec.js +22 -3
  480. package/dist/scripts/db/exec.js.map +1 -1
  481. package/dist/scripts/db/migrate-user-api-keys.d.ts.map +1 -1
  482. package/dist/scripts/db/migrate-user-api-keys.js +10 -0
  483. package/dist/scripts/db/migrate-user-api-keys.js.map +1 -1
  484. package/dist/scripts/db/query.d.ts +1 -1
  485. package/dist/scripts/db/query.d.ts.map +1 -1
  486. package/dist/scripts/db/query.js +22 -3
  487. package/dist/scripts/db/query.js.map +1 -1
  488. package/dist/scripts/db/scoping.d.ts.map +1 -1
  489. package/dist/scripts/db/scoping.js +15 -9
  490. package/dist/scripts/db/scoping.js.map +1 -1
  491. package/dist/scripts/dev/shell.d.ts.map +1 -1
  492. package/dist/scripts/dev/shell.js +3 -1
  493. package/dist/scripts/dev/shell.js.map +1 -1
  494. package/dist/scripts/resources/delete-memory.d.ts.map +1 -1
  495. package/dist/scripts/resources/delete-memory.js +2 -1
  496. package/dist/scripts/resources/delete-memory.js.map +1 -1
  497. package/dist/scripts/resources/delete.d.ts.map +1 -1
  498. package/dist/scripts/resources/delete.js +2 -1
  499. package/dist/scripts/resources/delete.js.map +1 -1
  500. package/dist/scripts/resources/list.d.ts.map +1 -1
  501. package/dist/scripts/resources/list.js +2 -1
  502. package/dist/scripts/resources/list.js.map +1 -1
  503. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
  504. package/dist/scripts/resources/migrate-learnings.js +2 -1
  505. package/dist/scripts/resources/migrate-learnings.js.map +1 -1
  506. package/dist/scripts/resources/read.d.ts.map +1 -1
  507. package/dist/scripts/resources/read.js +2 -1
  508. package/dist/scripts/resources/read.js.map +1 -1
  509. package/dist/scripts/resources/save-memory.d.ts.map +1 -1
  510. package/dist/scripts/resources/save-memory.js +2 -1
  511. package/dist/scripts/resources/save-memory.js.map +1 -1
  512. package/dist/scripts/resources/write.d.ts.map +1 -1
  513. package/dist/scripts/resources/write.js +2 -1
  514. package/dist/scripts/resources/write.js.map +1 -1
  515. package/dist/secrets/onboarding.d.ts.map +1 -1
  516. package/dist/secrets/onboarding.js +24 -16
  517. package/dist/secrets/onboarding.js.map +1 -1
  518. package/dist/secrets/routes.d.ts.map +1 -1
  519. package/dist/secrets/routes.js +139 -37
  520. package/dist/secrets/routes.js.map +1 -1
  521. package/dist/secrets/storage.d.ts.map +1 -1
  522. package/dist/secrets/storage.js +23 -12
  523. package/dist/secrets/storage.js.map +1 -1
  524. package/dist/secrets/substitution.d.ts +24 -2
  525. package/dist/secrets/substitution.d.ts.map +1 -1
  526. package/dist/secrets/substitution.js +44 -6
  527. package/dist/secrets/substitution.js.map +1 -1
  528. package/dist/server/action-discovery.d.ts.map +1 -1
  529. package/dist/server/action-discovery.js +15 -51
  530. package/dist/server/action-discovery.js.map +1 -1
  531. package/dist/server/action-routes.d.ts.map +1 -1
  532. package/dist/server/action-routes.js +42 -15
  533. package/dist/server/action-routes.js.map +1 -1
  534. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  535. package/dist/server/agent-chat-plugin.js +447 -335
  536. package/dist/server/agent-chat-plugin.js.map +1 -1
  537. package/dist/server/agent-discovery.d.ts +8 -0
  538. package/dist/server/agent-discovery.d.ts.map +1 -1
  539. package/dist/server/agent-discovery.js +39 -12
  540. package/dist/server/agent-discovery.js.map +1 -1
  541. package/dist/server/agent-teams.d.ts.map +1 -1
  542. package/dist/server/agent-teams.js +4 -1
  543. package/dist/server/agent-teams.js.map +1 -1
  544. package/dist/server/analytics.d.ts +0 -1
  545. package/dist/server/analytics.d.ts.map +1 -1
  546. package/dist/server/analytics.js +0 -1
  547. package/dist/server/analytics.js.map +1 -1
  548. package/dist/server/app-base-path.d.ts +4 -0
  549. package/dist/server/app-base-path.d.ts.map +1 -0
  550. package/dist/server/app-base-path.js +33 -0
  551. package/dist/server/app-base-path.js.map +1 -0
  552. package/dist/server/auth.d.ts +15 -0
  553. package/dist/server/auth.d.ts.map +1 -1
  554. package/dist/server/auth.js +400 -68
  555. package/dist/server/auth.js.map +1 -1
  556. package/dist/server/better-auth-instance.d.ts +1 -0
  557. package/dist/server/better-auth-instance.d.ts.map +1 -1
  558. package/dist/server/better-auth-instance.js +67 -15
  559. package/dist/server/better-auth-instance.js.map +1 -1
  560. package/dist/server/builder-browser.d.ts +15 -0
  561. package/dist/server/builder-browser.d.ts.map +1 -1
  562. package/dist/server/builder-browser.js +90 -4
  563. package/dist/server/builder-browser.js.map +1 -1
  564. package/dist/server/cli-capture.d.ts +31 -0
  565. package/dist/server/cli-capture.d.ts.map +1 -0
  566. package/dist/server/cli-capture.js +120 -0
  567. package/dist/server/cli-capture.js.map +1 -0
  568. package/dist/server/collab-plugin.d.ts +12 -0
  569. package/dist/server/collab-plugin.d.ts.map +1 -1
  570. package/dist/server/collab-plugin.js +63 -21
  571. package/dist/server/collab-plugin.js.map +1 -1
  572. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  573. package/dist/server/core-routes-plugin.js +435 -106
  574. package/dist/server/core-routes-plugin.js.map +1 -1
  575. package/dist/server/create-server.d.ts +2 -0
  576. package/dist/server/create-server.d.ts.map +1 -1
  577. package/dist/server/create-server.js +82 -11
  578. package/dist/server/create-server.js.map +1 -1
  579. package/dist/server/credential-provider.d.ts +11 -0
  580. package/dist/server/credential-provider.d.ts.map +1 -1
  581. package/dist/server/credential-provider.js +51 -2
  582. package/dist/server/credential-provider.js.map +1 -1
  583. package/dist/server/csrf.d.ts +58 -0
  584. package/dist/server/csrf.d.ts.map +1 -0
  585. package/dist/server/csrf.js +165 -0
  586. package/dist/server/csrf.js.map +1 -0
  587. package/dist/server/framework-request-handler.d.ts +20 -0
  588. package/dist/server/framework-request-handler.d.ts.map +1 -1
  589. package/dist/server/framework-request-handler.js +115 -34
  590. package/dist/server/framework-request-handler.js.map +1 -1
  591. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  592. package/dist/server/google-auth-plugin.js +10 -2
  593. package/dist/server/google-auth-plugin.js.map +1 -1
  594. package/dist/server/google-oauth.d.ts +84 -2
  595. package/dist/server/google-oauth.d.ts.map +1 -1
  596. package/dist/server/google-oauth.js +248 -45
  597. package/dist/server/google-oauth.js.map +1 -1
  598. package/dist/server/index.d.ts +4 -4
  599. package/dist/server/index.d.ts.map +1 -1
  600. package/dist/server/index.js +4 -4
  601. package/dist/server/index.js.map +1 -1
  602. package/dist/server/oauth-helpers.d.ts +8 -3
  603. package/dist/server/oauth-helpers.d.ts.map +1 -1
  604. package/dist/server/oauth-helpers.js +12 -8
  605. package/dist/server/oauth-helpers.js.map +1 -1
  606. package/dist/server/onboarding-html.d.ts.map +1 -1
  607. package/dist/server/onboarding-html.js +37 -9
  608. package/dist/server/onboarding-html.js.map +1 -1
  609. package/dist/server/poll.d.ts +33 -0
  610. package/dist/server/poll.d.ts.map +1 -1
  611. package/dist/server/poll.js +43 -2
  612. package/dist/server/poll.js.map +1 -1
  613. package/dist/server/request-context.d.ts +102 -3
  614. package/dist/server/request-context.d.ts.map +1 -1
  615. package/dist/server/request-context.js +100 -7
  616. package/dist/server/request-context.js.map +1 -1
  617. package/dist/server/security-headers.d.ts +51 -0
  618. package/dist/server/security-headers.d.ts.map +1 -0
  619. package/dist/server/security-headers.js +90 -0
  620. package/dist/server/security-headers.js.map +1 -0
  621. package/dist/server/ssr-handler.d.ts.map +1 -1
  622. package/dist/server/ssr-handler.js +96 -2
  623. package/dist/server/ssr-handler.js.map +1 -1
  624. package/dist/server/transcribe-voice.d.ts.map +1 -1
  625. package/dist/server/transcribe-voice.js +307 -56
  626. package/dist/server/transcribe-voice.js.map +1 -1
  627. package/dist/server/voice-providers-status.d.ts +12 -0
  628. package/dist/server/voice-providers-status.d.ts.map +1 -0
  629. package/dist/server/voice-providers-status.js +71 -0
  630. package/dist/server/voice-providers-status.js.map +1 -0
  631. package/dist/sharing/access.d.ts.map +1 -1
  632. package/dist/sharing/access.js +16 -13
  633. package/dist/sharing/access.js.map +1 -1
  634. package/dist/sharing/actions/share-resource.d.ts +1 -0
  635. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  636. package/dist/sharing/actions/share-resource.js +45 -0
  637. package/dist/sharing/actions/share-resource.js.map +1 -1
  638. package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
  639. package/dist/templates/default/app/root.tsx +1 -1
  640. package/dist/templates/default/app/routes/_index.tsx +6 -1
  641. package/dist/templates/default/public/favicon.svg +13 -0
  642. package/dist/templates/default/public/icon-180.svg +12 -3
  643. package/dist/templates/default/public/icon-192.svg +12 -3
  644. package/dist/templates/default/public/icon-512.svg +12 -3
  645. package/dist/templates/workspace-core/package.json +22 -4
  646. package/dist/templates/workspace-core/src/credentials.ts +32 -5
  647. package/dist/templates/workspace-core/tsconfig.json +4 -1
  648. package/dist/terminal/pty-server.d.ts.map +1 -1
  649. package/dist/terminal/pty-server.js +7 -1
  650. package/dist/terminal/pty-server.js.map +1 -1
  651. package/dist/terminal/terminal-plugin.js +3 -3
  652. package/dist/terminal/terminal-plugin.js.map +1 -1
  653. package/dist/tools/actions.d.ts.map +1 -1
  654. package/dist/tools/actions.js +130 -0
  655. package/dist/tools/actions.js.map +1 -1
  656. package/dist/tools/fetch-tool.d.ts +1 -0
  657. package/dist/tools/fetch-tool.d.ts.map +1 -1
  658. package/dist/tools/fetch-tool.js +38 -16
  659. package/dist/tools/fetch-tool.js.map +1 -1
  660. package/dist/tools/html-shell.d.ts +43 -1
  661. package/dist/tools/html-shell.d.ts.map +1 -1
  662. package/dist/tools/html-shell.js +102 -4
  663. package/dist/tools/html-shell.js.map +1 -1
  664. package/dist/tools/proxy-security.d.ts +12 -0
  665. package/dist/tools/proxy-security.d.ts.map +1 -0
  666. package/dist/tools/proxy-security.js +158 -0
  667. package/dist/tools/proxy-security.js.map +1 -0
  668. package/dist/tools/routes.d.ts.map +1 -1
  669. package/dist/tools/routes.js +158 -105
  670. package/dist/tools/routes.js.map +1 -1
  671. package/dist/tools/schema.d.ts +3 -0
  672. package/dist/tools/schema.d.ts.map +1 -1
  673. package/dist/tools/schema.js +3 -0
  674. package/dist/tools/schema.js.map +1 -1
  675. package/dist/tools/slots/routes.d.ts +15 -0
  676. package/dist/tools/slots/routes.d.ts.map +1 -0
  677. package/dist/tools/slots/routes.js +94 -0
  678. package/dist/tools/slots/routes.js.map +1 -0
  679. package/dist/tools/slots/schema.d.ts +303 -0
  680. package/dist/tools/slots/schema.d.ts.map +1 -0
  681. package/dist/tools/slots/schema.js +76 -0
  682. package/dist/tools/slots/schema.js.map +1 -0
  683. package/dist/tools/slots/store.d.ts +66 -0
  684. package/dist/tools/slots/store.d.ts.map +1 -0
  685. package/dist/tools/slots/store.js +227 -0
  686. package/dist/tools/slots/store.js.map +1 -0
  687. package/dist/tools/store.d.ts.map +1 -1
  688. package/dist/tools/store.js +28 -37
  689. package/dist/tools/store.js.map +1 -1
  690. package/dist/tools/url-safety.d.ts +24 -0
  691. package/dist/tools/url-safety.d.ts.map +1 -0
  692. package/dist/tools/url-safety.js +224 -0
  693. package/dist/tools/url-safety.js.map +1 -0
  694. package/dist/tracking/providers.d.ts.map +1 -1
  695. package/dist/tracking/providers.js +28 -11
  696. package/dist/tracking/providers.js.map +1 -1
  697. package/dist/tracking/registry.d.ts.map +1 -1
  698. package/dist/tracking/registry.js +7 -3
  699. package/dist/tracking/registry.js.map +1 -1
  700. package/dist/triggers/actions.d.ts.map +1 -1
  701. package/dist/triggers/actions.js +11 -6
  702. package/dist/triggers/actions.js.map +1 -1
  703. package/dist/triggers/condition-evaluator.d.ts +8 -0
  704. package/dist/triggers/condition-evaluator.d.ts.map +1 -1
  705. package/dist/triggers/condition-evaluator.js +39 -4
  706. package/dist/triggers/condition-evaluator.js.map +1 -1
  707. package/dist/triggers/dispatcher.d.ts.map +1 -1
  708. package/dist/triggers/dispatcher.js +67 -4
  709. package/dist/triggers/dispatcher.js.map +1 -1
  710. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  711. package/dist/vite/action-types-plugin.js +8 -5
  712. package/dist/vite/action-types-plugin.js.map +1 -1
  713. package/dist/vite/client.d.ts +2 -0
  714. package/dist/vite/client.d.ts.map +1 -1
  715. package/dist/vite/client.js +216 -4
  716. package/dist/vite/client.js.map +1 -1
  717. package/docs/content/authentication.md +27 -12
  718. package/docs/content/drop-in-agent.md +2 -2
  719. package/docs/content/messaging.md +195 -155
  720. package/docs/content/onboarding.md +82 -12
  721. package/docs/content/template-analytics.md +65 -59
  722. package/docs/content/template-clips.md +7 -9
  723. package/docs/content/template-design.md +55 -0
  724. package/docs/content/template-dispatch.md +13 -0
  725. package/docs/content/template-forms.md +7 -6
  726. package/docs/content/template-mail.md +78 -80
  727. package/package.json +2 -1
  728. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
  729. package/src/templates/default/app/root.tsx +1 -1
  730. package/src/templates/default/app/routes/_index.tsx +6 -1
  731. package/src/templates/default/public/favicon.svg +13 -0
  732. package/src/templates/default/public/icon-180.svg +12 -3
  733. package/src/templates/default/public/icon-192.svg +12 -3
  734. package/src/templates/default/public/icon-512.svg +12 -3
  735. package/src/templates/workspace-core/package.json +22 -4
  736. package/src/templates/workspace-core/src/credentials.ts +32 -5
  737. package/src/templates/workspace-core/tsconfig.json +4 -1
@@ -5,10 +5,12 @@ import { createPollHandler } from "./poll.js";
5
5
  import { createSSEHandler } from "./sse.js";
6
6
  import { upsertEnvFile } from "./create-server.js";
7
7
  import { readBody } from "./h3-helpers.js";
8
- import { BUILDER_ENV_KEYS, BUILDER_STATE_PARAM, buildBuilderCliAuthUrl, createBuilderBrowserCallbackPage, getBuilderBrowserStatusForEvent, resolveSafePreviewUrl, runBuilderAgent, signBuilderCallbackState, verifyBuilderCallbackState, } from "./builder-browser.js";
8
+ import { BUILDER_ENV_KEYS, BUILDER_STATE_PARAM, buildBuilderCliAuthUrl, createBuilderBrowserCallbackErrorPage, createBuilderBrowserCallbackPage, getBuilderBrowserStatusForEvent, resolveSafePreviewUrl, runBuilderAgent, signBuilderCallbackState, verifyBuilderCallbackState, } from "./builder-browser.js";
9
9
  import { getState, putState, deleteState, listComposeDrafts, getComposeDraft, putComposeDraft, deleteComposeDraft, deleteAllComposeDrafts, } from "../application-state/handlers.js";
10
10
  import { getSetting, putSetting, deleteSetting } from "../settings/store.js";
11
- import { getSession } from "./auth.js";
11
+ import { getUserSetting, putUserSetting, deleteUserSetting, } from "../settings/user-settings.js";
12
+ import { getSession, isDevEnvironment, DEV_MODE_USER_EMAIL } from "./auth.js";
13
+ import { isLocalDatabase } from "../db/client.js";
12
14
  import { getOrigin } from "./google-oauth.js";
13
15
  import { findWorkspaceRoot } from "../scripts/utils.js";
14
16
  import { listOnboardingSteps } from "../onboarding/registry.js";
@@ -21,14 +23,63 @@ import { registerBuiltinNotificationChannels } from "../notifications/channels.j
21
23
  import { createNotificationsHandler } from "../notifications/routes.js";
22
24
  import { createProgressHandler } from "../progress/routes.js";
23
25
  import { createTranscribeVoiceHandler } from "./transcribe-voice.js";
26
+ import { runWithRequestContext } from "./request-context.js";
27
+ import { createVoiceProvidersStatusHandler } from "./voice-providers-status.js";
24
28
  import { PROVIDER_ENV_META } from "../agent/engine/provider-env-vars.js";
25
- import { isAgentEngineSettingConfigured, getAgentEngineEntry, detectEngineFromEnv, isStoredEngineUsable, } from "../agent/engine/registry.js";
29
+ import { isAgentEngineSettingConfigured, getAgentEngineEntry, detectEngineFromEnv, detectEngineFromUserSecrets, isStoredEngineUsable, } from "../agent/engine/registry.js";
26
30
  /**
27
31
  * The base path prefix for all framework-level routes.
28
32
  * All agent-native core routes live under this namespace to avoid
29
33
  * collisions with template-specific `/api/*` routes.
30
34
  */
31
35
  export const FRAMEWORK_ROUTE_PREFIX = "/_agent-native";
36
+ /**
37
+ * Whether deployment-wide `process.env` writes (and rehydration from the
38
+ * unscoped `persisted-env-vars` settings row) are safe on this deployment.
39
+ *
40
+ * Allowed only when:
41
+ * - we're running against a local SQLite-only database in a development
42
+ * environment (no shared-tenant exposure), OR
43
+ * - the operator has explicitly opted in via
44
+ * `AGENT_NATIVE_ALLOW_ENV_VAR_WRITES=1` (single-tenant self-hosted).
45
+ *
46
+ * On any hosted multi-tenant deploy this returns false: env vars are
47
+ * deployment-wide globals and one tenant could otherwise overwrite Stripe /
48
+ * OpenAI / Sentry keys for every other tenant. Per-org credentials must use
49
+ * the per-user/org `app_secrets` store via `saveCredential()` instead.
50
+ */
51
+ function isEnvVarWriteAllowed() {
52
+ if (process.env.AGENT_NATIVE_ALLOW_ENV_VAR_WRITES === "1")
53
+ return true;
54
+ return isDevEnvironment() && isLocalDatabase();
55
+ }
56
+ function normalizeAppBasePath(value) {
57
+ if (!value || value === "/")
58
+ return "";
59
+ const trimmed = value.trim();
60
+ if (!trimmed || trimmed === "/")
61
+ return "";
62
+ return `/${trimmed.replace(/^\/+/, "").replace(/\/+$/, "")}`;
63
+ }
64
+ function stripAppBasePath(pathname) {
65
+ const basePath = normalizeAppBasePath(process.env.VITE_APP_BASE_PATH || process.env.APP_BASE_PATH);
66
+ if (!basePath)
67
+ return pathname;
68
+ if (pathname === basePath)
69
+ return "/";
70
+ if (pathname.startsWith(`${basePath}/`)) {
71
+ return pathname.slice(basePath.length) || "/";
72
+ }
73
+ return pathname;
74
+ }
75
+ function redactValues(text, values) {
76
+ let out = text;
77
+ for (const value of values) {
78
+ if (value)
79
+ out = out.split(value).join("[redacted]");
80
+ }
81
+ return out;
82
+ }
32
83
  /**
33
84
  * Creates a Nitro plugin that mounts all standard agent-native framework routes.
34
85
  *
@@ -60,24 +111,27 @@ export function createCoreRoutesPlugin(options = {}) {
60
111
  // store. Only set keys that are currently empty so explicit env
61
112
  // vars (Netlify dashboard, process-level) always win.
62
113
  //
63
- // BUILDER_* keys are explicitly skipped and scrubbed from the row.
64
- // The pre-migration OAuth callback wrote one user's Builder creds
65
- // into this unscoped row, which then rehydrated into process.env on
66
- // every cold start and leaked across tenants on shared-DB hosted
67
- // templates. Per-user Builder creds now live in app_secrets; this
68
- // global row must never carry them again. The scrub below is a
69
- // one-shot self-heal: idempotent, no-op once the row is clean.
114
+ // GATED: only rehydrate into `process.env` on local-dev SQLite (or
115
+ // with the explicit single-tenant opt-in). On a shared-DB hosted
116
+ // multi-tenant deploy the `persisted-env-vars` row is deployment-wide
117
+ // global state pushing user-supplied values into `process.env` from
118
+ // it would let any one tenant's writes (or a stale dev seed) leak
119
+ // into every other tenant's process. The opt-out scrub of legacy
120
+ // BUILDER_* values still runs unconditionally so existing rows on
121
+ // multi-tenant deploys self-heal, but new env-var writes never land
122
+ // in `process.env` outside the allowed contexts.
70
123
  try {
71
124
  const persisted = (await getSetting("persisted-env-vars"));
72
125
  if (persisted) {
73
126
  const builderKeys = new Set(BUILDER_ENV_KEYS);
127
+ const writesAllowed = isEnvVarWriteAllowed();
74
128
  let scrubbed = 0;
75
129
  for (const [k, v] of Object.entries(persisted)) {
76
130
  if (builderKeys.has(k)) {
77
131
  scrubbed++;
78
132
  continue;
79
133
  }
80
- if (typeof v === "string" && !process.env[k]) {
134
+ if (writesAllowed && typeof v === "string" && !process.env[k]) {
81
135
  process.env[k] = v;
82
136
  }
83
137
  }
@@ -136,6 +190,12 @@ export function createCoreRoutesPlugin(options = {}) {
136
190
  // Observability module not available — skip
137
191
  }
138
192
  const P = FRAMEWORK_ROUTE_PREFIX;
193
+ // Security response headers — emitted on every framework response.
194
+ // Mounted before route handlers so 4xx/5xx error pages also carry the
195
+ // headers. Routes that need to relax a specific header (e.g. the tools
196
+ // /render route allowing same-origin framing) override via setResponseHeader.
197
+ const { createSecurityHeadersMiddleware } = await import("./security-headers.js");
198
+ getH3App(nitroApp).use(createSecurityHeadersMiddleware());
139
199
  // CORS for framework routes. Desktop tray apps (Tauri/Electron) run on
140
200
  // their own dev origin (e.g. localhost:1420) and make credentialed
141
201
  // requests against the template's server at a different port. We echo
@@ -145,32 +205,81 @@ export function createCoreRoutesPlugin(options = {}) {
145
205
  .split(",")
146
206
  .map((s) => s.trim())
147
207
  .filter(Boolean);
208
+ const isProduction = process.env.NODE_ENV === "production";
209
+ const LOCALHOST_RE = /^https?:\/\/(localhost|127\.0\.0\.1|tauri\.localhost)(:\d+)?$/;
148
210
  getH3App(nitroApp).use(defineEventHandler((event) => {
149
- const url = event.node?.req?.url ?? event.path ?? "/";
150
- if (!url.startsWith(P) && !url.startsWith("/api/"))
211
+ const pathname = stripAppBasePath(event.url?.pathname ??
212
+ String(event.node?.req?.url ?? event.path ?? "/").split("?")[0]);
213
+ if (!pathname.startsWith(P) && !pathname.startsWith("/api/"))
151
214
  return;
152
215
  const reqHeaders = (event.node?.req?.headers ?? {});
153
216
  const originRaw = reqHeaders["origin"];
154
217
  const origin = Array.isArray(originRaw) ? originRaw[0] : originRaw;
155
- if (!origin)
156
- return;
157
- const allowed = allowlist.length === 0 ||
158
- allowlist.includes(origin) ||
159
- // Dev convenience: allow any localhost origin (tray windows,
160
- // frame, docs) without requiring an explicit allowlist.
161
- /^https?:\/\/(localhost|127\.0\.0\.1|tauri\.localhost)(:\d+)?$/.test(origin);
162
- if (!allowed)
163
- return;
164
- setResponseHeader(event, "Access-Control-Allow-Origin", origin);
165
- setResponseHeader(event, "Vary", "Origin");
166
- setResponseHeader(event, "Access-Control-Allow-Credentials", "true");
167
- setResponseHeader(event, "Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS");
168
- setResponseHeader(event, "Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With");
169
- if (getMethod(event) === "OPTIONS") {
218
+ const method = getMethod(event);
219
+ // Decide whether this origin is allowed. We never fall back to the
220
+ // first allowlist entry that previously echoed `Access-Control-
221
+ // Allow-Origin: <unrelated-allowed-origin>` for disallowed callers,
222
+ // which is permissive enough that some clients followed through.
223
+ let allowedOrigin = null;
224
+ if (origin) {
225
+ if (allowlist.length > 0) {
226
+ if (allowlist.includes(origin))
227
+ allowedOrigin = origin;
228
+ }
229
+ else {
230
+ // No allowlist configured. In production we only allow
231
+ // localhost-style origins (desktop tray dev usage); in dev we
232
+ // allow any origin echo. This prevents a fresh deploy without
233
+ // CORS_ALLOWED_ORIGINS from accepting credentialed requests
234
+ // from any origin.
235
+ if (isProduction) {
236
+ if (LOCALHOST_RE.test(origin))
237
+ allowedOrigin = origin;
238
+ }
239
+ else {
240
+ if (LOCALHOST_RE.test(origin))
241
+ allowedOrigin = origin;
242
+ }
243
+ }
244
+ }
245
+ // Reject preflights from disallowed cross-origin callers BEFORE
246
+ // returning 204. Previously the OPTIONS short-circuit returned 204
247
+ // with no ACAO header, which the browser then treats as a CORS
248
+ // failure — but also short-circuited any further checks. Now we
249
+ // explicitly 403 disallowed cross-origin preflights.
250
+ if (method === "OPTIONS") {
251
+ if (origin && !allowedOrigin) {
252
+ setResponseStatus(event, 403);
253
+ return "";
254
+ }
255
+ if (allowedOrigin) {
256
+ setResponseHeader(event, "Access-Control-Allow-Origin", allowedOrigin);
257
+ setResponseHeader(event, "Vary", "Origin");
258
+ setResponseHeader(event, "Access-Control-Allow-Credentials", "true");
259
+ setResponseHeader(event, "Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS");
260
+ setResponseHeader(event, "Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF");
261
+ }
170
262
  setResponseStatus(event, 204);
171
263
  return "";
172
264
  }
265
+ // Non-preflight requests: only set CORS response headers when we
266
+ // have an allowed origin. Same-origin / no-origin requests fall
267
+ // through without explicit CORS headers (browser treats them as
268
+ // same-origin by default).
269
+ if (!allowedOrigin)
270
+ return;
271
+ setResponseHeader(event, "Access-Control-Allow-Origin", allowedOrigin);
272
+ setResponseHeader(event, "Vary", "Origin");
273
+ setResponseHeader(event, "Access-Control-Allow-Credentials", "true");
274
+ setResponseHeader(event, "Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS");
275
+ setResponseHeader(event, "Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF");
173
276
  }));
277
+ // Defense-in-depth CSRF check for state-changing /_agent-native/* routes.
278
+ // Mounted AFTER the CORS layer so disallowed-origin OPTIONS preflights
279
+ // 403 first (rather than being rejected on a stale cookie heuristic).
280
+ // See `csrf.ts` for the threat model and allowlist.
281
+ const { createCsrfMiddleware } = await import("./csrf.js");
282
+ getH3App(nitroApp).use(createCsrfMiddleware(P));
174
283
  // Polling
175
284
  getH3App(nitroApp).use(`${P}/poll`, createPollHandler());
176
285
  // SSE
@@ -186,29 +295,89 @@ export function createCoreRoutesPlugin(options = {}) {
186
295
  }
187
296
  getH3App(nitroApp).use(`${P}/builder/status`, defineEventHandler(async (event) => {
188
297
  const envStatus = getBuilderBrowserStatusForEvent(event);
189
- // Check per-user credentials first (stored in app_secrets).
190
- try {
191
- const { resolveBuilderCredentials } = await import("./credential-provider.js");
192
- const creds = await resolveBuilderCredentials();
193
- if (creds.privateKey) {
194
- return {
195
- ...envStatus,
196
- configured: true,
197
- privateKeyConfigured: true,
198
- publicKeyConfigured: !!creds.publicKey,
199
- userId: creds.userId || envStatus.userId,
200
- orgName: creds.orgName || envStatus.orgName,
201
- orgKind: creds.orgKind || envStatus.orgKind,
202
- };
298
+ // Read session once so we can establish per-user request context for
299
+ // credential resolution. Without this, resolveBuilderCredentials()
300
+ // calls getRequestUserEmail() on an empty AsyncLocalStorage store and
301
+ // falls through to process.env — causing the connection state to
302
+ // flicker between requests depending on stale env values.
303
+ const session = await getSession(event).catch(() => null);
304
+ const userEmail = session?.email;
305
+ return runWithRequestContext({ userEmail }, async () => {
306
+ // Check per-user credentials first (stored in app_secrets).
307
+ try {
308
+ const { resolveBuilderCredentials } = await import("./credential-provider.js");
309
+ const creds = await resolveBuilderCredentials();
310
+ if (creds.privateKey) {
311
+ return {
312
+ ...envStatus,
313
+ configured: true,
314
+ privateKeyConfigured: true,
315
+ publicKeyConfigured: !!creds.publicKey,
316
+ userId: creds.userId || envStatus.userId,
317
+ orgName: creds.orgName || envStatus.orgName,
318
+ orgKind: creds.orgKind || envStatus.orgKind,
319
+ };
320
+ }
203
321
  }
204
- }
205
- catch {
206
- // Secrets table not ready — fall through to env status
207
- }
208
- // Honor legacy disconnect flag for existing deployments.
209
- try {
210
- const disconnected = await getSetting("builder-disconnected");
211
- if (disconnected) {
322
+ catch {
323
+ // Secrets table not ready — fall through to env status
324
+ }
325
+ // Surface a recent OAuth callback failure so the parent's polling
326
+ // stops with a clear message instead of timing out at 5min. The
327
+ // callback handler writes a `builder-connect-error:<email>` row
328
+ // when `writeBuilderCredentials` throws; this read self-clears so
329
+ // the message only fires once.
330
+ try {
331
+ if (userEmail) {
332
+ const errKey = `builder-connect-error:${userEmail}`;
333
+ const errRow = await getSetting(errKey);
334
+ if (errRow && typeof errRow.message === "string") {
335
+ await deleteSetting(errKey).catch(() => { });
336
+ return {
337
+ ...envStatus,
338
+ configured: false,
339
+ privateKeyConfigured: false,
340
+ publicKeyConfigured: false,
341
+ userId: undefined,
342
+ orgName: undefined,
343
+ orgKind: undefined,
344
+ connectError: {
345
+ message: errRow.message,
346
+ at: typeof errRow.at === "number"
347
+ ? errRow.at
348
+ : Date.now(),
349
+ },
350
+ };
351
+ }
352
+ }
353
+ }
354
+ catch {
355
+ // settings store unavailable — fall through to legacy/env status
356
+ }
357
+ // Honor legacy disconnect flag for existing deployments.
358
+ try {
359
+ const disconnected = await getSetting("builder-disconnected");
360
+ if (disconnected) {
361
+ return {
362
+ ...envStatus,
363
+ configured: false,
364
+ privateKeyConfigured: false,
365
+ publicKeyConfigured: false,
366
+ userId: undefined,
367
+ orgName: undefined,
368
+ orgKind: undefined,
369
+ };
370
+ }
371
+ }
372
+ catch {
373
+ // DB not reachable — fall back to env-only status.
374
+ }
375
+ // For authenticated non-local users who have no per-user credentials,
376
+ // explicitly return not-configured rather than deploy-level env keys.
377
+ // This is consistent with resolveBuilderCredential()'s design which
378
+ // refuses the env fallback for authenticated users to prevent
379
+ // cross-tenant credential leakage in shared-DB deployments.
380
+ if (userEmail && userEmail !== DEV_MODE_USER_EMAIL) {
212
381
  return {
213
382
  ...envStatus,
214
383
  configured: false,
@@ -219,11 +388,8 @@ export function createCoreRoutesPlugin(options = {}) {
219
388
  orgKind: undefined,
220
389
  };
221
390
  }
222
- }
223
- catch {
224
- // DB not reachable — fall back to env-only status.
225
- }
226
- return envStatus;
391
+ return envStatus;
392
+ });
227
393
  }));
228
394
  // Lightweight 302 to the Builder CLI-auth URL. Lets clients do
229
395
  // `window.open('/_agent-native/builder/connect', '_blank')` synchronously
@@ -269,7 +435,7 @@ export function createCoreRoutesPlugin(options = {}) {
269
435
  // caller isn't a named user we should spend a Builder private key
270
436
  // on. Allow it only when the environment explicitly opts into
271
437
  // local mode (dev, tests, or AUTH_MODE=local).
272
- if (session.email === "local@localhost" &&
438
+ if (session.email === DEV_MODE_USER_EMAIL &&
273
439
  process.env.NODE_ENV === "production" &&
274
440
  process.env.AUTH_MODE !== "local") {
275
441
  setResponseStatus(event, 401);
@@ -334,6 +500,15 @@ export function createCoreRoutesPlugin(options = {}) {
334
500
  // Store per-user in app_secrets so each user's Builder connection
335
501
  // is independent. No more shared env vars that the last connector
336
502
  // overwrites.
503
+ //
504
+ // Failure handling: a silent catch here (returning the success page
505
+ // anyway) was Midhun's bug on 2026-04-28 — popup said "yay", parent
506
+ // window polled `/builder/status` for 5 minutes seeing
507
+ // configured:false, never got a real error. Now we surface the
508
+ // failure two ways: (a) a settings row that the next /builder/status
509
+ // poll picks up, and (b) postMessage from the error page itself,
510
+ // wired into the popup HTML, so the parent stops polling immediately.
511
+ let writeError = null;
337
512
  try {
338
513
  const { writeBuilderCredentials } = await import("./credential-provider.js");
339
514
  await writeBuilderCredentials(session.email, {
@@ -345,15 +520,40 @@ export function createCoreRoutesPlugin(options = {}) {
345
520
  });
346
521
  }
347
522
  catch (err) {
348
- console.warn("[builder] Failed to write per-user credentials:", err?.message ?? err);
523
+ writeError = err?.message ?? String(err);
524
+ console.error("[builder] Failed to persist per-user credentials:", writeError);
349
525
  }
350
- // Clear any legacy disconnect flag.
526
+ if (writeError) {
527
+ // Best-effort signal to /builder/status. If putSetting also fails
528
+ // (entire DB unreachable) the popup's postMessage still notifies
529
+ // the parent. If both fail the parent times out at 5min as today.
530
+ try {
531
+ await putSetting(`builder-connect-error:${session.email}`, {
532
+ message: writeError,
533
+ at: Date.now(),
534
+ });
535
+ }
536
+ catch (settingsErr) {
537
+ console.error("[builder] Couldn't even record connect-error to settings:", settingsErr?.message ?? settingsErr);
538
+ }
539
+ setResponseStatus(event, 500);
540
+ setResponseHeader(event, "Content-Type", "text/html; charset=utf-8");
541
+ return createBuilderBrowserCallbackErrorPage(writeError);
542
+ }
543
+ // Clear any legacy disconnect flag and any prior connect-error row
544
+ // (so a successful retry doesn't surface the previous failure).
351
545
  try {
352
546
  await deleteSetting("builder-disconnected");
353
547
  }
354
548
  catch {
355
549
  // DB not ready — proceed
356
550
  }
551
+ try {
552
+ await deleteSetting(`builder-connect-error:${session.email}`);
553
+ }
554
+ catch {
555
+ // No prior error row — fine
556
+ }
357
557
  const previewUrl = resolveSafePreviewUrl(requestUrl.searchParams.get("preview-url"), event);
358
558
  setResponseHeader(event, "Content-Type", "text/html; charset=utf-8");
359
559
  return createBuilderBrowserCallbackPage(previewUrl);
@@ -395,47 +595,56 @@ export function createCoreRoutesPlugin(options = {}) {
395
595
  setResponseStatus(event, 405);
396
596
  return { error: "Method not allowed" };
397
597
  }
398
- const { resolveBuilderCredentials: resolveCreds } = await import("./credential-provider.js");
399
- const creds = await resolveCreds();
400
- if (!creds.privateKey || !creds.publicKey) {
401
- setResponseStatus(event, 400);
402
- return {
403
- error: "Builder not connected. Connect Builder in Setup to use background agent.",
404
- };
405
- }
406
- const body = (await readBody(event));
407
- if (!body?.userMessage) {
408
- setResponseStatus(event, 400);
409
- return { error: "userMessage is required" };
598
+ const session = await getSession(event).catch(() => null);
599
+ if (!session?.email) {
600
+ setResponseStatus(event, 401);
601
+ return { error: "unauthorized" };
410
602
  }
411
- const apiHost = process.env.BUILDER_API_HOST || "https://ai-services.builder.io";
412
- try {
413
- const res = await fetch(`${apiHost}/agents/run?apiKey=${encodeURIComponent(creds.publicKey)}`, {
414
- method: "POST",
415
- headers: {
416
- "Content-Type": "application/json",
417
- Authorization: `Bearer ${creds.privateKey}`,
418
- },
419
- body: JSON.stringify({
420
- userMessage: {
421
- userPrompt: body.userMessage,
603
+ return runWithRequestContext({ userEmail: session.email, orgId: session.orgId ?? undefined }, async () => {
604
+ const { resolveBuilderCredentials: resolveCreds } = await import("./credential-provider.js");
605
+ const creds = await resolveCreds();
606
+ if (!creds.privateKey || !creds.publicKey) {
607
+ setResponseStatus(event, 400);
608
+ return {
609
+ error: "Builder not connected. Connect Builder in Setup to use background agent.",
610
+ };
611
+ }
612
+ const body = (await readBody(event));
613
+ if (!body?.userMessage) {
614
+ setResponseStatus(event, 400);
615
+ return { error: "userMessage is required" };
616
+ }
617
+ const apiHost = process.env.BUILDER_API_HOST || "https://ai-services.builder.io";
618
+ try {
619
+ const res = await fetch(`${apiHost}/agents/run?apiKey=${encodeURIComponent(creds.publicKey)}`, {
620
+ method: "POST",
621
+ headers: {
622
+ "Content-Type": "application/json",
623
+ Authorization: `Bearer ${creds.privateKey}`,
422
624
  },
423
- branchName: body.branchName,
424
- }),
425
- });
426
- if (!res.ok) {
427
- const err = await res.text().catch(() => "Unknown error");
428
- setResponseStatus(event, res.status);
429
- return { error: err };
625
+ body: JSON.stringify({
626
+ userMessage: {
627
+ userPrompt: body.userMessage,
628
+ },
629
+ branchName: body.branchName,
630
+ }),
631
+ });
632
+ if (!res.ok) {
633
+ const err = await res.text().catch(() => "Unknown error");
634
+ setResponseStatus(event, res.status);
635
+ return {
636
+ error: redactValues(err, [creds.privateKey, creds.publicKey]),
637
+ };
638
+ }
639
+ return await res.json();
430
640
  }
431
- return await res.json();
432
- }
433
- catch (err) {
434
- setResponseStatus(event, 500);
435
- return {
436
- error: err?.message || "Failed to reach Builder agents-run API",
437
- };
438
- }
641
+ catch (err) {
642
+ setResponseStatus(event, 500);
643
+ return {
644
+ error: redactValues(err?.message || "Failed to reach Builder agents-run API", [creds.privateKey, creds.publicKey]),
645
+ };
646
+ }
647
+ });
439
648
  }));
440
649
  // Env key management — framework keys are always included
441
650
  const frameworkEnvKeys = [
@@ -476,12 +685,25 @@ export function createCoreRoutesPlugin(options = {}) {
476
685
  label: cfg.label,
477
686
  required: cfg.required ?? false,
478
687
  configured: !!process.env[cfg.key],
688
+ ...(cfg.helpText ? { helpText: cfg.helpText } : {}),
479
689
  }))));
480
690
  getH3App(nitroApp).use(`${P}/env-vars`, defineEventHandler(async (event) => {
481
691
  if (getMethod(event) !== "POST") {
482
692
  setResponseStatus(event, 405);
483
693
  return { error: "Method not allowed" };
484
694
  }
695
+ // Env vars are deployment-wide globals, not per-tenant. On any
696
+ // shared-DB multi-tenant deploy, allowing authenticated users to
697
+ // write here lets one tenant overwrite Stripe / OpenAI / Sentry
698
+ // keys for every other tenant. Disable the endpoint outside of
699
+ // local-dev SQLite or an explicit single-tenant opt-in, and
700
+ // direct callers to the per-org credential store instead.
701
+ if (!isEnvVarWriteAllowed()) {
702
+ setResponseStatus(event, 403);
703
+ return {
704
+ error: "env-vars endpoint disabled on multi-tenant deployments. Use saveCredential(key, value, { userEmail, orgId, scope: 'org' }) to store per-org credentials.",
705
+ };
706
+ }
485
707
  const body = await readBody(event);
486
708
  const { vars } = body;
487
709
  if (!Array.isArray(vars) || vars.length === 0) {
@@ -566,6 +788,19 @@ export function createCoreRoutesPlugin(options = {}) {
566
788
  };
567
789
  }
568
790
  }
791
+ // Per-user app_secrets — a user who connected Builder (or pasted
792
+ // their own provider key) may not have any deploy-level env vars
793
+ // set, so check their per-user secret store before reporting "no
794
+ // engine configured" and re-showing the onboarding gate.
795
+ const detectedFromUser = await detectEngineFromUserSecrets();
796
+ if (detectedFromUser) {
797
+ return {
798
+ configured: true,
799
+ engine: detectedFromUser.name,
800
+ source: "app_secrets",
801
+ envVar: detectedFromUser.requiredEnvVars[0],
802
+ };
803
+ }
569
804
  const detected = detectEngineFromEnv();
570
805
  if (detected) {
571
806
  return {
@@ -625,19 +860,45 @@ export function createCoreRoutesPlugin(options = {}) {
625
860
  // ─── File upload primitive ──────────────────────────────────────
626
861
  // GET /_agent-native/file-upload/status — report active provider
627
862
  // POST /_agent-native/file-upload — upload a file, return { url }
628
- getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(async () => {
863
+ getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(async (event) => {
629
864
  const active = getActiveFileUploadProvider();
865
+ // resolveBuilderPrivateKey() reads per-user credentials from app_secrets
866
+ // (DB), which requires request context (AsyncLocalStorage) to know which
867
+ // user to scope by. Without runWithRequestContext() the ALS store is empty
868
+ // and it falls back to process.env only — missing OAuth-connected users.
869
+ const session = await getSession(event).catch(() => null);
870
+ const userEmail = session?.email;
630
871
  let builderConfigured = !!process.env.BUILDER_PRIVATE_KEY;
631
872
  try {
632
873
  const { resolveBuilderPrivateKey } = await import("./credential-provider.js");
633
- builderConfigured = !!(await resolveBuilderPrivateKey());
874
+ const resolve = () => resolveBuilderPrivateKey().then((k) => !!k);
875
+ builderConfigured = userEmail
876
+ ? await runWithRequestContext({ userEmail }, resolve)
877
+ : await resolve();
634
878
  }
635
879
  catch {
636
880
  // fall back to env check above
637
881
  }
882
+ // When the builder builtin is selected via env var, its sync
883
+ // isConfigured() doesn't reflect per-user OAuth credentials. Use the
884
+ // async builderConfigured check so the status accurately represents
885
+ // whether this specific user can actually upload (thread 7 fix).
886
+ const isBuilderEnvActive = active?.id === "builder";
887
+ const configured = isBuilderEnvActive
888
+ ? builderConfigured
889
+ : !!active || builderConfigured;
890
+ const activeProvider = isBuilderEnvActive
891
+ ? builderConfigured
892
+ ? { id: "builder", name: "Builder.io" }
893
+ : null
894
+ : active
895
+ ? { id: active.id, name: active.name }
896
+ : builderConfigured
897
+ ? { id: "builder", name: "Builder.io" }
898
+ : null;
638
899
  return {
639
- configured: !!active,
640
- activeProvider: active ? { id: active.id, name: active.name } : null,
900
+ configured,
901
+ activeProvider,
641
902
  providers: listFileUploadProviders().map((p) => ({
642
903
  id: p.id,
643
904
  name: p.name,
@@ -658,12 +919,17 @@ export function createCoreRoutesPlugin(options = {}) {
658
919
  return { error: "No file uploaded" };
659
920
  }
660
921
  const session = await getSession(event);
661
- const result = await uploadFile({
922
+ if (!session?.email) {
923
+ setResponseStatus(event, 401);
924
+ return { error: "Unauthorized" };
925
+ }
926
+ const userEmail = session.email;
927
+ const result = await runWithRequestContext({ userEmail }, () => uploadFile({
662
928
  data: filePart.data,
663
929
  filename: filePart.filename,
664
930
  mimeType: filePart.type,
665
- ownerEmail: session?.email,
666
- });
931
+ ownerEmail: userEmail,
932
+ }));
667
933
  if (result) {
668
934
  setResponseStatus(event, 201);
669
935
  return result;
@@ -676,6 +942,10 @@ export function createCoreRoutesPlugin(options = {}) {
676
942
  // ─── Voice transcription (Whisper) ───────────────────────────────
677
943
  // POST /_agent-native/transcribe-voice — multipart audio → text
678
944
  getH3App(nitroApp).use(`${P}/transcribe-voice`, createTranscribeVoiceHandler());
945
+ // ─── Voice provider status ───────────────────────────────────────
946
+ // GET /_agent-native/voice-providers/status — which providers are
947
+ // configured for the current user (powers the Settings UI pills).
948
+ getH3App(nitroApp).use(`${P}/voice-providers/status`, createVoiceProvidersStatusHandler());
679
949
  // ─── Ad-hoc secrets (user-created keys) ────────────────────────────
680
950
  // Must mount before the generic /secrets handler to avoid shadowing.
681
951
  const adHocSecretHandler = createAdHocSecretHandler();
@@ -722,6 +992,11 @@ export function createCoreRoutesPlugin(options = {}) {
722
992
  ensureToolsTables().catch(() => { });
723
993
  registerToolsShareable();
724
994
  getH3App(nitroApp).use(`${P}/tools`, createToolsHandler());
995
+ // Tool extension-point slots — sub-system of tools.
996
+ const { ensureSlotTables } = await import("../tools/slots/store.js");
997
+ const { createSlotsHandler } = await import("../tools/slots/routes.js");
998
+ ensureSlotTables().catch(() => { });
999
+ getH3App(nitroApp).use(`${P}/slots`, createSlotsHandler());
725
1000
  }
726
1001
  catch {
727
1002
  // Tools module not available — skip
@@ -739,11 +1014,25 @@ export function createCoreRoutesPlugin(options = {}) {
739
1014
  const pathname = (event.url?.pathname || "")
740
1015
  .replace(/^\/+/, "")
741
1016
  .replace(/\/+$/, "");
1017
+ // Auth check applies to every method. Without this, any anonymous
1018
+ // caller could `POST /fire-test` to emit unowned events that fan
1019
+ // out across every tenant's matching trigger (the dispatcher
1020
+ // short-circuits its owner check when `eventMeta.owner` is
1021
+ // undefined). See audit 12 / fire-test finding.
1022
+ const session = await getSession(event).catch(() => null);
1023
+ if (!session?.email) {
1024
+ setResponseStatus(event, 401);
1025
+ return { error: "Unauthenticated" };
1026
+ }
742
1027
  if (pathname === "fire-test" && method === "POST") {
743
1028
  try {
744
1029
  const { emit } = await import("../event-bus/index.js");
745
1030
  const body = (await readBody(event).catch(() => ({})));
746
- emit("test.event.fired", { data: body.data ?? {} });
1031
+ // Scope the test event to the current user so only their
1032
+ // automations fire, not those owned by other tenants.
1033
+ emit("test.event.fired", { data: body.data ?? {} }, {
1034
+ owner: session.email,
1035
+ });
747
1036
  return { ok: true };
748
1037
  }
749
1038
  catch (err) {
@@ -756,8 +1045,7 @@ export function createCoreRoutesPlugin(options = {}) {
756
1045
  return { error: "Method not allowed" };
757
1046
  }
758
1047
  try {
759
- const session = await getSession(event).catch(() => null);
760
- const owner = session?.email || "local@localhost";
1048
+ const owner = session.email;
761
1049
  const { resourceListAllOwners, SHARED_OWNER } = await import("../resources/store.js");
762
1050
  const allResources = await resourceListAllOwners("jobs/");
763
1051
  const resources = allResources.filter((r) => r.owner === owner || r.owner === SHARED_OWNER);
@@ -819,6 +1107,47 @@ export function createCoreRoutesPlugin(options = {}) {
819
1107
  }));
820
1108
  // ─── Application State CRUD ──────────────────────────────────────
821
1109
  // Auto-mounted so templates don't need boilerplate route files.
1110
+ // ─── User-scoped settings store ────────────────────────────────────
1111
+ // GET /_agent-native/settings/:key — read current user's value
1112
+ // PUT /_agent-native/settings/:key — write current user's value
1113
+ // DELETE /_agent-native/settings/:key — clear current user's value
1114
+ //
1115
+ // Keys are auto-prefixed with `u:<email>:` so each user gets their
1116
+ // own row — no leakage between sessions sharing the same DB.
1117
+ getH3App(nitroApp).use(`${P}/settings`, defineEventHandler(async (event) => {
1118
+ const rawKey = (event.url?.pathname || "").replace(/^\/+/, "").split("/")[0] || "";
1119
+ const key = rawKey.replace(/[^a-zA-Z0-9_-]/g, "");
1120
+ if (!key) {
1121
+ setResponseStatus(event, 404);
1122
+ return { error: "Settings key required" };
1123
+ }
1124
+ const session = await getSession(event);
1125
+ if (!session?.email) {
1126
+ setResponseStatus(event, 401);
1127
+ return { error: "unauthorized" };
1128
+ }
1129
+ const method = getMethod(event);
1130
+ const requestSource = event.node?.req?.headers?.["x-request-source"] || undefined;
1131
+ if (method === "GET") {
1132
+ const value = await getUserSetting(session.email, key);
1133
+ if (!value) {
1134
+ setResponseStatus(event, 404);
1135
+ return { error: `No setting for ${key}` };
1136
+ }
1137
+ return value;
1138
+ }
1139
+ if (method === "PUT") {
1140
+ const body = await readBody(event);
1141
+ await putUserSetting(session.email, key, body, { requestSource });
1142
+ return body;
1143
+ }
1144
+ if (method === "DELETE") {
1145
+ await deleteUserSetting(session.email, key, { requestSource });
1146
+ return { ok: true };
1147
+ }
1148
+ setResponseStatus(event, 405);
1149
+ return { error: "Method not allowed" };
1150
+ }));
822
1151
  // ─── Avatar routes ──────────────────────────────────────────────────
823
1152
  // GET /_agent-native/avatar/:email — fetch any user's avatar (public)
824
1153
  // PUT /_agent-native/avatar — update current user's avatar (auth required)