@agent-native/core 0.79.16 → 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 +14 -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 +55 -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/library/library-layout.tsx +3 -3
  95. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +2 -0
  96. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +629 -643
  97. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +219 -155
  98. package/corpus/templates/clips/changelog/2026-06-26-long-desktop-recordings-are-checkpointed-so-macos-finalizati.md +6 -0
  99. package/corpus/templates/clips/changelog/2026-06-26-non-mac-desktop-recordings-wait-for-upload-transcription.md +6 -0
  100. package/corpus/templates/clips/changelog/2026-06-26-s3-compatible-storage-keys-now-save-securely-from-clips-sett.md +6 -0
  101. package/corpus/templates/clips/changelog/2026-06-26-shared-clip-links-guide-agents-through-processing-transcripts.md +6 -0
  102. package/corpus/templates/clips/changelog/2026-06-26-the-clip-details-sidebar-now-collapses-into-a-slide-out-pane.md +6 -0
  103. package/corpus/templates/clips/changelog/2026-06-26-the-clips-library-now-matches-the-shared-recessed-shell-styl.md +6 -0
  104. package/corpus/templates/clips/desktop/src/lib/recorder.ts +55 -3
  105. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +217 -5
  106. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -0
  107. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +176 -5
  108. package/corpus/templates/clips/server/lib/public-agent-context.ts +31 -0
  109. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +60 -14
  110. package/corpus/templates/clips/server/lib/video-storage.ts +37 -9
  111. package/corpus/templates/clips/server/routes/api/agent-transcript.json.get.ts +5 -0
  112. package/corpus/templates/content/app/components/layout/Header.tsx +0 -1
  113. package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +1 -0
  114. package/corpus/templates/content/app/routes/_app.settings.tsx +54 -55
  115. package/corpus/templates/content/app/routes/_app.team.tsx +2 -28
  116. package/corpus/templates/content/server/lib/notion.ts +43 -11
  117. package/corpus/templates/content/server/routes/api/notion/auth-url.get.ts +2 -2
  118. package/corpus/templates/content/server/routes/api/notion/status.get.ts +3 -3
  119. package/corpus/templates/design/app/routes/settings.tsx +60 -38
  120. package/corpus/templates/design/app/routes/team.tsx +2 -10
  121. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +2 -2
  122. package/corpus/templates/dispatch/app/routes/settings.tsx +70 -55
  123. package/corpus/templates/dispatch/app/routes/team.tsx +5 -1
  124. package/corpus/templates/forms/actions/db-connect.ts +7 -36
  125. package/corpus/templates/forms/actions/navigate.ts +2 -2
  126. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +8 -47
  127. package/corpus/templates/forms/app/components/layout/Header.tsx +0 -1
  128. package/corpus/templates/forms/app/components/layout/Layout.tsx +42 -25
  129. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +35 -76
  130. package/corpus/templates/forms/app/global.css +9 -25
  131. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +4 -4
  132. package/corpus/templates/forms/app/i18n/ar-SA.ts +1 -0
  133. package/corpus/templates/forms/app/i18n/de-DE.ts +1 -0
  134. package/corpus/templates/forms/app/i18n/en-US.ts +1 -0
  135. package/corpus/templates/forms/app/i18n/es-ES.ts +1 -0
  136. package/corpus/templates/forms/app/i18n/fr-FR.ts +1 -0
  137. package/corpus/templates/forms/app/i18n/hi-IN.ts +1 -0
  138. package/corpus/templates/forms/app/i18n/ja-JP.ts +1 -0
  139. package/corpus/templates/forms/app/i18n/ko-KR.ts +1 -0
  140. package/corpus/templates/forms/app/i18n/pt-BR.ts +1 -0
  141. package/corpus/templates/forms/app/i18n/zh-CN.ts +1 -0
  142. package/corpus/templates/forms/app/i18n/zh-TW.ts +1 -0
  143. package/corpus/templates/forms/app/lib/route-prewarm.ts +9 -8
  144. package/corpus/templates/forms/app/pages/AskPage.tsx +70 -0
  145. package/corpus/templates/forms/app/pages/FormsListPage.tsx +74 -81
  146. package/corpus/templates/forms/app/root.tsx +1 -1
  147. package/corpus/templates/forms/app/routes/_app.ask.tsx +14 -0
  148. package/corpus/templates/forms/app/routes/_app.settings.tsx +54 -54
  149. package/corpus/templates/forms/app/routes/_app.team.tsx +2 -9
  150. package/corpus/templates/forms/app/routes/_index.tsx +21 -130
  151. package/corpus/templates/forms/changelog/2026-06-26-ask-forms-opens-as-a-standard-app-tab-with-a-simpler-sidebar.md +6 -0
  152. package/corpus/templates/forms/changelog/2026-06-26-forms-are-shown-in-a-tighter-row-list-with-a-denser-sidebar.md +6 -0
  153. package/corpus/templates/forms/shared/navigation.ts +4 -2
  154. package/corpus/templates/macros/app/routes/settings.tsx +54 -54
  155. package/corpus/templates/macros/app/routes/team.tsx +2 -10
  156. package/corpus/templates/mail/actions/helpers.ts +2 -2
  157. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +2 -1
  158. package/corpus/templates/mail/app/pages/SettingsPage.tsx +5 -5
  159. package/corpus/templates/mail/app/routes/team.tsx +3 -2
  160. package/corpus/templates/mail/server/handlers/emails.ts +3 -2
  161. package/corpus/templates/mail/server/handlers/google-auth.ts +19 -12
  162. package/corpus/templates/mail/server/lib/automation-engine.ts +3 -2
  163. package/corpus/templates/mail/server/lib/email-state.ts +2 -3
  164. package/corpus/templates/mail/server/lib/google-auth.ts +28 -11
  165. package/corpus/templates/mail/server/lib/jobs.ts +3 -2
  166. package/corpus/templates/mail/server/onboarding.ts +9 -6
  167. package/corpus/templates/mail/server/routes/api/attachments.get.ts +3 -3
  168. package/corpus/templates/plan/actions/request-plan-access.ts +1 -1
  169. package/corpus/templates/plan/app/components/layout/Header.tsx +0 -1
  170. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +4 -2
  171. package/corpus/templates/plan/app/lib/route-prewarm.ts +0 -4
  172. package/corpus/templates/plan/app/routes/settings.tsx +75 -73
  173. package/corpus/templates/plan/app/routes/team.tsx +2 -8
  174. package/corpus/templates/plan/server/lib/comment-notifications.ts +1 -1
  175. package/corpus/templates/slides/actions/check-image-gen.ts +2 -1
  176. package/corpus/templates/slides/actions/db-connect.ts +7 -45
  177. package/corpus/templates/slides/actions/edit-image.ts +6 -3
  178. package/corpus/templates/slides/actions/generate-image-api.ts +1 -1
  179. package/corpus/templates/slides/actions/generate-image.ts +2 -2
  180. package/corpus/templates/slides/actions/generate-slides-ai.ts +5 -3
  181. package/corpus/templates/slides/actions/image-gen-status.ts +4 -3
  182. package/corpus/templates/slides/actions/image-search.ts +6 -3
  183. package/corpus/templates/slides/actions/search-images.ts +6 -3
  184. package/corpus/templates/slides/app/components/CloudUpgrade.tsx +8 -51
  185. package/corpus/templates/slides/app/components/layout/Header.tsx +0 -1
  186. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +0 -2
  187. package/corpus/templates/slides/app/routes/settings.tsx +54 -54
  188. package/corpus/templates/slides/app/routes/team.tsx +2 -12
  189. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +9 -9
  190. package/corpus/templates/slides/server/handlers/image-gen.ts +5 -1
  191. package/corpus/templates/slides/server/handlers/image-providers/gemini.ts +9 -1
  192. package/corpus/templates/slides/server/handlers/image-providers/index.ts +18 -8
  193. package/corpus/templates/slides/server/handlers/image-providers/openai.ts +10 -4
  194. package/corpus/templates/slides/server/handlers/image-providers/types.ts +1 -0
  195. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +59 -34
  196. package/corpus/templates/slides/server/register-secrets.ts +60 -0
  197. package/corpus/templates/videos/actions/db-connect.ts +7 -45
  198. package/corpus/templates/videos/app/components/CloudUpgrade.tsx +8 -51
  199. package/corpus/templates/videos/app/components/Sidebar.tsx +1 -9
  200. package/corpus/templates/videos/app/components/layout/Header.tsx +0 -1
  201. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +0 -3
  202. package/corpus/templates/videos/app/routes/settings.tsx +54 -54
  203. package/corpus/templates/videos/app/routes/team.tsx +2 -8
  204. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  205. package/dist/agent/engine/builder-engine.js +8 -3
  206. package/dist/agent/engine/builder-engine.js.map +1 -1
  207. package/dist/cli/mcp.d.ts.map +1 -1
  208. package/dist/cli/mcp.js +3 -4
  209. package/dist/cli/mcp.js.map +1 -1
  210. package/dist/client/AssistantChat.d.ts.map +1 -1
  211. package/dist/client/AssistantChat.js +6 -2
  212. package/dist/client/AssistantChat.js.map +1 -1
  213. package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
  214. package/dist/client/chat/markdown-renderer.js +1 -0
  215. package/dist/client/chat/markdown-renderer.js.map +1 -1
  216. package/dist/client/index.d.ts +1 -1
  217. package/dist/client/index.d.ts.map +1 -1
  218. package/dist/client/index.js +1 -1
  219. package/dist/client/index.js.map +1 -1
  220. package/dist/client/org/OrgSwitcher.d.ts +3 -3
  221. package/dist/client/org/OrgSwitcher.js +2 -2
  222. package/dist/client/org/OrgSwitcher.js.map +1 -1
  223. package/dist/client/org/TeamPage.d.ts +6 -1
  224. package/dist/client/org/TeamPage.d.ts.map +1 -1
  225. package/dist/client/org/TeamPage.js +2 -2
  226. package/dist/client/org/TeamPage.js.map +1 -1
  227. package/dist/client/settings/SettingsTabsPage.d.ts +27 -0
  228. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -0
  229. package/dist/client/settings/SettingsTabsPage.js +108 -0
  230. package/dist/client/settings/SettingsTabsPage.js.map +1 -0
  231. package/dist/client/settings/index.d.ts +1 -0
  232. package/dist/client/settings/index.d.ts.map +1 -1
  233. package/dist/client/settings/index.js +1 -0
  234. package/dist/client/settings/index.js.map +1 -1
  235. package/dist/collab/awareness.d.ts +2 -2
  236. package/dist/collab/awareness.d.ts.map +1 -1
  237. package/dist/collab/routes.d.ts +1 -1
  238. package/dist/file-upload/index.d.ts +1 -1
  239. package/dist/file-upload/index.d.ts.map +1 -1
  240. package/dist/file-upload/index.js +1 -1
  241. package/dist/file-upload/index.js.map +1 -1
  242. package/dist/file-upload/registry.d.ts +1 -0
  243. package/dist/file-upload/registry.d.ts.map +1 -1
  244. package/dist/file-upload/registry.js +24 -6
  245. package/dist/file-upload/registry.js.map +1 -1
  246. package/dist/file-upload/types.d.ts +6 -1
  247. package/dist/file-upload/types.d.ts.map +1 -1
  248. package/dist/file-upload/types.js.map +1 -1
  249. package/dist/integrations/adapters/email.d.ts.map +1 -1
  250. package/dist/integrations/adapters/email.js +18 -18
  251. package/dist/integrations/adapters/email.js.map +1 -1
  252. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  253. package/dist/integrations/adapters/slack.js +8 -7
  254. package/dist/integrations/adapters/slack.js.map +1 -1
  255. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  256. package/dist/integrations/adapters/telegram.js +9 -9
  257. package/dist/integrations/adapters/telegram.js.map +1 -1
  258. package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
  259. package/dist/integrations/adapters/whatsapp.js +10 -9
  260. package/dist/integrations/adapters/whatsapp.js.map +1 -1
  261. package/dist/integrations/plugin.d.ts.map +1 -1
  262. package/dist/integrations/plugin.js +47 -13
  263. package/dist/integrations/plugin.js.map +1 -1
  264. package/dist/notifications/routes.d.ts +1 -1
  265. package/dist/onboarding/default-steps.d.ts.map +1 -1
  266. package/dist/onboarding/default-steps.js +6 -5
  267. package/dist/onboarding/default-steps.js.map +1 -1
  268. package/dist/onboarding/types.d.ts +1 -1
  269. package/dist/onboarding/types.d.ts.map +1 -1
  270. package/dist/onboarding/types.js.map +1 -1
  271. package/dist/org/handlers.js +1 -1
  272. package/dist/org/handlers.js.map +1 -1
  273. package/dist/progress/routes.d.ts +1 -1
  274. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  275. package/dist/server/agent-chat-plugin.js +4 -6
  276. package/dist/server/agent-chat-plugin.js.map +1 -1
  277. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  278. package/dist/server/better-auth-instance.d.ts.map +1 -1
  279. package/dist/server/better-auth-instance.js +17 -56
  280. package/dist/server/better-auth-instance.js.map +1 -1
  281. package/dist/server/core-routes-plugin.d.ts +1 -1
  282. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  283. package/dist/server/core-routes-plugin.js +67 -153
  284. package/dist/server/core-routes-plugin.js.map +1 -1
  285. package/dist/server/create-server.d.ts +3 -9
  286. package/dist/server/create-server.d.ts.map +1 -1
  287. package/dist/server/create-server.js +37 -91
  288. package/dist/server/create-server.js.map +1 -1
  289. package/dist/server/email-actions.d.ts +2 -3
  290. package/dist/server/email-actions.d.ts.map +1 -1
  291. package/dist/server/email-actions.js +3 -6
  292. package/dist/server/email-actions.js.map +1 -1
  293. package/dist/server/email.d.ts +3 -3
  294. package/dist/server/email.d.ts.map +1 -1
  295. package/dist/server/email.js +40 -19
  296. package/dist/server/email.js.map +1 -1
  297. package/dist/server/index.d.ts +3 -3
  298. package/dist/server/index.d.ts.map +1 -1
  299. package/dist/server/index.js +3 -3
  300. package/dist/server/index.js.map +1 -1
  301. package/dist/server/scoped-key-storage.d.ts +22 -0
  302. package/dist/server/scoped-key-storage.d.ts.map +1 -0
  303. package/dist/server/scoped-key-storage.js +152 -0
  304. package/dist/server/scoped-key-storage.js.map +1 -0
  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 +55 -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
