@agent-native/core 0.4.5 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1015) hide show
  1. package/README.md +15 -43
  2. package/dist/a2a/agent-card.d.ts.map +1 -1
  3. package/dist/a2a/agent-card.js +12 -1
  4. package/dist/a2a/agent-card.js.map +1 -1
  5. package/dist/a2a/client.d.ts +18 -0
  6. package/dist/a2a/client.d.ts.map +1 -1
  7. package/dist/a2a/client.js +62 -4
  8. package/dist/a2a/client.js.map +1 -1
  9. package/dist/a2a/handlers.d.ts +6 -3
  10. package/dist/a2a/handlers.d.ts.map +1 -1
  11. package/dist/a2a/handlers.js +45 -39
  12. package/dist/a2a/handlers.js.map +1 -1
  13. package/dist/a2a/index.d.ts +2 -2
  14. package/dist/a2a/index.d.ts.map +1 -1
  15. package/dist/a2a/index.js +3 -3
  16. package/dist/a2a/index.js.map +1 -1
  17. package/dist/a2a/server.d.ts +11 -2
  18. package/dist/a2a/server.d.ts.map +1 -1
  19. package/dist/a2a/server.js +99 -14
  20. package/dist/a2a/server.js.map +1 -1
  21. package/dist/a2a/task-store.d.ts +6 -6
  22. package/dist/a2a/task-store.d.ts.map +1 -1
  23. package/dist/a2a/task-store.js +102 -42
  24. package/dist/a2a/task-store.js.map +1 -1
  25. package/dist/a2a/types.d.ts +3 -0
  26. package/dist/a2a/types.d.ts.map +1 -1
  27. package/dist/action.d.ts +80 -0
  28. package/dist/action.d.ts.map +1 -0
  29. package/dist/action.js +232 -0
  30. package/dist/action.js.map +1 -0
  31. package/dist/agent/engine/ai-sdk-engine.d.ts +24 -0
  32. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -0
  33. package/dist/agent/engine/ai-sdk-engine.js +302 -0
  34. package/dist/agent/engine/ai-sdk-engine.js.map +1 -0
  35. package/dist/agent/engine/anthropic-engine.d.ts +24 -0
  36. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -0
  37. package/dist/agent/engine/anthropic-engine.js +169 -0
  38. package/dist/agent/engine/anthropic-engine.js.map +1 -0
  39. package/dist/agent/engine/builtin.d.ts +12 -0
  40. package/dist/agent/engine/builtin.d.ts.map +1 -0
  41. package/dist/agent/engine/builtin.js +72 -0
  42. package/dist/agent/engine/builtin.js.map +1 -0
  43. package/dist/agent/engine/index.d.ts +9 -0
  44. package/dist/agent/engine/index.d.ts.map +1 -0
  45. package/dist/agent/engine/index.js +8 -0
  46. package/dist/agent/engine/index.js.map +1 -0
  47. package/dist/agent/engine/registry.d.ts +61 -0
  48. package/dist/agent/engine/registry.d.ts.map +1 -0
  49. package/dist/agent/engine/registry.js +101 -0
  50. package/dist/agent/engine/registry.js.map +1 -0
  51. package/dist/agent/engine/translate-ai-sdk.d.ts +20 -0
  52. package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -0
  53. package/dist/agent/engine/translate-ai-sdk.js +174 -0
  54. package/dist/agent/engine/translate-ai-sdk.js.map +1 -0
  55. package/dist/agent/engine/translate-anthropic.d.ts +23 -0
  56. package/dist/agent/engine/translate-anthropic.d.ts.map +1 -0
  57. package/dist/agent/engine/translate-anthropic.js +140 -0
  58. package/dist/agent/engine/translate-anthropic.js.map +1 -0
  59. package/dist/agent/engine/types.d.ts +168 -0
  60. package/dist/agent/engine/types.d.ts.map +1 -0
  61. package/dist/agent/engine/types.js +13 -0
  62. package/dist/agent/engine/types.js.map +1 -0
  63. package/dist/agent/index.d.ts +2 -2
  64. package/dist/agent/index.d.ts.map +1 -1
  65. package/dist/agent/index.js.map +1 -1
  66. package/dist/agent/production-agent.d.ts +69 -7
  67. package/dist/agent/production-agent.d.ts.map +1 -1
  68. package/dist/agent/production-agent.js +480 -127
  69. package/dist/agent/production-agent.js.map +1 -1
  70. package/dist/agent/run-manager.d.ts +43 -0
  71. package/dist/agent/run-manager.d.ts.map +1 -0
  72. package/dist/agent/run-manager.js +364 -0
  73. package/dist/agent/run-manager.js.map +1 -0
  74. package/dist/agent/run-store.d.ts +26 -0
  75. package/dist/agent/run-store.d.ts.map +1 -0
  76. package/dist/agent/run-store.js +145 -0
  77. package/dist/agent/run-store.js.map +1 -0
  78. package/dist/agent/thread-data-builder.d.ts +31 -0
  79. package/dist/agent/thread-data-builder.d.ts.map +1 -0
  80. package/dist/agent/thread-data-builder.js +91 -0
  81. package/dist/agent/thread-data-builder.js.map +1 -0
  82. package/dist/agent/types.d.ts +73 -1
  83. package/dist/agent/types.d.ts.map +1 -1
  84. package/dist/application-state/emitter.d.ts +3 -2
  85. package/dist/application-state/emitter.d.ts.map +1 -1
  86. package/dist/application-state/emitter.js +14 -4
  87. package/dist/application-state/emitter.js.map +1 -1
  88. package/dist/application-state/handlers.d.ts +8 -8
  89. package/dist/application-state/handlers.d.ts.map +1 -1
  90. package/dist/application-state/handlers.js +15 -17
  91. package/dist/application-state/handlers.js.map +1 -1
  92. package/dist/application-state/script-helpers.d.ts +1 -1
  93. package/dist/application-state/script-helpers.d.ts.map +1 -1
  94. package/dist/application-state/script-helpers.js +56 -8
  95. package/dist/application-state/script-helpers.js.map +1 -1
  96. package/dist/application-state/store.d.ts +4 -3
  97. package/dist/application-state/store.d.ts.map +1 -1
  98. package/dist/application-state/store.js +31 -59
  99. package/dist/application-state/store.js.map +1 -1
  100. package/dist/chat-threads/emitter.d.ts +9 -0
  101. package/dist/chat-threads/emitter.d.ts.map +1 -0
  102. package/dist/chat-threads/emitter.js +14 -0
  103. package/dist/chat-threads/emitter.js.map +1 -0
  104. package/dist/chat-threads/store.d.ts +42 -0
  105. package/dist/chat-threads/store.d.ts.map +1 -0
  106. package/dist/chat-threads/store.js +156 -0
  107. package/dist/chat-threads/store.js.map +1 -0
  108. package/dist/cli/create.d.ts +8 -2
  109. package/dist/cli/create.d.ts.map +1 -1
  110. package/dist/cli/create.js +288 -47
  111. package/dist/cli/create.js.map +1 -1
  112. package/dist/cli/index.js +49 -9
  113. package/dist/cli/index.js.map +1 -1
  114. package/dist/cli/setup-agents.d.ts +11 -0
  115. package/dist/cli/setup-agents.d.ts.map +1 -0
  116. package/dist/cli/setup-agents.js +123 -0
  117. package/dist/cli/setup-agents.js.map +1 -0
  118. package/dist/client/AgentPanel.d.ts +13 -2
  119. package/dist/client/AgentPanel.d.ts.map +1 -1
  120. package/dist/client/AgentPanel.js +771 -38
  121. package/dist/client/AgentPanel.js.map +1 -1
  122. package/dist/client/AgentTaskCard.d.ts +12 -0
  123. package/dist/client/AgentTaskCard.d.ts.map +1 -0
  124. package/dist/client/AgentTaskCard.js +146 -0
  125. package/dist/client/AgentTaskCard.js.map +1 -0
  126. package/dist/client/AssistantChat.d.ts +36 -3
  127. package/dist/client/AssistantChat.d.ts.map +1 -1
  128. package/dist/client/AssistantChat.js +838 -86
  129. package/dist/client/AssistantChat.js.map +1 -1
  130. package/dist/client/ClientOnly.d.ts +14 -0
  131. package/dist/client/ClientOnly.d.ts.map +1 -0
  132. package/dist/client/ClientOnly.js +17 -0
  133. package/dist/client/ClientOnly.js.map +1 -0
  134. package/dist/client/CommandMenu.d.ts +71 -0
  135. package/dist/client/CommandMenu.d.ts.map +1 -0
  136. package/dist/client/CommandMenu.js +257 -0
  137. package/dist/client/CommandMenu.js.map +1 -0
  138. package/dist/client/DefaultSpinner.d.ts +7 -0
  139. package/dist/client/DefaultSpinner.d.ts.map +1 -0
  140. package/dist/client/DefaultSpinner.js +28 -0
  141. package/dist/client/DefaultSpinner.js.map +1 -0
  142. package/dist/client/MultiTabAssistantChat.d.ts +40 -2
  143. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  144. package/dist/client/MultiTabAssistantChat.js +630 -59
  145. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  146. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  147. package/dist/client/PoweredByBadge.js +4 -3
  148. package/dist/client/PoweredByBadge.js.map +1 -1
  149. package/dist/client/Turnstile.d.ts.map +1 -1
  150. package/dist/client/Turnstile.js +2 -3
  151. package/dist/client/Turnstile.js.map +1 -1
  152. package/dist/client/active-run-state.d.ts +10 -0
  153. package/dist/client/active-run-state.d.ts.map +1 -0
  154. package/dist/client/active-run-state.js +32 -0
  155. package/dist/client/active-run-state.js.map +1 -0
  156. package/dist/client/agent-chat-adapter.d.ts +2 -1
  157. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  158. package/dist/client/agent-chat-adapter.js +145 -130
  159. package/dist/client/agent-chat-adapter.js.map +1 -1
  160. package/dist/client/agent-chat.d.ts +14 -1
  161. package/dist/client/agent-chat.d.ts.map +1 -1
  162. package/dist/client/agent-chat.js +6 -4
  163. package/dist/client/agent-chat.js.map +1 -1
  164. package/dist/client/components/ApiKeySettings.d.ts +2 -2
  165. package/dist/client/components/ApiKeySettings.js +4 -4
  166. package/dist/client/components/ApiKeySettings.js.map +1 -1
  167. package/dist/client/components/CodeAgentIndicator.d.ts +14 -0
  168. package/dist/client/components/CodeAgentIndicator.d.ts.map +1 -0
  169. package/dist/client/components/CodeAgentIndicator.js +29 -0
  170. package/dist/client/components/CodeAgentIndicator.js.map +1 -0
  171. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  172. package/dist/client/components/CodeRequiredDialog.js +4 -3
  173. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  174. package/dist/client/composer/MentionPopover.d.ts +29 -0
  175. package/dist/client/composer/MentionPopover.d.ts.map +1 -0
  176. package/dist/client/composer/MentionPopover.js +160 -0
  177. package/dist/client/composer/MentionPopover.js.map +1 -0
  178. package/dist/client/composer/TiptapComposer.d.ts +26 -0
  179. package/dist/client/composer/TiptapComposer.d.ts.map +1 -0
  180. package/dist/client/composer/TiptapComposer.js +545 -0
  181. package/dist/client/composer/TiptapComposer.js.map +1 -0
  182. package/dist/client/composer/extensions/FileReference.d.ts +3 -0
  183. package/dist/client/composer/extensions/FileReference.d.ts.map +1 -0
  184. package/dist/client/composer/extensions/FileReference.js +36 -0
  185. package/dist/client/composer/extensions/FileReference.js.map +1 -0
  186. package/dist/client/composer/extensions/MentionReference.d.ts +3 -0
  187. package/dist/client/composer/extensions/MentionReference.d.ts.map +1 -0
  188. package/dist/client/composer/extensions/MentionReference.js +63 -0
  189. package/dist/client/composer/extensions/MentionReference.js.map +1 -0
  190. package/dist/client/composer/extensions/SkillReference.d.ts +3 -0
  191. package/dist/client/composer/extensions/SkillReference.d.ts.map +1 -0
  192. package/dist/client/composer/extensions/SkillReference.js +40 -0
  193. package/dist/client/composer/extensions/SkillReference.js.map +1 -0
  194. package/dist/client/composer/index.d.ts +8 -0
  195. package/dist/client/composer/index.d.ts.map +1 -0
  196. package/dist/client/composer/index.js +7 -0
  197. package/dist/client/composer/index.js.map +1 -0
  198. package/dist/client/composer/types.d.ts +37 -0
  199. package/dist/client/composer/types.d.ts.map +1 -0
  200. package/dist/client/composer/types.js +2 -0
  201. package/dist/client/composer/types.js.map +1 -0
  202. package/dist/client/composer/use-file-search.d.ts +6 -0
  203. package/dist/client/composer/use-file-search.d.ts.map +1 -0
  204. package/dist/client/composer/use-file-search.js +40 -0
  205. package/dist/client/composer/use-file-search.js.map +1 -0
  206. package/dist/client/composer/use-mention-search.d.ts +6 -0
  207. package/dist/client/composer/use-mention-search.d.ts.map +1 -0
  208. package/dist/client/composer/use-mention-search.js +72 -0
  209. package/dist/client/composer/use-mention-search.js.map +1 -0
  210. package/dist/client/composer/use-skills.d.ts +7 -0
  211. package/dist/client/composer/use-skills.d.ts.map +1 -0
  212. package/dist/client/composer/use-skills.js +38 -0
  213. package/dist/client/composer/use-skills.js.map +1 -0
  214. package/dist/client/frame-protocol.d.ts +54 -0
  215. package/dist/client/frame-protocol.d.ts.map +1 -0
  216. package/dist/client/frame-protocol.js +9 -0
  217. package/dist/client/frame-protocol.js.map +1 -0
  218. package/dist/client/frame.d.ts +56 -0
  219. package/dist/client/frame.d.ts.map +1 -0
  220. package/dist/client/{harness.js → frame.js} +49 -26
  221. package/dist/client/frame.js.map +1 -0
  222. package/dist/client/index.d.ts +15 -6
  223. package/dist/client/index.d.ts.map +1 -1
  224. package/dist/client/index.js +13 -5
  225. package/dist/client/index.js.map +1 -1
  226. package/dist/client/integrations/IntegrationCard.d.ts +6 -0
  227. package/dist/client/integrations/IntegrationCard.d.ts.map +1 -0
  228. package/dist/client/integrations/IntegrationCard.js +45 -0
  229. package/dist/client/integrations/IntegrationCard.js.map +1 -0
  230. package/dist/client/integrations/IntegrationsPanel.d.ts +2 -0
  231. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -0
  232. package/dist/client/integrations/IntegrationsPanel.js +149 -0
  233. package/dist/client/integrations/IntegrationsPanel.js.map +1 -0
  234. package/dist/client/integrations/index.d.ts +4 -0
  235. package/dist/client/integrations/index.d.ts.map +1 -0
  236. package/dist/client/integrations/index.js +3 -0
  237. package/dist/client/integrations/index.js.map +1 -0
  238. package/dist/client/integrations/useIntegrationStatus.d.ts +15 -0
  239. package/dist/client/integrations/useIntegrationStatus.d.ts.map +1 -0
  240. package/dist/client/integrations/useIntegrationStatus.js +37 -0
  241. package/dist/client/integrations/useIntegrationStatus.js.map +1 -0
  242. package/dist/client/org/InvitationBanner.d.ts +9 -0
  243. package/dist/client/org/InvitationBanner.d.ts.map +1 -0
  244. package/dist/client/org/InvitationBanner.js +17 -0
  245. package/dist/client/org/InvitationBanner.js.map +1 -0
  246. package/dist/client/org/OrgSwitcher.d.ts +14 -0
  247. package/dist/client/org/OrgSwitcher.d.ts.map +1 -0
  248. package/dist/client/org/OrgSwitcher.js +51 -0
  249. package/dist/client/org/OrgSwitcher.js.map +1 -0
  250. package/dist/client/org/TeamPage.d.ts +23 -0
  251. package/dist/client/org/TeamPage.d.ts.map +1 -0
  252. package/dist/client/org/TeamPage.js +145 -0
  253. package/dist/client/org/TeamPage.js.map +1 -0
  254. package/dist/client/org/hooks.d.ts +14 -0
  255. package/dist/client/org/hooks.d.ts.map +1 -0
  256. package/dist/client/org/hooks.js +101 -0
  257. package/dist/client/org/hooks.js.map +1 -0
  258. package/dist/client/org/index.d.ts +6 -0
  259. package/dist/client/org/index.d.ts.map +1 -0
  260. package/dist/client/org/index.js +6 -0
  261. package/dist/client/org/index.js.map +1 -0
  262. package/dist/client/resources/ResourceEditor.d.ts +14 -0
  263. package/dist/client/resources/ResourceEditor.d.ts.map +1 -0
  264. package/dist/client/resources/ResourceEditor.js +932 -0
  265. package/dist/client/resources/ResourceEditor.js.map +1 -0
  266. package/dist/client/resources/ResourceTree.d.ts +17 -0
  267. package/dist/client/resources/ResourceTree.d.ts.map +1 -0
  268. package/dist/client/resources/ResourceTree.js +137 -0
  269. package/dist/client/resources/ResourceTree.js.map +1 -0
  270. package/dist/client/resources/ResourcesPanel.d.ts +2 -0
  271. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -0
  272. package/dist/client/resources/ResourcesPanel.js +366 -0
  273. package/dist/client/resources/ResourcesPanel.js.map +1 -0
  274. package/dist/client/resources/index.d.ts +5 -0
  275. package/dist/client/resources/index.d.ts.map +1 -0
  276. package/dist/client/resources/index.js +5 -0
  277. package/dist/client/resources/index.js.map +1 -0
  278. package/dist/client/resources/use-resources.d.ts +55 -0
  279. package/dist/client/resources/use-resources.d.ts.map +1 -0
  280. package/dist/client/resources/use-resources.js +102 -0
  281. package/dist/client/resources/use-resources.js.map +1 -0
  282. package/dist/client/sse-event-processor.d.ts +58 -0
  283. package/dist/client/sse-event-processor.d.ts.map +1 -0
  284. package/dist/client/sse-event-processor.js +300 -0
  285. package/dist/client/sse-event-processor.js.map +1 -0
  286. package/dist/client/terminal/AgentTerminal.d.ts +5 -5
  287. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  288. package/dist/client/terminal/AgentTerminal.js +25 -20
  289. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  290. package/dist/client/use-action.d.ts +51 -0
  291. package/dist/client/use-action.d.ts.map +1 -0
  292. package/dist/client/use-action.js +102 -0
  293. package/dist/client/use-action.js.map +1 -0
  294. package/dist/client/use-agent-chat.d.ts +1 -1
  295. package/dist/client/use-agent-chat.d.ts.map +1 -1
  296. package/dist/client/use-agent-chat.js +3 -3
  297. package/dist/client/use-agent-chat.js.map +1 -1
  298. package/dist/client/use-avatar.d.ts +15 -0
  299. package/dist/client/use-avatar.d.ts.map +1 -0
  300. package/dist/client/use-avatar.js +116 -0
  301. package/dist/client/use-avatar.js.map +1 -0
  302. package/dist/client/use-chat-threads.d.ts +36 -0
  303. package/dist/client/use-chat-threads.d.ts.map +1 -0
  304. package/dist/client/use-chat-threads.js +191 -0
  305. package/dist/client/use-chat-threads.js.map +1 -0
  306. package/dist/client/use-db-sync.d.ts +35 -0
  307. package/dist/client/use-db-sync.d.ts.map +1 -0
  308. package/dist/client/use-db-sync.js +74 -0
  309. package/dist/client/use-db-sync.js.map +1 -0
  310. package/dist/client/use-dev-mode.d.ts +4 -2
  311. package/dist/client/use-dev-mode.d.ts.map +1 -1
  312. package/dist/client/use-dev-mode.js +41 -12
  313. package/dist/client/use-dev-mode.js.map +1 -1
  314. package/dist/client/use-send-to-agent-chat.d.ts +7 -4
  315. package/dist/client/use-send-to-agent-chat.d.ts.map +1 -1
  316. package/dist/client/use-send-to-agent-chat.js +31 -10
  317. package/dist/client/use-send-to-agent-chat.js.map +1 -1
  318. package/dist/client/use-session.d.ts +1 -1
  319. package/dist/client/use-session.js +2 -2
  320. package/dist/client/use-session.js.map +1 -1
  321. package/dist/client/useProductionAgent.d.ts +1 -1
  322. package/dist/client/useProductionAgent.d.ts.map +1 -1
  323. package/dist/client/useProductionAgent.js +38 -3
  324. package/dist/client/useProductionAgent.js.map +1 -1
  325. package/dist/collab/awareness.d.ts +41 -0
  326. package/dist/collab/awareness.d.ts.map +1 -0
  327. package/dist/collab/awareness.js +82 -0
  328. package/dist/collab/awareness.js.map +1 -0
  329. package/dist/collab/client.d.ts +49 -0
  330. package/dist/collab/client.d.ts.map +1 -0
  331. package/dist/collab/client.js +250 -0
  332. package/dist/collab/client.js.map +1 -0
  333. package/dist/collab/emitter.d.ts +12 -0
  334. package/dist/collab/emitter.d.ts.map +1 -0
  335. package/dist/collab/emitter.js +16 -0
  336. package/dist/collab/emitter.js.map +1 -0
  337. package/dist/collab/index.d.ts +7 -0
  338. package/dist/collab/index.d.ts.map +1 -0
  339. package/dist/collab/index.js +14 -0
  340. package/dist/collab/index.js.map +1 -0
  341. package/dist/collab/routes.d.ts +69 -0
  342. package/dist/collab/routes.d.ts.map +1 -0
  343. package/dist/collab/routes.js +98 -0
  344. package/dist/collab/routes.js.map +1 -0
  345. package/dist/collab/storage.d.ts +18 -0
  346. package/dist/collab/storage.d.ts.map +1 -0
  347. package/dist/collab/storage.js +94 -0
  348. package/dist/collab/storage.js.map +1 -0
  349. package/dist/collab/text-to-yjs.d.ts +23 -0
  350. package/dist/collab/text-to-yjs.d.ts.map +1 -0
  351. package/dist/collab/text-to-yjs.js +63 -0
  352. package/dist/collab/text-to-yjs.js.map +1 -0
  353. package/dist/collab/xml-ops.d.ts +20 -0
  354. package/dist/collab/xml-ops.d.ts.map +1 -0
  355. package/dist/collab/xml-ops.js +59 -0
  356. package/dist/collab/xml-ops.js.map +1 -0
  357. package/dist/collab/ydoc-manager.d.ts +52 -0
  358. package/dist/collab/ydoc-manager.d.ts.map +1 -0
  359. package/dist/collab/ydoc-manager.js +154 -0
  360. package/dist/collab/ydoc-manager.js.map +1 -0
  361. package/dist/credentials/index.d.ts +18 -0
  362. package/dist/credentials/index.d.ts.map +1 -0
  363. package/dist/credentials/index.js +32 -0
  364. package/dist/credentials/index.js.map +1 -0
  365. package/dist/db/client.d.ts +45 -0
  366. package/dist/db/client.d.ts.map +1 -0
  367. package/dist/db/client.js +289 -0
  368. package/dist/db/client.js.map +1 -0
  369. package/dist/db/create-get-db.d.ts.map +1 -1
  370. package/dist/db/create-get-db.js +103 -16
  371. package/dist/db/create-get-db.js.map +1 -1
  372. package/dist/db/index.d.ts +10 -6
  373. package/dist/db/index.d.ts.map +1 -1
  374. package/dist/db/index.js +10 -4
  375. package/dist/db/index.js.map +1 -1
  376. package/dist/db/migrations.d.ts +9 -1
  377. package/dist/db/migrations.d.ts.map +1 -1
  378. package/dist/db/migrations.js +67 -41
  379. package/dist/db/migrations.js.map +1 -1
  380. package/dist/db/schema.d.ts +52 -0
  381. package/dist/db/schema.d.ts.map +1 -0
  382. package/dist/db/schema.js +72 -0
  383. package/dist/db/schema.js.map +1 -0
  384. package/dist/deploy/build.js +636 -42
  385. package/dist/deploy/build.js.map +1 -1
  386. package/dist/deploy/route-discovery.d.ts +25 -3
  387. package/dist/deploy/route-discovery.d.ts.map +1 -1
  388. package/dist/deploy/route-discovery.js +135 -24
  389. package/dist/deploy/route-discovery.js.map +1 -1
  390. package/dist/index.browser.d.ts +3 -1
  391. package/dist/index.browser.d.ts.map +1 -1
  392. package/dist/index.browser.js +5 -1
  393. package/dist/index.browser.js.map +1 -1
  394. package/dist/index.d.ts +4 -3
  395. package/dist/index.d.ts.map +1 -1
  396. package/dist/index.js +3 -2
  397. package/dist/index.js.map +1 -1
  398. package/dist/integrations/adapters/slack.d.ts +10 -0
  399. package/dist/integrations/adapters/slack.d.ts.map +1 -0
  400. package/dist/integrations/adapters/slack.js +215 -0
  401. package/dist/integrations/adapters/slack.js.map +1 -0
  402. package/dist/integrations/adapters/telegram.d.ts +12 -0
  403. package/dist/integrations/adapters/telegram.d.ts.map +1 -0
  404. package/dist/integrations/adapters/telegram.js +184 -0
  405. package/dist/integrations/adapters/telegram.js.map +1 -0
  406. package/dist/integrations/adapters/whatsapp.d.ts +14 -0
  407. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -0
  408. package/dist/integrations/adapters/whatsapp.js +205 -0
  409. package/dist/integrations/adapters/whatsapp.js.map +1 -0
  410. package/dist/integrations/config-store.d.ts +24 -0
  411. package/dist/integrations/config-store.d.ts.map +1 -0
  412. package/dist/integrations/config-store.js +92 -0
  413. package/dist/integrations/config-store.js.map +1 -0
  414. package/dist/integrations/index.d.ts +8 -0
  415. package/dist/integrations/index.d.ts.map +1 -0
  416. package/dist/integrations/index.js +10 -0
  417. package/dist/integrations/index.js.map +1 -0
  418. package/dist/integrations/plugin.d.ts +20 -0
  419. package/dist/integrations/plugin.d.ts.map +1 -0
  420. package/dist/integrations/plugin.js +213 -0
  421. package/dist/integrations/plugin.js.map +1 -0
  422. package/dist/integrations/thread-mapping-store.d.ts +25 -0
  423. package/dist/integrations/thread-mapping-store.d.ts.map +1 -0
  424. package/dist/integrations/thread-mapping-store.js +95 -0
  425. package/dist/integrations/thread-mapping-store.js.map +1 -0
  426. package/dist/integrations/types.d.ts +111 -0
  427. package/dist/integrations/types.d.ts.map +1 -0
  428. package/dist/integrations/types.js +2 -0
  429. package/dist/integrations/types.js.map +1 -0
  430. package/dist/integrations/webhook-handler.d.ts +31 -0
  431. package/dist/integrations/webhook-handler.d.ts.map +1 -0
  432. package/dist/integrations/webhook-handler.js +210 -0
  433. package/dist/integrations/webhook-handler.js.map +1 -0
  434. package/dist/jobs/cron.d.ts +14 -0
  435. package/dist/jobs/cron.d.ts.map +1 -0
  436. package/dist/jobs/cron.js +100 -0
  437. package/dist/jobs/cron.js.map +1 -0
  438. package/dist/jobs/index.d.ts +4 -0
  439. package/dist/jobs/index.d.ts.map +1 -0
  440. package/dist/jobs/index.js +4 -0
  441. package/dist/jobs/index.js.map +1 -0
  442. package/dist/jobs/scheduler.d.ts +29 -0
  443. package/dist/jobs/scheduler.d.ts.map +1 -0
  444. package/dist/jobs/scheduler.js +205 -0
  445. package/dist/jobs/scheduler.js.map +1 -0
  446. package/dist/jobs/tools.d.ts +3 -0
  447. package/dist/jobs/tools.d.ts.map +1 -0
  448. package/dist/jobs/tools.js +192 -0
  449. package/dist/jobs/tools.js.map +1 -0
  450. package/dist/mcp/index.d.ts +3 -0
  451. package/dist/mcp/index.d.ts.map +1 -0
  452. package/dist/mcp/index.js +2 -0
  453. package/dist/mcp/index.js.map +1 -0
  454. package/dist/mcp/server.d.ts +26 -0
  455. package/dist/mcp/server.d.ts.map +1 -0
  456. package/dist/mcp/server.js +182 -0
  457. package/dist/mcp/server.js.map +1 -0
  458. package/dist/oauth-tokens/index.d.ts +1 -1
  459. package/dist/oauth-tokens/index.d.ts.map +1 -1
  460. package/dist/oauth-tokens/index.js +1 -1
  461. package/dist/oauth-tokens/index.js.map +1 -1
  462. package/dist/oauth-tokens/store.d.ts +5 -0
  463. package/dist/oauth-tokens/store.d.ts.map +1 -1
  464. package/dist/oauth-tokens/store.js +67 -82
  465. package/dist/oauth-tokens/store.js.map +1 -1
  466. package/dist/org/context.d.ts +11 -0
  467. package/dist/org/context.d.ts.map +1 -0
  468. package/dist/org/context.js +61 -0
  469. package/dist/org/context.js.map +1 -0
  470. package/dist/org/handlers.d.ts +66 -0
  471. package/dist/org/handlers.d.ts.map +1 -0
  472. package/dist/org/handlers.js +306 -0
  473. package/dist/org/handlers.js.map +1 -0
  474. package/dist/org/index.d.ts +7 -0
  475. package/dist/org/index.d.ts.map +1 -0
  476. package/dist/org/index.js +11 -0
  477. package/dist/org/index.js.map +1 -0
  478. package/dist/org/migrations.d.ts +10 -0
  479. package/dist/org/migrations.d.ts.map +1 -0
  480. package/dist/org/migrations.js +39 -0
  481. package/dist/org/migrations.js.map +1 -0
  482. package/dist/org/plugin.d.ts +26 -0
  483. package/dist/org/plugin.d.ts.map +1 -0
  484. package/dist/org/plugin.js +94 -0
  485. package/dist/org/plugin.js.map +1 -0
  486. package/dist/org/schema.d.ts +301 -0
  487. package/dist/org/schema.d.ts.map +1 -0
  488. package/dist/org/schema.js +23 -0
  489. package/dist/org/schema.js.map +1 -0
  490. package/dist/org/types.d.ts +42 -0
  491. package/dist/org/types.d.ts.map +1 -0
  492. package/dist/org/types.js +5 -0
  493. package/dist/org/types.js.map +1 -0
  494. package/dist/resources/emitter.d.ts +13 -0
  495. package/dist/resources/emitter.d.ts.map +1 -0
  496. package/dist/resources/emitter.js +32 -0
  497. package/dist/resources/emitter.js.map +1 -0
  498. package/dist/resources/handlers.d.ts +54 -0
  499. package/dist/resources/handlers.d.ts.map +1 -0
  500. package/dist/resources/handlers.js +292 -0
  501. package/dist/resources/handlers.js.map +1 -0
  502. package/dist/resources/index.d.ts +5 -0
  503. package/dist/resources/index.d.ts.map +1 -0
  504. package/dist/resources/index.js +5 -0
  505. package/dist/resources/index.js.map +1 -0
  506. package/dist/resources/script-helpers.d.ts +24 -0
  507. package/dist/resources/script-helpers.d.ts.map +1 -0
  508. package/dist/resources/script-helpers.js +36 -0
  509. package/dist/resources/script-helpers.js.map +1 -0
  510. package/dist/resources/store.d.ts +40 -0
  511. package/dist/resources/store.d.ts.map +1 -0
  512. package/dist/resources/store.js +497 -0
  513. package/dist/resources/store.js.map +1 -0
  514. package/dist/scripts/agent-engines/list-agent-engines.d.ts +7 -0
  515. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -0
  516. package/dist/scripts/agent-engines/list-agent-engines.js +42 -0
  517. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -0
  518. package/dist/scripts/agent-engines/set-agent-engine.d.ts +7 -0
  519. package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -0
  520. package/dist/scripts/agent-engines/set-agent-engine.js +57 -0
  521. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -0
  522. package/dist/scripts/agent-engines/test-agent-engine.d.ts +7 -0
  523. package/dist/scripts/agent-engines/test-agent-engine.d.ts.map +1 -0
  524. package/dist/scripts/agent-engines/test-agent-engine.js +102 -0
  525. package/dist/scripts/agent-engines/test-agent-engine.js.map +1 -0
  526. package/dist/scripts/call-agent.d.ts +5 -0
  527. package/dist/scripts/call-agent.d.ts.map +1 -0
  528. package/dist/scripts/call-agent.js +111 -0
  529. package/dist/scripts/call-agent.js.map +1 -0
  530. package/dist/scripts/chat/index.d.ts +2 -0
  531. package/dist/scripts/chat/index.d.ts.map +1 -0
  532. package/dist/scripts/chat/index.js +5 -0
  533. package/dist/scripts/chat/index.js.map +1 -0
  534. package/dist/scripts/chat/open-chat.d.ts +11 -0
  535. package/dist/scripts/chat/open-chat.d.ts.map +1 -0
  536. package/dist/scripts/chat/open-chat.js +48 -0
  537. package/dist/scripts/chat/open-chat.js.map +1 -0
  538. package/dist/scripts/chat/search-chats.d.ts +10 -0
  539. package/dist/scripts/chat/search-chats.d.ts.map +1 -0
  540. package/dist/scripts/chat/search-chats.js +89 -0
  541. package/dist/scripts/chat/search-chats.js.map +1 -0
  542. package/dist/scripts/core-scripts.d.ts.map +1 -1
  543. package/dist/scripts/core-scripts.js +4 -0
  544. package/dist/scripts/core-scripts.js.map +1 -1
  545. package/dist/scripts/db/check-scoping.d.ts +14 -0
  546. package/dist/scripts/db/check-scoping.d.ts.map +1 -0
  547. package/dist/scripts/db/check-scoping.js +174 -0
  548. package/dist/scripts/db/check-scoping.js.map +1 -0
  549. package/dist/scripts/db/exec.d.ts +7 -2
  550. package/dist/scripts/db/exec.d.ts.map +1 -1
  551. package/dist/scripts/db/exec.js +143 -36
  552. package/dist/scripts/db/exec.js.map +1 -1
  553. package/dist/scripts/db/index.d.ts.map +1 -1
  554. package/dist/scripts/db/index.js +2 -0
  555. package/dist/scripts/db/index.js.map +1 -1
  556. package/dist/scripts/db/patch.d.ts +50 -0
  557. package/dist/scripts/db/patch.d.ts.map +1 -0
  558. package/dist/scripts/db/patch.js +392 -0
  559. package/dist/scripts/db/patch.js.map +1 -0
  560. package/dist/scripts/db/query.d.ts +7 -2
  561. package/dist/scripts/db/query.d.ts.map +1 -1
  562. package/dist/scripts/db/query.js +89 -45
  563. package/dist/scripts/db/query.js.map +1 -1
  564. package/dist/scripts/db/schema.d.ts +2 -2
  565. package/dist/scripts/db/schema.d.ts.map +1 -1
  566. package/dist/scripts/db/schema.js +145 -6
  567. package/dist/scripts/db/schema.js.map +1 -1
  568. package/dist/scripts/db/scoping.d.ts +42 -0
  569. package/dist/scripts/db/scoping.d.ts.map +1 -0
  570. package/dist/scripts/db/scoping.js +216 -0
  571. package/dist/scripts/db/scoping.js.map +1 -0
  572. package/dist/scripts/dev/index.d.ts +2 -2
  573. package/dist/scripts/dev/index.d.ts.map +1 -1
  574. package/dist/scripts/dev/index.js +65 -2
  575. package/dist/scripts/dev/index.js.map +1 -1
  576. package/dist/scripts/dev/list-files.d.ts +2 -2
  577. package/dist/scripts/dev/read-file.d.ts +2 -2
  578. package/dist/scripts/dev/read-file.js +1 -1
  579. package/dist/scripts/dev/read-file.js.map +1 -1
  580. package/dist/scripts/dev/search-files.d.ts +2 -2
  581. package/dist/scripts/dev/search-files.js +1 -1
  582. package/dist/scripts/dev/search-files.js.map +1 -1
  583. package/dist/scripts/dev/shell.d.ts +2 -2
  584. package/dist/scripts/dev/shell.js +1 -1
  585. package/dist/scripts/dev/shell.js.map +1 -1
  586. package/dist/scripts/dev/write-file.d.ts +2 -2
  587. package/dist/scripts/dev/write-file.js +1 -1
  588. package/dist/scripts/dev/write-file.js.map +1 -1
  589. package/dist/scripts/parse-args.d.ts +14 -0
  590. package/dist/scripts/parse-args.d.ts.map +1 -0
  591. package/dist/scripts/parse-args.js +45 -0
  592. package/dist/scripts/parse-args.js.map +1 -0
  593. package/dist/scripts/resources/delete.d.ts +10 -0
  594. package/dist/scripts/resources/delete.d.ts.map +1 -0
  595. package/dist/scripts/resources/delete.js +38 -0
  596. package/dist/scripts/resources/delete.js.map +1 -0
  597. package/dist/scripts/resources/index.d.ts +2 -0
  598. package/dist/scripts/resources/index.d.ts.map +1 -0
  599. package/dist/scripts/resources/index.js +8 -0
  600. package/dist/scripts/resources/index.js.map +1 -0
  601. package/dist/scripts/resources/list.d.ts +10 -0
  602. package/dist/scripts/resources/list.d.ts.map +1 -0
  603. package/dist/scripts/resources/list.js +57 -0
  604. package/dist/scripts/resources/list.js.map +1 -0
  605. package/dist/scripts/resources/migrate-learnings.d.ts +10 -0
  606. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -0
  607. package/dist/scripts/resources/migrate-learnings.js +23 -0
  608. package/dist/scripts/resources/migrate-learnings.js.map +1 -0
  609. package/dist/scripts/resources/read.d.ts +10 -0
  610. package/dist/scripts/resources/read.d.ts.map +1 -0
  611. package/dist/scripts/resources/read.js +59 -0
  612. package/dist/scripts/resources/read.js.map +1 -0
  613. package/dist/scripts/resources/write.d.ts +10 -0
  614. package/dist/scripts/resources/write.d.ts.map +1 -0
  615. package/dist/scripts/resources/write.js +67 -0
  616. package/dist/scripts/resources/write.js.map +1 -0
  617. package/dist/scripts/runner.d.ts +7 -7
  618. package/dist/scripts/runner.d.ts.map +1 -1
  619. package/dist/scripts/runner.js +78 -29
  620. package/dist/scripts/runner.js.map +1 -1
  621. package/dist/scripts/utils.d.ts +5 -10
  622. package/dist/scripts/utils.d.ts.map +1 -1
  623. package/dist/scripts/utils.js +7 -43
  624. package/dist/scripts/utils.js.map +1 -1
  625. package/dist/server/action-discovery.d.ts +40 -0
  626. package/dist/server/action-discovery.d.ts.map +1 -0
  627. package/dist/server/action-discovery.js +257 -0
  628. package/dist/server/action-discovery.js.map +1 -0
  629. package/dist/server/action-routes.d.ts +15 -0
  630. package/dist/server/action-routes.d.ts.map +1 -0
  631. package/dist/server/action-routes.js +105 -0
  632. package/dist/server/action-routes.js.map +1 -0
  633. package/dist/server/agent-chat-plugin.d.ts +32 -23
  634. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  635. package/dist/server/agent-chat-plugin.js +1983 -39
  636. package/dist/server/agent-chat-plugin.js.map +1 -1
  637. package/dist/server/agent-discovery.d.ts +21 -0
  638. package/dist/server/agent-discovery.d.ts.map +1 -0
  639. package/dist/server/agent-discovery.js +197 -0
  640. package/dist/server/agent-discovery.js.map +1 -0
  641. package/dist/server/agent-teams.d.ts +70 -0
  642. package/dist/server/agent-teams.d.ts.map +1 -0
  643. package/dist/server/agent-teams.js +367 -0
  644. package/dist/server/agent-teams.js.map +1 -0
  645. package/dist/server/agents-bundle.d.ts +87 -0
  646. package/dist/server/agents-bundle.d.ts.map +1 -0
  647. package/dist/server/agents-bundle.js +231 -0
  648. package/dist/server/agents-bundle.js.map +1 -0
  649. package/dist/server/auth-plugin.d.ts +5 -0
  650. package/dist/server/auth-plugin.d.ts.map +1 -1
  651. package/dist/server/auth-plugin.js +13 -3
  652. package/dist/server/auth-plugin.js.map +1 -1
  653. package/dist/server/auth.d.ts +54 -31
  654. package/dist/server/auth.d.ts.map +1 -1
  655. package/dist/server/auth.js +671 -294
  656. package/dist/server/auth.js.map +1 -1
  657. package/dist/server/better-auth-instance.d.ts +72 -0
  658. package/dist/server/better-auth-instance.d.ts.map +1 -0
  659. package/dist/server/better-auth-instance.js +144 -0
  660. package/dist/server/better-auth-instance.js.map +1 -0
  661. package/dist/server/collab-plugin.d.ts +29 -0
  662. package/dist/server/collab-plugin.d.ts.map +1 -0
  663. package/dist/server/collab-plugin.js +85 -0
  664. package/dist/server/collab-plugin.js.map +1 -0
  665. package/dist/server/core-routes-plugin.d.ts +54 -0
  666. package/dist/server/core-routes-plugin.d.ts.map +1 -0
  667. package/dist/server/core-routes-plugin.js +195 -0
  668. package/dist/server/core-routes-plugin.js.map +1 -0
  669. package/dist/server/create-server.d.ts +5 -5
  670. package/dist/server/create-server.d.ts.map +1 -1
  671. package/dist/server/create-server.js +44 -21
  672. package/dist/server/create-server.js.map +1 -1
  673. package/dist/server/framework-request-handler.d.ts +47 -0
  674. package/dist/server/framework-request-handler.d.ts.map +1 -0
  675. package/dist/server/framework-request-handler.js +168 -0
  676. package/dist/server/framework-request-handler.js.map +1 -0
  677. package/dist/server/google-auth-plugin.d.ts +4 -0
  678. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  679. package/dist/server/google-auth-plugin.js +16 -15
  680. package/dist/server/google-auth-plugin.js.map +1 -1
  681. package/dist/server/google-oauth.d.ts +72 -0
  682. package/dist/server/google-oauth.d.ts.map +1 -0
  683. package/dist/server/google-oauth.js +209 -0
  684. package/dist/server/google-oauth.js.map +1 -0
  685. package/dist/server/h3-helpers.d.ts +23 -0
  686. package/dist/server/h3-helpers.d.ts.map +1 -0
  687. package/dist/server/h3-helpers.js +37 -0
  688. package/dist/server/h3-helpers.js.map +1 -0
  689. package/dist/server/index.d.ts +17 -5
  690. package/dist/server/index.d.ts.map +1 -1
  691. package/dist/server/index.js +19 -4
  692. package/dist/server/index.js.map +1 -1
  693. package/dist/server/local-migration.d.ts +32 -0
  694. package/dist/server/local-migration.d.ts.map +1 -0
  695. package/dist/server/local-migration.js +205 -0
  696. package/dist/server/local-migration.js.map +1 -0
  697. package/dist/server/oauth-helpers.d.ts +14 -0
  698. package/dist/server/oauth-helpers.d.ts.map +1 -0
  699. package/dist/server/oauth-helpers.js +23 -0
  700. package/dist/server/oauth-helpers.js.map +1 -0
  701. package/dist/server/onboarding-html.d.ts +24 -0
  702. package/dist/server/onboarding-html.d.ts.map +1 -0
  703. package/dist/server/onboarding-html.js +347 -0
  704. package/dist/server/onboarding-html.js.map +1 -0
  705. package/dist/server/poll.d.ts +45 -0
  706. package/dist/server/poll.d.ts.map +1 -0
  707. package/dist/server/poll.js +96 -0
  708. package/dist/server/poll.js.map +1 -0
  709. package/dist/server/resources-plugin.d.ts +27 -0
  710. package/dist/server/resources-plugin.d.ts.map +1 -0
  711. package/dist/server/resources-plugin.js +75 -0
  712. package/dist/server/resources-plugin.js.map +1 -0
  713. package/dist/server/schema-prompt.d.ts +16 -0
  714. package/dist/server/schema-prompt.d.ts.map +1 -0
  715. package/dist/server/schema-prompt.js +275 -0
  716. package/dist/server/schema-prompt.js.map +1 -0
  717. package/dist/server/script-discovery.d.ts +6 -0
  718. package/dist/server/script-discovery.d.ts.map +1 -0
  719. package/dist/server/script-discovery.js +6 -0
  720. package/dist/server/script-discovery.js.map +1 -0
  721. package/dist/server/sse.d.ts +4 -21
  722. package/dist/server/sse.d.ts.map +1 -1
  723. package/dist/server/sse.js +2 -30
  724. package/dist/server/sse.js.map +1 -1
  725. package/dist/server/ssr-handler.d.ts +6 -0
  726. package/dist/server/ssr-handler.d.ts.map +1 -0
  727. package/dist/server/ssr-handler.js +55 -0
  728. package/dist/server/ssr-handler.js.map +1 -0
  729. package/dist/settings/handlers.d.ts +6 -6
  730. package/dist/settings/handlers.d.ts.map +1 -1
  731. package/dist/settings/handlers.js +9 -6
  732. package/dist/settings/handlers.js.map +1 -1
  733. package/dist/settings/index.d.ts +2 -1
  734. package/dist/settings/index.d.ts.map +1 -1
  735. package/dist/settings/index.js +2 -0
  736. package/dist/settings/index.js.map +1 -1
  737. package/dist/settings/org-settings.d.ts +22 -0
  738. package/dist/settings/org-settings.d.ts.map +1 -0
  739. package/dist/settings/org-settings.js +45 -0
  740. package/dist/settings/org-settings.js.map +1 -0
  741. package/dist/settings/store.d.ts +6 -2
  742. package/dist/settings/store.d.ts.map +1 -1
  743. package/dist/settings/store.js +26 -63
  744. package/dist/settings/store.js.map +1 -1
  745. package/dist/settings/user-settings.d.ts +3 -2
  746. package/dist/settings/user-settings.d.ts.map +1 -1
  747. package/dist/settings/user-settings.js +5 -5
  748. package/dist/settings/user-settings.js.map +1 -1
  749. package/dist/shared/agent-chat.d.ts +5 -5
  750. package/dist/shared/agent-chat.d.ts.map +1 -1
  751. package/dist/shared/agent-chat.js +8 -8
  752. package/dist/shared/agent-chat.js.map +1 -1
  753. package/dist/shared/agent-env.d.ts +1 -1
  754. package/dist/shared/agent-env.js +1 -1
  755. package/dist/shared/runtime.d.ts +14 -0
  756. package/dist/shared/runtime.d.ts.map +1 -0
  757. package/dist/shared/runtime.js +25 -0
  758. package/dist/shared/runtime.js.map +1 -0
  759. package/dist/tailwind.preset.d.ts +7 -6
  760. package/dist/tailwind.preset.d.ts.map +1 -1
  761. package/dist/tailwind.preset.js +18 -1
  762. package/dist/tailwind.preset.js.map +1 -1
  763. package/dist/templates/default/.agents/skills/actions/SKILL.md +142 -0
  764. package/dist/templates/default/.agents/skills/agent-engines/SKILL.md +127 -0
  765. package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +50 -0
  766. package/dist/templates/default/.agents/skills/create-skill/SKILL.md +167 -0
  767. package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +90 -0
  768. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +69 -0
  769. package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +183 -0
  770. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +112 -0
  771. package/dist/templates/default/.agents/skills/security/SKILL.md +108 -0
  772. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +79 -0
  773. package/{src/templates/default/.agents/skills/files-as-database → dist/templates/default/.agents/skills/storing-data}/SKILL.md +2 -2
  774. package/dist/templates/default/.claude/settings.json +100 -0
  775. package/dist/templates/default/.env.example +5 -0
  776. package/dist/templates/default/.prettierrc +5 -0
  777. package/dist/templates/default/AGENTS.md +110 -0
  778. package/dist/templates/default/DEVELOPING.md +117 -0
  779. package/dist/templates/default/_gitignore +37 -0
  780. package/{src/templates/default/scripts → dist/templates/default/actions}/hello.ts +1 -1
  781. package/dist/templates/default/actions/navigate.ts +53 -0
  782. package/dist/templates/default/actions/view-screen.ts +39 -0
  783. package/dist/templates/default/app/entry.client.tsx +4 -0
  784. package/dist/templates/default/app/entry.server.tsx +56 -0
  785. package/dist/templates/default/app/global.css +95 -0
  786. package/dist/templates/default/app/lib/utils.ts +1 -0
  787. package/dist/templates/default/app/root.tsx +107 -0
  788. package/dist/templates/default/app/routes/_index.tsx +62 -0
  789. package/dist/templates/default/app/routes.ts +4 -0
  790. package/dist/templates/default/app/vite-env.d.ts +6 -0
  791. package/dist/templates/default/components.json +20 -0
  792. package/dist/templates/default/data/.gitkeep +0 -0
  793. package/dist/templates/default/data/sync-config.json +1 -0
  794. package/dist/templates/default/learnings.defaults.md +5 -0
  795. package/dist/templates/default/learnings.md +0 -0
  796. package/dist/templates/default/package.json +46 -0
  797. package/dist/templates/default/postcss.config.js +6 -0
  798. package/dist/templates/default/public/icon-180.svg +4 -0
  799. package/dist/templates/default/public/icon-192.svg +4 -0
  800. package/dist/templates/default/public/icon-512.svg +4 -0
  801. package/dist/templates/default/public/manifest.json +13 -0
  802. package/dist/templates/default/react-router.config.ts +6 -0
  803. package/dist/templates/default/server/middleware/auth.ts +15 -0
  804. package/dist/templates/default/server/plugins/.gitkeep +0 -0
  805. package/dist/templates/default/server/routes/[...page].get.ts +5 -0
  806. package/dist/templates/default/server/routes/api/hello.get.ts +5 -0
  807. package/dist/templates/default/shared/api.ts +6 -0
  808. package/dist/templates/default/ssr-entry.ts +20 -0
  809. package/dist/templates/default/tailwind.config.ts +7 -0
  810. package/dist/templates/default/tsconfig.json +11 -0
  811. package/dist/templates/default/vite.config.ts +6 -0
  812. package/dist/templates/templates/default/.agents/skills/actions/SKILL.md +142 -0
  813. package/dist/templates/templates/default/.agents/skills/agent-engines/SKILL.md +127 -0
  814. package/dist/templates/templates/default/.agents/skills/capture-learnings/SKILL.md +50 -0
  815. package/dist/templates/templates/default/.agents/skills/create-skill/SKILL.md +167 -0
  816. package/dist/templates/templates/default/.agents/skills/delegate-to-agent/SKILL.md +90 -0
  817. package/dist/templates/templates/default/.agents/skills/frontend-design/SKILL.md +69 -0
  818. package/dist/templates/templates/default/.agents/skills/real-time-collab/SKILL.md +183 -0
  819. package/dist/templates/templates/default/.agents/skills/real-time-sync/SKILL.md +112 -0
  820. package/dist/templates/templates/default/.agents/skills/security/SKILL.md +108 -0
  821. package/dist/templates/templates/default/.agents/skills/self-modifying-code/SKILL.md +79 -0
  822. package/dist/templates/templates/default/.agents/skills/storing-data/SKILL.md +110 -0
  823. package/dist/templates/templates/default/.claude/settings.json +100 -0
  824. package/dist/templates/templates/default/.env.example +5 -0
  825. package/dist/templates/templates/default/.ignore +0 -0
  826. package/dist/templates/templates/default/.prettierrc +5 -0
  827. package/dist/templates/templates/default/AGENTS.md +110 -0
  828. package/dist/templates/templates/default/DEVELOPING.md +117 -0
  829. package/dist/templates/templates/default/_gitignore +37 -0
  830. package/dist/templates/templates/default/actions/hello.ts +20 -0
  831. package/dist/templates/templates/default/actions/navigate.ts +53 -0
  832. package/dist/templates/templates/default/actions/run.ts +2 -0
  833. package/dist/templates/templates/default/actions/view-screen.ts +39 -0
  834. package/dist/templates/templates/default/app/entry.client.tsx +4 -0
  835. package/dist/templates/templates/default/app/entry.server.tsx +56 -0
  836. package/dist/templates/templates/default/app/global.css +95 -0
  837. package/dist/templates/templates/default/app/lib/utils.ts +1 -0
  838. package/dist/templates/templates/default/app/root.tsx +107 -0
  839. package/dist/templates/templates/default/app/routes/_index.tsx +62 -0
  840. package/dist/templates/templates/default/app/routes.ts +4 -0
  841. package/dist/templates/templates/default/app/vite-env.d.ts +6 -0
  842. package/dist/templates/templates/default/components.json +20 -0
  843. package/dist/templates/templates/default/data/.gitkeep +0 -0
  844. package/dist/templates/templates/default/data/sync-config.json +1 -0
  845. package/dist/templates/templates/default/learnings.defaults.md +5 -0
  846. package/dist/templates/templates/default/learnings.md +0 -0
  847. package/dist/templates/templates/default/package.json +46 -0
  848. package/dist/templates/templates/default/postcss.config.js +6 -0
  849. package/dist/templates/templates/default/public/icon-180.svg +4 -0
  850. package/dist/templates/templates/default/public/icon-192.svg +4 -0
  851. package/dist/templates/templates/default/public/icon-512.svg +4 -0
  852. package/dist/templates/templates/default/public/manifest.json +13 -0
  853. package/dist/templates/templates/default/react-router.config.ts +6 -0
  854. package/dist/templates/templates/default/server/middleware/auth.ts +15 -0
  855. package/dist/templates/templates/default/server/plugins/.gitkeep +0 -0
  856. package/dist/templates/templates/default/server/routes/[...page].get.ts +5 -0
  857. package/dist/templates/templates/default/server/routes/api/hello.get.ts +5 -0
  858. package/dist/templates/templates/default/shared/api.ts +6 -0
  859. package/dist/templates/templates/default/ssr-entry.ts +20 -0
  860. package/dist/templates/templates/default/tailwind.config.ts +7 -0
  861. package/dist/templates/templates/default/tsconfig.json +11 -0
  862. package/dist/templates/templates/default/vite.config.ts +6 -0
  863. package/dist/terminal/cli-registry.d.ts +2 -2
  864. package/dist/terminal/cli-registry.d.ts.map +1 -1
  865. package/dist/terminal/cli-registry.js +8 -8
  866. package/dist/terminal/cli-registry.js.map +1 -1
  867. package/dist/terminal/pty-server.d.ts +1 -1
  868. package/dist/terminal/pty-server.d.ts.map +1 -1
  869. package/dist/terminal/pty-server.js +94 -18
  870. package/dist/terminal/pty-server.js.map +1 -1
  871. package/dist/terminal/terminal-plugin.d.ts +1 -10
  872. package/dist/terminal/terminal-plugin.d.ts.map +1 -1
  873. package/dist/terminal/terminal-plugin.js +77 -28
  874. package/dist/terminal/terminal-plugin.js.map +1 -1
  875. package/dist/usage/store.d.ts +29 -0
  876. package/dist/usage/store.d.ts.map +1 -0
  877. package/dist/usage/store.js +102 -0
  878. package/dist/usage/store.js.map +1 -0
  879. package/dist/vite/action-types-plugin.d.ts +13 -0
  880. package/dist/vite/action-types-plugin.d.ts.map +1 -0
  881. package/dist/vite/action-types-plugin.js +132 -0
  882. package/dist/vite/action-types-plugin.js.map +1 -0
  883. package/dist/vite/agents-bundle-plugin.d.ts +3 -0
  884. package/dist/vite/agents-bundle-plugin.d.ts.map +1 -0
  885. package/dist/vite/agents-bundle-plugin.js +87 -0
  886. package/dist/vite/agents-bundle-plugin.js.map +1 -0
  887. package/dist/vite/client.d.ts +5 -0
  888. package/dist/vite/client.d.ts.map +1 -1
  889. package/dist/vite/client.js +310 -19
  890. package/dist/vite/client.js.map +1 -1
  891. package/dist/vite/index.d.ts +2 -1
  892. package/dist/vite/index.d.ts.map +1 -1
  893. package/dist/vite/index.js +2 -1
  894. package/dist/vite/index.js.map +1 -1
  895. package/package.json +78 -14
  896. package/src/templates/default/.agents/skills/actions/SKILL.md +142 -0
  897. package/src/templates/default/.agents/skills/agent-engines/SKILL.md +127 -0
  898. package/src/templates/default/.agents/skills/create-skill/SKILL.md +1 -1
  899. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +1 -1
  900. package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +183 -0
  901. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +112 -0
  902. package/src/templates/default/.agents/skills/security/SKILL.md +108 -0
  903. package/src/templates/default/.agents/skills/storing-data/SKILL.md +110 -0
  904. package/src/templates/default/.claude/settings.json +13 -0
  905. package/src/templates/default/AGENTS.md +72 -164
  906. package/src/templates/default/DEVELOPING.md +117 -0
  907. package/src/templates/default/actions/hello.ts +20 -0
  908. package/src/templates/default/actions/navigate.ts +53 -0
  909. package/src/templates/default/actions/run.ts +2 -0
  910. package/src/templates/default/actions/view-screen.ts +39 -0
  911. package/src/templates/default/app/global.css +2 -2
  912. package/src/templates/default/app/root.tsx +19 -16
  913. package/src/templates/default/app/routes/_index.tsx +1 -1
  914. package/src/templates/default/package.json +6 -2
  915. package/src/templates/default/server/middleware/auth.ts +15 -0
  916. package/src/templates/default/server/plugins/.gitkeep +0 -0
  917. package/src/templates/default/server/routes/[...page].get.ts +2 -9
  918. package/src/templates/default/ssr-entry.ts +20 -0
  919. package/dist/a2a/middleware.d.ts +0 -3
  920. package/dist/a2a/middleware.d.ts.map +0 -1
  921. package/dist/a2a/middleware.js +0 -36
  922. package/dist/a2a/middleware.js.map +0 -1
  923. package/dist/adapters/convex/adapter.d.ts +0 -24
  924. package/dist/adapters/convex/adapter.d.ts.map +0 -1
  925. package/dist/adapters/convex/adapter.js +0 -125
  926. package/dist/adapters/convex/adapter.js.map +0 -1
  927. package/dist/adapters/convex/index.d.ts +0 -4
  928. package/dist/adapters/convex/index.d.ts.map +0 -1
  929. package/dist/adapters/convex/index.js +0 -3
  930. package/dist/adapters/convex/index.js.map +0 -1
  931. package/dist/adapters/drizzle/adapter.d.ts +0 -36
  932. package/dist/adapters/drizzle/adapter.d.ts.map +0 -1
  933. package/dist/adapters/drizzle/adapter.js +0 -210
  934. package/dist/adapters/drizzle/adapter.js.map +0 -1
  935. package/dist/adapters/drizzle/index.d.ts +0 -3
  936. package/dist/adapters/drizzle/index.d.ts.map +0 -1
  937. package/dist/adapters/drizzle/index.js +0 -3
  938. package/dist/adapters/drizzle/index.js.map +0 -1
  939. package/dist/adapters/drizzle/schema.d.ts +0 -146
  940. package/dist/adapters/drizzle/schema.d.ts.map +0 -1
  941. package/dist/adapters/drizzle/schema.js +0 -20
  942. package/dist/adapters/drizzle/schema.js.map +0 -1
  943. package/dist/adapters/firestore/adapter.d.ts +0 -48
  944. package/dist/adapters/firestore/adapter.d.ts.map +0 -1
  945. package/dist/adapters/firestore/adapter.js +0 -62
  946. package/dist/adapters/firestore/adapter.js.map +0 -1
  947. package/dist/adapters/firestore/index.d.ts +0 -4
  948. package/dist/adapters/firestore/index.d.ts.map +0 -1
  949. package/dist/adapters/firestore/index.js +0 -3
  950. package/dist/adapters/firestore/index.js.map +0 -1
  951. package/dist/adapters/supabase/adapter.d.ts +0 -43
  952. package/dist/adapters/supabase/adapter.d.ts.map +0 -1
  953. package/dist/adapters/supabase/adapter.js +0 -137
  954. package/dist/adapters/supabase/adapter.js.map +0 -1
  955. package/dist/adapters/supabase/index.d.ts +0 -3
  956. package/dist/adapters/supabase/index.d.ts.map +0 -1
  957. package/dist/adapters/supabase/index.js +0 -3
  958. package/dist/adapters/supabase/index.js.map +0 -1
  959. package/dist/adapters/sync/config.d.ts +0 -40
  960. package/dist/adapters/sync/config.d.ts.map +0 -1
  961. package/dist/adapters/sync/config.js +0 -209
  962. package/dist/adapters/sync/config.js.map +0 -1
  963. package/dist/adapters/sync/create-file-sync.d.ts +0 -32
  964. package/dist/adapters/sync/create-file-sync.d.ts.map +0 -1
  965. package/dist/adapters/sync/create-file-sync.js +0 -218
  966. package/dist/adapters/sync/create-file-sync.js.map +0 -1
  967. package/dist/adapters/sync/file-sync.d.ts +0 -94
  968. package/dist/adapters/sync/file-sync.d.ts.map +0 -1
  969. package/dist/adapters/sync/file-sync.js +0 -671
  970. package/dist/adapters/sync/file-sync.js.map +0 -1
  971. package/dist/adapters/sync/index.d.ts +0 -6
  972. package/dist/adapters/sync/index.d.ts.map +0 -1
  973. package/dist/adapters/sync/index.js +0 -6
  974. package/dist/adapters/sync/index.js.map +0 -1
  975. package/dist/adapters/sync/merge.d.ts +0 -21
  976. package/dist/adapters/sync/merge.d.ts.map +0 -1
  977. package/dist/adapters/sync/merge.js +0 -132
  978. package/dist/adapters/sync/merge.js.map +0 -1
  979. package/dist/adapters/sync/types.d.ts +0 -62
  980. package/dist/adapters/sync/types.d.ts.map +0 -1
  981. package/dist/adapters/sync/types.js +0 -23
  982. package/dist/adapters/sync/types.js.map +0 -1
  983. package/dist/client/harness.d.ts +0 -48
  984. package/dist/client/harness.d.ts.map +0 -1
  985. package/dist/client/harness.js.map +0 -1
  986. package/dist/client/use-file-sync-status.d.ts +0 -21
  987. package/dist/client/use-file-sync-status.d.ts.map +0 -1
  988. package/dist/client/use-file-sync-status.js +0 -65
  989. package/dist/client/use-file-sync-status.js.map +0 -1
  990. package/dist/client/use-file-watcher.d.ts +0 -23
  991. package/dist/client/use-file-watcher.d.ts.map +0 -1
  992. package/dist/client/use-file-watcher.js +0 -50
  993. package/dist/client/use-file-watcher.js.map +0 -1
  994. package/dist/server/default-watcher.d.ts +0 -17
  995. package/dist/server/default-watcher.d.ts.map +0 -1
  996. package/dist/server/default-watcher.js +0 -37
  997. package/dist/server/default-watcher.js.map +0 -1
  998. package/dist/server/file-sync-plugin.d.ts +0 -7
  999. package/dist/server/file-sync-plugin.d.ts.map +0 -1
  1000. package/dist/server/file-sync-plugin.js +0 -38
  1001. package/dist/server/file-sync-plugin.js.map +0 -1
  1002. package/dist/vite/dev-api-server.d.ts +0 -10
  1003. package/dist/vite/dev-api-server.d.ts.map +0 -1
  1004. package/dist/vite/dev-api-server.js +0 -160
  1005. package/dist/vite/dev-api-server.js.map +0 -1
  1006. package/src/templates/default/.agents/skills/scripts/SKILL.md +0 -121
  1007. package/src/templates/default/.agents/skills/sse-file-watcher/SKILL.md +0 -80
  1008. package/src/templates/default/server/plugins/agent-chat.ts +0 -1
  1009. package/src/templates/default/server/plugins/auth.ts +0 -1
  1010. package/src/templates/default/server/plugins/file-sync.ts +0 -1
  1011. package/src/templates/default/server/plugins/terminal.ts +0 -1
  1012. package/src/templates/default/server/routes/api/events.get.ts +0 -3
  1013. package/src/templates/default/server/routes/api/file-sync/status.get.ts +0 -4
  1014. /package/{src/templates/default/application-state/.gitkeep → dist/templates/default/.ignore} +0 -0
  1015. /package/{src/templates/default/scripts → dist/templates/default/actions}/run.ts +0 -0
