@agent-native/core 0.7.14 → 0.7.16

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 (803) 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 +180 -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/action.d.ts +16 -0
  13. package/dist/action.d.ts.map +1 -1
  14. package/dist/action.js +11 -0
  15. package/dist/action.js.map +1 -1
  16. package/dist/agent/default-model.d.ts +21 -0
  17. package/dist/agent/default-model.d.ts.map +1 -0
  18. package/dist/agent/default-model.js +21 -0
  19. package/dist/agent/default-model.js.map +1 -0
  20. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  21. package/dist/agent/engine/ai-sdk-engine.js +7 -4
  22. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  23. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  24. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  25. package/dist/agent/engine/anthropic-engine.js +10 -4
  26. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  27. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  28. package/dist/agent/engine/builder-engine.js +4 -1
  29. package/dist/agent/engine/builder-engine.js.map +1 -1
  30. package/dist/agent/engine/builtin.js +1 -1
  31. package/dist/agent/engine/builtin.js.map +1 -1
  32. package/dist/agent/engine/registry.d.ts +27 -7
  33. package/dist/agent/engine/registry.d.ts.map +1 -1
  34. package/dist/agent/engine/registry.js +101 -20
  35. package/dist/agent/engine/registry.js.map +1 -1
  36. package/dist/agent/index.d.ts +1 -0
  37. package/dist/agent/index.d.ts.map +1 -1
  38. package/dist/agent/index.js +1 -0
  39. package/dist/agent/index.js.map +1 -1
  40. package/dist/agent/production-agent.d.ts +32 -7
  41. package/dist/agent/production-agent.d.ts.map +1 -1
  42. package/dist/agent/production-agent.js +230 -70
  43. package/dist/agent/production-agent.js.map +1 -1
  44. package/dist/agent/run-manager.d.ts.map +1 -1
  45. package/dist/agent/run-manager.js +0 -3
  46. package/dist/agent/run-manager.js.map +1 -1
  47. package/dist/agent/types.d.ts +0 -4
  48. package/dist/agent/types.d.ts.map +1 -1
  49. package/dist/application-state/handlers.d.ts.map +1 -1
  50. package/dist/application-state/handlers.js +10 -6
  51. package/dist/application-state/handlers.js.map +1 -1
  52. package/dist/application-state/script-helpers.d.ts +1 -1
  53. package/dist/application-state/script-helpers.d.ts.map +1 -1
  54. package/dist/application-state/script-helpers.js +12 -8
  55. package/dist/application-state/script-helpers.js.map +1 -1
  56. package/dist/application-state/store.d.ts.map +1 -1
  57. package/dist/application-state/store.js +19 -10
  58. package/dist/application-state/store.js.map +1 -1
  59. package/dist/chat-threads/store.d.ts.map +1 -1
  60. package/dist/chat-threads/store.js +4 -1
  61. package/dist/chat-threads/store.js.map +1 -1
  62. package/dist/cli/create.d.ts +3 -1
  63. package/dist/cli/create.d.ts.map +1 -1
  64. package/dist/cli/create.js +106 -16
  65. package/dist/cli/create.js.map +1 -1
  66. package/dist/cli/index.js +97 -39
  67. package/dist/cli/index.js.map +1 -1
  68. package/dist/cli/templates-meta.d.ts +4 -0
  69. package/dist/cli/templates-meta.d.ts.map +1 -1
  70. package/dist/cli/templates-meta.js +56 -12
  71. package/dist/cli/templates-meta.js.map +1 -1
  72. package/dist/cli/workspacify.d.ts +2 -0
  73. package/dist/cli/workspacify.d.ts.map +1 -1
  74. package/dist/cli/workspacify.js +5 -4
  75. package/dist/cli/workspacify.js.map +1 -1
  76. package/dist/client/AgentPanel.d.ts +5 -2
  77. package/dist/client/AgentPanel.d.ts.map +1 -1
  78. package/dist/client/AgentPanel.js +64 -25
  79. package/dist/client/AgentPanel.js.map +1 -1
  80. package/dist/client/AgentTaskCard.d.ts.map +1 -1
  81. package/dist/client/AgentTaskCard.js +3 -2
  82. package/dist/client/AgentTaskCard.js.map +1 -1
  83. package/dist/client/AssistantChat.d.ts +0 -6
  84. package/dist/client/AssistantChat.d.ts.map +1 -1
  85. package/dist/client/AssistantChat.js +98 -100
  86. package/dist/client/AssistantChat.js.map +1 -1
  87. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  88. package/dist/client/ConnectBuilderCard.js +2 -1
  89. package/dist/client/ConnectBuilderCard.js.map +1 -1
  90. package/dist/client/DefaultSpinner.d.ts +1 -1
  91. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  92. package/dist/client/DefaultSpinner.js +2 -9
  93. package/dist/client/DefaultSpinner.js.map +1 -1
  94. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  95. package/dist/client/MultiTabAssistantChat.js +24 -22
  96. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  97. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  98. package/dist/client/agent-chat-adapter.js +4 -3
  99. package/dist/client/agent-chat-adapter.js.map +1 -1
  100. package/dist/client/agent-chat.d.ts.map +1 -1
  101. package/dist/client/agent-chat.js +6 -4
  102. package/dist/client/agent-chat.js.map +1 -1
  103. package/dist/client/analytics.d.ts.map +1 -1
  104. package/dist/client/analytics.js +70 -1
  105. package/dist/client/analytics.js.map +1 -1
  106. package/dist/client/api-path.d.ts +5 -0
  107. package/dist/client/api-path.d.ts.map +1 -0
  108. package/dist/client/api-path.js +48 -0
  109. package/dist/client/api-path.js.map +1 -0
  110. package/dist/client/components/ApiKeySettings.d.ts.map +1 -1
  111. package/dist/client/components/ApiKeySettings.js +3 -2
  112. package/dist/client/components/ApiKeySettings.js.map +1 -1
  113. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  114. package/dist/client/components/CodeRequiredDialog.js +3 -2
  115. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  116. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  117. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  118. package/dist/client/composer/TiptapComposer.js +17 -9
  119. package/dist/client/composer/TiptapComposer.js.map +1 -1
  120. package/dist/client/composer/draft-key.d.ts +2 -0
  121. package/dist/client/composer/draft-key.d.ts.map +1 -0
  122. package/dist/client/composer/draft-key.js +8 -0
  123. package/dist/client/composer/draft-key.js.map +1 -0
  124. package/dist/client/composer/use-file-search.d.ts.map +1 -1
  125. package/dist/client/composer/use-file-search.js +2 -1
  126. package/dist/client/composer/use-file-search.js.map +1 -1
  127. package/dist/client/composer/use-mention-search.d.ts.map +1 -1
  128. package/dist/client/composer/use-mention-search.js +2 -1
  129. package/dist/client/composer/use-mention-search.js.map +1 -1
  130. package/dist/client/composer/use-skills.d.ts.map +1 -1
  131. package/dist/client/composer/use-skills.js +2 -1
  132. package/dist/client/composer/use-skills.js.map +1 -1
  133. package/dist/client/composer/useVoiceDictation.d.ts +1 -1
  134. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  135. package/dist/client/composer/useVoiceDictation.js +16 -8
  136. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  137. package/dist/client/dev-mode.d.ts +14 -0
  138. package/dist/client/dev-mode.d.ts.map +1 -0
  139. package/dist/client/dev-mode.js +14 -0
  140. package/dist/client/dev-mode.js.map +1 -0
  141. package/dist/client/dev-overlay/DevOverlay.d.ts +26 -0
  142. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -0
  143. package/dist/client/dev-overlay/DevOverlay.js +315 -0
  144. package/dist/client/dev-overlay/DevOverlay.js.map +1 -0
  145. package/dist/client/dev-overlay/builtins.d.ts +6 -0
  146. package/dist/client/dev-overlay/builtins.d.ts.map +1 -0
  147. package/dist/client/dev-overlay/builtins.js +35 -0
  148. package/dist/client/dev-overlay/builtins.js.map +1 -0
  149. package/dist/client/dev-overlay/index.d.ts +6 -0
  150. package/dist/client/dev-overlay/index.d.ts.map +1 -0
  151. package/dist/client/dev-overlay/index.js +5 -0
  152. package/dist/client/dev-overlay/index.js.map +1 -0
  153. package/dist/client/dev-overlay/registry.d.ts +13 -0
  154. package/dist/client/dev-overlay/registry.d.ts.map +1 -0
  155. package/dist/client/dev-overlay/registry.js +63 -0
  156. package/dist/client/dev-overlay/registry.js.map +1 -0
  157. package/dist/client/dev-overlay/types.d.ts +56 -0
  158. package/dist/client/dev-overlay/types.d.ts.map +1 -0
  159. package/dist/client/dev-overlay/types.js +9 -0
  160. package/dist/client/dev-overlay/types.js.map +1 -0
  161. package/dist/client/dev-overlay/use-dev-option.d.ts +12 -0
  162. package/dist/client/dev-overlay/use-dev-option.d.ts.map +1 -0
  163. package/dist/client/dev-overlay/use-dev-option.js +73 -0
  164. package/dist/client/dev-overlay/use-dev-option.js.map +1 -0
  165. package/dist/client/dev-overlay/use-dev-overlay-shortcut.d.ts +6 -0
  166. package/dist/client/dev-overlay/use-dev-overlay-shortcut.d.ts.map +1 -0
  167. package/dist/client/dev-overlay/use-dev-overlay-shortcut.js +29 -0
  168. package/dist/client/dev-overlay/use-dev-overlay-shortcut.js.map +1 -0
  169. package/dist/client/frame-protocol.d.ts +61 -10
  170. package/dist/client/frame-protocol.d.ts.map +1 -1
  171. package/dist/client/frame.d.ts +1 -0
  172. package/dist/client/frame.d.ts.map +1 -1
  173. package/dist/client/frame.js +37 -16
  174. package/dist/client/frame.js.map +1 -1
  175. package/dist/client/index.d.ts +5 -1
  176. package/dist/client/index.d.ts.map +1 -1
  177. package/dist/client/index.js +5 -1
  178. package/dist/client/index.js.map +1 -1
  179. package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
  180. package/dist/client/integrations/IntegrationCard.js +3 -2
  181. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  182. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  183. package/dist/client/integrations/IntegrationsPanel.js +3 -2
  184. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  185. package/dist/client/integrations/useIntegrationStatus.d.ts.map +1 -1
  186. package/dist/client/integrations/useIntegrationStatus.js +2 -1
  187. package/dist/client/integrations/useIntegrationStatus.js.map +1 -1
  188. package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
  189. package/dist/client/notifications/NotificationsBell.js +26 -8
  190. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  191. package/dist/client/observability/ThumbsFeedback.d.ts.map +1 -1
  192. package/dist/client/observability/ThumbsFeedback.js +2 -1
  193. package/dist/client/observability/ThumbsFeedback.js.map +1 -1
  194. package/dist/client/observability/useObservability.d.ts.map +1 -1
  195. package/dist/client/observability/useObservability.js +2 -1
  196. package/dist/client/observability/useObservability.js.map +1 -1
  197. package/dist/client/onboarding/OnboardingPanel.d.ts +0 -7
  198. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  199. package/dist/client/onboarding/OnboardingPanel.js +20 -10
  200. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  201. package/dist/client/onboarding/index.d.ts +1 -0
  202. package/dist/client/onboarding/index.d.ts.map +1 -1
  203. package/dist/client/onboarding/index.js +1 -0
  204. package/dist/client/onboarding/index.js.map +1 -1
  205. package/dist/client/onboarding/use-onboarding.d.ts +1 -7
  206. package/dist/client/onboarding/use-onboarding.d.ts.map +1 -1
  207. package/dist/client/onboarding/use-onboarding.js +27 -13
  208. package/dist/client/onboarding/use-onboarding.js.map +1 -1
  209. package/dist/client/onboarding/use-preview-mode.d.ts +10 -0
  210. package/dist/client/onboarding/use-preview-mode.d.ts.map +1 -0
  211. package/dist/client/onboarding/use-preview-mode.js +35 -0
  212. package/dist/client/onboarding/use-preview-mode.js.map +1 -0
  213. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  214. package/dist/client/org/OrgSwitcher.js +2 -1
  215. package/dist/client/org/OrgSwitcher.js.map +1 -1
  216. package/dist/client/org/TeamPage.d.ts.map +1 -1
  217. package/dist/client/org/TeamPage.js +7 -5
  218. package/dist/client/org/TeamPage.js.map +1 -1
  219. package/dist/client/org/hooks.d.ts.map +1 -1
  220. package/dist/client/org/hooks.js +2 -1
  221. package/dist/client/org/hooks.js.map +1 -1
  222. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  223. package/dist/client/progress/RunsTray.js +2 -1
  224. package/dist/client/progress/RunsTray.js.map +1 -1
  225. package/dist/client/resources/McpServerDetail.d.ts +0 -8
  226. package/dist/client/resources/McpServerDetail.d.ts.map +1 -1
  227. package/dist/client/resources/McpServerDetail.js +6 -1
  228. package/dist/client/resources/McpServerDetail.js.map +1 -1
  229. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  230. package/dist/client/resources/ResourceEditor.js +2 -1
  231. package/dist/client/resources/ResourceEditor.js.map +1 -1
  232. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  233. package/dist/client/resources/ResourcesPanel.js +2 -1
  234. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  235. package/dist/client/resources/use-mcp-servers.d.ts.map +1 -1
  236. package/dist/client/resources/use-mcp-servers.js +7 -2
  237. package/dist/client/resources/use-mcp-servers.js.map +1 -1
  238. package/dist/client/resources/use-resources.d.ts.map +1 -1
  239. package/dist/client/resources/use-resources.js +9 -7
  240. package/dist/client/resources/use-resources.js.map +1 -1
  241. package/dist/client/settings/AgentsSection.d.ts.map +1 -1
  242. package/dist/client/settings/AgentsSection.js +7 -5
  243. package/dist/client/settings/AgentsSection.js.map +1 -1
  244. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  245. package/dist/client/settings/AutomationsSection.js +9 -5
  246. package/dist/client/settings/AutomationsSection.js.map +1 -1
  247. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  248. package/dist/client/settings/BackgroundAgentSection.js +2 -1
  249. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  250. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  251. package/dist/client/settings/SecretsSection.js +12 -4
  252. package/dist/client/settings/SecretsSection.js.map +1 -1
  253. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  254. package/dist/client/settings/SettingsPanel.js +15 -23
  255. package/dist/client/settings/SettingsPanel.js.map +1 -1
  256. package/dist/client/settings/UsageSection.d.ts.map +1 -1
  257. package/dist/client/settings/UsageSection.js +2 -1
  258. package/dist/client/settings/UsageSection.js.map +1 -1
  259. package/dist/client/settings/VoiceTranscriptionSection.d.ts +2 -4
  260. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  261. package/dist/client/settings/VoiceTranscriptionSection.js +66 -23
  262. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  263. package/dist/client/settings/useBuilderStatus.d.ts +9 -0
  264. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  265. package/dist/client/settings/useBuilderStatus.js +31 -3
  266. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  267. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  268. package/dist/client/sharing/ShareButton.js +7 -2
  269. package/dist/client/sharing/ShareButton.js.map +1 -1
  270. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  271. package/dist/client/sharing/ShareDialog.js +4 -3
  272. package/dist/client/sharing/ShareDialog.js.map +1 -1
  273. package/dist/client/sse-event-processor.d.ts +1 -3
  274. package/dist/client/sse-event-processor.d.ts.map +1 -1
  275. package/dist/client/sse-event-processor.js +3 -24
  276. package/dist/client/sse-event-processor.js.map +1 -1
  277. package/dist/client/terminal/AgentTerminal.d.ts +1 -0
  278. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  279. package/dist/client/terminal/AgentTerminal.js +14 -10
  280. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  281. package/dist/client/tools/EmbeddedTool.d.ts +20 -0
  282. package/dist/client/tools/EmbeddedTool.d.ts.map +1 -0
  283. package/dist/client/tools/EmbeddedTool.js +154 -0
  284. package/dist/client/tools/EmbeddedTool.js.map +1 -0
  285. package/dist/client/tools/ExtensionSlot.d.ts +27 -0
  286. package/dist/client/tools/ExtensionSlot.d.ts.map +1 -0
  287. package/dist/client/tools/ExtensionSlot.js +96 -0
  288. package/dist/client/tools/ExtensionSlot.js.map +1 -0
  289. package/dist/client/tools/ToolEditor.d.ts.map +1 -1
  290. package/dist/client/tools/ToolEditor.js +5 -4
  291. package/dist/client/tools/ToolEditor.js.map +1 -1
  292. package/dist/client/tools/ToolViewer.d.ts.map +1 -1
  293. package/dist/client/tools/ToolViewer.js +75 -44
  294. package/dist/client/tools/ToolViewer.js.map +1 -1
  295. package/dist/client/tools/ToolViewerPage.d.ts.map +1 -1
  296. package/dist/client/tools/ToolViewerPage.js +2 -1
  297. package/dist/client/tools/ToolViewerPage.js.map +1 -1
  298. package/dist/client/tools/ToolsListPage.d.ts.map +1 -1
  299. package/dist/client/tools/ToolsListPage.js +3 -2
  300. package/dist/client/tools/ToolsListPage.js.map +1 -1
  301. package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -1
  302. package/dist/client/tools/ToolsSidebarSection.js +4 -3
  303. package/dist/client/tools/ToolsSidebarSection.js.map +1 -1
  304. package/dist/client/tools/iframe-bridge.d.ts +38 -0
  305. package/dist/client/tools/iframe-bridge.d.ts.map +1 -0
  306. package/dist/client/tools/iframe-bridge.js +207 -0
  307. package/dist/client/tools/iframe-bridge.js.map +1 -0
  308. package/dist/client/tools/index.d.ts +2 -0
  309. package/dist/client/tools/index.d.ts.map +1 -1
  310. package/dist/client/tools/index.js +2 -0
  311. package/dist/client/tools/index.js.map +1 -1
  312. package/dist/client/use-action.d.ts.map +1 -1
  313. package/dist/client/use-action.js +2 -1
  314. package/dist/client/use-action.js.map +1 -1
  315. package/dist/client/use-agent-chat.js +2 -2
  316. package/dist/client/use-agent-chat.js.map +1 -1
  317. package/dist/client/use-avatar.d.ts.map +1 -1
  318. package/dist/client/use-avatar.js +3 -2
  319. package/dist/client/use-avatar.js.map +1 -1
  320. package/dist/client/use-builder-enabled.d.ts.map +1 -1
  321. package/dist/client/use-builder-enabled.js +2 -1
  322. package/dist/client/use-builder-enabled.js.map +1 -1
  323. package/dist/client/use-chat-threads.d.ts.map +1 -1
  324. package/dist/client/use-chat-threads.js +2 -1
  325. package/dist/client/use-chat-threads.js.map +1 -1
  326. package/dist/client/use-db-sync.d.ts.map +1 -1
  327. package/dist/client/use-db-sync.js +3 -2
  328. package/dist/client/use-db-sync.js.map +1 -1
  329. package/dist/client/use-dev-mode.d.ts.map +1 -1
  330. package/dist/client/use-dev-mode.js +2 -1
  331. package/dist/client/use-dev-mode.js.map +1 -1
  332. package/dist/client/use-send-to-agent-chat.d.ts.map +1 -1
  333. package/dist/client/use-send-to-agent-chat.js +5 -3
  334. package/dist/client/use-send-to-agent-chat.js.map +1 -1
  335. package/dist/client/use-session.d.ts.map +1 -1
  336. package/dist/client/use-session.js +2 -1
  337. package/dist/client/use-session.js.map +1 -1
  338. package/dist/client/useProductionAgent.d.ts.map +1 -1
  339. package/dist/client/useProductionAgent.js +4 -3
  340. package/dist/client/useProductionAgent.js.map +1 -1
  341. package/dist/collab/client.d.ts.map +1 -1
  342. package/dist/collab/client.js +3 -2
  343. package/dist/collab/client.js.map +1 -1
  344. package/dist/credentials/index.d.ts +27 -10
  345. package/dist/credentials/index.d.ts.map +1 -1
  346. package/dist/credentials/index.js +61 -19
  347. package/dist/credentials/index.js.map +1 -1
  348. package/dist/db/client.d.ts.map +1 -1
  349. package/dist/db/client.js +10 -1
  350. package/dist/db/client.js.map +1 -1
  351. package/dist/db/migrations.d.ts +13 -5
  352. package/dist/db/migrations.d.ts.map +1 -1
  353. package/dist/db/migrations.js +9 -2
  354. package/dist/db/migrations.js.map +1 -1
  355. package/dist/deploy/build.d.ts +12 -1
  356. package/dist/deploy/build.d.ts.map +1 -1
  357. package/dist/deploy/build.js +195 -23
  358. package/dist/deploy/build.js.map +1 -1
  359. package/dist/file-upload/registry.d.ts.map +1 -1
  360. package/dist/file-upload/registry.js +25 -1
  361. package/dist/file-upload/registry.js.map +1 -1
  362. package/dist/index.d.ts +2 -2
  363. package/dist/index.d.ts.map +1 -1
  364. package/dist/index.js +2 -2
  365. package/dist/index.js.map +1 -1
  366. package/dist/integrations/adapters/email.d.ts.map +1 -1
  367. package/dist/integrations/adapters/email.js +152 -32
  368. package/dist/integrations/adapters/email.js.map +1 -1
  369. package/dist/integrations/adapters/slack.d.ts +13 -0
  370. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  371. package/dist/integrations/adapters/slack.js +302 -32
  372. package/dist/integrations/adapters/slack.js.map +1 -1
  373. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  374. package/dist/integrations/adapters/telegram.js +37 -2
  375. package/dist/integrations/adapters/telegram.js.map +1 -1
  376. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  377. package/dist/integrations/adapters/whatsapp.js +91 -12
  378. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  379. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  380. package/dist/integrations/google-docs-poller.js +5 -2
  381. package/dist/integrations/google-docs-poller.js.map +1 -1
  382. package/dist/integrations/internal-token.d.ts.map +1 -1
  383. package/dist/integrations/internal-token.js +17 -1
  384. package/dist/integrations/internal-token.js.map +1 -1
  385. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
  386. package/dist/integrations/pending-tasks-retry-job.js +23 -9
  387. package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
  388. package/dist/integrations/pending-tasks-store.d.ts +16 -0
  389. package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
  390. package/dist/integrations/pending-tasks-store.js +58 -5
  391. package/dist/integrations/pending-tasks-store.js.map +1 -1
  392. package/dist/integrations/plugin.d.ts.map +1 -1
  393. package/dist/integrations/plugin.js +198 -15
  394. package/dist/integrations/plugin.js.map +1 -1
  395. package/dist/integrations/types.d.ts +33 -2
  396. package/dist/integrations/types.d.ts.map +1 -1
  397. package/dist/integrations/webhook-handler.d.ts +6 -0
  398. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  399. package/dist/integrations/webhook-handler.js +141 -61
  400. package/dist/integrations/webhook-handler.js.map +1 -1
  401. package/dist/jobs/cron.d.ts.map +1 -1
  402. package/dist/jobs/cron.js +12 -4
  403. package/dist/jobs/cron.js.map +1 -1
  404. package/dist/jobs/scheduler.d.ts.map +1 -1
  405. package/dist/jobs/scheduler.js +141 -16
  406. package/dist/jobs/scheduler.js.map +1 -1
  407. package/dist/jobs/tools.d.ts.map +1 -1
  408. package/dist/jobs/tools.js +94 -3
  409. package/dist/jobs/tools.js.map +1 -1
  410. package/dist/mcp/server.d.ts.map +1 -1
  411. package/dist/mcp/server.js +128 -62
  412. package/dist/mcp/server.js.map +1 -1
  413. package/dist/mcp-client/hub-routes.d.ts +14 -0
  414. package/dist/mcp-client/hub-routes.d.ts.map +1 -1
  415. package/dist/mcp-client/hub-routes.js +42 -2
  416. package/dist/mcp-client/hub-routes.js.map +1 -1
  417. package/dist/mcp-client/index.d.ts +1 -1
  418. package/dist/mcp-client/index.d.ts.map +1 -1
  419. package/dist/mcp-client/index.js +1 -1
  420. package/dist/mcp-client/index.js.map +1 -1
  421. package/dist/mcp-client/manager.d.ts.map +1 -1
  422. package/dist/mcp-client/manager.js +28 -3
  423. package/dist/mcp-client/manager.js.map +1 -1
  424. package/dist/mcp-client/remote-store.d.ts +49 -1
  425. package/dist/mcp-client/remote-store.d.ts.map +1 -1
  426. package/dist/mcp-client/remote-store.js +253 -6
  427. package/dist/mcp-client/remote-store.js.map +1 -1
  428. package/dist/mcp-client/routes.d.ts.map +1 -1
  429. package/dist/mcp-client/routes.js +11 -9
  430. package/dist/mcp-client/routes.js.map +1 -1
  431. package/dist/mcp-client/visibility.d.ts +7 -3
  432. package/dist/mcp-client/visibility.d.ts.map +1 -1
  433. package/dist/mcp-client/visibility.js +16 -7
  434. package/dist/mcp-client/visibility.js.map +1 -1
  435. package/dist/notifications/actions.d.ts.map +1 -1
  436. package/dist/notifications/actions.js +7 -1
  437. package/dist/notifications/actions.js.map +1 -1
  438. package/dist/notifications/routes.d.ts +1 -1
  439. package/dist/notifications/routes.d.ts.map +1 -1
  440. package/dist/notifications/routes.js +20 -3
  441. package/dist/notifications/routes.js.map +1 -1
  442. package/dist/notifications/store.d.ts.map +1 -1
  443. package/dist/notifications/store.js +6 -1
  444. package/dist/notifications/store.js.map +1 -1
  445. package/dist/oauth-tokens/store.d.ts +43 -2
  446. package/dist/oauth-tokens/store.d.ts.map +1 -1
  447. package/dist/oauth-tokens/store.js +83 -14
  448. package/dist/oauth-tokens/store.js.map +1 -1
  449. package/dist/observability/cleanup-job.d.ts +38 -0
  450. package/dist/observability/cleanup-job.d.ts.map +1 -0
  451. package/dist/observability/cleanup-job.js +107 -0
  452. package/dist/observability/cleanup-job.js.map +1 -0
  453. package/dist/observability/experiments.js +5 -5
  454. package/dist/observability/experiments.js.map +1 -1
  455. package/dist/observability/index.d.ts +2 -1
  456. package/dist/observability/index.d.ts.map +1 -1
  457. package/dist/observability/index.js +2 -1
  458. package/dist/observability/index.js.map +1 -1
  459. package/dist/observability/plugin.d.ts.map +1 -1
  460. package/dist/observability/plugin.js +11 -0
  461. package/dist/observability/plugin.js.map +1 -1
  462. package/dist/observability/routes.d.ts.map +1 -1
  463. package/dist/observability/routes.js +37 -8
  464. package/dist/observability/routes.js.map +1 -1
  465. package/dist/observability/store.d.ts +16 -0
  466. package/dist/observability/store.d.ts.map +1 -1
  467. package/dist/observability/store.js +54 -3
  468. package/dist/observability/store.js.map +1 -1
  469. package/dist/observability/traces.d.ts +5 -0
  470. package/dist/observability/traces.d.ts.map +1 -1
  471. package/dist/observability/traces.js +44 -1
  472. package/dist/observability/traces.js.map +1 -1
  473. package/dist/observability/types.d.ts +7 -0
  474. package/dist/observability/types.d.ts.map +1 -1
  475. package/dist/observability/types.js.map +1 -1
  476. package/dist/onboarding/default-steps.d.ts.map +1 -1
  477. package/dist/onboarding/default-steps.js +1 -2
  478. package/dist/onboarding/default-steps.js.map +1 -1
  479. package/dist/onboarding/plugin.d.ts.map +1 -1
  480. package/dist/onboarding/plugin.js +63 -32
  481. package/dist/onboarding/plugin.js.map +1 -1
  482. package/dist/onboarding/types.d.ts +6 -1
  483. package/dist/onboarding/types.d.ts.map +1 -1
  484. package/dist/org/accept-pending.d.ts.map +1 -1
  485. package/dist/org/accept-pending.js +2 -1
  486. package/dist/org/accept-pending.js.map +1 -1
  487. package/dist/progress/actions.d.ts.map +1 -1
  488. package/dist/progress/actions.js +10 -1
  489. package/dist/progress/actions.js.map +1 -1
  490. package/dist/progress/routes.d.ts +1 -1
  491. package/dist/progress/routes.d.ts.map +1 -1
  492. package/dist/progress/routes.js +20 -3
  493. package/dist/progress/routes.js.map +1 -1
  494. package/dist/progress/store.d.ts.map +1 -1
  495. package/dist/progress/store.js +6 -1
  496. package/dist/progress/store.js.map +1 -1
  497. package/dist/resources/handlers.d.ts.map +1 -1
  498. package/dist/resources/handlers.js +35 -7
  499. package/dist/resources/handlers.js.map +1 -1
  500. package/dist/resources/script-helpers.d.ts.map +1 -1
  501. package/dist/resources/script-helpers.js +15 -3
  502. package/dist/resources/script-helpers.js.map +1 -1
  503. package/dist/resources/store.d.ts.map +1 -1
  504. package/dist/resources/store.js +12 -4
  505. package/dist/resources/store.js.map +1 -1
  506. package/dist/scripts/call-agent.d.ts +1 -0
  507. package/dist/scripts/call-agent.d.ts.map +1 -1
  508. package/dist/scripts/call-agent.js +78 -40
  509. package/dist/scripts/call-agent.js.map +1 -1
  510. package/dist/scripts/chat/search-chats.d.ts.map +1 -1
  511. package/dist/scripts/chat/search-chats.js +3 -2
  512. package/dist/scripts/chat/search-chats.js.map +1 -1
  513. package/dist/scripts/db/exec.d.ts +1 -1
  514. package/dist/scripts/db/exec.d.ts.map +1 -1
  515. package/dist/scripts/db/exec.js +171 -5
  516. package/dist/scripts/db/exec.js.map +1 -1
  517. package/dist/scripts/db/migrate-user-api-keys.d.ts.map +1 -1
  518. package/dist/scripts/db/migrate-user-api-keys.js +10 -0
  519. package/dist/scripts/db/migrate-user-api-keys.js.map +1 -1
  520. package/dist/scripts/db/query.d.ts +1 -1
  521. package/dist/scripts/db/query.d.ts.map +1 -1
  522. package/dist/scripts/db/query.js +104 -4
  523. package/dist/scripts/db/query.js.map +1 -1
  524. package/dist/scripts/db/scoping.d.ts.map +1 -1
  525. package/dist/scripts/db/scoping.js +35 -10
  526. package/dist/scripts/db/scoping.js.map +1 -1
  527. package/dist/scripts/dev/shell.d.ts.map +1 -1
  528. package/dist/scripts/dev/shell.js +3 -1
  529. package/dist/scripts/dev/shell.js.map +1 -1
  530. package/dist/scripts/resources/delete-memory.d.ts.map +1 -1
  531. package/dist/scripts/resources/delete-memory.js +2 -1
  532. package/dist/scripts/resources/delete-memory.js.map +1 -1
  533. package/dist/scripts/resources/delete.d.ts.map +1 -1
  534. package/dist/scripts/resources/delete.js +2 -1
  535. package/dist/scripts/resources/delete.js.map +1 -1
  536. package/dist/scripts/resources/list.d.ts.map +1 -1
  537. package/dist/scripts/resources/list.js +2 -1
  538. package/dist/scripts/resources/list.js.map +1 -1
  539. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
  540. package/dist/scripts/resources/migrate-learnings.js +2 -1
  541. package/dist/scripts/resources/migrate-learnings.js.map +1 -1
  542. package/dist/scripts/resources/read.d.ts.map +1 -1
  543. package/dist/scripts/resources/read.js +2 -1
  544. package/dist/scripts/resources/read.js.map +1 -1
  545. package/dist/scripts/resources/save-memory.d.ts.map +1 -1
  546. package/dist/scripts/resources/save-memory.js +2 -1
  547. package/dist/scripts/resources/save-memory.js.map +1 -1
  548. package/dist/scripts/resources/write.d.ts.map +1 -1
  549. package/dist/scripts/resources/write.js +2 -1
  550. package/dist/scripts/resources/write.js.map +1 -1
  551. package/dist/secrets/onboarding.d.ts.map +1 -1
  552. package/dist/secrets/onboarding.js +24 -16
  553. package/dist/secrets/onboarding.js.map +1 -1
  554. package/dist/secrets/routes.d.ts.map +1 -1
  555. package/dist/secrets/routes.js +139 -37
  556. package/dist/secrets/routes.js.map +1 -1
  557. package/dist/secrets/storage.d.ts.map +1 -1
  558. package/dist/secrets/storage.js +23 -12
  559. package/dist/secrets/storage.js.map +1 -1
  560. package/dist/secrets/substitution.d.ts +24 -2
  561. package/dist/secrets/substitution.d.ts.map +1 -1
  562. package/dist/secrets/substitution.js +44 -6
  563. package/dist/secrets/substitution.js.map +1 -1
  564. package/dist/server/action-discovery.d.ts.map +1 -1
  565. package/dist/server/action-discovery.js +19 -51
  566. package/dist/server/action-discovery.js.map +1 -1
  567. package/dist/server/action-routes.d.ts.map +1 -1
  568. package/dist/server/action-routes.js +61 -15
  569. package/dist/server/action-routes.js.map +1 -1
  570. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  571. package/dist/server/agent-chat-plugin.js +449 -338
  572. package/dist/server/agent-chat-plugin.js.map +1 -1
  573. package/dist/server/agent-discovery.d.ts +8 -0
  574. package/dist/server/agent-discovery.d.ts.map +1 -1
  575. package/dist/server/agent-discovery.js +39 -12
  576. package/dist/server/agent-discovery.js.map +1 -1
  577. package/dist/server/agent-teams.d.ts.map +1 -1
  578. package/dist/server/agent-teams.js +4 -1
  579. package/dist/server/agent-teams.js.map +1 -1
  580. package/dist/server/analytics.d.ts +0 -1
  581. package/dist/server/analytics.d.ts.map +1 -1
  582. package/dist/server/analytics.js +0 -1
  583. package/dist/server/analytics.js.map +1 -1
  584. package/dist/server/app-base-path.d.ts +4 -0
  585. package/dist/server/app-base-path.d.ts.map +1 -0
  586. package/dist/server/app-base-path.js +33 -0
  587. package/dist/server/app-base-path.js.map +1 -0
  588. package/dist/server/app-url.d.ts +4 -1
  589. package/dist/server/app-url.d.ts.map +1 -1
  590. package/dist/server/app-url.js +16 -1
  591. package/dist/server/app-url.js.map +1 -1
  592. package/dist/server/auth.d.ts +15 -0
  593. package/dist/server/auth.d.ts.map +1 -1
  594. package/dist/server/auth.js +400 -68
  595. package/dist/server/auth.js.map +1 -1
  596. package/dist/server/better-auth-instance.d.ts +1 -0
  597. package/dist/server/better-auth-instance.d.ts.map +1 -1
  598. package/dist/server/better-auth-instance.js +67 -15
  599. package/dist/server/better-auth-instance.js.map +1 -1
  600. package/dist/server/builder-browser.d.ts +15 -0
  601. package/dist/server/builder-browser.d.ts.map +1 -1
  602. package/dist/server/builder-browser.js +90 -4
  603. package/dist/server/builder-browser.js.map +1 -1
  604. package/dist/server/cli-capture.d.ts +31 -0
  605. package/dist/server/cli-capture.d.ts.map +1 -0
  606. package/dist/server/cli-capture.js +120 -0
  607. package/dist/server/cli-capture.js.map +1 -0
  608. package/dist/server/collab-plugin.d.ts +12 -0
  609. package/dist/server/collab-plugin.d.ts.map +1 -1
  610. package/dist/server/collab-plugin.js +63 -21
  611. package/dist/server/collab-plugin.js.map +1 -1
  612. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  613. package/dist/server/core-routes-plugin.js +467 -130
  614. package/dist/server/core-routes-plugin.js.map +1 -1
  615. package/dist/server/create-server.d.ts +2 -0
  616. package/dist/server/create-server.d.ts.map +1 -1
  617. package/dist/server/create-server.js +82 -11
  618. package/dist/server/create-server.js.map +1 -1
  619. package/dist/server/credential-provider.d.ts +11 -0
  620. package/dist/server/credential-provider.d.ts.map +1 -1
  621. package/dist/server/credential-provider.js +51 -2
  622. package/dist/server/credential-provider.js.map +1 -1
  623. package/dist/server/csrf.d.ts +58 -0
  624. package/dist/server/csrf.d.ts.map +1 -0
  625. package/dist/server/csrf.js +165 -0
  626. package/dist/server/csrf.js.map +1 -0
  627. package/dist/server/framework-request-handler.d.ts +20 -0
  628. package/dist/server/framework-request-handler.d.ts.map +1 -1
  629. package/dist/server/framework-request-handler.js +115 -34
  630. package/dist/server/framework-request-handler.js.map +1 -1
  631. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  632. package/dist/server/google-auth-plugin.js +10 -2
  633. package/dist/server/google-auth-plugin.js.map +1 -1
  634. package/dist/server/google-oauth.d.ts +84 -2
  635. package/dist/server/google-oauth.d.ts.map +1 -1
  636. package/dist/server/google-oauth.js +248 -45
  637. package/dist/server/google-oauth.js.map +1 -1
  638. package/dist/server/index.d.ts +5 -4
  639. package/dist/server/index.d.ts.map +1 -1
  640. package/dist/server/index.js +5 -4
  641. package/dist/server/index.js.map +1 -1
  642. package/dist/server/oauth-helpers.d.ts +8 -3
  643. package/dist/server/oauth-helpers.d.ts.map +1 -1
  644. package/dist/server/oauth-helpers.js +12 -8
  645. package/dist/server/oauth-helpers.js.map +1 -1
  646. package/dist/server/onboarding-html.d.ts.map +1 -1
  647. package/dist/server/onboarding-html.js +37 -9
  648. package/dist/server/onboarding-html.js.map +1 -1
  649. package/dist/server/poll.d.ts +33 -0
  650. package/dist/server/poll.d.ts.map +1 -1
  651. package/dist/server/poll.js +43 -2
  652. package/dist/server/poll.js.map +1 -1
  653. package/dist/server/request-context.d.ts +102 -3
  654. package/dist/server/request-context.d.ts.map +1 -1
  655. package/dist/server/request-context.js +100 -7
  656. package/dist/server/request-context.js.map +1 -1
  657. package/dist/server/security-headers.d.ts +51 -0
  658. package/dist/server/security-headers.d.ts.map +1 -0
  659. package/dist/server/security-headers.js +90 -0
  660. package/dist/server/security-headers.js.map +1 -0
  661. package/dist/server/short-lived-token.d.ts +62 -0
  662. package/dist/server/short-lived-token.d.ts.map +1 -0
  663. package/dist/server/short-lived-token.js +118 -0
  664. package/dist/server/short-lived-token.js.map +1 -0
  665. package/dist/server/ssr-handler.d.ts.map +1 -1
  666. package/dist/server/ssr-handler.js +96 -2
  667. package/dist/server/ssr-handler.js.map +1 -1
  668. package/dist/server/transcribe-voice.d.ts.map +1 -1
  669. package/dist/server/transcribe-voice.js +307 -56
  670. package/dist/server/transcribe-voice.js.map +1 -1
  671. package/dist/server/voice-providers-status.d.ts +12 -0
  672. package/dist/server/voice-providers-status.d.ts.map +1 -0
  673. package/dist/server/voice-providers-status.js +71 -0
  674. package/dist/server/voice-providers-status.js.map +1 -0
  675. package/dist/shared/agent-chat.js +1 -1
  676. package/dist/shared/agent-chat.js.map +1 -1
  677. package/dist/shared/agent-env.js +1 -1
  678. package/dist/shared/agent-env.js.map +1 -1
  679. package/dist/sharing/access.d.ts.map +1 -1
  680. package/dist/sharing/access.js +16 -13
  681. package/dist/sharing/access.js.map +1 -1
  682. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  683. package/dist/sharing/actions/set-resource-visibility.js +3 -0
  684. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  685. package/dist/sharing/actions/share-resource.d.ts +1 -0
  686. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  687. package/dist/sharing/actions/share-resource.js +50 -0
  688. package/dist/sharing/actions/share-resource.js.map +1 -1
  689. package/dist/sharing/actions/unshare-resource.d.ts.map +1 -1
  690. package/dist/sharing/actions/unshare-resource.js +2 -0
  691. package/dist/sharing/actions/unshare-resource.js.map +1 -1
  692. package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
  693. package/dist/templates/default/app/root.tsx +1 -1
  694. package/dist/templates/default/app/routes/_index.tsx +6 -1
  695. package/dist/templates/default/package.json +1 -1
  696. package/dist/templates/default/public/favicon.svg +13 -0
  697. package/dist/templates/default/public/icon-180.svg +12 -3
  698. package/dist/templates/default/public/icon-192.svg +12 -3
  699. package/dist/templates/default/public/icon-512.svg +12 -3
  700. package/dist/templates/workspace-core/package.json +23 -5
  701. package/dist/templates/workspace-core/src/credentials.ts +32 -5
  702. package/dist/templates/workspace-core/tsconfig.json +4 -1
  703. package/dist/terminal/pty-server.d.ts.map +1 -1
  704. package/dist/terminal/pty-server.js +8 -2
  705. package/dist/terminal/pty-server.js.map +1 -1
  706. package/dist/terminal/terminal-plugin.js +3 -3
  707. package/dist/terminal/terminal-plugin.js.map +1 -1
  708. package/dist/tools/actions.d.ts.map +1 -1
  709. package/dist/tools/actions.js +130 -0
  710. package/dist/tools/actions.js.map +1 -1
  711. package/dist/tools/fetch-tool.d.ts +1 -0
  712. package/dist/tools/fetch-tool.d.ts.map +1 -1
  713. package/dist/tools/fetch-tool.js +38 -16
  714. package/dist/tools/fetch-tool.js.map +1 -1
  715. package/dist/tools/html-shell.d.ts +44 -1
  716. package/dist/tools/html-shell.d.ts.map +1 -1
  717. package/dist/tools/html-shell.js +119 -4
  718. package/dist/tools/html-shell.js.map +1 -1
  719. package/dist/tools/proxy-security.d.ts +12 -0
  720. package/dist/tools/proxy-security.d.ts.map +1 -0
  721. package/dist/tools/proxy-security.js +158 -0
  722. package/dist/tools/proxy-security.js.map +1 -0
  723. package/dist/tools/routes.d.ts.map +1 -1
  724. package/dist/tools/routes.js +156 -105
  725. package/dist/tools/routes.js.map +1 -1
  726. package/dist/tools/schema.d.ts +89 -0
  727. package/dist/tools/schema.d.ts.map +1 -1
  728. package/dist/tools/schema.js +34 -0
  729. package/dist/tools/schema.js.map +1 -1
  730. package/dist/tools/slots/routes.d.ts +15 -0
  731. package/dist/tools/slots/routes.d.ts.map +1 -0
  732. package/dist/tools/slots/routes.js +94 -0
  733. package/dist/tools/slots/routes.js.map +1 -0
  734. package/dist/tools/slots/schema.d.ts +303 -0
  735. package/dist/tools/slots/schema.d.ts.map +1 -0
  736. package/dist/tools/slots/schema.js +76 -0
  737. package/dist/tools/slots/schema.js.map +1 -0
  738. package/dist/tools/slots/store.d.ts +66 -0
  739. package/dist/tools/slots/store.d.ts.map +1 -0
  740. package/dist/tools/slots/store.js +227 -0
  741. package/dist/tools/slots/store.js.map +1 -0
  742. package/dist/tools/store.d.ts.map +1 -1
  743. package/dist/tools/store.js +35 -37
  744. package/dist/tools/store.js.map +1 -1
  745. package/dist/tools/url-safety.d.ts +24 -0
  746. package/dist/tools/url-safety.d.ts.map +1 -0
  747. package/dist/tools/url-safety.js +224 -0
  748. package/dist/tools/url-safety.js.map +1 -0
  749. package/dist/tracking/providers.d.ts.map +1 -1
  750. package/dist/tracking/providers.js +28 -11
  751. package/dist/tracking/providers.js.map +1 -1
  752. package/dist/tracking/registry.d.ts.map +1 -1
  753. package/dist/tracking/registry.js +7 -3
  754. package/dist/tracking/registry.js.map +1 -1
  755. package/dist/triggers/actions.d.ts.map +1 -1
  756. package/dist/triggers/actions.js +11 -6
  757. package/dist/triggers/actions.js.map +1 -1
  758. package/dist/triggers/condition-evaluator.d.ts +8 -0
  759. package/dist/triggers/condition-evaluator.d.ts.map +1 -1
  760. package/dist/triggers/condition-evaluator.js +39 -4
  761. package/dist/triggers/condition-evaluator.js.map +1 -1
  762. package/dist/triggers/dispatcher.d.ts.map +1 -1
  763. package/dist/triggers/dispatcher.js +67 -4
  764. package/dist/triggers/dispatcher.js.map +1 -1
  765. package/dist/usage/store.d.ts +0 -11
  766. package/dist/usage/store.d.ts.map +1 -1
  767. package/dist/usage/store.js +0 -11
  768. package/dist/usage/store.js.map +1 -1
  769. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  770. package/dist/vite/action-types-plugin.js +8 -5
  771. package/dist/vite/action-types-plugin.js.map +1 -1
  772. package/dist/vite/client.d.ts +2 -0
  773. package/dist/vite/client.d.ts.map +1 -1
  774. package/dist/vite/client.js +216 -4
  775. package/dist/vite/client.js.map +1 -1
  776. package/docs/content/actions.md +32 -0
  777. package/docs/content/authentication.md +39 -12
  778. package/docs/content/cloneable-saas.md +13 -15
  779. package/docs/content/deployment.md +84 -9
  780. package/docs/content/drop-in-agent.md +2 -2
  781. package/docs/content/faq.md +4 -1
  782. package/docs/content/getting-started.md +2 -0
  783. package/docs/content/messaging.md +195 -155
  784. package/docs/content/onboarding.md +82 -12
  785. package/docs/content/security.md +59 -8
  786. package/docs/content/template-analytics.md +65 -59
  787. package/docs/content/template-clips.md +7 -9
  788. package/docs/content/template-design.md +55 -0
  789. package/docs/content/template-dispatch.md +13 -0
  790. package/docs/content/template-forms.md +7 -6
  791. package/docs/content/template-mail.md +78 -80
  792. package/package.json +4 -3
  793. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
  794. package/src/templates/default/app/root.tsx +1 -1
  795. package/src/templates/default/app/routes/_index.tsx +6 -1
  796. package/src/templates/default/package.json +1 -1
  797. package/src/templates/default/public/favicon.svg +13 -0
  798. package/src/templates/default/public/icon-180.svg +12 -3
  799. package/src/templates/default/public/icon-192.svg +12 -3
  800. package/src/templates/default/public/icon-512.svg +12 -3
  801. package/src/templates/workspace-core/package.json +23 -5
  802. package/src/templates/workspace-core/src/credentials.ts +32 -5
  803. 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,37 +435,45 @@ 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);