package/corpus/README.md CHANGED
@@ -27,5 +27,5 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
27
27
 
28
28
  ## Generated Counts
29
29
 
30
- - core files: 2030
31
- - template files: 4398
30
+ - core files: 2031
31
+ - template files: 4412
@@ -1,5 +1,19 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.79.18
4
+
5
+ ### Patch Changes
6
+
7
+ - a6492db: Quiet app-shell divider lines, taller center headers, and soften raised drawer/card surfaces in dark mode.
8
+ - a6492db: Save legacy key setup requests to scoped DB secrets instead of writing deployment env vars, and let file upload providers resolve request-scoped credentials.
9
+ - a6492db: Add a reusable settings tab shell and let team settings hide their duplicate panel title.
10
+
11
+ ## 0.79.17
12
+
13
+ ### Patch Changes
14
+
15
+ - fed6702: Polish shared shell drawer edge borders during depth transitions.
16
+
3
17
  ## 0.79.16
4
18
 
5
19
  ### Patch Changes
@@ -54,22 +54,28 @@ Register a custom provider in a server plugin to use any storage backend (S3, Cl
54
54
  ```ts
55
55
  // server/plugins/file-upload.ts
56
56
  import { registerFileUploadProvider } from "@agent-native/core/file-upload";
57
+ import { resolveSecret } from "@agent-native/core/server";
57
58
 
58
59
  export default defineNitroPlugin(() => {
60
+ const readBucket = () => resolveSecret("S3_BUCKET");
61
+
59
62
  registerFileUploadProvider({
60
63
  id: "s3",
61
64
  name: "Amazon S3",
62
- isConfigured: () => !!process.env.S3_BUCKET,
65
+ isConfigured: () => false,
66
+ isConfiguredForRequest: async () => !!(await readBucket()),
63
67
  upload: async ({ data, filename, mimeType }) => {
68
+ const bucket = await readBucket();
69
+ if (!bucket) throw new Error("S3 storage is not configured");
64
70
  const key = `uploads/${Date.now()}-${filename}`;
65
71
  await s3Client.putObject({
66
- Bucket: process.env.S3_BUCKET!,
72
+ Bucket: bucket,
67
73
  Key: key,
68
74
  Body: data,
69
75
  ContentType: mimeType,
70
76
  });
71
77
  return {
72
- url: `https://${process.env.S3_BUCKET}.s3.amazonaws.com/${key}`,
78
+ url: `https://${bucket}.s3.amazonaws.com/${key}`,
73
79
  provider: "s3",
74
80
  };
