@agent-native/core 0.14.8 → 0.15.0

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 (420) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/builder-engine.js +30 -9
  4. package/dist/agent/engine/builder-engine.js.map +1 -1
  5. package/dist/agent/engine/registry.d.ts.map +1 -1
  6. package/dist/agent/engine/registry.js +14 -4
  7. package/dist/agent/engine/registry.js.map +1 -1
  8. package/dist/agent/production-agent.d.ts.map +1 -1
  9. package/dist/agent/production-agent.js +71 -4
  10. package/dist/agent/production-agent.js.map +1 -1
  11. package/dist/agent/types.d.ts +9 -0
  12. package/dist/agent/types.d.ts.map +1 -1
  13. package/dist/agent/types.js.map +1 -1
  14. package/dist/appearance/actions/change-appearance.d.ts +3 -0
  15. package/dist/appearance/actions/change-appearance.d.ts.map +1 -0
  16. package/dist/appearance/actions/change-appearance.js +29 -0
  17. package/dist/appearance/actions/change-appearance.js.map +1 -0
  18. package/dist/chat-threads/store.d.ts +53 -2
  19. package/dist/chat-threads/store.d.ts.map +1 -1
  20. package/dist/chat-threads/store.js +172 -12
  21. package/dist/chat-threads/store.js.map +1 -1
  22. package/dist/cli/create.d.ts.map +1 -1
  23. package/dist/cli/create.js +114 -37
  24. package/dist/cli/create.js.map +1 -1
  25. package/dist/cli/index.js +30 -4
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/cli/workspace-dev.d.ts +25 -1
  28. package/dist/cli/workspace-dev.d.ts.map +1 -1
  29. package/dist/cli/workspace-dev.js +275 -49
  30. package/dist/cli/workspace-dev.js.map +1 -1
  31. package/dist/client/AgentPanel.d.ts +23 -4
  32. package/dist/client/AgentPanel.d.ts.map +1 -1
  33. package/dist/client/AgentPanel.js +276 -53
  34. package/dist/client/AgentPanel.js.map +1 -1
  35. package/dist/client/AppearancePicker.d.ts +11 -0
  36. package/dist/client/AppearancePicker.d.ts.map +1 -0
  37. package/dist/client/AppearancePicker.js +16 -0
  38. package/dist/client/AppearancePicker.js.map +1 -0
  39. package/dist/client/AssistantChat.d.ts +35 -0
  40. package/dist/client/AssistantChat.d.ts.map +1 -1
  41. package/dist/client/AssistantChat.js +315 -32
  42. package/dist/client/AssistantChat.js.map +1 -1
  43. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  44. package/dist/client/ConnectBuilderCard.js +5 -2
  45. package/dist/client/ConnectBuilderCard.js.map +1 -1
  46. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  47. package/dist/client/ErrorBoundary.js +8 -10
  48. package/dist/client/ErrorBoundary.js.map +1 -1
  49. package/dist/client/FeedbackButton.d.ts.map +1 -1
  50. package/dist/client/FeedbackButton.js +1 -1
  51. package/dist/client/FeedbackButton.js.map +1 -1
  52. package/dist/client/MultiTabAssistantChat.d.ts +13 -1
  53. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  54. package/dist/client/MultiTabAssistantChat.js +217 -38
  55. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  56. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  57. package/dist/client/NewWorkspaceAppFlow.js +37 -14
  58. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  59. package/dist/client/agent-chat-adapter.d.ts +5 -0
  60. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  61. package/dist/client/agent-chat-adapter.js +4 -0
  62. package/dist/client/agent-chat-adapter.js.map +1 -1
  63. package/dist/client/agent-sidebar-state.d.ts +12 -0
  64. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  65. package/dist/client/agent-sidebar-state.js +8 -0
  66. package/dist/client/agent-sidebar-state.js.map +1 -1
  67. package/dist/client/analytics.d.ts.map +1 -1
  68. package/dist/client/analytics.js +175 -3
  69. package/dist/client/analytics.js.map +1 -1
  70. package/dist/client/appearance.d.ts +40 -0
  71. package/dist/client/appearance.d.ts.map +1 -0
  72. package/dist/client/appearance.js +114 -0
  73. package/dist/client/appearance.js.map +1 -0
  74. package/dist/client/builder-frame.d.ts +1 -0
  75. package/dist/client/builder-frame.d.ts.map +1 -1
  76. package/dist/client/builder-frame.js +19 -9
  77. package/dist/client/builder-frame.js.map +1 -1
  78. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  79. package/dist/client/components/CodeRequiredDialog.js +10 -2
  80. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  81. package/dist/client/components/ui/dropdown-menu.js +2 -2
  82. package/dist/client/components/ui/dropdown-menu.js.map +1 -1
  83. package/dist/client/components/ui/hover-card.js +1 -1
  84. package/dist/client/components/ui/hover-card.js.map +1 -1
  85. package/dist/client/components/ui/popover.js +1 -1
  86. package/dist/client/components/ui/popover.js.map +1 -1
  87. package/dist/client/composer/PromptComposer.d.ts +7 -0
  88. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  89. package/dist/client/composer/PromptComposer.js +63 -32
  90. package/dist/client/composer/PromptComposer.js.map +1 -1
  91. package/dist/client/composer/TiptapComposer.d.ts +5 -0
  92. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  93. package/dist/client/composer/TiptapComposer.js +36 -6
  94. package/dist/client/composer/TiptapComposer.js.map +1 -1
  95. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  96. package/dist/client/composer/useVoiceDictation.js +13 -1
  97. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  98. package/dist/client/error-format.d.ts +3 -2
  99. package/dist/client/error-format.d.ts.map +1 -1
  100. package/dist/client/error-format.js +9 -2
  101. package/dist/client/error-format.js.map +1 -1
  102. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  103. package/dist/client/extensions/ExtensionViewer.js +24 -2
  104. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  105. package/dist/client/index.d.ts +8 -1
  106. package/dist/client/index.d.ts.map +1 -1
  107. package/dist/client/index.js +7 -0
  108. package/dist/client/index.js.map +1 -1
  109. package/dist/client/onboarding/OnboardingPanel.js +1 -0
  110. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  111. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  112. package/dist/client/org/InvitationBanner.js +23 -2
  113. package/dist/client/org/InvitationBanner.js.map +1 -1
  114. package/dist/client/org/OrgSwitcher.d.ts +5 -4
  115. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  116. package/dist/client/org/OrgSwitcher.js +57 -9
  117. package/dist/client/org/OrgSwitcher.js.map +1 -1
  118. package/dist/client/org/hooks.d.ts.map +1 -1
  119. package/dist/client/org/hooks.js +10 -6
  120. package/dist/client/org/hooks.js.map +1 -1
  121. package/dist/client/org/workspace-app-links.d.ts +31 -0
  122. package/dist/client/org/workspace-app-links.d.ts.map +1 -0
  123. package/dist/client/org/workspace-app-links.js +268 -0
  124. package/dist/client/org/workspace-app-links.js.map +1 -0
  125. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  126. package/dist/client/resources/ResourcesPanel.js +18 -5
  127. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  128. package/dist/client/resources/use-resources.d.ts +18 -13
  129. package/dist/client/resources/use-resources.d.ts.map +1 -1
  130. package/dist/client/resources/use-resources.js +24 -6
  131. package/dist/client/resources/use-resources.js.map +1 -1
  132. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  133. package/dist/client/settings/BackgroundAgentSection.js +9 -1
  134. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  135. package/dist/client/settings/BrowserSection.d.ts.map +1 -1
  136. package/dist/client/settings/BrowserSection.js +16 -1
  137. package/dist/client/settings/BrowserSection.js.map +1 -1
  138. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  139. package/dist/client/settings/SettingsPanel.js +4 -1
  140. package/dist/client/settings/SettingsPanel.js.map +1 -1
  141. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  142. package/dist/client/settings/VoiceTranscriptionSection.js +5 -5
  143. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  144. package/dist/client/settings/useBuilderStatus.d.ts +8 -0
  145. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  146. package/dist/client/settings/useBuilderStatus.js +50 -13
  147. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  148. package/dist/client/settings/useBuilderStatus.spec.d.ts +2 -0
  149. package/dist/client/settings/useBuilderStatus.spec.d.ts.map +1 -0
  150. package/dist/client/settings/useBuilderStatus.spec.js +64 -0
  151. package/dist/client/settings/useBuilderStatus.spec.js.map +1 -0
  152. package/dist/client/sharing/ShareButton.d.ts +5 -0
  153. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  154. package/dist/client/sharing/ShareButton.js +60 -6
  155. package/dist/client/sharing/ShareButton.js.map +1 -1
  156. package/dist/client/theme.js +1 -1
  157. package/dist/client/theme.js.map +1 -1
  158. package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
  159. package/dist/client/transcription/BuilderTranscriptionCta.js +2 -3
  160. package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
  161. package/dist/client/use-change-version.d.ts +46 -0
  162. package/dist/client/use-change-version.d.ts.map +1 -0
  163. package/dist/client/use-change-version.js +135 -0
  164. package/dist/client/use-change-version.js.map +1 -0
  165. package/dist/client/use-chat-threads.d.ts +16 -2
  166. package/dist/client/use-chat-threads.d.ts.map +1 -1
  167. package/dist/client/use-chat-threads.js +87 -12
  168. package/dist/client/use-chat-threads.js.map +1 -1
  169. package/dist/client/use-chat-threads.spec.d.ts +2 -0
  170. package/dist/client/use-chat-threads.spec.d.ts.map +1 -0
  171. package/dist/client/use-chat-threads.spec.js +85 -0
  172. package/dist/client/use-chat-threads.spec.js.map +1 -0
  173. package/dist/client/use-db-sync.d.ts +5 -2
  174. package/dist/client/use-db-sync.d.ts.map +1 -1
  175. package/dist/client/use-db-sync.js +41 -16
  176. package/dist/client/use-db-sync.js.map +1 -1
  177. package/dist/client/use-pinch-zoom.d.ts +35 -0
  178. package/dist/client/use-pinch-zoom.d.ts.map +1 -0
  179. package/dist/client/use-pinch-zoom.js +105 -0
  180. package/dist/client/use-pinch-zoom.js.map +1 -0
  181. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  182. package/dist/deploy/workspace-deploy.js +99 -5
  183. package/dist/deploy/workspace-deploy.js.map +1 -1
  184. package/dist/extensions/actions.d.ts.map +1 -1
  185. package/dist/extensions/actions.js +3 -0
  186. package/dist/extensions/actions.js.map +1 -1
  187. package/dist/extensions/store.d.ts +5 -0
  188. package/dist/extensions/store.d.ts.map +1 -1
  189. package/dist/extensions/store.js +16 -1
  190. package/dist/extensions/store.js.map +1 -1
  191. package/dist/file-upload/actions/upload-image.d.ts +3 -0
  192. package/dist/file-upload/actions/upload-image.d.ts.map +1 -0
  193. package/dist/file-upload/actions/upload-image.js +145 -0
  194. package/dist/file-upload/actions/upload-image.js.map +1 -0
  195. package/dist/file-upload/builder.d.ts.map +1 -1
  196. package/dist/file-upload/builder.js +31 -11
  197. package/dist/file-upload/builder.js.map +1 -1
  198. package/dist/file-upload/index.d.ts +1 -0
  199. package/dist/file-upload/index.d.ts.map +1 -1
  200. package/dist/file-upload/index.js +1 -0
  201. package/dist/file-upload/index.js.map +1 -1
  202. package/dist/file-upload/pre-upload-attachments.d.ts +39 -0
  203. package/dist/file-upload/pre-upload-attachments.d.ts.map +1 -0
  204. package/dist/file-upload/pre-upload-attachments.js +110 -0
  205. package/dist/file-upload/pre-upload-attachments.js.map +1 -0
  206. package/dist/file-upload/registry.d.ts.map +1 -1
  207. package/dist/file-upload/registry.js +8 -7
  208. package/dist/file-upload/registry.js.map +1 -1
  209. package/dist/onboarding/default-steps.js +1 -1
  210. package/dist/onboarding/default-steps.js.map +1 -1
  211. package/dist/org/context.d.ts +15 -1
  212. package/dist/org/context.d.ts.map +1 -1
  213. package/dist/org/context.js +25 -0
  214. package/dist/org/context.js.map +1 -1
  215. package/dist/org/handlers.d.ts +2 -2
  216. package/dist/org/handlers.d.ts.map +1 -1
  217. package/dist/org/handlers.js +3 -17
  218. package/dist/org/handlers.js.map +1 -1
  219. package/dist/org/index.d.ts +1 -1
  220. package/dist/org/index.d.ts.map +1 -1
  221. package/dist/org/index.js +1 -1
  222. package/dist/org/index.js.map +1 -1
  223. package/dist/resources/handlers.d.ts +6 -0
  224. package/dist/resources/handlers.d.ts.map +1 -1
  225. package/dist/resources/handlers.js +30 -6
  226. package/dist/resources/handlers.js.map +1 -1
  227. package/dist/resources/script-helpers.d.ts +11 -2
  228. package/dist/resources/script-helpers.d.ts.map +1 -1
  229. package/dist/resources/script-helpers.js +20 -3
  230. package/dist/resources/script-helpers.js.map +1 -1
  231. package/dist/resources/store.d.ts +28 -3
  232. package/dist/resources/store.d.ts.map +1 -1
  233. package/dist/resources/store.js +170 -20
  234. package/dist/resources/store.js.map +1 -1
  235. package/dist/scripts/resources/list.d.ts +1 -1
  236. package/dist/scripts/resources/list.d.ts.map +1 -1
  237. package/dist/scripts/resources/list.js +16 -4
  238. package/dist/scripts/resources/list.js.map +1 -1
  239. package/dist/scripts/resources/write.d.ts +1 -1
  240. package/dist/scripts/resources/write.d.ts.map +1 -1
  241. package/dist/scripts/resources/write.js +47 -3
  242. package/dist/scripts/resources/write.js.map +1 -1
  243. package/dist/server/action-discovery.d.ts.map +1 -1
  244. package/dist/server/action-discovery.js +8 -3
  245. package/dist/server/action-discovery.js.map +1 -1
  246. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  247. package/dist/server/agent-chat-plugin.js +214 -25
  248. package/dist/server/agent-chat-plugin.js.map +1 -1
  249. package/dist/server/agent-discovery.d.ts +35 -0
  250. package/dist/server/agent-discovery.d.ts.map +1 -1
  251. package/dist/server/agent-discovery.js +139 -8
  252. package/dist/server/agent-discovery.js.map +1 -1
  253. package/dist/server/app-url.d.ts +12 -6
  254. package/dist/server/app-url.d.ts.map +1 -1
  255. package/dist/server/app-url.js +58 -11
  256. package/dist/server/app-url.js.map +1 -1
  257. package/dist/server/auth.d.ts +22 -0
  258. package/dist/server/auth.d.ts.map +1 -1
  259. package/dist/server/auth.js +272 -59
  260. package/dist/server/auth.js.map +1 -1
  261. package/dist/server/better-auth-instance.d.ts +0 -4
  262. package/dist/server/better-auth-instance.d.ts.map +1 -1
  263. package/dist/server/better-auth-instance.js +0 -3
  264. package/dist/server/better-auth-instance.js.map +1 -1
  265. package/dist/server/builder-browser.d.ts.map +1 -1
  266. package/dist/server/builder-browser.js +23 -0
  267. package/dist/server/builder-browser.js.map +1 -1
  268. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  269. package/dist/server/core-routes-plugin.js +29 -14
  270. package/dist/server/core-routes-plugin.js.map +1 -1
  271. package/dist/server/credential-provider.d.ts +14 -0
  272. package/dist/server/credential-provider.d.ts.map +1 -1
  273. package/dist/server/credential-provider.js +88 -11
  274. package/dist/server/credential-provider.js.map +1 -1
  275. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  276. package/dist/server/google-auth-plugin.js +53 -13
  277. package/dist/server/google-auth-plugin.js.map +1 -1
  278. package/dist/server/google-oauth.d.ts.map +1 -1
  279. package/dist/server/google-oauth.js +47 -17
  280. package/dist/server/google-oauth.js.map +1 -1
  281. package/dist/server/index.d.ts +1 -1
  282. package/dist/server/index.d.ts.map +1 -1
  283. package/dist/server/index.js +1 -1
  284. package/dist/server/index.js.map +1 -1
  285. package/dist/server/oauth-public-origin.d.ts.map +1 -1
  286. package/dist/server/oauth-public-origin.js +19 -1
  287. package/dist/server/oauth-public-origin.js.map +1 -1
  288. package/dist/server/onboarding-html.d.ts.map +1 -1
  289. package/dist/server/onboarding-html.js +62 -15
  290. package/dist/server/onboarding-html.js.map +1 -1
  291. package/dist/server/poll.d.ts.map +1 -1
  292. package/dist/server/poll.js +20 -5
  293. package/dist/server/poll.js.map +1 -1
  294. package/dist/server/request-context.d.ts +8 -0
  295. package/dist/server/request-context.d.ts.map +1 -1
  296. package/dist/server/request-context.js.map +1 -1
  297. package/dist/shared/index.d.ts +2 -0
  298. package/dist/shared/index.d.ts.map +1 -1
  299. package/dist/shared/index.js +2 -0
  300. package/dist/shared/index.js.map +1 -1
  301. package/dist/shared/llm-connection.d.ts +10 -0
  302. package/dist/shared/llm-connection.d.ts.map +1 -0
  303. package/dist/shared/llm-connection.js +29 -0
  304. package/dist/shared/llm-connection.js.map +1 -0
  305. package/dist/shared/workspace-app-audience.d.ts +25 -0
  306. package/dist/shared/workspace-app-audience.d.ts.map +1 -0
  307. package/dist/shared/workspace-app-audience.js +126 -0
  308. package/dist/shared/workspace-app-audience.js.map +1 -0
  309. package/dist/shared/workspace-app-id.d.ts +1 -1
  310. package/dist/shared/workspace-app-id.d.ts.map +1 -1
  311. package/dist/shared/workspace-app-id.js +1 -0
  312. package/dist/shared/workspace-app-id.js.map +1 -1
  313. package/dist/sharing/access.d.ts.map +1 -1
  314. package/dist/sharing/access.js +46 -5
  315. package/dist/sharing/access.js.map +1 -1
  316. package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -1
  317. package/dist/sharing/actions/list-resource-shares.js +8 -1
  318. package/dist/sharing/actions/list-resource-shares.js.map +1 -1
  319. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  320. package/dist/sharing/actions/set-resource-visibility.js +12 -3
  321. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  322. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  323. package/dist/sharing/actions/share-resource.js +50 -1
  324. package/dist/sharing/actions/share-resource.js.map +1 -1
  325. package/dist/sharing/registry.d.ts +26 -0
  326. package/dist/sharing/registry.d.ts.map +1 -1
  327. package/dist/sharing/registry.js.map +1 -1
  328. package/dist/styles/agent-native.css +91 -0
  329. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
  330. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
  331. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
  332. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
  333. package/dist/templates/default/AGENTS.md +22 -19
  334. package/dist/templates/default/actions/navigate.ts +3 -0
  335. package/dist/templates/default/app/hooks/use-navigation-state.ts +29 -5
  336. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
  337. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
  338. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
  339. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
  340. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
  341. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
  342. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
  343. package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
  344. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
  345. package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
  346. package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
  347. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
  348. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
  349. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
  350. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
  351. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
  352. package/dist/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
  353. package/dist/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
  354. package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
  355. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
  356. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
  357. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
  358. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
  359. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
  360. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
  361. package/dist/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
  362. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
  363. package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
  364. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
  365. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
  366. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
  367. package/dist/templates/workspace-core/AGENTS.md +16 -1
  368. package/dist/templates/workspace-root/AGENTS.md +35 -0
  369. package/dist/templates/workspace-root/README.md +7 -0
  370. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  371. package/dist/vite/action-types-plugin.js +4 -0
  372. package/dist/vite/action-types-plugin.js.map +1 -1
  373. package/docs/content/authentication.md +36 -0
  374. package/docs/content/creating-templates.md +15 -0
  375. package/docs/content/dispatch.md +3 -3
  376. package/docs/content/multi-app-workspace.md +5 -0
  377. package/docs/content/tracking.md +12 -0
  378. package/docs/content/workspace-management.md +39 -4
  379. package/package.json +15 -12
  380. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
  381. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
  382. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
  383. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
  384. package/src/templates/default/AGENTS.md +22 -19
  385. package/src/templates/default/actions/navigate.ts +3 -0
  386. package/src/templates/default/app/hooks/use-navigation-state.ts +29 -5
  387. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
  388. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
  389. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
  390. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
  391. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
  392. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
  393. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
  394. package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
  395. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
  396. package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
  397. package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
  398. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
  399. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
  400. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
  401. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
  402. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
  403. package/src/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
  404. package/src/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
  405. package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
  406. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
  407. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
  408. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
  409. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
  410. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
  411. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
  412. package/src/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
  413. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
  414. package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
  415. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
  416. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
  417. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
  418. package/src/templates/workspace-core/AGENTS.md +16 -1
  419. package/src/templates/workspace-root/AGENTS.md +35 -0
  420. package/src/templates/workspace-root/README.md +7 -0
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,7 @@ import { safeOAuthReturnUrl } from "./oauth-return-url.js";
45
45
  import { captureAuthError } from "./sentry.js";