276
442
  return { error: "A signed-in user is required to run Builder" };
277
443
  }
278
444
  const userEmail = session.email;
279
- const { resolveBuilderCredential: resolveBuilderCred } = await import("./credential-provider.js");
280
- const builderUserId = (await resolveBuilderCred("BUILDER_USER_ID")) || undefined;
281
- // Server-controlled projectIddon't let clients target arbitrary
282
- // Builder projects with our private key. When this feature graduates
283
- // past the hardcoded preview, the projectId will come from
284
- // workspace/org config, still resolved server-side.
285
- try {
286
- const result = await runBuilderAgent({
287
- prompt,
288
- projectId: DEFAULT_BUILDER_PROJECT_ID,
289
- branchName: typeof body?.branchName === "string"
290
- ? body.branchName
291
- : undefined,
292
- userEmail,
293
- userId: builderUserId,
294
- });
295
- return result;
296
- }
297
- catch (e) {
298
- setResponseStatus(event, 500);
299
- return {
300
- error: e instanceof Error ? e.message : "Builder run failed",
301
- };
302
- }
445
+ // Wrap in runWithRequestContext so resolveBuilderCredential() inside
446
+ // runBuilderAgent() resolves per-user app_secrets rather than falling
447
+ // through to process.env the same pattern the /builder/status endpoint
448
+ // uses. Without this, per-user Builder keys stored in app_secrets are
449
+ // invisible to the run path and the call throws "Builder keys are not
450
+ // configured" even though the status endpoint correctly reports configured=true.
451
+ return runWithRequestContext({ userEmail }, async () => {
452
+ const { resolveBuilderCredential: resolveBuilderCred } = await import("./credential-provider.js");
453
+ const builderUserId = (await resolveBuilderCred("BUILDER_USER_ID")) || undefined;
454
+ // Server-controlled projectId — don't let clients target arbitrary
455
+ // Builder projects with our private key. When this feature graduates
456
+ // past the hardcoded preview, the projectId will come from
457
+ // workspace/org config, still resolved server-side.
458
+ try {
459
+ const result = await runBuilderAgent({
460
+ prompt,
461
+ projectId: DEFAULT_BUILDER_PROJECT_ID,
462
+ branchName: typeof body?.branchName === "string"
463
+ ? body.branchName
464
+ : undefined,
465
+ userEmail,
466
+ userId: builderUserId,
467
+ });
468
+ return result;
469
+ }
470
+ catch (e) {
471
+ setResponseStatus(event, 500);
472
+ return {
473
+ error: e instanceof Error ? e.message : "Builder run failed",
474
+ };
475
+ }
476
+ });
303
477
  }));
