@agent-native/core 0.7.13 → 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 (908) hide show
  1. package/README.md +56 -6
  2. package/dist/a2a/client.d.ts +44 -1
  3. package/dist/a2a/client.d.ts.map +1 -1
  4. package/dist/a2a/client.js +88 -11
  5. package/dist/a2a/client.js.map +1 -1
  6. package/dist/a2a/handlers.d.ts +10 -0
  7. package/dist/a2a/handlers.d.ts.map +1 -1
  8. package/dist/a2a/handlers.js +417 -67
  9. package/dist/a2a/handlers.js.map +1 -1
  10. package/dist/a2a/server.d.ts.map +1 -1
  11. package/dist/a2a/server.js +212 -19
  12. package/dist/a2a/server.js.map +1 -1
  13. package/dist/a2a/task-store.d.ts +20 -1
  14. package/dist/a2a/task-store.d.ts.map +1 -1
  15. package/dist/a2a/task-store.js +72 -2
  16. package/dist/a2a/task-store.js.map +1 -1
  17. package/dist/agent/default-model.d.ts +21 -0
  18. package/dist/agent/default-model.d.ts.map +1 -0
  19. package/dist/agent/default-model.js +21 -0
  20. package/dist/agent/default-model.js.map +1 -0
  21. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  22. package/dist/agent/engine/ai-sdk-engine.js +7 -4
  23. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  24. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  25. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  26. package/dist/agent/engine/anthropic-engine.js +10 -4
  27. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  28. package/dist/agent/engine/builder-engine.d.ts +1 -1
  29. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  30. package/dist/agent/engine/builder-engine.js +11 -26
  31. package/dist/agent/engine/builder-engine.js.map +1 -1
  32. package/dist/agent/engine/builtin.js +1 -1
  33. package/dist/agent/engine/builtin.js.map +1 -1
  34. package/dist/agent/engine/registry.d.ts +27 -7
  35. package/dist/agent/engine/registry.d.ts.map +1 -1
  36. package/dist/agent/engine/registry.js +101 -20
  37. package/dist/agent/engine/registry.js.map +1 -1
  38. package/dist/agent/index.d.ts +1 -0
  39. package/dist/agent/index.d.ts.map +1 -1
  40. package/dist/agent/index.js +1 -0
  41. package/dist/agent/index.js.map +1 -1
  42. package/dist/agent/production-agent.d.ts +25 -3
  43. package/dist/agent/production-agent.d.ts.map +1 -1
  44. package/dist/agent/production-agent.js +227 -36
  45. package/dist/agent/production-agent.js.map +1 -1
  46. package/dist/application-state/handlers.d.ts.map +1 -1
  47. package/dist/application-state/handlers.js +10 -6
  48. package/dist/application-state/handlers.js.map +1 -1
  49. package/dist/application-state/script-helpers.d.ts +1 -1
  50. package/dist/application-state/script-helpers.d.ts.map +1 -1
  51. package/dist/application-state/script-helpers.js +12 -8
  52. package/dist/application-state/script-helpers.js.map +1 -1
  53. package/dist/application-state/store.d.ts.map +1 -1
  54. package/dist/application-state/store.js +19 -10
  55. package/dist/application-state/store.js.map +1 -1
  56. package/dist/chat-threads/store.d.ts +3 -0
  57. package/dist/chat-threads/store.d.ts.map +1 -1
  58. package/dist/chat-threads/store.js +36 -1
  59. package/dist/chat-threads/store.js.map +1 -1
  60. package/dist/cli/create.d.ts.map +1 -1
  61. package/dist/cli/create.js +79 -13
  62. package/dist/cli/create.js.map +1 -1
  63. package/dist/cli/index.js +97 -39
  64. package/dist/cli/index.js.map +1 -1
  65. package/dist/cli/templates-meta.d.ts +4 -0
  66. package/dist/cli/templates-meta.d.ts.map +1 -1
  67. package/dist/cli/templates-meta.js +67 -12
  68. package/dist/cli/templates-meta.js.map +1 -1
  69. package/dist/cli/workspacify.d.ts +2 -0
  70. package/dist/cli/workspacify.d.ts.map +1 -1
  71. package/dist/cli/workspacify.js +5 -4
  72. package/dist/cli/workspacify.js.map +1 -1
  73. package/dist/client/AgentPanel.d.ts +7 -2
  74. package/dist/client/AgentPanel.d.ts.map +1 -1
  75. package/dist/client/AgentPanel.js +81 -32
  76. package/dist/client/AgentPanel.js.map +1 -1
  77. package/dist/client/AgentTaskCard.d.ts.map +1 -1
  78. package/dist/client/AgentTaskCard.js +5 -2
  79. package/dist/client/AgentTaskCard.js.map +1 -1
  80. package/dist/client/AssistantChat.d.ts +2 -0
  81. package/dist/client/AssistantChat.d.ts.map +1 -1
  82. package/dist/client/AssistantChat.js +183 -84
  83. package/dist/client/AssistantChat.js.map +1 -1
  84. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  85. package/dist/client/ConnectBuilderCard.js +2 -1
  86. package/dist/client/ConnectBuilderCard.js.map +1 -1
  87. package/dist/client/DefaultSpinner.d.ts +1 -1
  88. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  89. package/dist/client/DefaultSpinner.js +2 -9
  90. package/dist/client/DefaultSpinner.js.map +1 -1
  91. package/dist/client/ErrorBoundary.d.ts +1 -3
  92. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  93. package/dist/client/ErrorBoundary.js +37 -9
  94. package/dist/client/ErrorBoundary.js.map +1 -1
  95. package/dist/client/FeedbackButton.d.ts.map +1 -1
  96. package/dist/client/FeedbackButton.js +4 -3
  97. package/dist/client/FeedbackButton.js.map +1 -1
  98. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  99. package/dist/client/MultiTabAssistantChat.js +165 -68
  100. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  101. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  102. package/dist/client/agent-chat-adapter.js +2 -1
  103. package/dist/client/agent-chat-adapter.js.map +1 -1
  104. package/dist/client/agent-chat.d.ts +11 -0
  105. package/dist/client/agent-chat.d.ts.map +1 -1
  106. package/dist/client/agent-chat.js +4 -2
  107. package/dist/client/agent-chat.js.map +1 -1
  108. package/dist/client/analytics.d.ts.map +1 -1
  109. package/dist/client/analytics.js +70 -1
  110. package/dist/client/analytics.js.map +1 -1
  111. package/dist/client/api-path.d.ts +5 -0
  112. package/dist/client/api-path.d.ts.map +1 -0
  113. package/dist/client/api-path.js +48 -0
  114. package/dist/client/api-path.js.map +1 -0
  115. package/dist/client/components/AgentPresenceChip.d.ts +12 -0
  116. package/dist/client/components/AgentPresenceChip.d.ts.map +1 -0
  117. package/dist/client/components/AgentPresenceChip.js +42 -0
  118. package/dist/client/components/AgentPresenceChip.js.map +1 -0
  119. package/dist/client/components/ApiKeySettings.d.ts.map +1 -1
  120. package/dist/client/components/ApiKeySettings.js +3 -2
  121. package/dist/client/components/ApiKeySettings.js.map +1 -1
  122. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  123. package/dist/client/components/CodeRequiredDialog.js +3 -2
  124. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  125. package/dist/client/components/PresenceBar.d.ts +17 -0
  126. package/dist/client/components/PresenceBar.d.ts.map +1 -0
  127. package/dist/client/components/PresenceBar.js +118 -0
  128. package/dist/client/components/PresenceBar.js.map +1 -0
  129. package/dist/client/composer/ComposerPlusMenu.d.ts +6 -1
  130. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  131. package/dist/client/composer/ComposerPlusMenu.js +22 -83
  132. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  133. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  134. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  135. package/dist/client/composer/TiptapComposer.js +245 -23
  136. package/dist/client/composer/TiptapComposer.js.map +1 -1
  137. package/dist/client/composer/draft-key.d.ts +2 -0
  138. package/dist/client/composer/draft-key.d.ts.map +1 -0
  139. package/dist/client/composer/draft-key.js +8 -0
  140. package/dist/client/composer/draft-key.js.map +1 -0
  141. package/dist/client/composer/types.d.ts +1 -0
  142. package/dist/client/composer/types.d.ts.map +1 -1
  143. package/dist/client/composer/use-file-search.d.ts.map +1 -1
  144. package/dist/client/composer/use-file-search.js +2 -1
  145. package/dist/client/composer/use-file-search.js.map +1 -1
  146. package/dist/client/composer/use-mention-search.d.ts.map +1 -1
  147. package/dist/client/composer/use-mention-search.js +2 -1
  148. package/dist/client/composer/use-mention-search.js.map +1 -1
  149. package/dist/client/composer/use-skills.d.ts.map +1 -1
  150. package/dist/client/composer/use-skills.js +2 -1
  151. package/dist/client/composer/use-skills.js.map +1 -1
  152. package/dist/client/composer/useVoiceDictation.d.ts +3 -1
  153. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  154. package/dist/client/composer/useVoiceDictation.js +101 -18
  155. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  156. package/dist/client/dev-mode.d.ts +14 -0
  157. package/dist/client/dev-mode.d.ts.map +1 -0
  158. package/dist/client/dev-mode.js +14 -0
  159. package/dist/client/dev-mode.js.map +1 -0
  160. package/dist/client/dev-overlay/DevOverlay.d.ts +26 -0
  161. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -0
  162. package/dist/client/dev-overlay/DevOverlay.js +315 -0
  163. package/dist/client/dev-overlay/DevOverlay.js.map +1 -0
  164. package/dist/client/dev-overlay/builtins.d.ts +6 -0
  165. package/dist/client/dev-overlay/builtins.d.ts.map +1 -0
  166. package/dist/client/dev-overlay/builtins.js +35 -0
  167. package/dist/client/dev-overlay/builtins.js.map +1 -0
  168. package/dist/client/dev-overlay/index.d.ts +6 -0
  169. package/dist/client/dev-overlay/index.d.ts.map +1 -0
  170. package/dist/client/dev-overlay/index.js +5 -0
  171. package/dist/client/dev-overlay/index.js.map +1 -0
  172. package/dist/client/dev-overlay/registry.d.ts +13 -0
  173. package/dist/client/dev-overlay/registry.d.ts.map +1 -0
  174. package/dist/client/dev-overlay/registry.js +63 -0
  175. package/dist/client/dev-overlay/registry.js.map +1 -0
  176. package/dist/client/dev-overlay/types.d.ts +56 -0
  177. package/dist/client/dev-overlay/types.d.ts.map +1 -0
  178. package/dist/client/dev-overlay/types.js +9 -0
  179. package/dist/client/dev-overlay/types.js.map +1 -0
  180. package/dist/client/dev-overlay/use-dev-option.d.ts +12 -0
  181. package/dist/client/dev-overlay/use-dev-option.d.ts.map +1 -0
  182. package/dist/client/dev-overlay/use-dev-option.js +73 -0
  183. package/dist/client/dev-overlay/use-dev-option.js.map +1 -0
  184. package/dist/client/dev-overlay/use-dev-overlay-shortcut.d.ts +6 -0
  185. package/dist/client/dev-overlay/use-dev-overlay-shortcut.d.ts.map +1 -0
  186. package/dist/client/dev-overlay/use-dev-overlay-shortcut.js +29 -0
  187. package/dist/client/dev-overlay/use-dev-overlay-shortcut.js.map +1 -0
  188. package/dist/client/frame.d.ts +1 -0
  189. package/dist/client/frame.d.ts.map +1 -1
  190. package/dist/client/frame.js +32 -11
  191. package/dist/client/frame.js.map +1 -1
  192. package/dist/client/index.d.ts +7 -0
  193. package/dist/client/index.d.ts.map +1 -1
  194. package/dist/client/index.js +9 -0
  195. package/dist/client/index.js.map +1 -1
  196. package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
  197. package/dist/client/integrations/IntegrationCard.js +3 -2
  198. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  199. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  200. package/dist/client/integrations/IntegrationsPanel.js +3 -2
  201. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  202. package/dist/client/integrations/useIntegrationStatus.d.ts.map +1 -1
  203. package/dist/client/integrations/useIntegrationStatus.js +2 -1
  204. package/dist/client/integrations/useIntegrationStatus.js.map +1 -1
  205. package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
  206. package/dist/client/notifications/NotificationsBell.js +26 -8
  207. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  208. package/dist/client/observability/ThumbsFeedback.d.ts.map +1 -1
  209. package/dist/client/observability/ThumbsFeedback.js +2 -1
  210. package/dist/client/observability/ThumbsFeedback.js.map +1 -1
  211. package/dist/client/observability/useObservability.d.ts.map +1 -1
  212. package/dist/client/observability/useObservability.js +2 -1
  213. package/dist/client/observability/useObservability.js.map +1 -1
  214. package/dist/client/onboarding/OnboardingPanel.d.ts +0 -7
  215. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  216. package/dist/client/onboarding/OnboardingPanel.js +20 -10
  217. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  218. package/dist/client/onboarding/index.d.ts +1 -0
  219. package/dist/client/onboarding/index.d.ts.map +1 -1
  220. package/dist/client/onboarding/index.js +1 -0
  221. package/dist/client/onboarding/index.js.map +1 -1
  222. package/dist/client/onboarding/use-onboarding.d.ts +1 -7
  223. package/dist/client/onboarding/use-onboarding.d.ts.map +1 -1
  224. package/dist/client/onboarding/use-onboarding.js +27 -13
  225. package/dist/client/onboarding/use-onboarding.js.map +1 -1
  226. package/dist/client/onboarding/use-preview-mode.d.ts +10 -0
  227. package/dist/client/onboarding/use-preview-mode.d.ts.map +1 -0
  228. package/dist/client/onboarding/use-preview-mode.js +35 -0
  229. package/dist/client/onboarding/use-preview-mode.js.map +1 -0
  230. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  231. package/dist/client/org/OrgSwitcher.js +2 -1
  232. package/dist/client/org/OrgSwitcher.js.map +1 -1
  233. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  234. package/dist/client/org/RequireActiveOrg.js +15 -10
  235. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  236. package/dist/client/org/TeamPage.d.ts.map +1 -1
  237. package/dist/client/org/TeamPage.js +132 -9
  238. package/dist/client/org/TeamPage.js.map +1 -1
  239. package/dist/client/org/hooks.d.ts +30 -0
  240. package/dist/client/org/hooks.d.ts.map +1 -1
  241. package/dist/client/org/hooks.js +67 -1
  242. package/dist/client/org/hooks.js.map +1 -1
  243. package/dist/client/org/index.d.ts +2 -2
  244. package/dist/client/org/index.d.ts.map +1 -1
  245. package/dist/client/org/index.js +1 -1
  246. package/dist/client/org/index.js.map +1 -1
  247. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  248. package/dist/client/progress/RunsTray.js +2 -1
  249. package/dist/client/progress/RunsTray.js.map +1 -1
  250. package/dist/client/resources/McpServerDetail.d.ts +0 -8
  251. package/dist/client/resources/McpServerDetail.d.ts.map +1 -1
  252. package/dist/client/resources/McpServerDetail.js +6 -1
  253. package/dist/client/resources/McpServerDetail.js.map +1 -1
  254. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  255. package/dist/client/resources/ResourceEditor.js +2 -1
  256. package/dist/client/resources/ResourceEditor.js.map +1 -1
  257. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  258. package/dist/client/resources/ResourcesPanel.js +7 -2
  259. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  260. package/dist/client/resources/use-mcp-servers.d.ts.map +1 -1
  261. package/dist/client/resources/use-mcp-servers.js +7 -2
  262. package/dist/client/resources/use-mcp-servers.js.map +1 -1
  263. package/dist/client/resources/use-resources.d.ts.map +1 -1
  264. package/dist/client/resources/use-resources.js +9 -7
  265. package/dist/client/resources/use-resources.js.map +1 -1
  266. package/dist/client/settings/AgentsSection.d.ts.map +1 -1
  267. package/dist/client/settings/AgentsSection.js +7 -5
  268. package/dist/client/settings/AgentsSection.js.map +1 -1
  269. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  270. package/dist/client/settings/AutomationsSection.js +10 -5
  271. package/dist/client/settings/AutomationsSection.js.map +1 -1
  272. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  273. package/dist/client/settings/BackgroundAgentSection.js +2 -1
  274. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  275. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  276. package/dist/client/settings/SecretsSection.js +12 -4
  277. package/dist/client/settings/SecretsSection.js.map +1 -1
  278. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  279. package/dist/client/settings/SettingsPanel.js +38 -33
  280. package/dist/client/settings/SettingsPanel.js.map +1 -1
  281. package/dist/client/settings/UsageSection.d.ts.map +1 -1
  282. package/dist/client/settings/UsageSection.js +2 -1
  283. package/dist/client/settings/UsageSection.js.map +1 -1
  284. package/dist/client/settings/VoiceTranscriptionSection.d.ts +2 -4
  285. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  286. package/dist/client/settings/VoiceTranscriptionSection.js +66 -23
  287. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  288. package/dist/client/settings/useBuilderStatus.d.ts +9 -0
  289. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  290. package/dist/client/settings/useBuilderStatus.js +31 -3
  291. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  292. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  293. package/dist/client/sharing/ShareButton.js +7 -2
  294. package/dist/client/sharing/ShareButton.js.map +1 -1
  295. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  296. package/dist/client/sharing/ShareDialog.js +4 -3
  297. package/dist/client/sharing/ShareDialog.js.map +1 -1
  298. package/dist/client/sse-event-processor.d.ts.map +1 -1
  299. package/dist/client/sse-event-processor.js +10 -0
  300. package/dist/client/sse-event-processor.js.map +1 -1
  301. package/dist/client/terminal/AgentTerminal.d.ts +1 -0
  302. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  303. package/dist/client/terminal/AgentTerminal.js +12 -8
  304. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  305. package/dist/client/tools/EmbeddedTool.d.ts +20 -0
  306. package/dist/client/tools/EmbeddedTool.d.ts.map +1 -0
  307. package/dist/client/tools/EmbeddedTool.js +113 -0
  308. package/dist/client/tools/EmbeddedTool.js.map +1 -0
  309. package/dist/client/tools/ExtensionSlot.d.ts +27 -0
  310. package/dist/client/tools/ExtensionSlot.d.ts.map +1 -0
  311. package/dist/client/tools/ExtensionSlot.js +96 -0
  312. package/dist/client/tools/ExtensionSlot.js.map +1 -0
  313. package/dist/client/tools/ToolEditor.d.ts +5 -0
  314. package/dist/client/tools/ToolEditor.d.ts.map +1 -0
  315. package/dist/client/tools/ToolEditor.js +99 -0
  316. package/dist/client/tools/ToolEditor.js.map +1 -0
  317. package/dist/client/tools/ToolViewer.d.ts +5 -0
  318. package/dist/client/tools/ToolViewer.d.ts.map +1 -0
  319. package/dist/client/tools/ToolViewer.js +275 -0
  320. package/dist/client/tools/ToolViewer.js.map +1 -0
  321. package/dist/client/tools/ToolViewerPage.d.ts +2 -0
  322. package/dist/client/tools/ToolViewerPage.d.ts.map +1 -0
  323. package/dist/client/tools/ToolViewerPage.js +24 -0
  324. package/dist/client/tools/ToolViewerPage.js.map +1 -0
  325. package/dist/client/tools/ToolsListPage.d.ts +2 -0
  326. package/dist/client/tools/ToolsListPage.d.ts.map +1 -0
  327. package/dist/client/tools/ToolsListPage.js +73 -0
  328. package/dist/client/tools/ToolsListPage.js.map +1 -0
  329. package/dist/client/tools/ToolsSidebarSection.d.ts +2 -0
  330. package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -0
  331. package/dist/client/tools/ToolsSidebarSection.js +189 -0
  332. package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
  333. package/dist/client/tools/iframe-bridge.d.ts +16 -0
  334. package/dist/client/tools/iframe-bridge.d.ts.map +1 -0
  335. package/dist/client/tools/iframe-bridge.js +118 -0
  336. package/dist/client/tools/iframe-bridge.js.map +1 -0
  337. package/dist/client/tools/index.d.ts +8 -0
  338. package/dist/client/tools/index.d.ts.map +1 -0
  339. package/dist/client/tools/index.js +8 -0
  340. package/dist/client/tools/index.js.map +1 -0
  341. package/dist/client/use-action.d.ts.map +1 -1
  342. package/dist/client/use-action.js +2 -1
  343. package/dist/client/use-action.js.map +1 -1
  344. package/dist/client/use-avatar.d.ts.map +1 -1
  345. package/dist/client/use-avatar.js +3 -2
  346. package/dist/client/use-avatar.js.map +1 -1
  347. package/dist/client/use-builder-enabled.d.ts.map +1 -1
  348. package/dist/client/use-builder-enabled.js +2 -1
  349. package/dist/client/use-builder-enabled.js.map +1 -1
  350. package/dist/client/use-chat-threads.d.ts +1 -0
  351. package/dist/client/use-chat-threads.d.ts.map +1 -1
  352. package/dist/client/use-chat-threads.js +31 -1
  353. package/dist/client/use-chat-threads.js.map +1 -1
  354. package/dist/client/use-db-sync.d.ts.map +1 -1
  355. package/dist/client/use-db-sync.js +9 -8
  356. package/dist/client/use-db-sync.js.map +1 -1
  357. package/dist/client/use-dev-mode.d.ts.map +1 -1
  358. package/dist/client/use-dev-mode.js +2 -1
  359. package/dist/client/use-dev-mode.js.map +1 -1
  360. package/dist/client/use-send-to-agent-chat.d.ts.map +1 -1
  361. package/dist/client/use-send-to-agent-chat.js +3 -1
  362. package/dist/client/use-send-to-agent-chat.js.map +1 -1
  363. package/dist/client/use-session.d.ts.map +1 -1
  364. package/dist/client/use-session.js +2 -1
  365. package/dist/client/use-session.js.map +1 -1
  366. package/dist/client/useProductionAgent.d.ts.map +1 -1
  367. package/dist/client/useProductionAgent.js +2 -1
  368. package/dist/client/useProductionAgent.js.map +1 -1
  369. package/dist/collab/agent-identity.d.ts +15 -0
  370. package/dist/collab/agent-identity.d.ts.map +1 -0
  371. package/dist/collab/agent-identity.js +14 -0
  372. package/dist/collab/agent-identity.js.map +1 -0
  373. package/dist/collab/agent-presence.d.ts +59 -0
  374. package/dist/collab/agent-presence.d.ts.map +1 -0
  375. package/dist/collab/agent-presence.js +165 -0
  376. package/dist/collab/agent-presence.js.map +1 -0
  377. package/dist/collab/awareness.d.ts +7 -0
  378. package/dist/collab/awareness.d.ts.map +1 -1
  379. package/dist/collab/awareness.js +2 -2
  380. package/dist/collab/awareness.js.map +1 -1
  381. package/dist/collab/client-struct.d.ts +43 -0
  382. package/dist/collab/client-struct.d.ts.map +1 -0
  383. package/dist/collab/client-struct.js +272 -0
  384. package/dist/collab/client-struct.js.map +1 -0
  385. package/dist/collab/client.d.ts +2 -0
  386. package/dist/collab/client.d.ts.map +1 -1
  387. package/dist/collab/client.js +18 -3
  388. package/dist/collab/client.js.map +1 -1
  389. package/dist/collab/index.d.ts +6 -1
  390. package/dist/collab/index.d.ts.map +1 -1
  391. package/dist/collab/index.js +11 -1
  392. package/dist/collab/index.js.map +1 -1
  393. package/dist/collab/json-to-yjs.d.ts +72 -0
  394. package/dist/collab/json-to-yjs.d.ts.map +1 -0
  395. package/dist/collab/json-to-yjs.js +456 -0
  396. package/dist/collab/json-to-yjs.js.map +1 -0
  397. package/dist/collab/struct-routes.d.ts +52 -0
  398. package/dist/collab/struct-routes.d.ts.map +1 -0
  399. package/dist/collab/struct-routes.js +74 -0
  400. package/dist/collab/struct-routes.js.map +1 -0
  401. package/dist/collab/ydoc-manager.d.ts +19 -0
  402. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  403. package/dist/collab/ydoc-manager.js +49 -0
  404. package/dist/collab/ydoc-manager.js.map +1 -1
  405. package/dist/credentials/index.d.ts +27 -10
  406. package/dist/credentials/index.d.ts.map +1 -1
  407. package/dist/credentials/index.js +61 -19
  408. package/dist/credentials/index.js.map +1 -1
  409. package/dist/db/client.d.ts.map +1 -1
  410. package/dist/db/client.js +10 -1
  411. package/dist/db/client.js.map +1 -1
  412. package/dist/db/migrations.d.ts +13 -5
  413. package/dist/db/migrations.d.ts.map +1 -1
  414. package/dist/db/migrations.js +9 -2
  415. package/dist/db/migrations.js.map +1 -1
  416. package/dist/deploy/build.d.ts +12 -1
  417. package/dist/deploy/build.d.ts.map +1 -1
  418. package/dist/deploy/build.js +196 -24
  419. package/dist/deploy/build.js.map +1 -1
  420. package/dist/file-upload/builder.d.ts.map +1 -1
  421. package/dist/file-upload/builder.js +2 -1
  422. package/dist/file-upload/builder.js.map +1 -1
  423. package/dist/file-upload/registry.d.ts.map +1 -1
  424. package/dist/file-upload/registry.js +25 -1
  425. package/dist/file-upload/registry.js.map +1 -1
  426. package/dist/index.d.ts +1 -1
  427. package/dist/index.d.ts.map +1 -1
  428. package/dist/index.js +1 -1
  429. package/dist/index.js.map +1 -1
  430. package/dist/integrations/adapters/email.d.ts +17 -0
  431. package/dist/integrations/adapters/email.d.ts.map +1 -0
  432. package/dist/integrations/adapters/email.js +740 -0
  433. package/dist/integrations/adapters/email.js.map +1 -0
  434. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  435. package/dist/integrations/adapters/slack.js +190 -32
  436. package/dist/integrations/adapters/slack.js.map +1 -1
  437. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  438. package/dist/integrations/adapters/telegram.js +56 -5
  439. package/dist/integrations/adapters/telegram.js.map +1 -1
  440. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  441. package/dist/integrations/adapters/whatsapp.js +91 -12
  442. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  443. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  444. package/dist/integrations/google-docs-poller.js +5 -2
  445. package/dist/integrations/google-docs-poller.js.map +1 -1
  446. package/dist/integrations/index.d.ts +1 -0
  447. package/dist/integrations/index.d.ts.map +1 -1
  448. package/dist/integrations/index.js +1 -0
  449. package/dist/integrations/index.js.map +1 -1
  450. package/dist/integrations/internal-token.d.ts +18 -0
  451. package/dist/integrations/internal-token.d.ts.map +1 -0
  452. package/dist/integrations/internal-token.js +102 -0
  453. package/dist/integrations/internal-token.js.map +1 -0
  454. package/dist/integrations/pending-tasks-retry-job.d.ts +15 -0
  455. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -0
  456. package/dist/integrations/pending-tasks-retry-job.js +210 -0
  457. package/dist/integrations/pending-tasks-retry-job.js.map +1 -0
  458. package/dist/integrations/pending-tasks-store.d.ts +56 -0
  459. package/dist/integrations/pending-tasks-store.d.ts.map +1 -0
  460. package/dist/integrations/pending-tasks-store.js +204 -0
  461. package/dist/integrations/pending-tasks-store.js.map +1 -0
  462. package/dist/integrations/plugin.d.ts.map +1 -1
  463. package/dist/integrations/plugin.js +340 -15
  464. package/dist/integrations/plugin.js.map +1 -1
  465. package/dist/integrations/task-queue-stats.d.ts +22 -0
  466. package/dist/integrations/task-queue-stats.d.ts.map +1 -0
  467. package/dist/integrations/task-queue-stats.js +117 -0
  468. package/dist/integrations/task-queue-stats.js.map +1 -0
  469. package/dist/integrations/types.d.ts +35 -2
  470. package/dist/integrations/types.d.ts.map +1 -1
  471. package/dist/integrations/webhook-handler.d.ts +29 -4
  472. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  473. package/dist/integrations/webhook-handler.js +323 -85
  474. package/dist/integrations/webhook-handler.js.map +1 -1
  475. package/dist/jobs/cron.d.ts.map +1 -1
  476. package/dist/jobs/cron.js +12 -4
  477. package/dist/jobs/cron.js.map +1 -1
  478. package/dist/jobs/scheduler.d.ts.map +1 -1
  479. package/dist/jobs/scheduler.js +141 -16
  480. package/dist/jobs/scheduler.js.map +1 -1
  481. package/dist/jobs/tools.d.ts.map +1 -1
  482. package/dist/jobs/tools.js +94 -3
  483. package/dist/jobs/tools.js.map +1 -1
  484. package/dist/mcp/server.d.ts.map +1 -1
  485. package/dist/mcp/server.js +128 -62
  486. package/dist/mcp/server.js.map +1 -1
  487. package/dist/mcp-client/hub-routes.d.ts +14 -0
  488. package/dist/mcp-client/hub-routes.d.ts.map +1 -1
  489. package/dist/mcp-client/hub-routes.js +42 -2
  490. package/dist/mcp-client/hub-routes.js.map +1 -1
  491. package/dist/mcp-client/index.d.ts +1 -1
  492. package/dist/mcp-client/index.d.ts.map +1 -1
  493. package/dist/mcp-client/index.js +1 -1
  494. package/dist/mcp-client/index.js.map +1 -1
  495. package/dist/mcp-client/manager.d.ts +3 -0
  496. package/dist/mcp-client/manager.d.ts.map +1 -1
  497. package/dist/mcp-client/manager.js +33 -3
  498. package/dist/mcp-client/manager.js.map +1 -1
  499. package/dist/mcp-client/remote-store.d.ts +49 -1
  500. package/dist/mcp-client/remote-store.d.ts.map +1 -1
  501. package/dist/mcp-client/remote-store.js +253 -6
  502. package/dist/mcp-client/remote-store.js.map +1 -1
  503. package/dist/mcp-client/routes.d.ts.map +1 -1
  504. package/dist/mcp-client/routes.js +11 -9
  505. package/dist/mcp-client/routes.js.map +1 -1
  506. package/dist/mcp-client/visibility.d.ts +7 -3
  507. package/dist/mcp-client/visibility.d.ts.map +1 -1
  508. package/dist/mcp-client/visibility.js +16 -7
  509. package/dist/mcp-client/visibility.js.map +1 -1
  510. package/dist/notifications/actions.d.ts.map +1 -1
  511. package/dist/notifications/actions.js +7 -1
  512. package/dist/notifications/actions.js.map +1 -1
  513. package/dist/notifications/routes.d.ts +1 -1
  514. package/dist/notifications/routes.d.ts.map +1 -1
  515. package/dist/notifications/routes.js +20 -3
  516. package/dist/notifications/routes.js.map +1 -1
  517. package/dist/notifications/store.d.ts.map +1 -1
  518. package/dist/notifications/store.js +6 -1
  519. package/dist/notifications/store.js.map +1 -1
  520. package/dist/oauth-tokens/google-refresh.d.ts.map +1 -1
  521. package/dist/oauth-tokens/google-refresh.js +6 -0
  522. package/dist/oauth-tokens/google-refresh.js.map +1 -1
  523. package/dist/oauth-tokens/store.d.ts +43 -2
  524. package/dist/oauth-tokens/store.d.ts.map +1 -1
  525. package/dist/oauth-tokens/store.js +83 -14
  526. package/dist/oauth-tokens/store.js.map +1 -1
  527. package/dist/observability/experiments.js +5 -5
  528. package/dist/observability/experiments.js.map +1 -1
  529. package/dist/observability/routes.d.ts.map +1 -1
  530. package/dist/observability/routes.js +37 -8
  531. package/dist/observability/routes.js.map +1 -1
  532. package/dist/observability/store.d.ts.map +1 -1
  533. package/dist/observability/store.js +19 -3
  534. package/dist/observability/store.js.map +1 -1
  535. package/dist/observability/types.d.ts +7 -0
  536. package/dist/observability/types.d.ts.map +1 -1
  537. package/dist/observability/types.js.map +1 -1
  538. package/dist/onboarding/default-steps.d.ts.map +1 -1
  539. package/dist/onboarding/default-steps.js +10 -4
  540. package/dist/onboarding/default-steps.js.map +1 -1
  541. package/dist/onboarding/plugin.d.ts.map +1 -1
  542. package/dist/onboarding/plugin.js +63 -32
  543. package/dist/onboarding/plugin.js.map +1 -1
  544. package/dist/onboarding/types.d.ts +6 -1
  545. package/dist/onboarding/types.d.ts.map +1 -1
  546. package/dist/org/accept-pending.d.ts.map +1 -1
  547. package/dist/org/accept-pending.js +2 -1
  548. package/dist/org/accept-pending.js.map +1 -1
  549. package/dist/org/context.d.ts +35 -0
  550. package/dist/org/context.d.ts.map +1 -1
  551. package/dist/org/context.js +136 -0
  552. package/dist/org/context.js.map +1 -1
  553. package/dist/org/handlers.d.ts +76 -0
  554. package/dist/org/handlers.d.ts.map +1 -1
  555. package/dist/org/handlers.js +411 -2
  556. package/dist/org/handlers.js.map +1 -1
  557. package/dist/org/index.d.ts +2 -2
  558. package/dist/org/index.d.ts.map +1 -1
  559. package/dist/org/index.js +2 -2
  560. package/dist/org/index.js.map +1 -1
  561. package/dist/org/migrations.d.ts.map +1 -1
  562. package/dist/org/migrations.js +8 -0
  563. package/dist/org/migrations.js.map +1 -1
  564. package/dist/org/plugin.d.ts +6 -0
  565. package/dist/org/plugin.d.ts.map +1 -1
  566. package/dist/org/plugin.js +71 -7
  567. package/dist/org/plugin.js.map +1 -1
  568. package/dist/org/schema.d.ts +38 -0
  569. package/dist/org/schema.d.ts.map +1 -1
  570. package/dist/org/schema.js +2 -0
  571. package/dist/org/schema.js.map +1 -1
  572. package/dist/org/types.d.ts +7 -0
  573. package/dist/org/types.d.ts.map +1 -1
  574. package/dist/progress/actions.d.ts.map +1 -1
  575. package/dist/progress/actions.js +10 -1
  576. package/dist/progress/actions.js.map +1 -1
  577. package/dist/progress/routes.d.ts +1 -1
  578. package/dist/progress/routes.d.ts.map +1 -1
  579. package/dist/progress/routes.js +20 -3
  580. package/dist/progress/routes.js.map +1 -1
  581. package/dist/progress/store.d.ts.map +1 -1
  582. package/dist/progress/store.js +6 -1
  583. package/dist/progress/store.js.map +1 -1
  584. package/dist/resources/handlers.d.ts.map +1 -1
  585. package/dist/resources/handlers.js +35 -7
  586. package/dist/resources/handlers.js.map +1 -1
  587. package/dist/resources/script-helpers.d.ts.map +1 -1
  588. package/dist/resources/script-helpers.js +15 -3
  589. package/dist/resources/script-helpers.js.map +1 -1
  590. package/dist/resources/store.d.ts.map +1 -1
  591. package/dist/resources/store.js +12 -4
  592. package/dist/resources/store.js.map +1 -1
  593. package/dist/scripts/call-agent.d.ts +1 -0
  594. package/dist/scripts/call-agent.d.ts.map +1 -1
  595. package/dist/scripts/call-agent.js +146 -36
  596. package/dist/scripts/call-agent.js.map +1 -1
  597. package/dist/scripts/chat/search-chats.d.ts.map +1 -1
  598. package/dist/scripts/chat/search-chats.js +3 -2
  599. package/dist/scripts/chat/search-chats.js.map +1 -1
  600. package/dist/scripts/db/exec.d.ts +1 -1
  601. package/dist/scripts/db/exec.d.ts.map +1 -1
  602. package/dist/scripts/db/exec.js +22 -3
  603. package/dist/scripts/db/exec.js.map +1 -1
  604. package/dist/scripts/db/index.d.ts.map +1 -1
  605. package/dist/scripts/db/index.js +2 -0
  606. package/dist/scripts/db/index.js.map +1 -1
  607. package/dist/scripts/db/migrate-user-api-keys.d.ts +24 -0
  608. package/dist/scripts/db/migrate-user-api-keys.d.ts.map +1 -0
  609. package/dist/scripts/db/migrate-user-api-keys.js +234 -0
  610. package/dist/scripts/db/migrate-user-api-keys.js.map +1 -0
  611. package/dist/scripts/db/query.d.ts +1 -1
  612. package/dist/scripts/db/query.d.ts.map +1 -1
  613. package/dist/scripts/db/query.js +22 -3
  614. package/dist/scripts/db/query.js.map +1 -1
  615. package/dist/scripts/db/scoping.d.ts.map +1 -1
  616. package/dist/scripts/db/scoping.js +15 -9
  617. package/dist/scripts/db/scoping.js.map +1 -1
  618. package/dist/scripts/db/wipe-leaked-builder-keys.d.ts +27 -0
  619. package/dist/scripts/db/wipe-leaked-builder-keys.d.ts.map +1 -0
  620. package/dist/scripts/db/wipe-leaked-builder-keys.js +163 -0
  621. package/dist/scripts/db/wipe-leaked-builder-keys.js.map +1 -0
  622. package/dist/scripts/dev/shell.d.ts.map +1 -1
  623. package/dist/scripts/dev/shell.js +3 -1
  624. package/dist/scripts/dev/shell.js.map +1 -1
  625. package/dist/scripts/resources/delete-memory.d.ts.map +1 -1
  626. package/dist/scripts/resources/delete-memory.js +2 -1
  627. package/dist/scripts/resources/delete-memory.js.map +1 -1
  628. package/dist/scripts/resources/delete.d.ts.map +1 -1
  629. package/dist/scripts/resources/delete.js +2 -1
  630. package/dist/scripts/resources/delete.js.map +1 -1
  631. package/dist/scripts/resources/list.d.ts.map +1 -1
  632. package/dist/scripts/resources/list.js +2 -1
  633. package/dist/scripts/resources/list.js.map +1 -1
  634. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
  635. package/dist/scripts/resources/migrate-learnings.js +2 -1
  636. package/dist/scripts/resources/migrate-learnings.js.map +1 -1
  637. package/dist/scripts/resources/read.d.ts.map +1 -1
  638. package/dist/scripts/resources/read.js +2 -1
  639. package/dist/scripts/resources/read.js.map +1 -1
  640. package/dist/scripts/resources/save-memory.d.ts.map +1 -1
  641. package/dist/scripts/resources/save-memory.js +2 -1
  642. package/dist/scripts/resources/save-memory.js.map +1 -1
  643. package/dist/scripts/resources/write.d.ts.map +1 -1
  644. package/dist/scripts/resources/write.js +2 -1
  645. package/dist/scripts/resources/write.js.map +1 -1
  646. package/dist/secrets/onboarding.d.ts.map +1 -1
  647. package/dist/secrets/onboarding.js +24 -16
  648. package/dist/secrets/onboarding.js.map +1 -1
  649. package/dist/secrets/register-framework-secrets.d.ts +5 -0
  650. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  651. package/dist/secrets/register-framework-secrets.js +7 -44
  652. package/dist/secrets/register-framework-secrets.js.map +1 -1
  653. package/dist/secrets/routes.d.ts.map +1 -1
  654. package/dist/secrets/routes.js +139 -37
  655. package/dist/secrets/routes.js.map +1 -1
  656. package/dist/secrets/storage.d.ts.map +1 -1
  657. package/dist/secrets/storage.js +23 -12
  658. package/dist/secrets/storage.js.map +1 -1
  659. package/dist/secrets/substitution.d.ts +24 -2
  660. package/dist/secrets/substitution.d.ts.map +1 -1
  661. package/dist/secrets/substitution.js +58 -8
  662. package/dist/secrets/substitution.js.map +1 -1
  663. package/dist/server/action-discovery.d.ts.map +1 -1
  664. package/dist/server/action-discovery.js +54 -51
  665. package/dist/server/action-discovery.js.map +1 -1
  666. package/dist/server/action-routes.d.ts.map +1 -1
  667. package/dist/server/action-routes.js +42 -15
  668. package/dist/server/action-routes.js.map +1 -1
  669. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  670. package/dist/server/agent-chat-plugin.js +632 -373
  671. package/dist/server/agent-chat-plugin.js.map +1 -1
  672. package/dist/server/agent-discovery.d.ts +8 -0
  673. package/dist/server/agent-discovery.d.ts.map +1 -1
  674. package/dist/server/agent-discovery.js +39 -12
  675. package/dist/server/agent-discovery.js.map +1 -1
  676. package/dist/server/agent-teams.d.ts.map +1 -1
  677. package/dist/server/agent-teams.js +4 -1
  678. package/dist/server/agent-teams.js.map +1 -1
  679. package/dist/server/analytics.d.ts +0 -1
  680. package/dist/server/analytics.d.ts.map +1 -1
  681. package/dist/server/analytics.js +0 -1
  682. package/dist/server/analytics.js.map +1 -1
  683. package/dist/server/app-base-path.d.ts +4 -0
  684. package/dist/server/app-base-path.d.ts.map +1 -0
  685. package/dist/server/app-base-path.js +33 -0
  686. package/dist/server/app-base-path.js.map +1 -0
  687. package/dist/server/auth.d.ts +29 -0
  688. package/dist/server/auth.d.ts.map +1 -1
  689. package/dist/server/auth.js +629 -82
  690. package/dist/server/auth.js.map +1 -1
  691. package/dist/server/better-auth-instance.d.ts +1 -0
  692. package/dist/server/better-auth-instance.d.ts.map +1 -1
  693. package/dist/server/better-auth-instance.js +67 -15
  694. package/dist/server/better-auth-instance.js.map +1 -1
  695. package/dist/server/builder-browser.d.ts +16 -1
  696. package/dist/server/builder-browser.d.ts.map +1 -1
  697. package/dist/server/builder-browser.js +102 -16
  698. package/dist/server/builder-browser.js.map +1 -1
  699. package/dist/server/cli-capture.d.ts +31 -0
  700. package/dist/server/cli-capture.d.ts.map +1 -0
  701. package/dist/server/cli-capture.js +120 -0
  702. package/dist/server/cli-capture.js.map +1 -0
  703. package/dist/server/collab-plugin.d.ts +16 -0
  704. package/dist/server/collab-plugin.d.ts.map +1 -1
  705. package/dist/server/collab-plugin.js +87 -19
  706. package/dist/server/collab-plugin.js.map +1 -1
  707. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  708. package/dist/server/core-routes-plugin.js +499 -164
  709. package/dist/server/core-routes-plugin.js.map +1 -1
  710. package/dist/server/create-server.d.ts +2 -0
  711. package/dist/server/create-server.d.ts.map +1 -1
  712. package/dist/server/create-server.js +82 -11
  713. package/dist/server/create-server.js.map +1 -1
  714. package/dist/server/credential-provider.d.ts +54 -2
  715. package/dist/server/credential-provider.d.ts.map +1 -1
  716. package/dist/server/credential-provider.js +164 -2
  717. package/dist/server/credential-provider.js.map +1 -1
  718. package/dist/server/csrf.d.ts +58 -0
  719. package/dist/server/csrf.d.ts.map +1 -0
  720. package/dist/server/csrf.js +165 -0
  721. package/dist/server/csrf.js.map +1 -0
  722. package/dist/server/design-token-utils.d.ts +132 -0
  723. package/dist/server/design-token-utils.d.ts.map +1 -0
  724. package/dist/server/design-token-utils.js +714 -0
  725. package/dist/server/design-token-utils.js.map +1 -0
  726. package/dist/server/email.d.ts +10 -0
  727. package/dist/server/email.d.ts.map +1 -1
  728. package/dist/server/email.js +63 -16
  729. package/dist/server/email.js.map +1 -1
  730. package/dist/server/framework-request-handler.d.ts +20 -0
  731. package/dist/server/framework-request-handler.d.ts.map +1 -1
  732. package/dist/server/framework-request-handler.js +140 -24
  733. package/dist/server/framework-request-handler.js.map +1 -1
  734. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  735. package/dist/server/google-auth-plugin.js +10 -2
  736. package/dist/server/google-auth-plugin.js.map +1 -1
  737. package/dist/server/google-oauth.d.ts +102 -3
  738. package/dist/server/google-oauth.d.ts.map +1 -1
  739. package/dist/server/google-oauth.js +263 -43
  740. package/dist/server/google-oauth.js.map +1 -1
  741. package/dist/server/index.d.ts +5 -5
  742. package/dist/server/index.d.ts.map +1 -1
  743. package/dist/server/index.js +5 -5
  744. package/dist/server/index.js.map +1 -1
  745. package/dist/server/oauth-helpers.d.ts +8 -3
  746. package/dist/server/oauth-helpers.d.ts.map +1 -1
  747. package/dist/server/oauth-helpers.js +12 -8
  748. package/dist/server/oauth-helpers.js.map +1 -1
  749. package/dist/server/onboarding-html.d.ts.map +1 -1
  750. package/dist/server/onboarding-html.js +50 -9
  751. package/dist/server/onboarding-html.js.map +1 -1
  752. package/dist/server/poll.d.ts +33 -0
  753. package/dist/server/poll.d.ts.map +1 -1
  754. package/dist/server/poll.js +43 -2
  755. package/dist/server/poll.js.map +1 -1
  756. package/dist/server/request-context.d.ts +102 -3
  757. package/dist/server/request-context.d.ts.map +1 -1
  758. package/dist/server/request-context.js +100 -7
  759. package/dist/server/request-context.js.map +1 -1
  760. package/dist/server/security-headers.d.ts +51 -0
  761. package/dist/server/security-headers.d.ts.map +1 -0
  762. package/dist/server/security-headers.js +90 -0
  763. package/dist/server/security-headers.js.map +1 -0
  764. package/dist/server/ssr-handler.d.ts.map +1 -1
  765. package/dist/server/ssr-handler.js +96 -2
  766. package/dist/server/ssr-handler.js.map +1 -1
  767. package/dist/server/transcribe-voice.d.ts.map +1 -1
  768. package/dist/server/transcribe-voice.js +376 -60
  769. package/dist/server/transcribe-voice.js.map +1 -1
  770. package/dist/server/voice-providers-status.d.ts +12 -0
  771. package/dist/server/voice-providers-status.d.ts.map +1 -0
  772. package/dist/server/voice-providers-status.js +71 -0
  773. package/dist/server/voice-providers-status.js.map +1 -0
  774. package/dist/sharing/access.d.ts.map +1 -1
  775. package/dist/sharing/access.js +16 -13
  776. package/dist/sharing/access.js.map +1 -1
  777. package/dist/sharing/actions/share-resource.d.ts +1 -0
  778. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  779. package/dist/sharing/actions/share-resource.js +45 -0
  780. package/dist/sharing/actions/share-resource.js.map +1 -1
  781. package/dist/sharing/schema.d.ts +1 -1
  782. package/dist/styles/agent-native.css +5 -0
  783. package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
  784. package/dist/templates/default/app/root.tsx +51 -14
  785. package/dist/templates/default/app/routes/_index.tsx +6 -1
  786. package/dist/templates/default/public/favicon.svg +13 -0
  787. package/dist/templates/default/public/icon-180.svg +12 -3
  788. package/dist/templates/default/public/icon-192.svg +12 -3
  789. package/dist/templates/default/public/icon-512.svg +12 -3
  790. package/dist/templates/default/react-router.config.ts +3 -0
  791. package/dist/templates/workspace-core/package.json +22 -4
  792. package/dist/templates/workspace-core/src/credentials.ts +32 -5
  793. package/dist/templates/workspace-core/tsconfig.json +4 -1
  794. package/dist/terminal/pty-server.d.ts.map +1 -1
  795. package/dist/terminal/pty-server.js +7 -1
  796. package/dist/terminal/pty-server.js.map +1 -1
  797. package/dist/terminal/terminal-plugin.d.ts.map +1 -1
  798. package/dist/terminal/terminal-plugin.js +26 -6
  799. package/dist/terminal/terminal-plugin.js.map +1 -1
  800. package/dist/tools/actions.d.ts +3 -0
  801. package/dist/tools/actions.d.ts.map +1 -0
  802. package/dist/tools/actions.js +270 -0
  803. package/dist/tools/actions.js.map +1 -0
  804. package/dist/tools/fetch-tool.d.ts +1 -0
  805. package/dist/tools/fetch-tool.d.ts.map +1 -1
  806. package/dist/tools/fetch-tool.js +39 -17
  807. package/dist/tools/fetch-tool.js.map +1 -1
  808. package/dist/tools/html-shell.d.ts +44 -0
  809. package/dist/tools/html-shell.d.ts.map +1 -0
  810. package/dist/tools/html-shell.js +485 -0
  811. package/dist/tools/html-shell.js.map +1 -0
  812. package/dist/tools/proxy-security.d.ts +12 -0
  813. package/dist/tools/proxy-security.d.ts.map +1 -0
  814. package/dist/tools/proxy-security.js +158 -0
  815. package/dist/tools/proxy-security.js.map +1 -0
  816. package/dist/tools/routes.d.ts +2 -0
  817. package/dist/tools/routes.d.ts.map +1 -0
  818. package/dist/tools/routes.js +629 -0
  819. package/dist/tools/routes.js.map +1 -0
  820. package/dist/tools/schema.d.ts +578 -0
  821. package/dist/tools/schema.d.ts.map +1 -0
  822. package/dist/tools/schema.js +115 -0
  823. package/dist/tools/schema.js.map +1 -0
  824. package/dist/tools/slots/routes.d.ts +15 -0
  825. package/dist/tools/slots/routes.d.ts.map +1 -0
  826. package/dist/tools/slots/routes.js +94 -0
  827. package/dist/tools/slots/routes.js.map +1 -0
  828. package/dist/tools/slots/schema.d.ts +303 -0
  829. package/dist/tools/slots/schema.d.ts.map +1 -0
  830. package/dist/tools/slots/schema.js +76 -0
  831. package/dist/tools/slots/schema.js.map +1 -0
  832. package/dist/tools/slots/store.d.ts +66 -0
  833. package/dist/tools/slots/store.d.ts.map +1 -0
  834. package/dist/tools/slots/store.js +227 -0
  835. package/dist/tools/slots/store.js.map +1 -0
  836. package/dist/tools/store.d.ts +40 -0
  837. package/dist/tools/store.d.ts.map +1 -0
  838. package/dist/tools/store.js +181 -0
  839. package/dist/tools/store.js.map +1 -0
  840. package/dist/tools/theme.d.ts +2 -0
  841. package/dist/tools/theme.d.ts.map +1 -0
  842. package/dist/tools/theme.js +67 -0
  843. package/dist/tools/theme.js.map +1 -0
  844. package/dist/tools/url-safety.d.ts +24 -0
  845. package/dist/tools/url-safety.d.ts.map +1 -0
  846. package/dist/tools/url-safety.js +224 -0
  847. package/dist/tools/url-safety.js.map +1 -0
  848. package/dist/tracking/providers.d.ts.map +1 -1
  849. package/dist/tracking/providers.js +28 -11
  850. package/dist/tracking/providers.js.map +1 -1
  851. package/dist/tracking/registry.d.ts.map +1 -1
  852. package/dist/tracking/registry.js +7 -3
  853. package/dist/tracking/registry.js.map +1 -1
  854. package/dist/transcription/builder-transcription.d.ts.map +1 -1
  855. package/dist/transcription/builder-transcription.js +26 -14
  856. package/dist/transcription/builder-transcription.js.map +1 -1
  857. package/dist/triggers/actions.d.ts.map +1 -1
  858. package/dist/triggers/actions.js +11 -6
  859. package/dist/triggers/actions.js.map +1 -1
  860. package/dist/triggers/condition-evaluator.d.ts +8 -0
  861. package/dist/triggers/condition-evaluator.d.ts.map +1 -1
  862. package/dist/triggers/condition-evaluator.js +39 -4
  863. package/dist/triggers/condition-evaluator.js.map +1 -1
  864. package/dist/triggers/dispatcher.d.ts.map +1 -1
  865. package/dist/triggers/dispatcher.js +67 -4
  866. package/dist/triggers/dispatcher.js.map +1 -1
  867. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  868. package/dist/vite/action-types-plugin.js +18 -7
  869. package/dist/vite/action-types-plugin.js.map +1 -1
  870. package/dist/vite/client.d.ts +2 -0
  871. package/dist/vite/client.d.ts.map +1 -1
  872. package/dist/vite/client.js +240 -8
  873. package/dist/vite/client.js.map +1 -1
  874. package/docs/content/a2a-protocol.md +2 -2
  875. package/docs/content/authentication.md +78 -12
  876. package/docs/content/cloneable-saas.md +59 -62
  877. package/docs/content/drop-in-agent.md +2 -2
  878. package/docs/content/faq.md +73 -43
  879. package/docs/content/getting-started.md +37 -61
  880. package/docs/content/mcp-clients.md +14 -1
  881. package/docs/content/messaging.md +324 -0
  882. package/docs/content/onboarding.md +82 -12
  883. package/docs/content/pure-agent-apps.md +55 -28
  884. package/docs/content/template-analytics.md +65 -59
  885. package/docs/content/template-calendar.md +61 -56
  886. package/docs/content/template-clips.md +25 -23
  887. package/docs/content/template-content.md +36 -26
  888. package/docs/content/template-design.md +55 -0
  889. package/docs/content/template-dispatch.md +15 -1
  890. package/docs/content/template-forms.md +19 -16
  891. package/docs/content/template-mail.md +78 -80
  892. package/docs/content/template-slides.md +43 -31
  893. package/docs/content/template-video.md +49 -22
  894. package/docs/content/tools.md +107 -0
  895. package/docs/content/what-is-agent-native.md +89 -105
  896. package/package.json +5 -1
  897. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
  898. package/src/templates/default/app/root.tsx +51 -14
  899. package/src/templates/default/app/routes/_index.tsx +6 -1
  900. package/src/templates/default/public/favicon.svg +13 -0
  901. package/src/templates/default/public/icon-180.svg +12 -3
  902. package/src/templates/default/public/icon-192.svg +12 -3
  903. package/src/templates/default/public/icon-512.svg +12 -3
  904. package/src/templates/default/react-router.config.ts +3 -0
  905. package/src/templates/workspace-core/package.json +22 -4
  906. package/src/templates/workspace-core/src/credentials.ts +32 -5
  907. package/src/templates/workspace-core/tsconfig.json +4 -1
  908. package/docs/content/integrations.md +0 -198
