@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.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +31 -0
- package/corpus/core/docs/content/faq.mdx +17 -0
- package/corpus/core/docs/content/notifications.mdx +12 -6
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/production-agent.ts +140 -46
- package/corpus/core/src/agent/tool-search.ts +71 -4
- package/corpus/core/src/application-state/store.ts +12 -1
- package/corpus/core/src/cli/index.ts +20 -0
- package/corpus/core/src/cli/upgrade.ts +798 -0
- package/corpus/core/src/client/AssistantChat.tsx +28 -15
- package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
- package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
- package/corpus/core/src/client/agent-chat-adapter.ts +68 -16
- package/corpus/core/src/client/chat/message-components.tsx +85 -8
- package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
- package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
- package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
- package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
- package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
- package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
- package/corpus/core/src/client/error-capture.ts +69 -7
- package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
- package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
- package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
- package/corpus/core/src/client/org/TeamPage.tsx +77 -71
- package/corpus/core/src/client/session-replay.ts +3 -97
- package/corpus/core/src/client/settings/SettingsPanel.tsx +738 -441
- package/corpus/core/src/client/settings/SettingsSection.tsx +161 -17
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
- package/corpus/core/src/client/sse-event-processor.ts +29 -2
- package/corpus/core/src/db-admin/agent-tools.ts +8 -2
- package/corpus/core/src/db-admin/operations.ts +116 -4
- package/corpus/core/src/db-admin/routes.ts +1 -0
- package/corpus/core/src/db-admin/types.ts +4 -0
- package/corpus/core/src/extensions/actions.ts +113 -5
- package/corpus/core/src/extensions/html-shell.ts +5 -4
- package/corpus/core/src/extensions/routes.ts +10 -0
- package/corpus/core/src/navigation/index.ts +1 -1
- package/corpus/core/src/notifications/channels.ts +88 -25
- package/corpus/core/src/notifications/registry.ts +17 -3
- package/corpus/core/src/notifications/types.ts +4 -1
- package/corpus/core/src/resources/handlers.ts +10 -8
- package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
- package/corpus/core/src/server/poll.ts +293 -8
- package/corpus/core/src/server/request-context.ts +7 -0
- package/corpus/core/src/styles/agent-conversation.css +1 -1
- package/corpus/core/src/styles/agent-native.css +27 -0
- package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
- package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/core/src/templates/default/AGENTS.md +14 -5
- package/corpus/core/src/templates/default/package.json +2 -1
- package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/core/src/templates/headless/AGENTS.md +13 -3
- package/corpus/core/src/templates/headless/package.json +1 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
- package/corpus/core/src/templates/workspace-root/AGENTS.md +17 -5
- package/corpus/core/src/templates/workspace-root/package.json +1 -0
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
- package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +5 -6
- package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/analytics/AGENTS.md +39 -18
- package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
- package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
- package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
- package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
- package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
- package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
- package/corpus/templates/analytics/actions/navigate.ts +4 -2
- package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
- package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
- package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
- package/corpus/templates/analytics/actions/save-monitor.ts +15 -1
- package/corpus/templates/analytics/actions/view-screen.ts +24 -0
- package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
- package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
- package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
- package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
- package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
- package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
- package/corpus/templates/analytics/app/i18n-data.ts +783 -3
- package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
- package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
- package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
- package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
- package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
- package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
- package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
- package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
- package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +157 -35
- package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
- package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +80 -220
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
- package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
- package/corpus/templates/analytics/app/routes/team.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
- package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
- 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
- package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
- package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
- package/corpus/templates/analytics/server/db/schema-monitoring.ts +5 -1
- package/corpus/templates/analytics/server/db/schema.ts +56 -0
- package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
- package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
- package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
- package/corpus/templates/analytics/server/lib/uptime-monitors.ts +65 -16
- package/corpus/templates/analytics/server/plugins/db.ts +122 -2
- package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/assets/AGENTS.md +4 -0
- package/corpus/templates/assets/app/routes/settings.tsx +1 -1
- package/corpus/templates/assets/app/routes/team.tsx +1 -1
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/brain/AGENTS.md +4 -0
- package/corpus/templates/brain/app/routes/team.tsx +1 -1
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/calendar/AGENTS.md +4 -0
- package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
- package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
- package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
- package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
- package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
- package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/chat/AGENTS.md +4 -0
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/chat/app/routes/settings.tsx +2 -2
- package/corpus/templates/chat/app/routes/team.tsx +1 -1
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
- package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
- package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
- package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
- package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
- package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
- package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
- package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
- package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
- package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
- package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
- package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
- package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
- package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
- package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
- package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
- package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +123 -3
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +15 -1
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -0
- package/corpus/templates/clips/desktop/src/styles.css +23 -1
- package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +1 -3
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +40 -6
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -2
- package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +3 -5
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +23 -19
- package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
- package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +0 -1
- package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
- package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
- package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
- package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/content/AGENTS.md +4 -0
- package/corpus/templates/content/actions/_batch-utils.ts +8 -0
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
- package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
- package/corpus/templates/content/actions/_database-utils.ts +6 -1
- package/corpus/templates/content/actions/_property-utils.ts +168 -0
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
- package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
- package/corpus/templates/content/actions/delete-document.ts +9 -13
- package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
- package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +47 -5
- package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
- package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
- package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
- package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
- package/corpus/templates/content/server/plugins/db.ts +19 -0
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/design/AGENTS.md +4 -0
- package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
- package/corpus/templates/design/app/routes/team.tsx +1 -1
- package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/dispatch/AGENTS.md +4 -0
- package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
- package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/forms/AGENTS.md +4 -0
- package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
- package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
- package/corpus/templates/forms/shared/navigation.ts +1 -1
- package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/macros/AGENTS.md +4 -0
- package/corpus/templates/macros/app/routes/settings.tsx +2 -2
- package/corpus/templates/macros/app/routes/team.tsx +1 -1
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
- package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
- package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/mail/AGENTS.md +4 -0
- package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
- package/corpus/templates/mail/server/handlers/media.ts +26 -1
- package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
- package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/plan/AGENTS.md +4 -0
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
- package/corpus/templates/plan/app/routes/settings.tsx +2 -2
- package/corpus/templates/plan/app/routes/team.tsx +1 -1
- package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
- package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
- package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
- package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/slides/AGENTS.md +4 -0
- package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
- package/corpus/templates/slides/app/routes/settings.tsx +2 -2
- package/corpus/templates/slides/app/routes/team.tsx +1 -1
- package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
- package/corpus/templates/slides/shared/api.ts +1 -1
- package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/agent/production-agent.d.ts +5 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +112 -42
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/tool-search.d.ts +2 -0
- package/dist/agent/tool-search.d.ts.map +1 -1
- package/dist/agent/tool-search.js +60 -4
- package/dist/agent/tool-search.js.map +1 -1
- package/dist/application-state/store.d.ts.map +1 -1
- package/dist/application-state/store.js +8 -2
- package/dist/application-state/store.js.map +1 -1
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/upgrade.d.ts +100 -0
- package/dist/cli/upgrade.d.ts.map +1 -0
- package/dist/cli/upgrade.js +678 -0
- package/dist/cli/upgrade.js.map +1 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +25 -14
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/HighlightedCodeBlock.d.ts +2 -0
- package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
- package/dist/client/HighlightedCodeBlock.js +10 -1
- package/dist/client/HighlightedCodeBlock.js.map +1 -1
- package/dist/client/PoweredByBadge.d.ts +1 -1
- package/dist/client/PoweredByBadge.d.ts.map +1 -1
- package/dist/client/PoweredByBadge.js +3 -9
- package/dist/client/PoweredByBadge.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +60 -13
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +61 -8
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +12 -0
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +136 -42
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
- package/dist/client/chat/widgets/DataTableWidget.js +19 -2
- package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
- package/dist/client/code-agent-chat-adapter.js +2 -9
- package/dist/client/code-agent-chat-adapter.js.map +1 -1
- package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
- package/dist/client/db-admin/TableEditor.js +19 -2
- package/dist/client/db-admin/TableEditor.js.map +1 -1
- package/dist/client/db-admin/export-utils.d.ts +2 -0
- package/dist/client/db-admin/export-utils.d.ts.map +1 -1
- package/dist/client/db-admin/export-utils.js +11 -3
- package/dist/client/db-admin/export-utils.js.map +1 -1
- package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
- package/dist/client/db-admin/useAgentSync.js +63 -0
- package/dist/client/db-admin/useAgentSync.js.map +1 -1
- package/dist/client/error-capture.d.ts.map +1 -1
- package/dist/client/error-capture.js +41 -7
- package/dist/client/error-capture.js.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.js +3 -1
- package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +32 -5
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.js +3 -1
- package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts.map +1 -1
- package/dist/client/extensions/portable-extension.js +1 -0
- package/dist/client/extensions/portable-extension.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +11 -6
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +5 -5
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/session-replay.d.ts +0 -8
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +3 -80
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +89 -33
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsSection.d.ts +19 -4
- package/dist/client/settings/SettingsSection.d.ts.map +1 -1
- package/dist/client/settings/SettingsSection.js +33 -4
- package/dist/client/settings/SettingsSection.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +21 -10
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +9 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +20 -2
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/db-admin/agent-tools.d.ts.map +1 -1
- package/dist/db-admin/agent-tools.js +7 -2
- package/dist/db-admin/agent-tools.js.map +1 -1
- package/dist/db-admin/operations.d.ts.map +1 -1
- package/dist/db-admin/operations.js +90 -4
- package/dist/db-admin/operations.js.map +1 -1
- package/dist/db-admin/routes.d.ts.map +1 -1
- package/dist/db-admin/routes.js +1 -0
- package/dist/db-admin/routes.js.map +1 -1
- package/dist/db-admin/types.d.ts +4 -0
- package/dist/db-admin/types.d.ts.map +1 -1
- package/dist/db-admin/types.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +85 -5
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/html-shell.d.ts +5 -4
- package/dist/extensions/html-shell.d.ts.map +1 -1
- package/dist/extensions/html-shell.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +8 -0
- package/dist/extensions/routes.js.map +1 -1
- package/dist/navigation/index.d.ts +1 -1
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +1 -1
- package/dist/navigation/index.js.map +1 -1
- package/dist/notifications/channels.d.ts +8 -3
- package/dist/notifications/channels.d.ts.map +1 -1
- package/dist/notifications/channels.js +61 -22
- package/dist/notifications/channels.js.map +1 -1
- package/dist/notifications/registry.d.ts.map +1 -1
- package/dist/notifications/registry.js +14 -3
- package/dist/notifications/registry.js.map +1 -1
- package/dist/notifications/types.d.ts +4 -1
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/notifications/types.js.map +1 -1
- package/dist/resources/handlers.d.ts +5 -0
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +9 -8
- package/dist/resources/handlers.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +5 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +2 -2
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/poll.d.ts +12 -4
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +236 -9
- package/dist/server/poll.js.map +1 -1
- package/dist/server/request-context.d.ts +7 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js.map +1 -1
- package/dist/styles/agent-conversation.css +1 -1
- package/dist/styles/agent-native.css +27 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
- package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
- package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/templates/default/AGENTS.md +14 -5
- package/dist/templates/default/package.json +2 -1
- package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/templates/headless/AGENTS.md +13 -3
- package/dist/templates/headless/package.json +1 -0
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
- package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
- package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/dist/templates/workspace-core/AGENTS.md +7 -1
- package/dist/templates/workspace-root/AGENTS.md +17 -5
- package/dist/templates/workspace-root/package.json +1 -0
- package/docs/content/faq.mdx +17 -0
- package/docs/content/notifications.mdx +12 -6
- package/package.json +2 -2
- package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
- package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
- package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/src/templates/default/AGENTS.md +14 -5
- package/src/templates/default/package.json +2 -1
- package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/src/templates/headless/AGENTS.md +13 -3
- package/src/templates/headless/package.json +1 -0
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
- package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
- package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
- package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
- package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
- package/src/templates/workspace-core/AGENTS.md +7 -1
- package/src/templates/workspace-root/AGENTS.md +17 -5
- package/src/templates/workspace-root/package.json +1 -0
- 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 {
|
|
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=
|
|
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=
|
|
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={
|
|
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={
|
|
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=
|
|
151
|
-
|
|
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
|
|
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
|
|
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="
|
|
443
|
+
<div className={cn("font-medium text-foreground", titleCls)}>
|
|
366
444
|
Builder.io
|
|
367
445
|
</div>
|
|
368
|
-
<span
|
|
369
|
-
|
|
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-
|
|
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-
|
|
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="
|
|
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={
|
|
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
|
|
422
|
-
|
|
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
|
|
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
|
|
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-
|
|
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={
|
|
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="
|
|
582
|
+
<div className={cn("font-medium text-foreground", titleCls)}>
|
|
478
583
|
Set up manually
|
|
479
584
|
</div>
|
|
480
585
|
{sourceBadge ? (
|
|
481
|
-
<span
|
|
482
|
-
|
|
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-
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
1053
|
-
|
|
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
|
|
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=
|
|
1186
|
+
className={pillButtonClass(isPage, "solid")}
|
|
1072
1187
|
>
|
|
1073
1188
|
{saving ? (
|
|
1074
|
-
<IconLoader2
|
|
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=
|
|
1206
|
+
className={pillButtonClass(isPage, "outline")}
|
|
1089
1207
|
>
|
|
1090
1208
|
{testing ? (
|
|
1091
1209
|
<span className="flex items-center gap-1">
|
|
1092
|
-
<IconLoader2
|
|
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=
|
|
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=
|
|
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
|
|
1126
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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=
|
|
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="
|
|
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=
|
|
1577
|
+
className={pillButtonClass(isPage, "solid")}
|
|
1413
1578
|
>
|
|
1414
1579
|
{saving ? (
|
|
1415
|
-
<IconLoader2
|
|
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=
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
1584
|
-
|
|
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=
|
|
1797
|
+
className={emailInputCls}
|
|
1598
1798
|
/>
|
|
1599
1799
|
<button
|
|
1600
1800
|
onClick={saveResend}
|
|
1601
1801
|
disabled={!resendKey.trim() || saving}
|
|
1602
|
-
className=
|
|
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
|
|
1616
|
-
|
|
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=
|
|
1834
|
+
className={emailInputCls}
|
|
1630
1835
|
/>
|
|
1631
1836
|
{!resendConfigured ? null : (
|
|
1632
1837
|
<button
|
|
1633
1838
|
onClick={saveResend}
|
|
1634
1839
|
disabled={!fromAddr.trim() || saving}
|
|
1635
|
-
className=
|
|
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
|
|
1657
|
-
|
|
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=
|
|
1880
|
+
className={emailInputCls}
|
|
1671
1881
|
/>
|
|
1672
1882
|
<button
|
|
1673
1883
|
onClick={saveSendgrid}
|
|
1674
1884
|
disabled={!sendgridKey.trim() || saving}
|
|
1675
|
-
className=
|
|
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
|
|
1689
|
-
|
|
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=
|
|
1917
|
+
className={emailInputCls}
|
|
1703
1918
|
/>
|
|
1704
1919
|
{!sendgridConfigured ? null : (
|
|
1705
1920
|
<button
|
|
1706
1921
|
onClick={saveSendgrid}
|
|
1707
1922
|
disabled={!fromAddr.trim() || saving}
|
|
1708
|
-
className=
|
|
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
|
|
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
|
|
2109
|
+
<p
|
|
2110
|
+
className={cn(
|
|
2111
|
+
"font-medium text-foreground",
|
|
2112
|
+
subTextClass(isPage),
|
|
2113
|
+
)}
|
|
2114
|
+
>
|
|
1889
2115
|
Max iterations
|
|
1890
2116
|
</p>
|
|
1891
|
-
<p
|
|
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
|
|
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=
|
|
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=
|
|
2160
|
+
className={pillButtonClass(isPage, "solid")}
|
|
1921
2161
|
>
|
|
1922
2162
|
{saving ? (
|
|
1923
|
-
<IconLoader2
|
|
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=
|
|
2181
|
+
className={pillButtonClass(isPage, "outline")}
|
|
1939
2182
|
>
|
|
1940
2183
|
Reset
|
|
1941
2184
|
</button>
|
|
1942
2185
|
</div>
|
|
1943
2186
|
{!settings.canUpdate && (
|
|
1944
|
-
<p
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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=
|
|
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
|
-
<
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
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
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
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
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2835
|
+
{/* Account */}
|
|
2836
|
+
{shouldShowSection("account") && (
|
|
2837
|
+
<AccountSectionInner
|
|
2838
|
+
open={openSection === "account"}
|
|
2839
|
+
onToggle={() => toggle("account")}
|
|
2840
|
+
/>
|
|
2841
|
+
)}
|
|
2560
2842
|
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
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
|
-
|
|
2577
|
-
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
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
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2866
|
+
{/* Agent limits */}
|
|
2867
|
+
{shouldShowSection("limits") && (
|
|
2868
|
+
<AgentLimitsSectionInner
|
|
2869
|
+
open={openSection === "limits"}
|
|
2870
|
+
onToggle={() => toggle("limits")}
|
|
2871
|
+
/>
|
|
2872
|
+
)}
|
|
2591
2873
|
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
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
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
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
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
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
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
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
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
2676
|
-
|
|
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
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
|
|
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
|
-
|
|
2711
|
-
|
|
2712
|
-
|
|
2713
|
-
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
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="
|
|
2730
|
-
trackingFlow="
|
|
3080
|
+
trackingSource="browser_settings"
|
|
3081
|
+
trackingFlow="browser_automation"
|
|
2731
3082
|
/>
|
|
2732
|
-
|
|
2733
|
-
|
|
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
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
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="
|
|
2761
|
-
trackingFlow="
|
|
3103
|
+
trackingSource="background_agent_settings"
|
|
3104
|
+
trackingFlow="background_agent"
|
|
2762
3105
|
/>
|
|
2763
|
-
|
|
2764
|
-
|
|
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
|
-
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
|
|
2832
|
-
|
|
2833
|
-
|
|
2834
|
-
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
|
|
2838
|
-
|
|
2839
|
-
|
|
2840
|
-
|
|
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
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
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
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
3231
|
+
className="mx-auto w-full max-w-2xl"
|
|
2935
3232
|
/>
|
|
2936
3233
|
),
|
|
2937
3234
|
},
|