@agent-native/core 0.79.17 → 0.79.18

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 (344) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +8 -0
  3. package/corpus/core/docs/content/file-uploads.md +11 -4
  4. package/corpus/core/docs/content/locales/ar-SA/multi-app-workspace.md +3 -3
  5. package/corpus/core/docs/content/locales/de-DE/multi-app-workspace.md +3 -3
  6. package/corpus/core/docs/content/locales/es-ES/multi-app-workspace.md +3 -3
  7. package/corpus/core/docs/content/locales/fr-FR/multi-app-workspace.md +3 -3
  8. package/corpus/core/docs/content/locales/hi-IN/multi-app-workspace.md +3 -3
  9. package/corpus/core/docs/content/locales/ja-JP/multi-app-workspace.md +3 -3
  10. package/corpus/core/docs/content/locales/ko-KR/multi-app-workspace.md +3 -3
  11. package/corpus/core/docs/content/locales/pt-BR/multi-app-workspace.md +3 -3
  12. package/corpus/core/docs/content/locales/zh-CN/multi-app-workspace.md +3 -3
  13. package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.md +3 -3
  14. package/corpus/core/docs/content/multi-app-workspace.md +3 -3
  15. package/corpus/core/docs/content/template-clips.md +14 -5
  16. package/corpus/core/package.json +1 -1
  17. package/corpus/core/src/agent/engine/builder-engine.ts +8 -3
  18. package/corpus/core/src/cli/mcp.ts +11 -6
  19. package/corpus/core/src/client/AssistantChat.tsx +6 -2
  20. package/corpus/core/src/client/chat/markdown-renderer.tsx +1 -0
  21. package/corpus/core/src/client/index.ts +7 -1
  22. package/corpus/core/src/client/org/OrgSwitcher.tsx +5 -5
  23. package/corpus/core/src/client/org/TeamPage.tsx +11 -3
  24. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +216 -0
  25. package/corpus/core/src/client/settings/index.ts +5 -0
  26. package/corpus/core/src/file-upload/index.ts +1 -0
  27. package/corpus/core/src/file-upload/registry.ts +22 -6
  28. package/corpus/core/src/file-upload/types.ts +6 -1
  29. package/corpus/core/src/integrations/adapters/email.ts +26 -18
  30. package/corpus/core/src/integrations/adapters/slack.ts +8 -7
  31. package/corpus/core/src/integrations/adapters/telegram.ts +9 -11
  32. package/corpus/core/src/integrations/adapters/whatsapp.ts +12 -9
  33. package/corpus/core/src/integrations/plugin.ts +79 -13
  34. package/corpus/core/src/onboarding/default-steps.ts +6 -3
  35. package/corpus/core/src/onboarding/types.ts +1 -1
  36. package/corpus/core/src/org/handlers.ts +1 -1
  37. package/corpus/core/src/server/agent-chat-plugin.ts +4 -7
  38. package/corpus/core/src/server/better-auth-instance.ts +19 -62
  39. package/corpus/core/src/server/core-routes-plugin.ts +93 -180
  40. package/corpus/core/src/server/create-server.ts +55 -116
  41. package/corpus/core/src/server/email-actions.ts +3 -6
  42. package/corpus/core/src/server/email.ts +52 -17
  43. package/corpus/core/src/server/index.ts +2 -1
  44. package/corpus/core/src/server/scoped-key-storage.ts +223 -0
  45. package/corpus/core/src/shared/agent-env.ts +3 -3
  46. package/corpus/core/src/sharing/actions/share-resource.ts +1 -1
  47. package/corpus/core/src/styles/agent-native.css +47 -3
  48. package/corpus/core/src/templates/workspace-root/AGENTS.md +3 -2
  49. package/corpus/core/src/templates/workspace-root/README.md +1 -1
  50. package/corpus/core/src/templates/workspace-root/scripts/repair-workspace-org.ts +29 -90
  51. package/corpus/core/src/terminal/pty-server.ts +3 -38
  52. package/corpus/core/src/triggers/dispatcher.ts +1 -2
  53. package/corpus/templates/.retired/issues/package.json +7 -0
  54. package/corpus/templates/.retired/meeting-notes/package.json +7 -0
  55. package/corpus/templates/.retired/recruiting/package.json +7 -0
  56. package/corpus/templates/.retired/scheduling/package.json +7 -0
  57. package/corpus/templates/.retired/voice/package.json +7 -0
  58. package/corpus/templates/analytics/app/components/layout/Header.tsx +0 -1
  59. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +0 -17
  60. package/corpus/templates/analytics/app/i18n/zh-TW.ts +7 -1
  61. package/corpus/templates/analytics/app/i18n-data.ts +71 -2
  62. package/corpus/templates/analytics/app/pages/Settings.tsx +120 -73
  63. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +0 -11
  64. package/corpus/templates/analytics/app/routes/catalog.tsx +33 -176
  65. package/corpus/templates/analytics/app/routes/team.tsx +3 -2
  66. package/corpus/templates/analytics/changelog/2026-06-26-dashboard-templates-are-tucked-into-settings-and-show-simple.md +6 -0
  67. package/corpus/templates/analytics/changelog/2026-06-26-the-sessions-page-shows-a-single-page-title-instead-of-repea.md +6 -0
  68. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +37 -28
  69. package/corpus/templates/assets/app/routes/settings.tsx +65 -43
  70. package/corpus/templates/assets/app/routes/team.tsx +2 -10
  71. package/corpus/templates/brain/app/routes/settings.tsx +390 -358
  72. package/corpus/templates/brain/app/routes/team.tsx +2 -8
  73. package/corpus/templates/calendar/actions/db-connect.ts +5 -29
  74. package/corpus/templates/calendar/app/components/CloudUpgrade.tsx +8 -51
  75. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +2 -1
  76. package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +4 -2
  77. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +0 -2
  78. package/corpus/templates/calendar/app/pages/Settings.tsx +304 -271
  79. package/corpus/templates/calendar/app/routes/_app.team.tsx +2 -17
  80. package/corpus/templates/calendar/server/handlers/google-auth.ts +22 -9
  81. package/corpus/templates/calendar/server/lib/booking-emails.ts +1 -1
  82. package/corpus/templates/calendar/server/lib/event-guest-notifications.ts +1 -1
  83. package/corpus/templates/calendar/server/lib/google-calendar.ts +48 -28
  84. package/corpus/templates/chat/app/components/layout/Header.tsx +0 -1
  85. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +4 -2
  86. package/corpus/templates/chat/app/routes/settings.tsx +54 -54
  87. package/corpus/templates/chat/app/routes/team.tsx +2 -10
  88. package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +7 -2
  89. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +1 -1
  90. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +7 -0
  91. package/corpus/templates/clips/AGENTS.md +8 -0
  92. package/corpus/templates/clips/actions/invite-member.ts +1 -1
  93. package/corpus/templates/clips/actions/request-transcript.ts +1 -1
  94. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +2 -0
  95. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +629 -643
  96. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +219 -155
  97. package/corpus/templates/clips/changelog/2026-06-26-long-desktop-recordings-are-checkpointed-so-macos-finalizati.md +6 -0
  98. package/corpus/templates/clips/changelog/2026-06-26-non-mac-desktop-recordings-wait-for-upload-transcription.md +6 -0
  99. package/corpus/templates/clips/changelog/2026-06-26-s3-compatible-storage-keys-now-save-securely-from-clips-sett.md +6 -0
  100. package/corpus/templates/clips/changelog/2026-06-26-shared-clip-links-guide-agents-through-processing-transcripts.md +6 -0
  101. package/corpus/templates/clips/changelog/2026-06-26-the-clip-details-sidebar-now-collapses-into-a-slide-out-pane.md +6 -0
  102. package/corpus/templates/clips/desktop/src/lib/recorder.ts +55 -3
  103. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +217 -5
  104. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -0
  105. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +176 -5
  106. package/corpus/templates/clips/server/lib/public-agent-context.ts +31 -0
  107. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +60 -14
  108. package/corpus/templates/clips/server/lib/video-storage.ts +37 -9
  109. package/corpus/templates/clips/server/routes/api/agent-transcript.json.get.ts +5 -0
  110. package/corpus/templates/content/app/components/layout/Header.tsx +0 -1
  111. package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +1 -0
  112. package/corpus/templates/content/app/routes/_app.settings.tsx +54 -55
  113. package/corpus/templates/content/app/routes/_app.team.tsx +2 -28
  114. package/corpus/templates/content/server/lib/notion.ts +43 -11
  115. package/corpus/templates/content/server/routes/api/notion/auth-url.get.ts +2 -2
  116. package/corpus/templates/content/server/routes/api/notion/status.get.ts +3 -3
  117. package/corpus/templates/design/app/routes/settings.tsx +60 -38
  118. package/corpus/templates/design/app/routes/team.tsx +2 -10
  119. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +2 -2
  120. package/corpus/templates/dispatch/app/routes/settings.tsx +70 -55
  121. package/corpus/templates/dispatch/app/routes/team.tsx +5 -1
  122. package/corpus/templates/forms/actions/db-connect.ts +7 -36
  123. package/corpus/templates/forms/actions/navigate.ts +2 -2
  124. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +8 -47
  125. package/corpus/templates/forms/app/components/layout/Header.tsx +0 -1
  126. package/corpus/templates/forms/app/components/layout/Layout.tsx +42 -25
  127. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +35 -76
  128. package/corpus/templates/forms/app/global.css +9 -25
  129. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +4 -4
  130. package/corpus/templates/forms/app/i18n/ar-SA.ts +1 -0
  131. package/corpus/templates/forms/app/i18n/de-DE.ts +1 -0
  132. package/corpus/templates/forms/app/i18n/en-US.ts +1 -0
  133. package/corpus/templates/forms/app/i18n/es-ES.ts +1 -0
  134. package/corpus/templates/forms/app/i18n/fr-FR.ts +1 -0
  135. package/corpus/templates/forms/app/i18n/hi-IN.ts +1 -0
  136. package/corpus/templates/forms/app/i18n/ja-JP.ts +1 -0
  137. package/corpus/templates/forms/app/i18n/ko-KR.ts +1 -0
  138. package/corpus/templates/forms/app/i18n/pt-BR.ts +1 -0
  139. package/corpus/templates/forms/app/i18n/zh-CN.ts +1 -0
  140. package/corpus/templates/forms/app/i18n/zh-TW.ts +1 -0
  141. package/corpus/templates/forms/app/lib/route-prewarm.ts +9 -8
  142. package/corpus/templates/forms/app/pages/AskPage.tsx +70 -0
  143. package/corpus/templates/forms/app/pages/FormsListPage.tsx +74 -81
  144. package/corpus/templates/forms/app/root.tsx +1 -1
  145. package/corpus/templates/forms/app/routes/_app.ask.tsx +14 -0
  146. package/corpus/templates/forms/app/routes/_app.settings.tsx +54 -54
  147. package/corpus/templates/forms/app/routes/_app.team.tsx +2 -9
  148. package/corpus/templates/forms/app/routes/_index.tsx +21 -130
  149. package/corpus/templates/forms/changelog/2026-06-26-ask-forms-opens-as-a-standard-app-tab-with-a-simpler-sidebar.md +6 -0
  150. package/corpus/templates/forms/changelog/2026-06-26-forms-are-shown-in-a-tighter-row-list-with-a-denser-sidebar.md +6 -0
  151. package/corpus/templates/forms/shared/navigation.ts +4 -2
  152. package/corpus/templates/macros/app/routes/settings.tsx +54 -54
  153. package/corpus/templates/macros/app/routes/team.tsx +2 -10
  154. package/corpus/templates/mail/actions/helpers.ts +2 -2
  155. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +2 -1
  156. package/corpus/templates/mail/app/pages/SettingsPage.tsx +5 -5
  157. package/corpus/templates/mail/app/routes/team.tsx +3 -2
  158. package/corpus/templates/mail/server/handlers/emails.ts +3 -2
  159. package/corpus/templates/mail/server/handlers/google-auth.ts +19 -12
  160. package/corpus/templates/mail/server/lib/automation-engine.ts +3 -2
  161. package/corpus/templates/mail/server/lib/email-state.ts +2 -3
  162. package/corpus/templates/mail/server/lib/google-auth.ts +28 -11
  163. package/corpus/templates/mail/server/lib/jobs.ts +3 -2
  164. package/corpus/templates/mail/server/onboarding.ts +9 -6
  165. package/corpus/templates/mail/server/routes/api/attachments.get.ts +3 -3
  166. package/corpus/templates/plan/actions/request-plan-access.ts +1 -1
  167. package/corpus/templates/plan/app/components/layout/Header.tsx +0 -1
  168. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +4 -2
  169. package/corpus/templates/plan/app/lib/route-prewarm.ts +0 -4
  170. package/corpus/templates/plan/app/routes/settings.tsx +75 -73
  171. package/corpus/templates/plan/app/routes/team.tsx +2 -8
  172. package/corpus/templates/plan/server/lib/comment-notifications.ts +1 -1
  173. package/corpus/templates/slides/actions/check-image-gen.ts +2 -1
  174. package/corpus/templates/slides/actions/db-connect.ts +7 -45
  175. package/corpus/templates/slides/actions/edit-image.ts +6 -3
  176. package/corpus/templates/slides/actions/generate-image-api.ts +1 -1
  177. package/corpus/templates/slides/actions/generate-image.ts +2 -2
  178. package/corpus/templates/slides/actions/generate-slides-ai.ts +5 -3
  179. package/corpus/templates/slides/actions/image-gen-status.ts +4 -3
  180. package/corpus/templates/slides/actions/image-search.ts +6 -3
  181. package/corpus/templates/slides/actions/search-images.ts +6 -3
  182. package/corpus/templates/slides/app/components/CloudUpgrade.tsx +8 -51
  183. package/corpus/templates/slides/app/components/layout/Header.tsx +0 -1
  184. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +0 -2
  185. package/corpus/templates/slides/app/routes/settings.tsx +54 -54
  186. package/corpus/templates/slides/app/routes/team.tsx +2 -12
  187. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +9 -9
  188. package/corpus/templates/slides/server/handlers/image-gen.ts +5 -1
  189. package/corpus/templates/slides/server/handlers/image-providers/gemini.ts +9 -1
  190. package/corpus/templates/slides/server/handlers/image-providers/index.ts +18 -8
  191. package/corpus/templates/slides/server/handlers/image-providers/openai.ts +10 -4
  192. package/corpus/templates/slides/server/handlers/image-providers/types.ts +1 -0
  193. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +59 -34
  194. package/corpus/templates/slides/server/register-secrets.ts +60 -0
  195. package/corpus/templates/videos/actions/db-connect.ts +7 -45
  196. package/corpus/templates/videos/app/components/CloudUpgrade.tsx +8 -51
  197. package/corpus/templates/videos/app/components/Sidebar.tsx +1 -9
  198. package/corpus/templates/videos/app/components/layout/Header.tsx +0 -1
  199. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +0 -3
  200. package/corpus/templates/videos/app/routes/settings.tsx +54 -54
  201. package/corpus/templates/videos/app/routes/team.tsx +2 -8
  202. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  203. package/dist/agent/engine/builder-engine.js +8 -3
  204. package/dist/agent/engine/builder-engine.js.map +1 -1
  205. package/dist/cli/mcp.d.ts.map +1 -1
  206. package/dist/cli/mcp.js +3 -4
  207. package/dist/cli/mcp.js.map +1 -1
  208. package/dist/client/AssistantChat.d.ts.map +1 -1
  209. package/dist/client/AssistantChat.js +6 -2
  210. package/dist/client/AssistantChat.js.map +1 -1
  211. package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
  212. package/dist/client/chat/markdown-renderer.js +1 -0
  213. package/dist/client/chat/markdown-renderer.js.map +1 -1
  214. package/dist/client/index.d.ts +1 -1
  215. package/dist/client/index.d.ts.map +1 -1
  216. package/dist/client/index.js +1 -1
  217. package/dist/client/index.js.map +1 -1
  218. package/dist/client/org/OrgSwitcher.d.ts +3 -3
  219. package/dist/client/org/OrgSwitcher.js +2 -2
  220. package/dist/client/org/OrgSwitcher.js.map +1 -1
  221. package/dist/client/org/TeamPage.d.ts +6 -1
  222. package/dist/client/org/TeamPage.d.ts.map +1 -1
  223. package/dist/client/org/TeamPage.js +2 -2
  224. package/dist/client/org/TeamPage.js.map +1 -1
  225. package/dist/client/settings/SettingsTabsPage.d.ts +27 -0
  226. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -0
  227. package/dist/client/settings/SettingsTabsPage.js +108 -0
  228. package/dist/client/settings/SettingsTabsPage.js.map +1 -0
  229. package/dist/client/settings/index.d.ts +1 -0
  230. package/dist/client/settings/index.d.ts.map +1 -1
  231. package/dist/client/settings/index.js +1 -0
  232. package/dist/client/settings/index.js.map +1 -1
  233. package/dist/collab/routes.d.ts +1 -1
  234. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  235. package/dist/file-upload/index.d.ts +1 -1
  236. package/dist/file-upload/index.d.ts.map +1 -1
  237. package/dist/file-upload/index.js +1 -1
  238. package/dist/file-upload/index.js.map +1 -1
  239. package/dist/file-upload/registry.d.ts +1 -0
  240. package/dist/file-upload/registry.d.ts.map +1 -1
  241. package/dist/file-upload/registry.js +24 -6
  242. package/dist/file-upload/registry.js.map +1 -1
  243. package/dist/file-upload/types.d.ts +6 -1
  244. package/dist/file-upload/types.d.ts.map +1 -1
  245. package/dist/file-upload/types.js.map +1 -1
  246. package/dist/integrations/adapters/email.d.ts.map +1 -1
  247. package/dist/integrations/adapters/email.js +18 -18
  248. package/dist/integrations/adapters/email.js.map +1 -1
  249. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  250. package/dist/integrations/adapters/slack.js +8 -7
  251. package/dist/integrations/adapters/slack.js.map +1 -1
  252. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  253. package/dist/integrations/adapters/telegram.js +9 -9
  254. package/dist/integrations/adapters/telegram.js.map +1 -1
  255. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  256. package/dist/integrations/adapters/whatsapp.js +10 -9
  257. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  258. package/dist/integrations/plugin.d.ts.map +1 -1
  259. package/dist/integrations/plugin.js +47 -13
  260. package/dist/integrations/plugin.js.map +1 -1
  261. package/dist/notifications/routes.d.ts +1 -1
  262. package/dist/observability/routes.d.ts +2 -2
  263. package/dist/onboarding/default-steps.d.ts.map +1 -1
  264. package/dist/onboarding/default-steps.js +6 -5
  265. package/dist/onboarding/default-steps.js.map +1 -1
  266. package/dist/onboarding/types.d.ts +1 -1
  267. package/dist/onboarding/types.d.ts.map +1 -1
  268. package/dist/onboarding/types.js.map +1 -1
  269. package/dist/org/handlers.js +1 -1
  270. package/dist/org/handlers.js.map +1 -1
  271. package/dist/progress/routes.d.ts +1 -1
  272. package/dist/resources/handlers.d.ts +3 -3
  273. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  274. package/dist/server/agent-chat-plugin.js +4 -6
  275. package/dist/server/agent-chat-plugin.js.map +1 -1
  276. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  277. package/dist/server/better-auth-instance.d.ts.map +1 -1
  278. package/dist/server/better-auth-instance.js +17 -56
  279. package/dist/server/better-auth-instance.js.map +1 -1
  280. package/dist/server/core-routes-plugin.d.ts +1 -1
  281. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  282. package/dist/server/core-routes-plugin.js +67 -153
  283. package/dist/server/core-routes-plugin.js.map +1 -1
  284. package/dist/server/create-server.d.ts +3 -9
  285. package/dist/server/create-server.d.ts.map +1 -1
  286. package/dist/server/create-server.js +37 -91
  287. package/dist/server/create-server.js.map +1 -1
  288. package/dist/server/email-actions.d.ts +2 -3
  289. package/dist/server/email-actions.d.ts.map +1 -1
  290. package/dist/server/email-actions.js +3 -6
  291. package/dist/server/email-actions.js.map +1 -1
  292. package/dist/server/email.d.ts +3 -3
  293. package/dist/server/email.d.ts.map +1 -1
  294. package/dist/server/email.js +40 -19
  295. package/dist/server/email.js.map +1 -1
  296. package/dist/server/index.d.ts +3 -3
  297. package/dist/server/index.d.ts.map +1 -1
  298. package/dist/server/index.js +3 -3
  299. package/dist/server/index.js.map +1 -1
  300. package/dist/server/scoped-key-storage.d.ts +22 -0
  301. package/dist/server/scoped-key-storage.d.ts.map +1 -0
  302. package/dist/server/scoped-key-storage.js +152 -0
  303. package/dist/server/scoped-key-storage.js.map +1 -0
  304. package/dist/server/transcribe-voice.d.ts +1 -1
  305. package/dist/shared/agent-env.d.ts +3 -3
  306. package/dist/shared/agent-env.d.ts.map +1 -1
  307. package/dist/shared/agent-env.js +3 -3
  308. package/dist/shared/agent-env.js.map +1 -1
  309. package/dist/sharing/actions/share-resource.js +1 -1
  310. package/dist/sharing/actions/share-resource.js.map +1 -1
  311. package/dist/styles/agent-native.css +47 -3
  312. package/dist/templates/workspace-root/AGENTS.md +3 -2
  313. package/dist/templates/workspace-root/README.md +1 -1
  314. package/dist/templates/workspace-root/scripts/repair-workspace-org.ts +29 -90
  315. package/dist/terminal/pty-server.d.ts.map +1 -1
  316. package/dist/terminal/pty-server.js +3 -36
  317. package/dist/terminal/pty-server.js.map +1 -1
  318. package/dist/triggers/dispatcher.js +1 -1
  319. package/dist/triggers/dispatcher.js.map +1 -1
  320. package/docs/content/file-uploads.md +11 -4
  321. package/docs/content/locales/ar-SA/multi-app-workspace.md +3 -3
  322. package/docs/content/locales/de-DE/multi-app-workspace.md +3 -3
  323. package/docs/content/locales/es-ES/multi-app-workspace.md +3 -3
  324. package/docs/content/locales/fr-FR/multi-app-workspace.md +3 -3
  325. package/docs/content/locales/hi-IN/multi-app-workspace.md +3 -3
  326. package/docs/content/locales/ja-JP/multi-app-workspace.md +3 -3
  327. package/docs/content/locales/ko-KR/multi-app-workspace.md +3 -3
  328. package/docs/content/locales/pt-BR/multi-app-workspace.md +3 -3
  329. package/docs/content/locales/zh-CN/multi-app-workspace.md +3 -3
  330. package/docs/content/locales/zh-TW/multi-app-workspace.md +3 -3
  331. package/docs/content/multi-app-workspace.md +3 -3
  332. package/docs/content/template-clips.md +14 -5
  333. package/package.json +1 -1
  334. package/src/templates/workspace-root/AGENTS.md +3 -2
  335. package/src/templates/workspace-root/README.md +1 -1
  336. package/src/templates/workspace-root/scripts/repair-workspace-org.ts +29 -90
  337. package/corpus/core/src/server/env-var-writes.ts +0 -16
  338. package/corpus/templates/analytics/app/pages/Team.tsx +0 -9
  339. package/corpus/templates/calendar/app/pages/Team.tsx +0 -12
  340. package/corpus/templates/mail/app/pages/Team.tsx +0 -17
  341. package/dist/server/env-var-writes.d.ts +0 -10
  342. package/dist/server/env-var-writes.d.ts.map +0 -1
  343. package/dist/server/env-var-writes.js +0 -18
  344. package/dist/server/env-var-writes.js.map +0 -1