75
81
  },
@@ -85,7 +91,8 @@ The `FileUploadProvider` interface:
85
91
  interface FileUploadProvider {
86
92
  id: string; // Unique id, e.g. "s3"
87
93
  name: string; // Human-readable name
88
- isConfigured: () => boolean; // True when ready (env vars set, etc.)
94
+ isConfigured: () => boolean; // True when ready from sync runtime state
95
+ isConfiguredForRequest?: () => Promise<boolean>; // True from scoped DB secrets
89
96
  upload: (input: FileUploadInput) => Promise<FileUploadResult>;
90
97
  }
91
98
 
@@ -168,7 +168,7 @@ pnpm dev
168
168
 
169
169
  ## متغيرات البيئة المشتركة {#shared-env}
170
170
 
171
- يتم تحميل جذر مساحة العمل `.env` في كل تطبيق تلقائيًا. ضع المفاتيح المشتركة مرة واحدة في الجذر `ANTHROPIC_API_KEY`، `A2A_SECRET `BETTER_AUTH_SECRET `DATABASE_URL `BUILDER_PRIVATE_KEY`، وما إلى ذلك وسيلتقطها كل تطبيق. يتم إجراء التجاوزات لكل تطبيق في `apps/<name>/.env` والفوز في الصراع.
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  بالنسبة لبيانات اعتماد تطبيق وقت التشغيل، تفضل Dispatch vault على تحرير ملفات `.env` يدويًا. يتم تعيين الوصول الافتراضي للمخزن إلى جميع التطبيقات، لذلك يكون كل مفتاح مخزن محفوظ متاحًا لكل تطبيق مساحة عمل ويمكن دفعه باستخدام `sync-vault-to-app`. قم بتبديل المخزن إلى الوضع اليدوي فقط عندما تحتاج التطبيقات إلى منح صريحة لكل مفتاح.
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  هناك عدد قليل من عمليات الإعداد التي تكون جاهزة للاستخدام في مساحة العمل:
184
184
 
185
- - **Builder `/cli-auth`**: يؤدي النقر على "Connect Builder" من أي تطبيق إلى كتابة `BUILDER_PRIVATE_KEY` والأصدقاء إلى **جذر مساحة العمل** `.env`، بحيث يتمكن كل تطبيق من الوصول إلى المتصفح مرة واحدة.
186
- - **مسار إعدادات Env-vars** (`POST /_agent-native/env-vars`): عندما تكون داخل مساحة عمل، يتم كتابة جذر مساحة العمل بشكل افتراضي `.env`. قم بتمرير `scope: "app"` في النص لتجاوز تطبيق واحد.
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## بيانات الاعتماد المشتركة {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ Informationen zum Konfigurationsschema, zu den Prioritätsregeln und zur Hub-Ein
168
168
 
169
169
  ## Gemeinsame Umgebungsvariablen {#shared-env}
170
170
 
171
- Das Arbeitsbereichsstammverzeichnis `.env` wird automatisch in jede App geladen. Legen Sie gemeinsam genutzte Schlüssel einmal im Stammverzeichnis ab – `ANTHROPIC_API_KEY`, `A2A_SECRET`, `BETTER_AUTH_SECRET`, `DATABASE_URL`, `BUILDER_PRIVATE_KEY` usw. und jede App übernimmt sie. Überschreibungen pro App erfolgen in `apps/<name>/.env` und gewinnen bei Konflikten.
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  Für Laufzeit-App-Anmeldeinformationen bevorzugen Sie den Dispatch-Tresor gegenüber der manuellen Bearbeitung von `.env`-Dateien. Der Tresor ist standardmäßig auf den Zugriff aller Apps eingestellt, sodass jeder gespeicherte Tresorschlüssel für jede Workspace-App verfügbar ist und mit `sync-vault-to-app` übertragen werden kann. Schalten Sie den Tresor nur dann in den manuellen Modus, wenn Apps explizite Gewährung pro Schlüssel benötigen.
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  Einige Onboarding-Abläufe sind standardmäßig arbeitsbereichsorientiert:
184
184
 
185
- - **Builder `/cli-auth`**: Wenn Sie in einer beliebigen App auf „Builder verbinden“ klicken, werden `BUILDER_PRIVATE_KEY` und Freunde in das **Arbeitsbereichsstammverzeichnis** `.env` geschrieben, sodass jede App sofort Browserzugriff erhält.
186
- - **Env-vars-Einstellungsroute** (`POST /_agent-native/env-vars`): Wenn innerhalb eines Arbeitsbereichs, wird standardmäßig das Arbeitsbereichsstammverzeichnis `.env` geschrieben. Übergeben Sie `scope: "app"` im Textkörper, um eine App zu überschreiben.
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## Gemeinsame Anmeldeinformationen {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ Consulte [MCP Clients](/docs/mcp-clients) para conocer el esquema de configuraci
168
168
 
169
169
  ## Variables de entorno compartidas {#shared-env}
170
170
 
171
- La raíz del espacio de trabajo `.env` se carga automáticamente en cada aplicación. Coloque las claves compartidas una vez en la raíz (`ANTHROPIC_API_KEY`, `A2A_SECRET`, `BETTER_AUTH_SECRET`, `DATABASE_URL`, `BUILDER_PRIVATE_KEY`, etc.) y cada aplicación las recogerá. Las anulaciones por aplicación van en `apps/<name>/.env` y ganan en caso de conflicto.
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  Para las credenciales de la aplicación en tiempo de ejecución, prefiera la bóveda de Dispatch a la edición manual de archivos `.env`. La bóveda tiene de forma predeterminada acceso a todas las aplicaciones, por lo que cada clave de bóveda guardada está disponible para todas las aplicaciones del espacio de trabajo y se puede enviar con `sync-vault-to-app`. Cambie la bóveda al modo manual solo cuando las aplicaciones necesiten concesiones explícitas por clave.
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  Algunos flujos de incorporación tienen en cuenta el espacio de trabajo desde el primer momento:
184
184
 
185
- - **Builder `/cli-auth`**: al hacer clic en "Conectar Builder" desde cualquier aplicación, `BUILDER_PRIVATE_KEY` y sus amigos se escriben en la **raíz del espacio de trabajo** `.env`, por lo que todas las aplicaciones obtienen acceso al navegador a la vez.
186
- - **Ruta de configuración de Env-vars** (`POST /_agent-native/env-vars`): cuando está dentro de un espacio de trabajo, de forma predeterminada se escribe la raíz del espacio de trabajo `.env`. Pase `scope: "app"` en el cuerpo para anular una aplicación.
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## Credenciales compartidas {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ Voir [MCP Clients](/docs/mcp-clients) pour le schéma de configuration, les règ
168
168
 
169
169
  ## Variables d'environnement partagées {#shared-env}
170
170
 
171
- La racine de l'espace de travail `.env` est chargée automatiquement dans chaque application. Placez les clés partagées une fois à la racine – `ANTHROPIC_API_KEY`, `A2A_SECRET`, `BETTER_AUTH_SECRET`, `DATABASE_URL`, `BUILDER_PRIVATE_KEY`, etc. et chaque application les récupère. Les remplacements par application vont dans `apps/<name>/.env` et gagnent en cas de conflit.
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  Pour les informations d'identification de l'application d'exécution, préférez le coffre-fort Dispatch à la modification manuelle des fichiers `.env`. Le coffre-fort est par défaut un accès à toutes les applications, de sorte que chaque clé du coffre-fort enregistrée est disponible pour chaque application de l'espace de travail et peut être poussée avec `sync-vault-to-app`. Basculez le coffre-fort en mode manuel uniquement lorsque les applications ont besoin d'autorisations explicites par clé.
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  Quelques flux d'intégration sont prêts à l'emploi et adaptés à l'espace de travail :
184
184
 
185
- - **Builder `/cli-auth`** : en cliquant sur "Connecter Builder" depuis n'importe quelle application, `BUILDER_PRIVATE_KEY` et ses amis sont écrits dans la **racine de l'espace de travail** `.env`, afin que chaque application puisse accéder au navigateur en même temps.
186
- - **Route des paramètres Env-vars** (`POST /_agent-native/env-vars`) : à l'intérieur d'un espace de travail, la racine de l'espace de travail est écrite par défaut `.env`. Transmettez `scope: "app"` dans le corps pour remplacer une application.
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## Identifiants partagés {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ pnpm dev
168
168
 
169
169
  ## साझा पर्यावरण चर {#shared-env}
170
170
 
171
- वर्कस्पेस रूट `.env` स्वचालित रूप से प्रत्येक ऐप में लोड होता है। साझा कुंजियों को एक बार रूट पर रखें - `ANTHROPIC_API_KEY`, `A2A_SECRET`, `BETTER_AUTH_SECRET`, `DATABASE_URL`, `BUILDER_PRIVATE_KEY`, आदि - और हर ऐप उन्हें चुन लेता है। प्रति-ऐप ओवरराइड `apps/<name>/.env` में जाते हैं और संघर्ष पर जीत हासिल करते हैं।
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  रनटाइम ऐप क्रेडेंशियल के लिए, `.env` फ़ाइलों को हाथ से संपादित करने के बजाय डिस्पैच वॉल्ट को प्राथमिकता दें। वॉल्ट डिफ़ॉल्ट रूप से सभी ऐप्स तक पहुंच प्रदान करता है, इसलिए प्रत्येक सहेजी गई वॉल्ट कुंजी प्रत्येक कार्यस्थान ऐप के लिए उपलब्ध है और इसे `sync-vault-to-app` के साथ पुश किया जा सकता है। वॉल्ट को मैन्युअल मोड में तभी स्विच करें जब ऐप्स को स्पष्ट प्रति-कुंजी अनुदान की आवश्यकता हो।
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  कुछ ऑनबोर्डिंग प्रवाह बॉक्स से बाहर कार्यक्षेत्र-जागरूक हैं:
184
184
 
185
- - **Builder `/cli-auth`**: किसी भी ऐप से "कनेक्ट Builder" पर क्लिक करने से `BUILDER_PRIVATE_KEY` और मित्र **वर्कस्पेस रूट** `.env` पर लिखते हैं, इसलिए प्रत्येक ऐप एक ही बार में ब्राउज़र एक्सेस प्राप्त कर लेता है।
186
- - **Env-vars सेटिंग्स रूट** (`POST /_agent-native/env-vars`): जब किसी कार्यक्षेत्र के अंदर, डिफ़ॉल्ट रूप से कार्यक्षेत्र रूट `.env` लिखा जाता है। एक ऐप को ओवरराइड करने के लिए बॉडी में `scope: "app"` पास करें।
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## साझा क्रेडेंशियल {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ pnpm dev
168
168
 
169
169
  ## 共有環境変数 {#shared-env}
170
170
 
171
- ワークスペース ルート `.env` はすべてのアプリに自動的にロードされます。共有キーをルート (`ANTHROPIC_API_KEY`、`A2A_SECRET`、`BETTER_AUTH_SECRET`、`DATABASE_URL`、`BUILDER_PRIVATE_KEY` など) に一度置くと、すべてのアプリがそれらを取得します。アプリごとのオーバーライドは `apps/<name>/.env` で行われ、競合が発生した場合に優先されます。
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  ランタイム アプリの資格情報については、`.env` ファイルを手動で編集するよりも、Dispatch ボールトを使用することをお勧めします。ボールトはデフォルトですべてのアプリにアクセスするため、保存されたすべてのボールト キーはすべてのワークスペース アプリで使用でき、`sync-vault-to-app` でプッシュできます。アプリがキーごとの明示的な許可を必要とする場合にのみ、ボールトを手動モードに切り替えます。
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  いくつかのオンボーディング フローは、すぐに使えるワークスペース対応です。
184
184
 
185
- - **Builder `/cli-auth`**: 任意のアプリから [Builder に接続] をクリックすると、`BUILDER_PRIVATE_KEY` とその友人が **ワークスペース ルート** `.env` に書き込まれるため、すべてのアプリが一度にブラウザー アクセスを取得します。
186
- - **Env-vars 設定ルート** (`POST /_agent-native/env-vars`): ワークスペース内では、デフォルトでワークスペース ルート `.env` が書き込まれます。 1 つのアプリをオーバーライドするには、本文で `scope: "app"` を渡します。
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## 共有認証情報 {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ pnpm dev
168
168
 
169
169
  ## 공유 환경 변수 {#shared-env}
170
170
 
171
- 작업공간 루트 `.env`는 모든 앱에 자동으로 로드됩니다. 공유 키(`ANTHROPIC_API_KEY`, `A2A_SECRET`, `BETTER_AUTH_SECRET`, `DATABASE_URL`, `BUILDER_PRIVATE_KEY` 등)를 루트에 번만 넣으면 모든 앱이 이를 선택합니다. 앱별 재정의는 `apps/<name>/.env`에 들어가 충돌 승리합니다.
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  런타임 앱 자격 증명의 경우 `.env` 파일을 직접 편집하는 것보다 Dispatch Vault를 선호합니다. 볼트는 기본적으로 모든 앱 액세스로 설정되어 있으므로 저장된 모든 볼트 키는 모든 작업 공간 앱에서 사용할 수 있으며 `sync-vault-to-app`로 푸시할 수 있습니다. 앱에 명시적인 키별 부여가 필요한 경우에만 Vault를 수동 모드로 전환하세요.
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  몇 가지 온보딩 흐름은 기본적으로 작업공간을 인식합니다.
184
184
 
185
- - **Builder `/cli-auth`**: 모든 앱에서 "Builder 연결" 클릭하면 `BUILDER_PRIVATE_KEY`와 친구들이 **작업 공간 루트** `.env`에 기록되므로 모든 앱이 동시에 브라우저 액세스 권한을 얻게 됩니다.
186
- - **Env-vars 설정 경로** (`POST /_agent-native/env-vars`): 작업 공간 내부에 있을 기본적으로 작업 공간 루트 `.env`를 작성합니다. 하나의 앱을 재정의하려면 본문에 `scope: "app"`를 전달하세요.
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## 공유 자격 증명 {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ Consulte [MCP Clients](/docs/mcp-clients) para obter o esquema de configuração
168
168
 
169
169
  ## Variáveis de ambiente compartilhadas {#shared-env}
170
170
 
171
- A raiz do espaço de trabalho `.env` é carregada em cada aplicativo automaticamente. Coloque as chaves compartilhadas uma vez na raiz – `ANTHROPIC_API_KEY`, `A2A_SECRET`, `BETTER_AUTH_SECRET`, `DATABASE_URL`, `BUILDER_PRIVATE_KEY`, etc. e cada aplicativo as seleciona. As substituições por aplicativo entram em `apps/<name>/.env` e vencem em caso de conflito.
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  Para credenciais de aplicativos de tempo de execução, prefira o cofre do Dispatch em vez da edição manual de arquivos `.env`. O padrão do cofre é o acesso a todos os aplicativos, portanto, cada chave do cofre salva está disponível para todos os aplicativos do espaço de trabalho e pode ser enviada por push com `sync-vault-to-app`. Mude o cofre para o modo manual somente quando os apps precisarem de concessões explícitas por chave.
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  Alguns fluxos de integração já reconhecem o espaço de trabalho:
184
184
 
185
- - **Builder `/cli-auth`**: clicar em "Conectar Builder" em qualquer aplicativo grava `BUILDER_PRIVATE_KEY` e amigos na **raiz do espaço de trabalho** `.env`, para que todos os aplicativos obtenham acesso ao navegador de uma só vez.
186
- - **Rota de configurações Env-vars** (`POST /_agent-native/env-vars`): quando dentro de um espaço de trabalho, o padrão é gravar a raiz do espaço de trabalho `.env`. Passe `scope: "app"` no corpo para substituir um aplicativo.
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## Credenciais compartilhadas {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ pnpm dev
168
168
 
169
169
  ## 共享环境变量 {#shared-env}
170
170
 
171
- 工作区根 `.env` 会自动加载到每个应用程序中。将共享密钥放在根目录中一次(`ANTHROPIC_API_KEY`、`A2A_SECRET`、`BETTER_AUTH_SECRET`、`DATABASE_URL`、`BUILDER_PRIVATE_KEY` 等),每个应用程序都会获取它们。每个应用程序覆盖进入 `apps/<name>/.env` 并在冲突时获胜。
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  对于运行时应用程序凭据,与手动编辑 `.env` 文件相比,更喜欢使用 DispatchVault。保管库默认为所有应用程序访问,因此每个保存的保管库密钥可供每个工作区应用程序使用,并且可以使用 `sync-vault-to-app` 推送。仅当应用程序需要显式的每密钥授权时,才将保管库切换到手动模式。
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  一些入门流程是开箱即用的工作区感知型:
184
184
 
185
- - **Builder `/cli-auth`**:从任何应用程序中单击“连接 Builder”会将 `BUILDER_PRIVATE_KEY` 和朋友写入 **工作区根目录** `.env`,因此每个应用程序都会立即获得浏览器访问权限。
186
- - **环境变量设置路由** (`POST /_agent-native/env-vars`):在工作空间内时,默认写入工作空间根 `.env`。在正文中传递 `scope: "app"` 以覆盖一个应用程序。
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## 共享凭据 {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ pnpm dev
168
168
 
169
169
  ## 共用環境變數 {#shared-env}
170
170
 
171
- 工作區根 `.env` 會自動載入到每個應用程式中。將共用金鑰放在根目錄中一次(`ANTHROPIC_API_KEY`、`A2A_SECRET`、`BETTER_AUTH_SECRET`、`DATABASE_URL`、`BUILDER_PRIVATE_KEY` 等),每個應用程式都會取得它們。每個應用程式覆蓋進入 `apps/<name>/.env` 並在衝突時獲勝。
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  對於執行時應用程式憑證,與手動編輯 `.env` 檔案相比,更喜歡使用 DispatchVault。保管庫預設為所有應用程式存取,因此每個儲存的保管庫金鑰可供每個工作區應用程式使用,並且可以使用 `sync-vault-to-app` 推送。僅當應用程式需要顯式的每金鑰授權時,才將保管庫切換到手動模式。
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  一些入門流程是開箱即用的工作區感知型:
184
184
 
185
- - **Builder `/cli-auth`**:從任何應用程式中點選“連線 Builder”會將 `BUILDER_PRIVATE_KEY` 和朋友寫入 **工作區根目錄** `.env`,因此每個應用程式都會立即獲得瀏覽器存取權限。
186
- - **環境變數設定路由** (`POST /_agent-native/env-vars`):在工作空間內時,預設寫入工作空間根 `.env`。在內文中傳遞 `scope: "app"` 以覆蓋一個應用程式。
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and related metadata to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## 共用憑證 {#shared-credentials}
189
189
 
@@ -168,7 +168,7 @@ See [MCP Clients](/docs/mcp-clients) for the config schema, precedence rules, an
168
168
 
169
169
  ## Shared environment variables {#shared-env}
170
170
 
171
- The workspace root `.env` is loaded into every app automatically. Put shared keys once at the root — `ANTHROPIC_API_KEY`, `A2A_SECRET`, `BETTER_AUTH_SECRET`, `DATABASE_URL`, `BUILDER_PRIVATE_KEY`, etc. and every app picks them up. Per-app overrides go in `apps/<name>/.env` and win on conflict.
171
+ The workspace root `.env` is loaded into every app automatically for deployment-level configuration such as `A2A_SECRET`, `BETTER_AUTH_SECRET`, and `DATABASE_URL`. User, org, and workspace API keys should be saved as scoped DB secrets instead of being written into `.env`. Per-app deploy-time overrides can still go in `apps/<name>/.env` and win on conflict.
172
172
 
173
173
  For runtime app credentials, prefer the Dispatch vault over hand-editing `.env` files. The vault defaults to all-apps access, so every saved vault key is available to every workspace app and can be pushed with `sync-vault-to-app`. Switch the vault to manual mode only when apps need explicit per-key grants.
174
174
 
@@ -182,8 +182,8 @@ my-company-platform/
182
182
 
183
183
  A few onboarding flows are workspace-aware out of the box:
184
184
 
185
- - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and friends to the **workspace root** `.env`, so every app gains browser access at once.
186
- - **Env-vars settings route** (`POST /_agent-native/env-vars`): when inside a workspace, defaults to writing the workspace root `.env`. Pass `scope: "app"` in the body to override one app.
185
+ - **Builder `/cli-auth`**: clicking "Connect Builder" from any app writes `BUILDER_PRIVATE_KEY` and friends to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
186
+ - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
187
187
 
188
188
  ## Shared credentials {#shared-credentials}
189
189
 
@@ -130,6 +130,15 @@ Password-protected clips require the password once; successful responses return
130
130
  short-lived tokenized links so downstream agents do not need the plaintext
131
131
  password.
132
132
 
133
+ When `transcript.status` is `pending`, agents should wait 15-30 seconds and
134
+ retry the context or transcript URL a few times before falling back to frames or
135
+ reporting that no transcript is available. Long recordings can take several
136
+ minutes to finish. Failed transcripts include `failureReason`; if Builder
137
+ transcription credits are exhausted, the agent should explain that the user
138
+ needs Builder.io credits/upgrade or a Groq key for backup speech-to-text.
139
+ Pending transcript responses also include `retryAfterSeconds` for agents that
140
+ want a structured polling hint.
141
+
133
142
  Slack previews use the same sharing boundary. The `/api/slack/unfurl` webhook
134
143
  only returns a playable Slack `video` block for ready, public clips without a
135
144
  password, expiry hit, archive marker, or trash marker. Other clips still get the
@@ -146,7 +155,7 @@ normal share-page title/thumbnail metadata and require opening Clips.
146
155
  { "name": "id", "in": "query", "type": "string", "required": true, "description": "Recording id" }
147
156
  ],
148
157
  "responses": [
149
- { "status": "200", "description": "Clip metadata plus transcript and frame API links" }
158
+ { "status": "200", "description": "Clip metadata, transcript status/failureReason/retryAfterSeconds, agent instructions, and transcript/frame API links" }
150
159
  ]
151
160
  }
152
161
  ```