@@ -1,116 +1,156 @@
1
1
  import crypto from "node:crypto";
2
- import fs from "node:fs";
3
2
  import path from "node:path";
4
- import { defineEventHandler, readBody, getMethod, setResponseHeader, setResponseStatus, getCookie, setCookie, deleteCookie, } from "h3";
5
- import { createClient } from "@libsql/client";
3
+ // Lazy fs loaded via dynamic import() on first use.
4
+ // Avoids static require() which crashes on CF Workers.
5
+ let _fs;
6
+ async function getFs() {
7
+ if (!_fs) {
8
+ _fs = await import("node:fs");
9
+ }
10
+ return _fs;
11
+ }
12
+ import { defineEventHandler, getMethod, getQuery, setResponseHeader, setResponseStatus, getCookie, setCookie, deleteCookie, } from "h3";
13
+ // In h3 v2, `event.req` IS the web Request — no conversion needed.
14
+ function toWebRequest(event) {
15
+ return event.req;
16
+ }
17
+ import { getDbExec, isPostgres, intType } from "../db/client.js";
18
+ import { getBetterAuth, getBetterAuthSync } from "./better-auth-instance.js";
19
+ import { getOnboardingHtml } from "./onboarding-html.js";
20
+ import { migrateLocalUserData } from "./local-migration.js";
21
+ import { readBody } from "../server/h3-helpers.js";
6
22
  // ---------------------------------------------------------------------------