@@ -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, getBuilderCallbackEnvVars, 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
  *
@@ -59,14 +110,46 @@ export function createCoreRoutesPlugin(options = {}) {
59
110
  // writes don't persist across invocations — the DB is the durable
60
111
  // store. Only set keys that are currently empty so explicit env
61
112
  // vars (Netlify dashboard, process-level) always win.
113
+ //
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.
62
123
  try {
63
124
  const persisted = (await getSetting("persisted-env-vars"));
64
125
  if (persisted) {
126
+ const builderKeys = new Set(BUILDER_ENV_KEYS);
127
+ const writesAllowed = isEnvVarWriteAllowed();
128
+ let scrubbed = 0;
65
129
  for (const [k, v] of Object.entries(persisted)) {
66
- if (typeof v === "string" && !process.env[k]) {
130
+ if (builderKeys.has(k)) {
131
+ scrubbed++;
132
+ continue;
133
+ }
134
+ if (writesAllowed && typeof v === "string" && !process.env[k]) {
67
135
  process.env[k] = v;
68
136
  }
69
137
  }
138
+ if (scrubbed > 0) {
139
+ try {
140
+ const cleaned = {};
141
+ for (const [k, v] of Object.entries(persisted)) {
142
+ if (!builderKeys.has(k))
143
+ cleaned[k] = v;
144
+ }
145
+ await putSetting("persisted-env-vars", cleaned);
146
+ console.warn(`[core] Removed ${scrubbed} legacy BUILDER_* key(s) from persisted-env-vars (cross-tenant leak fix).`);
147
+ }
148
+ catch {
149
+ // Couldn't rewrite the row — the skip-on-rehydrate above
150
+ // is the load-bearing protection. We'll try again next boot.
151
+ }
152
+ }
70
153
  }
71
154
  }
72
155
  catch {
@@ -107,6 +190,12 @@ export function createCoreRoutesPlugin(options = {}) {
107
190
  // Observability module not available — skip
108
191
  }
109
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());
110
199
  // CORS for framework routes. Desktop tray apps (Tauri/Electron) run on
111
200
  // their own dev origin (e.g. localhost:1420) and make credentialed
112
201
  // requests against the template's server at a different port. We echo
@@ -116,32 +205,81 @@ export function createCoreRoutesPlugin(options = {}) {
116
205
  .split(",")
117
206
  .map((s) => s.trim())
118
207
  .filter(Boolean);
208
+ const isProduction = process.env.NODE_ENV === "production";
209
+ const LOCALHOST_RE = /^https?:\/\/(localhost|127\.0\.0\.1|tauri\.localhost)(:\d+)?$/;
119
210
  getH3App(nitroApp).use(defineEventHandler((event) => {
120
- const url = event.node?.req?.url ?? event.path ?? "/";
121
- 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/"))
122
214
  return;
123
215
  const reqHeaders = (event.node?.req?.headers ?? {});
124
216
  const originRaw = reqHeaders["origin"];
125
217
  const origin = Array.isArray(originRaw) ? originRaw[0] : originRaw;
126
- if (!origin)
127
- return;
128
- const allowed = allowlist.length === 0 ||
129
- allowlist.includes(origin) ||
130
- // Dev convenience: allow any localhost origin (tray windows,
131
- // frame, docs) without requiring an explicit allowlist.
132
- /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin);
133
- if (!allowed)
134
- return;
135
- setResponseHeader(event, "Access-Control-Allow-Origin", origin);
136
- setResponseHeader(event, "Vary", "Origin");
137
- setResponseHeader(event, "Access-Control-Allow-Credentials", "true");
138
- setResponseHeader(event, "Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS");
139
- setResponseHeader(event, "Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With");
140
- 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
+ }
141
262
  setResponseStatus(event, 204);
142
263
  return "";
143
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");
144
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));
145
283
  // Polling
146
284
  getH3App(nitroApp).use(`${P}/poll`, createPollHandler());
147
285
  // SSE
@@ -156,14 +294,92 @@ export function createCoreRoutesPlugin(options = {}) {
156
294
  })));