46
46
  import { extractOAuthStateAppId } from "../shared/oauth-state.js";
47
47
  import { isValidWorkspaceAppIdFormat } from "../shared/workspace-app-id.js";
48
+ import { normalizeWorkspaceAppAudience, workspaceAppAudienceFromEnv, workspaceAppRouteAccessFromEnv, } from "../shared/workspace-app-audience.js";
48
49
  /**
49
50
  * Get the configured session max age. Desktop SSO broker writes from
50
51
  * OAuth flows read this so expiration stays consistent with the cookie.
@@ -117,6 +118,72 @@ export function cookieDomainAttrs() {
117
118
  const domain = getCookieDomain();
118
119
  return domain ? { domain } : {};
119
120
  }
121
+ function getCookieValues(event, name) {
122
+ const values = [];
123
+ const raw = getHeader(event, "cookie");
124
+ if (raw) {
125
+ for (const part of String(raw).split(";")) {
126
+ const trimmed = part.trim();
127
+ if (!trimmed)
128
+ continue;
129
+ const eq = trimmed.indexOf("=");
130
+ if (eq <= 0)
131
+ continue;
132
+ if (trimmed.slice(0, eq).trim() !== name)
133
+ continue;
134
+ let value = trimmed.slice(eq + 1).trim();
135
+ if (value.startsWith('"') && value.endsWith('"')) {
136
+ value = value.slice(1, -1);
137
+ }
138
+ try {
139
+ value = decodeURIComponent(value);
140
+ }
141
+ catch {
142
+ // Keep the raw cookie value if it was not percent-encoded.
143
+ }
144
+ if (value && !values.includes(value))
145
+ values.push(value);
146
+ }
147
+ }
148
+ // H3's cookie parser keeps only the first duplicate name. Preserve it as a
149
+ // fallback for mock/runtime shapes that do not expose the raw Cookie header.
150
+ const parsed = getCookie(event, name);
151
+ if (parsed && !values.includes(parsed))
152
+ values.push(parsed);
153
+ return values;
154
+ }
155
+ function getFrameworkSessionCookieValues(event) {
156
+ return getCookieValues(event, COOKIE_NAME);
157
+ }
158
+ function frameworkSessionCookieNamesToClear() {
159
+ const names = new Set([COOKIE_NAME]);
160
+ if (APP_NAME_SLUG)
161
+ names.add(`an_session_${APP_NAME_SLUG}`);
162
+ return [...names];
163
+ }
164
+ function deleteCookieFromEveryScope(event, name) {
165
+ // Clear host-only cookies first. When COOKIE_DOMAIN was introduced, stale
166
+ // host-only `an_session` cookies could shadow the new domain cookie because
167
+ // browsers send older same-path duplicates first.
168
+ deleteCookie(event, name, { path: "/" });
169
+ const domainAttrs = cookieDomainAttrs();
170
+ if (domainAttrs.domain) {
171
+ deleteCookie(event, name, { path: "/", ...domainAttrs });
172
+ }
173
+ }
174
+ function clearFrameworkSessionCookies(event) {
175
+ for (const name of frameworkSessionCookieNamesToClear()) {
176
+ deleteCookieFromEveryScope(event, name);
177
+ }
178
+ }
179
+ async function getLegacyCookieSession(event) {
180
+ for (const cookie of getFrameworkSessionCookieValues(event)) {
181
+ const email = await getSessionEmail(cookie);
182
+ if (email)
183
+ return { email, token: cookie };
184
+ }
185
+ return null;
186
+ }
120
187
  function getOAuthStateAppId() {
121
188
  const raw = process.env.APP_NAME || process.env.npm_package_name;
122
189
  if (!raw)
@@ -478,6 +545,16 @@ export async function getSessionEmail(token) {
478
545
  let customGetSession = null;
479
546
  let _authGuardConfig = null;
480
547
  const _genericGoogleOAuthRoutesEnabled = new WeakMap();
548
+ function resolveWorkspaceAppAudience(options = {}) {
549
+ return normalizeWorkspaceAppAudience(options.workspaceAppAudience ?? workspaceAppAudienceFromEnv());
550
+ }
551
+ function resolveWorkspaceAppRouteAccess(options = {}) {
552
+ const env = workspaceAppRouteAccessFromEnv();
553
+ return {
554
+ publicPaths: options.workspaceAppPublicPaths ?? env.publicPaths,
555
+ protectedPaths: options.workspaceAppProtectedPaths ?? env.protectedPaths,
556
+ };
557
+ }
481
558
  function setGenericGoogleOAuthRoutesEnabled(app, enabled) {
482
559
  if (app && typeof app === "object") {
483
560
  _genericGoogleOAuthRoutesEnabled.set(app, enabled);
@@ -850,6 +927,9 @@ function createAuthGuardFn() {
850
927
  return;
851
928
  if (isPublicPath(normalizedUrl, publicPaths))
852
929
  return;
930
+ if (isPublicWorkspacePageRequest(event, p, config)) {
931
+ return;
932
+ }
853
933
  const session = await getSession(event);
854
934
  if (session)
855
935
  return;
@@ -857,12 +937,116 @@ function createAuthGuardFn() {
857
937
  setResponseStatus(event, 401);
858
938
  return { error: "Unauthorized" };
859
939
  }
940
+ // Local-dev convenience: on the first page GET of a freshly-scaffolded
941
+ // app, transparently create + sign in `dev@local` instead of showing the
942
+ // sign-up form. Gated on NODE_ENV=development AND no real users in the
943
+ // DB, so production and any app that has ever had a real signup are
944
+ // unaffected. See maybeAutoCreateDevSession for full conditions.
945
+ if (getMethod(event) === "GET") {
946
+ const autoSession = await maybeAutoCreateDevSession(event, url);
947
+ if (autoSession)
948
+ return autoSession;
949
+ }
860
950
  return new Response(loginHtml, {
861
951
  status: 200,
862
952
  headers: { "Content-Type": "text/html; charset=utf-8" },
863
953
  });
864
954
  };
865
955
  }
956
+ const AUTO_DEV_ACCOUNT_EMAIL = "dev@local";
957
+ const AUTO_DEV_ACCOUNT_PASSWORD = "local-dev-account";
958
+ /**
959
+ * Local-dev convenience: skip the sign-up wall on first run.
960
+ *
961
+ * When NODE_ENV=development AND the `user` table has no rows for any
962
+ * email other than `dev@local`, transparently sign up (or sign back in
963
+ * to) the auto-managed dev account and return a 302 to the original URL
964
+ * with a session cookie set. A developer who just ran `pnpm dev` lands
965
+ * in the app immediately instead of being asked to fill in name + email
966
+ * + password to try the framework.
967
+ *
968
+ * Auto-create fires exactly once per local DB: as soon as `dev@local`
969
+ * (or any real user) exists in the `user` table, the helper returns
970
+ * null and the normal login flow takes over. Signing out then leaves
971
+ * the user on the regular sign-in form; without this guard the
972
+ * post-logout reload would silently re-create the session.
973
+ *
974
+ * The fixed password is intentional: it means a developer who signs
975
+ * out can sign back in with `dev@local` / `local-dev-account` from
976
+ * the regular login form. To get the auto-flow back, drop the user
977
+ * row or wipe the local DB. Set
978
+ * `AGENT_NATIVE_DISABLE_AUTO_DEV_ACCOUNT=1` to opt out entirely
979
+ * (useful for tests that exercise the unauthenticated branch). This
980
+ * is local-only — the helper is gated on NODE_ENV.
981
+ */
982
+ async function maybeAutoCreateDevSession(event, redirectTo) {
983
+ if (!isDevEnvironment())
984
+ return null;
985
+ if (process.env.AGENT_NATIVE_DISABLE_AUTO_DEV_ACCOUNT === "1")
986
+ return null;
987
+ try {
988
+ const db = getDbExec();
989
+ const { rows: realUsers } = await db.execute({
990
+ sql: 'SELECT 1 FROM "user" WHERE email != ? LIMIT 1',
991
+ args: [AUTO_DEV_ACCOUNT_EMAIL],
992
+ });
993
+ if (realUsers.length > 0)
994
+ return null;
995
+ // If `dev@local` already exists, this is not a freshly-scaffolded
996
+ // app — the user has been through the auto-create flow at least
997
+ // once. Skip auto-create so signing out actually works: without
998
+ // this guard, the post-logout reload immediately re-creates the
999
+ // session and the user is stuck in dev@local forever (or has to
1000
+ // set AGENT_NATIVE_DISABLE_AUTO_DEV_ACCOUNT=1). To get the demo
1001
+ // experience back, drop the row or wipe the local DB.
1002
+ const { rows: devUsers } = await db.execute({
1003
+ sql: 'SELECT 1 FROM "user" WHERE email = ? LIMIT 1',
1004
+ args: [AUTO_DEV_ACCOUNT_EMAIL],
1005
+ });
1006
+ if (devUsers.length > 0)
1007
+ return null;
1008
+ const auth = await getBetterAuth();
1009
+ if (!auth)
1010
+ return null;
1011
+ // Idempotent sign-up: succeeds on first run, throws an "already exists"
1012
+ // failure on subsequent runs (which we swallow before falling through
1013
+ // to the sign-in path below).
1014
+ try {
1015
+ await auth.api.signUpEmail({
1016
+ body: {
1017
+ email: AUTO_DEV_ACCOUNT_EMAIL,
1018
+ password: AUTO_DEV_ACCOUNT_PASSWORD,
1019
+ name: "Dev",
1020
+ },
1021
+ });
1022
+ }
1023
+ catch (e) {
1024
+ if (!isExpectedAuthFailure(e))
1025
+ throw e;
1026
+ }
1027
+ const result = await auth.api.signInEmail({
1028
+ body: {
1029
+ email: AUTO_DEV_ACCOUNT_EMAIL,
1030
+ password: AUTO_DEV_ACCOUNT_PASSWORD,
1031
+ },
1032
+ });
1033
+ if (!result?.token)
1034
+ return null;
1035
+ setFrameworkSessionCookie(event, result.token);
1036
+ await addSession(result.token, AUTO_DEV_ACCOUNT_EMAIL);
1037
+ return new Response("", {
1038
+ status: 302,
1039
+ headers: { Location: redirectTo },
1040
+ });
1041
+ }
1042
+ catch (e) {
1043
+ // Local-dev only — log to console for debugging, but don't surface
1044
+ // through Sentry. Falling back to the regular login form is the
1045
+ // correct user-facing behavior when this path fails.
1046
+ console.warn("[agent-native] auto dev account skipped:", e);
1047
+ return null;
1048
+ }
1049
+ }
866
1050
  /**
867
1051
  * Map a Better Auth session to our AuthSession type.
868
1052
  */
