cartethyia 2.4.5 → 2.4.6
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/.env.example +4 -1
- package/README.md +18 -0
- package/dist/dashboard/assets/AccountCooldown-ChpdzxRH.js.gz +0 -0
- package/dist/dashboard/assets/{BannedPage-DUrXpp-X.js → BannedPage-QhvbJB9o.js} +1 -1
- package/dist/dashboard/assets/BannedPage-QhvbJB9o.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-BzGevuql.js → CliToolDetailPage-Bcy150Jo.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-Bcy150Jo.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-BaRM_7We.js → CliToolsPage-DyNXefph.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-DyNXefph.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-Cak0ljnO.js +1 -0
- package/dist/dashboard/assets/CombosPage-Cak0ljnO.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-CATpAEOz.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-CATpAEOz.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-DqUGcoH0.js → CustomizationPage-D6jEU7nL.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-D6jEU7nL.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-CZkpn0a7.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-CZkpn0a7.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-DbhTGfhb.js → LoginPage-BJlMVN4U.js} +1 -1
- package/dist/dashboard/assets/LoginPage-BJlMVN4U.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-Br3CXEau.js +1 -0
- package/dist/dashboard/assets/ModelPicker-Br3CXEau.js.gz +0 -0
- package/dist/dashboard/assets/{OverviewPage-C3NIzsDx.js → OverviewPage-CQxXbo2g.js} +1 -1
- package/dist/dashboard/assets/OverviewPage-CQxXbo2g.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage--0RBNh99.js +3 -0
- package/dist/dashboard/assets/ProviderDetailPage--0RBNh99.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-paOCq8I0.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-1M-C3mbu.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-1M-C3mbu.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-CXiumA53.js +7 -0
- package/dist/dashboard/assets/ProxyPage-CXiumA53.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-BGDIfIYP.js +1 -0
- package/dist/dashboard/assets/QuotaPage-BGDIfIYP.js.gz +0 -0
- package/dist/dashboard/assets/{SettingsPage-YxRml8AT.js → SettingsPage-BHW4Zt06.js} +1 -1
- package/dist/dashboard/assets/SettingsPage-BHW4Zt06.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-VOYC_lIa.js +1 -0
- package/dist/dashboard/assets/SetupPage-VOYC_lIa.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-DpOTnGuH.js +1 -0
- package/dist/dashboard/assets/SortableList-DpOTnGuH.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-BNIDLiU6.js +31 -0
- package/dist/dashboard/assets/StudioPage-BNIDLiU6.js.gz +0 -0
- package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js.gz +0 -0
- package/dist/dashboard/assets/{UsagePage-Djes-Epy.js → UsagePage-BAFaSDQV.js} +14 -14
- package/dist/dashboard/assets/UsagePage-BAFaSDQV.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-BETfaMYZ.js +1 -0
- package/dist/dashboard/assets/api-keys-BETfaMYZ.js.gz +0 -0
- package/dist/dashboard/assets/app-BLCvGdzb.css +2 -0
- package/dist/dashboard/assets/app-BLCvGdzb.css.gz +0 -0
- package/dist/dashboard/assets/{app-BDJWMThu.js → app-Cjq7nrwu.js} +3 -3
- package/dist/dashboard/assets/app-Cjq7nrwu.js.gz +0 -0
- package/dist/dashboard/assets/arrow-left-CpBxkoxI.js.gz +0 -0
- package/dist/dashboard/assets/arrow-right-Dl5yKnp8.js.gz +0 -0
- package/dist/dashboard/assets/{assert-Bwh6DJTK.js → assert-7J6_LVD3.js} +1 -1
- package/dist/dashboard/assets/assert-7J6_LVD3.js.gz +0 -0
- package/dist/dashboard/assets/backup-file-gdKIlg8U.js.gz +0 -0
- package/dist/dashboard/assets/{badge-BwmwEOgA.js → badge-BTyGk_DL.js} +1 -1
- package/dist/dashboard/assets/badge-BTyGk_DL.js.gz +0 -0
- package/dist/dashboard/assets/{banner-BKBfKTqn.js → banner-bujTWYM4.js} +1 -1
- package/dist/dashboard/assets/banner-bujTWYM4.js.gz +0 -0
- package/dist/dashboard/assets/brain-Cwed_72z.js.gz +0 -0
- package/dist/dashboard/assets/{card-BTdbRFFg.js → card-B0Bnx5CA.js} +1 -1
- package/dist/dashboard/assets/card-B0Bnx5CA.js.gz +0 -0
- package/dist/dashboard/assets/check-D69FzdvC.js.gz +0 -0
- package/dist/dashboard/assets/chevron-right-BXIy5l3h.js.gz +0 -0
- package/dist/dashboard/assets/circle-alert-CntYHV5v.js.gz +0 -0
- package/dist/dashboard/assets/circle-check-BU3v_mFW.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-DE2ug812.js +1 -0
- package/dist/dashboard/assets/cli-tools-DE2ug812.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-R_rArH8S.js +1 -0
- package/dist/dashboard/assets/clipboard-button-R_rArH8S.js.gz +0 -0
- package/dist/dashboard/assets/cog-CdWhsajs.js.gz +0 -0
- package/dist/dashboard/assets/copy-ngmQ9zcZ.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-iocKA3jr.js → dialog-BWIP_EvW.js} +1 -1
- package/dist/dashboard/assets/dialog-BWIP_EvW.js.gz +0 -0
- package/dist/dashboard/assets/dialog-actions-B1axpEg7.js.gz +0 -0
- package/dist/dashboard/assets/download-A0SW9OCW.js.gz +0 -0
- package/dist/dashboard/assets/download-dRFo5_Wu.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-CDKOTZdY.js → drawer-BKcgVugF.js} +1 -1
- package/dist/dashboard/assets/drawer-BKcgVugF.js.gz +0 -0
- package/dist/dashboard/assets/entry-7dpgvpJ3.js +4 -0
- package/dist/dashboard/assets/entry-7dpgvpJ3.js.gz +0 -0
- package/dist/dashboard/assets/entry-CcWkGR4a.js +1 -0
- package/dist/dashboard/assets/entry-CcWkGR4a.js.gz +0 -0
- package/dist/dashboard/assets/entry-kTiTFrvh.js +1 -0
- package/dist/dashboard/assets/entry-kTiTFrvh.js.gz +0 -0
- package/dist/dashboard/assets/eye-C_hawfH4.js.gz +0 -0
- package/dist/dashboard/assets/eye-off-Bk5g2luF.js.gz +0 -0
- package/dist/dashboard/assets/fingerprint-pattern-BWuHtbW4.js.gz +0 -0
- package/dist/dashboard/assets/gauge-BbIMy7MB.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-Booc5mNe.js +1 -0
- package/dist/dashboard/assets/github-badge-Booc5mNe.js.gz +0 -0
- package/dist/dashboard/assets/image-BPaouViG.js.gz +0 -0
- package/dist/dashboard/assets/{index-C4hXfAMs.js → index-D70pChfn.js} +2 -2
- package/dist/dashboard/assets/index-D70pChfn.js.gz +0 -0
- package/dist/dashboard/assets/{inline-DCejSLlA.js → inline-D1TCqM2D.js} +1 -1
- package/dist/dashboard/assets/inline-D1TCqM2D.js.gz +0 -0
- package/dist/dashboard/assets/{input-Bn4_kNav.js → input-B9oyU93y.js} +1 -1
- package/dist/dashboard/assets/input-B9oyU93y.js.gz +0 -0
- package/dist/dashboard/assets/jsx-runtime-CXUMngI_.js.gz +0 -0
- package/dist/dashboard/assets/key-round-UkavsGxp.js.gz +0 -0
- package/dist/dashboard/assets/layers-2-glBbjl.js.gz +0 -0
- package/dist/dashboard/assets/{layout-Bv-NxqZ5.js → layout-BArzXirQ.js} +1 -1
- package/dist/dashboard/assets/layout-BArzXirQ.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-BLA0sldD.js → list-row-BVZzaoHF.js} +1 -1
- package/dist/dashboard/assets/list-row-BVZzaoHF.js.gz +0 -0
- package/dist/dashboard/assets/{live-YlifPYox.js → live-EmuIayqp.js} +1 -1
- package/dist/dashboard/assets/live-EmuIayqp.js.gz +0 -0
- package/dist/dashboard/assets/log-in-BmRjy60c.js.gz +0 -0
- package/dist/dashboard/assets/message-circle-CCxGwRvv.js.gz +0 -0
- package/dist/dashboard/assets/{model-bans-CVvHZ-qz.js → model-bans-CSPQ9xB0.js} +1 -1
- package/dist/dashboard/assets/model-bans-CSPQ9xB0.js.gz +0 -0
- package/dist/dashboard/assets/mutation-BkoLM5Ba.js +1 -0
- package/dist/dashboard/assets/mutation-BkoLM5Ba.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CFL4_Dqc.js.gz +0 -0
- package/dist/dashboard/assets/pencil-768ysRAr.js.gz +0 -0
- package/dist/dashboard/assets/plus-DIdX_g-x.js.gz +0 -0
- package/dist/dashboard/assets/power-off-Yjw9GMJh.js +1 -0
- package/dist/dashboard/assets/power-off-Yjw9GMJh.js.gz +0 -0
- package/dist/dashboard/assets/privacy-mode-GM8bej85.js +1 -0
- package/dist/dashboard/assets/privacy-mode-GM8bej85.js.gz +0 -0
- package/dist/dashboard/assets/providers/agentrouter.svg.gz +0 -0
- package/dist/dashboard/assets/providers/aihubmix.svg.gz +0 -0
- package/dist/dashboard/assets/providers/alibaba-coding-plan.svg.gz +0 -0
- package/dist/dashboard/assets/providers/alibaba.svg.gz +0 -0
- package/dist/dashboard/assets/providers/antigravity.svg.gz +0 -0
- package/dist/dashboard/assets/providers/bai.svg.gz +0 -0
- package/dist/dashboard/assets/providers/blackbox.svg.gz +0 -0
- package/dist/dashboard/assets/providers/claude-code.svg.gz +0 -0
- package/dist/dashboard/assets/providers/exa.svg.gz +0 -0
- package/dist/dashboard/assets/providers/gmi-cloud.svg.gz +0 -0
- package/dist/dashboard/assets/providers/inferhub.svg.gz +0 -0
- package/dist/dashboard/assets/providers/muse.svg.gz +0 -0
- package/dist/dashboard/assets/providers/nous-research.svg.gz +0 -0
- package/dist/dashboard/assets/providers/openai-light.svg.gz +0 -0
- package/dist/dashboard/assets/providers/parallel.svg.gz +0 -0
- package/dist/dashboard/assets/providers/tokenharbor.svg.gz +0 -0
- package/dist/dashboard/assets/providers/zai-coding-plan.svg.gz +0 -0
- package/dist/dashboard/assets/{query-keys-ROf-g1Wi.js → query-keys-D7wX2vM5.js} +1 -1
- package/dist/dashboard/assets/query-keys-D7wX2vM5.js.gz +0 -0
- package/dist/dashboard/assets/quota-DZGyp0N5.js.gz +0 -0
- package/dist/dashboard/assets/refresh-cw-BqJFk4sU.js.gz +0 -0
- package/dist/dashboard/assets/rotate-ccw-CufcqITi.js.gz +0 -0
- package/dist/dashboard/assets/route-CNSNj9Zm.js.gz +0 -0
- package/dist/dashboard/assets/{routing-jntw9-Ui.js → routing-BExgxxBU.js} +1 -1
- package/dist/dashboard/assets/routing-BExgxxBU.js.gz +0 -0
- package/dist/dashboard/assets/scaling-nWE4Cx8f.js.gz +0 -0
- package/dist/dashboard/assets/search-JOKus9rb.js.gz +0 -0
- package/dist/dashboard/assets/{select-CGUuTQmj.js → select-C9mMoEpJ.js} +1 -1
- package/dist/dashboard/assets/select-C9mMoEpJ.js.gz +0 -0
- package/dist/dashboard/assets/settings-C4_Gn_wq.js +1 -0
- package/dist/dashboard/assets/settings-C4_Gn_wq.js.gz +0 -0
- package/dist/dashboard/assets/shield-check-DVS0Foqh.js.gz +0 -0
- package/dist/dashboard/assets/sliders-horizontal-ClG7dBeJ.js.gz +0 -0
- package/dist/dashboard/assets/sparkles-BRaRUxAU.js.gz +0 -0
- package/dist/dashboard/assets/{stack-C1kTcOmP.js → stack-Ca5HxI5i.js} +1 -1
- package/dist/dashboard/assets/stack-Ca5HxI5i.js.gz +0 -0
- package/dist/dashboard/assets/{state-DHKdg-pm.js → state-CzUPfLXo.js} +1 -1
- package/dist/dashboard/assets/state-CzUPfLXo.js.gz +0 -0
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
- package/dist/dashboard/assets/{switch-DIDeAiz9.js → switch-DOUIky_i.js} +1 -1
- package/dist/dashboard/assets/switch-DOUIky_i.js.gz +0 -0
- package/dist/dashboard/assets/terminal-Bd4ee8TA.js +1 -0
- package/dist/dashboard/assets/terminal-Bd4ee8TA.js.gz +0 -0
- package/dist/dashboard/assets/toast-C76WrMhc.js +2 -0
- package/dist/dashboard/assets/toast-C76WrMhc.js.gz +0 -0
- package/dist/dashboard/assets/tokens-DDxMbSRL.js.gz +0 -0
- package/dist/dashboard/assets/trash-Cppn5c3R.js.gz +0 -0
- package/dist/dashboard/assets/use-clipboard-B0Sy03fE.js.gz +0 -0
- package/dist/dashboard/assets/use-presence-BSZEBx7U.js.gz +0 -0
- package/dist/dashboard/assets/use-reduced-motion-C4B0R6Sz.js.gz +0 -0
- package/dist/dashboard/assets/use-timeout-BwcBBRrT.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-DVmwOKU-.js → useMutation-D87FZwH0.js} +1 -1
- package/dist/dashboard/assets/useMutation-D87FZwH0.js.gz +0 -0
- package/dist/dashboard/assets/wrench-B6E1oEuY.js.gz +0 -0
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +123 -0
- package/migrations/full-postgres/0013_add_providers_tenant_id_index.sql +22 -0
- package/migrations/full-postgres/0014_add_provider_accounts_tenant_id_index.sql +21 -0
- package/migrations/lite-sqlite3/0000_baseline.sql +4 -2
- package/migrations/lite-sqlite3/0013_add_providers_tenant_id_index.sql +4 -0
- package/migrations/lite-sqlite3/0014_add_provider_accounts_tenant_id_index.sql +4 -0
- package/package.json +25 -30
- package/scripts/cli/{carte-launcher.cjs → bin/carte.cjs} +8 -8
- package/scripts/cli/{cli-launcher.cjs → bin/cartethyia.cjs} +167 -134
- package/scripts/cli/command/admin.ts +65 -0
- package/scripts/cli/command/console-menu.ts +227 -0
- package/scripts/cli/{doctor.ts → command/doctor.ts} +257 -258
- package/scripts/cli/{setup.ts → command/setup.ts} +8 -12
- package/scripts/cli/command/start.ts +13 -0
- package/scripts/cli/command/tray.ts +165 -0
- package/scripts/cli/command/update.ts +23 -0
- package/scripts/cli/{runtime-state.ts → gateway/drain-token.ts} +78 -78
- package/scripts/cli/gateway/spawn.ts +101 -0
- package/scripts/cli/gateway/stop.ts +51 -0
- package/scripts/cli/main.ts +94 -0
- package/scripts/cli/support/bun.ts +27 -0
- package/scripts/cli/support/env.ts +99 -0
- package/scripts/cli/support/platform.ts +64 -0
- package/scripts/cli/support/services.ts +88 -0
- package/scripts/cli/support/startup-signal.ts +23 -0
- package/scripts/cli/{version.ts → support/version.ts} +1 -1
- package/scripts/cli/tray/hidden-window.vbs +28 -0
- package/scripts/cli/{tray.ts → tray/index.ts} +3 -3
- package/scripts/cli/{tray.ps1 → tray/windows.ps1} +107 -98
- package/scripts/cli/ui/background.ts +49 -0
- package/src/boot/app.ts +3 -1
- package/src/boot/dependencies.ts +36 -13
- package/src/config/providers.ts +27 -1
- package/src/config/spec.ts +11 -0
- package/src/console/backup/routes.ts +8 -0
- package/src/console/cli-tools/contracts.ts +6 -6
- package/src/console/console-router.ts +5 -3
- package/src/console/dashboard-assets.ts +81 -11
- package/src/console/observability/contracts.ts +54 -22
- package/src/console/observability/routes.ts +31 -6
- package/src/console/observability/store.ts +68 -28
- package/src/console/providers/catalog/public-model-store.ts +91 -60
- package/src/console/providers/catalog/store.ts +5 -1
- package/src/console/quota/account-quota-tenant.ts +9 -6
- package/src/console/response-compression.ts +69 -2
- package/src/console/routing/pools/probe-verdict.ts +72 -0
- package/src/console/share/share-router.ts +7 -4
- package/src/console/share/share-stats.ts +12 -5
- package/src/console/shared/read-through-cache.ts +133 -7
- package/src/console/updates/repository-updates.ts +39 -34
- package/src/network/outbound-fetch.ts +113 -25
- package/src/network/tls/bun-client-hello.ts +112 -0
- package/src/observability/event-log.ts +29 -8
- package/src/observability/metrics.ts +40 -13
- package/src/observability/runtime-metrics.ts +7 -0
- package/src/persistence/schema.ts +40 -2
- package/src/protocol/response/codex.ts +9 -75
- package/src/protocol/tool-identity.ts +43 -9
- package/src/providers/authentication/jwt-validator.ts +130 -187
- package/src/providers/authentication/oauth-flow-store.ts +16 -9
- package/src/providers/default-registry.ts +4 -0
- package/src/providers/discovery/catalog/catalog-format.ts +20 -0
- package/src/providers/discovery/models-dev-catalog.ts +39 -22
- package/src/providers/discovery/probe-wire.ts +29 -5
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +3 -2
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +88 -0
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +4 -0
- package/src/providers/integrations/buddy/buddy-discovery-shared.ts +33 -1
- package/src/providers/integrations/buddy/buddy-identity.ts +46 -0
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +37 -1
- package/src/providers/integrations/buddy/buddy-usage-store.ts +40 -5
- package/src/providers/integrations/buddy/codebuddy/provider.ts +2 -2
- package/src/providers/integrations/buddy/codebuddy/shared.ts +106 -73
- package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +5 -2
- package/src/providers/integrations/buddy/workbuddy/quota.ts +172 -159
- package/src/providers/integrations/buddy/workbuddy/shared.ts +200 -171
- package/src/providers/integrations/codex/codex.ts +5 -8
- package/src/providers/integrations/factory/factory-oauth.ts +7 -11
- package/src/providers/integrations/opencode/opencode-go-quota.ts +130 -0
- package/src/providers/integrations/opencode/provider.ts +42 -3
- package/src/providers/integrations/qoder/qoder-oauth.ts +3 -9
- package/src/providers/integrations/shared/install-id.ts +29 -2
- package/src/providers/operations/client-versions.ts +11 -1
- package/src/providers/operations/model-catalog-cache.ts +18 -3
- package/src/providers/operations/provider-catalog-service.ts +76 -0
- package/src/transport/dispatch/attempt-finalize.ts +7 -1
- package/src/transport/dispatch/attempt-loop.ts +9 -7
- package/src/transport/dispatch/empty-stream.ts +17 -26
- package/src/transport/failure-policy.ts +20 -0
- package/src/transport/routing/route-catalog.ts +42 -3
- package/src/transport/surface/chat/encode.ts +18 -31
- package/src/transport/surface/messages/stream.ts +3 -2
- package/src/transport/translation/tool-repair.ts +37 -16
- package/src/workers/account-identity-sweep.ts +14 -12
- package/src/workers/daily-checkin.ts +62 -0
- package/src/workers/quota-refresh-sweep.ts +27 -2
- package/dist/dashboard/assets/CombosPage-B7ETkfVH.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-AisQzCI1.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-BNflDm_f.js +0 -1
- package/dist/dashboard/assets/ModelPicker-CAiPR5Vd.js +0 -1
- package/dist/dashboard/assets/ProviderDetailPage-BK8i5B5X.js +0 -3
- package/dist/dashboard/assets/ProvidersPage-CvCVgm1e.js +0 -1
- package/dist/dashboard/assets/ProxyPage-DjabkuzP.js +0 -7
- package/dist/dashboard/assets/QuotaPage-Dxe0B0iu.js +0 -1
- package/dist/dashboard/assets/SetupPage-BaD4P_jW.js +0 -1
- package/dist/dashboard/assets/SortableList-Bol1ASmI.js +0 -1
- package/dist/dashboard/assets/StudioPage-CLP4le3U.js +0 -31
- package/dist/dashboard/assets/api-keys-CjIGQhe7.js +0 -1
- package/dist/dashboard/assets/app-Cjgo4-Lf.css +0 -2
- package/dist/dashboard/assets/cli-tools-DccaOfhX.js +0 -1
- package/dist/dashboard/assets/clipboard-button-DQmMikNQ.js +0 -1
- package/dist/dashboard/assets/entry-Cpi0rph1.js +0 -4
- package/dist/dashboard/assets/entry-Dm3PpDCO.js +0 -1
- package/dist/dashboard/assets/entry-keNDZ_Wz.js +0 -1
- package/dist/dashboard/assets/github-badge-BuAJr8oU.js +0 -1
- package/dist/dashboard/assets/mutation-BIizFZav.js +0 -1
- package/dist/dashboard/assets/privacy-mode-CQjbZ3xk.js +0 -1
- package/dist/dashboard/assets/settings-BAS6QbmJ.js +0 -1
- package/dist/dashboard/assets/terminal-C9mZ4Ugm.js +0 -1
- package/dist/dashboard/assets/toast-DKAdP2mo.js +0 -2
- package/scripts/cli/cli.ts +0 -771
- package/scripts/operations/probe-egress.ts +0 -335
- package/scripts/operations/restart.ts +0 -120
- package/scripts/shared/env.ts +0 -269
- /package/{tray-assets → scripts/cli/tray/assets}/cartethyia.ico +0 -0
- /package/{tray-assets → scripts/cli/tray/assets}/cartethyia.png +0 -0
- /package/scripts/cli/{menu.ts → ui/prompt.ts} +0 -0
- /package/scripts/cli/{wordmark.ts → ui/wordmark.ts} +0 -0
package/scripts/shared/env.ts
DELETED
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
import { existsSync } from "node:fs";
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
3
|
-
import { resolve } from "node:path";
|
|
4
|
-
import { PACKAGE_ROOT } from "../../src/config/package-paths";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Absolute path of the repository root.
|
|
8
|
-
*
|
|
9
|
-
* Operational scripts and the npm runtime share one package-root resolver so
|
|
10
|
-
* assets and repository config do not depend on the caller's working directory.
|
|
11
|
-
*/
|
|
12
|
-
export const PROJECT_ROOT = PACKAGE_ROOT;
|
|
13
|
-
|
|
14
|
-
/** Resolve the active `.env`; npm CLI sets a user-owned config directory. */
|
|
15
|
-
export function resolveEnvPath(env: NodeJS.ProcessEnv = process.env): string {
|
|
16
|
-
const configDir = env.CARTETHYIA_CONFIG_DIR?.trim();
|
|
17
|
-
return configDir ? resolve(configDir, ".env") : resolve(PROJECT_ROOT, ".env");
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/** Absolute path of the active `.env`. */
|
|
21
|
-
export const ENV_PATH = resolveEnvPath();
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Reads a dotenv-style file without overriding already-exported variables.
|
|
25
|
-
*/
|
|
26
|
-
export async function readEnvFile(path: string): Promise<Record<string, string>> {
|
|
27
|
-
if (!existsSync(path)) return {};
|
|
28
|
-
const content = await readFile(path, "utf8");
|
|
29
|
-
const values: Record<string, string> = {};
|
|
30
|
-
for (const line of content.split(/\r?\n/)) {
|
|
31
|
-
if (line.startsWith("#")) continue;
|
|
32
|
-
const separator = line.indexOf("=");
|
|
33
|
-
if (separator <= 0) continue;
|
|
34
|
-
const key = line.slice(0, separator).trim();
|
|
35
|
-
const value = line.slice(separator + 1).trim();
|
|
36
|
-
if (key) values[key] = value;
|
|
37
|
-
}
|
|
38
|
-
return values;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Shared utilities for setup and doctor scripts.
|
|
42
|
-
* These are extracted for testability and code reuse.
|
|
43
|
-
*/
|
|
44
|
-
|
|
45
|
-
export interface ProbeResult {
|
|
46
|
-
success: boolean;
|
|
47
|
-
error?: string;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Opens a TCP connection to `host:port` and resolves once it connects, errors,
|
|
52
|
-
* or the timeout elapses. The socket is always closed so a probe never leaves a
|
|
53
|
-
* half-open connection behind.
|
|
54
|
-
*/
|
|
55
|
-
export async function probeTcpService(
|
|
56
|
-
host: string,
|
|
57
|
-
port: number,
|
|
58
|
-
timeoutMs: number,
|
|
59
|
-
): Promise<ProbeResult> {
|
|
60
|
-
const { promise, resolve } = Promise.withResolvers<ProbeResult>();
|
|
61
|
-
|
|
62
|
-
const timeoutHandle = setTimeout(() => {
|
|
63
|
-
resolve({ success: false, error: "timeout" });
|
|
64
|
-
}, timeoutMs);
|
|
65
|
-
|
|
66
|
-
Bun.connect({
|
|
67
|
-
hostname: host,
|
|
68
|
-
port: port,
|
|
69
|
-
socket: {
|
|
70
|
-
open: () => {
|
|
71
|
-
clearTimeout(timeoutHandle);
|
|
72
|
-
resolve({ success: true });
|
|
73
|
-
},
|
|
74
|
-
data: () => {},
|
|
75
|
-
error: (err) => {
|
|
76
|
-
clearTimeout(timeoutHandle);
|
|
77
|
-
resolve({ success: false, error: String(err) });
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
})
|
|
81
|
-
.then((socket) => {
|
|
82
|
-
socket.end();
|
|
83
|
-
})
|
|
84
|
-
.catch((err) => {
|
|
85
|
-
clearTimeout(timeoutHandle);
|
|
86
|
-
resolve({ success: false, error: String(err) });
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
return promise;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Parses a service URL and requires an explicit host and port.
|
|
94
|
-
* Returns null if the URL is invalid or incomplete.
|
|
95
|
-
*/
|
|
96
|
-
/** Minimum Bun the repository declares in `package.json` `engines`. */
|
|
97
|
-
export const MINIMUM_BUN_VERSION = "1.4.0";
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* True when `actual` is at least `minimum`, compared as dotted integers.
|
|
101
|
-
* A non-numeric segment reads as 0, so a malformed version fails closed
|
|
102
|
-
* against a real minimum instead of passing.
|
|
103
|
-
*/
|
|
104
|
-
export function bunVersionAtLeast(actual: string, minimum: string): boolean {
|
|
105
|
-
const left = actual.split(".").map((part) => Number.parseInt(part, 10) || 0);
|
|
106
|
-
const right = minimum.split(".").map((part) => Number.parseInt(part, 10) || 0);
|
|
107
|
-
const length = Math.max(left.length, right.length);
|
|
108
|
-
for (let i = 0; i < length; i += 1) {
|
|
109
|
-
const a = left[i] ?? 0;
|
|
110
|
-
const b = right[i] ?? 0;
|
|
111
|
-
if (a !== b) return a > b;
|
|
112
|
-
}
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Local PostgreSQL ports worth probing before asking for a URL. 5432 is the
|
|
118
|
-
* server default (Laragon, Homebrew, systemd); 5433 is the usual second
|
|
119
|
-
* instance when 5432 is already taken.
|
|
120
|
-
*/
|
|
121
|
-
export const LOCAL_POSTGRES_CANDIDATES = [
|
|
122
|
-
{ host: "127.0.0.1", port: 5432 },
|
|
123
|
-
{ host: "127.0.0.1", port: 5433 },
|
|
124
|
-
] as const;
|
|
125
|
-
|
|
126
|
-
/** First local PostgreSQL that accepts a TCP connection, or null. */
|
|
127
|
-
export async function detectLocalPostgres(
|
|
128
|
-
timeoutMs: number,
|
|
129
|
-
): Promise<{ host: string; port: number } | null> {
|
|
130
|
-
for (const candidate of LOCAL_POSTGRES_CANDIDATES) {
|
|
131
|
-
const probe = await probeTcpService(candidate.host, candidate.port, timeoutMs);
|
|
132
|
-
if (probe.success) return candidate;
|
|
133
|
-
}
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export function parseServiceUrl(url: string): { host: string; port: number } | null {
|
|
138
|
-
try {
|
|
139
|
-
const urlObj = new URL(url);
|
|
140
|
-
if (!urlObj.hostname || !urlObj.port) return null;
|
|
141
|
-
return { host: urlObj.hostname, port: Number(urlObj.port) };
|
|
142
|
-
} catch {
|
|
143
|
-
return null;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export type LocalPlatform = "windows" | "macos" | "linux" | "unknown";
|
|
148
|
-
|
|
149
|
-
/** Detects the host platform once so setup/doctor share identical labels. */
|
|
150
|
-
export function getLocalPlatform(): LocalPlatform {
|
|
151
|
-
if (process.platform === "win32") return "windows";
|
|
152
|
-
if (process.platform === "darwin") return "macos";
|
|
153
|
-
if (process.platform === "linux") return "linux";
|
|
154
|
-
return "unknown";
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Returns actionable hints for the configured local/external service.
|
|
159
|
-
* These are hints only: setup never assumes Docker or silently mutates an
|
|
160
|
-
* external service. Windows users commonly run PostgreSQL through Laragon;
|
|
161
|
-
* Redis may be native, WSL-backed, or external.
|
|
162
|
-
*/
|
|
163
|
-
export function getOsHints(service: "postgres" | "redis"): string[] {
|
|
164
|
-
const platform = getLocalPlatform();
|
|
165
|
-
if (platform === "windows") {
|
|
166
|
-
return service === "postgres"
|
|
167
|
-
? [
|
|
168
|
-
"Windows / Laragon:",
|
|
169
|
-
" Start Laragon (Start All) and ensure PostgreSQL is enabled.",
|
|
170
|
-
" Verify PostgreSQL is listening on the DATABASE_URL host/port (usually 5432).",
|
|
171
|
-
" External PostgreSQL is also supported — keep DATABASE_URL unchanged and reachable.",
|
|
172
|
-
]
|
|
173
|
-
: [
|
|
174
|
-
"Windows / Redis:",
|
|
175
|
-
" Start Redis through WSL, a native Redis-compatible service, or an external host.",
|
|
176
|
-
" Verify Redis is listening on the REDIS_URL host/port (usually 6379).",
|
|
177
|
-
" Or omit REDIS_URL to use the in-memory backend.",
|
|
178
|
-
];
|
|
179
|
-
}
|
|
180
|
-
if (platform === "macos") {
|
|
181
|
-
return service === "postgres"
|
|
182
|
-
? [
|
|
183
|
-
"macOS / Homebrew:",
|
|
184
|
-
" brew services start postgresql@16 (or the installed PostgreSQL version).",
|
|
185
|
-
" External PostgreSQL is also supported — verify DATABASE_URL reachability.",
|
|
186
|
-
]
|
|
187
|
-
: [
|
|
188
|
-
"macOS / Redis:",
|
|
189
|
-
" brew services start redis, or use an external Redis instance.",
|
|
190
|
-
" Or omit REDIS_URL to use the in-memory backend.",
|
|
191
|
-
];
|
|
192
|
-
}
|
|
193
|
-
if (platform === "linux") {
|
|
194
|
-
return service === "postgres"
|
|
195
|
-
? [
|
|
196
|
-
"Linux / systemd:",
|
|
197
|
-
" sudo systemctl start postgresql (or the installed PostgreSQL service).",
|
|
198
|
-
" External PostgreSQL is also supported — verify DATABASE_URL reachability.",
|
|
199
|
-
]
|
|
200
|
-
: [
|
|
201
|
-
"Linux / Redis:",
|
|
202
|
-
" sudo systemctl start redis-server (or the installed Redis service).",
|
|
203
|
-
" Or omit REDIS_URL to use the in-memory backend.",
|
|
204
|
-
];
|
|
205
|
-
}
|
|
206
|
-
return [
|
|
207
|
-
`${service} is not reachable on this platform.`,
|
|
208
|
-
"Verify the configured service URL or use an external service.",
|
|
209
|
-
];
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Checks if a string contains a configured placeholder value.
|
|
213
|
-
*/
|
|
214
|
-
export function hasPlaceholderSecrets(value: string): boolean {
|
|
215
|
-
const normalized = value.toLowerCase();
|
|
216
|
-
return (
|
|
217
|
-
normalized.includes("replace-with") ||
|
|
218
|
-
normalized.includes("replace_me") ||
|
|
219
|
-
normalized.includes("your_")
|
|
220
|
-
);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Generates a 256-bit hex cartethyia encryption key.
|
|
225
|
-
*
|
|
226
|
-
* Hex is preferred over base64 because it never carries padding or `+`/`/`
|
|
227
|
-
* characters that confuse some dotenv shells, and it round-trips through
|
|
228
|
-
* every adapter that accepts either encoding. The install/setup helpers call
|
|
229
|
-
* this when the key is absent or still a placeholder.
|
|
230
|
-
*/
|
|
231
|
-
export function generateCartethyiaEncryptionKey(): string {
|
|
232
|
-
const bytes = new Uint8Array(32);
|
|
233
|
-
crypto.getRandomValues(bytes);
|
|
234
|
-
let hex = "";
|
|
235
|
-
for (let i = 0; i < bytes.length; i += 1) hex += bytes[i]!.toString(16).padStart(2, "0");
|
|
236
|
-
return hex;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Returns the mandatory-only `.env` body derived from `.env.example`.
|
|
241
|
-
*
|
|
242
|
-
* Mandatory means the key is assigned without a leading `#`. Optional entries
|
|
243
|
-
* (leading `#`) carry built-in defaults and must not be copied into a fresh
|
|
244
|
-
* `.env` — they would override the default with a literal `example` value.
|
|
245
|
-
* The generated body therefore contains only mandatory rows, plus a single
|
|
246
|
-
* `CARTETHYIA_ENCRYPTION_KEY` replacement when the caller supplies one.
|
|
247
|
-
*/
|
|
248
|
-
export async function mandatoryEnvBody(
|
|
249
|
-
examplePath: string,
|
|
250
|
-
overrides: Readonly<Record<string, string>> = {},
|
|
251
|
-
): Promise<string> {
|
|
252
|
-
const raw = await readFile(examplePath, "utf8");
|
|
253
|
-
const lines: string[] = [];
|
|
254
|
-
for (const line of raw.split(/\r?\n/)) {
|
|
255
|
-
const trimmed = line.trim();
|
|
256
|
-
if (trimmed === "" || trimmed.startsWith("#")) continue;
|
|
257
|
-
const sep = line.indexOf("=");
|
|
258
|
-
if (sep <= 0) continue;
|
|
259
|
-
const key = line.slice(0, sep).trim();
|
|
260
|
-
if (!key) continue;
|
|
261
|
-
const value = (overrides as Record<string, string>)[key] ?? line.slice(sep + 1).trim();
|
|
262
|
-
lines.push(`${key}=${value}`);
|
|
263
|
-
}
|
|
264
|
-
// Preserve overrides even when the example row was commented out (legacy case).
|
|
265
|
-
for (const [key, value] of Object.entries(overrides)) {
|
|
266
|
-
if (!lines.some((l) => l.startsWith(`${key}=`))) lines.push(`${key}=${value}`);
|
|
267
|
-
}
|
|
268
|
-
return `${lines.join("\n")}\n`;
|
|
269
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|