@agent-native/core 0.7.12 → 0.7.14

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 (586) hide show
  1. package/README.md +1 -1
  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 +287 -62
  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 +95 -17
  12. package/dist/a2a/server.js.map +1 -1
  13. package/dist/a2a/task-store.d.ts +11 -1
  14. package/dist/a2a/task-store.d.ts.map +1 -1
  15. package/dist/a2a/task-store.js +38 -2
  16. package/dist/a2a/task-store.js.map +1 -1
  17. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  18. package/dist/agent/engine/ai-sdk-engine.js +26 -8
  19. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  20. package/dist/agent/engine/builder-engine.d.ts +19 -0
  21. package/dist/agent/engine/builder-engine.d.ts.map +1 -0
  22. package/dist/agent/engine/builder-engine.js +412 -0
  23. package/dist/agent/engine/builder-engine.js.map +1 -0
  24. package/dist/agent/engine/builtin.d.ts.map +1 -1
  25. package/dist/agent/engine/builtin.js +26 -10
  26. package/dist/agent/engine/builtin.js.map +1 -1
  27. package/dist/agent/engine/index.d.ts +1 -1
  28. package/dist/agent/engine/index.d.ts.map +1 -1
  29. package/dist/agent/engine/index.js +1 -1
  30. package/dist/agent/engine/index.js.map +1 -1
  31. package/dist/agent/engine/registry.d.ts +20 -1
  32. package/dist/agent/engine/registry.d.ts.map +1 -1
  33. package/dist/agent/engine/registry.js +49 -1
  34. package/dist/agent/engine/registry.js.map +1 -1
  35. package/dist/agent/engine/types.d.ts +30 -0
  36. package/dist/agent/engine/types.d.ts.map +1 -1
  37. package/dist/agent/engine/types.js +19 -1
  38. package/dist/agent/engine/types.js.map +1 -1
  39. package/dist/agent/production-agent.d.ts.map +1 -1
  40. package/dist/agent/production-agent.js +65 -7
  41. package/dist/agent/production-agent.js.map +1 -1
  42. package/dist/agent/run-manager.d.ts.map +1 -1
  43. package/dist/agent/run-manager.js +11 -1
  44. package/dist/agent/run-manager.js.map +1 -1
  45. package/dist/agent/thread-data-builder.d.ts +4 -0
  46. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  47. package/dist/agent/thread-data-builder.js +1 -0
  48. package/dist/agent/thread-data-builder.js.map +1 -1
  49. package/dist/agent/types.d.ts +8 -0
  50. package/dist/agent/types.d.ts.map +1 -1
  51. package/dist/chat-threads/store.d.ts +3 -0
  52. package/dist/chat-threads/store.d.ts.map +1 -1
  53. package/dist/chat-threads/store.js +32 -0
  54. package/dist/chat-threads/store.js.map +1 -1
  55. package/dist/checkpoints/service.d.ts +1 -0
  56. package/dist/checkpoints/service.d.ts.map +1 -1
  57. package/dist/checkpoints/service.js +26 -2
  58. package/dist/checkpoints/service.js.map +1 -1
  59. package/dist/cli/create.d.ts +30 -0
  60. package/dist/cli/create.d.ts.map +1 -1
  61. package/dist/cli/create.js +25 -13
  62. package/dist/cli/create.js.map +1 -1
  63. package/dist/cli/templates-meta.d.ts.map +1 -1
  64. package/dist/cli/templates-meta.js +11 -0
  65. package/dist/cli/templates-meta.js.map +1 -1
  66. package/dist/client/AgentPanel.d.ts +3 -1
  67. package/dist/client/AgentPanel.d.ts.map +1 -1
  68. package/dist/client/AgentPanel.js +22 -11
  69. package/dist/client/AgentPanel.js.map +1 -1
  70. package/dist/client/AgentTaskCard.d.ts.map +1 -1
  71. package/dist/client/AgentTaskCard.js +2 -0
  72. package/dist/client/AgentTaskCard.js.map +1 -1
  73. package/dist/client/AssistantChat.d.ts +2 -0
  74. package/dist/client/AssistantChat.d.ts.map +1 -1
  75. package/dist/client/AssistantChat.js +159 -84
  76. package/dist/client/AssistantChat.js.map +1 -1
  77. package/dist/client/ConnectBuilderCard.d.ts +1 -7
  78. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  79. package/dist/client/ConnectBuilderCard.js +30 -132
  80. package/dist/client/ConnectBuilderCard.js.map +1 -1
  81. package/dist/client/ErrorBoundary.d.ts +1 -3
  82. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  83. package/dist/client/ErrorBoundary.js +37 -9
  84. package/dist/client/ErrorBoundary.js.map +1 -1
  85. package/dist/client/FeedbackButton.d.ts.map +1 -1
  86. package/dist/client/FeedbackButton.js +4 -3
  87. package/dist/client/FeedbackButton.js.map +1 -1
  88. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  89. package/dist/client/MultiTabAssistantChat.js +169 -52
  90. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  91. package/dist/client/agent-chat.d.ts +11 -0
  92. package/dist/client/agent-chat.d.ts.map +1 -1
  93. package/dist/client/agent-chat.js +1 -1
  94. package/dist/client/agent-chat.js.map +1 -1
  95. package/dist/client/analytics.d.ts +5 -8
  96. package/dist/client/analytics.d.ts.map +1 -1
  97. package/dist/client/analytics.js +53 -11
  98. package/dist/client/analytics.js.map +1 -1
  99. package/dist/client/builder-mark.d.ts +9 -0
  100. package/dist/client/builder-mark.d.ts.map +1 -0
  101. package/dist/client/builder-mark.js +10 -0
  102. package/dist/client/builder-mark.js.map +1 -0
  103. package/dist/client/components/AgentPresenceChip.d.ts +12 -0
  104. package/dist/client/components/AgentPresenceChip.d.ts.map +1 -0
  105. package/dist/client/components/AgentPresenceChip.js +42 -0
  106. package/dist/client/components/AgentPresenceChip.js.map +1 -0
  107. package/dist/client/components/PresenceBar.d.ts +17 -0
  108. package/dist/client/components/PresenceBar.d.ts.map +1 -0
  109. package/dist/client/components/PresenceBar.js +118 -0
  110. package/dist/client/components/PresenceBar.js.map +1 -0
  111. package/dist/client/components/ui/popover.d.ts +8 -0
  112. package/dist/client/components/ui/popover.d.ts.map +1 -0
  113. package/dist/client/components/ui/popover.js +11 -0
  114. package/dist/client/components/ui/popover.js.map +1 -0
  115. package/dist/client/composer/ComposerPlusMenu.d.ts +7 -0
  116. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -0
  117. package/dist/client/composer/ComposerPlusMenu.js +183 -0
  118. package/dist/client/composer/ComposerPlusMenu.js.map +1 -0
  119. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  120. package/dist/client/composer/TiptapComposer.js +244 -19
  121. package/dist/client/composer/TiptapComposer.js.map +1 -1
  122. package/dist/client/composer/types.d.ts +1 -0
  123. package/dist/client/composer/types.d.ts.map +1 -1
  124. package/dist/client/composer/useVoiceDictation.d.ts +2 -0
  125. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  126. package/dist/client/composer/useVoiceDictation.js +89 -12
  127. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  128. package/dist/client/error-format.d.ts +2 -0
  129. package/dist/client/error-format.d.ts.map +1 -0
  130. package/dist/client/error-format.js +31 -0
  131. package/dist/client/error-format.js.map +1 -0
  132. package/dist/client/index.d.ts +6 -1
  133. package/dist/client/index.d.ts.map +1 -1
  134. package/dist/client/index.js +8 -1
  135. package/dist/client/index.js.map +1 -1
  136. package/dist/client/observability/ObservabilityDashboard.d.ts +5 -0
  137. package/dist/client/observability/ObservabilityDashboard.d.ts.map +1 -0
  138. package/dist/client/observability/ObservabilityDashboard.js +169 -0
  139. package/dist/client/observability/ObservabilityDashboard.js.map +1 -0
  140. package/dist/client/observability/ThumbsFeedback.d.ts +8 -0
  141. package/dist/client/observability/ThumbsFeedback.d.ts.map +1 -0
  142. package/dist/client/observability/ThumbsFeedback.js +64 -0
  143. package/dist/client/observability/ThumbsFeedback.js.map +1 -0
  144. package/dist/client/observability/index.d.ts +4 -0
  145. package/dist/client/observability/index.d.ts.map +1 -0
  146. package/dist/client/observability/index.js +4 -0
  147. package/dist/client/observability/index.js.map +1 -0
  148. package/dist/client/observability/useObservability.d.ts +128 -0
  149. package/dist/client/observability/useObservability.d.ts.map +1 -0
  150. package/dist/client/observability/useObservability.js +109 -0
  151. package/dist/client/observability/useObservability.js.map +1 -0
  152. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  153. package/dist/client/onboarding/OnboardingPanel.js +34 -92
  154. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  155. package/dist/client/org/RequireActiveOrg.d.ts +33 -0
  156. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -0
  157. package/dist/client/org/RequireActiveOrg.js +68 -0
  158. package/dist/client/org/RequireActiveOrg.js.map +1 -0
  159. package/dist/client/org/TeamPage.d.ts.map +1 -1
  160. package/dist/client/org/TeamPage.js +125 -4
  161. package/dist/client/org/TeamPage.js.map +1 -1
  162. package/dist/client/org/hooks.d.ts +30 -0
  163. package/dist/client/org/hooks.d.ts.map +1 -1
  164. package/dist/client/org/hooks.js +115 -15
  165. package/dist/client/org/hooks.js.map +1 -1
  166. package/dist/client/org/index.d.ts +3 -2
  167. package/dist/client/org/index.d.ts.map +1 -1
  168. package/dist/client/org/index.js +2 -1
  169. package/dist/client/org/index.js.map +1 -1
  170. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  171. package/dist/client/resources/ResourcesPanel.js +8 -4
  172. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  173. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  174. package/dist/client/settings/AutomationsSection.js +2 -1
  175. package/dist/client/settings/AutomationsSection.js.map +1 -1
  176. package/dist/client/settings/BrowserSection.js +1 -1
  177. package/dist/client/settings/BrowserSection.js.map +1 -1
  178. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  179. package/dist/client/settings/SettingsPanel.js +133 -20
  180. package/dist/client/settings/SettingsPanel.js.map +1 -1
  181. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  182. package/dist/client/settings/VoiceTranscriptionSection.js +10 -4
  183. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  184. package/dist/client/settings/useBuilderStatus.d.ts +26 -0
  185. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  186. package/dist/client/settings/useBuilderStatus.js +128 -4
  187. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  188. package/dist/client/sse-event-processor.d.ts +2 -0
  189. package/dist/client/sse-event-processor.d.ts.map +1 -1
  190. package/dist/client/sse-event-processor.js +16 -2
  191. package/dist/client/sse-event-processor.js.map +1 -1
  192. package/dist/client/tools/ToolEditor.d.ts +5 -0
  193. package/dist/client/tools/ToolEditor.d.ts.map +1 -0
  194. package/dist/client/tools/ToolEditor.js +98 -0
  195. package/dist/client/tools/ToolEditor.js.map +1 -0
  196. package/dist/client/tools/ToolViewer.d.ts +5 -0
  197. package/dist/client/tools/ToolViewer.d.ts.map +1 -0
  198. package/dist/client/tools/ToolViewer.js +309 -0
  199. package/dist/client/tools/ToolViewer.js.map +1 -0
  200. package/dist/client/tools/ToolViewerPage.d.ts +2 -0
  201. package/dist/client/tools/ToolViewerPage.d.ts.map +1 -0
  202. package/dist/client/tools/ToolViewerPage.js +23 -0
  203. package/dist/client/tools/ToolViewerPage.js.map +1 -0
  204. package/dist/client/tools/ToolsListPage.d.ts +2 -0
  205. package/dist/client/tools/ToolsListPage.d.ts.map +1 -0
  206. package/dist/client/tools/ToolsListPage.js +72 -0
  207. package/dist/client/tools/ToolsListPage.js.map +1 -0
  208. package/dist/client/tools/ToolsSidebarSection.d.ts +2 -0
  209. package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -0
  210. package/dist/client/tools/ToolsSidebarSection.js +188 -0
  211. package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
  212. package/dist/client/tools/index.d.ts +6 -0
  213. package/dist/client/tools/index.d.ts.map +1 -0
  214. package/dist/client/tools/index.js +6 -0
  215. package/dist/client/tools/index.js.map +1 -0
  216. package/dist/client/transcription/BuilderTranscriptionCta.d.ts +9 -0
  217. package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -0
  218. package/dist/client/transcription/BuilderTranscriptionCta.js +18 -0
  219. package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -0
  220. package/dist/client/transcription/use-live-transcription.d.ts +29 -0
  221. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -0
  222. package/dist/client/transcription/use-live-transcription.js +156 -0
  223. package/dist/client/transcription/use-live-transcription.js.map +1 -0
  224. package/dist/client/use-builder-enabled.d.ts +17 -0
  225. package/dist/client/use-builder-enabled.d.ts.map +1 -0
  226. package/dist/client/use-builder-enabled.js +36 -0
  227. package/dist/client/use-builder-enabled.js.map +1 -0
  228. package/dist/client/use-chat-threads.d.ts +1 -0
  229. package/dist/client/use-chat-threads.d.ts.map +1 -1
  230. package/dist/client/use-chat-threads.js +29 -0
  231. package/dist/client/use-chat-threads.js.map +1 -1
  232. package/dist/client/use-db-sync.d.ts.map +1 -1
  233. package/dist/client/use-db-sync.js +10 -8
  234. package/dist/client/use-db-sync.js.map +1 -1
  235. package/dist/client/useProductionAgent.d.ts.map +1 -1
  236. package/dist/client/useProductionAgent.js +3 -1
  237. package/dist/client/useProductionAgent.js.map +1 -1
  238. package/dist/collab/agent-identity.d.ts +15 -0
  239. package/dist/collab/agent-identity.d.ts.map +1 -0
  240. package/dist/collab/agent-identity.js +14 -0
  241. package/dist/collab/agent-identity.js.map +1 -0
  242. package/dist/collab/agent-presence.d.ts +59 -0
  243. package/dist/collab/agent-presence.d.ts.map +1 -0
  244. package/dist/collab/agent-presence.js +165 -0
  245. package/dist/collab/agent-presence.js.map +1 -0
  246. package/dist/collab/awareness.d.ts +7 -0
  247. package/dist/collab/awareness.d.ts.map +1 -1
  248. package/dist/collab/awareness.js +2 -2
  249. package/dist/collab/awareness.js.map +1 -1
  250. package/dist/collab/client-struct.d.ts +43 -0
  251. package/dist/collab/client-struct.d.ts.map +1 -0
  252. package/dist/collab/client-struct.js +272 -0
  253. package/dist/collab/client-struct.js.map +1 -0
  254. package/dist/collab/client.d.ts +2 -0
  255. package/dist/collab/client.d.ts.map +1 -1
  256. package/dist/collab/client.js +15 -1
  257. package/dist/collab/client.js.map +1 -1
  258. package/dist/collab/index.d.ts +6 -1
  259. package/dist/collab/index.d.ts.map +1 -1
  260. package/dist/collab/index.js +11 -1
  261. package/dist/collab/index.js.map +1 -1
  262. package/dist/collab/json-to-yjs.d.ts +72 -0
  263. package/dist/collab/json-to-yjs.d.ts.map +1 -0
  264. package/dist/collab/json-to-yjs.js +456 -0
  265. package/dist/collab/json-to-yjs.js.map +1 -0
  266. package/dist/collab/struct-routes.d.ts +52 -0
  267. package/dist/collab/struct-routes.d.ts.map +1 -0
  268. package/dist/collab/struct-routes.js +74 -0
  269. package/dist/collab/struct-routes.js.map +1 -0
  270. package/dist/collab/ydoc-manager.d.ts +19 -0
  271. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  272. package/dist/collab/ydoc-manager.js +49 -0
  273. package/dist/collab/ydoc-manager.js.map +1 -1
  274. package/dist/db/migrations.d.ts +9 -0
  275. package/dist/db/migrations.d.ts.map +1 -1
  276. package/dist/db/migrations.js +75 -10
  277. package/dist/db/migrations.js.map +1 -1
  278. package/dist/deploy/build.js +1 -1
  279. package/dist/file-upload/builder.d.ts.map +1 -1
  280. package/dist/file-upload/builder.js +13 -5
  281. package/dist/file-upload/builder.js.map +1 -1
  282. package/dist/integrations/adapters/email.d.ts +17 -0
  283. package/dist/integrations/adapters/email.d.ts.map +1 -0
  284. package/dist/integrations/adapters/email.js +620 -0
  285. package/dist/integrations/adapters/email.js.map +1 -0
  286. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  287. package/dist/integrations/adapters/telegram.js +19 -3
  288. package/dist/integrations/adapters/telegram.js.map +1 -1
  289. package/dist/integrations/index.d.ts +1 -0
  290. package/dist/integrations/index.d.ts.map +1 -1
  291. package/dist/integrations/index.js +1 -0
  292. package/dist/integrations/index.js.map +1 -1
  293. package/dist/integrations/internal-token.d.ts +18 -0
  294. package/dist/integrations/internal-token.d.ts.map +1 -0
  295. package/dist/integrations/internal-token.js +86 -0
  296. package/dist/integrations/internal-token.js.map +1 -0
  297. package/dist/integrations/pending-tasks-retry-job.d.ts +15 -0
  298. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -0
  299. package/dist/integrations/pending-tasks-retry-job.js +199 -0
  300. package/dist/integrations/pending-tasks-retry-job.js.map +1 -0
  301. package/dist/integrations/pending-tasks-store.d.ts +40 -0
  302. package/dist/integrations/pending-tasks-store.d.ts.map +1 -0
  303. package/dist/integrations/pending-tasks-store.js +151 -0
  304. package/dist/integrations/pending-tasks-store.js.map +1 -0
  305. package/dist/integrations/plugin.d.ts.map +1 -1
  306. package/dist/integrations/plugin.js +151 -9
  307. package/dist/integrations/plugin.js.map +1 -1
  308. package/dist/integrations/task-queue-stats.d.ts +22 -0
  309. package/dist/integrations/task-queue-stats.d.ts.map +1 -0
  310. package/dist/integrations/task-queue-stats.js +117 -0
  311. package/dist/integrations/task-queue-stats.js.map +1 -0
  312. package/dist/integrations/types.d.ts +2 -0
  313. package/dist/integrations/types.d.ts.map +1 -1
  314. package/dist/integrations/webhook-handler.d.ts +23 -4
  315. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  316. package/dist/integrations/webhook-handler.js +217 -59
  317. package/dist/integrations/webhook-handler.js.map +1 -1
  318. package/dist/jobs/tools.d.ts.map +1 -1
  319. package/dist/jobs/tools.js +137 -161
  320. package/dist/jobs/tools.js.map +1 -1
  321. package/dist/mcp-client/manager.d.ts +3 -0
  322. package/dist/mcp-client/manager.d.ts.map +1 -1
  323. package/dist/mcp-client/manager.js +5 -0
  324. package/dist/mcp-client/manager.js.map +1 -1
  325. package/dist/notifications/actions.d.ts +2 -2
  326. package/dist/notifications/actions.d.ts.map +1 -1
  327. package/dist/notifications/actions.js +77 -69
  328. package/dist/notifications/actions.js.map +1 -1
  329. package/dist/oauth-tokens/google-refresh.d.ts.map +1 -1
  330. package/dist/oauth-tokens/google-refresh.js +6 -0
  331. package/dist/oauth-tokens/google-refresh.js.map +1 -1
  332. package/dist/observability/evals.d.ts +22 -0
  333. package/dist/observability/evals.d.ts.map +1 -0
  334. package/dist/observability/evals.js +371 -0
  335. package/dist/observability/evals.js.map +1 -0
  336. package/dist/observability/experiments.d.ts +24 -0
  337. package/dist/observability/experiments.d.ts.map +1 -0
  338. package/dist/observability/experiments.js +274 -0
  339. package/dist/observability/experiments.js.map +1 -0
  340. package/dist/observability/feedback.d.ts +14 -0
  341. package/dist/observability/feedback.d.ts.map +1 -0
  342. package/dist/observability/feedback.js +256 -0
  343. package/dist/observability/feedback.js.map +1 -0
  344. package/dist/observability/index.d.ts +6 -0
  345. package/dist/observability/index.d.ts.map +1 -0
  346. package/dist/observability/index.js +5 -0
  347. package/dist/observability/index.js.map +1 -0
  348. package/dist/observability/plugin.d.ts +2 -0
  349. package/dist/observability/plugin.d.ts.map +1 -0
  350. package/dist/observability/plugin.js +12 -0
  351. package/dist/observability/plugin.js.map +1 -0
  352. package/dist/observability/routes.d.ts +68 -0
  353. package/dist/observability/routes.d.ts.map +1 -0
  354. package/dist/observability/routes.js +301 -0
  355. package/dist/observability/routes.js.map +1 -0
  356. package/dist/observability/store.d.ts +77 -0
  357. package/dist/observability/store.d.ts.map +1 -0
  358. package/dist/observability/store.js +976 -0
  359. package/dist/observability/store.js.map +1 -0
  360. package/dist/observability/traces.d.ts +37 -0
  361. package/dist/observability/traces.d.ts.map +1 -0
  362. package/dist/observability/traces.js +182 -0
  363. package/dist/observability/traces.js.map +1 -0
  364. package/dist/observability/types.d.ts +159 -0
  365. package/dist/observability/types.d.ts.map +1 -0
  366. package/dist/observability/types.js +16 -0
  367. package/dist/observability/types.js.map +1 -0
  368. package/dist/onboarding/default-steps.d.ts.map +1 -1
  369. package/dist/onboarding/default-steps.js +15 -7
  370. package/dist/onboarding/default-steps.js.map +1 -1
  371. package/dist/onboarding/types.d.ts +10 -1
  372. package/dist/onboarding/types.d.ts.map +1 -1
  373. package/dist/org/context.d.ts +43 -1
  374. package/dist/org/context.d.ts.map +1 -1
  375. package/dist/org/context.js +299 -6
  376. package/dist/org/context.js.map +1 -1
  377. package/dist/org/handlers.d.ts +76 -0
  378. package/dist/org/handlers.d.ts.map +1 -1
  379. package/dist/org/handlers.js +460 -32
  380. package/dist/org/handlers.js.map +1 -1
  381. package/dist/org/index.d.ts +2 -2
  382. package/dist/org/index.d.ts.map +1 -1
  383. package/dist/org/index.js +2 -2
  384. package/dist/org/index.js.map +1 -1
  385. package/dist/org/migrations.d.ts.map +1 -1
  386. package/dist/org/migrations.js +8 -0
  387. package/dist/org/migrations.js.map +1 -1
  388. package/dist/org/plugin.d.ts +6 -0
  389. package/dist/org/plugin.d.ts.map +1 -1
  390. package/dist/org/plugin.js +71 -7
  391. package/dist/org/plugin.js.map +1 -1
  392. package/dist/org/schema.d.ts +38 -0
  393. package/dist/org/schema.d.ts.map +1 -1
  394. package/dist/org/schema.js +2 -0
  395. package/dist/org/schema.js.map +1 -1
  396. package/dist/org/types.d.ts +7 -0
  397. package/dist/org/types.d.ts.map +1 -1
  398. package/dist/progress/actions.d.ts +3 -0
  399. package/dist/progress/actions.d.ts.map +1 -1
  400. package/dist/progress/actions.js +86 -110
  401. package/dist/progress/actions.js.map +1 -1
  402. package/dist/progress/routes.d.ts +1 -1
  403. package/dist/progress/routes.js +1 -1
  404. package/dist/scripts/agent-engines/list-agent-engines.js +1 -1
  405. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  406. package/dist/scripts/agent-engines/manage-agent-engine.d.ts +10 -0
  407. package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -0
  408. package/dist/scripts/agent-engines/manage-agent-engine.js +47 -0
  409. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -0
  410. package/dist/scripts/agent-engines/set-agent-engine.js +2 -2
  411. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  412. package/dist/scripts/call-agent.d.ts.map +1 -1
  413. package/dist/scripts/call-agent.js +90 -18
  414. package/dist/scripts/call-agent.js.map +1 -1
  415. package/dist/scripts/db/index.d.ts.map +1 -1
  416. package/dist/scripts/db/index.js +2 -0
  417. package/dist/scripts/db/index.js.map +1 -1
  418. package/dist/scripts/db/migrate-user-api-keys.d.ts +24 -0
  419. package/dist/scripts/db/migrate-user-api-keys.d.ts.map +1 -0
  420. package/dist/scripts/db/migrate-user-api-keys.js +224 -0
  421. package/dist/scripts/db/migrate-user-api-keys.js.map +1 -0
  422. package/dist/scripts/db/wipe-leaked-builder-keys.d.ts +27 -0
  423. package/dist/scripts/db/wipe-leaked-builder-keys.d.ts.map +1 -0
  424. package/dist/scripts/db/wipe-leaked-builder-keys.js +163 -0
  425. package/dist/scripts/db/wipe-leaked-builder-keys.js.map +1 -0
  426. package/dist/secrets/register-framework-secrets.d.ts +5 -0
  427. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  428. package/dist/secrets/register-framework-secrets.js +7 -44
  429. package/dist/secrets/register-framework-secrets.js.map +1 -1
  430. package/dist/secrets/substitution.d.ts.map +1 -1
  431. package/dist/secrets/substitution.js +14 -2
  432. package/dist/secrets/substitution.js.map +1 -1
  433. package/dist/server/action-discovery.d.ts.map +1 -1
  434. package/dist/server/action-discovery.js +39 -0
  435. package/dist/server/action-discovery.js.map +1 -1
  436. package/dist/server/action-routes.js +1 -1
  437. package/dist/server/action-routes.js.map +1 -1
  438. package/dist/server/agent-chat-plugin.d.ts +39 -0
  439. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  440. package/dist/server/agent-chat-plugin.js +869 -458
  441. package/dist/server/agent-chat-plugin.js.map +1 -1
  442. package/dist/server/agent-teams.js +1 -1
  443. package/dist/server/agent-teams.js.map +1 -1
  444. package/dist/server/analytics.d.ts +5 -6
  445. package/dist/server/analytics.d.ts.map +1 -1
  446. package/dist/server/analytics.js +6 -14
  447. package/dist/server/analytics.js.map +1 -1
  448. package/dist/server/app-name.d.ts +5 -2
  449. package/dist/server/app-name.d.ts.map +1 -1
  450. package/dist/server/app-name.js +14 -3
  451. package/dist/server/app-name.js.map +1 -1
  452. package/dist/server/app-url.d.ts.map +1 -1
  453. package/dist/server/app-url.js +10 -1
  454. package/dist/server/app-url.js.map +1 -1
  455. package/dist/server/auth.d.ts +16 -0
  456. package/dist/server/auth.d.ts.map +1 -1
  457. package/dist/server/auth.js +373 -7
  458. package/dist/server/auth.js.map +1 -1
  459. package/dist/server/better-auth-instance.d.ts +2 -0
  460. package/dist/server/better-auth-instance.d.ts.map +1 -1
  461. package/dist/server/better-auth-instance.js +4 -0
  462. package/dist/server/better-auth-instance.js.map +1 -1
  463. package/dist/server/builder-browser.d.ts +59 -1
  464. package/dist/server/builder-browser.d.ts.map +1 -1
  465. package/dist/server/builder-browser.js +139 -23
  466. package/dist/server/builder-browser.js.map +1 -1
  467. package/dist/server/collab-plugin.d.ts +4 -0
  468. package/dist/server/collab-plugin.d.ts.map +1 -1
  469. package/dist/server/collab-plugin.js +30 -4
  470. package/dist/server/collab-plugin.js.map +1 -1
  471. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  472. package/dist/server/core-routes-plugin.js +241 -33
  473. package/dist/server/core-routes-plugin.js.map +1 -1
  474. package/dist/server/credential-provider.d.ts +50 -2
  475. package/dist/server/credential-provider.d.ts.map +1 -1
  476. package/dist/server/credential-provider.js +125 -2
  477. package/dist/server/credential-provider.js.map +1 -1
  478. package/dist/server/design-token-utils.d.ts +132 -0
  479. package/dist/server/design-token-utils.d.ts.map +1 -0
  480. package/dist/server/design-token-utils.js +714 -0
  481. package/dist/server/design-token-utils.js.map +1 -0
  482. package/dist/server/email.d.ts +10 -0
  483. package/dist/server/email.d.ts.map +1 -1
  484. package/dist/server/email.js +63 -16
  485. package/dist/server/email.js.map +1 -1
  486. package/dist/server/framework-request-handler.d.ts.map +1 -1
  487. package/dist/server/framework-request-handler.js +38 -3
  488. package/dist/server/framework-request-handler.js.map +1 -1
  489. package/dist/server/google-oauth.d.ts +18 -1
  490. package/dist/server/google-oauth.d.ts.map +1 -1
  491. package/dist/server/google-oauth.js +21 -4
  492. package/dist/server/google-oauth.js.map +1 -1
  493. package/dist/server/index.d.ts +3 -3
  494. package/dist/server/index.d.ts.map +1 -1
  495. package/dist/server/index.js +3 -3
  496. package/dist/server/index.js.map +1 -1
  497. package/dist/server/onboarding-html.d.ts.map +1 -1
  498. package/dist/server/onboarding-html.js +43 -5
  499. package/dist/server/onboarding-html.js.map +1 -1
  500. package/dist/server/poll.d.ts.map +1 -1
  501. package/dist/server/poll.js +46 -5
  502. package/dist/server/poll.js.map +1 -1
  503. package/dist/server/ssr-handler.d.ts.map +1 -1
  504. package/dist/server/ssr-handler.js +2 -1
  505. package/dist/server/ssr-handler.js.map +1 -1
  506. package/dist/server/transcribe-voice.d.ts.map +1 -1
  507. package/dist/server/transcribe-voice.js +125 -21
  508. package/dist/server/transcribe-voice.js.map +1 -1
  509. package/dist/sharing/schema.d.ts +1 -1
  510. package/dist/styles/agent-native.css +16 -2
  511. package/dist/templates/default/.agents/skills/progress/SKILL.md +14 -12
  512. package/dist/templates/default/app/root.tsx +57 -13
  513. package/dist/templates/default/react-router.config.ts +3 -0
  514. package/dist/terminal/terminal-plugin.d.ts.map +1 -1
  515. package/dist/terminal/terminal-plugin.js +23 -3
  516. package/dist/terminal/terminal-plugin.js.map +1 -1
  517. package/dist/tools/actions.d.ts +3 -0
  518. package/dist/tools/actions.d.ts.map +1 -0
  519. package/dist/tools/actions.js +140 -0
  520. package/dist/tools/actions.js.map +1 -0
  521. package/dist/tools/fetch-tool.js +1 -1
  522. package/dist/tools/fetch-tool.js.map +1 -1
  523. package/dist/tools/html-shell.d.ts +2 -0
  524. package/dist/tools/html-shell.d.ts.map +1 -0
  525. package/dist/tools/html-shell.js +387 -0
  526. package/dist/tools/html-shell.js.map +1 -0
  527. package/dist/tools/routes.d.ts +2 -0
  528. package/dist/tools/routes.d.ts.map +1 -0
  529. package/dist/tools/routes.js +576 -0
  530. package/dist/tools/routes.js.map +1 -0
  531. package/dist/tools/schema.d.ts +575 -0
  532. package/dist/tools/schema.d.ts.map +1 -0
  533. package/dist/tools/schema.js +112 -0
  534. package/dist/tools/schema.js.map +1 -0
  535. package/dist/tools/store.d.ts +40 -0
  536. package/dist/tools/store.d.ts.map +1 -0
  537. package/dist/tools/store.js +190 -0
  538. package/dist/tools/store.js.map +1 -0
  539. package/dist/tools/theme.d.ts +2 -0
  540. package/dist/tools/theme.d.ts.map +1 -0
  541. package/dist/tools/theme.js +67 -0
  542. package/dist/tools/theme.js.map +1 -0
  543. package/dist/transcription/builder-transcription.d.ts +27 -0
  544. package/dist/transcription/builder-transcription.d.ts.map +1 -0
  545. package/dist/transcription/builder-transcription.js +53 -0
  546. package/dist/transcription/builder-transcription.js.map +1 -0
  547. package/dist/triggers/actions.d.ts +3 -0
  548. package/dist/triggers/actions.d.ts.map +1 -1
  549. package/dist/triggers/actions.js +189 -213
  550. package/dist/triggers/actions.js.map +1 -1
  551. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  552. package/dist/vite/action-types-plugin.js +10 -2
  553. package/dist/vite/action-types-plugin.js.map +1 -1
  554. package/dist/vite/client.d.ts.map +1 -1
  555. package/dist/vite/client.js +26 -6
  556. package/dist/vite/client.js.map +1 -1
  557. package/docs/content/a2a-protocol.md +2 -2
  558. package/docs/content/agent-mentions.md +1 -1
  559. package/docs/content/authentication.md +51 -0
  560. package/docs/content/automations.md +22 -19
  561. package/docs/content/cloneable-saas.md +59 -62
  562. package/docs/content/deployment.md +21 -61
  563. package/docs/content/faq.md +73 -43
  564. package/docs/content/getting-started.md +37 -61
  565. package/docs/content/key-concepts.md +1 -1
  566. package/docs/content/mcp-clients.md +14 -1
  567. package/docs/content/messaging.md +284 -0
  568. package/docs/content/{enterprise-workspace.md → multi-app-workspace.md} +3 -3
  569. package/docs/content/multi-tenancy.md +1 -1
  570. package/docs/content/progress.md +11 -11
  571. package/docs/content/pure-agent-apps.md +55 -28
  572. package/docs/content/template-calendar.md +61 -56
  573. package/docs/content/template-clips.md +22 -18
  574. package/docs/content/template-content.md +36 -26
  575. package/docs/content/template-dispatch.md +5 -4
  576. package/docs/content/template-forms.md +13 -11
  577. package/docs/content/template-slides.md +43 -31
  578. package/docs/content/template-video.md +49 -22
  579. package/docs/content/tools.md +107 -0
  580. package/docs/content/what-is-agent-native.md +89 -105
  581. package/docs/content/workspace-management.md +1 -1
  582. package/package.json +12 -2
  583. package/src/templates/default/.agents/skills/progress/SKILL.md +14 -12
  584. package/src/templates/default/app/root.tsx +57 -13
  585. package/src/templates/default/react-router.config.ts +3 -0
  586. package/docs/content/integrations.md +0 -198