@@ -160,7 +169,7 @@ normal share-page title/thumbnail metadata and require opening Clips.
160
169
  { "name": "id", "in": "query", "type": "string", "required": true, "description": "Recording id" }
161
170
  ],
162
171
  "responses": [
163
- { "status": "200", "description": "Segments with startMs, endMs, readable timestamps, text, and optional source labels" }
172
+ { "status": "200", "description": "Transcript status, failureReason, retryAfterSeconds, full text, and segments with startMs, endMs, readable timestamps, text, and optional source labels" }
164
173
  ]
165
174
  }
166
175
  ```
@@ -216,7 +225,7 @@ pnpm dev
216
225
 
217
226
  Clips is a larger template with a native recorder (it ships a desktop companion for local capture). Three setup steps are needed before recordings can upload:
218
227
 
219
- 1. **Video storage (required).** Connect a storage backend through the onboarding wizard. The easiest path is Builder.io (free during beta, one-click). For self-hosted storage, set `S3_ENDPOINT`, `S3_BUCKET`, `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`, and optionally `S3_REGION` and `S3_PUBLIC_BASE_URL`. Cloudflare R2 and DigitalOcean Spaces use the same env vars with the `R2_*` prefix.
228
+ 1. **Video storage (required).** Connect a storage backend through the onboarding wizard or Clips Settings. The easiest path is Builder.io (free during beta, one-click). For self-hosted storage, save `S3_ENDPOINT`, `S3_BUCKET`, `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`, and optionally `S3_REGION` and `S3_PUBLIC_BASE_URL` in the app; the values are stored as scoped DB secrets. Cloudflare R2 and DigitalOcean Spaces use the same key names with the `R2_*` prefix.
220
229
  2. **Google Calendar (optional).** To sync upcoming meetings, connect a Google Calendar account from Settings. The OAuth callback URL in dev is `http://localhost:8094/_agent-native/google/callback`. Set up a Google OAuth client in [Google Cloud Console](https://console.cloud.google.com/) with the Gmail and Google Calendar APIs enabled.
