@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
@@ -3,10 +3,12 @@ import {
3
3
  callAction,
4
4
  ChangelogSettingsCard,
5
5
  LanguagePicker,
6
+ SettingsTabsPage,
6
7
  openAgentSettings,
7
8
  type AppearancePresetId,
8
9
  useT,
9
10
  } from "@agent-native/core/client";
11
+ import { TeamPage } from "@agent-native/core/client/org";
10
12
  import {
11
13
  IconBrandZoom,
12
14
  IconExternalLink,
@@ -153,292 +155,323 @@ export default function Settings() {
153
155
  }
154
156
 
155
157
  return (
156
- <div className="mx-auto max-w-2xl space-y-6 px-4 py-8 pb-12">
157
- <div>
158
- <h1 className="text-2xl font-semibold">{t("settings.title")}</h1>
159
- <p className="text-sm text-muted-foreground mt-1">
160
- {t("settings.description")}
161
- </p>
162
- </div>
158
+ <SettingsTabsPage
159
+ generalLabel={t("settings.general")}
160
+ teamLabel={t("navigation.team")}
161
+ general={
162
+ <div className="mx-auto max-w-2xl space-y-6 pb-12">
163
+ <p className="text-sm text-muted-foreground">
164
+ {t("settings.description")}
165
+ </p>
163
166
 
164
- <ChangelogSettingsCard markdown={changelog} />
167
+ <Card>
168
+ <CardHeader>
169
+ <CardTitle className="text-lg">
170
+ {t("settings.languageTitle")}
171
+ </CardTitle>
172
+ <CardDescription>
173
+ {t("settings.languageDescription")}
174
+ </CardDescription>
175
+ </CardHeader>
176
+ <CardContent className="max-w-xs space-y-1.5">
177
+ <Label>{t("settings.languageLabel")}</Label>
178
+ <LanguagePicker label={t("settings.languageLabel")} />
179
+ </CardContent>
180
+ </Card>
165
181
 
166
- <Card>
167
- <CardHeader>
168
- <CardTitle className="text-lg">
169
- {t("settings.languageTitle")}
170
- </CardTitle>
171
- <CardDescription>{t("settings.languageDescription")}</CardDescription>
172
- </CardHeader>
173
- <CardContent className="max-w-xs space-y-1.5">
174
- <Label>{t("settings.languageLabel")}</Label>
175
- <LanguagePicker label={t("settings.languageLabel")} />
176
- </CardContent>
177
- </Card>
178
-
179
- <Card>
180
- <CardHeader>
181
- <CardTitle className="text-lg">{t("settings.agentTitle")}</CardTitle>
182
- <CardDescription>{t("settings.agentDescription")}</CardDescription>
183
- </CardHeader>
184
- <CardContent>
185
- <Button variant="outline" onClick={() => openAgentSettings()}>
186
- {t("settings.openAgentSettings")}
187
- </Button>
188
- </CardContent>
189
- </Card>
182
+ <Card>
183
+ <CardHeader>
184
+ <CardTitle className="text-lg">
185
+ {t("settings.agentTitle")}
186
+ </CardTitle>
187
+ <CardDescription>
188
+ {t("settings.agentDescription")}
189
+ </CardDescription>
190
+ </CardHeader>
191
+ <CardContent>
192
+ <Button variant="outline" onClick={() => openAgentSettings()}>
193
+ {t("settings.openAgentSettings")}
194
+ </Button>
195
+ </CardContent>
196
+ </Card>
190
197
 
191
- {/* Google Calendar Connection */}
192
- <Card>
193
- <CardHeader>
194
- <CardTitle className="text-lg">
195
- {t("settings.googleCalendar")}
196
- </CardTitle>
197
- <CardDescription>{t("settings.googleDescription")}</CardDescription>
198
- </CardHeader>
199
- <CardContent>
200
- <div className="flex items-center justify-between">
201
- <div className="flex items-center gap-3">
202
- {googleStatus.data?.connected ? (
203
- <>
204
- <IconCircleCheck className="h-5 w-5 text-emerald-600 dark:text-emerald-400" />
205
- <div>
206
- <p className="text-sm font-medium">
207
- {t("common.connected")}
208
- </p>
209
- {googleStatus.data.accounts?.length > 0 && (
210
- <p className="text-xs text-muted-foreground">
211
- {googleStatus.data.accounts
212
- .map((a) => a.email)
213
- .join(", ")}
198
+ {/* Google Calendar Connection */}
199
+ <Card>
200
+ <CardHeader>
201
+ <CardTitle className="text-lg">
202
+ {t("settings.googleCalendar")}
203
+ </CardTitle>
204
+ <CardDescription>
205
+ {t("settings.googleDescription")}
206
+ </CardDescription>
207
+ </CardHeader>
208
+ <CardContent>
209
+ <div className="flex items-center justify-between">
210
+ <div className="flex items-center gap-3">
211
+ {googleStatus.data?.connected ? (
212
+ <>
213
+ <IconCircleCheck className="h-5 w-5 text-emerald-600 dark:text-emerald-400" />
214
+ <div>
215
+ <p className="text-sm font-medium">
216
+ {t("common.connected")}
217
+ </p>
218
+ {googleStatus.data.accounts?.length > 0 && (
219
+ <p className="text-xs text-muted-foreground">
220
+ {googleStatus.data.accounts
221
+ .map((a) => a.email)
222
+ .join(", ")}
223
+ </p>
224
+ )}
225
+ </div>
226
+ </>
227
+ ) : (
228
+ <>
229
+ <IconCircleX className="h-5 w-5 text-muted-foreground" />
230
+ <p className="text-sm text-muted-foreground">
231
+ {t("common.notConnected")}
214
232
  </p>
215
- )}
216
- </div>
217
- </>
218
- ) : (
219
- <>
220
- <IconCircleX className="h-5 w-5 text-muted-foreground" />
221
- <p className="text-sm text-muted-foreground">
222
- {t("common.notConnected")}
223
- </p>
224
- </>
225
- )}
226
- </div>
233
+ </>
234
+ )}
235
+ </div>
227
236
 
228
- {googleStatus.data?.connected ? (
229
- <Button
230
- variant="outline"
231
- size="sm"
232
- onClick={handleDisconnect}
233
- disabled={disconnectGoogle.isPending}
234
- >
235
- <IconUnlink className="me-1.5 h-3.5 w-3.5" />
236
- {t("common.disconnect")}
237
- </Button>
238
- ) : (
239
- <Button
240
- size="sm"
241
- onClick={handleConnect}
242
- disabled={
243
- authUrl.isLoading ||
244
- authUrl.isFetching ||
245
- isGoogleDesktopAuthPending
246
- }
247
- >
248
- <IconExternalLink className="me-1.5 h-3.5 w-3.5" />
249
- {t("common.connect")}
250
- </Button>
251
- )}
252
- </div>
253
- </CardContent>
254
- </Card>
237
+ {googleStatus.data?.connected ? (
238
+ <Button
239
+ variant="outline"
240
+ size="sm"
241
+ onClick={handleDisconnect}
242
+ disabled={disconnectGoogle.isPending}
243
+ >
244
+ <IconUnlink className="me-1.5 h-3.5 w-3.5" />
245
+ {t("common.disconnect")}
246
+ </Button>
247
+ ) : (
248
+ <Button
249
+ size="sm"
250
+ onClick={handleConnect}
251
+ disabled={
252
+ authUrl.isLoading ||
253
+ authUrl.isFetching ||
254
+ isGoogleDesktopAuthPending
255
+ }
256
+ >
257
+ <IconExternalLink className="me-1.5 h-3.5 w-3.5" />
258
+ {t("common.connect")}
259
+ </Button>
260
+ )}
261
+ </div>
262
+ </CardContent>
263
+ </Card>
255
264
 
256
- <Card>
257
- <CardHeader>
258
- <CardTitle className="text-lg">Zoom</CardTitle>
259
- <CardDescription>{t("settings.zoomDescription")}</CardDescription>
260
- </CardHeader>
261
- <CardContent>
262
- <div className="flex items-center justify-between gap-4">
263
- <div className="flex min-w-0 items-center gap-3">
264
- {zoomStatus.data?.connected ? (
265
- <>
266
- <IconCircleCheck className="h-5 w-5 shrink-0 text-emerald-600 dark:text-emerald-400" />
267
- <div className="min-w-0">
268
- <p className="text-sm font-medium">
269
- {t("common.connected")}
270
- </p>
271
- {zoomStatus.data.accounts?.length > 0 && (
272
- <p className="truncate text-xs text-muted-foreground">
273
- {zoomStatus.data.accounts
274
- .map((a) => a.email || a.displayName || a.id)
275
- .join(", ")}
276
- </p>
277
- )}
278
- </div>
279
- </>
280
- ) : (
281
- <>
282
- <IconCircleX className="h-5 w-5 shrink-0 text-muted-foreground" />
283
- <div className="min-w-0">
284
- <p className="text-sm text-muted-foreground">
285
- {zoomStatus.data?.configured === false
286
- ? t("settings.zoomNotConfigured")
287
- : t("common.notConnected")}
288
- </p>
289
- {zoomStatus.data?.configured === false && (
290
- <p className="text-xs text-muted-foreground">
291
- {t("settings.zoomCredentialsPrompt")}
292
- </p>
293
- )}
294
- </div>
295
- </>
296
- )}
297
- </div>
265
+ <Card>
266
+ <CardHeader>
267
+ <CardTitle className="text-lg">Zoom</CardTitle>
268
+ <CardDescription>{t("settings.zoomDescription")}</CardDescription>
269
+ </CardHeader>
270
+ <CardContent>
271
+ <div className="flex items-center justify-between gap-4">
272
+ <div className="flex min-w-0 items-center gap-3">
273
+ {zoomStatus.data?.connected ? (
274
+ <>
275
+ <IconCircleCheck className="h-5 w-5 shrink-0 text-emerald-600 dark:text-emerald-400" />
276
+ <div className="min-w-0">
277
+ <p className="text-sm font-medium">
278
+ {t("common.connected")}
279
+ </p>
280
+ {zoomStatus.data.accounts?.length > 0 && (
281
+ <p className="truncate text-xs text-muted-foreground">
282
+ {zoomStatus.data.accounts
283
+ .map((a) => a.email || a.displayName || a.id)
284
+ .join(", ")}
285
+ </p>
286
+ )}
287
+ </div>
288
+ </>
289
+ ) : (
290
+ <>
291
+ <IconCircleX className="h-5 w-5 shrink-0 text-muted-foreground" />
292
+ <div className="min-w-0">
293
+ <p className="text-sm text-muted-foreground">
294
+ {zoomStatus.data?.configured === false
295
+ ? t("settings.zoomNotConfigured")
296
+ : t("common.notConnected")}
297
+ </p>
298
+ {zoomStatus.data?.configured === false && (
299
+ <p className="text-xs text-muted-foreground">
300
+ {t("settings.zoomCredentialsPrompt")}
301
+ </p>
302
+ )}
303
+ </div>
304
+ </>
305
+ )}
306
+ </div>
298
307
 
299
- {zoomStatus.data?.connected ? (
300
- <Button
301
- variant="outline"
302
- size="sm"
303
- onClick={handleDisconnectZoom}
304
- disabled={disconnectZoom.isPending}
305
- >
306
- <IconUnlink className="me-1.5 h-3.5 w-3.5" />
307
- {t("common.disconnect")}
308
- </Button>
309
- ) : (
310
- <Button
311
- size="sm"
312
- onClick={handleConnectZoom}
313
- disabled={
314
- connectZoom.isPending || zoomStatus.data?.configured === false
315
- }
316
- >
317
- <IconBrandZoom className="me-1.5 h-3.5 w-3.5" />
318
- {t("common.connect")}
319
- </Button>
320
- )}
321
- </div>
322
- </CardContent>
323
- </Card>
308
+ {zoomStatus.data?.connected ? (
309
+ <Button
310
+ variant="outline"
311
+ size="sm"
312
+ onClick={handleDisconnectZoom}
313
+ disabled={disconnectZoom.isPending}
314
+ >
315
+ <IconUnlink className="me-1.5 h-3.5 w-3.5" />
316
+ {t("common.disconnect")}
317
+ </Button>
318
+ ) : (
319
+ <Button
320
+ size="sm"
321
+ onClick={handleConnectZoom}
322
+ disabled={
323
+ connectZoom.isPending ||
324
+ zoomStatus.data?.configured === false
325
+ }
326
+ >
327
+ <IconBrandZoom className="me-1.5 h-3.5 w-3.5" />
328
+ {t("common.connect")}
329
+ </Button>
330
+ )}
331
+ </div>
332
+ </CardContent>
333
+ </Card>
324
334
 
325
- {/* Google Setup Wizard */}
326
- {!googleStatus.data?.connected && (
327
- <Card>
328
- <CardHeader>
329
- <CardTitle className="text-lg">
330
- {t("settings.connectGoogleCalendar")}
331
- </CardTitle>
332
- <CardDescription>
333
- {t("settings.connectGoogleDescription")}
334
- </CardDescription>
335
- </CardHeader>
336
- <CardContent>
337
- <GoogleSetupWizard />
338
- </CardContent>
339
- </Card>
340
- )}
335
+ {/* Google Setup Wizard */}
336
+ {!googleStatus.data?.connected && (
337
+ <Card>
338
+ <CardHeader>
339
+ <CardTitle className="text-lg">
340
+ {t("settings.connectGoogleCalendar")}
341
+ </CardTitle>
342
+ <CardDescription>
343
+ {t("settings.connectGoogleDescription")}
344
+ </CardDescription>
345
+ </CardHeader>
346
+ <CardContent>
347
+ <GoogleSetupWizard />
348
+ </CardContent>
349
+ </Card>
350
+ )}
341
351
 
342
- <Separator />
352
+ <Separator />
343
353
 
344
- {/* General Settings */}
345
- <Card>
346
- <CardHeader>
347
- <CardTitle className="text-lg">{t("settings.general")}</CardTitle>
348
- <CardDescription>{t("settings.generalDescription")}</CardDescription>
349
- </CardHeader>
350
- <CardContent className="space-y-4">
351
- <div className="space-y-2">
352
- <Label htmlFor="timezone">{t("settings.timezone")}</Label>
353
- <TimezoneCombobox value={timezone} onChange={setTimezone} />
354
- </div>
354
+ {/* General Settings */}
355
+ <Card>
356
+ <CardHeader>
357
+ <CardTitle className="text-lg">{t("settings.general")}</CardTitle>
358
+ <CardDescription>
359
+ {t("settings.generalDescription")}
360
+ </CardDescription>
361
+ </CardHeader>
362
+ <CardContent className="space-y-4">
363
+ <div className="space-y-2">
364
+ <Label htmlFor="timezone">{t("settings.timezone")}</Label>
365
+ <TimezoneCombobox value={timezone} onChange={setTimezone} />
366
+ </div>
355
367
 
356
- <div className="space-y-2">
357
- <Label htmlFor="booking-title">
358
- {t("settings.bookingTitleLabel")}
359
- </Label>
360
- <Input
361
- id="booking-title"
362
- value={bookingTitle}
363
- onChange={(e) => setBookingTitle(e.target.value)}
364
- placeholder={t("settings.bookingTitlePlaceholder")}
365
- />
366
- <p className="text-xs text-muted-foreground">
367
- {t("settings.bookingTitleHelp")}
368
- </p>
369
- </div>
368
+ <div className="space-y-2">
369
+ <Label htmlFor="booking-title">
370
+ {t("settings.bookingTitleLabel")}
371
+ </Label>
372
+ <Input
373
+ id="booking-title"
374
+ value={bookingTitle}
375
+ onChange={(e) => setBookingTitle(e.target.value)}
376
+ placeholder={t("settings.bookingTitlePlaceholder")}
377
+ />
378
+ <p className="text-xs text-muted-foreground">
379
+ {t("settings.bookingTitleHelp")}
380
+ </p>
381
+ </div>
370
382
 
371
- <div className="space-y-2">
372
- <Label htmlFor="booking-desc">
373
- {t("settings.bookingDescriptionLabel")}
374
- </Label>
375
- <Textarea
376
- id="booking-desc"
377
- value={bookingDescription}
378
- onChange={(e) => setBookingDescription(e.target.value)}
379
- placeholder={t("settings.bookingDescriptionPlaceholder")}
380
- rows={2}
381
- />
382
- <p className="text-xs text-muted-foreground">
383
- {t("settings.bookingDescriptionHelp")}
384
- </p>
385
- </div>
383
+ <div className="space-y-2">
384
+ <Label htmlFor="booking-desc">
385
+ {t("settings.bookingDescriptionLabel")}
386
+ </Label>
387
+ <Textarea
388
+ id="booking-desc"
389
+ value={bookingDescription}
390
+ onChange={(e) => setBookingDescription(e.target.value)}
391
+ placeholder={t("settings.bookingDescriptionPlaceholder")}
392
+ rows={2}
393
+ />
394
+ <p className="text-xs text-muted-foreground">
395
+ {t("settings.bookingDescriptionHelp")}
396
+ </p>
397
+ </div>
386
398
 
387
- <div className="space-y-2">
388
- <Label htmlFor="default-duration">
389
- {t("settings.defaultDurationLabel")}
390
- </Label>
391
- <Input
392
- id="default-duration"
393
- type="number"
394
- value={defaultDuration}
395
- onChange={(e) => setDefaultDuration(Number(e.target.value))}
396
- min={5}
397
- max={480}
398
- />
399
- <p className="text-xs text-muted-foreground">
400
- {t("settings.defaultDurationHelp")}
401
- </p>
402
- </div>
399
+ <div className="space-y-2">
400
+ <Label htmlFor="default-duration">
401
+ {t("settings.defaultDurationLabel")}
402
+ </Label>
403
+ <Input
404
+ id="default-duration"
405
+ type="number"
406
+ value={defaultDuration}
407
+ onChange={(e) => setDefaultDuration(Number(e.target.value))}
408
+ min={5}
409
+ max={480}
410
+ />
411
+ <p className="text-xs text-muted-foreground">
412
+ {t("settings.defaultDurationHelp")}
413
+ </p>
414
+ </div>
403
415
 
404
- <div className="flex flex-wrap gap-2">
405
- <Button onClick={handleSave} disabled={updateSettings.isPending}>
406
- {updateSettings.isPending
407
- ? t("common.saving")
408
- : t("settings.saveSettings")}
409
- </Button>
410
- <Button asChild variant="outline">
411
- <Link to="/booking-links">
412
- <IconLink className="me-1.5 h-3.5 w-3.5" />
413
- {t("navigation.bookingLinks")}
414
- </Link>
415
- </Button>
416
- </div>
417
- </CardContent>
418
- </Card>
416
+ <div className="flex flex-wrap gap-2">
417
+ <Button
418
+ onClick={handleSave}
419
+ disabled={updateSettings.isPending}
420
+ >
421
+ {updateSettings.isPending
422
+ ? t("common.saving")
423
+ : t("settings.saveSettings")}
424
+ </Button>
425
+ <Button asChild variant="outline">
426
+ <Link to="/booking-links">
427
+ <IconLink className="me-1.5 h-3.5 w-3.5" />
428
+ {t("navigation.bookingLinks")}
429
+ </Link>
430
+ </Button>
431
+ </div>
432
+ </CardContent>
433
+ </Card>
419
434
 
420
- {/* Appearance */}
421
- <Card>
422
- <CardHeader>
423
- <CardTitle className="text-lg">{t("settings.appearance")}</CardTitle>
424
- <CardDescription>
425
- {t("settings.appearanceDescription")}
426
- </CardDescription>
427
- </CardHeader>
428
- <CardContent>
429
- <AppearancePicker
430
- onChange={(preset: AppearancePresetId) => {
431
- // Persist server-side so the choice survives reload and syncs
432
- // across devices; the local UI has already updated optimistically.
433
- callAction("change-appearance" as any, { preset } as any).catch(
434
- () => {
435
- // Server write failed; the local DOM change still stands.
436
- },
437
- );
438
- }}
435
+ {/* Appearance */}
436
+ <Card>
437
+ <CardHeader>
438
+ <CardTitle className="text-lg">
439
+ {t("settings.appearance")}
440
+ </CardTitle>
441
+ <CardDescription>
442
+ {t("settings.appearanceDescription")}
443
+ </CardDescription>
444
+ </CardHeader>
445
+ <CardContent>
446
+ <AppearancePicker
447
+ onChange={(preset: AppearancePresetId) => {
448
+ // Persist server-side so the choice survives reload and syncs
449
+ // across devices; the local UI has already updated optimistically.
450
+ callAction(
451
+ "change-appearance" as any,
452
+ { preset } as any,
453
+ ).catch(() => {
454
+ // Server write failed; the local DOM change still stands.
455
+ });
456
+ }}
457
+ />
458
+ </CardContent>
459
+ </Card>
460
+ </div>
461
+ }
462
+ team={
463
+ <div className="mx-auto w-full max-w-2xl">
464
+ <TeamPage
465
+ showTitle={false}
466
+ createOrgDescription="Set up a team to share calendars and booking links with your colleagues."
439
467
  />
440
- </CardContent>
441
- </Card>
442
- </div>
468
+ </div>
469
+ }
470
+ whatsNew={
471
+ <div className="mx-auto w-full max-w-2xl">
472
+ <ChangelogSettingsCard markdown={changelog} />
473
+ </div>
474
+ }
475
+ />
443
476
  );
444
477
  }
@@ -1,26 +1,11 @@
1
- import { useT } from "@agent-native/core/client";
2
- import { useMemo } from "react";
1
+ import { Navigate } from "react-router";
3
2
 
4
- import { useAppHeaderControls } from "@/components/layout/AppLayout";
5
3
  import { messagesByLocale } from "@/i18n-data";
6
- import Team from "@/pages/Team";
7
4
 
8
5
  export function meta() {
9
6
  return [{ title: messagesByLocale["en-US"].routeTitles.team }];
10
7
  }
11
8
 
12
9
  export default function TeamRoute() {
13
- const t = useT();
14
- const controls = useMemo(
15
- () => ({
16
- left: (
17
- <h1 className="text-lg font-semibold tracking-tight truncate">
18
- {t("navigation.team")}
19
- </h1>
20
- ),
21
- }),
22
- [t],
23
- );
24
- useAppHeaderControls(controls);
25
- return <Team />;
10
+ return <Navigate to="/settings#team" replace />;
26
11
  }