@agent-native/core 0.91.2 → 0.92.1

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 (538) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +31 -0
  3. package/corpus/core/docs/content/faq.mdx +17 -0
  4. package/corpus/core/docs/content/notifications.mdx +12 -6
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/agent/production-agent.ts +140 -46
  7. package/corpus/core/src/agent/tool-search.ts +71 -4
  8. package/corpus/core/src/application-state/store.ts +12 -1
  9. package/corpus/core/src/cli/index.ts +20 -0
  10. package/corpus/core/src/cli/upgrade.ts +798 -0
  11. package/corpus/core/src/client/AssistantChat.tsx +28 -15
  12. package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
  13. package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
  14. package/corpus/core/src/client/agent-chat-adapter.ts +68 -16
  15. package/corpus/core/src/client/chat/message-components.tsx +85 -8
  16. package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
  17. package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
  18. package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
  19. package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
  20. package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
  21. package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
  22. package/corpus/core/src/client/error-capture.ts +69 -7
  23. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
  24. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
  25. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
  26. package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
  27. package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
  28. package/corpus/core/src/client/org/TeamPage.tsx +77 -71
  29. package/corpus/core/src/client/session-replay.ts +3 -97
  30. package/corpus/core/src/client/settings/SettingsPanel.tsx +738 -441
  31. package/corpus/core/src/client/settings/SettingsSection.tsx +161 -17
  32. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
  33. package/corpus/core/src/client/sse-event-processor.ts +29 -2
  34. package/corpus/core/src/db-admin/agent-tools.ts +8 -2
  35. package/corpus/core/src/db-admin/operations.ts +116 -4
  36. package/corpus/core/src/db-admin/routes.ts +1 -0
  37. package/corpus/core/src/db-admin/types.ts +4 -0
  38. package/corpus/core/src/extensions/actions.ts +113 -5
  39. package/corpus/core/src/extensions/html-shell.ts +5 -4
  40. package/corpus/core/src/extensions/routes.ts +10 -0
  41. package/corpus/core/src/navigation/index.ts +1 -1
  42. package/corpus/core/src/notifications/channels.ts +88 -25
  43. package/corpus/core/src/notifications/registry.ts +17 -3
  44. package/corpus/core/src/notifications/types.ts +4 -1
  45. package/corpus/core/src/resources/handlers.ts +10 -8
  46. package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
  47. package/corpus/core/src/server/poll.ts +293 -8
  48. package/corpus/core/src/server/request-context.ts +7 -0
  49. package/corpus/core/src/styles/agent-conversation.css +1 -1
  50. package/corpus/core/src/styles/agent-native.css +27 -0
  51. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  52. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  53. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  54. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  55. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  56. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  57. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  58. package/corpus/core/src/templates/default/AGENTS.md +14 -5
  59. package/corpus/core/src/templates/default/package.json +2 -1
  60. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  61. package/corpus/core/src/templates/headless/AGENTS.md +13 -3
  62. package/corpus/core/src/templates/headless/package.json +1 -0
  63. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  64. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  65. package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  66. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  67. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  68. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  69. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  70. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  72. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  73. package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
  74. package/corpus/core/src/templates/workspace-root/AGENTS.md +17 -5
  75. package/corpus/core/src/templates/workspace-root/package.json +1 -0
  76. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  78. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  79. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
  80. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
  81. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +5 -6
  82. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
  83. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  84. package/corpus/templates/analytics/AGENTS.md +39 -18
  85. package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
  86. package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
  87. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
  88. package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
  89. package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
  90. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
  91. package/corpus/templates/analytics/actions/navigate.ts +4 -2
  92. package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
  93. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
  94. package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
  95. package/corpus/templates/analytics/actions/save-monitor.ts +15 -1
  96. package/corpus/templates/analytics/actions/view-screen.ts +24 -0
  97. package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
  98. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
  99. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
  100. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
  101. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
  102. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
  103. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
  104. package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
  105. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
  106. package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
  107. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
  108. package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
  109. package/corpus/templates/analytics/app/i18n-data.ts +783 -3
  110. package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
  111. package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
  112. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
  113. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
  114. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
  115. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
  116. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
  117. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
  118. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
  119. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
  120. package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
  121. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +157 -35
  122. package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
  123. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
  124. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +80 -220
  125. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
  126. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
  127. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  128. package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
  130. package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
  131. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
  133. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
  134. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
  135. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
  136. package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
  137. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
  138. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
  139. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
  140. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
  141. package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
  142. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
  143. package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
  144. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
  145. package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
  146. package/corpus/templates/analytics/changelog/2026-07-08-uptime-alerting-clarifies-in-app-inbox-vs-email-and-lets-you-paste-slack-or-webhook-urls-per-monitor.md +6 -0
  147. package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
  148. package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
  149. package/corpus/templates/analytics/server/db/schema-monitoring.ts +5 -1
  150. package/corpus/templates/analytics/server/db/schema.ts +56 -0
  151. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
  152. package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
  153. package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
  154. package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
  155. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +65 -16
  156. package/corpus/templates/analytics/server/plugins/db.ts +122 -2
  157. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
  158. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
  159. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  160. package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
  161. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
  162. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
  163. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  164. package/corpus/templates/assets/AGENTS.md +4 -0
  165. package/corpus/templates/assets/app/routes/settings.tsx +1 -1
  166. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  167. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
  168. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  169. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  170. package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
  171. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
  172. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  173. package/corpus/templates/brain/AGENTS.md +4 -0
  174. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  175. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
  176. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  177. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
  178. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
  179. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
  180. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  181. package/corpus/templates/calendar/AGENTS.md +4 -0
  182. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
  183. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
  184. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
  185. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
  186. package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
  187. package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
  188. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  189. package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
  190. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
  191. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  192. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  193. package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
  194. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
  195. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  196. package/corpus/templates/chat/AGENTS.md +4 -0
  197. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  198. package/corpus/templates/chat/app/routes/settings.tsx +2 -2
  199. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  200. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
  201. package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
  202. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
  203. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  204. package/corpus/templates/clips/AGENTS.md +4 -0
  205. package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
  206. package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
  207. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
  208. package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
  209. package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
  210. package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
  211. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
  212. package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
  213. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
  214. package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
  215. package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
  216. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
  217. package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
  218. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
  219. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
  220. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
  221. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
  222. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
  223. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
  224. package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
  225. package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
  226. package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
  227. package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
  228. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
  229. package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
  230. package/corpus/templates/clips/desktop/src/app.tsx +123 -3
  231. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +15 -1
  232. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -0
  233. package/corpus/templates/clips/desktop/src/styles.css +23 -1
  234. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +1 -3
  235. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +40 -6
  236. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -2
  237. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +3 -5
  238. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +23 -19
  239. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
  240. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +0 -1
  241. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
  242. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
  243. package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
  244. package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
  245. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
  246. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
  247. package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
  248. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  249. package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
  250. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
  251. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
  252. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  253. package/corpus/templates/content/AGENTS.md +4 -0
  254. package/corpus/templates/content/actions/_batch-utils.ts +8 -0
  255. package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
  256. package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
  257. package/corpus/templates/content/actions/_database-utils.ts +6 -1
  258. package/corpus/templates/content/actions/_property-utils.ts +168 -0
  259. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
  260. package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
  261. package/corpus/templates/content/actions/delete-document.ts +9 -13
  262. package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
  263. package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
  264. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +47 -5
  265. package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
  266. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
  267. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  268. package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
  269. package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
  270. package/corpus/templates/content/server/plugins/db.ts +19 -0
  271. package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
  272. package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
  273. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
  274. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  275. package/corpus/templates/design/AGENTS.md +4 -0
  276. package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
  277. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
  278. package/corpus/templates/design/app/routes/team.tsx +1 -1
  279. package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
  280. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
  281. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
  282. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
  283. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  284. package/corpus/templates/dispatch/AGENTS.md +4 -0
  285. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  286. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
  287. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  288. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
  289. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  290. package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
  291. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
  292. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
  293. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  294. package/corpus/templates/forms/AGENTS.md +4 -0
  295. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
  296. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  297. package/corpus/templates/forms/shared/navigation.ts +1 -1
  298. package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
  299. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  300. package/corpus/templates/macros/AGENTS.md +4 -0
  301. package/corpus/templates/macros/app/routes/settings.tsx +2 -2
  302. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  303. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
  304. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
  305. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  306. package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
  307. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
  308. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
  309. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  310. package/corpus/templates/mail/AGENTS.md +4 -0
  311. package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
  312. package/corpus/templates/mail/server/handlers/media.ts +26 -1
  313. package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
  314. package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
  315. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
  316. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  317. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  318. package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
  319. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
  320. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  321. package/corpus/templates/plan/AGENTS.md +4 -0
  322. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  323. package/corpus/templates/plan/app/routes/settings.tsx +2 -2
  324. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  325. package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
  326. package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
  327. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
  328. package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
  329. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
  330. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  331. package/corpus/templates/slides/AGENTS.md +4 -0
  332. package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
  333. package/corpus/templates/slides/app/routes/settings.tsx +2 -2
  334. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  335. package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
  336. package/corpus/templates/slides/shared/api.ts +1 -1
  337. package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  338. package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  339. package/dist/agent/production-agent.d.ts +5 -1
  340. package/dist/agent/production-agent.d.ts.map +1 -1
  341. package/dist/agent/production-agent.js +112 -42
  342. package/dist/agent/production-agent.js.map +1 -1
  343. package/dist/agent/tool-search.d.ts +2 -0
  344. package/dist/agent/tool-search.d.ts.map +1 -1
  345. package/dist/agent/tool-search.js +60 -4
  346. package/dist/agent/tool-search.js.map +1 -1
  347. package/dist/application-state/store.d.ts.map +1 -1
  348. package/dist/application-state/store.js +8 -2
  349. package/dist/application-state/store.js.map +1 -1
  350. package/dist/cli/index.js +19 -0
  351. package/dist/cli/index.js.map +1 -1
  352. package/dist/cli/upgrade.d.ts +100 -0
  353. package/dist/cli/upgrade.d.ts.map +1 -0
  354. package/dist/cli/upgrade.js +678 -0
  355. package/dist/cli/upgrade.js.map +1 -0
  356. package/dist/client/AssistantChat.d.ts.map +1 -1
  357. package/dist/client/AssistantChat.js +25 -14
  358. package/dist/client/AssistantChat.js.map +1 -1
  359. package/dist/client/HighlightedCodeBlock.d.ts +2 -0
  360. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
  361. package/dist/client/HighlightedCodeBlock.js +10 -1
  362. package/dist/client/HighlightedCodeBlock.js.map +1 -1
  363. package/dist/client/PoweredByBadge.d.ts +1 -1
  364. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  365. package/dist/client/PoweredByBadge.js +3 -9
  366. package/dist/client/PoweredByBadge.js.map +1 -1
  367. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  368. package/dist/client/agent-chat-adapter.js +60 -13
  369. package/dist/client/agent-chat-adapter.js.map +1 -1
  370. package/dist/client/chat/message-components.d.ts.map +1 -1
  371. package/dist/client/chat/message-components.js +61 -8
  372. package/dist/client/chat/message-components.js.map +1 -1
  373. package/dist/client/chat/tool-call-display.d.ts +12 -0
  374. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  375. package/dist/client/chat/tool-call-display.js +136 -42
  376. package/dist/client/chat/tool-call-display.js.map +1 -1
  377. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  378. package/dist/client/chat/widgets/DataTableWidget.js +19 -2
  379. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  380. package/dist/client/code-agent-chat-adapter.js +2 -9
  381. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  382. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  383. package/dist/client/db-admin/TableEditor.js +19 -2
  384. package/dist/client/db-admin/TableEditor.js.map +1 -1
  385. package/dist/client/db-admin/export-utils.d.ts +2 -0
  386. package/dist/client/db-admin/export-utils.d.ts.map +1 -1
  387. package/dist/client/db-admin/export-utils.js +11 -3
  388. package/dist/client/db-admin/export-utils.js.map +1 -1
  389. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  390. package/dist/client/db-admin/useAgentSync.js +63 -0
  391. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  392. package/dist/client/error-capture.d.ts.map +1 -1
  393. package/dist/client/error-capture.js +41 -7
  394. package/dist/client/error-capture.js.map +1 -1
  395. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  396. package/dist/client/extensions/EmbeddedExtension.js +3 -1
  397. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  398. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  399. package/dist/client/extensions/ExtensionViewer.js +32 -5
  400. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  401. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  402. package/dist/client/extensions/InlineExtensionFrame.js +3 -1
  403. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  404. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  405. package/dist/client/extensions/portable-extension.js +1 -0
  406. package/dist/client/extensions/portable-extension.js.map +1 -1
  407. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  408. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  409. package/dist/client/org/OrgSwitcher.js +11 -6
  410. package/dist/client/org/OrgSwitcher.js.map +1 -1
  411. package/dist/client/org/TeamPage.d.ts.map +1 -1
  412. package/dist/client/org/TeamPage.js +5 -5
  413. package/dist/client/org/TeamPage.js.map +1 -1
  414. package/dist/client/session-replay.d.ts +0 -8
  415. package/dist/client/session-replay.d.ts.map +1 -1
  416. package/dist/client/session-replay.js +3 -80
  417. package/dist/client/session-replay.js.map +1 -1
  418. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  419. package/dist/client/settings/SettingsPanel.js +89 -33
  420. package/dist/client/settings/SettingsPanel.js.map +1 -1
  421. package/dist/client/settings/SettingsSection.d.ts +19 -4
  422. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  423. package/dist/client/settings/SettingsSection.js +33 -4
  424. package/dist/client/settings/SettingsSection.js.map +1 -1
  425. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  426. package/dist/client/settings/SettingsTabsPage.js +21 -10
  427. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  428. package/dist/client/sse-event-processor.d.ts +9 -0
  429. package/dist/client/sse-event-processor.d.ts.map +1 -1
  430. package/dist/client/sse-event-processor.js +20 -2
  431. package/dist/client/sse-event-processor.js.map +1 -1
  432. package/dist/db-admin/agent-tools.d.ts.map +1 -1
  433. package/dist/db-admin/agent-tools.js +7 -2
  434. package/dist/db-admin/agent-tools.js.map +1 -1
  435. package/dist/db-admin/operations.d.ts.map +1 -1
  436. package/dist/db-admin/operations.js +90 -4
  437. package/dist/db-admin/operations.js.map +1 -1
  438. package/dist/db-admin/routes.d.ts.map +1 -1
  439. package/dist/db-admin/routes.js +1 -0
  440. package/dist/db-admin/routes.js.map +1 -1
  441. package/dist/db-admin/types.d.ts +4 -0
  442. package/dist/db-admin/types.d.ts.map +1 -1
  443. package/dist/db-admin/types.js.map +1 -1
  444. package/dist/extensions/actions.d.ts.map +1 -1
  445. package/dist/extensions/actions.js +85 -5
  446. package/dist/extensions/actions.js.map +1 -1
  447. package/dist/extensions/html-shell.d.ts +5 -4
  448. package/dist/extensions/html-shell.d.ts.map +1 -1
  449. package/dist/extensions/html-shell.js.map +1 -1
  450. package/dist/extensions/routes.d.ts.map +1 -1
  451. package/dist/extensions/routes.js +8 -0
  452. package/dist/extensions/routes.js.map +1 -1
  453. package/dist/navigation/index.d.ts +1 -1
  454. package/dist/navigation/index.d.ts.map +1 -1
  455. package/dist/navigation/index.js +1 -1
  456. package/dist/navigation/index.js.map +1 -1
  457. package/dist/notifications/channels.d.ts +8 -3
  458. package/dist/notifications/channels.d.ts.map +1 -1
  459. package/dist/notifications/channels.js +61 -22
  460. package/dist/notifications/channels.js.map +1 -1
  461. package/dist/notifications/registry.d.ts.map +1 -1
  462. package/dist/notifications/registry.js +14 -3
  463. package/dist/notifications/registry.js.map +1 -1
  464. package/dist/notifications/types.d.ts +4 -1
  465. package/dist/notifications/types.d.ts.map +1 -1
  466. package/dist/notifications/types.js.map +1 -1
  467. package/dist/resources/handlers.d.ts +5 -0
  468. package/dist/resources/handlers.d.ts.map +1 -1
  469. package/dist/resources/handlers.js +9 -8
  470. package/dist/resources/handlers.js.map +1 -1
  471. package/dist/server/agent-chat-plugin.d.ts +5 -1
  472. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  473. package/dist/server/agent-chat-plugin.js +2 -2
  474. package/dist/server/agent-chat-plugin.js.map +1 -1
  475. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  476. package/dist/server/poll.d.ts +12 -4
  477. package/dist/server/poll.d.ts.map +1 -1
  478. package/dist/server/poll.js +236 -9
  479. package/dist/server/poll.js.map +1 -1
  480. package/dist/server/request-context.d.ts +7 -0
  481. package/dist/server/request-context.d.ts.map +1 -1
  482. package/dist/server/request-context.js.map +1 -1
  483. package/dist/styles/agent-conversation.css +1 -1
  484. package/dist/styles/agent-native.css +27 -0
  485. package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
  486. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  487. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  488. package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
  489. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  490. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  491. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  492. package/dist/templates/default/AGENTS.md +14 -5
  493. package/dist/templates/default/package.json +2 -1
  494. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  495. package/dist/templates/headless/AGENTS.md +13 -3
  496. package/dist/templates/headless/package.json +1 -0
  497. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  498. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  499. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  500. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  501. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  502. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  503. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  504. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  505. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  506. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  507. package/dist/templates/workspace-core/AGENTS.md +7 -1
  508. package/dist/templates/workspace-root/AGENTS.md +17 -5
  509. package/dist/templates/workspace-root/package.json +1 -0
  510. package/docs/content/faq.mdx +17 -0
  511. package/docs/content/notifications.mdx +12 -6
  512. package/package.json +2 -2
  513. package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  514. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  515. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  516. package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  517. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  518. package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  519. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  520. package/src/templates/default/AGENTS.md +14 -5
  521. package/src/templates/default/package.json +2 -1
  522. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  523. package/src/templates/headless/AGENTS.md +13 -3
  524. package/src/templates/headless/package.json +1 -0
  525. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  526. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  527. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  528. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  529. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  530. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  531. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  532. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  533. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  534. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  535. package/src/templates/workspace-core/AGENTS.md +7 -1
  536. package/src/templates/workspace-root/AGENTS.md +17 -5
  537. package/src/templates/workspace-root/package.json +1 -0
  538. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-clamps-ultra-wide-viewports-while-keeping-the.md +0 -6