221
230
  3. **Screen-capture permissions.** On macOS, grant Screen Recording permission to the browser (or the desktop companion app) in System Settings → Privacy & Security → Screen Recording. Browser recordings can save redacted console and fetch/XHR diagnostics from the recorder page. Once the Chrome extension listing is available, enable `VITE_CLIPS_CHROME_EXTENSION_ENABLED=1` so users can choose the extension for active-tab browser logs or the desktop app for the smoothest native capture path.
222
231
  4. **Slack previews (optional).** Create a Slack app with `links:read`, `links:write`, and `links.embed:write`; subscribe to `link_shared`; add your Clips share domain under **App Unfurl Domains**; set the Request URL to `https://your-clips.example.com/api/slack/unfurl`; and add the OAuth redirect URL `https://your-clips.example.com/api/slack/oauth/callback`. Configure `SLACK_CLIENT_ID`, `SLACK_CLIENT_SECRET`, and `SLACK_SIGNING_SECRET`, then connect workspaces from Clips Settings.
@@ -239,8 +248,8 @@ tray app at your deployment.
239
248
  2. **Configure production state.** Set a persistent `DATABASE_URL`, the normal
240
249
  production auth/secrets variables from [Deployment](/docs/deployment), and a
241
250
  video storage provider. Builder.io Connect is the easiest storage path; for