304
478
  getH3App(nitroApp).use(`${P}/builder/callback`, defineEventHandler(async (event) => {
305
479
  if (getMethod(event) !== "GET") {
@@ -334,6 +508,15 @@ export function createCoreRoutesPlugin(options = {}) {
334
508
  // Store per-user in app_secrets so each user's Builder connection
335
509
  // is independent. No more shared env vars that the last connector
336
510
  // overwrites.
511
+ //
512
+ // Failure handling: a silent catch here (returning the success page
513
+ // anyway) was Midhun's bug on 2026-04-28 — popup said "yay", parent
514
+ // window polled `/builder/status` for 5 minutes seeing
515
+ // configured:false, never got a real error. Now we surface the
516
+ // failure two ways: (a) a settings row that the next /builder/status
517
+ // poll picks up, and (b) postMessage from the error page itself,
518
+ // wired into the popup HTML, so the parent stops polling immediately.
519
+ let writeError = null;
337
520
  try {
338
521
  const { writeBuilderCredentials } = await import("./credential-provider.js");
339
522
  await writeBuilderCredentials(session.email, {
@@ -345,15 +528,40 @@ export function createCoreRoutesPlugin(options = {}) {
345
528
  });
346
529
  }
347
530
  catch (err) {
348
- console.warn("[builder] Failed to write per-user credentials:", err?.message ?? err);
531
+ writeError = err?.message ?? String(err);
532
+ console.error("[builder] Failed to persist per-user credentials:", writeError);
533
+ }
534
+ if (writeError) {
535
+ // Best-effort signal to /builder/status. If putSetting also fails
536
+ // (entire DB unreachable) the popup's postMessage still notifies
537
+ // the parent. If both fail the parent times out at 5min as today.
538
+ try {
539
+ await putSetting(`builder-connect-error:${session.email}`, {
540
+ message: writeError,
541
+ at: Date.now(),
542
+ });
543
+ }
544
+ catch (settingsErr) {
545
+ console.error("[builder] Couldn't even record connect-error to settings:", settingsErr?.message ?? settingsErr);
546
+ }
547
+ setResponseStatus(event, 500);
548
+ setResponseHeader(event, "Content-Type", "text/html; charset=utf-8");
549
+ return createBuilderBrowserCallbackErrorPage(writeError);
349
550
  }
350
- // Clear any legacy disconnect flag.
551
+ // Clear any legacy disconnect flag and any prior connect-error row
552
+ // (so a successful retry doesn't surface the previous failure).
351
553
  try {
352
554
  await deleteSetting("builder-disconnected");
353
555
  }
354
556
  catch {
355
557
  // DB not ready — proceed
356
558
  }
559
+ try {
560
+ await deleteSetting(`builder-connect-error:${session.email}`);
561
+ }
562
+ catch {
563
+ // No prior error row — fine
564
+ }
357
565
  const previewUrl = resolveSafePreviewUrl(requestUrl.searchParams.get("preview-url"), event);
358
566
  setResponseHeader(event, "Content-Type", "text/html; charset=utf-8");
359
567
  return createBuilderBrowserCallbackPage(previewUrl);
@@ -395,47 +603,56 @@ export function createCoreRoutesPlugin(options = {}) {
395
603
  setResponseStatus(event, 405);
396
604
  return { error: "Method not allowed" };
397
605
  }
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" };
606
+ const session = await getSession(event).catch(() => null);
607
+ if (!session?.email) {
608
+ setResponseStatus(event, 401);
609
+ return { error: "unauthorized" };
410
610
  }
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,
611
+ return runWithRequestContext({ userEmail: session.email, orgId: session.orgId ?? undefined }, async () => {
612
+ const { resolveBuilderCredentials: resolveCreds } = await import("./credential-provider.js");
613
+ const creds = await resolveCreds();
614
+ if (!creds.privateKey || !creds.publicKey) {
615
+ setResponseStatus(event, 400);
616
+ return {
617
+ error: "Builder not connected. Connect Builder in Setup to use background agent.",
618
+ };
619
+ }
620
+ const body = (await readBody(event));
621
+ if (!body?.userMessage) {
622
+ setResponseStatus(event, 400);
623
+ return { error: "userMessage is required" };
624
+ }
625
+ const apiHost = process.env.BUILDER_API_HOST || "https://ai-services.builder.io";
626
+ try {
627
+ const res = await fetch(`${apiHost}/agents/run?apiKey=${encodeURIComponent(creds.publicKey)}`, {
628
+ method: "POST",
629
+ headers: {
630
+ "Content-Type": "application/json",
631
+ Authorization: `Bearer ${creds.privateKey}`,
422
632
  },
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 };
633
+ body: JSON.stringify({
634
+ userMessage: {
635
+ userPrompt: body.userMessage,
636
+ },
637
+ branchName: body.branchName,
638
+ }),
639
+ });
640
+ if (!res.ok) {
641
+ const err = await res.text().catch(() => "Unknown error");
642
+ setResponseStatus(event, res.status);
643
+ return {
644
+ error: redactValues(err, [creds.privateKey, creds.publicKey]),
645
+ };
646
+ }
647
+ return await res.json();
430
648
  }
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
- }
649
+ catch (err) {
650
+ setResponseStatus(event, 500);
651
+ return {
652
+ error: redactValues(err?.message || "Failed to reach Builder agents-run API", [creds.privateKey, creds.publicKey]),
653
+ };
654
+ }
655
+ });
439
656
  }));
440
657
  // Env key management — framework keys are always included
441
658
  const frameworkEnvKeys = [
@@ -476,12 +693,25 @@ export function createCoreRoutesPlugin(options = {}) {
476
693
  label: cfg.label,
477
694
  required: cfg.required ?? false,
478
695
  configured: !!process.env[cfg.key],
696
+ ...(cfg.helpText ? { helpText: cfg.helpText } : {}),
479
697
  }))));