@@ -896,12 +1080,9 @@ export async function getSession(event) {
896
1080
  // 1. ACCESS_TOKEN check (programmatic/agent access)
897
1081
  const accessTokens = getAccessTokens();
898
1082
  if (accessTokens.length > 0) {
899
- const cookie = getCookie(event, COOKIE_NAME);
900
- if (cookie) {
901
- const email = await getSessionEmail(cookie);
902
- if (email)
903
- return { email, token: cookie };
904
- }
1083
+ const cookieSession = await getLegacyCookieSession(event);
1084
+ if (cookieSession)
1085
+ return cookieSession;
905
1086
  }
906
1087
  // 2. BYOA custom getSession
907
1088
  if (customGetSession) {
@@ -943,13 +1124,9 @@ export async function getSession(event) {
943
1124
  console.error("[auth] ba.api.getSession error:", e);
944
1125
  }
945
1126
  // 5. Legacy cookie fallback (for sessions created before migration)
946
- const cookie = getCookie(event, COOKIE_NAME);
947
- if (cookie) {
948
- const email = await getSessionEmail(cookie);
949
- if (email) {
950
- return { email, token: cookie };
951
- }
952
- }
1127
+ const cookieSession = await getLegacyCookieSession(event);
1128
+ if (cookieSession)
1129
+ return cookieSession;
953
1130
  // 6. Desktop SSO broker fallback.
954
1131
  // Each template in the Electron desktop app has its own database, so
955
1132
  // a session token created by one template doesn't resolve in another.
@@ -1004,6 +1181,7 @@ function crossSiteCookieAttrs(event) {
1004
1181
  : { sameSite: "lax", secure: false };
1005
1182
  }
1006
1183
  export function setFrameworkSessionCookie(event, token) {
1184
+ clearFrameworkSessionCookies(event);
1007
1185
  setCookie(event, COOKIE_NAME, token, {
1008
1186
  httpOnly: true,
1009
1187
  ...crossSiteCookieAttrs(event),
@@ -1036,7 +1214,32 @@ function isHttpsRequest(event) {
1036
1214
  // ---------------------------------------------------------------------------
1037
1215
  function isPublicPath(url, publicPaths) {
1038
1216
  const p = url.split("?")[0];
1039
- return publicPaths.some((pp) => p === pp || p.startsWith(pp + "/"));
1217
+ return matchesPathList(p, publicPaths);
1218
+ }
1219
+ function matchesPathList(path, paths) {
1220
+ return paths.some((candidate) => {
1221
+ const normalized = candidate.length > 1 && candidate.endsWith("/")
1222
+ ? candidate.slice(0, -1)
1223
+ : candidate;
1224
+ return path === normalized || path.startsWith(normalized + "/");
1225
+ });
1226
+ }
1227
+ function isPublicWorkspacePageRequest(event, path, config) {
1228
+ if (!isReadMethod(event))
1229
+ return false;
1230
+ if (path === "/_agent-native" ||
1231
+ path.startsWith("/_agent-native/") ||
1232
+ path === "/api" ||
1233
+ path.startsWith("/api/") ||
1234
+ path === "/.well-known" ||
1235
+ path.startsWith("/.well-known/")) {
1236
+ return false;
1237
+ }
1238
+ if (matchesPathList(path, config.workspaceAppProtectedPaths))
1239
+ return false;
1240
+ if (matchesPathList(path, config.workspaceAppPublicPaths))
1241
+ return true;
1242
+ return config.workspaceAppAudience === "public";
1040
1243
  }
1041
1244
  function stripAppBasePath(pathname) {
1042
1245
  const basePath = getAppBasePath();
@@ -1384,6 +1587,8 @@ function getTokenLoginHtml(options = {}) {
1384
1587
  // ---------------------------------------------------------------------------
1385
1588
  async function mountBetterAuthRoutes(app, options) {
1386
1589
  const publicPaths = [...(options.publicPaths ?? [])];
1590
+ const workspaceAppAudience = resolveWorkspaceAppAudience(options);
1591
+ const workspaceAppRouteAccess = resolveWorkspaceAppRouteAccess(options);
1387
1592
  // The A2A agent card is part of an open protocol — other agents must be
1388
1593
  // able to discover it without auth. Same for favicons and similar probes.
1389
1594
  for (const pp of ["/.well-known", "/favicon.ico", "/favicon.png"]) {
@@ -1821,13 +2026,7 @@ async function mountBetterAuthRoutes(app, options) {
1821
2026
  }
1822
2027
  const sessionToken = crypto.randomBytes(32).toString("hex");
1823
2028
  await addSession(sessionToken, "user");
1824
- setCookie(event, COOKIE_NAME, sessionToken, {
1825
- httpOnly: true,
1826
- ...crossSiteCookieAttrs(event),
1827
- ...cookieDomainAttrs(),
1828
- path: "/",
1829
- maxAge: sessionMaxAge,
1830
- });
2029
+ setFrameworkSessionCookie(event, sessionToken);
1831
2030
  return authLoginResponse(event, sessionToken, "user");
1832
2031
  }
1833
2032
  // Email/password login via Better Auth
@@ -1842,13 +2041,7 @@ async function mountBetterAuthRoutes(app, options) {
1842
2041
  body: { email, password },
1843
2042
  });
1844
2043
  if (result?.token) {
1845
- setCookie(event, COOKIE_NAME, result.token, {
1846
- httpOnly: true,
1847
- ...crossSiteCookieAttrs(event),
1848
- ...cookieDomainAttrs(),
1849
- path: "/",
1850
- maxAge: sessionMaxAge,
1851
- });
2044
+ setFrameworkSessionCookie(event, result.token);
1852
2045
  await addSession(result.token, email);
1853
2046
  if (isElectronRequest(event)) {
1854
2047
  await writeDesktopSso({
@@ -1911,13 +2104,13 @@ async function mountBetterAuthRoutes(app, options) {
1911
2104
  }));
1912
2105
  // Backward-compat: POST /_agent-native/auth/logout
1913
2106
  app.use("/_agent-native/auth/logout", defineEventHandler(async (event) => {
1914
- const cookie = getCookie(event, COOKIE_NAME);
1915
- if (cookie)
2107
+ for (const cookie of getFrameworkSessionCookieValues(event)) {
1916
2108
  await removeSession(cookie);
2109
+ }
1917
2110
  const bearerToken = getBearerSessionToken(event);
1918
2111
  if (bearerToken)
1919
2112
  await removeSession(bearerToken);
1920
- deleteCookie(event, COOKIE_NAME, { path: "/", ...cookieDomainAttrs() });
2113
+ clearFrameworkSessionCookies(event);
1921
2114
  try {
1922
2115
  await auth.api.signOut({ headers: event.headers });
1923
2116
  }
@@ -1980,7 +2173,7 @@ async function mountBetterAuthRoutes(app, options) {
1980
2173
  }
1981
2174
  // 3. Drop the current request's cookie and best-effort sign out
1982
2175
  // of Better Auth (so the response sets the proper expiry header).
1983
- deleteCookie(event, COOKIE_NAME, { path: "/", ...cookieDomainAttrs() });
2176
+ clearFrameworkSessionCookies(event);
1984
2177
  try {
1985
2178
  await auth.api.signOut({ headers: event.headers });
1986
2179
  }
@@ -2026,7 +2219,13 @@ async function mountBetterAuthRoutes(app, options) {
2026
2219
  googleSignInNotice: options.googleSignInNotice,
2027
2220
  googleAuthMode: options.googleAuthMode,
2028
2221
  });
2029
- _authGuardConfig = { loginHtml, publicPaths };
2222
+ _authGuardConfig = {
2223
+ loginHtml,
2224
+ publicPaths,
2225
+ workspaceAppAudience,
2226
+ workspaceAppPublicPaths: workspaceAppRouteAccess.publicPaths,
2227
+ workspaceAppProtectedPaths: workspaceAppRouteAccess.protectedPaths,
2228
+ };
2030
2229
  const guardFn = createAuthGuardFn();
2031
2230
  _authGuardFn = guardFn;
2032
2231
  app.use(defineEventHandler(guardFn));
@@ -2034,7 +2233,7 @@ async function mountBetterAuthRoutes(app, options) {
2034
2233
  // ---------------------------------------------------------------------------
2035
2234
  // mountTokenOnlyRoutes — ACCESS_TOKEN-only auth (no Better Auth)
2036
2235
  // ---------------------------------------------------------------------------
2037
- function mountTokenOnlyRoutes(app, accessTokens, publicPaths = []) {
2236
+ function mountTokenOnlyRoutes(app, accessTokens, publicPaths = [], workspaceAppAudience = resolveWorkspaceAppAudience(), workspaceAppRouteAccess = resolveWorkspaceAppRouteAccess()) {
2038
2237
  app.use("/_agent-native/auth/login", defineEventHandler(async (event) => {
2039
2238
  if (getMethod(event) !== "POST") {
2040
2239
  setResponseStatus(event, 405);
@@ -2049,23 +2248,17 @@ function mountTokenOnlyRoutes(app, accessTokens, publicPaths = []) {
2049
2248
  }
2050
2249
  const sessionToken = crypto.randomBytes(32).toString("hex");
2051
2250
  await addSession(sessionToken, "user");
2052
- setCookie(event, COOKIE_NAME, sessionToken, {
2053
- httpOnly: true,
2054
- ...crossSiteCookieAttrs(event),
2055
- ...cookieDomainAttrs(),
2056
- path: "/",
2057
- maxAge: sessionMaxAge,
2058
- });
2251
+ setFrameworkSessionCookie(event, sessionToken);
2059
2252
  return authLoginResponse(event, sessionToken, "user");
2060
2253
  }));
2061
2254
  app.use("/_agent-native/auth/logout", defineEventHandler(async (event) => {
2062
- const cookie = getCookie(event, COOKIE_NAME);
2063
- if (cookie)
2255
+ for (const cookie of getFrameworkSessionCookieValues(event)) {
2064
2256
  await removeSession(cookie);
2257
+ }
2065
2258
  const bearerToken = getBearerSessionToken(event);
2066
2259
  if (bearerToken)
2067
2260
  await removeSession(bearerToken);
2068
- deleteCookie(event, COOKIE_NAME, { path: "/", ...cookieDomainAttrs() });
2261
+ clearFrameworkSessionCookies(event);
2069
2262
  if (isElectronRequest(event))
2070
2263
  await clearDesktopSso();
2071
2264
  return { ok: true };
@@ -2082,6 +2275,9 @@ function mountTokenOnlyRoutes(app, accessTokens, publicPaths = []) {
2082
2275
  loginHtml: getTokenLoginHtml(),
2083
2276
  getLoginHtml: (_event, rawPath) => getTokenLoginHtml({ requestPath: rawPath }),
2084
2277
  publicPaths,
2278
+ workspaceAppAudience,
2279
+ workspaceAppPublicPaths: workspaceAppRouteAccess.publicPaths,
2280
+ workspaceAppProtectedPaths: workspaceAppRouteAccess.protectedPaths,
2085
2281
  };
2086
2282
  const guardFn = createAuthGuardFn();
2087
2283
  _authGuardFn = guardFn;
@@ -2109,13 +2305,7 @@ function mountAuthFallbackRoutes(app) {
2109
2305
  body: { email, password },
2110
2306
  });
2111
2307
  if (result?.token) {
2112
- setCookie(event, COOKIE_NAME, result.token, {
2113
- httpOnly: true,
2114
- ...crossSiteCookieAttrs(event),
2115
- ...cookieDomainAttrs(),
2116
- path: "/",
2117
- maxAge: sessionMaxAge,
2118
- });
2308
+ setFrameworkSessionCookie(event, result.token);
2119
2309
  await addSession(result.token, email);
2120
2310
  if (isElectronRequest(event)) {
2121
2311
  await writeDesktopSso({
@@ -2171,13 +2361,13 @@ function mountAuthFallbackRoutes(app) {
2171
2361
  }
2172
2362
  }));
2173
2363
  app.use("/_agent-native/auth/logout", defineEventHandler(async (event) => {
2174
- const cookie = getCookie(event, COOKIE_NAME);
2175
- if (cookie)
2364
+ for (const cookie of getFrameworkSessionCookieValues(event)) {
2176
2365
  await removeSession(cookie);
2366
+ }
2177
2367
  const bearerToken = getBearerSessionToken(event);
2178
2368
  if (bearerToken)
2179
2369
  await removeSession(bearerToken);
2180
- deleteCookie(event, COOKIE_NAME, { path: "/", ...cookieDomainAttrs() });
2370
+ clearFrameworkSessionCookies(event);
2181
2371
  try {
2182
2372
  const auth = await getBetterAuth();
2183
2373
  await auth.api.signOut({ headers: event.headers });
@@ -2257,6 +2447,18 @@ export async function autoMountAuth(app, options = {}) {
2257
2447
  ...options.publicPaths,
2258
2448
  ];
2259
2449
  }
2450
+ if (options.workspaceAppAudience) {
2451
+ _authGuardConfig.workspaceAppAudience =
2452
+ resolveWorkspaceAppAudience(options);
2453
+ }
2454
+ if (options.workspaceAppPublicPaths) {
2455
+ _authGuardConfig.workspaceAppPublicPaths =
2456
+ options.workspaceAppPublicPaths;
2457
+ }
2458
+ if (options.workspaceAppProtectedPaths) {
2459
+ _authGuardConfig.workspaceAppProtectedPaths =
2460
+ options.workspaceAppProtectedPaths;
2461
+ }
2260
2462
  }
2261
2463
  return true;
2262
2464
  }
@@ -2276,6 +2478,8 @@ export async function autoMountAuth(app, options = {}) {
2276
2478
  customGetSession = null;
2277
2479
  sessionMaxAge = options.maxAge ?? DEFAULT_MAX_AGE;
2278
2480
  const publicPaths = options.publicPaths ?? [];
2481
+ const workspaceAppAudience = resolveWorkspaceAppAudience(options);
2482
+ const workspaceAppRouteAccess = resolveWorkspaceAppRouteAccess(options);
2279
2483
  mountAuthCorsMiddleware(app);
2280
2484
  if (options.getSession) {
2281
2485
  customGetSession = options.getSession;
@@ -2292,13 +2496,13 @@ export async function autoMountAuth(app, options = {}) {
2292
2496
  }));
2293
2497
  app.use("/_agent-native/auth/login", defineEventHandler(() => ({ ok: true })));
2294
2498
  app.use("/_agent-native/auth/logout", defineEventHandler(async (event) => {
2295
- const cookie = getCookie(event, COOKIE_NAME);
2296
- if (cookie)
2499
+ for (const cookie of getFrameworkSessionCookieValues(event)) {
2297
2500
  await removeSession(cookie);
2501
+ }
2298
2502
  const bearerToken = getBearerSessionToken(event);
2299
2503
  if (bearerToken)
2300
2504
  await removeSession(bearerToken);
2301
- deleteCookie(event, COOKIE_NAME, { path: "/", ...cookieDomainAttrs() });
2505
+ clearFrameworkSessionCookies(event);
2302
2506
  if (isElectronRequest(event))
2303
2507
  await clearDesktopSso();
2304
2508
  return { ok: true };
@@ -2312,6 +2516,9 @@ export async function autoMountAuth(app, options = {}) {
2312
2516
  getLoginHtml: (_event, rawPath) => getTokenLoginHtml({ requestPath: rawPath }),
2313
2517
  }),
2314
2518
  publicPaths,
2519
+ workspaceAppAudience,
2520
+ workspaceAppPublicPaths: workspaceAppRouteAccess.publicPaths,
2521
+ workspaceAppProtectedPaths: workspaceAppRouteAccess.protectedPaths,
2315
2522
  };
2316
2523
  const guardFn = createAuthGuardFn();
2317
2524
  _authGuardFn = guardFn;
@@ -2323,7 +2530,7 @@ export async function autoMountAuth(app, options = {}) {
2323
2530
  // ACCESS_TOKEN-only mode
2324
2531
  const tokens = getAccessTokens();
2325
2532
  if (tokens.length > 0) {
2326
- mountTokenOnlyRoutes(app, tokens, publicPaths);
2533
+ mountTokenOnlyRoutes(app, tokens, publicPaths, workspaceAppAudience, workspaceAppRouteAccess);
2327
2534
  if (process.env.DEBUG)
2328
2535
  console.log(`[agent-native] Auth enabled — ${tokens.length} access token(s) configured.`);
2329
2536
  return true;
@@ -2347,7 +2554,13 @@ export async function autoMountAuth(app, options = {}) {
2347
2554
  googleSignInNotice: options.googleSignInNotice,
2348
2555
  googleAuthMode: options.googleAuthMode,
2349
2556
  });
2350
- _authGuardConfig = { loginHtml, publicPaths };
2557
+ _authGuardConfig = {
2558
+ loginHtml,
2559
+ publicPaths,
2560
+ workspaceAppAudience,
2561
+ workspaceAppPublicPaths: workspaceAppRouteAccess.publicPaths,
2562
+ workspaceAppProtectedPaths: workspaceAppRouteAccess.protectedPaths,
2563
+ };
2351
2564
  const guardFn = createAuthGuardFn();
2352
2565
  _authGuardFn = guardFn;
2353
2566
  app.use(defineEventHandler(guardFn));