242
- self-hosted storage, use `S3_*` or `R2_*` variables for an S3-compatible
243
- bucket.
251
+ self-hosted storage, save `S3_*` or `R2_*` keys from Clips Settings for an
252
+ S3-compatible bucket.
244
253
 
245
254
  3. **Deploy the web app.** For a plain Node deploy:
246
255
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.79.16",
3
+ "version": "0.79.18",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -94,11 +94,16 @@ function mapReasoningEffort(budgetTokens: number): ReasoningEffort {
94
94
  * `/app/organizations/Nicholas%20kipchumba%20Space/billing` which Builder's
95
95
  * router treats as unknown and silently bounces to `/app/projects`. The
96
96
  * Builder CLI-auth callback doesn't expose the org slug/id today, so we route
97
- * to the org-agnostic billing page Builder resolves the active org from
98
- * session there and users with multiple orgs can switch from that screen.
97
+ * to the org-agnostic subscription page. Agent Native attribution lets Builder
98
+ * skip generic onboarding for new users who land there from an upgrade CTA.
99
99
  */
100
100
  async function buildUpgradeUrl(): Promise<string> {
101
- return "https://builder.io/account/billing";
101
+ const url = new URL("https://builder.io/account/subscription");
102
+ url.searchParams.set("signupSource", "agent-native");
103
+ url.searchParams.set("agentNativeConnectSource", "gateway_quota_upgrade");
104
+ url.searchParams.set("agentNativeFlow", "connect_llm");
105
+ url.searchParams.set("framework", "agent-native");
106
+ return url.toString();
102
107
  }
103
108
 
104
109
  interface GatewayErrorBody {
@@ -205,21 +205,26 @@ async function mintHostedJwt(cwd: string): Promise<string | undefined> {
205
205
  process.env.AGENT_NATIVE_OWNER_EMAIL ||
206
206
  process.env.OWNER_EMAIL ||
207
207
  "owner@localhost";
208
+ let fileA2ASecret: string | undefined;
208
209
  if (!process.env.A2A_SECRET) {
209
210
  const baseDir = envBaseDir(cwd);
210
211
  const content =
211
212
  readEnvFile(path.join(baseDir, ".env.local")) +
212
213
  "\n" +
213
214
  readEnvFile(path.join(baseDir, ".env"));
214
- const secret = getEnvValue(content, "A2A_SECRET");
215
- if (secret) process.env.A2A_SECRET = secret;
215
+ fileA2ASecret = getEnvValue(content, "A2A_SECRET");
216
216
  }
217
217
  try {
218
218
  const { signA2AToken } = await import("../a2a/client.js");
219
- return await signA2AToken(owner, undefined, undefined, {
220
- preferGlobalSecret: true,
221
- expiresIn: "30d",
222
- });
219
+ return await signA2AToken(
220
+ owner,
221
+ undefined,
222
+ process.env.A2A_SECRET || fileA2ASecret,
223
+ {
224
+ preferGlobalSecret: true,
225
+ expiresIn: "30d",
226
+ },
227
+ );
223
228
  } catch (err: any) {
224
229
  logErr(
225
230
  ` Could not mint a hosted JWT (${err?.message ?? err}). ` +
@@ -1137,8 +1137,8 @@ const AssistantChatInner = forwardRef<
1137
1137
  const isComposerDisabled = missingApiKey || composerDisabled;
1138
1138
  const missingApiKeySetupAboveComposer =
1139
1139
  missingApiKeySetupLayout === "sidebar";
1140
- // Increments each time the user clicks the (disabled) composer while no LLM
1141
- // is connected — `BuilderSetupCard` watches this to replay a one-shot bounce.
1140
+ // Increments each time the user tries to chat while no LLM is connected.
1141
+ // `BuilderSetupCard` watches this to replay a one-shot bounce.
1142
1142
  const [missingKeyBouncePulse, setMissingKeyBouncePulse] = useState(0);
1143
1143
  const [authError, setAuthError] = useState<{
1144
1144
  sessionExpired?: boolean;
@@ -3152,6 +3152,10 @@ const AssistantChatInner = forwardRef<
3152
3152
  <button
3153
3153
  key={suggestion}
3154
3154
  onClick={() => {
3155
+ if (missingApiKey) {
3156
+ setMissingKeyBouncePulse((p) => p + 1);
3157
+ return;
3158
+ }
3155
3159
  threadRuntime.append({
3156
3160
  role: "user",
3157
3161
  content: [{ type: "text", text: suggestion }],
@@ -179,6 +179,7 @@ function isBuilderErrorCtaHref(href: string | undefined): boolean {
179
179
  return (
180
180
  url.href === BUILDER_SPACE_SETTINGS_URL ||
181
181
  url.pathname === "/account/billing" ||
182
+ url.pathname === "/account/subscription" ||
182
183
  /^\/app\/organizations\/[^/]+\/billing$/.test(url.pathname)
183
184
  );
184
185
  } catch {
@@ -610,7 +610,13 @@ export {
610
610
  type DataWidgetResultMetadata,
611
611
  } from "./chat/widgets/data-widget-types.js";
612
612
  export { AgentNativeIcon } from "./components/icons/AgentNativeIcon.js";
613
- export { SettingsPanel, type SettingsPanelProps } from "./settings/index.js";
613
+ export {
614
+ SettingsPanel,
615
+ SettingsTabsPage,
616
+ type SettingsPanelProps,
617
+ type SettingsTabItem,
618
+ type SettingsTabsPageProps,
619
+ } from "./settings/index.js";
614
620
  export { useBuilderStatus } from "./settings/useBuilderStatus.js";
615
621
  export {
616
622
  openBuilderConnectPopup,
@@ -64,9 +64,9 @@ export interface OrgSwitcherProps {
64
64
  reserveSpace?: boolean;
65
65
  /**
66
66
  * Path to navigate to when the user clicks "Organization settings".
67
- * Defaults to `/team`, the standard organization-management route. Templates
68
- * with an established org surface can pass their own path; pass `null` to
69
- * only open the in-sidebar settings panel.
67
+ * Defaults to the standard Team tab inside Settings. Templates with an
68
+ * established org surface can pass their own path; pass `null` to only open
69
+ * the in-sidebar settings panel.
70
70
  */
71
71
  settingsPath?: string | null;
72
72
  }
@@ -97,7 +97,7 @@ const SECTION_LABEL_CLASS =
97
97
  const APP_SUBMENU_CONTENT_CLASS =
98
98
  "z-50 w-72 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2";
99
99
 
100
- const DEFAULT_ORGANIZATION_SETTINGS_PATH = "/team";
100
+ const DEFAULT_ORGANIZATION_SETTINGS_PATH = "/settings#team";
101
101
 
102
102
  const APP_ICON_MAP: Record<string, typeof IconApps> = {
103
103
  Mail: IconMail,
@@ -131,7 +131,7 @@ function appMenuIcon(app: OrgSwitcherAppLink): typeof IconApps {
131
131
  }
132
132
 
133
133
  function organizationSettingsPath(path: string): string {
134
- return `${path.replace(/#.*$/, "")}#workspace-settings`;
134
+ return path.includes("#") ? path : `${path}#team`;
135
135
  }
136
136
 
137
137
  function AppMenuLink({
@@ -58,6 +58,11 @@ export interface TeamPageProps {
58
58
  * Title shown at the top of the page. Defaults to "Team".
59
59
  */
60
60
  title?: string;
61
+ /**
62
+ * Hide the page title when this is rendered inside another titled surface,
63
+ * such as the Settings > Team tab.
64
+ */
65
+ showTitle?: boolean;
61
66
  /**
62
67
  * Description shown on the "Create an Organization" card. Defaults to
63
68
  * "Set up a team to collaborate with your colleagues."
@@ -1260,6 +1265,7 @@ function A2ASecretSection({ secret }: { secret: string | null | undefined }) {
1260
1265
  export function TeamPage({
1261
1266
  layout,
1262
1267
  title,
1268
+ showTitle = true,
1263
1269
  createOrgDescription,
1264
1270
  className,
1265
1271
  }: TeamPageProps) {
@@ -1268,9 +1274,11 @@ export function TeamPage({
1268
1274
 
1269
1275
  const content = (
1270
1276
  <div className={`space-y-6 max-w-2xl ${className ?? ""}`}>
1271
- <h2 className="text-2xl font-bold tracking-tight">
1272
- {title ?? t("org.team")}
1273
- </h2>
1277
+ {showTitle ? (
1278
+ <h2 className="text-2xl font-bold tracking-tight">
1279
+ {title ?? t("org.team")}
1280
+ </h2>
1281
+ ) : null}
1274
1282
 
1275
1283
  {isLoading && (
1276
1284
  <section className="rounded-lg border border-border bg-card p-6">