@@ -23,6 +23,7 @@ import {
23
23
  IconGauge,
24
24
  IconUserCircle,
25
25
  IconApps,
26
+ IconUsersGroup,
26
27
  } from "@tabler/icons-react";
27
28
  import React, {
28
29
  Suspense,
@@ -43,6 +44,7 @@ import {
43
44
  TooltipContent,
44
45
  TooltipTrigger,
45
46
  } from "../components/ui/tooltip.js";
47
+ import { TeamPage } from "../org/TeamPage.js";
46
48
  import { callAction } from "../use-action.js";
47
49
  import { uploadAvatar, useAvatarUrl } from "../use-avatar.js";
48
50
  import { useDevMode } from "../use-dev-mode.js";
@@ -52,7 +54,12 @@ import { AgentsSection } from "./AgentsSection.js";
52
54
  import { AutomationsSection } from "./AutomationsSection.js";
53
55
  import { DemoModeSection } from "./DemoModeSection.js";
54
56
  import { SecretsSection } from "./SecretsSection.js";
55
- import { SettingsSection } from "./SettingsSection.js";
57
+ import {
58
+ SettingsSection,
59
+ SettingsSurfaceProvider,
60
+ useSettingsSurface,
61
+ type SettingsSurface,
62
+ } from "./SettingsSection.js";
56
63
  import type {
57
64
  SettingsSearchEntry,
58
65
  SettingsTabItem,
@@ -102,6 +109,55 @@ const CONTROL_STYLE = {
102
109
  lineHeight: 1,
103
110
  } satisfies React.CSSProperties;
104
111
 
112
+ const CONTROL_STYLE_PAGE = {
113
+ fontSize: 14,
114
+ lineHeight: 1.2,
115
+ } satisfies React.CSSProperties;
116
+
117
+ // Surface-aware class helpers so section bodies (shared with the compact
118
+ // sidebar) read as roomy, shadcn-style forms on the full settings page while
119
+ // staying dense in the sidebar.
120
+ function fieldLabelClass(isPage: boolean): string {
121
+ return cn("font-medium text-foreground", isPage ? "text-sm" : "text-[12px]");
122
+ }
123
+
124
+ // Secondary label / row-title size (e.g. "This app", provider names).
125
+ function subTextClass(isPage: boolean): string {
126
+ return isPage ? "text-sm" : "text-[11px]";
127
+ }
128
+
129
+ // Helper / hint / status note size.
130
+ function noteTextClass(isPage: boolean): string {
131
+ return isPage ? "text-xs" : "text-[10px]";
132
+ }
133
+
134
+ function textInputClass(isPage: boolean): string {
135
+ return cn(
136
+ "flex w-full rounded-md border border-border bg-background text-foreground outline-none transition-colors hover:bg-accent/40 focus:ring-1 focus:ring-accent placeholder:text-muted-foreground/50",
137
+ isPage ? "h-10 px-3 text-sm" : "h-9 px-3 text-[12px]",
138
+ );
139
+ }
140
+
141
+ function pillButtonClass(
142
+ isPage: boolean,
143
+ tone: "solid" | "outline" | "ghost" = "outline",
144
+ ): string {
145
+ const base = cn(
146
+ "inline-flex items-center justify-center gap-1 rounded-md font-medium transition-colors disabled:opacity-40",
147
+ isPage ? "px-3 py-1.5 text-sm" : "px-2.5 py-1 text-[10px]",
148
+ );
149
+ if (tone === "solid") {
150
+ return cn(base, "bg-accent text-foreground hover:bg-accent/80");
151
+ }
152
+ if (tone === "ghost") {
153
+ return cn(
154
+ base,
155
+ "text-muted-foreground hover:bg-accent/40 hover:text-foreground",
156
+ );
157
+ }
158
+ return cn(base, "border border-border text-foreground hover:bg-accent/40");
159
+ }
160
+
105
161
  function SettingsSelect({
106
162
  label,
107
163
  labelAdornment,
@@ -115,25 +171,30 @@ function SettingsSelect({
115
171
  options: SettingsSelectOption[];
116
172
  onValueChange: (value: string) => void;
117
173
  }) {
174
+ const isPage = useSettingsSurface() === "page";
175
+ const controlStyle = isPage ? CONTROL_STYLE_PAGE : CONTROL_STYLE;
118
176
  const selected = options.find((option) => option.value === value);
119
177
 
120
178
  return (
121
179
  <div className="space-y-1.5">
122
180
  <div className="flex items-center justify-between">
123
- <p className="text-[12px] font-medium text-foreground">{label}</p>
181
+ <p className={fieldLabelClass(isPage)}>{label}</p>
124
182
  {labelAdornment}
125
183
  </div>
126
184
  <SelectPrimitive.Root value={value} onValueChange={onValueChange}>
127
185
  <SelectPrimitive.Trigger
128
- className="flex h-9 w-full items-center justify-between rounded-md border border-border bg-background px-3 text-start text-[12px] text-foreground outline-none transition-colors hover:bg-accent/40 data-[placeholder]:text-muted-foreground"
186
+ className={cn(
187
+ "flex w-full items-center justify-between rounded-md border border-border bg-background px-3 text-start text-foreground outline-none transition-colors hover:bg-accent/40 data-[placeholder]:text-muted-foreground",
188
+ isPage ? "h-10 text-sm" : "h-9 text-[12px]",
189
+ )}
129
190
  aria-label={label}
130
- style={CONTROL_STYLE}
191
+ style={controlStyle}
131
192
  >
132
193
  <SelectPrimitive.Value>
133
194
  {selected?.label ?? value}
134
195
  </SelectPrimitive.Value>
135
196
  <SelectPrimitive.Icon asChild>
136
- <IconChevronDown size={14} className="text-muted-foreground" />
197
+ <IconChevronDown size={16} className="text-muted-foreground" />
137
198
  </SelectPrimitive.Icon>
138
199
  </SelectPrimitive.Trigger>
139
200
  <SelectPrimitive.Portal>
@@ -147,8 +208,11 @@ function SettingsSelect({
147
208
  <SelectPrimitive.Item
148
209
  key={option.value}
149
210
  value={option.value}
150
- className="relative flex w-full cursor-pointer select-none items-start gap-2 rounded-md px-8 py-2.5 text-[12px] outline-none data-[highlighted]:bg-accent/60 data-[state=checked]:bg-accent/40"
151
- style={CONTROL_STYLE}
211
+ className={cn(
212
+ "relative flex w-full cursor-pointer select-none items-start gap-2 rounded-md px-8 outline-none data-[highlighted]:bg-accent/60 data-[state=checked]:bg-accent/40",
213
+ isPage ? "py-2.5 text-sm" : "py-2.5 text-[12px]",
214
+ )}
215
+ style={controlStyle}
152
216
  >
153
217
  <span className="absolute start-2 top-2.5 flex h-4 w-4 items-center justify-center text-muted-foreground">
154
218
  <SelectPrimitive.ItemIndicator>
@@ -160,7 +224,12 @@ function SettingsSelect({
160
224
  <span className="text-foreground">{option.label}</span>
161
225
  </SelectPrimitive.ItemText>
162
226
  {option.description ? (
163
- <span className="mt-0.5 text-[11px] leading-relaxed text-muted-foreground">
227
+ <span
228
+ className={cn(
229
+ "mt-0.5 leading-relaxed text-muted-foreground",
230
+ isPage ? "text-xs" : "text-[11px]",
231
+ )}
232
+ >
164
233
  {option.description}
165
234
  </span>
166
235
  ) : null}
@@ -354,29 +423,40 @@ function UseBuilderCard({
354
423
  subtitle?: string;
355
424
  dim?: boolean;
356
425
  }) {
426
+ const isPage = useSettingsSurface() === "page";
357
427
  const effectiveConnected = connected || builderFlow.configured;
358
428
  const effectiveOrgName = builderFlow.orgName ?? orgName;
359
429
  const bgClass = dim ? "" : "bg-accent/30";
430
+ const titleCls = isPage ? "text-sm" : "text-[11px]";
431
+ const bodyCls = isPage ? "text-xs" : "text-[10px]";
360
432
 
361
433
  if (effectiveConnected) {
362
434
  return (
363
- <div className={`rounded-md border border-border px-2.5 py-2 ${bgClass}`}>
435
+ <div
436
+ className={cn(
437
+ "rounded-md border border-border",
438
+ isPage ? "px-3.5 py-3" : "px-2.5 py-2",
439
+ bgClass,
440
+ )}
441
+ >
364
442
  <div className="flex items-center justify-between">
365
- <div className="text-[11px] font-medium text-foreground">
443
+ <div className={cn("font-medium text-foreground", titleCls)}>
366
444
  Builder.io
367
445
  </div>
368
- <span className="flex items-center gap-1 text-[10px] text-green-500">
369
- <IconCheck size={10} />
446
+ <span
447
+ className={cn("flex items-center gap-1 text-green-500", bodyCls)}
448
+ >
449
+ <IconCheck size={isPage ? 14 : 10} />
370
450
  Connected
371
451
  </span>
372
452
  </div>
373
453
  {effectiveOrgName && (
374
- <p className="text-[10px] text-muted-foreground mt-0.5">
454
+ <p className={cn("text-muted-foreground mt-0.5", bodyCls)}>
375
455
  {effectiveOrgName}
376
456
  </p>
377
457
  )}
378
458
  {envManaged ? (
379
- <p className="text-[10px] text-muted-foreground mt-1">
459
+ <p className={cn("text-muted-foreground mt-1", bodyCls)}>
380
460
  {credentialSource === "env"
381
461
  ? "Deployment fallback is available. Connect your own account to override it."
382
462
  : "Using your connected Builder account. Deployment fallback is still available."}
@@ -391,14 +471,14 @@ function UseBuilderCard({
391
471
  builderFlow.start({ trackingSource, trackingFlow })
392
472
  }
393
473
  disabled={builderFlow.connecting}
394
- className="inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] no-underline text-muted-foreground hover:text-foreground hover:bg-accent/40 disabled:opacity-60"
474
+ className={cn(pillButtonClass(isPage, "ghost"), "no-underline")}
395
475
  >
396
476
  {builderFlow.connecting
397
477
  ? "Connecting..."
398
478
  : credentialSource === "env"
399
479
  ? "Connect account"
400
480
  : "Reconnect"}
401
- <IconExternalLink size={10} />
481
+ <IconExternalLink size={isPage ? 14 : 10} />
402
482
  </button>
403
483
  )}
404
484
  {credentialSource !== "env" ? <DisconnectBuilderButton /> : null}
@@ -415,35 +495,53 @@ function UseBuilderCard({
415
495
  type="button"
416
496
  onClick={() => builderFlow.start({ trackingSource, trackingFlow })}
417
497
  disabled={builderFlow.connecting}
418
- className={`block w-full rounded-md border border-border px-3 py-3 text-start no-underline bg-gradient-to-br from-teal-500/10 via-transparent to-transparent hover:border-foreground/30 transition-colors disabled:cursor-wait disabled:opacity-70`}
498
+ className={cn(
499
+ "block w-full rounded-md border border-border text-start no-underline bg-gradient-to-br from-teal-500/10 via-transparent to-transparent hover:border-foreground/30 transition-colors disabled:cursor-wait disabled:opacity-70",
500
+ isPage ? "px-4 py-3.5" : "px-3 py-3",
501
+ )}
419
502
  >
420
503
  <div className="flex items-start gap-2.5">
421
- <div className="flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-foreground text-background">
422
- <BuilderBMark className="h-3.5 w-3.5" />
504
+ <div
505
+ className={cn(
506
+ "flex shrink-0 items-center justify-center rounded-md bg-foreground text-background",
507
+ isPage ? "h-8 w-8" : "h-7 w-7",
508
+ )}
509
+ >
510
+ <BuilderBMark className={isPage ? "h-4 w-4" : "h-3.5 w-3.5"} />
423
511
  </div>
424
512
  <div className="flex-1 min-w-0">
425
513
  <div className="flex items-center gap-1.5 flex-wrap">
426
- <span className="text-[12px] font-semibold text-foreground">
514
+ <span
515
+ className={cn(
516
+ "font-semibold text-foreground",
517
+ isPage ? "text-sm" : "text-[12px]",
518
+ )}
519
+ >
427
520
  {builderFlow.connecting ? "Connecting Builder.io..." : label}
428
521
  </span>
429
522
  {builderFlow.connecting && (
430
523
  <IconLoader2
431
- size={12}
524
+ size={isPage ? 14 : 12}
432
525
  className="shrink-0 animate-spin text-muted-foreground"
433
526
  />
434
527
  )}
435
528
  </div>
436
- <p className="text-[10.5px] text-muted-foreground mt-0.5 leading-snug">
529
+ <p
530
+ className={cn(
531
+ "text-muted-foreground mt-0.5 leading-snug",
532
+ isPage ? "text-xs" : "text-[10.5px]",
533
+ )}
534
+ >
437
535
  {subtitle}
438
536
  </p>
439
537
  {builderFlow.error && (
440
- <p className="mt-1 text-[10px] text-destructive">
538
+ <p className={cn("mt-1 text-destructive", bodyCls)}>
441
539
  {builderFlow.error}
442
540
  </p>
443
541
  )}
444
542
  </div>
445
543
  <IconExternalLink
446
- size={12}
544
+ size={isPage ? 14 : 12}
447
545
  className="shrink-0 text-muted-foreground mt-0.5"
448
546
  />
449
547
  </div>
@@ -469,23 +567,32 @@ function ManualSetupCard({
469
567
  /** Optional "Connected via X" badge shown in the header row. */
470
568
  sourceBadge?: string;
471
569
  }) {
570
+ const isPage = useSettingsSurface() === "page";
571
+ const titleCls = isPage ? "text-sm" : "text-[11px]";
572
+ const bodyCls = isPage ? "text-xs" : "text-[10px]";
472
573
  return (
473
574
  <div
474
- className={`rounded-md border border-border px-2.5 py-2 ${dim ? "" : "bg-accent/30"}`}
575
+ className={cn(
576
+ "rounded-md border border-border",
577
+ isPage ? "px-3.5 py-3" : "px-2.5 py-2",
578
+ dim ? "" : "bg-accent/30",
579
+ )}
475
580
  >
476
581
  <div className="flex items-center justify-between mb-1">
477
- <div className="text-[11px] font-medium text-foreground">
582
+ <div className={cn("font-medium text-foreground", titleCls)}>
478
583
  Set up manually
479
584
  </div>
480
585
  {sourceBadge ? (
481
- <span className="flex items-center gap-1 text-[10px] text-green-500">
482
- <IconCheck size={10} />
586
+ <span
587
+ className={cn("flex items-center gap-1 text-green-500", bodyCls)}
588
+ >
589
+ <IconCheck size={isPage ? 14 : 10} />
483
590
  {sourceBadge}
484
591
  </span>
485
592
  ) : null}
486
593
  </div>
487
594
  {hint && (
488
- <p className="text-[10px] text-muted-foreground mb-1.5">{hint}</p>
595
+ <p className={cn("text-muted-foreground mb-1.5", bodyCls)}>{hint}</p>
489
596
  )}
490
597
  {children}
491
598
  {docsUrl && (
@@ -493,10 +600,13 @@ function ManualSetupCard({
493
600
  href={docsUrl}
494
601
  target="_blank"
495
602
  rel="noopener noreferrer"
496
- className="inline-flex items-center gap-1 mt-1.5 rounded border border-border px-2.5 py-1 text-[10px] font-medium no-underline text-muted-foreground hover:text-foreground hover:bg-accent/40"
603
+ className={cn(
604
+ pillButtonClass(isPage, "outline"),
605
+ "mt-1.5 no-underline",
606
+ )}
497
607
  >
498
608
  {docsLabel}
499
- <IconExternalLink size={10} />
609
+ <IconExternalLink size={isPage ? 14 : 10} />
500
610
  </a>
501
611
  )}
502
612
  </div>
@@ -617,6 +727,7 @@ function LLMSectionInner({
617
727
  open?: boolean;
618
728
  onToggle?: () => void;
619
729
  }) {
730
+ const isPage = useSettingsSurface() === "page";
620
731
  const [envKeys, setEnvKeys] = useState<
621
732
  Array<{ key: string; configured: boolean }>
622
733
  >([]);
@@ -926,9 +1037,7 @@ function LLMSectionInner({
926
1037
  {/* Free-form input so OpenRouter/Ollama custom model IDs can
927
1038
  be typed — the registry's supportedModels is only suggestions. */}
928
1039
  <div className="space-y-1.5">
929
- <p className="text-[12px] font-medium text-foreground">
930
- Model
931
- </p>
1040
+ <p className={fieldLabelClass(isPage)}>Model</p>
932
1041
  <input
933
1042
  type="text"
934
1043
  list={`model-suggestions-${selectedEngine}`}
@@ -939,8 +1048,8 @@ function LLMSectionInner({
939
1048
  }
940
1049
  spellCheck={false}
941
1050
  autoComplete="off"
942
- className="flex h-9 w-full rounded-md border border-border bg-background px-3 text-[12px] text-foreground outline-none transition-colors hover:bg-accent/40 focus:ring-1 focus:ring-accent placeholder:text-muted-foreground/50"
943
- style={CONTROL_STYLE}
1051
+ className={textInputClass(isPage)}
1052
+ style={isPage ? CONTROL_STYLE_PAGE : CONTROL_STYLE}
944
1053
  />
945
1054
  {modelOptions.length > 0 && (
946
1055
  <datalist id={`model-suggestions-${selectedEngine}`}>
@@ -1049,8 +1158,13 @@ function LLMSectionInner({
1049
1158
  )}
1050
1159
 
1051
1160
  {envVar && envConfigured ? (
1052
- <div className="flex items-center gap-1.5 text-[10px] text-green-500">
1053
- <IconCheck size={10} />
1161
+ <div
1162
+ className={cn(
1163
+ "flex items-center gap-1.5 text-green-500",
1164
+ isPage ? "text-xs" : "text-[10px]",
1165
+ )}
1166
+ >
1167
+ <IconCheck size={isPage ? 14 : 10} />
1054
1168
  {envVar} configured
1055
1169
  </div>
1056
1170
  ) : envVar ? (
@@ -1063,17 +1177,21 @@ function LLMSectionInner({
1063
1177
  if (e.key === "Enter") handleSave();
1064
1178
  }}
1065
1179
  placeholder={PROVIDER_ENV_PLACEHOLDERS[envVar] ?? "..."}
1066
- className="flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
1180
+ className={cn(textInputClass(isPage), "flex-1")}
1181
+ style={isPage ? CONTROL_STYLE_PAGE : undefined}
1067
1182
  />
1068
1183
  <button
1069
1184
  onClick={handleSave}
1070
1185
  disabled={!providerSettingsChanged || saving}
1071
- className="rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40"
1186
+ className={pillButtonClass(isPage, "solid")}
1072
1187
  >
1073
1188
  {saving ? (
1074
- <IconLoader2 size={10} className="animate-spin" />
1189
+ <IconLoader2
1190
+ size={isPage ? 14 : 10}
1191
+ className="animate-spin"
1192
+ />
1075
1193
  ) : saved ? (
1076
- <IconCheck size={10} />
1194
+ <IconCheck size={isPage ? 14 : 10} />
1077
1195
  ) : (
1078
1196
  "Save"
1079
1197
  )}
@@ -1085,11 +1203,14 @@ function LLMSectionInner({
1085
1203
  <button
1086
1204
  onClick={handleTest}
1087
1205
  disabled={testing}
1088
- className="rounded border border-border px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/40 disabled:opacity-40"
1206
+ className={pillButtonClass(isPage, "outline")}
1089
1207
  >
1090
1208
  {testing ? (
1091
1209
  <span className="flex items-center gap-1">
1092
- <IconLoader2 size={10} className="animate-spin" />
1210
+ <IconLoader2
1211
+ size={isPage ? 14 : 10}
1212
+ className="animate-spin"
1213
+ />
1093
1214
  Testing…
1094
1215
  </span>
1095
1216
  ) : (
@@ -1099,7 +1220,7 @@ function LLMSectionInner({
1099
1220
  {engineChanged && (
1100
1221
  <button
1101
1222
  onClick={handleApply}
1102
- className="rounded bg-accent px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80"
1223
+ className={pillButtonClass(isPage, "solid")}
1103
1224
  >
1104
1225
  Apply
1105
1226
  </button>
@@ -1109,7 +1230,10 @@ function LLMSectionInner({
1109
1230
  <TooltipTrigger asChild>
1110
1231
  <button
1111
1232
  onClick={handleDisconnect}
1112
- className="ms-auto rounded border border-border px-2.5 py-1 text-[10px] font-medium text-muted-foreground hover:bg-destructive/10 hover:text-destructive hover:border-destructive/40"
1233
+ className={cn(
1234
+ pillButtonClass(isPage, "outline"),
1235
+ "ms-auto text-muted-foreground hover:bg-destructive/10 hover:text-destructive hover:border-destructive/40",
1236
+ )}
1113
1237
  >
1114
1238
  Disconnect
1115
1239
  </button>
@@ -1122,23 +1246,43 @@ function LLMSectionInner({
1122
1246
  )}
1123
1247
  </div>
1124
1248
  {testResult && testResult.ok && (
1125
- <p className="flex items-center gap-1 text-[10px] text-green-500">
1126
- <IconCheck size={10} />
1249
+ <p
1250
+ className={cn(
1251
+ "flex items-center gap-1 text-green-500",
1252
+ isPage ? "text-xs" : "text-[10px]",
1253
+ )}
1254
+ >
1255
+ <IconCheck size={isPage ? 14 : 10} />
1127
1256
  Test passed — {testResult.latencyMs}ms
1128
1257
  </p>
1129
1258
  )}
1130
1259
  {testResult && testResult.ok === false && (
1131
- <p className="text-[10px] text-destructive">
1260
+ <p
1261
+ className={cn(
1262
+ "text-destructive",
1263
+ isPage ? "text-xs" : "text-[10px]",
1264
+ )}
1265
+ >
1132
1266
  Test failed: {testResult.error}
1133
1267
  </p>
1134
1268
  )}
1135
1269
  {disconnectError && (
1136
- <p className="text-[10px] text-destructive">
1270
+ <p
1271
+ className={cn(
1272
+ "text-destructive",
1273
+ isPage ? "text-xs" : "text-[10px]",
1274
+ )}
1275
+ >
1137
1276
  Disconnect failed: {disconnectError}
1138
1277
  </p>
1139
1278
  )}
1140
1279
  {applyNote && (
1141
- <p className="text-[10px] text-muted-foreground">
1280
+ <p
1281
+ className={cn(
1282
+ "text-muted-foreground",
1283
+ isPage ? "text-xs" : "text-[10px]",
1284
+ )}
1285
+ >
1142
1286
  Changes take effect on next conversation
1143
1287
  </p>
1144
1288
  )}
@@ -1185,6 +1329,7 @@ function AppModelDefaultsSectionInner({
1185
1329
  open?: boolean;
1186
1330
  onToggle?: () => void;
1187
1331
  }) {
1332
+ const isPage = useSettingsSurface() === "page";
1188
1333
  const [settings, setSettings] = useState<AppModelDefaultsResponse | null>(
1189
1334
  null,
1190
1335
  );
@@ -1339,19 +1484,39 @@ function AppModelDefaultsSectionInner({
1339
1484
  <SettingsSkeleton lines={2} />
1340
1485
  ) : settings ? (
1341
1486
  <div className="space-y-2">
1342
- <div className="rounded-md border border-border bg-accent/20 px-2.5 py-2">
1487
+ <div
1488
+ className={cn(
1489
+ "rounded-md border border-border bg-accent/20",
1490
+ isPage ? "px-3.5 py-3" : "px-2.5 py-2",
1491
+ )}
1492
+ >
1343
1493
  <div className="mb-2 flex items-center justify-between gap-2">
1344
1494
  <div className="min-w-0">
1345
- <p className="truncate text-[11px] font-medium text-foreground">
1495
+ <p
1496
+ className={cn(
1497
+ "truncate font-medium text-foreground",
1498
+ subTextClass(isPage),
1499
+ )}
1500
+ >
1346
1501
  {friendlyAppName(settings.appId) || "This app"}
1347
1502
  </p>
1348
- <p className="mt-0.5 text-[10px] text-muted-foreground">
1503
+ <p
1504
+ className={cn(
1505
+ "mt-0.5 text-muted-foreground",
1506
+ noteTextClass(isPage),
1507
+ )}
1508
+ >
1349
1509
  {hasAppDefault
1350
1510
  ? `Applies to ${scopeLabel}.`
1351
1511
  : "Using the global LLM default."}
1352
1512
  </p>
1353
1513
  </div>
1354
- <span className="shrink-0 rounded-full bg-background px-2 py-0.5 text-[10px] font-medium text-muted-foreground">
1514
+ <span
1515
+ className={cn(
1516
+ "shrink-0 rounded-full bg-background px-2 py-0.5 font-medium text-muted-foreground",
1517
+ noteTextClass(isPage),
1518
+ )}
1519
+ >
1355
1520
  {settings.source}
1356
1521
  </span>
1357
1522
  </div>
@@ -1372,7 +1537,7 @@ function AppModelDefaultsSectionInner({
1372
1537
  />
1373
1538
 
1374
1539
  <div className="space-y-1.5">
1375
- <p className="text-[12px] font-medium text-foreground">Model</p>
1540
+ <p className={fieldLabelClass(isPage)}>Model</p>
1376
1541
  <input
1377
1542
  type="text"
1378
1543
  list={`app-model-suggestions-${selectedEngine}`}
@@ -1388,8 +1553,8 @@ function AppModelDefaultsSectionInner({
1388
1553
  placeholder={selectedEngineInfo?.defaultModel ?? "model-id"}
1389
1554
  spellCheck={false}
1390
1555
  autoComplete="off"
1391
- className="flex h-9 w-full rounded-md border border-border bg-background px-3 text-[12px] text-foreground outline-none transition-colors hover:bg-accent/40 focus:ring-1 focus:ring-accent placeholder:text-muted-foreground/50 disabled:opacity-60"
1392
- style={CONTROL_STYLE}
1556
+ className={cn(textInputClass(isPage), "disabled:opacity-60")}
1557
+ style={isPage ? CONTROL_STYLE_PAGE : CONTROL_STYLE}
1393
1558
  />
1394
1559
  {modelOptions.length > 0 && (
1395
1560
  <datalist id={`app-model-suggestions-${selectedEngine}`}>
@@ -1409,12 +1574,15 @@ function AppModelDefaultsSectionInner({
1409
1574
  type="button"
1410
1575
  onClick={save}
1411
1576
  disabled={!hasPendingChange || saving}
1412
- className="inline-flex h-8 items-center gap-1 rounded bg-accent px-2.5 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40"
1577
+ className={pillButtonClass(isPage, "solid")}
1413
1578
  >
1414
1579
  {saving ? (
1415
- <IconLoader2 size={10} className="animate-spin" />
1580
+ <IconLoader2
1581
+ size={isPage ? 14 : 10}
1582
+ className="animate-spin"
1583
+ />
1416
1584
  ) : saved ? (
1417
- <IconCheck size={10} />
1585
+ <IconCheck size={isPage ? 14 : 10} />
1418
1586
  ) : (
1419
1587
  "Save"
1420
1588
  )}
@@ -1423,7 +1591,7 @@ function AppModelDefaultsSectionInner({
1423
1591
  type="button"
1424
1592
  onClick={reset}
1425
1593
  disabled={!settings.canUpdate || !hasAppDefault || saving}
1426
- className="h-8 rounded border border-border px-2.5 text-[10px] font-medium text-muted-foreground hover:bg-accent/40 hover:text-foreground disabled:opacity-40"
1594
+ className={pillButtonClass(isPage, "outline")}
1427
1595
  >
1428
1596
  Reset
1429
1597
  </button>
@@ -1431,29 +1599,46 @@ function AppModelDefaultsSectionInner({
1431
1599
  </div>
1432
1600
 
1433
1601
  {!settings.canUpdate && (
1434
- <p className="mt-2 text-[10px] text-muted-foreground">
1602
+ <p
1603
+ className={cn(
1604
+ "mt-2 text-muted-foreground",
1605
+ noteTextClass(isPage),
1606
+ )}
1607
+ >
1435
1608
  Only organization owners and admins can change app model
1436
1609
  defaults.
1437
1610
  </p>
1438
1611
  )}
1439
1612
  {selectedEngineInfo?.packageInstalled === false ? (
1440
- <p className="mt-2 text-[10px] text-muted-foreground">
1613
+ <p
1614
+ className={cn(
1615
+ "mt-2 text-muted-foreground",
1616
+ noteTextClass(isPage),
1617
+ )}
1618
+ >
1441
1619
  This app does not include the optional runtime packages for this
1442
1620
  provider.
1443
1621
  </p>
1444
1622
  ) : selectedEngineInfo && !selectedEngineInfo.configured ? (
1445
- <p className="mt-2 text-[10px] text-muted-foreground">
1623
+ <p
1624
+ className={cn(
1625
+ "mt-2 text-muted-foreground",
1626
+ noteTextClass(isPage),
1627
+ )}
1628
+ >
1446
1629
  Credentials for this provider were not detected; runtime will
1447
1630
  fall back if the model cannot be used.
1448
1631
  </p>
1449
1632
  ) : null}
1450
1633
  {error && (
1451
- <p className="mt-2 text-[10px] text-destructive">{error}</p>
1634
+ <p className={cn("mt-2 text-destructive", noteTextClass(isPage))}>
1635
+ {error}
1636
+ </p>
1452
1637
  )}
1453
1638
  </div>
1454
1639
  </div>
1455
1640
  ) : (
1456
- <p className="text-[10px] text-muted-foreground">
1641
+ <p className={cn("text-muted-foreground", noteTextClass(isPage))}>
1457
1642
  App model defaults are unavailable.
1458
1643
  </p>
1459
1644
  )}
@@ -1470,6 +1655,10 @@ function EmailSectionInner({
1470
1655
  open?: boolean;
1471
1656
  onToggle?: () => void;
1472
1657
  }) {
1658
+ const isPage = useSettingsSurface() === "page";
1659
+ const emailInputCls = cn(textInputClass(isPage), "flex-1");
1660
+ const emailBtnCls = pillButtonClass(isPage, "solid");
1661
+ const emailIconSize = isPage ? 14 : 10;
1473
1662
  const [envKeys, setEnvKeys] = useState<
1474
1663
  Array<{ key: string; configured: boolean }>
1475
1664
  >([]);
@@ -1558,7 +1747,12 @@ function EmailSectionInner({
1558
1747
  ) : (
1559
1748
  <div className="space-y-2">
1560
1749
  <label className="block space-y-1">
1561
- <span className="text-[10px] uppercase tracking-wide text-muted-foreground">
1750
+ <span
1751
+ className={cn(
1752
+ "uppercase tracking-wide text-muted-foreground",
1753
+ noteTextClass(isPage),
1754
+ )}
1755
+ >
1562
1756
  Provider
1563
1757
  </span>
1564
1758
  <select
@@ -1566,7 +1760,8 @@ function EmailSectionInner({
1566
1760
  onChange={(e) =>
1567
1761
  setEmailProvider(e.target.value as "resend" | "sendgrid")
1568
1762
  }
1569
- className="w-full rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none focus:ring-1 focus:ring-accent"
1763
+ className={cn(textInputClass(isPage), "w-full")}
1764
+ style={isPage ? CONTROL_STYLE_PAGE : undefined}
1570
1765
  >
1571
1766
  <option value="resend">Resend</option>
1572
1767
  <option value="sendgrid">SendGrid</option>
@@ -1580,8 +1775,13 @@ function EmailSectionInner({
1580
1775
  docsLabel="Get a Resend key"
1581
1776
  >
1582
1777
  {resendConfigured ? (
1583
- <div className="mb-1 flex items-center gap-1.5 text-[10px] text-green-500">
1584
- <IconCheck size={10} />
1778
+ <div
1779
+ className={cn(
1780
+ "mb-1 flex items-center gap-1.5 text-green-500",
1781
+ noteTextClass(isPage),
1782
+ )}
1783
+ >
1784
+ <IconCheck size={emailIconSize} />
1585
1785
  RESEND_API_KEY configured
1586
1786
  </div>
1587
1787
  ) : (
@@ -1594,12 +1794,12 @@ function EmailSectionInner({
1594
1794
  if (e.key === "Enter") saveResend();
1595
1795
  }}
1596
1796
  placeholder="re_..."
1597
- className="flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
1797
+ className={emailInputCls}
1598
1798
  />
1599
1799
  <button
1600
1800
  onClick={saveResend}
1601
1801
  disabled={!resendKey.trim() || saving}
1602
- className="rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40"
1802
+ className={emailBtnCls}
1603
1803
  >
1604
1804
  {saving ? (
1605
1805
  <IconLoader2 size={10} className="animate-spin" />
@@ -1612,8 +1812,13 @@ function EmailSectionInner({
1612
1812
  </div>
1613
1813
  )}
1614
1814
  {fromConfigured ? (
1615
- <div className="flex items-center gap-1.5 text-[10px] text-green-500">
1616
- <IconCheck size={10} />
1815
+ <div
1816
+ className={cn(
1817
+ "flex items-center gap-1.5 text-green-500",
1818
+ noteTextClass(isPage),
1819
+ )}
1820
+ >
1821
+ <IconCheck size={emailIconSize} />
1617
1822
  EMAIL_FROM configured
1618
1823
  </div>
1619
1824
  ) : (
@@ -1626,13 +1831,13 @@ function EmailSectionInner({
1626
1831
  if (e.key === "Enter") saveResend();
1627
1832
  }}
1628
1833
  placeholder="From address - e.g. Acme <hi@acme.com>"
1629
- className="flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
1834
+ className={emailInputCls}
1630
1835
  />
1631
1836
  {!resendConfigured ? null : (
1632
1837
  <button
1633
1838
  onClick={saveResend}
1634
1839
  disabled={!fromAddr.trim() || saving}
1635
- className="rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40"
1840
+ className={emailBtnCls}
1636
1841
  >
1637
1842
  {saving ? (
1638
1843
  <IconLoader2 size={10} className="animate-spin" />
@@ -1653,8 +1858,13 @@ function EmailSectionInner({
1653
1858
  docsLabel="Get a SendGrid key"
1654
1859
  >
1655
1860
  {sendgridConfigured ? (
1656
- <div className="mb-1 flex items-center gap-1.5 text-[10px] text-green-500">
1657
- <IconCheck size={10} />
1861
+ <div
1862
+ className={cn(
1863
+ "mb-1 flex items-center gap-1.5 text-green-500",
1864
+ noteTextClass(isPage),
1865
+ )}
1866
+ >
1867
+ <IconCheck size={emailIconSize} />
1658
1868
  SENDGRID_API_KEY configured
1659
1869
  </div>
1660
1870
  ) : (
@@ -1667,12 +1877,12 @@ function EmailSectionInner({
1667
1877
  if (e.key === "Enter") saveSendgrid();
1668
1878
  }}
1669
1879
  placeholder="SG...."
1670
- className="flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
1880
+ className={emailInputCls}
1671
1881
  />
1672
1882
  <button
1673
1883
  onClick={saveSendgrid}
1674
1884
  disabled={!sendgridKey.trim() || saving}
1675
- className="rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40"
1885
+ className={emailBtnCls}
1676
1886
  >
1677
1887
  {saving ? (
1678
1888
  <IconLoader2 size={10} className="animate-spin" />
@@ -1685,8 +1895,13 @@ function EmailSectionInner({
1685
1895
  </div>
1686
1896
  )}
1687
1897
  {fromConfigured ? (
1688
- <div className="flex items-center gap-1.5 text-[10px] text-green-500">
1689
- <IconCheck size={10} />
1898
+ <div
1899
+ className={cn(
1900
+ "flex items-center gap-1.5 text-green-500",
1901
+ noteTextClass(isPage),
1902
+ )}
1903
+ >
1904
+ <IconCheck size={emailIconSize} />
1690
1905
  EMAIL_FROM configured
1691
1906
  </div>
1692
1907
  ) : (
@@ -1699,13 +1914,13 @@ function EmailSectionInner({
1699
1914
  if (e.key === "Enter") saveSendgrid();
1700
1915
  }}
1701
1916
  placeholder="From address - e.g. Acme <hi@acme.com>"
1702
- className="flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
1917
+ className={emailInputCls}
1703
1918
  />
1704
1919
  {!sendgridConfigured ? null : (
1705
1920
  <button
1706
1921
  onClick={saveSendgrid}
1707
1922
  disabled={!fromAddr.trim() || saving}
1708
- className="rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40"
1923
+ className={emailBtnCls}
1709
1924
  >
1710
1925
  {saving ? (
1711
1926
  <IconLoader2 size={10} className="animate-spin" />
@@ -1747,6 +1962,7 @@ function AgentLimitsSectionInner({
1747
1962
  open?: boolean;
1748
1963
  onToggle?: () => void;
1749
1964
  }) {
1965
+ const isPage = useSettingsSurface() === "page";
1750
1966
  const [settings, setSettings] = useState<AgentLoopSettingsResponse | null>(
1751
1967
  null,
1752
1968
  );
@@ -1882,18 +2098,38 @@ function AgentLimitsSectionInner({
1882
2098
  <SettingsSkeleton lines={2} />
1883
2099
  ) : settings ? (
1884
2100
  <div className="space-y-2">
1885
- <div className="rounded-md border border-border px-2.5 py-2 bg-accent/20">
2101
+ <div
2102
+ className={cn(
2103
+ "rounded-md border border-border bg-accent/20",
2104
+ isPage ? "px-3.5 py-3" : "px-2.5 py-2",
2105
+ )}
2106
+ >
1886
2107
  <div className="flex items-center justify-between gap-2">
1887
2108
  <div>
1888
- <p className="text-[11px] font-medium text-foreground">
2109
+ <p
2110
+ className={cn(
2111
+ "font-medium text-foreground",
2112
+ subTextClass(isPage),
2113
+ )}
2114
+ >
1889
2115
  Max iterations
1890
2116
  </p>
1891
- <p className="mt-0.5 text-[10px] text-muted-foreground">
2117
+ <p
2118
+ className={cn(
2119
+ "mt-0.5 text-muted-foreground",
2120
+ noteTextClass(isPage),
2121
+ )}
2122
+ >
1892
2123
  Applies to {scopeLabel}. Default is{" "}
1893
2124
  {settings.defaultMaxIterations.toLocaleString()}.
1894
2125
  </p>
1895
2126
  </div>
1896
- <span className="rounded-full bg-background px-2 py-0.5 text-[10px] font-medium text-muted-foreground">
2127
+ <span
2128
+ className={cn(
2129
+ "rounded-full bg-background px-2 py-0.5 font-medium text-muted-foreground",
2130
+ noteTextClass(isPage),
2131
+ )}
2132
+ >
1897
2133
  {settings.source}
1898
2134
  </span>
1899
2135
  </div>
@@ -1911,18 +2147,25 @@ function AgentLimitsSectionInner({
1911
2147
  onKeyDown={(e) => {
1912
2148
  if (e.key === "Enter" && hasPendingChange) void save();
1913
2149
  }}
1914
- className="h-8 min-w-0 flex-1 rounded border border-border bg-background px-2 text-[11px] text-foreground outline-none focus:ring-1 focus:ring-accent disabled:opacity-60"
2150
+ className={cn(
2151
+ textInputClass(isPage),
2152
+ "min-w-0 flex-1 disabled:opacity-60",
2153
+ )}
2154
+ style={isPage ? CONTROL_STYLE_PAGE : undefined}
1915
2155
  />
1916
2156
  <button
1917
2157
  type="button"
1918
2158
  onClick={save}
1919
2159
  disabled={!hasPendingChange || saving}
1920
- className="inline-flex h-8 items-center gap-1 rounded bg-accent px-2.5 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40"
2160
+ className={pillButtonClass(isPage, "solid")}
1921
2161
  >
1922
2162
  {saving ? (
1923
- <IconLoader2 size={10} className="animate-spin" />
2163
+ <IconLoader2
2164
+ size={isPage ? 14 : 10}
2165
+ className="animate-spin"
2166
+ />
1924
2167
  ) : saved ? (
1925
- <IconCheck size={10} />
2168
+ <IconCheck size={isPage ? 14 : 10} />
1926
2169
  ) : (
1927
2170
  "Save"
1928
2171
  )}
@@ -1935,23 +2178,30 @@ function AgentLimitsSectionInner({
1935
2178
  saving ||
1936
2179
  settings.maxIterations === settings.defaultMaxIterations
1937
2180
  }
1938
- className="h-8 rounded border border-border px-2.5 text-[10px] font-medium text-muted-foreground hover:bg-accent/40 hover:text-foreground disabled:opacity-40"
2181
+ className={pillButtonClass(isPage, "outline")}
1939
2182
  >
1940
2183
  Reset
1941
2184
  </button>
1942
2185
  </div>
1943
2186
  {!settings.canUpdate && (
1944
- <p className="mt-2 text-[10px] text-muted-foreground">
2187
+ <p
2188
+ className={cn(
2189
+ "mt-2 text-muted-foreground",
2190
+ noteTextClass(isPage),
2191
+ )}
2192
+ >
1945
2193
  Only organization owners and admins can change this limit.
1946
2194
  </p>
1947
2195
  )}
1948
2196
  {error && (
1949
- <p className="mt-2 text-[10px] text-destructive">{error}</p>
2197
+ <p className={cn("mt-2 text-destructive", noteTextClass(isPage))}>
2198
+ {error}
2199
+ </p>
1950
2200
  )}
1951
2201
  </div>
1952
2202
  </div>
1953
2203
  ) : (
1954
- <p className="text-[10px] text-muted-foreground">
2204
+ <p className={cn("text-muted-foreground", noteTextClass(isPage))}>
1955
2205
  Agent limit settings are unavailable.
1956
2206
  </p>
1957
2207
  )}
@@ -2306,6 +2556,7 @@ function AccountSectionInner({
2306
2556
  open: boolean;
2307
2557
  onToggle: () => void;
2308
2558
  }) {
2559
+ const isPage = useSettingsSurface() === "page";
2309
2560
  const { session, isLoading } = useSession();
2310
2561
  const email = session?.email;
2311
2562
  const avatarUrl = useAvatarUrl(email);
@@ -2349,7 +2600,12 @@ function AccountSectionInner({
2349
2600
  onToggle={onToggle}
2350
2601
  >
2351
2602
  <div className="flex items-center gap-3">
2352
- <div className="flex h-12 w-12 shrink-0 items-center justify-center overflow-hidden rounded-full border border-border bg-accent text-[13px] font-semibold text-muted-foreground">
2603
+ <div
2604
+ className={cn(
2605
+ "flex shrink-0 items-center justify-center overflow-hidden rounded-full border border-border bg-accent font-semibold text-muted-foreground",
2606
+ isPage ? "h-14 w-14 text-[15px]" : "h-12 w-12 text-[13px]",
2607
+ )}
2608
+ >
2353
2609
  {avatarUrl ? (
2354
2610
  <img
2355
2611
  src={avatarUrl}
@@ -2361,21 +2617,36 @@ function AccountSectionInner({
2361
2617
  )}
2362
2618
  </div>
2363
2619
  <div className="min-w-0 flex-1">
2364
- <p className="truncate text-[12px] font-medium text-foreground">
2620
+ <p
2621
+ className={cn(
2622
+ "truncate font-medium text-foreground",
2623
+ isPage ? "text-sm" : "text-[12px]",
2624
+ )}
2625
+ >
2365
2626
  {isLoading ? "Loading..." : displayName}
2366
2627
  </p>
2367
2628
  {email && (
2368
- <p className="truncate text-[11px] text-muted-foreground">
2629
+ <p
2630
+ className={cn(
2631
+ "truncate text-muted-foreground",
2632
+ subTextClass(isPage),
2633
+ )}
2634
+ >
2369
2635
  {email}
2370
2636
  </p>
2371
2637
  )}
2372
2638
  {status === "saved" && (
2373
- <p className="mt-1 text-[11px] text-green-600 dark:text-green-400">
2639
+ <p
2640
+ className={cn(
2641
+ "mt-1 text-green-600 dark:text-green-400",
2642
+ subTextClass(isPage),
2643
+ )}
2644
+ >
2374
2645
  Photo updated
2375
2646
  </p>
2376
2647
  )}
2377
2648
  {status === "error" && (
2378
- <p className="mt-1 text-[11px] text-destructive">
2649
+ <p className={cn("mt-1 text-destructive", subTextClass(isPage))}>
2379
2650
  Could not update photo
2380
2651
  </p>
2381
2652
  )}
@@ -2391,7 +2662,10 @@ function AccountSectionInner({
2391
2662
  type="button"
2392
2663
  disabled={!email || uploading}
2393
2664
  onClick={() => fileInputRef.current?.click()}
2394
- className="inline-flex h-8 shrink-0 items-center justify-center rounded-md border border-border bg-background px-3 text-[12px] font-medium text-foreground transition-colors hover:bg-accent/50 disabled:cursor-not-allowed disabled:opacity-50"
2665
+ className={cn(
2666
+ pillButtonClass(isPage, "outline"),
2667
+ "shrink-0 justify-center",
2668
+ )}
2395
2669
  >
2396
2670
  {uploading ? "Uploading..." : "Change photo"}
2397
2671
  </button>
@@ -2404,6 +2678,7 @@ interface SettingsPanelContentProps extends SettingsPanelProps {
2404
2678
  sections?: readonly SettingsSectionId[];
2405
2679
  showCapabilityStrip?: boolean;
2406
2680
  className?: string;
2681
+ surface?: SettingsSurface;
2407
2682
  }
2408
2683
 
2409
2684
  function SettingsPanelContent({
@@ -2416,6 +2691,7 @@ function SettingsPanelContent({
2416
2691
  sections = ALL_SETTINGS_SECTIONS,
2417
2692
  showCapabilityStrip = true,
2418
2693
  className,
2694
+ surface = "sidebar",
2419
2695
  }: SettingsPanelContentProps) {
2420
2696
  const { status: builder, loading: builderLoading } = useBuilderStatus();
2421
2697
  const connected = builder?.configured ?? false;
@@ -2500,225 +2776,300 @@ function SettingsPanelContent({
2500
2776
  return () => window.removeEventListener("hashchange", handleHash);
2501
2777
  }, [openSettingsSection, shouldShowSection]);
2502
2778
 
2779
+ const isPage = surface === "page";
2780
+
2503
2781
  return (
2504
- <div
2505
- className={cn("flex-1 min-h-0 overflow-y-auto p-3 space-y-2", className)}
2506
- style={{ overflowY: "auto" }}
2507
- >
2508
- {/* Agent capability mode (App vs Code) + app link */}
2509
- {(showDevToggle || devAppUrl) && (
2510
- <div className="space-y-2 pb-2 border-b border-border mb-2">
2511
- {showDevToggle && (
2512
- <SettingsSelect
2513
- label="Agent mode"
2514
- labelAdornment={
2515
- devAppUrl ? (
2516
- <Tooltip>
2517
- <TooltipTrigger asChild>
2518
- <a
2519
- href={devAppUrl}
2520
- target="_blank"
2521
- rel="noopener noreferrer"
2522
- aria-label="Open app in new tab"
2523
- className="flex items-center text-muted-foreground hover:text-foreground"
2524
- >
2525
- <IconExternalLink size={14} />
2526
- </a>
2527
- </TooltipTrigger>
2528
- <TooltipContent>Open app in new tab</TooltipContent>
2529
- </Tooltip>
2530
- ) : undefined
2531
- }
2532
- value={isDevMode ? "development" : "production"}
2533
- options={agentModeOptions}
2534
- onValueChange={(next) => {
2535
- const nextIsDev = next === "development";
2536
- if (nextIsDev !== isDevMode) onToggleDevMode();
2537
- }}
2538
- />
2539
- )}
2540
- </div>
2541
- )}
2782
+ <SettingsSurfaceProvider surface={surface}>
2783
+ <div
2784
+ className={cn(
2785
+ isPage ? "space-y-3" : "flex-1 min-h-0 overflow-y-auto p-3 space-y-2",
2786
+ className,
2787
+ )}
2788
+ style={isPage ? undefined : { overflowY: "auto" }}
2789
+ >
2790
+ {/* Agent capability mode (App vs Code) + app link */}
2791
+ {(showDevToggle || devAppUrl) && (
2792
+ <div className="space-y-2 pb-2 border-b border-border mb-2">
2793
+ {showDevToggle && (
2794
+ <SettingsSelect
2795
+ label="Agent mode"
2796
+ labelAdornment={
2797
+ devAppUrl ? (
2798
+ <Tooltip>
2799
+ <TooltipTrigger asChild>
2800
+ <a
2801
+ href={devAppUrl}
2802
+ target="_blank"
2803
+ rel="noopener noreferrer"
2804
+ aria-label="Open app in new tab"
2805
+ className="flex items-center text-muted-foreground hover:text-foreground"
2806
+ >
2807
+ <IconExternalLink size={14} />
2808
+ </a>
2809
+ </TooltipTrigger>
2810
+ <TooltipContent>Open app in new tab</TooltipContent>
2811
+ </Tooltip>
2812
+ ) : undefined
2813
+ }
2814
+ value={isDevMode ? "development" : "production"}
2815
+ options={agentModeOptions}
2816
+ onValueChange={(next) => {
2817
+ const nextIsDev = next === "development";
2818
+ if (nextIsDev !== isDevMode) onToggleDevMode();
2819
+ }}
2820
+ />
2821
+ )}
2822
+ </div>
2823
+ )}
2542
2824
 
2543
- {showCapabilityStrip && (
2544
- <CapabilityStatusStrip
2545
- isDevMode={isDevMode}
2546
- builderConnected={connected}
2547
- builderLoading={builderLoading}
2548
- builderBranchesAvailable={builderBranchesAvailable}
2549
- onOpenLlm={() => openSettingsSection("llm", true)}
2550
- />
2551
- )}
2825
+ {showCapabilityStrip && (
2826
+ <CapabilityStatusStrip
2827
+ isDevMode={isDevMode}
2828
+ builderConnected={connected}
2829
+ builderLoading={builderLoading}
2830
+ builderBranchesAvailable={builderBranchesAvailable}
2831
+ onOpenLlm={() => openSettingsSection("llm", true)}
2832
+ />
2833
+ )}
2552
2834
 
2553
- {/* Account */}
2554
- {shouldShowSection("account") && (
2555
- <AccountSectionInner
2556
- open={openSection === "account"}
2557
- onToggle={() => toggle("account")}
2558
- />
2559
- )}
2835
+ {/* Account */}
2836
+ {shouldShowSection("account") && (
2837
+ <AccountSectionInner
2838
+ open={openSection === "account"}
2839
+ onToggle={() => toggle("account")}
2840
+ />
2841
+ )}
2560
2842
 
2561
- {/* LLM */}
2562
- {shouldShowSection("llm") && (
2563
- <LLMSectionInner
2564
- builderFlow={builderFlow}
2565
- builderLoading={builderLoading}
2566
- connectUrl={connectUrl}
2567
- connected={connected}
2568
- orgName={orgName}
2569
- envManaged={envManaged}
2570
- credentialSource={credentialSource}
2571
- open={openSection === "llm"}
2572
- onToggle={() => toggle("llm")}
2573
- />
2574
- )}
2843
+ {/* LLM */}
2844
+ {shouldShowSection("llm") && (
2845
+ <LLMSectionInner
2846
+ builderFlow={builderFlow}
2847
+ builderLoading={builderLoading}
2848
+ connectUrl={connectUrl}
2849
+ connected={connected}
2850
+ orgName={orgName}
2851
+ envManaged={envManaged}
2852
+ credentialSource={credentialSource}
2853
+ open={openSection === "llm"}
2854
+ onToggle={() => toggle("llm")}
2855
+ />
2856
+ )}
2575
2857
 
2576
- {/* App default model */}
2577
- {shouldShowSection("app-models") && (
2578
- <AppModelDefaultsSectionInner
2579
- open={openSection === "app-models"}
2580
- onToggle={() => toggle("app-models")}
2581
- />
2582
- )}
2858
+ {/* App default model */}
2859
+ {shouldShowSection("app-models") && (
2860
+ <AppModelDefaultsSectionInner
2861
+ open={openSection === "app-models"}
2862
+ onToggle={() => toggle("app-models")}
2863
+ />
2864
+ )}
2583
2865
 
2584
- {/* Agent limits */}
2585
- {shouldShowSection("limits") && (
2586
- <AgentLimitsSectionInner
2587
- open={openSection === "limits"}
2588
- onToggle={() => toggle("limits")}
2589
- />
2590
- )}
2866
+ {/* Agent limits */}
2867
+ {shouldShowSection("limits") && (
2868
+ <AgentLimitsSectionInner
2869
+ open={openSection === "limits"}
2870
+ onToggle={() => toggle("limits")}
2871
+ />
2872
+ )}
2591
2873
 
2592
- {/* Voice transcription */}
2593
- {shouldShowSection("voice") && (
2594
- <SettingsSection
2595
- id={settingsSectionDomId("voice")}
2596
- icon={<IconMicrophone size={14} />}
2597
- title="Voice Transcription"
2598
- subtitle="How the composer microphone turns your voice into text."
2599
- open={openSection === "voice"}
2600
- onToggle={() => toggle("voice")}
2601
- >
2602
- <VoiceTranscriptionSection />
2603
- </SettingsSection>
2604
- )}
2874
+ {/* Voice transcription */}
2875
+ {shouldShowSection("voice") && (
2876
+ <SettingsSection
2877
+ id={settingsSectionDomId("voice")}
2878
+ icon={<IconMicrophone size={14} />}
2879
+ title="Voice Transcription"
2880
+ subtitle="How the composer microphone turns your voice into text."
2881
+ open={openSection === "voice"}
2882
+ onToggle={() => toggle("voice")}
2883
+ >
2884
+ <VoiceTranscriptionSection />
2885
+ </SettingsSection>
2886
+ )}
2605
2887
 
2606
- {/* Demo mode */}
2607
- {shouldShowSection("demo-mode") && (
2608
- <SettingsSection
2609
- id={settingsSectionDomId("demo-mode")}
2610
- icon={<IconEyeOff size={14} />}
2611
- title="Demo mode"
2612
- subtitle="Replace names, emails, and numbers with realistic fake data everywhere — in the UI and what the agent sees. IDs and structure are preserved so the app keeps working."
2613
- open={openSection === "demo-mode"}
2614
- onToggle={() => toggle("demo-mode")}
2615
- >
2616
- <DemoModeSection />
2617
- </SettingsSection>
2618
- )}
2888
+ {/* Demo mode */}
2889
+ {shouldShowSection("demo-mode") && (
2890
+ <SettingsSection
2891
+ id={settingsSectionDomId("demo-mode")}
2892
+ icon={<IconEyeOff size={14} />}
2893
+ title="Demo mode"
2894
+ subtitle="Replace names, emails, and numbers with realistic fake data everywhere — in the UI and what the agent sees. IDs and structure are preserved so the app keeps working."
2895
+ open={openSection === "demo-mode"}
2896
+ onToggle={() => toggle("demo-mode")}
2897
+ >
2898
+ <DemoModeSection />
2899
+ </SettingsSection>
2900
+ )}
2619
2901
 
2620
- {/* Automations */}
2621
- {shouldShowSection("automations") && (
2622
- <SettingsSection
2623
- id={settingsSectionDomId("automations")}
2624
- icon={<IconBolt size={14} />}
2625
- title="Automations"
2626
- subtitle="Event-triggered and scheduled automations."
2627
- open={openSection === "automations"}
2628
- onToggle={() => toggle("automations")}
2629
- >
2630
- <AutomationsSection />
2631
- </SettingsSection>
2632
- )}
2902
+ {/* Automations */}
2903
+ {shouldShowSection("automations") && (
2904
+ <SettingsSection
2905
+ id={settingsSectionDomId("automations")}
2906
+ icon={<IconBolt size={14} />}
2907
+ title="Automations"
2908
+ subtitle="Event-triggered and scheduled automations."
2909
+ open={openSection === "automations"}
2910
+ onToggle={() => toggle("automations")}
2911
+ >
2912
+ <AutomationsSection />
2913
+ </SettingsSection>
2914
+ )}
2633
2915
 
2634
- {/* API Keys & Connections */}
2635
- {shouldShowSection("secrets") && (
2636
- <SettingsSection
2637
- id={settingsSectionDomId("secrets")}
2638
- icon={<IconKey size={14} />}
2639
- title="API Keys & Connections"
2640
- subtitle="Service credentials and automation keys."
2641
- open={openSection === "secrets"}
2642
- onToggle={() => toggle("secrets")}
2643
- >
2644
- <SecretsSection focusKey={focusSecretKey} />
2645
- </SettingsSection>
2646
- )}
2916
+ {/* API Keys & Connections */}
2917
+ {shouldShowSection("secrets") && (
2918
+ <SettingsSection
2919
+ id={settingsSectionDomId("secrets")}
2920
+ icon={<IconKey size={14} />}
2921
+ title="API Keys & Connections"
2922
+ subtitle="Service credentials and automation keys."
2923
+ open={openSection === "secrets"}
2924
+ onToggle={() => toggle("secrets")}
2925
+ >
2926
+ <SecretsSection focusKey={focusSecretKey} />
2927
+ </SettingsSection>
2928
+ )}
2647
2929
 
2648
- {/* Hosting */}
2649
- {shouldShowSection("hosting") && (
2650
- <SettingsSection
2651
- id={settingsSectionDomId("hosting")}
2652
- icon={<IconCloud size={14} />}
2653
- title="Hosting"
2654
- subtitle="Deploy your app to the cloud."
2655
- connected={connected}
2656
- open={openSection === "hosting"}
2657
- onToggle={() => toggle("hosting")}
2658
- >
2659
- <div className="space-y-2">
2660
- <UseBuilderCard
2661
- builderFlow={builderFlow}
2662
- connectUrl={connectUrl}
2663
- connected={connected}
2664
- orgName={orgName}
2665
- envManaged={envManaged}
2666
- credentialSource={credentialSource}
2667
- trackingSource="hosting_settings"
2668
- trackingFlow="hosting"
2669
- />
2670
- <ManualSetupCard
2671
- hint="Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target."
2672
- docsUrl="https://www.builder.io/c/docs/agent-native-deployment"
2673
- dim={connected}
2674
- />
2675
- </div>
2676
- </SettingsSection>
2677
- )}
2930
+ {/* Hosting */}
2931
+ {shouldShowSection("hosting") && (
2932
+ <SettingsSection
2933
+ id={settingsSectionDomId("hosting")}
2934
+ icon={<IconCloud size={14} />}
2935
+ title="Hosting"
2936
+ subtitle="Deploy your app to the cloud."
2937
+ connected={connected}
2938
+ open={openSection === "hosting"}
2939
+ onToggle={() => toggle("hosting")}
2940
+ >
2941
+ <div className="space-y-2">
2942
+ <UseBuilderCard
2943
+ builderFlow={builderFlow}
2944
+ connectUrl={connectUrl}
2945
+ connected={connected}
2946
+ orgName={orgName}
2947
+ envManaged={envManaged}
2948
+ credentialSource={credentialSource}
2949
+ trackingSource="hosting_settings"
2950
+ trackingFlow="hosting"
2951
+ />
2952
+ <ManualSetupCard
2953
+ hint="Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target."
2954
+ docsUrl="https://www.builder.io/c/docs/agent-native-deployment"
2955
+ dim={connected}
2956
+ />
2957
+ </div>
2958
+ </SettingsSection>
2959
+ )}
2678
2960
 
2679
- {/* Database */}
2680
- {shouldShowSection("database") && (
2681
- <SettingsSection
2682
- id={settingsSectionDomId("database")}
2683
- icon={<IconDatabase size={14} />}
2684
- title="Database"
2685
- subtitle="Connect a cloud database for persistent storage."
2686
- connected={connected}
2687
- open={openSection === "database"}
2688
- onToggle={() => toggle("database")}
2689
- >
2690
- <div className="space-y-2">
2691
- <UseBuilderCard
2692
- builderFlow={builderFlow}
2693
- connectUrl={connectUrl}
2694
- connected={connected}
2695
- orgName={orgName}
2696
- envManaged={envManaged}
2697
- credentialSource={credentialSource}
2698
- trackingSource="database_settings"
2699
- trackingFlow="database"
2700
- />
2701
- <ManualSetupCard
2702
- hint="Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, any Postgres/SQLite database, or local PGlite with pglite:./data/pglite."
2703
- docsUrl="https://www.builder.io/c/docs/agent-native-database"
2704
- dim={connected}
2705
- />
2706
- </div>
2707
- </SettingsSection>
2708
- )}
2961
+ {/* Database */}
2962
+ {shouldShowSection("database") && (
2963
+ <SettingsSection
2964
+ id={settingsSectionDomId("database")}
2965
+ icon={<IconDatabase size={14} />}
2966
+ title="Database"
2967
+ subtitle="Connect a cloud database for persistent storage."
2968
+ connected={connected}
2969
+ open={openSection === "database"}
2970
+ onToggle={() => toggle("database")}
2971
+ >
2972
+ <div className="space-y-2">
2973
+ <UseBuilderCard
2974
+ builderFlow={builderFlow}
2975
+ connectUrl={connectUrl}
2976
+ connected={connected}
2977
+ orgName={orgName}
2978
+ envManaged={envManaged}
2979
+ credentialSource={credentialSource}
2980
+ trackingSource="database_settings"
2981
+ trackingFlow="database"
2982
+ />
2983
+ <ManualSetupCard
2984
+ hint="Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, any Postgres/SQLite database, or local PGlite with pglite:./data/pglite."
2985
+ docsUrl="https://www.builder.io/c/docs/agent-native-database"
2986
+ dim={connected}
2987
+ />
2988
+ </div>
2989
+ </SettingsSection>
2990
+ )}
2709
2991
 
2710
- {/* File uploads */}
2711
- {shouldShowSection("uploads") && (
2712
- <SettingsSection
2713
- id={settingsSectionDomId("uploads")}
2714
- icon={<IconUpload size={14} />}
2715
- title="File uploads"
2716
- subtitle="Where user-uploaded files (avatars, chat attachments) are stored."
2717
- connected={connected}
2718
- open={openSection === "uploads"}
2719
- onToggle={() => toggle("uploads")}
2720
- >
2721
- <div className="space-y-2">
2992
+ {/* File uploads */}
2993
+ {shouldShowSection("uploads") && (
2994
+ <SettingsSection
2995
+ id={settingsSectionDomId("uploads")}
2996
+ icon={<IconUpload size={14} />}
2997
+ title="File uploads"
2998
+ subtitle="Where user-uploaded files (avatars, chat attachments) are stored."
2999
+ connected={connected}
3000
+ open={openSection === "uploads"}
3001
+ onToggle={() => toggle("uploads")}
3002
+ >
3003
+ <div className="space-y-2">
3004
+ <UseBuilderCard
3005
+ builderFlow={builderFlow}
3006
+ connectUrl={connectUrl}
3007
+ connected={connected}
3008
+ orgName={orgName}
3009
+ envManaged={envManaged}
3010
+ credentialSource={credentialSource}
3011
+ trackingSource="file_upload_settings"
3012
+ trackingFlow="file_upload"
3013
+ />
3014
+ <ManualSetupCard
3015
+ hint="Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production."
3016
+ docsUrl="https://www.builder.io/c/docs/agent-native-file-uploads"
3017
+ dim={connected}
3018
+ />
3019
+ </div>
3020
+ </SettingsSection>
3021
+ )}
3022
+
3023
+ {/* Authentication */}
3024
+ {shouldShowSection("auth") && (
3025
+ <SettingsSection
3026
+ id={settingsSectionDomId("auth")}
3027
+ icon={<IconShield size={14} />}
3028
+ title="Authentication"
3029
+ subtitle="Set up user authentication and access control."
3030
+ connected={connected}
3031
+ open={openSection === "auth"}
3032
+ onToggle={() => toggle("auth")}
3033
+ >
3034
+ <div className="space-y-2">
3035
+ <UseBuilderCard
3036
+ builderFlow={builderFlow}
3037
+ connectUrl={connectUrl}
3038
+ connected={connected}
3039
+ orgName={orgName}
3040
+ envManaged={envManaged}
3041
+ credentialSource={credentialSource}
3042
+ trackingSource="auth_settings"
3043
+ trackingFlow="auth"
3044
+ />
3045
+ <ManualSetupCard
3046
+ hint="Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers."
3047
+ docsUrl="https://www.builder.io/c/docs/agent-native-authentication"
3048
+ dim={connected}
3049
+ />
3050
+ </div>
3051
+ </SettingsSection>
3052
+ )}
3053
+
3054
+ {/* Email */}
3055
+ {shouldShowSection("email") && (
3056
+ <EmailSectionInner
3057
+ open={openSection === "email"}
3058
+ onToggle={() => toggle("email")}
3059
+ />
3060
+ )}
3061
+
3062
+ {/* Browser Automation */}
3063
+ {shouldShowSection("browser") && (
3064
+ <SettingsSection
3065
+ id={settingsSectionDomId("browser")}
3066
+ icon={<IconBrowser size={14} />}
3067
+ title="Browser Automation"
3068
+ subtitle="Let agents control a real browser for web tasks."
3069
+ connected={connected}
3070
+ open={openSection === "browser"}
3071
+ onToggle={() => toggle("browser")}
3072
+ >
2722
3073
  <UseBuilderCard
2723
3074
  builderFlow={builderFlow}
2724
3075
  connectUrl={connectUrl}
@@ -2726,30 +3077,22 @@ function SettingsPanelContent({
2726
3077
  orgName={orgName}
2727
3078
  envManaged={envManaged}
2728
3079
  credentialSource={credentialSource}
2729
- trackingSource="file_upload_settings"
2730
- trackingFlow="file_upload"
3080
+ trackingSource="browser_settings"
3081
+ trackingFlow="browser_automation"
2731
3082
  />
2732
- <ManualSetupCard
2733
- hint="Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production."
2734
- docsUrl="https://www.builder.io/c/docs/agent-native-file-uploads"
2735
- dim={connected}
2736
- />
2737
- </div>
2738
- </SettingsSection>
2739
- )}
3083
+ </SettingsSection>
3084
+ )}
2740
3085
 
2741
- {/* Authentication */}
2742
- {shouldShowSection("auth") && (
2743
- <SettingsSection
2744
- id={settingsSectionDomId("auth")}
2745
- icon={<IconShield size={14} />}
2746
- title="Authentication"
2747
- subtitle="Set up user authentication and access control."
2748
- connected={connected}
2749
- open={openSection === "auth"}
2750
- onToggle={() => toggle("auth")}
2751
- >
2752
- <div className="space-y-2">
3086
+ {builderBranchesAvailable && shouldShowSection("background") && (
3087
+ <SettingsSection
3088
+ id={settingsSectionDomId("background")}
3089
+ icon={<IconGitBranch size={14} />}
3090
+ title="Background Agent"
3091
+ subtitle="Make code changes from production mode via Builder."
3092
+ connected={connected}
3093
+ open={openSection === "background"}
3094
+ onToggle={() => toggle("background")}
3095
+ >
2753
3096
  <UseBuilderCard
2754
3097
  builderFlow={builderFlow}
2755
3098
  connectUrl={connectUrl}
@@ -2757,117 +3100,57 @@ function SettingsPanelContent({
2757
3100
  orgName={orgName}
2758
3101
  envManaged={envManaged}
2759
3102
  credentialSource={credentialSource}
2760
- trackingSource="auth_settings"
2761
- trackingFlow="auth"
3103
+ trackingSource="background_agent_settings"
3104
+ trackingFlow="background_agent"
2762
3105
  />
2763
- <ManualSetupCard
2764
- hint="Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers."
2765
- docsUrl="https://www.builder.io/c/docs/agent-native-authentication"
2766
- dim={connected}
2767
- />
2768
- </div>
2769
- </SettingsSection>
2770
- )}
2771
-
2772
- {/* Email */}
2773
- {shouldShowSection("email") && (
2774
- <EmailSectionInner
2775
- open={openSection === "email"}
2776
- onToggle={() => toggle("email")}
2777
- />
2778
- )}
2779
-
2780
- {/* Browser Automation */}
2781
- {shouldShowSection("browser") && (
2782
- <SettingsSection
2783
- id={settingsSectionDomId("browser")}
2784
- icon={<IconBrowser size={14} />}
2785
- title="Browser Automation"
2786
- subtitle="Let agents control a real browser for web tasks."
2787
- connected={connected}
2788
- open={openSection === "browser"}
2789
- onToggle={() => toggle("browser")}
2790
- >
2791
- <UseBuilderCard
2792
- builderFlow={builderFlow}
2793
- connectUrl={connectUrl}
2794
- connected={connected}
2795
- orgName={orgName}
2796
- envManaged={envManaged}
2797
- credentialSource={credentialSource}
2798
- trackingSource="browser_settings"
2799
- trackingFlow="browser_automation"
2800
- />
2801
- </SettingsSection>
2802
- )}
2803
-
2804
- {builderBranchesAvailable && shouldShowSection("background") && (
2805
- <SettingsSection
2806
- id={settingsSectionDomId("background")}
2807
- icon={<IconGitBranch size={14} />}
2808
- title="Background Agent"
2809
- subtitle="Make code changes from production mode via Builder."
2810
- connected={connected}
2811
- open={openSection === "background"}
2812
- onToggle={() => toggle("background")}
2813
- >
2814
- <UseBuilderCard
2815
- builderFlow={builderFlow}
2816
- connectUrl={connectUrl}
2817
- connected={connected}
2818
- orgName={orgName}
2819
- envManaged={envManaged}
2820
- credentialSource={credentialSource}
2821
- trackingSource="background_agent_settings"
2822
- trackingFlow="background_agent"
2823
- />
2824
- </SettingsSection>
2825
- )}
3106
+ </SettingsSection>
3107
+ )}
2826
3108
 
2827
- {/* Integrations */}
2828
- {shouldShowSection("integrations") && (
2829
- <SettingsSection
2830
- id={settingsSectionDomId("integrations")}
2831
- icon={<IconPlugConnected size={14} />}
2832
- title="Integrations"
2833
- subtitle="Connect messaging platforms and external services."
2834
- open={openSection === "integrations"}
2835
- onToggle={() => toggle("integrations")}
2836
- >
2837
- <Suspense fallback={null}>
2838
- <IntegrationsPanel />
2839
- </Suspense>
2840
- </SettingsSection>
2841
- )}
3109
+ {/* Integrations */}
3110
+ {shouldShowSection("integrations") && (
3111
+ <SettingsSection
3112
+ id={settingsSectionDomId("integrations")}
3113
+ icon={<IconPlugConnected size={14} />}
3114
+ title="Integrations"
3115
+ subtitle="Connect messaging platforms and external services."
3116
+ open={openSection === "integrations"}
3117
+ onToggle={() => toggle("integrations")}
3118
+ >
3119
+ <Suspense fallback={null}>
3120
+ <IntegrationsPanel />
3121
+ </Suspense>
3122
+ </SettingsSection>
3123
+ )}
2842
3124
 
2843
- {/* Usage & spend */}
2844
- {shouldShowSection("usage") && (
2845
- <SettingsSection
2846
- id={settingsSectionDomId("usage")}
2847
- icon={<IconCoin size={14} />}
2848
- title="Usage"
2849
- subtitle="Track token consumption and estimated cost — broken down by chat, automations, and background jobs."
2850
- open={openSection === "usage"}
2851
- onToggle={() => toggle("usage")}
2852
- >
2853
- <UsageSection />
2854
- </SettingsSection>
2855
- )}
3125
+ {/* Usage & spend */}
3126
+ {shouldShowSection("usage") && (
3127
+ <SettingsSection
3128
+ id={settingsSectionDomId("usage")}
3129
+ icon={<IconCoin size={14} />}
3130
+ title="Usage"
3131
+ subtitle="Track token consumption and estimated cost — broken down by chat, automations, and background jobs."
3132
+ open={openSection === "usage"}
3133
+ onToggle={() => toggle("usage")}
3134
+ >
3135
+ <UsageSection />
3136
+ </SettingsSection>
3137
+ )}
2856
3138
 
2857
- {/* A2A Agents */}
2858
- {shouldShowSection("a2a") && (
2859
- <SettingsSection
2860
- id={settingsSectionDomId("a2a")}
2861
- icon={<IconTopologyRing2 size={14} />}
2862
- title="Connected Agents (A2A)"
2863
- subtitle="Manage remote agents connected via the A2A protocol."
2864
- open={openSection === "a2a"}
2865
- onToggle={() => toggle("a2a")}
2866
- >
2867
- <AgentsSection />
2868
- </SettingsSection>
2869
- )}
2870
- </div>
3139
+ {/* A2A Agents */}
3140
+ {shouldShowSection("a2a") && (
3141
+ <SettingsSection
3142
+ id={settingsSectionDomId("a2a")}
3143
+ icon={<IconTopologyRing2 size={14} />}
3144
+ title="Connected Agents (A2A)"
3145
+ subtitle="Manage remote agents connected via the A2A protocol."
3146
+ open={openSection === "a2a"}
3147
+ onToggle={() => toggle("a2a")}
3148
+ >
3149
+ <AgentsSection />
3150
+ </SettingsSection>
3151
+ )}
3152
+ </div>
3153
+ </SettingsSurfaceProvider>
2871
3154
  );
2872
3155
  }
2873
3156
 
@@ -2899,9 +3182,10 @@ export function useAgentSettingsTabs(): SettingsTabItem[] {
2899
3182
  content: (
2900
3183
  <SettingsPanelContent
2901
3184
  {...baseProps}
3185
+ surface="page"
2902
3186
  sections={AGENT_SETTINGS_SECTIONS}
2903
3187
  showCapabilityStrip={false}
2904
- className="mx-auto w-full max-w-3xl p-0"
3188
+ className="mx-auto w-full max-w-2xl"
2905
3189
  />
2906
3190
  ),
2907
3191
  },
@@ -2914,12 +3198,24 @@ export function useAgentSettingsTabs(): SettingsTabItem[] {
2914
3198
  content: (
2915
3199
  <SettingsPanelContent
2916
3200
  {...baseProps}
3201
+ surface="page"
2917
3202
  sections={CONNECTION_SETTINGS_SECTIONS}
2918
3203
  showCapabilityStrip={false}
2919
- className="mx-auto w-full max-w-3xl p-0"
3204
+ className="mx-auto w-full max-w-2xl"
2920
3205
  />
2921
3206
  ),
2922
3207
  },
3208
+ {
3209
+ id: "organization",
3210
+ label: "Organization",
3211
+ icon: IconUsersGroup,
3212
+ keywords: "organization org team members invites collaborators",
3213
+ content: (
3214
+ <div className="mx-auto w-full max-w-2xl">
3215
+ <TeamPage showTitle={false} />
3216
+ </div>
3217
+ ),
3218
+ },
2923
3219
  {
2924
3220
  id: "workspace",
2925
3221
  label: "Workspace",
@@ -2929,9 +3225,10 @@ export function useAgentSettingsTabs(): SettingsTabItem[] {
2929
3225
  content: (
2930
3226
  <SettingsPanelContent
2931
3227
  {...baseProps}
3228
+ surface="page"
2932
3229
  sections={WORKSPACE_SETTINGS_SECTIONS}
2933
3230
  showCapabilityStrip={false}
2934
- className="mx-auto w-full max-w-3xl p-0"
3231
+ className="mx-auto w-full max-w-2xl"
2935
3232
  />
2936
3233
  ),
2937
3234
  },