@@ -49,7 +49,7 @@ async function exec() {
49
49
  }
50
50
  function requireAuthEmail(session) {
51
51
  const email = session?.email;
52
- if (!email || email === "local@localhost") {
52
+ if (!email) {
53
53
  throw createError({ statusCode: 401, message: "Authentication required" });
54
54
  }
55
55
  return email;
@@ -57,16 +57,6 @@ function requireAuthEmail(session) {
57
57
  /** GET /_agent-native/org/me — current user's active org, all orgs, pending invitations */
58
58
  export const getMyOrgHandler = defineEventHandler(async (event) => {
59
59
  const ctx = await getOrgContext(event);
60
- if (ctx.email === "local@localhost") {
61
- return {
62
- email: ctx.email,
63
- orgId: null,
64
- orgName: null,
65
- role: null,
66
- orgs: [],
67
- pendingInvitations: [],
68
- };
69
- }
70
60
  const e = await exec();
71
61
  const allOrgsRes = await e.execute({
72
62
  sql: `SELECT m.org_id AS "orgId", m.role AS role, o.name AS "orgName"
@@ -80,12 +70,54 @@ export const getMyOrgHandler = defineEventHandler(async (event) => {
80
70
  role: String(r.role),
81
71
  orgName: String(r.orgName ?? r.org_name),
82
72
  }));
73
+ let domainMatches = [];
74
+ if (!ctx.orgId) {
75
+ const domain = ctx.email.split("@")[1]?.toLowerCase();
76
+ if (domain) {
77
+ try {
78
+ const dmRes = await e.execute({
79
+ sql: `SELECT id, name FROM organizations WHERE LOWER(allowed_domain) = ?`,
80
+ args: [domain],
81
+ });
82
+ domainMatches = dmRes.rows.map((r) => ({
83
+ orgId: String(r.id),
84
+ orgName: String(r.name),
85
+ }));
86
+ }
87
+ catch {
88
+ // allowed_domain column may not exist yet if migration hasn't run
89
+ }
90
+ }
91
+ }
92
+ let allowedDomain = null;
93
+ let a2aSecret = null;
94
+ if (ctx.orgId) {
95
+ try {
96
+ const adRes = await e.execute({
97
+ sql: `SELECT allowed_domain, a2a_secret FROM organizations WHERE id = ? LIMIT 1`,
98
+ args: [ctx.orgId],
99
+ });
100
+ if (adRes.rows[0]) {
101
+ allowedDomain =
102
+ String(adRes.rows[0].allowed_domain ?? "") || null;
103
+ a2aSecret = String(adRes.rows[0].a2a_secret ?? "") || null;
104
+ }
105
+ }
106
+ catch {
107
+ // Column may not exist yet
108
+ }
109
+ }
110
+ const isOwnerOrAdmin = ctx.role === "owner" || ctx.role === "admin";
83
111
  const invitesRes = await e.execute({
112
+ // Case-insensitive match: invitations are stored with whatever case
113
+ // the inviter typed, but the session email may be normalized
114
+ // differently by the auth provider. LOWER(both sides) keeps these
115
+ // discoverable and matches getOrgContext.hasPendingInvitation.
84
116
  sql: `SELECT i.id AS id, i.org_id AS "orgId", o.name AS "orgName", i.invited_by AS "invitedBy"
85
117
  FROM org_invitations i
86
118
  INNER JOIN organizations o ON i.org_id = o.id
87
- WHERE i.email = ? AND i.status = 'pending'`,
88
- args: [ctx.email],
119
+ WHERE LOWER(i.email) = ? AND i.status = 'pending'`,
120
+ args: [ctx.email.toLowerCase()],
89
121
  });
90
122
  const pendingInvitations = invitesRes.rows.map((r) => ({
91
123
  id: String(r.id),
@@ -100,6 +132,9 @@ export const getMyOrgHandler = defineEventHandler(async (event) => {
100
132
  role: ctx.role,
101
133
  orgs,
102
134
  pendingInvitations,
135
+ domainMatches,
136
+ allowedDomain,
137
+ a2aSecret: isOwnerOrAdmin ? a2aSecret : undefined,
103
138
  };
104
139
  });
105
140
  /** POST /_agent-native/org — create a new organization */
@@ -117,9 +152,12 @@ export const createOrgHandler = defineEventHandler(async (event) => {
117
152
  const orgId = nanoid();
118
153
  const now = Date.now();
119
154
  const e = await exec();
155
+ // Auto-generate a per-org A2A secret for cross-app delegation
156
+ const { randomBytes } = await import("node:crypto");
157
+ const a2aSecret = randomBytes(32).toString("base64url");
120
158
  await e.execute({
121
- sql: `INSERT INTO organizations (id, name, created_by, created_at) VALUES (?, ?, ?, ?)`,
122
- args: [orgId, name, email, now],
159
+ sql: `INSERT INTO organizations (id, name, created_by, created_at, a2a_secret) VALUES (?, ?, ?, ?, ?)`,
160
+ args: [orgId, name, email, now, a2aSecret],
123
161
  });
124
162
  await e.execute({
125
163
  sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,
@@ -166,9 +204,16 @@ export const createInvitationHandler = defineEventHandler(async (event) => {
166
204
  throw createError({ statusCode: 400, message: "Email is required" });
167
205
  }
168
206
  const e = await exec();
207
+ // Existing rows in org_members / org_invitations may have any case
208
+ // (writes haven't been normalized historically). Compare with LOWER
209
+ // on both sides so an "alice@..." invite check correctly recognizes
210
+ // an existing "Alice@..." membership. `email` is already lowercased
211
+ // at parse time above, but call .toLowerCase() explicitly here so
212
+ // the contract at the SQL boundary matches every other handler in
213
+ // this file.
169
214
  const existingMember = await e.execute({
170
- sql: `SELECT 1 FROM org_members WHERE org_id = ? AND email = ? LIMIT 1`,
171
- args: [ctx.orgId, email],
215
+ sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,
216
+ args: [ctx.orgId, email.toLowerCase()],
172
217
  });
173
218
  if (existingMember.rows.length > 0) {
174
219
  throw createError({
@@ -177,8 +222,8 @@ export const createInvitationHandler = defineEventHandler(async (event) => {
177
222
  });
178
223
  }
179
224
  const existingInvite = await e.execute({
180
- sql: `SELECT 1 FROM org_invitations WHERE org_id = ? AND email = ? AND status = 'pending' LIMIT 1`,
181
- args: [ctx.orgId, email],
225
+ sql: `SELECT 1 FROM org_invitations WHERE org_id = ? AND LOWER(email) = ? AND status = 'pending' LIMIT 1`,
226
+ args: [ctx.orgId, email.toLowerCase()],
182
227
  });
183
228
  if (existingInvite.rows.length > 0) {
184
229
  throw createError({
@@ -245,9 +290,11 @@ export const acceptInvitationHandler = defineEventHandler(async (event) => {
245
290
  }
246
291
  const e = await exec();
247
292
  const invRes = await e.execute({
293
+ // Case-insensitive on email — see comment on the analogous
294
+ // pending-invitations query in getMyOrgHandler.
248
295
  sql: `SELECT id, org_id AS "orgId" FROM org_invitations
249
- WHERE id = ? AND email = ? AND status = 'pending' LIMIT 1`,
250
- args: [invitationId, email],
296
+ WHERE id = ? AND LOWER(email) = ? AND status = 'pending' LIMIT 1`,
297
+ args: [invitationId, email.toLowerCase()],
251
298
  });
252
299
  if (invRes.rows.length === 0) {
253
300
  throw createError({
@@ -258,8 +305,8 @@ export const acceptInvitationHandler = defineEventHandler(async (event) => {
258
305
  const inv = invRes.rows[0];
259
306
  const invOrgId = String(inv.orgId ?? inv.org_id);
260
307
  const existingMembership = await e.execute({
261
- sql: `SELECT role FROM org_members WHERE org_id = ? AND email = ? LIMIT 1`,
262
- args: [invOrgId, email],
308
+ sql: `SELECT role FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,
309
+ args: [invOrgId, email.toLowerCase()],
263
310
  });
264
311
  const orgRes = await e.execute({
265
312
  sql: `SELECT name FROM organizations WHERE id = ? LIMIT 1`,
@@ -305,29 +352,72 @@ export const removeMemberHandler = defineEventHandler(async (event) => {
305
352
  if (!memberEmail) {
306
353
  throw createError({ statusCode: 400, message: "Email is required" });
307
354
  }
308
- if (memberEmail === ctx.email && ctx.role === "owner") {
355
+ // memberEmail comes from the URL path verbatim; org_members may
356
+ // hold the row with any case. LOWER both sides for the lookup AND
357
+ // the DELETE so removal works regardless of how either side cased
358
+ // it. The self-removal guard ALSO compares case-insensitively —
359
+ // otherwise an owner whose email was stored as Alice@... could
360
+ // remove themselves via the lowercase URL alice@..., bypassing the
361
+ // guard and leaving the org ownerless.
362
+ const memberEmailLower = memberEmail.toLowerCase();
363
+ if (memberEmailLower === ctx.email.toLowerCase() && ctx.role === "owner") {
309
364
  throw createError({
310
365
  statusCode: 400,
311
366
  message: "Organization owner cannot remove themselves",
312
367
  });
313
368
  }
314
369
  const e = await exec();
315
- const target = await e.execute({
316
- sql: `SELECT role FROM org_members WHERE org_id = ? AND email = ? LIMIT 1`,
317
- args: [ctx.orgId, memberEmail],
370
+ // Look specifically for an OWNER row matching this email rather
371
+ // than just "any matching row". Duplicate-case rows are possible
372
+ // (e.g. legacy data with both "Alice@..." and "alice@..." in
373
+ // org_members), and the prior `SELECT role ... LIMIT 1` could
374
+ // return the non-owner duplicate, pass the role check, and then
375
+ // the case-insensitive DELETE below would remove BOTH rows —
376
+ // including the owner — leaving the org ownerless. Querying for
377
+ // the owner row directly closes that case-mismatch attack.
378
+ const ownerCheck = await e.execute({
379
+ sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? AND role = 'owner' LIMIT 1`,
380
+ args: [ctx.orgId, memberEmailLower],
318
381
  });
319
- if (target.rows[0]?.role === "owner") {
382
+ if (ownerCheck.rows.length > 0) {
320
383
  throw createError({
321
384
  statusCode: 403,
322
385
  message: "Cannot remove the organization owner",
323
386
  });
324
387
  }
325
388
  await e.execute({
326
- sql: `DELETE FROM org_members WHERE org_id = ? AND email = ?`,
327
- args: [ctx.orgId, memberEmail],
389
+ sql: `DELETE FROM org_members WHERE org_id = ? AND LOWER(email) = ?`,
390
+ args: [ctx.orgId, memberEmailLower],
328
391
  });
329
392
  return { success: true };
330
393
  });
394
+ /** PATCH /_agent-native/org — rename the current organization (owner/admin only) */
395
+ export const updateOrgHandler = defineEventHandler(async (event) => {
396
+ const ctx = await getOrgContext(event);
397
+ if (!ctx.orgId) {
398
+ throw createError({ statusCode: 400, message: "No organization found" });
399
+ }
400
+ if (ctx.role !== "owner" && ctx.role !== "admin") {
401
+ throw createError({
402
+ statusCode: 403,
403
+ message: "Only owners and admins can update the organization",
404
+ });
405
+ }
406
+ const body = await readBody(event);
407
+ const name = body?.name?.trim();
408
+ if (!name) {
409
+ throw createError({
410
+ statusCode: 400,
411
+ message: "Organization name is required",
412
+ });
413
+ }
414
+ const e = await exec();
415
+ await e.execute({
416
+ sql: `UPDATE organizations SET name = ? WHERE id = ?`,
417
+ args: [name, ctx.orgId],
418
+ });
419
+ return { orgId: ctx.orgId, name };
420
+ });
331
421
  /** PUT /_agent-native/org/switch — switch the user's active organization */
332
422
  export const switchOrgHandler = defineEventHandler(async (event) => {
333
423
  const session = await getSession(event);
@@ -343,8 +433,8 @@ export const switchOrgHandler = defineEventHandler(async (event) => {
343
433
  sql: `SELECT m.role AS role, o.name AS "orgName"
344
434
  FROM org_members m
345
435
  INNER JOIN organizations o ON m.org_id = o.id
346
- WHERE m.org_id = ? AND m.email = ? LIMIT 1`,
347
- args: [orgId, email],
436
+ WHERE m.org_id = ? AND LOWER(m.email) = ? LIMIT 1`,
437
+ args: [orgId, email.toLowerCase()],
348
438
  });
349
439
  if (membership.rows.length === 0) {
350
440
  throw createError({
@@ -360,4 +450,342 @@ export const switchOrgHandler = defineEventHandler(async (event) => {
360
450
  role: String(row.role),
361
451
  };
362
452
  });
453
+ /** POST /_agent-native/org/join-by-domain — join an org whose allowed_domain matches your email */
454
+ export const joinByDomainHandler = defineEventHandler(async (event) => {
455
+ const session = await getSession(event);
456
+ const email = requireAuthEmail(session);
457
+ const body = await readBody(event);
458
+ const orgId = body?.orgId;
459
+ if (!orgId) {
460
+ throw createError({ statusCode: 400, message: "orgId is required" });
461
+ }
462
+ const e = await exec();
463
+ const orgRes = await e.execute({
464
+ sql: `SELECT id, name, allowed_domain FROM organizations WHERE id = ? LIMIT 1`,
465
+ args: [orgId],
466
+ });
467
+ if (orgRes.rows.length === 0) {
468
+ throw createError({ statusCode: 404, message: "Organization not found" });
469
+ }
470
+ const org = orgRes.rows[0];
471
+ const allowedDomain = String(org.allowed_domain || "").toLowerCase();
472
+ const userDomain = email.split("@")[1]?.toLowerCase();
473
+ if (!allowedDomain || allowedDomain !== userDomain) {
474
+ throw createError({
475
+ statusCode: 403,
476
+ message: "Your email domain does not match this organization's allowed domain",
477
+ });
478
+ }
479
+ const existing = await e.execute({
480
+ sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,
481
+ args: [orgId, email.toLowerCase()],
482
+ });
483
+ if (existing.rows.length > 0) {
484
+ throw createError({
485
+ statusCode: 409,
486
+ message: "Already a member of this organization",
487
+ });
488
+ }
489
+ await e.execute({
490
+ sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, 'member', ?)`,
491
+ args: [nanoid(), orgId, email, Date.now()],
492
+ });
493
+ await putUserSetting(email, "active-org-id", { orgId });
494
+ return {
495
+ orgId,
496
+ orgName: String(org.name),
497
+ role: "member",
498
+ };
499
+ });
500
+ /** PUT /_agent-native/org/domain — set or clear the allowed email domain (owner/admin only) */
501
+ export const setDomainHandler = defineEventHandler(async (event) => {
502
+ const ctx = await getOrgContext(event);
503
+ if (!ctx.orgId) {
504
+ throw createError({ statusCode: 400, message: "No active organization" });
505
+ }
506
+ if (ctx.role !== "owner" && ctx.role !== "admin") {
507
+ throw createError({
508
+ statusCode: 403,
509
+ message: "Only owners and admins can set the allowed domain",
510
+ });
511
+ }
512
+ const body = await readBody(event);
513
+ const raw = body?.domain?.trim()?.toLowerCase() || null;
514
+ if (raw && !/^([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/.test(raw)) {
515
+ throw createError({
516
+ statusCode: 400,
517
+ message: "Invalid domain format",
518
+ });
519
+ }
520
+ const e = await exec();
521
+ if (raw) {
522
+ const existing = await e.execute({
523
+ sql: `SELECT id FROM organizations WHERE LOWER(allowed_domain) = ? AND id != ? LIMIT 1`,
524
+ args: [raw, ctx.orgId],
525
+ });
526
+ if (existing.rows.length > 0) {
527
+ throw createError({
528
+ statusCode: 409,
529
+ message: "Another organization already uses this domain",
530
+ });
531
+ }
532
+ }
533
+ await e.execute({
534
+ sql: `UPDATE organizations SET allowed_domain = ? WHERE id = ?`,
535
+ args: [raw, ctx.orgId],
536
+ });
537
+ return { domain: raw };
538
+ });
539
+ /** PUT /_agent-native/org/a2a-secret — regenerate or set the org's A2A secret (owner/admin only) */
540
+ export const setA2ASecretHandler = defineEventHandler(async (event) => {
541
+ const ctx = await getOrgContext(event);
542
+ if (!ctx.orgId) {
543
+ throw createError({
544
+ statusCode: 400,
545
+ message: "No active organization",
546
+ });
547
+ }
548
+ if (ctx.role !== "owner" && ctx.role !== "admin") {
549
+ throw createError({
550
+ statusCode: 403,
551
+ message: "Only owners and admins can manage the A2A secret",
552
+ });
553
+ }
554
+ const body = await readBody(event);
555
+ let secret = body?.secret?.trim() || null;
556
+ // If no secret provided, auto-generate one
557
+ if (!secret) {
558
+ const { randomBytes } = await import("node:crypto");
559
+ secret = randomBytes(32).toString("base64url");
560
+ }
561
+ const e = await exec();
562
+ // Read the previous secret BEFORE overwriting so the client can chain a
563
+ // sync call that signs JWTs with the secret peers still hold.
564
+ const prevRes = await e.execute({
565
+ sql: `SELECT a2a_secret FROM organizations WHERE id = ? LIMIT 1`,
566
+ args: [ctx.orgId],
567
+ });
568
+ const previousSecret = String(prevRes.rows[0]?.a2a_secret ?? "") || null;
569
+ await e.execute({
570
+ sql: `UPDATE organizations SET a2a_secret = ? WHERE id = ?`,
571
+ args: [secret, ctx.orgId],
572
+ });
573
+ return { a2aSecret: secret, previousSecret };
574
+ });
575
+ /**
576
+ * POST /_agent-native/org/a2a-secret/sync — push the org's A2A secret to all
577
+ * connected apps so cross-app delegation works without manual copy/paste.
578
+ *
579
+ * Auth: standard session — owner/admin only.
580
+ *
581
+ * For each discovered agent, signs a JWT with the org's CURRENT a2a_secret
582
+ * and POSTs to `<app>/_agent-native/org/a2a-secret/receive` with the same
583
+ * secret + the org's domain. The receiving app verifies the JWT using its
584
+ * own copy of the secret (peers must already share a secret to be trusted)
585
+ * — for the first-ever sync this means at least one peer must already hold
586
+ * the secret, which is the bootstrap. For ongoing rotation, regenerate
587
+ * locally and call sync immediately; sync signs with the secret that's
588
+ * currently in DB, which the peers still have.
589
+ *
590
+ * Body (optional): { signSecret?: string } — sign the outbound JWTs with
591
+ * this secret instead of the org's current secret. Used by the regenerate-
592
+ * then-sync flow: regenerate stores the NEW secret, but sync needs to
593
+ * authenticate using the OLD one that peers still hold. Owner/admin only,
594
+ * gated by the session.
595
+ */
596
+ export const syncA2ASecretHandler = defineEventHandler(async (event) => {
597
+ const ctx = await getOrgContext(event);
598
+ if (!ctx.orgId) {
599
+ throw createError({
600
+ statusCode: 400,
601
+ message: "No active organization",
602
+ });
603
+ }
604
+ if (ctx.role !== "owner" && ctx.role !== "admin") {
605
+ throw createError({
606
+ statusCode: 403,
607
+ message: "Only owners and admins can sync the A2A secret",
608
+ });
609
+ }
610
+ const body = await readBody(event).catch(() => null);
611
+ const overrideSignSecret = typeof body?.signSecret === "string" && body.signSecret.trim()
612
+ ? body.signSecret.trim()
613
+ : null;
614
+ const e = await exec();
615
+ const orgRes = await e.execute({
616
+ sql: `SELECT a2a_secret, allowed_domain FROM organizations WHERE id = ? LIMIT 1`,
617
+ args: [ctx.orgId],
618
+ });
619
+ if (orgRes.rows.length === 0) {
620
+ throw createError({
621
+ statusCode: 404,
622
+ message: "Organization not found",
623
+ });
624
+ }
625
+ const orgRow = orgRes.rows[0];
626
+ const secret = String(orgRow.a2a_secret ?? "") || null;
627
+ const orgDomain = String(orgRow.allowed_domain ?? "") || null;
628
+ if (!secret) {
629
+ throw createError({
630
+ statusCode: 400,
631
+ message: "Org has no A2A secret. Generate one first before syncing.",
632
+ });
633
+ }
634
+ if (!orgDomain) {
635
+ throw createError({
636
+ statusCode: 400,
637
+ message: "Org has no allowed domain set. Set the email domain first so connected apps can identify which org to update.",
638
+ });
639
+ }
640
+ const signSecret = overrideSignSecret || secret;
641
+ const { discoverAgents } = await import("../server/agent-discovery.js");
642
+ const { signA2AToken } = await import("../a2a/client.js");
643
+ const agents = await discoverAgents();
644
+ const results = [];
645
+ await Promise.all(agents.map(async (agent) => {
646
+ try {
647
+ const token = await signA2AToken(ctx.email, orgDomain, signSecret);
648
+ const target = `${agent.url.replace(/\/$/, "")}/_agent-native/org/a2a-secret/receive`;
649
+ const res = await fetch(target, {
650
+ method: "POST",
651
+ headers: {
652
+ "Content-Type": "application/json",
653
+ Authorization: `Bearer ${token}`,
654
+ },
655
+ body: JSON.stringify({ secret, orgDomain }),
656
+ });
657
+ if (!res.ok) {
658
+ const text = await res.text().catch(() => "");
659
+ results.push({
660
+ id: agent.id,
661
+ name: agent.name,
662
+ url: agent.url,
663
+ ok: false,
664
+ status: res.status,
665
+ error: text || res.statusText,
666
+ });
667
+ return;
668
+ }
669
+ results.push({
670
+ id: agent.id,
671
+ name: agent.name,
672
+ url: agent.url,
673
+ ok: true,
674
+ status: res.status,
675
+ });
676
+ }
677
+ catch (err) {
678
+ results.push({
679
+ id: agent.id,
680
+ name: agent.name,
681
+ url: agent.url,
682
+ ok: false,
683
+ error: err instanceof Error ? err.message : String(err),
684
+ });
685
+ }
686
+ }));
687
+ const succeeded = results.filter((r) => r.ok).length;
688
+ return {
689
+ total: results.length,
690
+ succeeded,
691
+ failed: results.length - succeeded,
692
+ results,
693
+ };
694
+ });
695
+ /**
696
+ * POST /_agent-native/org/a2a-secret/receive — accept a secret push from a
697
+ * connected agent-native app. Auth-exempt at the route guard; we verify a
698
+ * JWT signed by the calling app using OUR copy of the org's a2a_secret. If
699
+ * verification succeeds the calling app is a trusted peer and we overwrite
700
+ * our local org's secret with the supplied value.
701
+ *
702
+ * Body: { secret: string, orgDomain: string }
703
+ *
704
+ * Header: Authorization: Bearer <JWT signed with the existing shared
705
+ * a2a_secret, with `org_domain` matching the body's orgDomain>.
706
+ */
707
+ export const receiveA2ASecretHandler = defineEventHandler(async (event) => {
708
+ const { getRequestHeader } = await import("h3");
709
+ const jose = await import("jose");
710
+ const authHeader = getRequestHeader(event, "authorization");
711
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
712
+ throw createError({
713
+ statusCode: 401,
714
+ message: "Bearer token required",
715
+ });
716
+ }
717
+ const token = authHeader.slice("Bearer ".length);
718
+ const body = await readBody(event);
719
+ const newSecret = typeof body?.secret === "string" ? body.secret.trim() : "";
720
+ const orgDomain = typeof body?.orgDomain === "string"
721
+ ? body.orgDomain.trim().toLowerCase()
722
+ : "";
723
+ if (!newSecret || !orgDomain) {
724
+ throw createError({
725
+ statusCode: 400,
726
+ message: "secret and orgDomain are required",
727
+ });
728
+ }
729
+ // Peek at JWT (unverified) to confirm it claims the same domain we're
730
+ // updating. Verification still happens below with the trusted secret.
731
+ let claimedDomain;
732
+ try {
733
+ const unverified = jose.decodeJwt(token);
734
+ claimedDomain =
735
+ unverified.org_domain || undefined;
736
+ }
737
+ catch {
738
+ throw createError({
739
+ statusCode: 401,
740
+ message: "Malformed JWT",
741
+ });
742
+ }
743
+ if (!claimedDomain ||
744
+ claimedDomain.toLowerCase() !== orgDomain.toLowerCase()) {
745
+ throw createError({
746
+ statusCode: 401,
747
+ message: "JWT org_domain does not match request body",
748
+ });
749
+ }
750
+ // Look up our local org by the domain and grab the existing secret.
751
+ const e = await exec();
752
+ const orgRes = await e.execute({
753
+ sql: `SELECT id, a2a_secret FROM organizations WHERE LOWER(allowed_domain) = ? LIMIT 1`,
754
+ args: [orgDomain],
755
+ });
756
+ if (orgRes.rows.length === 0) {
757
+ throw createError({
758
+ statusCode: 404,
759
+ message: "No local org matches that domain",
760
+ });
761
+ }
762
+ const row = orgRes.rows[0];
763
+ const localOrgId = String(row.id);
764
+ const existingSecret = String(row.a2a_secret ?? "") || null;
765
+ if (!existingSecret) {
766
+ // Bootstrap requires an existing shared secret to verify the caller.
767
+ // If we have nothing on file, we can't verify trust — refuse.
768
+ throw createError({
769
+ statusCode: 401,
770
+ message: "Local org has no A2A secret yet — cannot verify caller. Set the secret manually for the first time.",
771
+ });
772
+ }
773
+ // Verify the JWT using OUR existing secret. If the caller is a trusted
774
+ // peer they signed with the same secret and verification succeeds.
775
+ try {
776
+ await jose.jwtVerify(token, new TextEncoder().encode(existingSecret));
777
+ }
778
+ catch {
779
+ throw createError({
780
+ statusCode: 401,
781
+ message: "Invalid or expired JWT signature",
782
+ });
783
+ }
784
+ // Trusted — apply the new secret.
785
+ await e.execute({
786
+ sql: `UPDATE organizations SET a2a_secret = ? WHERE id = ?`,
787
+ args: [newSecret, localOrgId],
788
+ });
789
+ return { ok: true, orgId: localOrgId };
790
+ });
363
791
  //# sourceMappingURL=handlers.js.map