157
295
  }
158
296
  getH3App(nitroApp).use(`${P}/builder/status`, defineEventHandler(async (event) => {
159
- const status = getBuilderBrowserStatusForEvent(event);
160
- // Honor the SQL disconnect flag even when process.env still has
161
- // BUILDER_* (dev env-runner weirdness — see plugin init above).
162
- try {
163
- const disconnected = await getSetting("builder-disconnected");
164
- if (disconnected) {
297
+ const envStatus = getBuilderBrowserStatusForEvent(event);
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
+ }
321
+ }
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) {
165
381
  return {
166
- ...status,
382
+ ...envStatus,
167
383
  configured: false,
168
384
  privateKeyConfigured: false,
169
385
  publicKeyConfigured: false,
@@ -172,11 +388,8 @@ export function createCoreRoutesPlugin(options = {}) {
172
388
  orgKind: undefined,
173
389
  };
174
390
  }
175
- }
176
- catch {
177
- // DB not reachable — fall back to env-only status.
178
- }
179
- return status;
391
+ return envStatus;
392
+ });
180
393
  }));
181
394
  // Lightweight 302 to the Builder CLI-auth URL. Lets clients do
182
395
  // `window.open('/_agent-native/builder/connect', '_blank')` synchronously
@@ -222,14 +435,15 @@ export function createCoreRoutesPlugin(options = {}) {
222
435
  // caller isn't a named user we should spend a Builder private key
223
436
  // on. Allow it only when the environment explicitly opts into
224
437
  // local mode (dev, tests, or AUTH_MODE=local).
225
- if (session.email === "local@localhost" &&
438
+ if (session.email === DEV_MODE_USER_EMAIL &&
226
439
  process.env.NODE_ENV === "production" &&
227
440
  process.env.AUTH_MODE !== "local") {
228
441
  setResponseStatus(event, 401);
229
442
  return { error: "A signed-in user is required to run Builder" };
230
443
  }
231
444
  const userEmail = session.email;
232
- const builderUserId = process.env.BUILDER_USER_ID || undefined;
445
+ const { resolveBuilderCredential: resolveBuilderCred } = await import("./credential-provider.js");
446
+ const builderUserId = (await resolveBuilderCred("BUILDER_USER_ID")) || undefined;
233
447
  // Server-controlled projectId — don't let clients target arbitrary
234
448
  // Builder projects with our private key. When this feature graduates
235
449
  // past the hardcoded preview, the projectId will come from
@@ -280,49 +494,65 @@ export function createCoreRoutesPlugin(options = {}) {
280
494
  setResponseStatus(event, 400);
281
495
  return { error: "Missing Builder credentials in callback" };
282
496
  }
283
- const vars = getBuilderCallbackEnvVars({
284
- privateKey,
285
- publicKey,
286
- userId: requestUrl.searchParams.get("user-id"),
287
- orgName: requestUrl.searchParams.get("org-name"),
288
- orgKind: requestUrl.searchParams.get("kind"),
289
- });
290
- // Clear the disconnect flag first a prior disconnect would
291
- // otherwise cause the plugin init to scrub these keys right back
292
- // out on the next env-runner reload.
497
+ const userId = requestUrl.searchParams.get("user-id");
498
+ const orgName = requestUrl.searchParams.get("org-name");
499
+ const orgKind = requestUrl.searchParams.get("kind");
500
+ // Store per-user in app_secrets so each user's Builder connection
501
+ // is independent. No more shared env vars that the last connector
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;
293
512
  try {
294
- await deleteSetting("builder-disconnected");
513
+ const { writeBuilderCredentials } = await import("./credential-provider.js");
514
+ await writeBuilderCredentials(session.email, {
515
+ privateKey,
516
+ publicKey,
517
+ userId,
518
+ orgName,
519
+ orgKind,
520
+ });
295
521
  }
296
- catch {
297
- // DB not ready — proceed; the worst case is a stale disconnect
298
- // flag that gets cleared on the next reconnect attempt.
522
+ catch (err) {
523
+ writeError = err?.message ?? String(err);
524
+ console.error("[builder] Failed to persist per-user credentials:", writeError);
525
+ }
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);
299
542
  }
300
- // Prefer the workspace root .env when in an enterprise workspace so
301
- // Builder credentials are shared across every app automatically.
543
+ // Clear any legacy disconnect flag and any prior connect-error row
544
+ // (so a successful retry doesn't surface the previous failure).
302
545
  try {
303
- const workspaceRoot = findWorkspaceRoot(process.cwd());
304
- const envPath = workspaceRoot
305
- ? path.join(workspaceRoot, ".env")
306
- : path.join(process.cwd(), ".env");
307
- await upsertEnvFile(envPath, vars);
546
+ await deleteSetting("builder-disconnected");
308
547
  }
309
548
  catch {
310
- // Edge runtimeskip file write
311
- }
312
- for (const { key, value } of vars) {
313
- process.env[key] = value;
549
+ // DB not ready proceed
314
550
  }
315
- // Persist to settings table so serverless cold starts can
316
- // restore credentials (.env writes don't survive on Netlify).
317
551
  try {
318
- const envMap = {};
319
- for (const { key, value } of vars)
320
- envMap[key] = value;
321
- const existing = (await getSetting("persisted-env-vars")) ?? {};
322
- await putSetting("persisted-env-vars", { ...existing, ...envMap });
552
+ await deleteSetting(`builder-connect-error:${session.email}`);
323
553
  }
324
554
  catch {
325
- // DB not ready yetskip
555
+ // No prior error rowfine
326
556
  }
327
557
  const previewUrl = resolveSafePreviewUrl(requestUrl.searchParams.get("preview-url"), event);
328
558
  setResponseHeader(event, "Content-Type", "text/html; charset=utf-8");
@@ -344,63 +574,20 @@ export function createCoreRoutesPlugin(options = {}) {
344
574
  setResponseStatus(event, 401);
345
575
  return { error: "unauthorized" };
346
576
  }
347
- // We intentionally do NOT rewrite the `.env` file on disconnect.
348
- // A `.env` write triggers nitro's file watcher → env-runner
349
- // restart, which tears down in-flight SSE / HMR connections and
350
- // surfaces as `read ECONNRESET` in the vite overlay. The
351
- // authoritative disconnect signal is the SQL `builder-disconnected`
352
- // flag (checked in plugin init, the status endpoint, and the
353
- // Builder engine before any gateway call). `.env` keys, if any
354
- // survive, are neutered by the flag-driven scrub in plugin init.
355
- // 1. Write the disconnect flag. This is load-bearing — every
356
- // subsequent check (plugin init scrub, /builder/status override,
357
- // BuilderEngine.stream short-circuit) reads this flag. If the
358
- // write fails, we FAIL HARD: clearing process.env without
359
- // persisting the flag means the next env-runner reload would
360
- // silently restore BUILDER_* from whatever inherited env the
361
- // worker was spawned with, and the user would see "Disconnected"
362
- // in the UI that flips back to "Connected" moments later.
577
+ // Delete per-user Builder credentials from app_secrets.
363
578
  try {
364
- await putSetting("builder-disconnected", { at: Date.now() });
579
+ const { deleteBuilderCredentials } = await import("./credential-provider.js");
580
+ await deleteBuilderCredentials(session.email);
365
581
  }
366
582
  catch (err) {
367
583
  setResponseStatus(event, 500);
368
584
  return {
369
585
  ok: false,
370
- error: "Could not persist disconnect flag — your Builder connection is unchanged. Please retry.",
586
+ error: "Could not remove Builder credentials — your connection is unchanged. Please retry.",
371
587
  cause: err instanceof Error ? err.message : String(err),
372
588
  };
373
589
  }
374
- // 2. Scrub the persisted-env-vars row so serverless cold starts
375
- // don't rehydrate BUILDER_* from SQL. Best-effort: the disconnect
376
- // flag above already prevents Builder from being used; this is
377
- // cleanup.
378
- let warnPersisted;
379
- try {
380
- const existing = (await getSetting("persisted-env-vars")) ?? {};
381
- const cleaned = {};
382
- for (const [k, v] of Object.entries(existing)) {
383
- if (!BUILDER_ENV_KEYS.includes(k))
384
- cleaned[k] = v;
385
- }
386
- await putSetting("persisted-env-vars", cleaned);
387
- }
388
- catch (err) {
389
- warnPersisted = err instanceof Error ? err.message : String(err);
390
- }
391
- // 3. Clear in-process env vars so the current worker stops routing
392
- // through Builder immediately. Nitro's env-runner may re-populate
393
- // these across a module reload, but by then the `builder-disconnected`
394
- // flag will be enforced at the plugin-init scrub.
395
- for (const key of BUILDER_ENV_KEYS) {
396
- delete process.env[key];
397
- }
398
- return {
399
- ok: true,
400
- ...(warnPersisted
401
- ? { warnings: { persistedEnvVars: warnPersisted } }
402
- : {}),
403
- };
590
+ return { ok: true };
404
591
  }));