480
698
  getH3App(nitroApp).use(`${P}/env-vars`, defineEventHandler(async (event) => {
481
699
  if (getMethod(event) !== "POST") {
482
700
  setResponseStatus(event, 405);
483
701
  return { error: "Method not allowed" };
484
702
  }
703
+ // Env vars are deployment-wide globals, not per-tenant. On any
704
+ // shared-DB multi-tenant deploy, allowing authenticated users to
705
+ // write here lets one tenant overwrite Stripe / OpenAI / Sentry
706
+ // keys for every other tenant. Disable the endpoint outside of
707
+ // local-dev SQLite or an explicit single-tenant opt-in, and
708
+ // direct callers to the per-org credential store instead.
709
+ if (!isEnvVarWriteAllowed()) {
710
+ setResponseStatus(event, 403);
711
+ return {
712
+ error: "env-vars endpoint disabled on multi-tenant deployments. Use saveCredential(key, value, { userEmail, orgId, scope: 'org' }) to store per-org credentials.",
713
+ };
714
+ }
485
715
  const body = await readBody(event);
486
716
  const { vars } = body;
487
717
  if (!Array.isArray(vars) || vars.length === 0) {
@@ -566,6 +796,19 @@ export function createCoreRoutesPlugin(options = {}) {
566
796
  };
567
797
  }
568
798
  }
799
+ // Per-user app_secrets — a user who connected Builder (or pasted
800
+ // their own provider key) may not have any deploy-level env vars
801
+ // set, so check their per-user secret store before reporting "no
802
+ // engine configured" and re-showing the onboarding gate.
803
+ const detectedFromUser = await detectEngineFromUserSecrets();
804
+ if (detectedFromUser) {
805
+ return {
806
+ configured: true,
807
+ engine: detectedFromUser.name,
808
+ source: "app_secrets",
809
+ envVar: detectedFromUser.requiredEnvVars[0],
810
+ };
811
+ }
569
812
  const detected = detectEngineFromEnv();
570
813
  if (detected) {
571
814
  return {
@@ -625,19 +868,45 @@ export function createCoreRoutesPlugin(options = {}) {
625
868
  // ─── File upload primitive ──────────────────────────────────────
626
869
  // GET /_agent-native/file-upload/status — report active provider
627
870
  // POST /_agent-native/file-upload — upload a file, return { url }
628
- getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(async () => {
871
+ getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(async (event) => {
629
872
  const active = getActiveFileUploadProvider();
873
+ // resolveBuilderPrivateKey() reads per-user credentials from app_secrets
874
+ // (DB), which requires request context (AsyncLocalStorage) to know which
875
+ // user to scope by. Without runWithRequestContext() the ALS store is empty
876
+ // and it falls back to process.env only — missing OAuth-connected users.
877
+ const session = await getSession(event).catch(() => null);
878
+ const userEmail = session?.email;
630
879
  let builderConfigured = !!process.env.BUILDER_PRIVATE_KEY;
631
880
  try {
632
881
  const { resolveBuilderPrivateKey } = await import("./credential-provider.js");
633
- builderConfigured = !!(await resolveBuilderPrivateKey());
882
+ const resolve = () => resolveBuilderPrivateKey().then((k) => !!k);
883
+ builderConfigured = userEmail
884
+ ? await runWithRequestContext({ userEmail }, resolve)
885
+ : await resolve();
634
886
  }
635
887
  catch {
636
888
  // fall back to env check above
637
889
  }
890
+ // When the builder builtin is selected via env var, its sync
891
+ // isConfigured() doesn't reflect per-user OAuth credentials. Use the
892
+ // async builderConfigured check so the status accurately represents
893
+ // whether this specific user can actually upload (thread 7 fix).
894
+ const isBuilderEnvActive = active?.id === "builder";
895
+ const configured = isBuilderEnvActive
896
+ ? builderConfigured
897
+ : !!active || builderConfigured;
898
+ const activeProvider = isBuilderEnvActive
899
+ ? builderConfigured
900
+ ? { id: "builder", name: "Builder.io" }
901
+ : null
902
+ : active
903
+ ? { id: active.id, name: active.name }
904
+ : builderConfigured
905
+ ? { id: "builder", name: "Builder.io" }
906
+ : null;
638
907
  return {
639
- configured: !!active,
640
- activeProvider: active ? { id: active.id, name: active.name } : null,
908
+ configured,
909
+ activeProvider,
641
910
  providers: listFileUploadProviders().map((p) => ({
642
911
  id: p.id,
643
912
  name: p.name,
@@ -658,12 +927,17 @@ export function createCoreRoutesPlugin(options = {}) {
658
927
  return { error: "No file uploaded" };
659
928
  }
660
929
  const session = await getSession(event);
661
- const result = await uploadFile({
930
+ if (!session?.email) {
931
+ setResponseStatus(event, 401);
932
+ return { error: "Unauthorized" };
933
+ }
934
+ const userEmail = session.email;
935
+ const result = await runWithRequestContext({ userEmail }, () => uploadFile({
662
936
  data: filePart.data,
663
937
  filename: filePart.filename,
664
938
  mimeType: filePart.type,
665
- ownerEmail: session?.email,
666
- });
939
+ ownerEmail: userEmail,
940
+ }));
667
941
  if (result) {
668
942
  setResponseStatus(event, 201);
669
943
  return result;
@@ -676,6 +950,10 @@ export function createCoreRoutesPlugin(options = {}) {
676
950
  // ─── Voice transcription (Whisper) ───────────────────────────────
677
951
  // POST /_agent-native/transcribe-voice — multipart audio → text
678
952
  getH3App(nitroApp).use(`${P}/transcribe-voice`, createTranscribeVoiceHandler());
953
+ // ─── Voice provider status ───────────────────────────────────────
954
+ // GET /_agent-native/voice-providers/status — which providers are
955
+ // configured for the current user (powers the Settings UI pills).
956
+ getH3App(nitroApp).use(`${P}/voice-providers/status`, createVoiceProvidersStatusHandler());
679
957
  // ─── Ad-hoc secrets (user-created keys) ────────────────────────────
680
958
  // Must mount before the generic /secrets handler to avoid shadowing.
681
959
  const adHocSecretHandler = createAdHocSecretHandler();
@@ -722,6 +1000,11 @@ export function createCoreRoutesPlugin(options = {}) {
722
1000
  ensureToolsTables().catch(() => { });
723
1001
  registerToolsShareable();
724
1002
  getH3App(nitroApp).use(`${P}/tools`, createToolsHandler());
1003
+ // Tool extension-point slots — sub-system of tools.
1004
+ const { ensureSlotTables } = await import("../tools/slots/store.js");
1005
+ const { createSlotsHandler } = await import("../tools/slots/routes.js");
1006
+ ensureSlotTables().catch(() => { });
1007
+ getH3App(nitroApp).use(`${P}/slots`, createSlotsHandler());
725
1008
  }
726
1009
  catch {
727
1010
  // Tools module not available — skip
@@ -739,11 +1022,25 @@ export function createCoreRoutesPlugin(options = {}) {
739
1022
  const pathname = (event.url?.pathname || "")
740
1023
  .replace(/^\/+/, "")
741
1024
  .replace(/\/+$/, "");
1025
+ // Auth check applies to every method. Without this, any anonymous
1026
+ // caller could `POST /fire-test` to emit unowned events that fan
1027
+ // out across every tenant's matching trigger (the dispatcher
1028
+ // short-circuits its owner check when `eventMeta.owner` is
1029
+ // undefined). See audit 12 / fire-test finding.
1030
+ const session = await getSession(event).catch(() => null);
1031
+ if (!session?.email) {
1032
+ setResponseStatus(event, 401);
1033
+ return { error: "Unauthenticated" };
1034
+ }
742
1035
  if (pathname === "fire-test" && method === "POST") {
743
1036
  try {
744
1037
  const { emit } = await import("../event-bus/index.js");
745
1038
  const body = (await readBody(event).catch(() => ({})));
746
- emit("test.event.fired", { data: body.data ?? {} });
1039
+ // Scope the test event to the current user so only their
1040
+ // automations fire, not those owned by other tenants.
1041
+ emit("test.event.fired", { data: body.data ?? {} }, {
1042
+ owner: session.email,
1043
+ });
747
1044
  return { ok: true };
748
1045
  }
749
1046
  catch (err) {
@@ -756,8 +1053,7 @@ export function createCoreRoutesPlugin(options = {}) {
756
1053
  return { error: "Method not allowed" };
757
1054
  }
758
1055
  try {
759
- const session = await getSession(event).catch(() => null);
760
- const owner = session?.email || "local@localhost";
1056
+ const owner = session.email;
761
1057
  const { resourceListAllOwners, SHARED_OWNER } = await import("../resources/store.js");
762
1058
  const allResources = await resourceListAllOwners("jobs/");
763
1059
  const resources = allResources.filter((r) => r.owner === owner || r.owner === SHARED_OWNER);
@@ -819,6 +1115,47 @@ export function createCoreRoutesPlugin(options = {}) {
819
1115
  }));
820
1116
  // ─── Application State CRUD ──────────────────────────────────────
821
1117
  // Auto-mounted so templates don't need boilerplate route files.
1118
+ // ─── User-scoped settings store ────────────────────────────────────
1119
+ // GET /_agent-native/settings/:key — read current user's value
1120
+ // PUT /_agent-native/settings/:key — write current user's value
1121
+ // DELETE /_agent-native/settings/:key — clear current user's value
1122
+ //
1123
+ // Keys are auto-prefixed with `u:<email>:` so each user gets their
1124
+ // own row — no leakage between sessions sharing the same DB.
1125
+ getH3App(nitroApp).use(`${P}/settings`, defineEventHandler(async (event) => {
1126
+ const rawKey = (event.url?.pathname || "").replace(/^\/+/, "").split("/")[0] || "";
1127
+ const key = rawKey.replace(/[^a-zA-Z0-9_-]/g, "");
1128
+ if (!key) {
1129
+ setResponseStatus(event, 404);
1130
+ return { error: "Settings key required" };
1131
+ }
1132
+ const session = await getSession(event);
1133
+ if (!session?.email) {
1134
+ setResponseStatus(event, 401);
1135
+ return { error: "unauthorized" };
1136
+ }
1137
+ const method = getMethod(event);
1138
+ const requestSource = event.node?.req?.headers?.["x-request-source"] || undefined;
1139
+ if (method === "GET") {
1140
+ const value = await getUserSetting(session.email, key);
1141
+ if (!value) {
1142
+ setResponseStatus(event, 404);
1143
+ return { error: `No setting for ${key}` };
1144
+ }
1145
+ return value;
1146
+ }
1147
+ if (method === "PUT") {
1148
+ const body = await readBody(event);
1149
+ await putUserSetting(session.email, key, body, { requestSource });
1150
+ return body;
1151
+ }
1152
+ if (method === "DELETE") {
1153
+ await deleteUserSetting(session.email, key, { requestSource });
1154
+ return { ok: true };
1155
+ }
1156
+ setResponseStatus(event, 405);
1157
+ return { error: "Method not allowed" };
1158
+ }));
822
1159
  // ─── Avatar routes ──────────────────────────────────────────────────
823
1160
  // GET /_agent-native/avatar/:email — fetch any user's avatar (public)
824
1161
  // PUT /_agent-native/avatar — update current user's avatar (auth required)