From 5f0c4079793618c4031bcc6c401fc7426ed6ce03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Brand=C3=A3o?= Date: Sat, 10 Oct 2026 15:21:37 -0300 Subject: [PATCH 01/17] refactor(frontend): remove the SaaS layer from the dashboard Thinker is self-hosted only, so the inherited Manifest Cloud UI goes. The frontend leaves first so no screen breaks when #14/#15 drop the matching backend endpoints. - Billing/plans: delete PlanPicker, UpgradeSuccessModal, UsageLimitBanner, the /upgrade page, the Register ?step=plan picker, the plan stores, the plan-based range locks on the analytics pages, the plan-limit upgrade CTAs in the request views, the Account billing and usage-email sections, and the @better-auth/stripe client plugin and dependency. - API Bot: delete the banner, the sidebar card, the dithered ground, their stylesheet and the SVG asset. - GitHub stars: drop the header star button and its /api/v1/github call. - Free Models: delete the page, its route, its API client and the assets only it used. - Managed Gemini Free: drop the provider entry, icon alias, background /ensure provisioning call and the Calendly key URL. - Cloud branches: checkIsSelfHosted() is gone and every screen behaves as self-hosted (Local providers always listed, local logs copy, CLI login pinned to this host, discovery after signup and setup). Drop the Manifest Cloud origin mapping, the cloud email card, the VITE_MANIFEST_SELFHOSTED read and the Dockerfile ENV that set it. - Help: drop the Manifest Calendly booking link. - Remove the dead CSS for all of the above, update the tests and the inherited dev guide. Closes #12 Co-Authored-By: Claude Opus 5.5 --- design-system/registry/components.json | 429 ++---------- design-system/registry/llms.txt | 130 ++-- docker/Dockerfile | 3 - docs/dev/manifest-guide.md | 6 +- package-lock.json | 17 - packages/frontend/package.json | 1 - .../public/api-bot-works-with-any-api.svg | 612 ------------------ packages/frontend/public/icons/caret-down.svg | 1 - .../public/icons/cerebras-dark-mode.svg | 1 - .../public/icons/github-dark-mode.svg | 1 - .../public/icons/ollama-dark-mode.svg | 1 - .../frontend/public/icons/zai-dark-mode.svg | 1 - packages/frontend/src/App.tsx | 4 - .../frontend/src/components/AddAgentModal.tsx | 20 +- .../src/components/ApiBotAnnouncement.tsx | 60 -- .../frontend/src/components/ApiBotBanner.tsx | 55 -- .../frontend/src/components/AuthGuard.tsx | 49 +- .../src/components/CloudEmailInfo.tsx | 24 - .../src/components/CustomProviderForm.tsx | 20 +- .../frontend/src/components/DitherGround.tsx | 11 - .../src/components/EmailProviderSection.tsx | 2 +- .../frontend/src/components/GuestGuard.tsx | 6 - packages/frontend/src/components/Header.tsx | 126 +--- .../src/components/MessageDetails.tsx | 22 +- .../src/components/ModelPickerModal.tsx | 2 +- .../src/components/NoConnectionsPrompt.tsx | 42 +- .../frontend/src/components/PlanPicker.tsx | 187 ------ .../frontend/src/components/ProviderIcon.tsx | 1 - .../src/components/ProviderSelectContent.tsx | 9 +- packages/frontend/src/components/Sidebar.tsx | 106 +-- .../src/components/UpgradeSuccessModal.tsx | 81 --- .../src/components/UsageLimitBanner.tsx | 103 --- .../src/components/VersionIndicator.tsx | 7 +- .../src/components/message-table-cells.tsx | 30 +- packages/frontend/src/index.tsx | 12 +- packages/frontend/src/pages/Account.tsx | 226 +------ packages/frontend/src/pages/Discovery.tsx | 20 +- packages/frontend/src/pages/FreeModels.tsx | 379 ----------- .../frontend/src/pages/GlobalOverview.tsx | 82 +-- packages/frontend/src/pages/Help.tsx | 40 +- packages/frontend/src/pages/Limits.tsx | 46 +- packages/frontend/src/pages/MessageLog.tsx | 39 +- packages/frontend/src/pages/Overview.tsx | 55 +- packages/frontend/src/pages/Register.tsx | 325 ++++------ .../src/pages/SettingsRecordingSection.tsx | 11 +- packages/frontend/src/pages/Setup.tsx | 14 +- packages/frontend/src/pages/Upgrade.tsx | 374 ----------- packages/frontend/src/pages/Welcome.tsx | 77 +-- .../frontend/src/pages/integrations/Cli.tsx | 27 +- .../src/pages/providers/ConnectionDetail.tsx | 29 +- .../frontend/src/pages/providers/Local.tsx | 22 +- packages/frontend/src/services/api.ts | 1 - .../frontend/src/services/api/analytics.ts | 71 +- packages/frontend/src/services/api/billing.ts | 33 - packages/frontend/src/services/api/core.ts | 5 +- .../frontend/src/services/api/free-models.ts | 32 - .../frontend/src/services/api/providers.ts | 64 +- packages/frontend/src/services/auth-client.ts | 17 +- .../frontend/src/services/auth-redirects.ts | 6 +- .../frontend/src/services/billing-display.ts | 31 - packages/frontend/src/services/discovery.ts | 29 - .../frontend/src/services/dither-ground.ts | 169 ----- packages/frontend/src/services/formatters.ts | 1 - .../src/services/install-endpoints.ts | 13 +- .../src/services/message-error-taxonomy.ts | 15 - .../frontend/src/services/plan-range-lock.ts | 30 - .../frontend/src/services/plan-selection.ts | 25 - packages/frontend/src/services/plan-store.ts | 66 -- .../src/services/provider-api-key-urls.ts | 13 +- packages/frontend/src/services/providers.ts | 6 - .../frontend/src/services/setup-status.ts | 9 - packages/frontend/src/styles/agents.css | 375 ----------- packages/frontend/src/styles/api-bot.css | 195 ------ packages/frontend/src/styles/auth.css | 176 ----- packages/frontend/src/styles/controls.css | 133 ---- .../frontend/src/styles/custom-select.css | 17 - packages/frontend/src/styles/data.css | 96 --- packages/frontend/src/styles/modals.css | 186 ------ .../frontend/src/styles/notifications.css | 30 - packages/frontend/src/styles/theme.css | 13 +- .../tests/components/AddAgentModal.test.tsx | 22 +- .../components/ApiBotAnnouncement.test.tsx | 42 -- .../tests/components/ApiBotBanner.test.tsx | 44 -- .../frontend/tests/components/App.test.tsx | 4 - .../tests/components/AuthGuard.test.tsx | 96 +-- .../tests/components/CloudEmailInfo.test.tsx | 26 - .../components/CustomProviderForm.test.tsx | 14 +- .../tests/components/GuestGuard.test.tsx | 26 +- .../frontend/tests/components/Header.test.tsx | 179 +---- .../frontend/tests/components/Help.test.tsx | 42 +- .../tests/components/MessageDetails.test.tsx | 9 +- .../components/MessageTableStatus.test.tsx | 6 +- .../components/NoConnectionsPrompt.test.tsx | 46 +- .../tests/components/PlanPicker.test.tsx | 71 -- .../components/PlaygroundEmptyState.test.tsx | 4 - .../tests/components/ProviderIcon.test.tsx | 1 - ...derSelectContent-copilot-accounts.test.tsx | 4 - .../ProviderSelectContent-deeplink.test.tsx | 1 - .../components/ProviderSelectContent.test.tsx | 1 - .../components/ProviderSelectModal.test.tsx | 1 - .../tests/components/Sidebar.test.tsx | 120 +--- .../tests/components/SocialButtons.test.tsx | 17 +- .../components/UpgradeSuccessModal.test.tsx | 36 -- .../components/UsageLimitBanner.test.tsx | 125 ---- .../components/VersionIndicator.test.tsx | 30 +- .../frontend/tests/pages/Account.test.tsx | 311 +-------- .../tests/pages/AgentProviders.test.tsx | 8 - packages/frontend/tests/pages/Cli.test.tsx | 63 +- .../frontend/tests/pages/Discovery.test.tsx | 31 +- .../frontend/tests/pages/FreeModels.test.tsx | 359 ---------- .../tests/pages/GlobalOverviewFilter.test.tsx | 43 -- .../tests/pages/Limits-interactions.test.tsx | 6 - packages/frontend/tests/pages/Limits.test.tsx | 50 +- packages/frontend/tests/pages/Login.test.tsx | 45 +- .../frontend/tests/pages/McpServer.test.tsx | 8 +- .../frontend/tests/pages/MessageLog.test.tsx | 21 +- .../frontend/tests/pages/Overview.test.tsx | 24 +- .../pages/ProviderOverviewPages.test.tsx | 40 +- .../tests/pages/ProviderPages.test.tsx | 22 - .../frontend/tests/pages/Register.test.tsx | 211 +----- .../pages/SettingsRecordingSection.test.tsx | 24 +- packages/frontend/tests/pages/Setup.test.tsx | 17 +- .../frontend/tests/pages/Upgrade.test.tsx | 234 ------- .../frontend/tests/services/api-extra.test.ts | 11 - .../tests/services/api/billing.test.ts | 109 ---- .../tests/services/api/providers.test.ts | 82 +-- .../tests/services/auth-client.test.ts | 27 +- .../tests/services/auth-redirects.test.ts | 44 +- .../tests/services/billing-display.test.ts | 49 -- .../frontend/tests/services/discovery.test.ts | 37 -- .../tests/services/dither-ground.test.ts | 207 ------ .../tests/services/formatters.test.ts | 1 - .../services/message-error-taxonomy.test.ts | 45 -- .../tests/services/plan-range-lock.test.ts | 80 --- .../tests/services/plan-selection.test.ts | 42 -- .../tests/services/plan-store.test.ts | 76 --- .../frontend/tests/services/providers.test.ts | 11 +- .../tests/services/setup-status.test.ts | 46 +- .../tests/services/use-overview-range.test.ts | 6 - 139 files changed, 596 insertions(+), 8566 deletions(-) delete mode 100644 packages/frontend/public/api-bot-works-with-any-api.svg delete mode 100644 packages/frontend/public/icons/caret-down.svg delete mode 100644 packages/frontend/public/icons/cerebras-dark-mode.svg delete mode 100644 packages/frontend/public/icons/github-dark-mode.svg delete mode 100644 packages/frontend/public/icons/ollama-dark-mode.svg delete mode 100644 packages/frontend/public/icons/zai-dark-mode.svg delete mode 100644 packages/frontend/src/components/ApiBotAnnouncement.tsx delete mode 100644 packages/frontend/src/components/ApiBotBanner.tsx delete mode 100644 packages/frontend/src/components/CloudEmailInfo.tsx delete mode 100644 packages/frontend/src/components/DitherGround.tsx delete mode 100644 packages/frontend/src/components/PlanPicker.tsx delete mode 100644 packages/frontend/src/components/UpgradeSuccessModal.tsx delete mode 100644 packages/frontend/src/components/UsageLimitBanner.tsx delete mode 100644 packages/frontend/src/pages/FreeModels.tsx delete mode 100644 packages/frontend/src/pages/Upgrade.tsx delete mode 100644 packages/frontend/src/services/api/billing.ts delete mode 100644 packages/frontend/src/services/api/free-models.ts delete mode 100644 packages/frontend/src/services/billing-display.ts delete mode 100644 packages/frontend/src/services/dither-ground.ts delete mode 100644 packages/frontend/src/services/message-error-taxonomy.ts delete mode 100644 packages/frontend/src/services/plan-range-lock.ts delete mode 100644 packages/frontend/src/services/plan-selection.ts delete mode 100644 packages/frontend/src/services/plan-store.ts delete mode 100644 packages/frontend/src/styles/api-bot.css delete mode 100644 packages/frontend/tests/components/ApiBotAnnouncement.test.tsx delete mode 100644 packages/frontend/tests/components/ApiBotBanner.test.tsx delete mode 100644 packages/frontend/tests/components/CloudEmailInfo.test.tsx delete mode 100644 packages/frontend/tests/components/PlanPicker.test.tsx delete mode 100644 packages/frontend/tests/components/UpgradeSuccessModal.test.tsx delete mode 100644 packages/frontend/tests/components/UsageLimitBanner.test.tsx delete mode 100644 packages/frontend/tests/pages/FreeModels.test.tsx delete mode 100644 packages/frontend/tests/pages/Upgrade.test.tsx delete mode 100644 packages/frontend/tests/services/api/billing.test.ts delete mode 100644 packages/frontend/tests/services/billing-display.test.ts delete mode 100644 packages/frontend/tests/services/dither-ground.test.ts delete mode 100644 packages/frontend/tests/services/message-error-taxonomy.test.ts delete mode 100644 packages/frontend/tests/services/plan-range-lock.test.ts delete mode 100644 packages/frontend/tests/services/plan-selection.test.ts delete mode 100644 packages/frontend/tests/services/plan-store.test.ts diff --git a/design-system/registry/components.json b/design-system/registry/components.json index 7b063afc..24652e0b 100644 --- a/design-system/registry/components.json +++ b/design-system/registry/components.json @@ -307,28 +307,11 @@ "agents.css" ] }, - "account-email-footer": { - "classes": [ - "account-email-footer" - ], - "files": [ - "agents.css" - ] - }, - "account-email-toggle": { - "classes": [ - "account-email-toggle--disabled" - ], - "files": [ - "agents.css" - ] - }, "account-modal": { "classes": [ "account-modal", "account-modal--standalone", - "account-modal__inner", - "account-modal__inner--upgrade" + "account-modal__inner" ], "files": [ "agents.css" @@ -513,31 +496,6 @@ "routing-providers.css" ] }, - "api-bot-banner": { - "classes": [ - "api-bot-banner", - "api-bot-banner__text" - ], - "files": [ - "api-bot.css" - ] - }, - "api-bot-btn": { - "classes": [ - "api-bot-btn" - ], - "files": [ - "api-bot.css" - ] - }, - "api-bot-close": { - "classes": [ - "api-bot-close" - ], - "files": [ - "api-bot.css" - ] - }, "api-key-display": { "classes": [ "api-key-display__code", @@ -760,37 +718,6 @@ "data.css" ] }, - "billing-footer": { - "classes": [ - "billing-footer", - "billing-footer__actions", - "billing-footer__link", - "billing-footer__note" - ], - "files": [ - "agents.css" - ] - }, - "billing-stat": { - "classes": [ - "billing-stat", - "billing-stat__cancel", - "billing-stat__label", - "billing-stat__meta", - "billing-stat__value" - ], - "files": [ - "agents.css" - ] - }, - "billing-stats": { - "classes": [ - "billing-stats" - ], - "files": [ - "agents.css" - ] - }, "breadcrumb": { "classes": [ "breadcrumb" @@ -810,9 +737,7 @@ "btn--sm" ], "files": [ - "agents.css", "controls.css", - "data.css", "layout.css", "limits.css", "modals.css", @@ -872,17 +797,6 @@ "syntax-highlight.css" ] }, - "cloud-email-info": { - "classes": [ - "cloud-email-info", - "cloud-email-info__desc", - "cloud-email-info__icon", - "cloud-email-info__title" - ], - "files": [ - "notifications.css" - ] - }, "complexity-empty": { "classes": [ "complexity-empty", @@ -1201,14 +1115,6 @@ "discovery.css" ] }, - "dither-ground": { - "classes": [ - "dither-ground" - ], - "files": [ - "api-bot.css" - ] - }, "drawer": { "classes": [ "drawer", @@ -1319,8 +1225,7 @@ "error-autofix-row__meta-label", "error-autofix-row__meta-table", "error-autofix-row__meta-value", - "error-autofix-row__title", - "error-autofix-row__upgrade" + "error-autofix-row__title" ], "files": [ "data.css" @@ -1455,55 +1360,6 @@ "wizard.css" ] }, - "free-models-accordion": { - "classes": [ - "free-models-accordion", - "free-models-accordion--open" - ], - "files": [ - "data.css" - ] - }, - "free-models-base-url-row": { - "classes": [ - "free-models-base-url-row" - ], - "files": [ - "data.css" - ] - }, - "free-models-caret": { - "classes": [ - "free-models-caret" - ], - "files": [ - "data.css" - ] - }, - "free-models-disabled-btn": { - "classes": [ - "free-models-disabled-btn" - ], - "files": [ - "data.css" - ] - }, - "free-models-logo-dark": { - "classes": [ - "free-models-logo-dark" - ], - "files": [ - "data.css" - ] - }, - "free-models-logo-light": { - "classes": [ - "free-models-logo-light" - ], - "files": [ - "data.css" - ] - }, "free-tag": { "classes": [ "free-tag" @@ -1540,24 +1396,13 @@ "header__dropdown-name", "header__gear", "header__gear-btn", - "header__github-icon", - "header__github-star", - "header__github-star-action", - "header__github-star-btn", - "header__github-star-close", - "header__github-star-count", - "header__github-star-label", "header__left", "header__logo", "header__logo-img", "header__logo-img--dark", "header__logo-img--light", - "header__mode-badge", - "header__mode-badge--dev", - "header__pro-badge", "header__right", - "header__separator", - "header__star-separator" + "header__separator" ], "files": [ "controls.css", @@ -2514,32 +2359,6 @@ "wizard.css" ] }, - "plan-picker": { - "classes": [ - "plan-picker", - "plan-picker__amount", - "plan-picker__badge", - "plan-picker__card", - "plan-picker__card--expanded", - "plan-picker__card--pro", - "plan-picker__cta", - "plan-picker__details", - "plan-picker__features", - "plan-picker__name", - "plan-picker__period", - "plan-picker__price-inline", - "plan-picker__radio", - "plan-picker__radio-dot", - "plan-picker__row", - "plan-picker__section-header", - "plan-picker__section-subtitle", - "plan-picker__section-title", - "plan-picker__usage" - ], - "files": [ - "auth.css" - ] - }, "platform-icon": { "classes": [ "platform-icon" @@ -2713,14 +2532,6 @@ "playground.css" ] }, - "pro-range-badge": { - "classes": [ - "pro-range-badge" - ], - "files": [ - "custom-select.css" - ] - }, "provider-auth-badge": { "classes": [ "provider-auth-badge", @@ -3641,52 +3452,13 @@ "sidebar__logo", "sidebar__logo-dot", "sidebar__section-add", - "sidebar__section-label", - "sidebar__spacer" + "sidebar__section-label" ], "files": [ "controls.css", "theme.css" ] }, - "sidebar-api-bot": { - "classes": [ - "sidebar-api-bot", - "sidebar-api-bot__close", - "sidebar-api-bot__image", - "sidebar-api-bot__text", - "sidebar-api-bot__title" - ], - "files": [ - "api-bot.css" - ] - }, - "sidebar-upgrade": { - "classes": [ - "sidebar-upgrade" - ], - "files": [ - "modals.css" - ] - }, - "sidebar-usage": { - "classes": [ - "sidebar-usage", - "sidebar-usage__alert", - "sidebar-usage__bar", - "sidebar-usage__count", - "sidebar-usage__count--danger", - "sidebar-usage__fill", - "sidebar-usage__fill--danger", - "sidebar-usage__fill--warning", - "sidebar-usage__header", - "sidebar-usage__month", - "sidebar-usage__title" - ], - "files": [ - "modals.css" - ] - }, "skeleton": { "classes": [ "skeleton", @@ -4061,107 +3833,6 @@ "theme.css" ] }, - "upgrade-back": { - "classes": [ - "upgrade-back" - ], - "files": [ - "agents.css" - ] - }, - "upgrade-limit-notice": { - "classes": [ - "upgrade-limit-notice" - ], - "files": [ - "agents.css" - ] - }, - "upgrade-page-header": { - "classes": [ - "upgrade-page-header", - "upgrade-page-header--centered", - "upgrade-page-header__copy" - ], - "files": [ - "agents.css" - ] - }, - "upgrade-plan-card": { - "classes": [ - "upgrade-plan-card", - "upgrade-plan-card--pro", - "upgrade-plan-card__amount", - "upgrade-plan-card__amount--custom", - "upgrade-plan-card__badge", - "upgrade-plan-card__body", - "upgrade-plan-card__cta", - "upgrade-plan-card__desc", - "upgrade-plan-card__divider", - "upgrade-plan-card__features", - "upgrade-plan-card__features-intro", - "upgrade-plan-card__footer", - "upgrade-plan-card__header", - "upgrade-plan-card__no-commitment", - "upgrade-plan-card__period", - "upgrade-plan-card__price", - "upgrade-plan-card__usage" - ], - "files": [ - "agents.css" - ] - }, - "upgrade-plan-grid": { - "classes": [ - "upgrade-plan-grid" - ], - "files": [ - "agents.css" - ] - }, - "upgrade-pro-current": { - "classes": [ - "upgrade-pro-current", - "upgrade-pro-current__card", - "upgrade-pro-current__status" - ], - "files": [ - "agents.css" - ] - }, - "upgrade-success-modal": { - "classes": [ - "upgrade-success-modal", - "upgrade-success-modal__body", - "upgrade-success-modal__done", - "upgrade-success-modal__features", - "upgrade-success-modal__icon", - "upgrade-success-modal__subtitle", - "upgrade-success-modal__title" - ], - "files": [ - "modals.css" - ] - }, - "upgrade-terms": { - "classes": [ - "upgrade-terms" - ], - "files": [ - "agents.css" - ] - }, - "usage-limit-banner": { - "classes": [ - "usage-limit-banner", - "usage-limit-banner__actions", - "usage-limit-banner__btn", - "usage-limit-banner__text" - ], - "files": [ - "modals.css" - ] - }, "version-indicator": { "classes": [ "version-indicator", @@ -4447,154 +4118,154 @@ "prop": "box-shadow", "value": "rgba(0, 0, 0, 0.08) 0px 0px 0px 1px", "file": "theme.css", - "line": 197 + "line": 196 }, { "selector": ".trend--up", "prop": "color", "value": "hsl(var(--success))", "file": "theme.css", - "line": 238 + "line": 237 }, { "selector": ".trend--up", "prop": "background", "value": "hsl(var(--success) / 0.1)", "file": "theme.css", - "line": 239 + "line": 238 }, { "selector": ".trend--down", "prop": "color", "value": "hsl(var(--destructive))", "file": "theme.css", - "line": 243 + "line": 242 }, { "selector": ".trend--down", "prop": "background", "value": "hsl(var(--destructive) / 0.1)", "file": "theme.css", - "line": 244 + "line": 243 }, { "selector": ".panel", "prop": "box-shadow", "value": "rgba(0, 0, 0, 0.08) 0px 0px 0px 1px", "file": "theme.css", - "line": 269 + "line": 268 }, { "selector": ".chart-card", "prop": "box-shadow", "value": "rgba(0, 0, 0, 0.08) 0px 0px 0px 1px", "file": "theme.css", - "line": 285 + "line": 284 }, { "selector": ".chart-card__header", "prop": "align-items", "value": "flex-end", "file": "theme.css", - "line": 291 + "line": 290 }, { "selector": ".chart-card__value-row", "prop": "align-items", "value": "baseline", "file": "theme.css", - "line": 323 + "line": 322 }, { "selector": ".feed-item", "prop": "align-items", "value": "center", "file": "theme.css", - "line": 587 + "line": 586 }, { "selector": ".feed-item", "prop": "gap", "value": "var(--gap-md)", "file": "theme.css", - "line": 588 + "line": 587 }, { "selector": ".feed-item", "prop": "padding", "value": "10px 0", "file": "theme.css", - "line": 589 + "line": 588 }, { "selector": ".sidebar", "prop": "padding", "value": "var(--gap-lg) 0 0 0", "file": "theme.css", - "line": 785 + "line": 784 }, { "selector": ".theme-toggle", "prop": "padding", "value": "6px 12px", "file": "theme.css", - "line": 943 + "line": 938 }, { "selector": ".theme-toggle", "prop": "width", "value": "100%", "file": "theme.css", - "line": 952 + "line": 947 }, { "selector": ".chart-tooltip", "prop": "font-size", "value": "var(--font-size-xs)", "file": "theme.css", - "line": 1029 + "line": 1024 }, { "selector": ".expandable-card__fade", "prop": "height", "value": "64px", "file": "theme.css", - "line": 1060 + "line": 1055 }, { "selector": ".expandable-card__fade", "prop": "background", "value": "linear-gradient(transparent, hsl(var(--card)) 70%)", "file": "theme.css", - "line": 1061 + "line": 1056 }, { "selector": ".expandable-card__fade", "prop": "padding-bottom", "value": "12px", "file": "theme.css", - "line": 1066 + "line": 1061 }, { "selector": ".modal", "prop": "box-shadow", "value": "rgba(0, 0, 0, 0.08) 0px 0px 0px 1px,\n 0 25px 50px -12px rgb(0 0 0 / 0.25)", "file": "theme.css", - "line": 1117 + "line": 1112 }, { "selector": ".modal__close", "prop": "width", "value": "2rem", "file": "theme.css", - "line": 1142 + "line": 1137 }, { "selector": ".modal__close", "prop": "height", "value": "2rem", "file": "theme.css", - "line": 1143 + "line": 1138 }, { "selector": ".toast", @@ -4674,7 +4345,7 @@ "value": "var(--card-shadow)", "file": "cards.css", "line": 7, - "losesTo": "theme.css:197" + "losesTo": "theme.css:196" }, { "selector": ".trend--up", @@ -4682,7 +4353,7 @@ "value": "hsl(var(--muted-foreground))", "file": "cards.css", "line": 48, - "losesTo": "theme.css:238" + "losesTo": "theme.css:237" }, { "selector": ".trend--down", @@ -4690,7 +4361,7 @@ "value": "hsl(var(--muted-foreground))", "file": "cards.css", "line": 48, - "losesTo": "theme.css:243" + "losesTo": "theme.css:242" }, { "selector": ".trend--up", @@ -4698,7 +4369,7 @@ "value": "hsl(var(--muted))", "file": "cards.css", "line": 49, - "losesTo": "theme.css:239" + "losesTo": "theme.css:238" }, { "selector": ".trend--down", @@ -4706,7 +4377,7 @@ "value": "hsl(var(--muted))", "file": "cards.css", "line": 49, - "losesTo": "theme.css:244" + "losesTo": "theme.css:243" }, { "selector": ".panel", @@ -4714,7 +4385,7 @@ "value": "var(--card-shadow)", "file": "cards.css", "line": 59, - "losesTo": "theme.css:269" + "losesTo": "theme.css:268" }, { "selector": ".view-more-link", @@ -4730,7 +4401,7 @@ "value": "var(--card-shadow)", "file": "cards.css", "line": 86, - "losesTo": "theme.css:285" + "losesTo": "theme.css:284" }, { "selector": ".chart-card__header", @@ -4738,7 +4409,7 @@ "value": "stretch", "file": "cards.css", "line": 92, - "losesTo": "theme.css:291" + "losesTo": "theme.css:290" }, { "selector": ".chart-card__value-row", @@ -4746,7 +4417,7 @@ "value": "center", "file": "cards.css", "line": 160, - "losesTo": "theme.css:323" + "losesTo": "theme.css:322" }, { "selector": ".chart-tooltip", @@ -4754,7 +4425,7 @@ "value": "var(--tooltip-font-size)", "file": "charts.css", "line": 78, - "losesTo": "theme.css:1029" + "losesTo": "theme.css:1024" }, { "selector": ".expandable-card__fade", @@ -4762,7 +4433,7 @@ "value": "80px", "file": "charts.css", "line": 110, - "losesTo": "theme.css:1060" + "losesTo": "theme.css:1055" }, { "selector": ".expandable-card__fade", @@ -4770,7 +4441,7 @@ "value": "linear-gradient(transparent, hsl(var(--card)) 60%)", "file": "charts.css", "line": 111, - "losesTo": "theme.css:1061" + "losesTo": "theme.css:1056" }, { "selector": ".expandable-card__fade", @@ -4778,7 +4449,7 @@ "value": "16px", "file": "charts.css", "line": 116, - "losesTo": "theme.css:1066" + "losesTo": "theme.css:1061" }, { "selector": ".toast", @@ -4826,7 +4497,7 @@ "value": "var(--gap-md) 0", "file": "controls.css", "line": 213, - "losesTo": "theme.css:785" + "losesTo": "theme.css:784" }, { "selector": ".custom-select__option--top > svg", @@ -4866,7 +4537,7 @@ "value": "flex-start", "file": "data.css", "line": 507, - "losesTo": "theme.css:587" + "losesTo": "theme.css:586" }, { "selector": ".feed-item", @@ -4874,7 +4545,7 @@ "value": "12px", "file": "data.css", "line": 508, - "losesTo": "theme.css:588" + "losesTo": "theme.css:587" }, { "selector": ".feed-item", @@ -4882,7 +4553,7 @@ "value": "12px 0", "file": "data.css", "line": 509, - "losesTo": "theme.css:589" + "losesTo": "theme.css:588" }, { "selector": ".theme-toggle", @@ -4890,7 +4561,7 @@ "value": "2rem", "file": "layout.css", "line": 141, - "losesTo": "theme.css:952" + "losesTo": "theme.css:947" }, { "selector": ".theme-toggle", @@ -4898,7 +4569,7 @@ "value": "0", "file": "layout.css", "line": 149, - "losesTo": "theme.css:943" + "losesTo": "theme.css:938" }, { "selector": ".modal", @@ -4906,7 +4577,7 @@ "value": "var(--card-shadow),\n 0 25px 50px -12px rgb(0 0 0 / 0.25)", "file": "modals.css", "line": 22, - "losesTo": "theme.css:1117" + "losesTo": "theme.css:1112" }, { "selector": ".modal__close", @@ -4914,7 +4585,7 @@ "value": "32px", "file": "modals.css", "line": 47, - "losesTo": "theme.css:1142" + "losesTo": "theme.css:1137" }, { "selector": ".modal__close", @@ -4922,7 +4593,7 @@ "value": "32px", "file": "modals.css", "line": 48, - "losesTo": "theme.css:1143" + "losesTo": "theme.css:1138" }, { "selector": ".setup-modal__header", @@ -5118,8 +4789,8 @@ "stats": { "tokens": 79, "darkOverrides": 38, - "blocks": 318, - "classes": 1700, + "blocks": 288, + "classes": 1583, "canonicalRules": 46, "ghostRules": 46 } diff --git a/design-system/registry/llms.txt b/design-system/registry/llms.txt index 2a5d421a..c2b2e4c0 100644 --- a/design-system/registry/llms.txt +++ b/design-system/registry/llms.txt @@ -96,11 +96,9 @@ --z-toast: 8000 --z-tooltip: 9999 -## Blocks (318 BEM blocks, 1700 classes) +## Blocks (288 BEM blocks, 1583 classes) account-back-btn (agents.css): account-back-btn -account-email-footer (agents.css): account-email-footer -account-email-toggle (agents.css): account-email-toggle--disabled -account-modal (agents.css): account-modal account-modal--standalone account-modal__inner account-modal__inner--upgrade +account-modal (agents.css): account-modal account-modal--standalone account-modal__inner account-security-error (agents.css): account-security-error account-security-footer (agents.css): account-security-footer action-menu (action-menu.css): action-menu action-menu--open action-menu__dropdown action-menu__item action-menu__item--danger action-menu__trigger @@ -116,9 +114,6 @@ agent-type-select (agent-type-select.css): agent-type-select agent-type-select__ agent-type-select-row (agent-type-select.css): agent-type-select-row agents-grid (agents.css): agents-grid anthropic-detail (routing-providers.css): anthropic-detail__alt anthropic-detail__alt-divider anthropic-detail__alt-hint anthropic-detail__btn anthropic-detail__primary -api-bot-banner (api-bot.css): api-bot-banner api-bot-banner__text -api-bot-btn (api-bot.css): api-bot-btn -api-bot-close (api-bot.css): api-bot-close api-key-display (wizard.css): api-key-display__code api-key-display__prefix api-key-display__value api-key-display__warning app-body (layout.css): app-body app-layout (theme.css): app-layout @@ -140,16 +135,12 @@ autofix-card (data.css): autofix-card autofix-card--autofix autofix-card--fallba autofix-card-row (data.css): autofix-card-row autofix-consent (modals.css): autofix-consent__agent-icon autofix-consent__agent-name autofix-consent__agent-row autofix-consent__agents autofix-consent__agents-label autofix-consent__legal autofix-icon (data.css): autofix-icon -billing-footer (agents.css): billing-footer billing-footer__actions billing-footer__link billing-footer__note -billing-stat (agents.css): billing-stat billing-stat__cancel billing-stat__label billing-stat__meta billing-stat__value -billing-stats (agents.css): billing-stats breadcrumb (layout.css, theme.css): breadcrumb -btn (agents.css, controls.css, data.css, layout.css, limits.css, modals.css, routing-providers.css, routing.css, skeleton.css, theme.css): btn btn--danger btn--ghost btn--outline btn--primary btn--sm +btn (controls.css, layout.css, limits.css, modals.css, routing-providers.css, routing.css, skeleton.css, theme.css): btn btn--danger btn--ghost btn--outline btn--primary btn--sm cards-grid (layout.css, theme.css, wizard.css): cards-grid chart-card (cards.css, theme.css): chart-card chart-card__body chart-card__controls chart-card__filter-btn chart-card__filter-btn--active chart-card__filters chart-card__header chart-card__label chart-card__stat chart-card__stat--active chart-card__stat--clickable chart-card__subtitle chart-card__subtitle-title chart-card__value chart-card__value-row chart-tooltip (charts.css, theme.css): chart-tooltip class_ (syntax-highlight.css): class_ -cloud-email-info (notifications.css): cloud-email-info cloud-email-info__desc cloud-email-info__icon cloud-email-info__title complexity-empty (routing.css): complexity-empty complexity-empty__desc complexity-empty__title confirm-modal (limits.css): confirm-modal__confirm-row confirm-modal__footer confirm-modal__warning connection-delete-confirmation (routing-providers.css): connection-delete-confirmation connection-delete-confirmation__copy connection-delete-confirmation__footer connection-delete-confirmation__label connection-delete-confirmation__title connection-delete-confirmation__warning @@ -176,7 +167,6 @@ discovery-actions (discovery.css): discovery-actions discovery-card (discovery.css): discovery-card discovery-card__desc discovery-card__form discovery-card__intro discovery-card__logo discovery-card__title discovery-form (discovery.css): discovery-form discovery-select (discovery.css): discovery-select--empty -dither-ground (api-bot.css): dither-ground drawer (request-drawer.css): drawer drawer--open drawer__badge drawer__badge--autofix drawer__badge--fallback drawer__body drawer__close drawer__content drawer__content-empty drawer__header drawer__messages-pane drawer__meta-row drawer__meta-sep drawer__meta-text drawer__sidebar drawer__sidebar-title drawer__split drawer__tabs-full drawer__title drawer__title-row drawer-context-card (request-drawer.css): drawer-context-card drawer-context-card--autofix drawer-context-card--error drawer-context-card--fallback drawer-kv (request-drawer.css): drawer-kv drawer-kv__key @@ -184,7 +174,7 @@ drawer-metadata (request-drawer.css): drawer-metadata drawer-status (request-drawer.css): drawer-status drawer-status--error drawer-status--neutral drawer-status--success duplicate-agent (agents.css): duplicate-agent__badge duplicate-agent__list duplicate-agent__section duplicate-agent__section-header empty-state (data.css, theme.css): empty-state empty-state__img empty-state__img-wrapper empty-state__title -error-autofix-row (data.css): error-autofix-row error-autofix-row--solo error-autofix-row--triple error-autofix-row__arrow error-autofix-row__arrow-down error-autofix-row__arrow-right error-autofix-row__autofix error-autofix-row__autofix--autofix error-autofix-row__autofix--fallback error-autofix-row__autofix-btn error-autofix-row__autofix-btn--secondary error-autofix-row__autofix-text error-autofix-row__autofix-title error-autofix-row__error error-autofix-row__error--full error-autofix-row__meta-hint error-autofix-row__meta-label error-autofix-row__meta-table error-autofix-row__meta-value error-autofix-row__title error-autofix-row__upgrade +error-autofix-row (data.css): error-autofix-row error-autofix-row--solo error-autofix-row--triple error-autofix-row__arrow error-autofix-row__arrow-down error-autofix-row__arrow-right error-autofix-row__autofix error-autofix-row__autofix--autofix error-autofix-row__autofix--fallback error-autofix-row__autofix-btn error-autofix-row__autofix-btn--secondary error-autofix-row__autofix-text error-autofix-row__autofix-title error-autofix-row__error error-autofix-row__error--full error-autofix-row__meta-hint error-autofix-row__meta-label error-autofix-row__meta-table error-autofix-row__meta-value error-autofix-row__title error-class-card (analytics-overview.css): error-class-card error-class-card__bar error-class-card__bar-wrap error-class-card__count error-class-card__empty error-class-card__label error-class-card__list error-class-card__row error-class-card__title expandable-card (charts.css, theme.css): expandable-card expandable-card__btn expandable-card__content expandable-card__fade fallback-icon (data.css): fallback-icon @@ -195,15 +185,9 @@ feedback-cell (feedback.css): feedback-cell feedback-modal (feedback.css): feedback-modal feedback-modal__footer feedback-modal__tags feedback-modal__textarea feedback-tag (feedback.css): feedback-tag feedback-tag--selected framework-snippets (wizard.css): framework-snippets__block framework-snippets__connection framework-snippets__field framework-snippets__label framework-snippets__toggle-row framework-snippets__value -free-models-accordion (data.css): free-models-accordion free-models-accordion--open -free-models-base-url-row (data.css): free-models-base-url-row -free-models-caret (data.css): free-models-caret -free-models-disabled-btn (data.css): free-models-disabled-btn -free-models-logo-dark (data.css): free-models-logo-dark -free-models-logo-light (data.css): free-models-logo-light free-tag (theme.css): free-tag function_ (syntax-highlight.css): function_ -header (controls.css, theme.css): header header__avatar header__avatar-btn header__breadcrumb-current header__breadcrumb-icon header__breadcrumb-label header__breadcrumb-link header__breadcrumb-provider-icon header__docs-link header__dropdown header__dropdown-divider header__dropdown-email header__dropdown-header header__dropdown-item header__dropdown-item--danger header__dropdown-name header__gear header__gear-btn header__github-icon header__github-star header__github-star-action header__github-star-btn header__github-star-close header__github-star-count header__github-star-label header__left header__logo header__logo-img header__logo-img--dark header__logo-img--light header__mode-badge header__mode-badge--dev header__pro-badge header__right header__separator header__star-separator +header (controls.css, theme.css): header header__avatar header__avatar-btn header__breadcrumb-current header__breadcrumb-icon header__breadcrumb-label header__breadcrumb-link header__breadcrumb-provider-icon header__docs-link header__dropdown header__dropdown-divider header__dropdown-email header__dropdown-header header__dropdown-item header__dropdown-item--danger header__dropdown-name header__gear header__gear-btn header__left header__logo header__logo-img header__logo-img--dark header__logo-img--light header__right header__separator header-combo (routing-header-tiers.css): header-combo header-combo--invalid header-combo__error header-combo__input header-combo__menu header-combo__option header-combo__option--free header-combo__option--hover header-combo__option-group header-combo__option-label header-combo__option-row header-combo__option-sublabel header-controls (layout.css, theme.css): header-controls header-tier-card (routing-header-tiers.css): header-tier-card__actions header-tier-card__icon-btn header-tier-card__kebab header-tier-card__kebab-btn header-tier-card__menu header-tier-card__menu-item header-tier-card__menu-item--danger header-tier-card__name header-tier-card__ordinal header-tier-card__rule header-tier-card__title @@ -285,7 +269,6 @@ overview-stats (analytics-overview.css): overview-stats overview-stats--3 overvi page-header (analytics-overview.css, connection-detail.css, layout.css, theme.css): page-header page-header--wrap page-header__intro page-header__subtitle page-header__title pagination (data.css): pagination pagination__btn pagination__controls pagination__summary panel (analytics-overview.css, cards.css, charts.css, limits.css, request-drawer.css, routing-providers.css, routing-tabs.css, theme.css, welcome.css, wizard.css): panel panel--disabled panel__header panel__tab panel__tab--active panel__tab-icon panel__tabs panel__title -plan-picker (auth.css): plan-picker plan-picker__amount plan-picker__badge plan-picker__card plan-picker__card--expanded plan-picker__card--pro plan-picker__cta plan-picker__details plan-picker__features plan-picker__name plan-picker__period plan-picker__price-inline plan-picker__radio plan-picker__radio-dot plan-picker__row plan-picker__section-header plan-picker__section-subtitle plan-picker__section-title plan-picker__usage platform-icon (platform-icons.css): platform-icon playground (playground.css): playground playground--embedded playground__add playground__add-plus playground__add-shortcut playground__add-shortcut-plus playground__columns playground-column (playground.css): playground-column playground-column__best playground-column__best--on playground-column__best--static playground-column__body playground-column__chip playground-column__edit-icon playground-column__error playground-column__error-text playground-column__header playground-column__headers playground-column__headers-caret playground-column__headers-caret--open playground-column__headers-list playground-column__headers-toggle playground-column__icon playground-column__metric playground-column__metric-label playground-column__metric-value playground-column__metric-value-row playground-column__metrics playground-column__name playground-column__placeholder playground-column__remove playground-column__response playground-column__skeleton playground-column__title playground-column__title--readonly playground-column__title-left playground-column__win-badge @@ -295,7 +278,6 @@ playground-prompt (playground.css): playground-prompt playground-prompt--info pl playground-prompt-wrapper (playground.css): playground-prompt-wrapper playground-prompt-wrapper--history-open playground-recent (playground.css): playground-recent playground-recent--collapsed playground-recent__body playground-recent__collapse playground-recent__empty playground-recent__fade playground-recent__group-label playground-recent__header playground-recent__item playground-recent__item--active playground-recent__item-wrapper playground-recent__list playground-recent__menu playground-recent__menu-anchor playground-recent__menu-backdrop playground-recent__menu-item playground-recent__more playground-recent__new playground-recent__new-icon playground-recent__new-label playground-recent__new-left playground-recent__new-shortcut playground-recent__prompt playground-recent__title playground-recent__toggle playground-summary (playground.css): playground-summary playground-summary__best-cell playground-summary__best-star playground-summary__best-star--on playground-summary__delta playground-summary__provider playground-summary__provider-icon playground-summary__provider-name playground-summary__row--best playground-summary__row--clickable playground-summary__table playground-summary__title playground-summary__value playground-summary__winner-icon -pro-range-badge (custom-select.css): pro-range-badge provider-auth-badge (routing.css): provider-auth-badge provider-auth-badge--key provider-auth-badge--local provider-auth-badge--overlay provider-auth-badge--sub provider-card (notifications.css, routing-providers.css): provider-card provider-card__actions provider-card__body provider-card__dropdown provider-card__dropdown-item provider-card__dropdown-item--danger provider-card__email provider-card__header provider-card__key provider-card__label provider-card__logo provider-card__logo-letter provider-card__menu provider-card__menu-btn provider-card__meta provider-card__name provider-detail (routing-providers.css): provider-detail provider-detail__action provider-detail__beta-badge provider-detail__disconnect provider-detail__disconnect-icon provider-detail__error provider-detail__field provider-detail__footer provider-detail__format provider-detail__format-help provider-detail__format-legend provider-detail__format-option provider-detail__format-option--active provider-detail__format-option--disabled provider-detail__format-option-path provider-detail__format-option-title provider-detail__format-options provider-detail__header provider-detail__header-actions provider-detail__hint provider-detail__icon provider-detail__input provider-detail__input--disabled provider-detail__input--error provider-detail__input--masked provider-detail__key-help provider-detail__key-help-link provider-detail__key-row provider-detail__label provider-detail__label-muted provider-detail__models-bar provider-detail__name provider-detail__no-key provider-detail__refresh-btn provider-detail__refresh-icon--spinning provider-detail__signin-btn provider-detail__subtitle provider-detail__title-group @@ -361,10 +343,7 @@ setup-segment (wizard.css): setup-segment setup-segment--full setup-segment__btn setup-step (wizard.css): setup-step__desc setup-step__heading setup-step-providers (overview.css): setup-step-providers setup-steps (controls.css): setup-steps setup-steps__content setup-steps__divider setup-steps__number setup-steps__step -sidebar (controls.css, theme.css): sidebar sidebar--mobile-open sidebar__badge sidebar__feedback sidebar__feedback-hint sidebar__feedback-title sidebar__footer sidebar__link sidebar__link--disabled sidebar__link-row sidebar__logo sidebar__logo-dot sidebar__section-add sidebar__section-label sidebar__spacer -sidebar-api-bot (api-bot.css): sidebar-api-bot sidebar-api-bot__close sidebar-api-bot__image sidebar-api-bot__text sidebar-api-bot__title -sidebar-upgrade (modals.css): sidebar-upgrade -sidebar-usage (modals.css): sidebar-usage sidebar-usage__alert sidebar-usage__bar sidebar-usage__count sidebar-usage__count--danger sidebar-usage__fill sidebar-usage__fill--danger sidebar-usage__fill--warning sidebar-usage__header sidebar-usage__month sidebar-usage__title +sidebar (controls.css, theme.css): sidebar sidebar--mobile-open sidebar__badge sidebar__feedback sidebar__feedback-hint sidebar__feedback-title sidebar__footer sidebar__link sidebar__link--disabled sidebar__link-row sidebar__logo sidebar__logo-dot sidebar__section-add sidebar__section-label skeleton (skeleton.css): skeleton skeleton--rect skeleton--text skill-dot (data.css): skill-dot skill-dot--active skip-link (layout.css): skip-link @@ -399,15 +378,6 @@ u-marker (charts.css, theme.css): u-marker u-series (charts.css, theme.css): u-series u-value (charts.css, theme.css): u-value u-wrap (cards.css, charts.css, theme.css): u-wrap -upgrade-back (agents.css): upgrade-back -upgrade-limit-notice (agents.css): upgrade-limit-notice -upgrade-page-header (agents.css): upgrade-page-header upgrade-page-header--centered upgrade-page-header__copy -upgrade-plan-card (agents.css): upgrade-plan-card upgrade-plan-card--pro upgrade-plan-card__amount upgrade-plan-card__amount--custom upgrade-plan-card__badge upgrade-plan-card__body upgrade-plan-card__cta upgrade-plan-card__desc upgrade-plan-card__divider upgrade-plan-card__features upgrade-plan-card__features-intro upgrade-plan-card__footer upgrade-plan-card__header upgrade-plan-card__no-commitment upgrade-plan-card__period upgrade-plan-card__price upgrade-plan-card__usage -upgrade-plan-grid (agents.css): upgrade-plan-grid -upgrade-pro-current (agents.css): upgrade-pro-current upgrade-pro-current__card upgrade-pro-current__status -upgrade-success-modal (modals.css): upgrade-success-modal upgrade-success-modal__body upgrade-success-modal__done upgrade-success-modal__features upgrade-success-modal__icon upgrade-success-modal__subtitle upgrade-success-modal__title -upgrade-terms (agents.css): upgrade-terms -usage-limit-banner (modals.css): usage-limit-banner usage-limit-banner__actions usage-limit-banner__btn usage-limit-banner__text version-indicator (version-indicator.css): version-indicator version-indicator--update version-indicator__dismiss version-indicator__update view-more-link (analytics-overview.css, cards.css): view-more-link waiting-banner (overview.css): waiting-banner waiting-banner--success @@ -437,29 +407,29 @@ workspace-table (agents.css): workspace-table__actions workspace-table__icon wor .request-tool { border-radius: var(--radius-sm) } ← request-drawer.css:919 .request-tool { background: hsl(36 80% 50% / 0.04) } ← request-drawer.css:920 .hljs-attr { color: hsl(var(--chart-4)) } ← syntax-highlight.css:41 -.summary-card { box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px } ← theme.css:197 -.trend--up { color: hsl(var(--success)) } ← theme.css:238 -.trend--up { background: hsl(var(--success) / 0.1) } ← theme.css:239 -.trend--down { color: hsl(var(--destructive)) } ← theme.css:243 -.trend--down { background: hsl(var(--destructive) / 0.1) } ← theme.css:244 -.panel { box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px } ← theme.css:269 -.chart-card { box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px } ← theme.css:285 -.chart-card__header { align-items: flex-end } ← theme.css:291 -.chart-card__value-row { align-items: baseline } ← theme.css:323 -.feed-item { align-items: center } ← theme.css:587 -.feed-item { gap: var(--gap-md) } ← theme.css:588 -.feed-item { padding: 10px 0 } ← theme.css:589 -.sidebar { padding: var(--gap-lg) 0 0 0 } ← theme.css:785 -.theme-toggle { padding: 6px 12px } ← theme.css:943 -.theme-toggle { width: 100% } ← theme.css:952 -.chart-tooltip { font-size: var(--font-size-xs) } ← theme.css:1029 -.expandable-card__fade { height: 64px } ← theme.css:1060 -.expandable-card__fade { background: linear-gradient(transparent, hsl(var(--card)) 70%) } ← theme.css:1061 -.expandable-card__fade { padding-bottom: 12px } ← theme.css:1066 +.summary-card { box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px } ← theme.css:196 +.trend--up { color: hsl(var(--success)) } ← theme.css:237 +.trend--up { background: hsl(var(--success) / 0.1) } ← theme.css:238 +.trend--down { color: hsl(var(--destructive)) } ← theme.css:242 +.trend--down { background: hsl(var(--destructive) / 0.1) } ← theme.css:243 +.panel { box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px } ← theme.css:268 +.chart-card { box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px } ← theme.css:284 +.chart-card__header { align-items: flex-end } ← theme.css:290 +.chart-card__value-row { align-items: baseline } ← theme.css:322 +.feed-item { align-items: center } ← theme.css:586 +.feed-item { gap: var(--gap-md) } ← theme.css:587 +.feed-item { padding: 10px 0 } ← theme.css:588 +.sidebar { padding: var(--gap-lg) 0 0 0 } ← theme.css:784 +.theme-toggle { padding: 6px 12px } ← theme.css:938 +.theme-toggle { width: 100% } ← theme.css:947 +.chart-tooltip { font-size: var(--font-size-xs) } ← theme.css:1024 +.expandable-card__fade { height: 64px } ← theme.css:1055 +.expandable-card__fade { background: linear-gradient(transparent, hsl(var(--card)) 70%) } ← theme.css:1056 +.expandable-card__fade { padding-bottom: 12px } ← theme.css:1061 .modal { box-shadow: rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, - 0 25px 50px -12px rgb(0 0 0 / 0.25) } ← theme.css:1117 -.modal__close { width: 2rem } ← theme.css:1142 -.modal__close { height: 2rem } ← theme.css:1143 + 0 25px 50px -12px rgb(0 0 0 / 0.25) } ← theme.css:1112 +.modal__close { width: 2rem } ← theme.css:1137 +.modal__close { height: 2rem } ← theme.css:1138 .toast { align-items: flex-start } ← toast.css:16 .toast { gap: var(--gap-sm) } ← toast.css:17 .toast { padding: 12px var(--gap-md) } ← toast.css:18 @@ -473,39 +443,39 @@ workspace-table (agents.css): workspace-table__actions workspace-table__icon wor .welcome__route-test-heading { gap: 10px } ← welcome.css:904 ## Ghost rules — declared but always losing; edit the canonical rule instead, delete these in the refactor project (46) -.summary-card { box-shadow: var(--card-shadow) } at cards.css:7 loses to theme.css:197 -.trend--up { color: hsl(var(--muted-foreground)) } at cards.css:48 loses to theme.css:238 -.trend--down { color: hsl(var(--muted-foreground)) } at cards.css:48 loses to theme.css:243 -.trend--up { background: hsl(var(--muted)) } at cards.css:49 loses to theme.css:239 -.trend--down { background: hsl(var(--muted)) } at cards.css:49 loses to theme.css:244 -.panel { box-shadow: var(--card-shadow) } at cards.css:59 loses to theme.css:269 +.summary-card { box-shadow: var(--card-shadow) } at cards.css:7 loses to theme.css:196 +.trend--up { color: hsl(var(--muted-foreground)) } at cards.css:48 loses to theme.css:237 +.trend--down { color: hsl(var(--muted-foreground)) } at cards.css:48 loses to theme.css:242 +.trend--up { background: hsl(var(--muted)) } at cards.css:49 loses to theme.css:238 +.trend--down { background: hsl(var(--muted)) } at cards.css:49 loses to theme.css:243 +.panel { box-shadow: var(--card-shadow) } at cards.css:59 loses to theme.css:268 .view-more-link { color: hsl(var(--muted-foreground)) } at cards.css:72 loses to analytics-overview.css:213 -.chart-card { box-shadow: var(--card-shadow) } at cards.css:86 loses to theme.css:285 -.chart-card__header { align-items: stretch } at cards.css:92 loses to theme.css:291 -.chart-card__value-row { align-items: center } at cards.css:160 loses to theme.css:323 -.chart-tooltip { font-size: var(--tooltip-font-size) } at charts.css:78 loses to theme.css:1029 -.expandable-card__fade { height: 80px } at charts.css:110 loses to theme.css:1060 -.expandable-card__fade { background: linear-gradient(transparent, hsl(var(--card)) 60%) } at charts.css:111 loses to theme.css:1061 -.expandable-card__fade { padding-bottom: 16px } at charts.css:116 loses to theme.css:1066 +.chart-card { box-shadow: var(--card-shadow) } at cards.css:86 loses to theme.css:284 +.chart-card__header { align-items: stretch } at cards.css:92 loses to theme.css:290 +.chart-card__value-row { align-items: center } at cards.css:160 loses to theme.css:322 +.chart-tooltip { font-size: var(--tooltip-font-size) } at charts.css:78 loses to theme.css:1024 +.expandable-card__fade { height: 80px } at charts.css:110 loses to theme.css:1055 +.expandable-card__fade { background: linear-gradient(transparent, hsl(var(--card)) 60%) } at charts.css:111 loses to theme.css:1056 +.expandable-card__fade { padding-bottom: 16px } at charts.css:116 loses to theme.css:1061 .toast { align-items: center } at controls.css:124 loses to toast.css:16 .toast { gap: 10px } at controls.css:125 loses to toast.css:17 .toast { padding: 12px 16px } at controls.css:126 loses to toast.css:18 .toast { box-shadow: 0 4px 16px rgb(0 0 0 / 0.15) } at controls.css:129 loses to toast.css:22 .toast { animation: toast-in 200ms ease-out } at controls.css:132 loses to toast.css:26 -.sidebar { padding: var(--gap-md) 0 } at controls.css:213 loses to theme.css:785 +.sidebar { padding: var(--gap-md) 0 } at controls.css:213 loses to theme.css:784 .custom-select__option--top > svg { margin-top: calc((18px - 13px) / 2) } at custom-select.css:137 loses to custom-select.css:142 .custom-select__option--top > img { margin-top: calc((18px - 13px) / 2) } at custom-select.css:137 loses to custom-select.css:142 .tier-badge--fallback { background: hsl(var(--muted-foreground) / 0.1) } at data.css:299 loses to overview.css:105 .tier-badge--fallback { color: hsl(var(--muted-foreground)) } at data.css:300 loses to overview.css:106 -.feed-item { align-items: flex-start } at data.css:507 loses to theme.css:587 -.feed-item { gap: 12px } at data.css:508 loses to theme.css:588 -.feed-item { padding: 12px 0 } at data.css:509 loses to theme.css:589 -.theme-toggle { width: 2rem } at layout.css:141 loses to theme.css:952 -.theme-toggle { padding: 0 } at layout.css:149 loses to theme.css:943 +.feed-item { align-items: flex-start } at data.css:507 loses to theme.css:586 +.feed-item { gap: 12px } at data.css:508 loses to theme.css:587 +.feed-item { padding: 12px 0 } at data.css:509 loses to theme.css:588 +.theme-toggle { width: 2rem } at layout.css:141 loses to theme.css:947 +.theme-toggle { padding: 0 } at layout.css:149 loses to theme.css:938 .modal { box-shadow: var(--card-shadow), - 0 25px 50px -12px rgb(0 0 0 / 0.25) } at modals.css:22 loses to theme.css:1117 -.modal__close { width: 32px } at modals.css:47 loses to theme.css:1142 -.modal__close { height: 32px } at modals.css:48 loses to theme.css:1143 + 0 25px 50px -12px rgb(0 0 0 / 0.25) } at modals.css:22 loses to theme.css:1112 +.modal__close { width: 32px } at modals.css:47 loses to theme.css:1137 +.modal__close { height: 32px } at modals.css:48 loses to theme.css:1138 .setup-modal__header { align-items: flex-start } at modals.css:64 loses to overview.css:15 .setup-modal__next { padding: 8px 20px } at modals.css:97 loses to overview.css:42 .setup-modal__next { color: hsl(var(--primary-foreground)) } at modals.css:101 loses to overview.css:46 diff --git a/docker/Dockerfile b/docker/Dockerfile index 079b0a9e..dd6f5952 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -22,9 +22,6 @@ COPY packages/shared packages/shared COPY packages/frontend packages/frontend COPY packages/backend packages/backend COPY packages/manifest packages/manifest -# Marks this bundle as a self-hosted build so the frontend reveals the -# version badge baked in at build time. Cloud CI builds never set this. -ENV VITE_MANIFEST_SELFHOSTED=true RUN npx turbo build --filter=manifest-backend --filter=manifest-frontend --filter=manifest-shared # Stage 3: Production dependencies only. npm ci runs with --ignore-scripts diff --git a/docs/dev/manifest-guide.md b/docs/dev/manifest-guide.md index 8f515f12..4f2258df 100644 --- a/docs/dev/manifest-guide.md +++ b/docs/dev/manifest-guide.md @@ -16,7 +16,7 @@ Manifest is a smart model router for **AI agents**. It sits between an agent and **"Harness" is the dashboard word for an agent.** The UI now labels agents **Harnesses** (nav item "Harnesses", routes under `/harnesses`, categories `AI agent` / `Automation` / `App AI SDK` / `Coding Assistant` from `CATEGORY_LABELS` in `packages/shared/src/agent-type.ts`). This is a **copy-level rename only**: backend code, database tables (`agents`, `agent_messages`, …), API routes (`/api/v1/agents/*`), and entity/service names all still say *agent*. Legacy `/agents/*` dashboard URLs redirect to `/harnesses/*`. When writing UI copy say "harness"; when writing code or API docs keep "agent". -**Product note:** this repo is **Manifest LLM Gateway**, the open-source LLM gateway of Manifest, available and maintained. The dashboard and the READMEs carry no promotion of the other Manifest product (the self-healing layer at `dashboard.manifest.build`), which is on hold. The dashboard announces **API Bot** instead: a banner above the page content (`ApiBotBanner.tsx`) and a sidebar card (`ApiBotAnnouncement.tsx`), both linking to `https://manifest.build/api-bot/`, shown in every deployment mode with a per-session dismiss, on API Bot's own dithered ground (`services/dither-ground.ts`). `POST /api/v1/waitlist/pivot/claim` stays only for self-hosted versions that still ship the old sidebar card. +**Product note:** this repo is **Manifest LLM Gateway**, the open-source LLM gateway of Manifest, available and maintained. The dashboard and the READMEs carry no promotion of the other Manifest product (the self-healing layer at `dashboard.manifest.build`), which is on hold. Thinker removed the dashboard's SaaS layer (#12): no API Bot banner or sidebar card, no plans/upgrade/Stripe UI, no GitHub stars, no Free Models page, no managed Gemini Free, and no cloud-mode branches (the dashboard always behaves as self-hosted). The matching backend endpoints (`/api/v1/billing*`, `/api/v1/waitlist*`, `/api/v1/github*`, `/api/v1/free-models*`) still exist until #14/#15 remove them; the dashboard no longer calls them. **Supported agents**: see `AGENT_PLATFORMS` in `packages/shared/src/agent-type.ts` for the current list (OpenClaw, Hermes, Claude Code, OpenCode, generic OpenAI/Anthropic SDK slots, and others — don't duplicate the list here, it grows independently of this doc). OpenClaw remains the deepest integration, but no new code or copy should frame Manifest as OpenClaw-only. When adding examples, prefer "AI agent" as the noun and pick OpenClaw as the worked example rather than the sole target. Manifest is consumed as a generic OpenAI-compatible HTTP endpoint — there are no first-party OpenClaw plugins in this repo anymore. @@ -183,9 +183,7 @@ packages/ │ │ │ ├── providers/ # Subscriptions.tsx, Byok.tsx, Local.tsx, ConnectionDetail.tsx, ProviderConnectionsPage.tsx (/providers/* pages) │ │ │ ├── Discovery.tsx # Self-hosted discovery form (one-time, post-signup) │ │ │ ├── Welcome.tsx # Post-signup welcome flow (+ welcome-helpers.ts) -│ │ │ ├── FreeModels.tsx # Free model catalog │ │ │ ├── Setup.tsx # First-run setup wizard -│ │ │ ├── Upgrade.tsx # Billing/plan upgrade page │ │ │ ├── Help.tsx # Help page │ │ │ ├── AgentLimitsRedirect.tsx, AgentMessagesRedirect.tsx # Legacy per-harness URL redirects │ │ │ ├── CliAuth.tsx # /cli/auth — approve a `mnfst login` browser request @@ -778,7 +776,7 @@ The id is minted lazily by `InstallIdService.getOrCreate()` (exported from `Tele **Self-hosted consent is once, and rides on the per-agent enable.** On self-hosted, consent is remembered via `install_metadata.autofix_consented_at` — a single nullable column on the existing telemetry singleton. Consent is recorded by **any** enable path: the per-agent `PATCH …/autofix` with `enabled: true` (a disable never mints it), the enable-all endpoint, and the Autofix switch on first agent creation. The singleton row is upserted, minting an `install_id` if telemetry never did — so consent alone never starts telemetry. -**The sidebar carries no Autofix card.** The Autofix enablement card duplicated what notifications already cover, and the cards promoting the self-healing product are gone. The only sidebar card is the API Bot announcement. The per-harness **Settings** toggle (`SettingsAutofixSection.tsx`) is the enablement path in the dashboard. +**The sidebar carries no Autofix card.** The Autofix enablement card duplicated what notifications already cover, and the cards promoting the self-healing product are gone. The sidebar carries no cards. The per-harness **Settings** toggle (`SettingsAutofixSection.tsx`) is the enablement path in the dashboard. `POST /api/v1/autofix/enable-all` remains as an API-level fleet backfill (no dashboard caller): it runs `UPDATE agents SET autofix_enabled = true` for every live, non-playground agent in the tenant (**including any previously turned off**), invalidates the per-tenant config cache, records consent, and returns the refreshed workspace status. Soft-deleted agents are left alone so resurrecting one doesn't silently arrive with Autofix on. diff --git a/package-lock.json b/package-lock.json index 1abc8d48..7835682f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18671,7 +18671,6 @@ "name": "manifest-frontend", "version": "0.1.0", "dependencies": { - "@better-auth/stripe": "1.7.4", "@solidjs/meta": "^0.29.4", "@solidjs/router": "^0.16.2", "better-auth": "1.7.4", @@ -18803,22 +18802,6 @@ } } }, - "packages/frontend/node_modules/@better-auth/stripe": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@better-auth/stripe/-/stripe-1.7.4.tgz", - "integrity": "sha512-mjKfpxfYSeyma2B3jheDVJ8/SlINf9VDWTa+7Ty1Q/TboAHUGVOLaNdBlqoFY9V2Fvg80DvPhxsFVk8+ZXXNtw==", - "license": "MIT", - "dependencies": { - "defu": "^6.1.5", - "zod": "^4.5.4" - }, - "peerDependencies": { - "@better-auth/core": "^1.7.4", - "better-auth": "^1.7.4", - "better-call": "1.4.0", - "stripe": "^18 || ^19 || ^20 || ^21 || ^22" - } - }, "packages/frontend/node_modules/@better-auth/telemetry": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/@better-auth/telemetry/-/telemetry-1.7.4.tgz", diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 06b6566d..7ac06fec 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -12,7 +12,6 @@ "lint": "eslint src/" }, "dependencies": { - "@better-auth/stripe": "1.7.4", "@solidjs/meta": "^0.29.4", "@solidjs/router": "^0.16.2", "better-auth": "1.7.4", diff --git a/packages/frontend/public/api-bot-works-with-any-api.svg b/packages/frontend/public/api-bot-works-with-any-api.svg deleted file mode 100644 index 32351ab0..00000000 --- a/packages/frontend/public/api-bot-works-with-any-api.svg +++ /dev/null @@ -1,612 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/frontend/public/icons/caret-down.svg b/packages/frontend/public/icons/caret-down.svg deleted file mode 100644 index 8197786b..00000000 --- a/packages/frontend/public/icons/caret-down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/frontend/public/icons/cerebras-dark-mode.svg b/packages/frontend/public/icons/cerebras-dark-mode.svg deleted file mode 100644 index 7d2bc123..00000000 --- a/packages/frontend/public/icons/cerebras-dark-mode.svg +++ /dev/null @@ -1 +0,0 @@ -Cerebras diff --git a/packages/frontend/public/icons/github-dark-mode.svg b/packages/frontend/public/icons/github-dark-mode.svg deleted file mode 100644 index a1ac1a12..00000000 --- a/packages/frontend/public/icons/github-dark-mode.svg +++ /dev/null @@ -1 +0,0 @@ -GitHub diff --git a/packages/frontend/public/icons/ollama-dark-mode.svg b/packages/frontend/public/icons/ollama-dark-mode.svg deleted file mode 100644 index c76e1d22..00000000 --- a/packages/frontend/public/icons/ollama-dark-mode.svg +++ /dev/null @@ -1 +0,0 @@ -Ollama diff --git a/packages/frontend/public/icons/zai-dark-mode.svg b/packages/frontend/public/icons/zai-dark-mode.svg deleted file mode 100644 index 57a1b70b..00000000 --- a/packages/frontend/public/icons/zai-dark-mode.svg +++ /dev/null @@ -1 +0,0 @@ -Z.ai diff --git a/packages/frontend/src/App.tsx b/packages/frontend/src/App.tsx index 1b804bb0..93d705f5 100644 --- a/packages/frontend/src/App.tsx +++ b/packages/frontend/src/App.tsx @@ -13,8 +13,6 @@ import Header from './components/Header.jsx'; import Sidebar from './components/Sidebar.jsx'; import AuthGuard from './components/AuthGuard.jsx'; import VersionIndicator from './components/VersionIndicator.jsx'; -import UsageLimitBanner from './components/UsageLimitBanner.jsx'; -import ApiBotBanner from './components/ApiBotBanner.jsx'; import { connectSse } from './services/sse.js'; import { RightSidebarProvider, useRightSidebar } from './services/right-sidebar.jsx'; @@ -81,8 +79,6 @@ const AppInner: ParentComponent = (props) => { classList={{ 'main-content--full': !showSidebar() }} aria-label="Dashboard content" > - - {props.children} {rightSidebar()} diff --git a/packages/frontend/src/components/AddAgentModal.tsx b/packages/frontend/src/components/AddAgentModal.tsx index f1e1eaa2..42540142 100644 --- a/packages/frontend/src/components/AddAgentModal.tsx +++ b/packages/frontend/src/components/AddAgentModal.tsx @@ -1,17 +1,9 @@ -import { - createEffect, - createResource, - createSignal, - onCleanup, - Show, - type Component, -} from 'solid-js'; +import { createEffect, createSignal, onCleanup, Show, type Component } from 'solid-js'; import { useNavigate } from '@solidjs/router'; import AgentTypeSelect from './AgentTypeSelect.jsx'; import { createAgent, getGlobalProviders } from '../services/api.js'; import { toast } from '../services/toast-store.js'; import { markAgentCreated, markSetupPending } from '../services/recent-agents.js'; -import { checkIsSelfHosted } from '../services/setup-status.js'; import { refreshAgents } from '../services/sse.js'; import { type AgentCategory, type AgentPlatform, PLATFORMS_BY_CATEGORY } from 'manifest-shared'; @@ -38,9 +30,6 @@ const AddAgentModal: Component<{ open: boolean; onClose: () => void }> = (props) // self-hosted). const [autofixEnabled, setAutofixEnabled] = createSignal(true); const [recordingEnabled, setRecordingEnabled] = createSignal(true); - // Where the logs live depends on the deployment: self-hosted keeps them in - // the operator's own database, cloud in the Manifest workspace. - const [selfHosted] = createResource(checkIsSelfHosted); // Tracks whether the user dismissed the modal (overlay click / Escape) while a // create request was still in flight. A dismissed create must NOT run its @@ -252,11 +241,8 @@ const AddAgentModal: Component<{ open: boolean; onClose: () => void }> = (props) Enable logs
- See exactly what your agent sends on every attempt, and debug it faster.{' '} - {selfHosted.state === 'ready' && - (selfHosted() - ? 'Logs stay in your own database.' - : 'Logs are stored in your Manifest workspace.')} + See exactly what your agent sends on every attempt, and debug it faster. Logs + stay in your own database.
diff --git a/packages/frontend/src/components/ApiBotAnnouncement.tsx b/packages/frontend/src/components/ApiBotAnnouncement.tsx deleted file mode 100644 index 817d1946..00000000 --- a/packages/frontend/src/components/ApiBotAnnouncement.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { Show, createSignal, type Component } from 'solid-js'; -import DitherGround from './DitherGround.jsx'; -import { API_BOT_URL } from './ApiBotBanner.jsx'; - -const API_BOT_CARD_DISMISSED_KEY = 'api-bot-card-dismissed'; - -/** - * Sidebar card announcing API Bot, on API Bot's dithered ground. Shows for - * everyone in every deployment mode with a per-session dismiss. - */ -const ApiBotAnnouncement: Component = () => { - const [dismissed, setDismissed] = createSignal( - sessionStorage.getItem(API_BOT_CARD_DISMISSED_KEY) === '1', - ); - - const dismiss = () => { - sessionStorage.setItem(API_BOT_CARD_DISMISSED_KEY, '1'); - setDismissed(true); - }; - - return ( - - - - ); -}; - -export default ApiBotAnnouncement; diff --git a/packages/frontend/src/components/ApiBotBanner.tsx b/packages/frontend/src/components/ApiBotBanner.tsx deleted file mode 100644 index 5f3ed620..00000000 --- a/packages/frontend/src/components/ApiBotBanner.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { Show, createSignal, type Component } from 'solid-js'; -import DitherGround from './DitherGround.jsx'; - -export const API_BOT_URL = 'https://manifest.build/api-bot/'; -const API_BOT_BANNER_DISMISSED_KEY = 'api-bot-banner-dismissed'; - -/** - * Top-of-page banner announcing API Bot, on API Bot's dithered ground. Shows - * for everyone with a per-session dismiss. - */ -const ApiBotBanner: Component = () => { - const [dismissed, setDismissed] = createSignal( - sessionStorage.getItem(API_BOT_BANNER_DISMISSED_KEY) === '1', - ); - - const dismiss = () => { - sessionStorage.setItem(API_BOT_BANNER_DISMISSED_KEY, '1'); - setDismissed(true); - }; - - return ( - -
- - - Introducing API Bot: keep your app running through upstream API breaking - changes. - - - Get started - - -
-
- ); -}; - -export default ApiBotBanner; diff --git a/packages/frontend/src/components/AuthGuard.tsx b/packages/frontend/src/components/AuthGuard.tsx index 9d11dc6e..ad5d74c4 100644 --- a/packages/frontend/src/components/AuthGuard.tsx +++ b/packages/frontend/src/components/AuthGuard.tsx @@ -2,22 +2,13 @@ import { useLocation, useNavigate } from '@solidjs/router'; import { Show, createEffect, createSignal, type ParentComponent } from 'solid-js'; import { authClient } from '../services/auth-client.js'; import { buildLoginRedirect } from '../services/auth-redirects.js'; -import { hasPlanBeenChosen, markPlanChosen } from '../services/plan-selection.js'; -import { hasOnboardingBeenDone } from '../services/onboarding.js'; import { getDiscoveryPendingNext } from '../services/discovery.js'; -import { loadPlan } from '../services/plan-store.js'; const AuthGuard: ParentComponent = (props) => { const session = authClient.useSession(); const navigate = useNavigate(); const location = useLocation(); - const [planChecked, setPlanChecked] = createSignal(false); - - // Start the plan lookup now, in parallel with the session probe: it only - // needs the cookie jar. The effect below awaits the same in-flight promise, - // so the two serial round trips before first paint become one. Signed-out - // visitors get a 401 that loadPlan neither caches nor surfaces. - void loadPlan(); + const [routeChecked, setRouteChecked] = createSignal(false); createEffect(() => { const s = session(); @@ -28,51 +19,25 @@ const AuthGuard: ParentComponent = (props) => { } // The CLI consent page and the MCP OAuth consent page are not part of // onboarding. Gate them on an authenticated session only, so a user who is - // mid-discovery/plan selection can still authorize a client (otherwise the - // login flow never gets its code). + // mid-discovery can still authorize a client (otherwise the login flow + // never gets its code). if (location.pathname === '/cli/auth' || location.pathname === '/consent') { - setPlanChecked(true); + setRouteChecked(true); return; } - const userId = s.data.user?.id; // A freshly signed-up user with the discovery step still pending is sent // back to it from anywhere in the app except the form itself. - const pendingNext = getDiscoveryPendingNext(userId ?? ''); + const pendingNext = getDiscoveryPendingNext(s.data.user?.id ?? ''); if (pendingNext !== null && location.pathname !== '/discovery') { navigate(`/discovery?next=${encodeURIComponent(pendingNext)}`, { replace: true }); return; } - if (planChecked()) return; - // Resolve the plan store before rendering any page — downstream consumers - // (range locks) read it synchronously. loadPlan never rejects (fail-open) - // and costs one indexed query. - loadPlan().then((status) => { - // /register?step=plan is the plan selection destination — never intercept it. - if (location.pathname === '/register') { - setPlanChecked(true); - return; - } - if (userId && hasPlanBeenChosen(userId)) { - setPlanChecked(true); - return; - } - // Don't gate on plan selection before the user has completed onboarding. - if (userId && !hasOnboardingBeenDone(userId)) { - setPlanChecked(true); - return; - } - if (status.enabled && status.plan !== 'pro') { - navigate('/register?step=plan', { replace: true }); - return; - } - if (userId) markPlanChosen(userId); - setPlanChecked(true); - }); + setRouteChecked(true); }); return (
diff --git a/packages/frontend/src/components/CloudEmailInfo.tsx b/packages/frontend/src/components/CloudEmailInfo.tsx deleted file mode 100644 index b520feea..00000000 --- a/packages/frontend/src/components/CloudEmailInfo.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import type { Component } from "solid-js"; - -interface Props { - email: string; -} - -const CloudEmailInfo: Component = (props) => { - return ( -
- -
-
Email alerts
-
- Alerts will be sent to {props.email} -
-
-
- ); -}; - -export default CloudEmailInfo; diff --git a/packages/frontend/src/components/CustomProviderForm.tsx b/packages/frontend/src/components/CustomProviderForm.tsx index e3d37cd4..889f0a32 100644 --- a/packages/frontend/src/components/CustomProviderForm.tsx +++ b/packages/frontend/src/components/CustomProviderForm.tsx @@ -12,7 +12,6 @@ import { type RoutingProvider, } from '../services/api.js'; import { toast } from '../services/toast-store.js'; -import { checkIsSelfHosted } from '../services/setup-status.js'; import { customProviderColor } from '../services/formatters.js'; import type { ProviderDef } from '../services/providers.js'; import type { CustomProviderPrefill } from '../services/routing-params.js'; @@ -99,7 +98,6 @@ const CustomProviderForm: Component = (props) => { const [showDeleteConfirm, setShowDeleteConfirm] = createSignal(false); const [probeBusy, setProbeBusy] = createSignal(false); const [probeError, setProbeError] = createSignal(null); - const [isSelfHosted] = createResource(() => checkIsSelfHosted()); // In edit mode an API-key provider manages its keys the way native providers // do: each key is a connection, added, renamed, replaced and removed on the @@ -447,16 +445,14 @@ const CustomProviderForm: Component = (props) => { {probeBusy() ? : 'Fetch models'}
- -
- For local servers use http://host.docker.internal:<port> (Docker),{' '} - http://host.containers.internal:<port> (Podman), or{' '} - http://localhost:<port> (native). HTTPS required for public URLs. -
-
+
+ For local servers use http://host.docker.internal:<port> (Docker),{' '} + http://host.containers.internal:<port> (Podman), or{' '} + http://localhost:<port> (native). HTTPS required for public URLs. +