405
592
  // Proxy to Builder's agents-run API for background code changes.
406
593
  getH3App(nitroApp).use(`${P}/builder/agents-run`, defineEventHandler(async (event) => {
@@ -408,47 +595,56 @@ export function createCoreRoutesPlugin(options = {}) {
408
595
  setResponseStatus(event, 405);
409
596
  return { error: "Method not allowed" };
410
597
  }
411
- const privateKey = process.env.BUILDER_PRIVATE_KEY;
412
- const publicKey = process.env.BUILDER_PUBLIC_KEY;
413
- if (!privateKey || !publicKey) {
414
- setResponseStatus(event, 400);
415
- return {
416
- error: "Builder not connected. Connect Builder in Setup to use background agent.",
417
- };
418
- }
419
- const body = (await readBody(event));
420
- if (!body?.userMessage) {
421
- setResponseStatus(event, 400);
422
- 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" };
423
602
  }
424
- const apiHost = process.env.BUILDER_API_HOST || "https://ai-services.builder.io";
425
- try {
426
- const res = await fetch(`${apiHost}/agents/run?apiKey=${encodeURIComponent(publicKey)}`, {
427
- method: "POST",
428
- headers: {
429
- "Content-Type": "application/json",
430
- Authorization: `Bearer ${privateKey}`,
431
- },
432
- body: JSON.stringify({
433
- userMessage: {
434
- 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}`,
435
624
  },
436
- branchName: body.branchName,
437
- }),
438
- });
439
- if (!res.ok) {
440
- const err = await res.text().catch(() => "Unknown error");
441
- setResponseStatus(event, res.status);
442
- 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();
443
640
  }
444
- return await res.json();
445
- }
446
- catch (err) {
447
- setResponseStatus(event, 500);
448
- return {
449
- error: err?.message || "Failed to reach Builder agents-run API",
450
- };
451
- }
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
+ });
452
648
  }));
453
649
  // Env key management — framework keys are always included
454
650
  const frameworkEnvKeys = [
@@ -489,12 +685,25 @@ export function createCoreRoutesPlugin(options = {}) {
489
685
  label: cfg.label,
490
686
  required: cfg.required ?? false,
491
687
  configured: !!process.env[cfg.key],
688
+ ...(cfg.helpText ? { helpText: cfg.helpText } : {}),
492
689
  }))));
493
690
  getH3App(nitroApp).use(`${P}/env-vars`, defineEventHandler(async (event) => {
494
691
  if (getMethod(event) !== "POST") {
495
692
  setResponseStatus(event, 405);
496
693
  return { error: "Method not allowed" };
497
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
+ }
498
707
  const body = await readBody(event);
499
708
  const { vars } = body;
500
709
  if (!Array.isArray(vars) || vars.length === 0) {
@@ -579,6 +788,19 @@ export function createCoreRoutesPlugin(options = {}) {
579
788
  };
580
789
  }
581
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
+ }
582
804
  const detected = detectEngineFromEnv();
583
805
  if (detected) {
584
806
  return {
@@ -638,17 +860,51 @@ export function createCoreRoutesPlugin(options = {}) {
638
860
  // ─── File upload primitive ──────────────────────────────────────
639
861
  // GET /_agent-native/file-upload/status — report active provider
640
862
  // POST /_agent-native/file-upload — upload a file, return { url }
641
- getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(() => {
863
+ getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(async (event) => {
642
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;
871
+ let builderConfigured = !!process.env.BUILDER_PRIVATE_KEY;
872
+ try {
873
+ const { resolveBuilderPrivateKey } = await import("./credential-provider.js");
874
+ const resolve = () => resolveBuilderPrivateKey().then((k) => !!k);
875
+ builderConfigured = userEmail
876
+ ? await runWithRequestContext({ userEmail }, resolve)
877
+ : await resolve();
878
+ }
879
+ catch {
880
+ // fall back to env check above
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;
643
899
  return {
644
- configured: !!active,
645
- activeProvider: active ? { id: active.id, name: active.name } : null,
900
+ configured,
901
+ activeProvider,
646
902
  providers: listFileUploadProviders().map((p) => ({
647
903
  id: p.id,
648
904
  name: p.name,
649
905
  configured: p.isConfigured(),
650
906
  })),
651
- builderConfigured: !!process.env.BUILDER_PRIVATE_KEY,
907
+ builderConfigured,
652
908
  };
653
909
  }));
654
910
  getH3App(nitroApp).use(`${P}/file-upload`, defineEventHandler(async (event) => {
@@ -663,12 +919,17 @@ export function createCoreRoutesPlugin(options = {}) {
663
919
  return { error: "No file uploaded" };
664
920
  }
665
921
  const session = await getSession(event);
666
- 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({
667
928
  data: filePart.data,
668
929
  filename: filePart.filename,
669
930
  mimeType: filePart.type,
670
- ownerEmail: session?.email,
671
- });
931
+ ownerEmail: userEmail,
932
+ }));
672
933
  if (result) {
673
934
  setResponseStatus(event, 201);
674
935
  return result;
@@ -681,6 +942,10 @@ export function createCoreRoutesPlugin(options = {}) {
681
942
  // ─── Voice transcription (Whisper) ───────────────────────────────
682
943
  // POST /_agent-native/transcribe-voice — multipart audio → text
683
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());
684
949
  // ─── Ad-hoc secrets (user-created keys) ────────────────────────────
685
950
  // Must mount before the generic /secrets handler to avoid shadowing.
686
951
  const adHocSecretHandler = createAdHocSecretHandler();
@@ -720,6 +985,22 @@ export function createCoreRoutesPlugin(options = {}) {
720
985
  // POST /_agent-native/notifications/read-all
721
986
  // DELETE /_agent-native/notifications/:id
722
987
  getH3App(nitroApp).use(`${P}/notifications`, createNotificationsHandler());
988
+ // ─── Tools (mini-app runtime + proxy) ───────────────────────────────
989
+ try {
990
+ const { ensureToolsTables, registerToolsShareable } = await import("../tools/store.js");
991
+ const { createToolsHandler } = await import("../tools/routes.js");
992
+ ensureToolsTables().catch(() => { });
993
+ registerToolsShareable();
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());
1000
+ }
1001
+ catch {
1002
+ // Tools module not available — skip
1003
+ }
723
1004
  // ─── Agent run progress ───────────────────────────────────────────
724
1005
  // GET /_agent-native/runs[?active&limit]
725
1006
  // GET /_agent-native/runs/:id
@@ -733,11 +1014,25 @@ export function createCoreRoutesPlugin(options = {}) {
733
1014
  const pathname = (event.url?.pathname || "")
734
1015
  .replace(/^\/+/, "")
735
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
+ }
736
1027
  if (pathname === "fire-test" && method === "POST") {
737
1028
  try {
738
1029
  const { emit } = await import("../event-bus/index.js");
739
1030
  const body = (await readBody(event).catch(() => ({})));
740
- 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
+ });
741
1036
  return { ok: true };
742
1037
  }
743
1038
  catch (err) {
@@ -750,8 +1045,7 @@ export function createCoreRoutesPlugin(options = {}) {
750
1045
  return { error: "Method not allowed" };
751
1046
  }
752
1047
  try {
753
- const session = await getSession(event).catch(() => null);
754
- const owner = session?.email || "local@localhost";
1048
+ const owner = session.email;
755
1049
  const { resourceListAllOwners, SHARED_OWNER } = await import("../resources/store.js");
756
1050
  const allResources = await resourceListAllOwners("jobs/");
757
1051
  const resources = allResources.filter((r) => r.owner === owner || r.owner === SHARED_OWNER);
@@ -813,6 +1107,47 @@ export function createCoreRoutesPlugin(options = {}) {
813
1107
  }));
814
1108
  // ─── Application State CRUD ──────────────────────────────────────
815
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
+ }));
816
1151
  // ─── Avatar routes ──────────────────────────────────────────────────
817
1152
  // GET /_agent-native/avatar/:email — fetch any user's avatar (public)
818
1153
  // PUT /_agent-native/avatar — update current user's avatar (auth required)