@@ -4,6 +4,10 @@ import {
4
4
  listOAuthAccountsByOwner,
5
5
  saveOAuthTokens,
6
6
  } from "@agent-native/core/oauth-tokens";
7
+ import {
8
+ resolveSecret,
9
+ runWithRequestContext,
10
+ } from "@agent-native/core/server";
7
11
 
8
12
  const TOKEN_URL = "https://oauth2.googleapis.com/token";
9
13
  const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
@@ -35,42 +39,58 @@ interface GoogleOAuthCredentials {
35
39
  clientSecret: string;
36
40
  }
37
41
 
38
- function readCredentialPair(
42
+ async function readCredentialPair(
39
43
  clientIdKey: string,
40
44
  clientSecretKey: string,
41
- ): GoogleOAuthCredentials | null {
42
- const clientId = process.env[clientIdKey];
43
- const clientSecret = process.env[clientSecretKey];
45
+ ): Promise<GoogleOAuthCredentials | null> {
46
+ const [clientId, clientSecret] = await Promise.all([
47
+ resolveSecret(clientIdKey),
48
+ resolveSecret(clientSecretKey),
49
+ ]);
44
50
  if (!clientId || !clientSecret) return null;
45
51
  return { clientId, clientSecret };
46
52
  }
47
53
 
48
- function resolveGoogleProviderCredentialCandidates(): GoogleOAuthCredentials[] {
49
- const primary = readCredentialPair(
50
- "GOOGLE_CLIENT_ID",
51
- "GOOGLE_CLIENT_SECRET",
52
- );
53
- const legacy = readCredentialPair(
54
- "GOOGLE_LEGACY_CLIENT_ID",
55
- "GOOGLE_LEGACY_CLIENT_SECRET",
56
- );
57
- if (!primary) return legacy ? [legacy] : [];
58
- if (!legacy || legacy.clientId === primary.clientId) return [primary];
59
- return [primary, legacy];
54
+ async function resolveGoogleProviderCredentialCandidates(
55
+ owner?: string,
56
+ ): Promise<GoogleOAuthCredentials[]> {
57
+ const resolve = async () => {
58
+ const primary = await readCredentialPair(
59
+ "GOOGLE_CLIENT_ID",
60
+ "GOOGLE_CLIENT_SECRET",
61
+ );
62
+ const legacy = await readCredentialPair(
63
+ "GOOGLE_LEGACY_CLIENT_ID",
64
+ "GOOGLE_LEGACY_CLIENT_SECRET",
65
+ );
66
+ if (!primary) return legacy ? [legacy] : [];
67
+ if (!legacy || legacy.clientId === primary.clientId) return [primary];
68
+ return [primary, legacy];
69
+ };
70
+ return owner
71
+ ? runWithRequestContext({ userEmail: owner }, resolve)
72
+ : await resolve();
60
73
  }
61
74
 
62
- function getOAuthCredentials(): { clientId: string; clientSecret: string } {
63
- const credentials = resolveGoogleProviderCredentialCandidates()[0];
75
+ async function getOAuthCredentials(owner?: string): Promise<{
76
+ clientId: string;
77
+ clientSecret: string;
78
+ }> {
79
+ const credentials = (
80
+ await resolveGoogleProviderCredentialCandidates(owner)
81
+ )[0];
64
82
  if (!credentials) {
65
83
  throw new Error(
66
- "Google OAuth is not configured. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET.",
84
+ "Google OAuth is not configured. Save GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in settings.",
67
85
  );
68
86
  }
69
87
  return credentials;
70
88
  }
71
89
 
72
- export function isGoogleDocsOAuthConfigured(): boolean {
73
- return resolveGoogleProviderCredentialCandidates().length > 0;
90
+ export async function isGoogleDocsOAuthConfigured(
91
+ owner?: string,
92
+ ): Promise<boolean> {
93
+ return (await resolveGoogleProviderCredentialCandidates(owner)).length > 0;
74
94
  }
75
95
 
76
96
  function isPermanentGoogleRefreshError(error: string | undefined): boolean {
@@ -81,29 +101,33 @@ function isPermanentGoogleRefreshError(error: string | undefined): boolean {
81
101
  );
82
102
  }
83
103
 
84
- export function getGooglePickerConfig(): {
104
+ export async function getGooglePickerConfig(owner?: string): Promise<{
85
105
  apiKey: string | null;
86
106
  appId: string | null;
87
- } {
88
- return {
107
+ }> {
108
+ const resolve = async () => ({
89
109
  apiKey:
90
- process.env.GOOGLE_PICKER_API_KEY ||
91
- process.env.GOOGLE_API_KEY ||
110
+ (await resolveSecret("GOOGLE_PICKER_API_KEY")) ||
111
+ (await resolveSecret("GOOGLE_API_KEY")) ||
92
112
  process.env.VITE_GOOGLE_PICKER_API_KEY ||
93
113
  null,
94
114
  appId:
95
- process.env.GOOGLE_PICKER_APP_ID ||
96
- process.env.GOOGLE_PROJECT_NUMBER ||
115
+ (await resolveSecret("GOOGLE_PICKER_APP_ID")) ||
116
+ (await resolveSecret("GOOGLE_PROJECT_NUMBER")) ||
97
117
  process.env.VITE_GOOGLE_PICKER_APP_ID ||
98
118
  null,
99
- };
119
+ });
120
+ return owner
121
+ ? runWithRequestContext({ userEmail: owner }, resolve)
122
+ : await resolve();
100
123
  }
101
124
 
102
- export function getGoogleDocsAuthUrl(
125
+ export async function getGoogleDocsAuthUrl(
103
126
  redirectUri: string,
104
127
  state: string,
105
- ): string {
106
- const { clientId } = getOAuthCredentials();
128
+ owner?: string,
129
+ ): Promise<string> {
130
+ const { clientId } = await getOAuthCredentials(owner);
107
131
  const params = new URLSearchParams({
108
132
  client_id: clientId,
109
133
  redirect_uri: redirectUri,
@@ -134,7 +158,8 @@ async function refreshGoogleDocsToken(
134
158
  throw new Error("Google Docs connection expired. Please reconnect.");
135
159
  }
136
160
 
137
- const credentialCandidates = resolveGoogleProviderCredentialCandidates();
161
+ const credentialCandidates =
162
+ await resolveGoogleProviderCredentialCandidates(owner);
138
163
  let data: {
139
164
  access_token?: string;
140
165
  expires_in?: number;
@@ -217,7 +242,7 @@ export async function exchangeGoogleDocsCode(opts: {
217
242
  redirectUri: string;
218
243
  owner: string;
219
244
  }): Promise<{ email: string; name?: string }> {
220
- const { clientId, clientSecret } = getOAuthCredentials();
245
+ const { clientId, clientSecret } = await getOAuthCredentials(opts.owner);
221
246
  const response = await fetch(TOKEN_URL, {
222
247
  method: "POST",
223
248
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
@@ -73,3 +73,63 @@ registerRequiredSecret({
73
73
  }
74
74
  },
75
75
  });
76
+
77
+ registerRequiredSecret({
78
+ key: "GOOGLE_API_KEY",
79
+ label: "Google API Key",
80
+ description: "Required for image search with Google Custom Search.",
81
+ docsUrl: "https://console.cloud.google.com/apis/credentials",
82
+ scope: "user",
83
+ kind: "api-key",
84
+ required: false,
85
+ });
86
+
87
+ registerRequiredSecret({
88
+ key: "GOOGLE_SEARCH_CX",
89
+ label: "Google Search Engine ID",
90
+ description: "Required with GOOGLE_API_KEY for image search.",
91
+ docsUrl: "https://programmablesearchengine.google.com/controlpanel/all",
92
+ scope: "user",
93
+ kind: "api-key",
94
+ required: false,
95
+ });
96
+
97
+ registerRequiredSecret({
98
+ key: "GOOGLE_CLIENT_ID",
99
+ label: "Google OAuth Client ID",
100
+ description: "Required for Google Docs import.",
101
+ docsUrl: "https://console.cloud.google.com/apis/credentials",
102
+ scope: "user",
103
+ kind: "api-key",
104
+ required: false,
105
+ });
106
+
107
+ registerRequiredSecret({
108
+ key: "GOOGLE_CLIENT_SECRET",
109
+ label: "Google OAuth Client Secret",
110
+ description: "Required for Google Docs import.",
111
+ docsUrl: "https://console.cloud.google.com/apis/credentials",
112
+ scope: "user",
113
+ kind: "api-key",
114
+ required: false,
115
+ });
116
+
117
+ registerRequiredSecret({
118
+ key: "GOOGLE_PICKER_API_KEY",
119
+ label: "Google Picker API Key",
120
+ description: "Required for the Google Docs picker.",
121
+ docsUrl: "https://console.cloud.google.com/apis/credentials",
122
+ scope: "user",
123
+ kind: "api-key",
124
+ required: false,
125
+ });
126
+
127
+ registerRequiredSecret({
128
+ key: "GOOGLE_PICKER_APP_ID",
129
+ label: "Google Picker App ID",
130
+ description: "Required for the Google Docs picker.",
131
+ docsUrl: "https://console.cloud.google.com/apis/credentials",
132
+ scope: "user",
133
+ kind: "api-key",
134
+ required: false,
135
+ });
@@ -1,6 +1,3 @@
1
- import fs from "fs";
2
- import path from "path";
3
-
4
1
  function parseArgs(args: string[]): Record<string, string> {
5
2
  const result: Record<string, string> = {};
6
3
  for (let i = 0; i < args.length; i++) {
@@ -19,24 +16,6 @@ function parseArgs(args: string[]): Record<string, string> {
19
16
  return result;
20
17
  }
21
18
 
22
- function upsertEnvLine(lines: string[], key: string, value: string): string[] {
23
- // Reject values with newlines, carriage returns, or null bytes
24
- if (/[\r\n\0]/.test(value)) {
25
- throw new Error(
26
- `Invalid value for ${key}: must not contain newlines or null bytes`,
27
- );
28
- }
29
-
30
- const idx = lines.findIndex((l) => l.startsWith(`${key}=`));
31
- const line = `${key}=${value}`;
32
- if (idx >= 0) {
33
- lines[idx] = line;
34
- } else {
35
- lines.push(line);
36
- }
37
- return lines;
38
- }
39
-
40
19
  export default async function main(args: string[]) {
41
20
  const { url, token, help } = parseArgs(args);
42
21
 
@@ -44,7 +23,9 @@ export default async function main(args: string[]) {
44
23
  console.log(
45
24
  "Usage: pnpm action db-connect --url <DATABASE_URL> [--token <DATABASE_AUTH_TOKEN>]",
46
25
  );
47
- console.log("\nWrites DATABASE_URL and DATABASE_AUTH_TOKEN to .env");
26
+ console.log(
27
+ "\nDATABASE_URL and DATABASE_AUTH_TOKEN are deployment-level settings.",
28
+ );
48
29
  return;
49
30
  }
50
31
 
@@ -53,31 +34,12 @@ export default async function main(args: string[]) {
53
34
  throw new Error("Script failed");
54
35
  }
55
36
 
56
- const envPath = path.join(process.cwd(), ".env");
57
- let lines: string[] = [];
58
-
59
- if (fs.existsSync(envPath)) {
60
- lines = fs.readFileSync(envPath, "utf8").split("\n");
61
- }
62
-
63
- try {
64
- upsertEnvLine(lines, "DATABASE_URL", url);
65
- if (token) {
66
- upsertEnvLine(lines, "DATABASE_AUTH_TOKEN", token);
67
- }
68
- } catch (err) {
69
- console.error(
70
- `Error: ${err instanceof Error ? err.message : "Invalid value"}`,
71
- );
72
- throw new Error("Script failed");
73
- }
74
-
75
- fs.writeFileSync(envPath, lines.join("\n"));
76
-
77
- console.log(`\nDatabase connection saved to .env`);
37
+ console.log(`\nDatabase connection not written locally`);
78
38
  console.log(
79
39
  ` DATABASE_URL=${url.startsWith("file:") ? url : url.replace(/\/\/.*@/, "//***@")}`,
80
40
  );
81
41
  if (token) console.log(` DATABASE_AUTH_TOKEN=***`);
82
- console.log(`\nRestart the dev server for changes to take effect.`);
42
+ console.log(
43
+ `\nConfigure these as deployment environment variables with your host, then redeploy.`,
44
+ );
83
45
  }
@@ -1,4 +1,4 @@
1
- import { agentNativePath, useT } from "@agent-native/core/client";
1
+ import { useT } from "@agent-native/core/client";
2
2
  import {
3
3
  IconX,
4
4
  IconCheck,
@@ -106,63 +106,20 @@ export function CloudUpgrade({
106
106
  connectingRef.current = true;
107
107
 
108
108
  if (!dbUrl.trim()) {
109
- setErrorMsg("Database URL is required");
109
+ setErrorMsg(
110
+ "Database settings are deployment-level. Configure DATABASE_URL with your host and redeploy the app.",
111
+ );
110
112
  setStatus("error");
111
113
  connectingRef.current = false;
112
114
  return;
113
115
  }
114
116
 
115
117
  try {
116
- setStatus("saving");
118
+ setStatus("error");
117
119
  setErrorMsg("");
118
-
119
- const vars: Array<{ key: string; value: string }> = [
120
- { key: "DATABASE_URL", value: dbUrl.trim() },
121
- ];
122
- if (authToken.trim()) {
123
- vars.push({ key: "DATABASE_AUTH_TOKEN", value: authToken.trim() });
124
- }
125
-
126
- const saveRes = await fetch(agentNativePath("/_agent-native/env-vars"), {
127
- method: "POST",
128
- headers: { "Content-Type": "application/json" },
129
- body: JSON.stringify({ vars }),
130
- });
131
-
132
- if (!saveRes.ok) {
133
- const data = await saveRes.json().catch(() => ({}));
134
- throw new Error(data.error || "Failed to save credentials");
135
- }
136
-
137
- // Poll db-health until it returns ok
138
- setStatus("polling");
139
- let ok = false;
140
- for (let i = 0; i < 30; i++) {
141
- await new Promise((r) => setTimeout(r, 1000));
142
- try {
143
- const healthRes = await fetch(
144
- agentNativePath("/_agent-native/actions/db-health"),
145
- );
146
- const health = await healthRes.json();
147
- if (health.ok && health.local === false) {
148
- ok = true;
149
- break;
150
- }
151
- } catch {
152
- // Keep polling
153
- }
154
- }
155
-
156
- if (!ok) {
157
- throw new Error(
158
- "Database connection failed after 30 attempts. Check your credentials.",
159
- );
160
- }
161
-
162
- setStatus("success");
163
- setTimeout(() => {
164
- window.location.reload();
165
- }, 1500);
120
+ throw new Error(
121
+ "Database settings are deployment-level. Configure DATABASE_URL and DATABASE_AUTH_TOKEN with your host, redeploy, then check sharing again.",
122
+ );
166
123
  } catch (e) {
167
124
  setErrorMsg(
168
125
  e instanceof Error ? e.message : t("raw.cloud.connectionFailed"),
@@ -16,7 +16,6 @@ import {
16
16
  IconVideo,
17
17
  IconComponents,
18
18
  IconPalette,
19
- IconUsers,
20
19
  IconFolderPlus,
21
20
  } from "@tabler/icons-react";
22
21
  import { useState, useEffect, useRef } from "react";
@@ -238,8 +237,7 @@ export function Sidebar({
238
237
  href: "/",
239
238
  active:
240
239
  !location.pathname.startsWith("/components") &&
241
- !location.pathname.startsWith("/design-systems") &&
242
- !location.pathname.startsWith("/team"),
240
+ !location.pathname.startsWith("/design-systems"),
243
241
  },
244
242
  {
245
243
  icon: IconComponents,
@@ -253,12 +251,6 @@ export function Sidebar({
253
251
  href: "/design-systems",
254
252
  active: location.pathname.startsWith("/design-systems"),
255
253
  },
256
- {
257
- icon: IconUsers,
258
- labelKey: "navigation.team",
259
- href: "/team",
260
- active: location.pathname === "/team",
261
- },
262
254
  ];
263
255
 
264
256
  return (
@@ -10,7 +10,6 @@ const pageTitleKeys: Record<string, string> = {
10
10
  "/": "header.videos",
11
11
  "/components": "header.components",
12
12
  "/design-systems": "header.designSystems",
13
- "/team": "header.team",
14
13
  "/settings": "header.settings",
15
14
  };
16
15
 
@@ -11,7 +11,6 @@ import {
11
11
  IconComponents,
12
12
  IconPalette,
13
13
  IconSettings,
14
- IconUsers,
15
14
  } from "@tabler/icons-react";
16
15
  import { Link, useLocation } from "react-router";
17
16
 
@@ -30,7 +29,6 @@ const navItems = [
30
29
  href: "/design-systems",
31
30
  },
32
31
  { icon: IconSettings, labelKey: "navigation.settings", href: "/settings" },
33
- { icon: IconUsers, labelKey: "navigation.team", href: "/team" },
34
32
  ];
35
33
 
36
34
  export function NavSidebar() {
@@ -65,7 +63,6 @@ export function NavSidebar() {
65
63
  ? !location.pathname.startsWith("/components") &&
66
64
  !location.pathname.startsWith("/design-systems") &&
67
65
  !location.pathname.startsWith("/settings") &&
68
- !location.pathname.startsWith("/team") &&
69
66
  !location.pathname.startsWith("/extensions")
70
67
  : location.pathname.startsWith(item.href);
71
68
  return (
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  ChangelogSettingsCard,
3
3
  LanguagePicker,
4
+ SettingsTabsPage,
4
5
  openAgentSettings,
5
6
  useT,
6
7
  } from "@agent-native/core/client";
7
- import { Link } from "react-router";
8
+ import { TeamPage } from "@agent-native/core/client/org";
8
9
 
9
10
  import { useSetPageTitle } from "@/components/layout/HeaderActions";
10
11
  import { Button } from "@/components/ui/button";
@@ -29,60 +30,59 @@ export default function SettingsRoute() {
29
30
  useSetPageTitle(t("settings.title"));
30
31
 
31
32
  return (
32
- <main className="mx-auto w-full max-w-3xl space-y-6 px-4 py-6 sm:px-6 sm:py-10">
33
- <div className="space-y-1">
34
- <h1 className="text-2xl font-semibold tracking-tight">
35
- {t("settings.title")}
36
- </h1>
37
- <p className="text-sm leading-6 text-muted-foreground">
38
- {t("settings.description")}
39
- </p>
40
- </div>
33
+ <SettingsTabsPage
34
+ teamLabel={t("navigation.team")}
35
+ general={
36
+ <div className="mx-auto w-full max-w-3xl space-y-6">
37
+ <p className="text-sm leading-6 text-muted-foreground">
38
+ {t("settings.description")}
39
+ </p>
41
40
 
42
- <Card>
43
- <CardHeader>
44
- <CardTitle className="text-base">
45
- {t("settings.languageTitle")}
46
- </CardTitle>
47
- <CardDescription>{t("settings.languageDescription")}</CardDescription>
48
- </CardHeader>
49
- <CardContent className="max-w-xs space-y-1.5">
50
- <Label>{t("settings.languageLabel")}</Label>
51
- <LanguagePicker label={t("settings.languageLabel")} />
52
- </CardContent>
53
- </Card>
41
+ <Card>
42
+ <CardHeader>
43
+ <CardTitle className="text-base">
44
+ {t("settings.languageTitle")}
45
+ </CardTitle>
46
+ <CardDescription>
47
+ {t("settings.languageDescription")}
48
+ </CardDescription>
49
+ </CardHeader>
50
+ <CardContent className="max-w-xs space-y-1.5">
51
+ <Label>{t("settings.languageLabel")}</Label>
52
+ <LanguagePicker label={t("settings.languageLabel")} />
53
+ </CardContent>
54
+ </Card>
54
55
 
55
- <Card>
56
- <CardHeader>
57
- <CardTitle className="text-base">
58
- {t("settings.workspaceTitle")}
59
- </CardTitle>
60
- <CardDescription>
61
- {t("settings.workspaceDescription")}
62
- </CardDescription>
63
- </CardHeader>
64
- <CardContent>
65
- <Button variant="outline" asChild>
66
- <Link to="/team">{t("settings.openTeamSettings")}</Link>
67
- </Button>
68
- </CardContent>
69
- </Card>
70
-
71
- <Card>
72
- <CardHeader>
73
- <CardTitle className="text-base">
74
- {t("settings.agentTitle")}
75
- </CardTitle>
76
- <CardDescription>{t("settings.agentDescription")}</CardDescription>
77
- </CardHeader>
78
- <CardContent>
79
- <Button variant="outline" onClick={() => openAgentSettings()}>
80
- {t("settings.openAgentSettings")}
81
- </Button>
82
- </CardContent>
83
- </Card>
84
-
85
- <ChangelogSettingsCard markdown={changelog} />
86
- </main>
56
+ <Card>
57
+ <CardHeader>
58
+ <CardTitle className="text-base">
59
+ {t("settings.agentTitle")}
60
+ </CardTitle>
61
+ <CardDescription>
62
+ {t("settings.agentDescription")}
63
+ </CardDescription>
64
+ </CardHeader>
65
+ <CardContent>
66
+ <Button variant="outline" onClick={() => openAgentSettings()}>
67
+ {t("settings.openAgentSettings")}
68
+ </Button>
69
+ </CardContent>
70
+ </Card>
71
+ </div>
72
+ }
73
+ team={
74
+ <div className="mx-auto w-full max-w-3xl">
75
+ <TeamPage
76
+ showTitle={false}
77
+ createOrgDescription="Set up a team to share compositions and animations with your colleagues."
78
+ />
79
+ </div>
80
+ }
81
+ whatsNew={
82
+ <div className="mx-auto w-full max-w-3xl">
83
+ <ChangelogSettingsCard markdown={changelog} />
84
+ </div>
85
+ }
86
+ />
87
87
  );
88
88
  }
@@ -1,6 +1,5 @@
1
- import { TeamPage } from "@agent-native/core/client/org";
1
+ import { Navigate } from "react-router";
2
2
 
3
- import { useSetPageTitle } from "@/components/layout/HeaderActions";
4
3
  import enUS from "@/i18n/en-US";
5
4
 
6
5
  export function meta() {
@@ -8,10 +7,5 @@ export function meta() {
8
7
  }
9
8
 
10
9
  export default function TeamRoute() {
11
- useSetPageTitle("Team");
12
- return (
13
- <main className="max-w-3xl mx-auto px-4 sm:px-6 py-6 sm:py-10">
14
- <TeamPage createOrgDescription="Set up a team to share compositions and animations with your colleagues." />
15
- </main>
16
- );
10
+ return <Navigate to="/settings#team" replace />;
17
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"builder-engine.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/builder-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwBH,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAInB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,oBAAoB,EAAE,kBAMlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,kNAAuC,CAAC;AAW7E,eAAO,MAAM,qBAAqB,qBAAoC,CAAC;AA+qBvE,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,WAAW,CAEb"}
1
+ {"version":3,"file":"builder-engine.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/builder-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwBH,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAInB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,oBAAoB,EAAE,kBAMlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,kNAAuC,CAAC;AAW7E,eAAO,MAAM,qBAAqB,qBAAoC,CAAC;AAorBvE,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,WAAW,CAEb"}
@@ -68,11 +68,16 @@ function mapReasoningEffort(budgetTokens) {
68
68
  * `/app/organizations/Nicholas%20kipchumba%20Space/billing` which Builder's
69
69
  * router treats as unknown and silently bounces to `/app/projects`. The
70
70
  * Builder CLI-auth callback doesn't expose the org slug/id today, so we route
71
- * to the org-agnostic billing page Builder resolves the active org from
72
- * session there and users with multiple orgs can switch from that screen.
71
+ * to the org-agnostic subscription page. Agent Native attribution lets Builder
72
+ * skip generic onboarding for new users who land there from an upgrade CTA.
73
73
  */
74
74
  async function buildUpgradeUrl() {
75
- return "https://builder.io/account/billing";
75
+ const url = new URL("https://builder.io/account/subscription");
76
+ url.searchParams.set("signupSource", "agent-native");
77
+ url.searchParams.set("agentNativeConnectSource", "gateway_quota_upgrade");
78
+ url.searchParams.set("agentNativeFlow", "connect_llm");
79
+ url.searchParams.set("framework", "agent-native");
80
+ return url.toString();
76
81
  }
77
82
  class BuilderEngine {
78
83
  name = "builder";