@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
@@ -1,11 +1,13 @@
1
1
  import {
2
2
  ChangelogSettingsCard,
3
3
  LanguagePicker,
4
+ SettingsTabsPage,
4
5
  openAgentSettings,
5
6
  useActionMutation,
6
7
  useActionQuery,
7
8
  useT,
8
9
  } from "@agent-native/core/client";
10
+ import { TeamPage } from "@agent-native/core/client/org";
9
11
  import {
10
12
  IconAdjustments,
11
13
  IconBuilding,
@@ -140,382 +142,412 @@ export default function SettingsRoute() {
140
142
  }
141
143
  />
142
144
 
143
- <div className="grid gap-5 p-4 sm:p-5 lg:grid-cols-[minmax(0,1fr)_360px] lg:p-7">
144
- <main className="grid gap-5">
145
- <ChangelogSettingsCard markdown={changelog} />
145
+ <SettingsTabsPage
146
+ teamLabel={t("team.title")}
147
+ general={
148
+ <div className="grid gap-5 lg:grid-cols-[minmax(0,1fr)_360px]">
149
+ <main className="grid gap-5">
150
+ <Card>
151
+ <CardHeader>
152
+ <CardTitle className="flex items-center gap-2 text-base">
153
+ <IconBuilding className="size-4 text-primary" />
154
+ {t("settings.identityTitle")}
155
+ </CardTitle>
156
+ <CardDescription>
157
+ {t("settings.identityDescription")}
158
+ </CardDescription>
159
+ </CardHeader>
160
+ <CardContent className="grid gap-5 md:grid-cols-2">
161
+ <TextField
162
+ id="company-name"
163
+ label={t("settings.companyName")}
164
+ value={settings.companyName ?? ""}
165
+ placeholder="Acme"
166
+ onChange={(value) => update("companyName", value)}
167
+ />
168
+ <TextField
169
+ id="assistant-name"
170
+ label={t("settings.assistantName")}
171
+ value={settings.assistantName ?? ""}
172
+ placeholder="Brain"
173
+ onChange={(value) => update("assistantName", value)}
174
+ />
175
+ </CardContent>
176
+ </Card>
146
177
 
147
- <Card>
148
- <CardHeader>
149
- <CardTitle className="flex items-center gap-2 text-base">
150
- <IconBuilding className="size-4 text-primary" />
151
- {t("settings.identityTitle")}
152
- </CardTitle>
153
- <CardDescription>
154
- {t("settings.identityDescription")}
155
- </CardDescription>
156
- </CardHeader>
157
- <CardContent className="grid gap-5 md:grid-cols-2">
158
- <TextField
159
- id="company-name"
160
- label={t("settings.companyName")}
161
- value={settings.companyName ?? ""}
162
- placeholder="Acme"
163
- onChange={(value) => update("companyName", value)}
164
- />
165
- <TextField
166
- id="assistant-name"
167
- label={t("settings.assistantName")}
168
- value={settings.assistantName ?? ""}
169
- placeholder="Brain"
170
- onChange={(value) => update("assistantName", value)}
171
- />
172
- </CardContent>
173
- </Card>
174
-
175
- <Card>
176
- <CardHeader>
177
- <CardTitle className="flex items-center gap-2 text-base">
178
- <IconMessageCircle className="size-4 text-primary" />
179
- {t("settings.assistantBehaviorTitle")}
180
- </CardTitle>
181
- <CardDescription>
182
- {t("settings.assistantBehaviorDescription")}
183
- </CardDescription>
184
- </CardHeader>
185
- <CardContent className="grid gap-6">
186
- <div className="grid gap-5 md:grid-cols-2">
187
- <SelectField
188
- id="assistant-tone"
189
- label={t("settings.toneLabel")}
190
- value={(settings.assistantTone ?? "direct") as ToneValue}
191
- options={localizedToneOptions}
192
- onChange={(value) => update("assistantTone", value)}
193
- />
194
- <SelectField
195
- id="source-policy"
196
- label={t("settings.sourcePolicyLabel")}
197
- value={
198
- (settings.sourcePolicy ?? "balanced") as SourcePolicyValue
199
- }
200
- options={localizedSourcePolicyOptions}
201
- onChange={(value) => update("sourcePolicy", value)}
202
- />
203
- </div>
204
- <div className="grid gap-5 md:grid-cols-2">
205
- <p className="rounded-md border border-border bg-muted/30 p-3 text-xs leading-5 text-muted-foreground">
206
- {toneDescription}
207
- </p>
208
- <p className="rounded-md border border-border bg-muted/30 p-3 text-xs leading-5 text-muted-foreground">
209
- {sourcePolicyDescription}
210
- </p>
211
- </div>
212
- <Separator />
213
- <div className="grid gap-2">
214
- <Label htmlFor="distillation-instructions">
215
- {t("settings.coreInstructions")}
216
- </Label>
217
- <Textarea
218
- id="distillation-instructions"
219
- value={settings.distillationInstructions ?? ""}
220
- onChange={(event) =>
221
- update("distillationInstructions", event.target.value)
222
- }
223
- className="min-h-36 resize-y leading-6"
224
- />
225
- <p className="text-xs leading-5 text-muted-foreground">
226
- {t("settings.coreInstructionsDescription")}
227
- </p>
228
- </div>
229
- </CardContent>
230
- </Card>
231
-
232
- <Card>
233
- <CardHeader>
234
- <CardTitle className="flex items-center gap-2 text-base">
235
- <IconAdjustments className="size-4 text-primary" />
236
- {t("settings.publishingReviewTitle")}
237
- </CardTitle>
238
- <CardDescription>
239
- {t("settings.publishingReviewDescription")}
240
- </CardDescription>
241
- </CardHeader>
242
- <CardContent className="grid gap-6">
243
- <div className="grid gap-5 md:grid-cols-2">
244
- <div className="grid gap-2">
245
- <Label htmlFor="publish-tier">
246
- {t("settings.defaultPublishTier")}
247
- </Label>
248
- <Select
249
- value={settings.defaultPublishTier}
250
- onValueChange={(value) =>
251
- update(
252
- "defaultPublishTier",
253
- value as BrainSettings["defaultPublishTier"],
254
- )
255
- }
256
- >
257
- <SelectTrigger id="publish-tier">
258
- <SelectValue />
259
- </SelectTrigger>
260
- <SelectContent>
261
- <SelectGroup>
262
- <SelectItem value="private">
263
- {t("settings.publishTier.private")}
264
- </SelectItem>
265
- <SelectItem value="team">
266
- {t("settings.publishTier.team")}
267
- </SelectItem>
268
- <SelectItem value="company">
269
- {t("settings.publishTier.company")}
270
- </SelectItem>
271
- </SelectGroup>
272
- </SelectContent>
273
- </Select>
274
- <p className="text-xs leading-5 text-muted-foreground">
275
- {t("settings.defaultPublishTierDescription")}
276
- </p>
277
- </div>
278
-
279
- <NumberField
280
- id="connector-poll-minutes"
281
- label={t("settings.connectorPollInterval")}
282
- value={settings.connectorPollMinutes ?? 60}
283
- min={5}
284
- max={1440}
285
- suffix="min"
286
- t={t}
287
- onChange={(value) => update("connectorPollMinutes", value)}
288
- />
289
- </div>
290
-
291
- <Separator />
292
-
293
- <div className="grid gap-4">
294
- <SettingSwitch
295
- label={t("settings.requireApproval")}
296
- description={t("settings.requireApprovalDescription")}
297
- checked={Boolean(settings.requireApprovalForCompanyKnowledge)}
298
- onChange={(checked) =>
299
- update("requireApprovalForCompanyKnowledge", checked)
300
- }
301
- />
302
- <SettingSwitch
303
- label={t("settings.autoArchiveResolved")}
304
- description={t("settings.autoArchiveResolvedDescription")}
305
- checked={Boolean(settings.autoArchiveResolved)}
306
- onChange={(checked) => update("autoArchiveResolved", checked)}
307
- />
308
- </div>
309
- </CardContent>
310
- </Card>
311
-
312
- <Card>
313
- <CardHeader>
314
- <CardTitle className="flex items-center gap-2 text-base">
315
- <IconShieldCheck className="size-4 text-primary" />
316
- {t("settings.safetyEvidenceTitle")}
317
- </CardTitle>
318
- <CardDescription>
319
- {t("settings.safetyEvidenceDescription")}
320
- </CardDescription>
321
- </CardHeader>
322
- <CardContent className="grid gap-4">
323
- <SettingSwitch
324
- label={t("settings.sanitizeCaptures")}
325
- description={t("settings.sanitizeCapturesDescription")}
326
- checked={settings.captureSanitizationEnabled !== false}
327
- onChange={(checked) =>
328
- update("captureSanitizationEnabled", checked)
329
- }
330
- />
331
- {settings.captureSanitizationEnabled !== false ? (
332
- <div className="grid gap-4 rounded-md border border-border p-4">
333
- <div className="grid gap-2">
334
- <Label htmlFor="capture-sanitization-model">
335
- {t("settings.sanitizationModel")}
336
- </Label>
337
- <Input
338
- id="capture-sanitization-model"
339
- value={settings.captureSanitizationModel ?? ""}
340
- placeholder={t("settings.sanitizationModelPlaceholder")}
341
- onChange={(event) =>
342
- update("captureSanitizationModel", event.target.value)
178
+ <Card>
179
+ <CardHeader>
180
+ <CardTitle className="flex items-center gap-2 text-base">
181
+ <IconMessageCircle className="size-4 text-primary" />
182
+ {t("settings.assistantBehaviorTitle")}
183
+ </CardTitle>
184
+ <CardDescription>
185
+ {t("settings.assistantBehaviorDescription")}
186
+ </CardDescription>
187
+ </CardHeader>
188
+ <CardContent className="grid gap-6">
189
+ <div className="grid gap-5 md:grid-cols-2">
190
+ <SelectField
191
+ id="assistant-tone"
192
+ label={t("settings.toneLabel")}
193
+ value={(settings.assistantTone ?? "direct") as ToneValue}
194
+ options={localizedToneOptions}
195
+ onChange={(value) => update("assistantTone", value)}
196
+ />
197
+ <SelectField
198
+ id="source-policy"
199
+ label={t("settings.sourcePolicyLabel")}
200
+ value={
201
+ (settings.sourcePolicy ??
202
+ "balanced") as SourcePolicyValue
343
203
  }
204
+ options={localizedSourcePolicyOptions}
205
+ onChange={(value) => update("sourcePolicy", value)}
344
206
  />
345
- <p className="text-xs leading-5 text-muted-foreground">
346
- {t("settings.sanitizationModelDescription")}
207
+ </div>
208
+ <div className="grid gap-5 md:grid-cols-2">
209
+ <p className="rounded-md border border-border bg-muted/30 p-3 text-xs leading-5 text-muted-foreground">
210
+ {toneDescription}
211
+ </p>
212
+ <p className="rounded-md border border-border bg-muted/30 p-3 text-xs leading-5 text-muted-foreground">
213
+ {sourcePolicyDescription}
347
214
  </p>
348
215
  </div>
216
+ <Separator />
349
217
  <div className="grid gap-2">
350
- <Label htmlFor="capture-sanitization-instructions">
351
- {t("settings.sanitizationInstructions")}
218
+ <Label htmlFor="distillation-instructions">
219
+ {t("settings.coreInstructions")}
352
220
  </Label>
353
221
  <Textarea
354
- id="capture-sanitization-instructions"
355
- value={settings.captureSanitizationInstructions ?? ""}
222
+ id="distillation-instructions"
223
+ value={settings.distillationInstructions ?? ""}
356
224
  onChange={(event) =>
357
- update(
358
- "captureSanitizationInstructions",
359
- event.target.value,
360
- )
225
+ update("distillationInstructions", event.target.value)
361
226
  }
362
- className="min-h-24 resize-y leading-6"
227
+ className="min-h-36 resize-y leading-6"
363
228
  />
229
+ <p className="text-xs leading-5 text-muted-foreground">
230
+ {t("settings.coreInstructionsDescription")}
231
+ </p>
364
232
  </div>
365
- </div>
366
- ) : null}
367
- <SettingSwitch
368
- label={t("settings.autoRedactEmails")}
369
- description={t("settings.autoRedactEmailsDescription")}
370
- checked={Boolean(settings.autoRedactEmails)}
371
- onChange={(checked) => update("autoRedactEmails", checked)}
372
- />
373
- <SettingSwitch
374
- label={t("settings.requireCitations")}
375
- description={t("settings.requireCitationsDescription")}
376
- checked={Boolean(settings.requireCitations)}
377
- onChange={(checked) => update("requireCitations", checked)}
378
- />
379
- <SettingSwitch
380
- label={t("settings.notifySourceErrors")}
381
- description={t("settings.notifySourceErrorsDescription")}
382
- checked={Boolean(settings.notifyOnSourceErrors)}
383
- onChange={(checked) => update("notifyOnSourceErrors", checked)}
384
- />
385
- </CardContent>
386
- </Card>
387
- </main>
233
+ </CardContent>
234
+ </Card>
388
235
 
389
- <aside className="grid content-start gap-5">
390
- <Card>
391
- <CardHeader>
392
- <CardTitle className="flex items-center gap-2 text-base">
393
- <IconAdjustments className="size-4 text-primary" />
394
- {t("settings.languageTitle")}
395
- </CardTitle>
396
- <CardDescription>
397
- {t("settings.languageDescription")}
398
- </CardDescription>
399
- </CardHeader>
400
- <CardContent className="space-y-1.5">
401
- <Label>{t("settings.languageLabel")}</Label>
402
- <LanguagePicker label={t("settings.languageLabel")} />
403
- </CardContent>
404
- </Card>
236
+ <Card>
237
+ <CardHeader>
238
+ <CardTitle className="flex items-center gap-2 text-base">
239
+ <IconAdjustments className="size-4 text-primary" />
240
+ {t("settings.publishingReviewTitle")}
241
+ </CardTitle>
242
+ <CardDescription>
243
+ {t("settings.publishingReviewDescription")}
244
+ </CardDescription>
245
+ </CardHeader>
246
+ <CardContent className="grid gap-6">
247
+ <div className="grid gap-5 md:grid-cols-2">
248
+ <div className="grid gap-2">
249
+ <Label htmlFor="publish-tier">
250
+ {t("settings.defaultPublishTier")}
251
+ </Label>
252
+ <Select
253
+ value={settings.defaultPublishTier}
254
+ onValueChange={(value) =>
255
+ update(
256
+ "defaultPublishTier",
257
+ value as BrainSettings["defaultPublishTier"],
258
+ )
259
+ }
260
+ >
261
+ <SelectTrigger id="publish-tier">
262
+ <SelectValue />
263
+ </SelectTrigger>
264
+ <SelectContent>
265
+ <SelectGroup>
266
+ <SelectItem value="private">
267
+ {t("settings.publishTier.private")}
268
+ </SelectItem>
269
+ <SelectItem value="team">
270
+ {t("settings.publishTier.team")}
271
+ </SelectItem>
272
+ <SelectItem value="company">
273
+ {t("settings.publishTier.company")}
274
+ </SelectItem>
275
+ </SelectGroup>
276
+ </SelectContent>
277
+ </Select>
278
+ <p className="text-xs leading-5 text-muted-foreground">
279
+ {t("settings.defaultPublishTierDescription")}
280
+ </p>
281
+ </div>
405
282
 
406
- <Card>
407
- <CardHeader>
408
- <CardTitle className="flex items-center gap-2 text-base">
409
- <IconAdjustments className="size-4 text-primary" />
410
- {t("settings.agentTitle")}
411
- </CardTitle>
412
- <CardDescription>
413
- {t("settings.agentDescription")}
414
- </CardDescription>
415
- </CardHeader>
416
- <CardContent>
417
- <Button variant="outline" onClick={() => openAgentSettings()}>
418
- {t("settings.openAgentSettings")}
419
- </Button>
420
- </CardContent>
421
- </Card>
283
+ <NumberField
284
+ id="connector-poll-minutes"
285
+ label={t("settings.connectorPollInterval")}
286
+ value={settings.connectorPollMinutes ?? 60}
287
+ min={5}
288
+ max={1440}
289
+ suffix="min"
290
+ t={t}
291
+ onChange={(value) =>
292
+ update("connectorPollMinutes", value)
293
+ }
294
+ />
295
+ </div>
296
+
297
+ <Separator />
298
+
299
+ <div className="grid gap-4">
300
+ <SettingSwitch
301
+ label={t("settings.requireApproval")}
302
+ description={t("settings.requireApprovalDescription")}
303
+ checked={Boolean(
304
+ settings.requireApprovalForCompanyKnowledge,
305
+ )}
306
+ onChange={(checked) =>
307
+ update("requireApprovalForCompanyKnowledge", checked)
308
+ }
309
+ />
310
+ <SettingSwitch
311
+ label={t("settings.autoArchiveResolved")}
312
+ description={t("settings.autoArchiveResolvedDescription")}
313
+ checked={Boolean(settings.autoArchiveResolved)}
314
+ onChange={(checked) =>
315
+ update("autoArchiveResolved", checked)
316
+ }
317
+ />
318
+ </div>
319
+ </CardContent>
320
+ </Card>
321
+
322
+ <Card>
323
+ <CardHeader>
324
+ <CardTitle className="flex items-center gap-2 text-base">
325
+ <IconShieldCheck className="size-4 text-primary" />
326
+ {t("settings.safetyEvidenceTitle")}
327
+ </CardTitle>
328
+ <CardDescription>
329
+ {t("settings.safetyEvidenceDescription")}
330
+ </CardDescription>
331
+ </CardHeader>
332
+ <CardContent className="grid gap-4">
333
+ <SettingSwitch
334
+ label={t("settings.sanitizeCaptures")}
335
+ description={t("settings.sanitizeCapturesDescription")}
336
+ checked={settings.captureSanitizationEnabled !== false}
337
+ onChange={(checked) =>
338
+ update("captureSanitizationEnabled", checked)
339
+ }
340
+ />
341
+ {settings.captureSanitizationEnabled !== false ? (
342
+ <div className="grid gap-4 rounded-md border border-border p-4">
343
+ <div className="grid gap-2">
344
+ <Label htmlFor="capture-sanitization-model">
345
+ {t("settings.sanitizationModel")}
346
+ </Label>
347
+ <Input
348
+ id="capture-sanitization-model"
349
+ value={settings.captureSanitizationModel ?? ""}
350
+ placeholder={t(
351
+ "settings.sanitizationModelPlaceholder",
352
+ )}
353
+ onChange={(event) =>
354
+ update(
355
+ "captureSanitizationModel",
356
+ event.target.value,
357
+ )
358
+ }
359
+ />
360
+ <p className="text-xs leading-5 text-muted-foreground">
361
+ {t("settings.sanitizationModelDescription")}
362
+ </p>
363
+ </div>
364
+ <div className="grid gap-2">
365
+ <Label htmlFor="capture-sanitization-instructions">
366
+ {t("settings.sanitizationInstructions")}
367
+ </Label>
368
+ <Textarea
369
+ id="capture-sanitization-instructions"
370
+ value={settings.captureSanitizationInstructions ?? ""}
371
+ onChange={(event) =>
372
+ update(
373
+ "captureSanitizationInstructions",
374
+ event.target.value,
375
+ )
376
+ }
377
+ className="min-h-24 resize-y leading-6"
378
+ />
379
+ </div>
380
+ </div>
381
+ ) : null}
382
+ <SettingSwitch
383
+ label={t("settings.autoRedactEmails")}
384
+ description={t("settings.autoRedactEmailsDescription")}
385
+ checked={Boolean(settings.autoRedactEmails)}
386
+ onChange={(checked) => update("autoRedactEmails", checked)}
387
+ />
388
+ <SettingSwitch
389
+ label={t("settings.requireCitations")}
390
+ description={t("settings.requireCitationsDescription")}
391
+ checked={Boolean(settings.requireCitations)}
392
+ onChange={(checked) => update("requireCitations", checked)}
393
+ />
394
+ <SettingSwitch
395
+ label={t("settings.notifySourceErrors")}
396
+ description={t("settings.notifySourceErrorsDescription")}
397
+ checked={Boolean(settings.notifyOnSourceErrors)}
398
+ onChange={(checked) =>
399
+ update("notifyOnSourceErrors", checked)
400
+ }
401
+ />
402
+ </CardContent>
403
+ </Card>
404
+ </main>
405
+
406
+ <aside className="grid content-start gap-5">
407
+ <Card>
408
+ <CardHeader>
409
+ <CardTitle className="flex items-center gap-2 text-base">
410
+ <IconAdjustments className="size-4 text-primary" />
411
+ {t("settings.languageTitle")}
412
+ </CardTitle>
413
+ <CardDescription>
414
+ {t("settings.languageDescription")}
415
+ </CardDescription>
416
+ </CardHeader>
417
+ <CardContent className="space-y-1.5">
418
+ <Label>{t("settings.languageLabel")}</Label>
419
+ <LanguagePicker label={t("settings.languageLabel")} />
420
+ </CardContent>
421
+ </Card>
422
+
423
+ <Card>
424
+ <CardHeader>
425
+ <CardTitle className="flex items-center gap-2 text-base">
426
+ <IconAdjustments className="size-4 text-primary" />
427
+ {t("settings.agentTitle")}
428
+ </CardTitle>
429
+ <CardDescription>
430
+ {t("settings.agentDescription")}
431
+ </CardDescription>
432
+ </CardHeader>
433
+ <CardContent>
434
+ <Button variant="outline" onClick={() => openAgentSettings()}>
435
+ {t("settings.openAgentSettings")}
436
+ </Button>
437
+ </CardContent>
438
+ </Card>
422
439
 
423
- <Card>
424
- <CardHeader>
425
- <CardTitle className="flex items-center gap-2 text-base">
426
- <IconFileText className="size-4 text-primary" />
427
- {t("settings.currentPolicy")}
428
- </CardTitle>
429
- <CardDescription>
430
- {t("settings.currentPolicyDescription")}
431
- </CardDescription>
432
- </CardHeader>
433
- <CardContent className="grid gap-3 text-sm">
434
- <PolicyRow
435
- label={t("settings.policy.assistant")}
436
- value={settings.assistantName || "Brain"}
437
- />
438
- <PolicyRow
439
- label={t("settings.policy.company")}
440
- value={settings.companyName || t("settings.notSet")}
441
- />
442
- <PolicyRow
443
- label={t("settings.policy.tone")}
444
- value={t(
445
- `settings.tone.${settings.assistantTone ?? "direct"}.label`,
446
- )}
447
- />
448
- <PolicyRow
449
- label={t("settings.policy.sources")}
450
- value={t(
451
- `settings.sourcePolicy.${settings.sourcePolicy ?? "balanced"}.label`,
452
- )}
453
- />
454
- <PolicyRow
455
- label={t("settings.policy.publishTier")}
456
- value={t(
457
- `settings.publishTier.${settings.defaultPublishTier ?? "team"}`,
458
- )}
459
- />
460
- <PolicyRow
461
- label={t("settings.policy.approval")}
462
- value={
463
- settings.requireApprovalForCompanyKnowledge
464
- ? t("settings.required")
465
- : t("settings.notRequired")
466
- }
467
- />
468
- <PolicyRow
469
- label={t("settings.policy.redaction")}
470
- value={
471
- settings.autoRedactEmails
472
- ? t("settings.enabled")
473
- : t("settings.disabled")
474
- }
475
- />
476
- <PolicyRow
477
- label={t("settings.policy.preSaveFilter")}
478
- value={
479
- settings.captureSanitizationEnabled === false
480
- ? t("settings.disabled")
481
- : t("settings.enabled")
482
- }
483
- />
484
- </CardContent>
485
- </Card>
440
+ <Card>
441
+ <CardHeader>
442
+ <CardTitle className="flex items-center gap-2 text-base">
443
+ <IconFileText className="size-4 text-primary" />
444
+ {t("settings.currentPolicy")}
445
+ </CardTitle>
446
+ <CardDescription>
447
+ {t("settings.currentPolicyDescription")}
448
+ </CardDescription>
449
+ </CardHeader>
450
+ <CardContent className="grid gap-3 text-sm">
451
+ <PolicyRow
452
+ label={t("settings.policy.assistant")}
453
+ value={settings.assistantName || "Brain"}
454
+ />
455
+ <PolicyRow
456
+ label={t("settings.policy.company")}
457
+ value={settings.companyName || t("settings.notSet")}
458
+ />
459
+ <PolicyRow
460
+ label={t("settings.policy.tone")}
461
+ value={t(
462
+ `settings.tone.${settings.assistantTone ?? "direct"}.label`,
463
+ )}
464
+ />
465
+ <PolicyRow
466
+ label={t("settings.policy.sources")}
467
+ value={t(
468
+ `settings.sourcePolicy.${settings.sourcePolicy ?? "balanced"}.label`,
469
+ )}
470
+ />
471
+ <PolicyRow
472
+ label={t("settings.policy.publishTier")}
473
+ value={t(
474
+ `settings.publishTier.${settings.defaultPublishTier ?? "team"}`,
475
+ )}
476
+ />
477
+ <PolicyRow
478
+ label={t("settings.policy.approval")}
479
+ value={
480
+ settings.requireApprovalForCompanyKnowledge
481
+ ? t("settings.required")
482
+ : t("settings.notRequired")
483
+ }
484
+ />
485
+ <PolicyRow
486
+ label={t("settings.policy.redaction")}
487
+ value={
488
+ settings.autoRedactEmails
489
+ ? t("settings.enabled")
490
+ : t("settings.disabled")
491
+ }
492
+ />
493
+ <PolicyRow
494
+ label={t("settings.policy.preSaveFilter")}
495
+ value={
496
+ settings.captureSanitizationEnabled === false
497
+ ? t("settings.disabled")
498
+ : t("settings.enabled")
499
+ }
500
+ />
501
+ </CardContent>
502
+ </Card>
486
503
 
487
- <Card>
488
- <CardHeader>
489
- <CardTitle className="flex items-center gap-2 text-base">
490
- <IconGauge className="size-4 text-primary" />
491
- {t("settings.autoPublishGateTitle")}
492
- </CardTitle>
493
- <CardDescription>
494
- {t("settings.autoPublishGateDescription")}
495
- </CardDescription>
496
- </CardHeader>
497
- <CardContent className="grid gap-4 text-sm">
498
- <div className="flex items-center justify-between gap-3">
499
- <span className="text-muted-foreground">
500
- {t("settings.confidenceThreshold")}
501
- </span>
502
- <Badge variant="secondary">90%+</Badge>
503
- </div>
504
- <Progress value={90} className="h-2" />
505
- <p className="text-xs leading-5 text-muted-foreground">
506
- {t("settings.autoPublishGateDetail")}
507
- </p>
508
- </CardContent>
509
- </Card>
504
+ <Card>
505
+ <CardHeader>
506
+ <CardTitle className="flex items-center gap-2 text-base">
507
+ <IconGauge className="size-4 text-primary" />
508
+ {t("settings.autoPublishGateTitle")}
509
+ </CardTitle>
510
+ <CardDescription>
511
+ {t("settings.autoPublishGateDescription")}
512
+ </CardDescription>
513
+ </CardHeader>
514
+ <CardContent className="grid gap-4 text-sm">
515
+ <div className="flex items-center justify-between gap-3">
516
+ <span className="text-muted-foreground">
517
+ {t("settings.confidenceThreshold")}
518
+ </span>
519
+ <Badge variant="secondary">90%+</Badge>
520
+ </div>
521
+ <Progress value={90} className="h-2" />
522
+ <p className="text-xs leading-5 text-muted-foreground">
523
+ {t("settings.autoPublishGateDetail")}
524
+ </p>
525
+ </CardContent>
526
+ </Card>
510
527
 
511
- {settingsQuery.isError || saveSettings.isError ? (
512
- <EmptyActionState
513
- title={t("settings.actionsUnavailableTitle")}
514
- detail={t("settings.actionsUnavailableDetail")}
528
+ {settingsQuery.isError || saveSettings.isError ? (
529
+ <EmptyActionState
530
+ title={t("settings.actionsUnavailableTitle")}
531
+ detail={t("settings.actionsUnavailableDetail")}
532
+ />
533
+ ) : null}
534
+ </aside>
535
+ </div>
536
+ }
537
+ team={
538
+ <div className="mx-auto w-full max-w-3xl">
539
+ <TeamPage
540
+ showTitle={false}
541
+ createOrgDescription={t("team.createOrgDescription")}
515
542
  />
516
- ) : null}
517
- </aside>
518
- </div>
543
+ </div>
544
+ }
545
+ whatsNew={
546
+ <div className="mx-auto w-full max-w-3xl">
547
+ <ChangelogSettingsCard markdown={changelog} />
548
+ </div>
549
+ }
550
+ />
519
551
  </div>
520
552
  );
521
553
  }