7
23
  // Constants
8
24
  // ---------------------------------------------------------------------------
9
25
  const COOKIE_NAME = "an_session";
10
26
  const DEFAULT_MAX_AGE = 60 * 60 * 24 * 30; // 30 days
11
27
  // ---------------------------------------------------------------------------
12
- // Session store — SQL-backed
28
+ // AUTH_MODE detection
13
29
  // ---------------------------------------------------------------------------
14
- let _sessionClient;
15
- let _sessionTableReady = false;
16
- let sessionMaxAge = DEFAULT_MAX_AGE;
17
- function getSessionClient() {
18
- if (!_sessionClient) {
19
- // Check for Cloudflare D1 binding
20
- const d1 = globalThis.__cf_env?.DB;
21
- if (d1) {
22
- _sessionClient = {
23
- async execute(sql) {
24
- if (typeof sql === "string") {
25
- const r = await d1.prepare(sql).all();
26
- return {
27
- rows: r.results || [],
28
- rowsAffected: r.meta?.changes ?? 0,
29
- };
30
- }
31
- const r = await d1
32
- .prepare(sql.sql)
33
- .bind(...sql.args)
34
- .all();
35
- return { rows: r.results || [], rowsAffected: r.meta?.changes ?? 0 };
36
- },
37
- };
38
- return _sessionClient;
30
+ /**
31
+ * Check if the app is in local-only mode (no auth).
32
+ *
33
+ * Returns true when:
34
+ * - AUTH_MODE=local is explicitly set (escape hatch)
35
+ * - In dev environment (NODE_ENV=development) with no explicit auth token
36
+ * configured (no ACCESS_TOKEN, no BYOA). This makes dev "just work"
37
+ * without requiring auth setup, while still respecting auth when configured.
38
+ *
39
+ * NOTE: GOOGLE_CLIENT_ID is intentionally NOT checked here — it is used for
40
+ * Google Calendar / Gmail API access as well as Google Sign-In, and its
41
+ * presence alone should not force authentication. Only ACCESS_TOKEN/ACCESS_TOKENS
42
+ * (explicit token-based auth) or a custom getSession (BYOA) signal that the
43
+ * developer has explicitly opted into requiring authentication.
44
+ *
45
+ * BYOA (customGetSession) opts out of dev auto-local — templates that provide
46
+ * their own auth (e.g. Supabase) shouldn't be silently bypassed in dev.
47
+ */
48
+ function isLocalMode() {
49
+ if (process.env.AUTH_MODE === "local")
50
+ return true;
51
+ // Default to local mode in dev when no explicit auth is configured
52
+ if (isDevEnvironment() &&
53
+ !process.env.ACCESS_TOKEN &&
54
+ !process.env.ACCESS_TOKENS &&
55
+ !customGetSession) {
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ /**
61
+ * Check if we're in a development/test environment.
62
+ * Used for cookie security settings, not for auth bypass.
63
+ */
64
+ function isDevEnvironment() {
65
+ const env = process.env.NODE_ENV;
66
+ return env === "development" || env === "test";
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // ACCESS_TOKEN resolution
70
+ // ---------------------------------------------------------------------------
71
+ function getAccessTokens() {
72
+ const single = process.env.ACCESS_TOKEN;
73
+ const multi = process.env.ACCESS_TOKENS;
74
+ const tokens = [];
75
+ if (single)
76
+ tokens.push(single);
77
+ if (multi) {
78
+ for (const t of multi.split(",")) {
79
+ const trimmed = t.trim();
80
+ if (trimmed && !tokens.includes(trimmed))
81
+ tokens.push(trimmed);
39
82
  }
40
- // Fall back to libsql
41
- const url = process.env.DATABASE_URL || "file:./data/app.db";
42
- if (url.startsWith("file:")) {
43
- try {
44
- fs.mkdirSync(path.join(process.cwd(), "data"), { recursive: true });
45
- }
46
- catch {
47
- // Edge runtime no filesystem
48
- }
83
+ }
84
+ return tokens;
85
+ }
86
+ function safeTokenMatch(input, tokens) {
87
+ const inputBuf = Buffer.from(input);
88
+ for (const token of tokens) {
89
+ const tokenBuf = Buffer.from(token);
90
+ if (inputBuf.length === tokenBuf.length &&
91
+ crypto.timingSafeEqual(inputBuf, tokenBuf)) {
92
+ return true;
49
93
  }
50
- _sessionClient = createClient({
51
- url,
52
- authToken: process.env.DATABASE_AUTH_TOKEN,
53
- });
54
94
  }
55
- return _sessionClient;
95
+ return false;
56
96
  }
97
+ // ---------------------------------------------------------------------------
98
+ // Legacy session store — kept for backward compat (addSession/getSessionEmail)
99
+ // Used by google-oauth.ts for mobile deep linking session creation.
100
+ // ---------------------------------------------------------------------------
101
+ let _sessionInitPromise;
102
+ let sessionMaxAge = DEFAULT_MAX_AGE;
57
103
  async function ensureSessionTable() {
58
- if (_sessionTableReady)
59
- return;
60
- const client = getSessionClient();
61
- await client.execute(`
62
- CREATE TABLE IF NOT EXISTS sessions (
63
- token TEXT PRIMARY KEY,
64
- email TEXT,
65
- created_at INTEGER NOT NULL
66
- )
67
- `);
68
- // Migration: add email column to existing tables that lack it
69
- try {
70
- await client.execute(`ALTER TABLE sessions ADD COLUMN email TEXT`);
71
- }
72
- catch {
73
- // Column already exists — ignore
104
+ if (!_sessionInitPromise) {
105
+ _sessionInitPromise = (async () => {
106
+ const client = getDbExec();
107
+ await client.execute(`
108
+ CREATE TABLE IF NOT EXISTS sessions (
109
+ token TEXT PRIMARY KEY,
110
+ email TEXT,
111
+ created_at ${intType()} NOT NULL
112
+ )
113
+ `);
114
+ try {
115
+ await client.execute(`ALTER TABLE sessions ADD COLUMN email TEXT`);
116
+ }
117
+ catch {
118
+ // Column already exists
119
+ }
120
+ })();
74
121
  }
75
- _sessionTableReady = true;
76
- }
77
- async function pruneExpiredSessions() {
78
- await ensureSessionTable();
79
- const client = getSessionClient();
80
- const cutoff = Date.now() - sessionMaxAge * 1000;
81
- await client.execute({
82
- sql: `DELETE FROM sessions WHERE created_at < ?`,
83
- args: [cutoff],
84
- });
122
+ return _sessionInitPromise;
85
123
  }
86
124
  /**
87
- * Create a new session. Optionally associate it with an email address
88
- * (used by Google OAuth and other identity-aware auth providers).
125
+ * Create a new session in the legacy sessions table.
126
+ * Used by google-oauth.ts for mobile deep linking.
89
127
  */
90
128
  export async function addSession(token, email) {
91
129
  await ensureSessionTable();
92
- const client = getSessionClient();
130
+ const client = getDbExec();
93
131
  await client.execute({
94
- sql: `INSERT OR REPLACE INTO sessions (token, email, created_at) VALUES (?, ?, ?)`,
132
+ sql: isPostgres()
133
+ ? `INSERT INTO sessions (token, email, created_at) VALUES (?, ?, ?) ON CONFLICT (token) DO UPDATE SET email=EXCLUDED.email, created_at=EXCLUDED.created_at`
134
+ : `INSERT OR REPLACE INTO sessions (token, email, created_at) VALUES (?, ?, ?)`,
95
135
  args: [token, email ?? null, Date.now()],
96
136
  });
97
137
  }
98
- /** Remove a session by token. */
138
+ /** Remove a session from the legacy sessions table. */
99
139
  export async function removeSession(token) {
100
140
  await ensureSessionTable();
101
- const client = getSessionClient();
141
+ const client = getDbExec();
102
142
  await client.execute({
103
143
  sql: `DELETE FROM sessions WHERE token = ?`,
104
144
  args: [token],
105
145
  });
106
146
  }
107
147
  /**
108
- * Look up the email associated with a session token.
148
+ * Look up the email associated with a legacy session token.
109
149
  * Returns null if the session doesn't exist, is expired, or has no email.
110
150
  */
111
151
  export async function getSessionEmail(token) {
112
152
  await ensureSessionTable();
113
- const client = getSessionClient();
153
+ const client = getDbExec();
114
154
  const { rows } = await client.execute({
115
155
  sql: `SELECT email, created_at FROM sessions WHERE token = ?`,
116
156
  args: [token],
@@ -127,96 +167,209 @@ export async function getSessionEmail(token) {
127
167
  }
128
168
  return rows[0].email ?? null;
129
169
  }
130
- async function hasSession(token) {
131
- await ensureSessionTable();
132
- const client = getSessionClient();
133
- const { rows } = await client.execute({
134
- sql: `SELECT created_at FROM sessions WHERE token = ?`,
135
- args: [token],
136
- });
137
- if (rows.length === 0)
138
- return false;
139
- const createdAt = rows[0].created_at;
140
- if (Date.now() - createdAt > sessionMaxAge * 1000) {
141
- await client.execute({
142
- sql: `DELETE FROM sessions WHERE token = ?`,
143
- args: [token],
144
- });
145
- return false;
146
- }
147
- return true;
148
- }
149
170
  // ---------------------------------------------------------------------------
150
- // Token resolution supports ACCESS_TOKEN (single) or ACCESS_TOKENS (multi)
171
+ // getSessionthe auth contract
151
172
  // ---------------------------------------------------------------------------
152
- function getAccessTokens() {
153
- const single = process.env.ACCESS_TOKEN;
154
- const multi = process.env.ACCESS_TOKENS;
155
- const tokens = [];
156
- if (single)
157
- tokens.push(single);
158
- if (multi) {
159
- for (const t of multi.split(",")) {
160
- const trimmed = t.trim();
161
- if (trimmed && !tokens.includes(trimmed))
162
- tokens.push(trimmed);
163
- }
164
- }
165
- return tokens;
173
+ let customGetSession = null;
174
+ let authDisabledMode = false;
175
+ let _authGuardConfig = null;
176
+ /**
177
+ * Module-level auth guard function. Set by autoMountAuth() when auth is active.
178
+ * Called by the server middleware to enforce auth on ALL requests (not just
179
+ * /_agent-native/* routes).
180
+ */
181
+ let _authGuardFn = null;
182
+ /**
183
+ * Run the auth guard on an event. Returns a Response/object to block the
184
+ * request (login page or 401), or undefined to allow it through.
185
+ *
186
+ * Called by the default server middleware (server/middleware/auth.ts) to
187
+ * enforce auth on page routes and API routes — not just framework routes.
188
+ */
189
+ export async function runAuthGuard(event) {
190
+ if (!_authGuardFn)
191
+ return; // Auth not mounted (local mode, etc.)
192
+ return _authGuardFn(event);
166
193
  }
194
+ const LOCAL_SESSION = { email: "local@localhost" };
167
195
  // ---------------------------------------------------------------------------
168
- // Dev mode detection
196
+ // Auth guard factory
169
197
  // ---------------------------------------------------------------------------
170
- function isDevMode() {
171
- // On edge runtimes (e.g. CF Workers), NODE_ENV may not be set.
172
- // Treat undefined as production dev mode must be explicitly opted in.
173
- const env = process.env.NODE_ENV;
174
- return env === "development" || env === "test";
198
+ /**
199
+ * Create an auth guard function that checks session and blocks
200
+ * unauthenticated requests. Returns the login HTML for page routes
201
+ * or a 401 JSON response for API routes.
202
+ *
203
+ * Reads loginHtml and publicPaths from _authGuardConfig on every request
204
+ * so that a custom plugin can update them after the default has already
205
+ * installed this middleware (the production race condition fix).
206
+ */
207
+ function createAuthGuardFn() {
208
+ return async (event) => {
209
+ const config = _authGuardConfig;
210
+ if (!config)
211
+ return;
212
+ const { loginHtml, publicPaths } = config;
213
+ const url = event.node?.req?.url ?? event.path ?? "/";
214
+ const p = url.split("?")[0];
215
+ // Skip auth routes (all /_agent-native/auth/* and /_agent-native/google/*)
216
+ if (p.startsWith("/_agent-native/auth/") ||
217
+ p.startsWith("/_agent-native/google/")) {
218
+ return;
219
+ }
220
+ // Skip static assets (Vite chunks, fonts, images, etc.)
221
+ if (p.startsWith("/assets/") ||
222
+ p.startsWith("/_build/") ||
223
+ p.endsWith(".js") ||
224
+ p.endsWith(".css") ||
225
+ p.endsWith(".map") ||
226
+ p.endsWith(".ico") ||
227
+ p.endsWith(".png") ||
228
+ p.endsWith(".svg") ||
229
+ p.endsWith(".woff2") ||
230
+ p.endsWith(".woff")) {
231
+ return;
232
+ }
233
+ if (isPublicPath(url, publicPaths))
234
+ return;
235
+ const session = await getSession(event);
236
+ if (session)
237
+ return;
238
+ if (p.startsWith("/api/") || p.startsWith("/_agent-native/")) {
239
+ setResponseStatus(event, 401);
240
+ return { error: "Unauthorized" };
241
+ }
242
+ return new Response(loginHtml, {
243
+ status: 200,
244
+ headers: { "Content-Type": "text/html; charset=utf-8" },
245
+ });
246
+ };
247
+ }
248
+ /**
249
+ * Map a Better Auth session to our AuthSession type.
250
+ */
251
+ function mapBetterAuthSession(baSession) {
252
+ return {
253
+ email: baSession.user.email,
254
+ userId: baSession.user.id,
255
+ token: baSession.session?.token,
256
+ orgId: baSession.session?.activeOrganizationId ?? undefined,
257
+ };
175
258
  }
176
- // ---------------------------------------------------------------------------
177
- // getSession — the auth contract
178
- // ---------------------------------------------------------------------------
179
- let customGetSession = null;
180
- let authDisabledMode = false;
181
- const DEV_SESSION = { email: "local@localhost" };
182
259
  /**
183
260
  * Get the current auth session for a request.
184
261
  *
185
- * - In dev mode: always returns { email: "local@localhost" }
186
- * - In production with built-in auth: returns session if cookie is valid
187
- * - With custom auth (BYOA): delegates to the custom getSession
262
+ * Resolution chain:
263
+ * 1. AUTH_MODE=local local@localhost (explicit escape hatch)
264
+ * 2. AUTH_DISABLED=true local@localhost (infrastructure auth)
265
+ * 3. ACCESS_TOKEN → check legacy cookie-based token sessions
266
+ * 4. BYOA custom getSession → delegate to template callback
267
+ * 5. Better Auth → check session via Better Auth API (cookie or Bearer)
268
+ * 6. Legacy cookie → check an_session cookie in legacy sessions table
269
+ * 7. Mobile _session query param → promote to cookie
188
270
  */
189
271
  export async function getSession(event) {
190
- if (isDevMode())
191
- return DEV_SESSION;
192
- if (authDisabledMode)
193
- return DEV_SESSION;
194
- if (customGetSession)
195
- return customGetSession(event);
196
- const cookie = getCookie(event, COOKIE_NAME);
197
- if (cookie && (await hasSession(cookie))) {
198
- return { email: "user", token: cookie };
272
+ // 1. AUTH_MODE=local — explicit local-only mode
273
+ if (isLocalMode() || authDisabledMode) {
274
+ // Check for a real session cookie first (e.g. from Google OAuth)
275
+ try {
276
+ const cookie = getCookie(event, COOKIE_NAME);
277
+ if (cookie) {
278
+ const email = await getSessionEmail(cookie);
279
+ if (email)
280
+ return { email, token: cookie };
281
+ }
282
+ }
283
+ catch {
284
+ // DB not ready yet
285
+ }
286
+ // Also try Better Auth session (for users who created an account then went local)
287
+ try {
288
+ const ba = getBetterAuthSync();
289
+ if (ba) {
290
+ const baSession = await ba.api.getSession({
291
+ headers: event.headers,
292
+ });
293
+ if (baSession?.user?.email) {
294
+ return mapBetterAuthSession(baSession);
295
+ }
296
+ }
297
+ }
298
+ catch {
299
+ // Better Auth not initialized yet
300
+ }
301
+ return LOCAL_SESSION;
302
+ }
303
+ // 2. ACCESS_TOKEN check (programmatic/agent access)
304
+ const accessTokens = getAccessTokens();
305
+ if (accessTokens.length > 0) {
306
+ const cookie = getCookie(event, COOKIE_NAME);
307
+ if (cookie) {
308
+ const email = await getSessionEmail(cookie);
309
+ if (email)
310
+ return { email, token: cookie };
311
+ }
312
+ }
313
+ // 3. BYOA custom getSession
314
+ if (customGetSession) {
315
+ const session = await customGetSession(event);
316
+ if (session)
317
+ return session;
318
+ // Fall through to mobile _session check
319
+ }
320
+ else {
321
+ // 4. Better Auth session (cookie or Bearer token)
322
+ try {
323
+ const ba = getBetterAuthSync();
324
+ if (ba) {
325
+ const baSession = await ba.api.getSession({
326
+ headers: event.headers,
327
+ });
328
+ if (baSession?.user?.email) {
329
+ return mapBetterAuthSession(baSession);
330
+ }
331
+ }
332
+ }
333
+ catch {
334
+ // Better Auth not ready
335
+ }
336
+ // 5. Legacy cookie fallback (for sessions created before migration)
337
+ const cookie = getCookie(event, COOKIE_NAME);
338
+ if (cookie) {
339
+ const email = await getSessionEmail(cookie);
340
+ if (email)
341
+ return { email, token: cookie };
342
+ }
343
+ }
344
+ // 6. Mobile WebView bridge — _session query param
345
+ const qToken = getQuery(event)?._session;
346
+ if (qToken) {
347
+ const email = await getSessionEmail(qToken);
348
+ if (email) {
349
+ setCookie(event, COOKIE_NAME, qToken, {
350
+ httpOnly: true,
351
+ secure: !isDevEnvironment(),
352
+ sameSite: "lax",
353
+ path: "/",
354
+ maxAge: sessionMaxAge,
355
+ });
356
+ setResponseHeader(event, "Referrer-Policy", "no-referrer");
357
+ return { email, token: qToken };
358
+ }
199
359
  }
200
360
  return null;
201
361
  }
202
362
  // ---------------------------------------------------------------------------
203
- // Constant-time token comparison
363
+ // Public path matching
204
364
  // ---------------------------------------------------------------------------
205
- function safeTokenMatch(input, tokens) {
206
- const inputBuf = Buffer.from(input);
207
- for (const token of tokens) {
208
- const tokenBuf = Buffer.from(token);
209
- if (inputBuf.length === tokenBuf.length &&
210
- crypto.timingSafeEqual(inputBuf, tokenBuf)) {
211
- return true;
212
- }
213
- }
214
- return false;
365
+ function isPublicPath(url, publicPaths) {
366
+ const p = url.split("?")[0];
367
+ return publicPaths.some((pp) => p === pp || p.startsWith(pp + "/"));
215
368
  }
216
369
  // ---------------------------------------------------------------------------
217
- // Login page HTML
370
+ // Login page HTML (ACCESS_TOKEN mode)
218
371
  // ---------------------------------------------------------------------------
219
- const LOGIN_HTML = `<!DOCTYPE html>
372
+ const TOKEN_LOGIN_HTML = `<!DOCTYPE html>
220
373
  <html lang="en">
221
374
  <head>
222
375
  <meta charset="UTF-8">
@@ -252,7 +405,6 @@ const LOGIN_HTML = `<!DOCTYPE html>
252
405
  color: #e5e5e5;
253
406
  font-size: 0.9375rem;
254
407
  outline: none;
255
- transition: border-color 0.15s;
256
408
  }
257
409
  input:focus { border-color: rgba(255,255,255,0.3); }
258
410
  button {
@@ -266,7 +418,6 @@ const LOGIN_HTML = `<!DOCTYPE html>
266
418
  font-size: 0.9375rem;
267
419
  font-weight: 500;
268
420
  cursor: pointer;
269
- transition: opacity 0.15s;
270
421
  }
271
422
  button:hover { opacity: 0.85; }
272
423
  .error { margin-top: 0.75rem; font-size: 0.8125rem; color: #f87171; display: none; }
@@ -287,7 +438,7 @@ const LOGIN_HTML = `<!DOCTYPE html>
287
438
  document.getElementById('form').addEventListener('submit', async (e) => {
288
439
  e.preventDefault();
289
440
  const token = document.getElementById('token').value;
290
- const res = await fetch('/api/auth/login', {
441
+ const res = await fetch('/_agent-native/auth/login', {
291
442
  method: 'POST',
292
443
  headers: { 'Content-Type': 'application/json' },
293
444
  body: JSON.stringify({ token }),
@@ -302,25 +453,259 @@ const LOGIN_HTML = `<!DOCTYPE html>
302
453
  </body>
303
454
  </html>`;
304
455
  // ---------------------------------------------------------------------------
305
- // mountAuthMiddlewaremounts login/logout/session routes + auth guard
456
+ // setAuthModeLocalwrite AUTH_MODE=local to .env for the escape hatch
306
457
  // ---------------------------------------------------------------------------
307
- /**
308
- * Mount auth middleware + login/logout/session routes onto an H3 app.
309
- *
310
- * @deprecated Use `autoMountAuth(app, options?)` instead for automatic
311
- * dev/prod behavior. This function is kept for backwards compatibility
312
- * when you need explicit control over the access token.
313
- */
314
- export function mountAuthMiddleware(app, accessToken) {
315
- mountAuthRoutes(app, [accessToken]);
458
+ async function setAuthModeLocal() {
459
+ try {
460
+ const fs = await getFs();
461
+ const envPath = path.resolve(process.cwd(), ".env");
462
+ let content = "";
463
+ try {
464
+ content = fs.readFileSync(envPath, "utf-8");
465
+ }
466
+ catch {
467
+ // .env doesn't exist yet
468
+ }
469
+ if (content.includes("AUTH_MODE=")) {
470
+ content = content.replace(/AUTH_MODE=.*/g, "AUTH_MODE=local");
471
+ }
472
+ else {
473
+ content = content.trimEnd() + "\nAUTH_MODE=local\n";
474
+ }
475
+ fs.writeFileSync(envPath, content, "utf-8");
476
+ process.env.AUTH_MODE = "local";
477
+ return true;
478
+ }
479
+ catch {
480
+ return false;
481
+ }
316
482
  }
317
- function isPublicPath(url, publicPaths) {
318
- const p = url.split("?")[0];
319
- return publicPaths.some((pp) => p === pp || p.startsWith(pp + "/"));
483
+ async function removeAuthModeLocal() {
484
+ try {
485
+ const fs = await getFs();
486
+ const envPath = path.resolve(process.cwd(), ".env");
487
+ let content = "";
488
+ try {
489
+ content = fs.readFileSync(envPath, "utf-8");
490
+ }
491
+ catch {
492
+ return true; // No .env file means nothing to remove
493
+ }
494
+ // Remove AUTH_MODE=local line entirely
495
+ content = content
496
+ .split("\n")
497
+ .filter((line) => !line.match(/^\s*AUTH_MODE\s*=/))
498
+ .join("\n");
499
+ fs.writeFileSync(envPath, content, "utf-8");
500
+ delete process.env.AUTH_MODE;
501
+ return true;
502
+ }
503
+ catch {
504
+ return false;
505
+ }
320
506
  }
321
- function mountAuthRoutes(app, accessTokens, publicPaths = []) {
322
- // POST /api/auth/login
323
- app.use("/api/auth/login", defineEventHandler(async (event) => {
507
+ // ---------------------------------------------------------------------------
508
+ // mountBetterAuthRoutes — Better Auth powered auth with backward-compat routes
509
+ // ---------------------------------------------------------------------------
510
+ async function mountBetterAuthRoutes(app, options) {
511
+ const publicPaths = [...(options.publicPaths ?? [])];
512
+ // The A2A agent card is part of an open protocol — other agents must be
513
+ // able to discover it without auth. Same for favicons and similar probes.
514
+ for (const pp of ["/.well-known", "/favicon.ico", "/favicon.png"]) {
515
+ if (!publicPaths.includes(pp))
516
+ publicPaths.push(pp);
517
+ }
518
+ // Auto-add Google OAuth routes when credentials are configured
519
+ if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {
520
+ for (const gp of [
521
+ "/_agent-native/google/callback",
522
+ "/_agent-native/google/auth-url",
523
+ ]) {
524
+ if (!publicPaths.includes(gp))
525
+ publicPaths.push(gp);
526
+ }
527
+ }
528
+ const accessTokens = getAccessTokens();
529
+ // Initialize Better Auth
530
+ const auth = await getBetterAuth(options.betterAuth);
531
+ // Mount Better Auth catch-all handler at /_agent-native/auth/ba/*
532
+ app.use("/_agent-native/auth/ba", defineEventHandler(async (event) => {
533
+ const response = await auth.handler(toWebRequest(event));
534
+ return response;
535
+ }));
536
+ // POST /_agent-native/auth/local-mode — switch to local mode (onboarding escape hatch)
537
+ // Only available in dev — production requires real accounts for usage tracking.
538
+ app.use("/_agent-native/auth/local-mode", defineEventHandler(async (event) => {
539
+ if (getMethod(event) !== "POST") {
540
+ setResponseStatus(event, 405);
541
+ return { error: "Method not allowed" };
542
+ }
543
+ if (!isDevEnvironment()) {
544
+ setResponseStatus(event, 403);
545
+ return {
546
+ error: "Local mode is not available in production. Create an account to continue.",
547
+ };
548
+ }
549
+ const ok = await setAuthModeLocal();
550
+ if (!ok) {
551
+ setResponseStatus(event, 500);
552
+ return { error: "Failed to set AUTH_MODE=local in .env" };
553
+ }
554
+ return { ok: true };
555
+ }));
556
+ // POST /_agent-native/auth/exit-local-mode — switch back to real auth
557
+ app.use("/_agent-native/auth/exit-local-mode", defineEventHandler(async (event) => {
558
+ if (getMethod(event) !== "POST") {
559
+ setResponseStatus(event, 405);
560
+ return { error: "Method not allowed" };
561
+ }
562
+ const ok = await removeAuthModeLocal();
563
+ if (!ok) {
564
+ setResponseStatus(event, 500);
565
+ return { error: "Failed to remove AUTH_MODE from .env" };
566
+ }
567
+ return { ok: true };
568
+ }));
569
+ // Backward-compat: POST /_agent-native/auth/login
570
+ app.use("/_agent-native/auth/login", defineEventHandler(async (event) => {
571
+ if (getMethod(event) !== "POST") {
572
+ setResponseStatus(event, 405);
573
+ return { error: "Method not allowed" };
574
+ }
575
+ const body = await readBody(event);
576
+ // Legacy ACCESS_TOKEN login
577
+ if (body?.token &&
578
+ typeof body.token === "string" &&
579
+ accessTokens.length > 0) {
580
+ if (!safeTokenMatch(body.token, accessTokens)) {
581
+ setResponseStatus(event, 401);
582
+ return { error: "Invalid token" };
583
+ }
584
+ const sessionToken = crypto.randomBytes(32).toString("hex");
585
+ await addSession(sessionToken, "user");
586
+ setCookie(event, COOKIE_NAME, sessionToken, {
587
+ httpOnly: true,
588
+ secure: !isDevEnvironment(),
589
+ sameSite: "lax",
590
+ path: "/",
591
+ maxAge: sessionMaxAge,
592
+ });
593
+ return { ok: true };
594
+ }
595
+ // Email/password login via Better Auth
596
+ const email = body?.email?.trim?.()?.toLowerCase?.();
597
+ const password = body?.password;
598
+ if (!email || !password) {
599
+ setResponseStatus(event, 400);
600
+ return { error: "Email and password are required" };
601
+ }
602
+ try {
603
+ const result = await auth.api.signInEmail({
604
+ body: { email, password },
605
+ });
606
+ if (result?.token) {
607
+ setCookie(event, COOKIE_NAME, result.token, {
608
+ httpOnly: true,
609
+ secure: !isDevEnvironment(),
610
+ sameSite: "lax",
611
+ path: "/",
612
+ maxAge: sessionMaxAge,
613
+ });
614
+ await addSession(result.token, email);
615
+ }
616
+ return { ok: true };
617
+ }
618
+ catch (e) {
619
+ setResponseStatus(event, 401);
620
+ return { error: e?.message || "Invalid email or password" };
621
+ }
622
+ }));
623
+ // Backward-compat: POST /_agent-native/auth/register
624
+ app.use("/_agent-native/auth/register", defineEventHandler(async (event) => {
625
+ if (getMethod(event) !== "POST") {
626
+ setResponseStatus(event, 405);
627
+ return { error: "Method not allowed" };
628
+ }
629
+ const body = await readBody(event);
630
+ const email = body?.email?.trim?.()?.toLowerCase?.();
631
+ const password = body?.password;
632
+ if (!email || typeof email !== "string" || !email.includes("@")) {
633
+ setResponseStatus(event, 400);
634
+ return { error: "Valid email is required" };
635
+ }
636
+ if (!password || typeof password !== "string" || password.length < 8) {
637
+ setResponseStatus(event, 400);
638
+ return { error: "Password must be at least 8 characters" };
639
+ }
640
+ try {
641
+ await auth.api.signUpEmail({
642
+ body: { email, password, name: email.split("@")[0] },
643
+ });
644
+ return { ok: true };
645
+ }
646
+ catch (e) {
647
+ setResponseStatus(event, 409);
648
+ return { error: e?.message || "Registration failed" };
649
+ }
650
+ }));
651
+ // Backward-compat: POST /_agent-native/auth/logout
652
+ app.use("/_agent-native/auth/logout", defineEventHandler(async (event) => {
653
+ const cookie = getCookie(event, COOKIE_NAME);
654
+ if (cookie)
655
+ await removeSession(cookie);
656
+ deleteCookie(event, COOKIE_NAME, { path: "/" });
657
+ try {
658
+ await auth.api.signOut({ headers: event.headers });
659
+ }
660
+ catch {
661
+ // Ignore if no Better Auth session
662
+ }
663
+ return { ok: true };
664
+ }));
665
+ // GET /_agent-native/auth/session
666
+ app.use("/_agent-native/auth/session", defineEventHandler(async (event) => {
667
+ if (getMethod(event) !== "GET") {
668
+ setResponseStatus(event, 405);
669
+ return { error: "Method not allowed" };
670
+ }
671
+ const session = await getSession(event);
672
+ return session ?? { error: "Not authenticated" };
673
+ }));
674
+ // POST /_agent-native/auth/migrate-local-data — move local-mode data to
675
+ // the currently signed-in account. Called by the UI after a user upgrades
676
+ // from local mode to a real account so they don't lose their data.
677
+ app.use("/_agent-native/auth/migrate-local-data", defineEventHandler(async (event) => {
678
+ if (getMethod(event) !== "POST") {
679
+ setResponseStatus(event, 405);
680
+ return { error: "Method not allowed" };
681
+ }
682
+ const session = await getSession(event);
683
+ if (!session?.email || session.email === "local@localhost") {
684
+ setResponseStatus(event, 401);
685
+ return { error: "Not authenticated as a real account" };
686
+ }
687
+ try {
688
+ const result = await migrateLocalUserData(session.email);
689
+ return { ok: true, ...result };
690
+ }
691
+ catch (e) {
692
+ setResponseStatus(event, 500);
693
+ return { error: e?.message || "Migration failed" };
694
+ }
695
+ }));
696
+ // Auth guard — stored both in framework middleware registry AND in
697
+ // _authGuardFn so the server middleware can enforce it on ALL routes.
698
+ const loginHtml = options.loginHtml ?? getOnboardingHtml({ googleOnly: options.googleOnly });
699
+ _authGuardConfig = { loginHtml, publicPaths };
700
+ const guardFn = createAuthGuardFn();
701
+ _authGuardFn = guardFn;
702
+ app.use(defineEventHandler(guardFn));
703
+ }
704
+ // ---------------------------------------------------------------------------
705
+ // mountTokenOnlyRoutes — ACCESS_TOKEN-only auth (no Better Auth)
706
+ // ---------------------------------------------------------------------------
707
+ function mountTokenOnlyRoutes(app, accessTokens, publicPaths = []) {
708
+ app.use("/_agent-native/auth/login", defineEventHandler(async (event) => {
324
709
  if (getMethod(event) !== "POST") {
325
710
  setResponseStatus(event, 405);
326
711
  return { error: "Method not allowed" };
@@ -333,26 +718,24 @@ function mountAuthRoutes(app, accessTokens, publicPaths = []) {
333
718
  return { error: "Invalid token" };
334
719
  }
335
720
  const sessionToken = crypto.randomBytes(32).toString("hex");
336
- await addSession(sessionToken);
721
+ await addSession(sessionToken, "user");
337
722
  setCookie(event, COOKIE_NAME, sessionToken, {
338
723
  httpOnly: true,
339
- secure: true,
724
+ secure: !isDevEnvironment(),
340
725
  sameSite: "lax",
341
726
  path: "/",
342
727
  maxAge: sessionMaxAge,
343
728
  });
344
729
  return { ok: true };
345
730
  }));
346
- // POST /api/auth/logout
347
- app.use("/api/auth/logout", defineEventHandler(async (event) => {
731
+ app.use("/_agent-native/auth/logout", defineEventHandler(async (event) => {
348
732
  const cookie = getCookie(event, COOKIE_NAME);
349
733
  if (cookie)
350
734
  await removeSession(cookie);
351
735
  deleteCookie(event, COOKIE_NAME, { path: "/" });
352
736
  return { ok: true };
353
737
  }));
354
- // GET /api/auth/session client session check
355
- app.use("/api/auth/session", defineEventHandler(async (event) => {
738
+ app.use("/_agent-native/auth/session", defineEventHandler(async (event) => {
356
739
  if (getMethod(event) !== "GET") {
357
740
  setResponseStatus(event, 405);
358
741
  return { error: "Method not allowed" };
@@ -360,68 +743,86 @@ function mountAuthRoutes(app, accessTokens, publicPaths = []) {
360
743
  const session = await getSession(event);
361
744
  return session ?? { error: "Not authenticated" };
362
745
  }));
363
- // Auth guard runs before all other handlers
364
- app.use(defineEventHandler(async (event) => {
365
- const url = event.node?.req?.url ?? event.path ?? "/";
366
- const p = url.split("?")[0];
367
- // Skip auth routes
368
- if (p === "/api/auth/login" ||
369
- p === "/api/auth/logout" ||
370
- p === "/api/auth/session") {
371
- return;
372
- }
373
- // Skip public paths
374
- if (isPublicPath(url, publicPaths)) {
375
- return;
746
+ _authGuardConfig = { loginHtml: TOKEN_LOGIN_HTML, publicPaths };
747
+ const guardFn = createAuthGuardFn();
748
+ _authGuardFn = guardFn;
749
+ app.use(defineEventHandler(guardFn));
750
+ }
751
+ // ---------------------------------------------------------------------------
752
+ // mountLocalModeRoutes stub routes for AUTH_MODE=local
753
+ // ---------------------------------------------------------------------------
754
+ function mountLocalModeRoutes(app) {
755
+ app.use("/_agent-native/auth/session", defineEventHandler(async (event) => {
756
+ if (getMethod(event) !== "GET") {
757
+ setResponseStatus(event, 405);
758
+ return { error: "Method not allowed" };
376
759
  }
377
- // Use getSession() so BYOA custom auth is respected
378
- const session = await getSession(event);
379
- if (session) {
380
- return; // Authenticated
760
+ return await getSession(event);
761
+ }));
762
+ app.use("/_agent-native/auth/login", defineEventHandler(() => ({ ok: true })));
763
+ app.use("/_agent-native/auth/logout", defineEventHandler(() => ({ ok: true })));
764
+ // Allow exiting local mode to switch to real auth
765
+ app.use("/_agent-native/auth/exit-local-mode", defineEventHandler(async (event) => {
766
+ if (getMethod(event) !== "POST") {
767
+ setResponseStatus(event, 405);
768
+ return { error: "Method not allowed" };
381
769
  }
382
- // Unauthenticated
383
- if (p.startsWith("/api/")) {
384
- setResponseStatus(event, 401);
385
- return { error: "Unauthorized" };
770
+ const ok = await removeAuthModeLocal();
771
+ if (!ok) {
772
+ setResponseStatus(event, 500);
773
+ return { error: "Failed to remove AUTH_MODE from .env" };
386
774
  }
387
- setResponseStatus(event, 200);
388
- setResponseHeader(event, "Content-Type", "text/html");
389
- return LOGIN_HTML;
775
+ return { ok: true };
390
776
  }));
391
777
  }
392
778
  // ---------------------------------------------------------------------------
393
779
  // autoMountAuth — the recommended entry point
394
780
  // ---------------------------------------------------------------------------
395
781
  /**
396
- * Automatically configure auth based on the environment:
782
+ * Automatically configure auth based on environment and configuration:
397
783
  *
398
- * - **Dev mode** (`NODE_ENV !== "production"`): Auth is skipped entirely.
399
- * `getSession()` returns `{ email: "local@localhost" }` for all requests.
400
- *
401
- * - **Production with ACCESS_TOKEN/ACCESS_TOKENS set**: Auth middleware is
402
- * mounted. Unauthenticated requests see a login page. One env var is all
403
- * you need.
404
- *
405
- * - **Production without tokens and AUTH_DISABLED !== "true"**: Refuses to
406
- * start. Logs a clear error explaining what to do.
407
- *
408
- * - **Production with AUTH_DISABLED=true**: Auth is skipped (for apps behind
409
- * infrastructure-level auth like Cloudflare Access or a VPN).
784
+ * - **AUTH_MODE=local**: Auth bypassed. `getSession()` returns `{ email: "local@localhost" }`.
785
+ * This is the explicit escape hatch for solo local development.
786
+ * - **BYOA (custom getSession)**: Template-provided auth callback handles everything.
787
+ * - **AUTH_DISABLED=true**: Auth bypassed (for infrastructure-level auth like Cloudflare Access).
788
+ * - **ACCESS_TOKEN/ACCESS_TOKENS**: Simple token-based auth.
789
+ * - **Default**: Better Auth with email/password, social providers, organizations, and JWT.
790
+ * Users see an onboarding page to create an account on first visit.
410
791
  *
411
792
  * Returns true if auth was mounted, false if skipped.
412
793
  */
413
- export function autoMountAuth(app, options = {}) {
414
- // In Nitro 3.0 dev mode, the H3 app may not be available yet.
415
- // In dev mode auth is bypassed anyway, so we can safely skip.
794
+ export async function autoMountAuth(app, options = {}) {
795
+ // If auth is already mounted (e.g., default plugin ran before custom plugin),
796
+ // don't re-mount routes but DO update the live config if custom options
797
+ // like googleOnly or loginHtml were provided. This fixes the production race
798
+ // where the default plugin (no googleOnly) mounts first, and the template's
799
+ // custom auth plugin runs later. Because createAuthGuardFn() reads from
800
+ // _authGuardConfig on every request, updating it here takes effect immediately.
801
+ if (_authGuardFn) {
802
+ if (_authGuardConfig) {
803
+ if (options.googleOnly || options.loginHtml) {
804
+ _authGuardConfig.loginHtml =
805
+ options.loginHtml ??
806
+ getOnboardingHtml({ googleOnly: options.googleOnly });
807
+ }
808
+ if (options.publicPaths) {
809
+ _authGuardConfig.publicPaths = [
810
+ ...(_authGuardConfig.publicPaths ?? []),
811
+ ...options.publicPaths,
812
+ ];
813
+ }
814
+ }
815
+ return true;
816
+ }
416
817
  if (!app) {
417
- if (isDevMode()) {
818
+ if (isLocalMode() || isDevEnvironment()) {
418
819
  authDisabledMode = false;
419
820
  customGetSession = null;
420
821
  return false;
421
822
  }
422
823
  throw new Error("autoMountAuth: H3 app is required. In Nitro plugins, pass nitroApp.h3App.");
423
824
  }
424
- // Reset globals to avoid stale state from prior calls
825
+ // Reset globals
425
826
  customGetSession = null;
426
827
  authDisabledMode = false;
427
828
  sessionMaxAge = options.maxAge ?? DEFAULT_MAX_AGE;
@@ -429,25 +830,17 @@ export function autoMountAuth(app, options = {}) {
429
830
  if (options.getSession) {
430
831
  customGetSession = options.getSession;
431
832
  }
432
- // Dev mode skip auth entirely
433
- if (isDevMode()) {
434
- // Mount a session endpoint that returns the dev stub
435
- app.use("/api/auth/session", defineEventHandler(async (event) => {
436
- if (getMethod(event) !== "GET") {
437
- setResponseStatus(event, 405);
438
- return { error: "Method not allowed" };
439
- }
440
- return DEV_SESSION;
441
- }));
442
- // Mount no-op login/logout so client code doesn't break
443
- app.use("/api/auth/login", defineEventHandler(() => ({ ok: true })));
444
- app.use("/api/auth/logout", defineEventHandler(() => ({ ok: true })));
833
+ // AUTH_MODE=localexplicit local-only mode (escape hatch)
834
+ if (isLocalMode()) {
835
+ mountLocalModeRoutes(app);
836
+ // Still init Better Auth in background so users can create accounts later
837
+ getBetterAuth(options.betterAuth).catch(() => { });
838
+ console.log("[agent-native] Auth mode: local (no auth required).");
445
839
  return false;
446
840
  }
447
- // BYOA with custom getSession — skip token check, mount session/guard routes
841
+ // BYOA custom getSession provider
448
842
  if (customGetSession) {
449
- // Mount session endpoint
450
- app.use("/api/auth/session", defineEventHandler(async (event) => {
843
+ app.use("/_agent-native/auth/session", defineEventHandler(async (event) => {
451
844
  if (getMethod(event) !== "GET") {
452
845
  setResponseStatus(event, 405);
453
846
  return { error: "Method not allowed" };
@@ -455,80 +848,64 @@ export function autoMountAuth(app, options = {}) {
455
848
  const session = await getSession(event);
456
849
  return session ?? { error: "Not authenticated" };
457
850
  }));
458
- app.use("/api/auth/login", defineEventHandler(() => ({ ok: true })));
459
- app.use("/api/auth/logout", defineEventHandler(async (event) => {
851
+ app.use("/_agent-native/auth/login", defineEventHandler(() => ({ ok: true })));
852
+ app.use("/_agent-native/auth/logout", defineEventHandler(async (event) => {
460
853
  const cookie = getCookie(event, COOKIE_NAME);
461
854
  if (cookie)
462
855
  await removeSession(cookie);
463
856
  deleteCookie(event, COOKIE_NAME, { path: "/" });
464
857
  return { ok: true };
465
858
  }));
466
- // Mount auth guard that delegates to custom getSession
467
- const byoaLoginHtml = options.loginHtml ?? LOGIN_HTML;
468
- app.use(defineEventHandler(async (event) => {
469
- // Use H3's getRequestURL for cross-platform compat (Node + Workers)
470
- const url = event.node?.req?.url ?? event.path ?? "/";
471
- const p = url.split("?")[0];
472
- if (p === "/api/auth/login" ||
473
- p === "/api/auth/logout" ||
474
- p === "/api/auth/session") {
475
- return;
476
- }
477
- // Skip public paths
478
- if (isPublicPath(url, publicPaths)) {
479
- return;
480
- }
481
- const session = await getSession(event);
482
- if (session)
483
- return;
484
- if (p.startsWith("/api/")) {
485
- setResponseStatus(event, 401);
486
- return { error: "Unauthorized" };
487
- }
488
- setResponseStatus(event, 200);
489
- setResponseHeader(event, "Content-Type", "text/html");
490
- return byoaLoginHtml;
491
- }));
859
+ const byoaLoginHtml = options.loginHtml ?? TOKEN_LOGIN_HTML;
860
+ _authGuardConfig = { loginHtml: byoaLoginHtml, publicPaths };
861
+ const guardFn = createAuthGuardFn();
862
+ _authGuardFn = guardFn;
863
+ app.use(defineEventHandler(guardFn));
492
864
  console.log("[agent-native] Auth enabled — custom getSession provider.");
493
865
  return true;
494
866
  }
495
- // Productioncheck for tokens
867
+ // AUTH_DISABLEDskip auth (infrastructure-level auth)
868
+ if (process.env.AUTH_DISABLED === "true") {
869
+ authDisabledMode = true;
870
+ console.warn("[agent-native] AUTH_DISABLED=true — running without auth. " +
871
+ "Ensure this app is behind infrastructure-level auth (Cloudflare Access, VPN, etc.).");
872
+ mountLocalModeRoutes(app);
873
+ return false;
874
+ }
875
+ // ACCESS_TOKEN-only mode
496
876
  const tokens = getAccessTokens();
497
- if (tokens.length === 0) {
498
- // No tokens set — check if auth is explicitly disabled
499
- if (process.env.AUTH_DISABLED === "true") {
500
- authDisabledMode = true;
501
- console.warn("[agent-native] AUTH_DISABLED=true — running in production without auth. " +
502
- "Ensure this app is behind infrastructure-level auth (Cloudflare Access, VPN, etc.).");
503
- // Mount session endpoint — getSession() will return DEV_SESSION
504
- app.use("/api/auth/session", defineEventHandler(async (event) => {
505
- if (getMethod(event) !== "GET") {
506
- setResponseStatus(event, 405);
507
- return { error: "Method not allowed" };
508
- }
509
- return DEV_SESSION;
510
- }));
511
- app.use("/api/auth/login", defineEventHandler(() => ({ ok: true })));
512
- app.use("/api/auth/logout", defineEventHandler(() => ({ ok: true })));
513
- return false;
514
- }
515
- // Refuse to start without auth in production
516
- const msg = "\n" +
517
- "=".repeat(70) +
518
- "\n" +
519
- " ERROR: Running in production without authentication.\n\n" +
520
- " Set ACCESS_TOKEN=<your-secret> to enable auth, or\n" +
521
- " set AUTH_DISABLED=true if this app is behind infrastructure auth.\n\n" +
522
- " For multi-user access: ACCESS_TOKENS=token1,token2,token3\n" +
523
- "=".repeat(70) +
524
- "\n";
525
- console.error(msg);
526
- process.exit(1);
877
+ if (tokens.length > 0) {
878
+ mountTokenOnlyRoutes(app, tokens, publicPaths);
879
+ console.log(`[agent-native] Auth enabled — ${tokens.length} access token(s) configured.`);
880
+ return true;
881
+ }
882
+ // Default: Better Auth (account-first)
883
+ try {
884
+ await mountBetterAuthRoutes(app, options);
885
+ console.log("[agent-native] Auth enabled — Better Auth (accounts + organizations).");
886
+ }
887
+ catch (err) {
888
+ console.error("[agent-native] Failed to initialize Better Auth:", err);
889
+ // CRITICAL: Even if Better Auth fails, register the auth guard so
890
+ // unauthenticated users can't access the app. They'll see the login
891
+ // page but won't be able to sign in until the DB is available.
892
+ const loginHtml = options.loginHtml ??
893
+ getOnboardingHtml({ googleOnly: options.googleOnly });
894
+ _authGuardConfig = { loginHtml, publicPaths };
895
+ const guardFn = createAuthGuardFn();
896
+ _authGuardFn = guardFn;
897
+ app.use(defineEventHandler(guardFn));
898
+ console.log("[agent-native] Auth guard registered despite init failure — app is locked.");
527
899
  }
528
- // Production with tokens — mount auth
529
- pruneExpiredSessions().catch(() => { });
530
- mountAuthRoutes(app, tokens, publicPaths);
531
- console.log(`[agent-native] Auth enabled — ${tokens.length} access token(s) configured.`);
532
900
  return true;
533
901
  }
902
+ // ---------------------------------------------------------------------------
903
+ // Deprecated — kept for backward compat
904
+ // ---------------------------------------------------------------------------
905
+ /**
906
+ * @deprecated Use `autoMountAuth(app, options?)` instead.
907
+ */
908
+ export function mountAuthMiddleware(app, accessToken) {
909
+ mountTokenOnlyRoutes(app, [accessToken]);
910
+ }
534
911
  //# sourceMappingURL=auth.js.map