@useatlas/create 0.0.5 → 0.0.7
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/LICENSE +21 -0
- package/README.md +1 -1
- package/index.ts +253 -36
- package/package.json +4 -4
- package/templates/docker/Dockerfile +1 -1
- package/templates/docker/Dockerfile.sidecar +1 -1
- package/templates/docker/bin/__tests__/duckdb-ingest.test.ts +17 -14
- package/templates/docker/bin/__tests__/failure-threshold.test.ts +148 -0
- package/templates/docker/bin/__tests__/fatal-error-propagation.test.ts +267 -0
- package/templates/docker/bin/__tests__/profiler-heuristics.test.ts +5 -5
- package/templates/docker/bin/__tests__/schema-drift.test.ts +39 -0
- package/templates/docker/bin/atlas.ts +981 -1819
- package/templates/docker/bin/benchmark.ts +14 -16
- package/templates/docker/bin/enrich.ts +7 -2
- package/templates/docker/brand.css +13 -0
- package/templates/docker/data/cybersec-semantic/catalog.yml +222 -0
- package/templates/docker/data/cybersec-semantic/entities/alerts.yml +195 -0
- package/templates/docker/data/cybersec-semantic/entities/assets.yml +191 -0
- package/templates/docker/data/cybersec-semantic/entities/compliance_assessments.yml +170 -0
- package/templates/docker/data/cybersec-semantic/entities/incidents.yml +219 -0
- package/templates/docker/data/cybersec-semantic/entities/organizations.yml +136 -0
- package/templates/docker/data/cybersec-semantic/entities/plans.yml +114 -0
- package/templates/docker/data/cybersec-semantic/entities/remediation_actions.yml +212 -0
- package/templates/docker/data/cybersec-semantic/entities/scan_results.yml +215 -0
- package/templates/docker/data/cybersec-semantic/entities/scans.yml +180 -0
- package/templates/docker/data/cybersec-semantic/entities/subscriptions.yml +184 -0
- package/templates/docker/data/cybersec-semantic/entities/users.yml +140 -0
- package/templates/docker/data/cybersec-semantic/entities/vulnerabilities.yml +154 -0
- package/templates/docker/data/cybersec-semantic/glossary.yml +207 -0
- package/templates/docker/data/cybersec-semantic/metrics/business.yml +148 -0
- package/templates/docker/data/cybersec-semantic/metrics/compliance.yml +138 -0
- package/templates/docker/data/cybersec-semantic/metrics/security.yml +181 -0
- package/templates/docker/data/cybersec.sql +8 -8
- package/templates/docker/data/demo.sql +3 -0
- package/templates/docker/data/ecommerce-semantic/catalog.yml +221 -0
- package/templates/docker/data/ecommerce-semantic/entities/categories.yml +91 -0
- package/templates/docker/data/ecommerce-semantic/entities/customers.yml +133 -0
- package/templates/docker/data/ecommerce-semantic/entities/email_campaigns.yml +119 -0
- package/templates/docker/data/ecommerce-semantic/entities/inventory_levels.yml +153 -0
- package/templates/docker/data/ecommerce-semantic/entities/order_items.yml +159 -0
- package/templates/docker/data/ecommerce-semantic/entities/orders.yml +199 -0
- package/templates/docker/data/ecommerce-semantic/entities/payments.yml +140 -0
- package/templates/docker/data/ecommerce-semantic/entities/product_reviews.yml +155 -0
- package/templates/docker/data/ecommerce-semantic/entities/products.yml +178 -0
- package/templates/docker/data/ecommerce-semantic/entities/promotions.yml +171 -0
- package/templates/docker/data/ecommerce-semantic/entities/returns.yml +144 -0
- package/templates/docker/data/ecommerce-semantic/entities/sellers.yml +124 -0
- package/templates/docker/data/ecommerce-semantic/entities/shipments.yml +159 -0
- package/templates/docker/data/ecommerce-semantic/glossary.yml +193 -0
- package/templates/docker/data/ecommerce-semantic/metrics/customers.yml +116 -0
- package/templates/docker/data/ecommerce-semantic/metrics/operations.yml +131 -0
- package/templates/docker/data/ecommerce-semantic/metrics/revenue.yml +120 -0
- package/templates/docker/docs/deploy.md +2 -1
- package/templates/docker/ee/src/__mocks__/internal.ts +170 -0
- package/templates/docker/ee/src/audit/purge-scheduler.ts +113 -0
- package/templates/docker/ee/src/audit/retention.ts +467 -0
- package/templates/docker/ee/src/auth/ip-allowlist.ts +367 -0
- package/templates/docker/ee/src/auth/roles.ts +562 -0
- package/templates/docker/ee/src/auth/scim.ts +343 -0
- package/templates/docker/ee/src/auth/sso.ts +538 -0
- package/templates/docker/ee/src/backups/engine.ts +355 -0
- package/templates/docker/ee/src/backups/index.ts +26 -0
- package/templates/docker/ee/src/backups/restore.ts +169 -0
- package/templates/docker/ee/src/backups/scheduler.ts +153 -0
- package/templates/docker/ee/src/backups/verify.ts +124 -0
- package/templates/docker/ee/src/branding/white-label.ts +228 -0
- package/templates/docker/ee/src/compliance/masking.ts +477 -0
- package/templates/docker/ee/src/compliance/patterns.ts +16 -0
- package/templates/docker/ee/src/compliance/pii-detection.ts +217 -0
- package/templates/docker/ee/src/compliance/reports.ts +402 -0
- package/templates/docker/ee/src/deploy-mode.ts +37 -0
- package/templates/docker/ee/src/governance/approval.ts +699 -0
- package/templates/docker/ee/src/index.ts +74 -0
- package/templates/docker/ee/src/platform/domains.ts +562 -0
- package/templates/docker/ee/src/platform/model-routing.ts +382 -0
- package/templates/docker/ee/src/platform/residency.ts +265 -0
- package/templates/docker/ee/src/sla/alerting.ts +382 -0
- package/templates/docker/ee/src/sla/index.ts +12 -0
- package/templates/docker/ee/src/sla/metrics.ts +275 -0
- package/templates/docker/ee/src/test-setup.ts +1 -0
- package/templates/docker/next.config.ts +4 -1
- package/templates/docker/package.json +49 -29
- package/templates/docker/sidecar/Dockerfile +1 -1
- package/templates/docker/src/api/index.ts +336 -24
- package/templates/docker/src/api/routes/actions.ts +443 -176
- package/templates/docker/src/api/routes/admin-abuse.ts +219 -0
- package/templates/docker/src/api/routes/admin-approval.ts +418 -0
- package/templates/docker/src/api/routes/admin-audit-retention.ts +405 -0
- package/templates/docker/src/api/routes/admin-auth.ts +122 -0
- package/templates/docker/src/api/routes/admin-branding.ts +252 -0
- package/templates/docker/src/api/routes/admin-compliance.ts +352 -0
- package/templates/docker/src/api/routes/admin-domains.ts +334 -0
- package/templates/docker/src/api/routes/admin-integrations.ts +2667 -0
- package/templates/docker/src/api/routes/admin-ip-allowlist.ts +261 -0
- package/templates/docker/src/api/routes/admin-learned-patterns.ts +525 -0
- package/templates/docker/src/api/routes/admin-model-config.ts +252 -0
- package/templates/docker/src/api/routes/admin-onboarding-emails.ts +145 -0
- package/templates/docker/src/api/routes/admin-orgs.ts +710 -0
- package/templates/docker/src/api/routes/admin-prompts.ts +694 -0
- package/templates/docker/src/api/routes/admin-residency.ts +570 -0
- package/templates/docker/src/api/routes/admin-roles.ts +296 -0
- package/templates/docker/src/api/routes/admin-router.ts +120 -0
- package/templates/docker/src/api/routes/admin-sandbox.ts +417 -0
- package/templates/docker/src/api/routes/admin-scim.ts +262 -0
- package/templates/docker/src/api/routes/admin-sso.ts +545 -0
- package/templates/docker/src/api/routes/admin-suggestions.ts +176 -0
- package/templates/docker/src/api/routes/admin-usage.ts +310 -0
- package/templates/docker/src/api/routes/admin.ts +4156 -898
- package/templates/docker/src/api/routes/auth-preamble.ts +105 -0
- package/templates/docker/src/api/routes/billing.ts +397 -0
- package/templates/docker/src/api/routes/chat.ts +597 -334
- package/templates/docker/src/api/routes/conversations.ts +987 -132
- package/templates/docker/src/api/routes/demo.ts +673 -0
- package/templates/docker/src/api/routes/discord.ts +274 -0
- package/templates/docker/src/api/routes/ee-error-handler.ts +32 -0
- package/templates/docker/src/api/routes/health.ts +129 -14
- package/templates/docker/src/api/routes/middleware.ts +244 -0
- package/templates/docker/src/api/routes/onboarding-emails.ts +134 -0
- package/templates/docker/src/api/routes/onboarding.ts +1109 -0
- package/templates/docker/src/api/routes/openapi.ts +184 -1597
- package/templates/docker/src/api/routes/platform-admin.ts +760 -0
- package/templates/docker/src/api/routes/platform-backups.ts +436 -0
- package/templates/docker/src/api/routes/platform-domains.ts +235 -0
- package/templates/docker/src/api/routes/platform-residency.ts +257 -0
- package/templates/docker/src/api/routes/platform-sla.ts +379 -0
- package/templates/docker/src/api/routes/prompts.ts +221 -0
- package/templates/docker/src/api/routes/public-branding.ts +106 -0
- package/templates/docker/src/api/routes/query.ts +330 -219
- package/templates/docker/src/api/routes/scheduled-tasks.ts +393 -297
- package/templates/docker/src/api/routes/semantic.ts +179 -0
- package/templates/docker/src/api/routes/sessions.ts +210 -0
- package/templates/docker/src/api/routes/shared-domains.ts +98 -0
- package/templates/docker/src/api/routes/shared-schemas.ts +139 -0
- package/templates/docker/src/api/routes/slack.ts +209 -52
- package/templates/docker/src/api/routes/suggestions.ts +233 -0
- package/templates/docker/src/api/routes/tables.ts +67 -0
- package/templates/docker/src/api/routes/teams.ts +222 -0
- package/templates/docker/src/api/routes/validate-sql.ts +188 -0
- package/templates/docker/src/api/routes/validation-hook.ts +62 -0
- package/templates/docker/src/api/routes/widget-loader.ts +356 -0
- package/templates/docker/src/api/routes/widget.ts +428 -0
- package/templates/docker/src/api/routes/wizard.ts +852 -0
- package/templates/docker/src/api/server.ts +187 -69
- package/templates/docker/src/app/error.tsx +5 -2
- package/templates/docker/src/app/globals.css +1 -1
- package/templates/docker/src/app/layout.tsx +7 -2
- package/templates/docker/src/app/page.tsx +39 -5
- package/templates/docker/src/components/data-table/data-table-column-header.tsx +99 -0
- package/templates/docker/src/components/data-table/data-table-date-filter.tsx +225 -0
- package/templates/docker/src/components/data-table/data-table-expandable.tsx +125 -0
- package/templates/docker/src/components/data-table/data-table-faceted-filter.tsx +189 -0
- package/templates/docker/src/components/data-table/data-table-pagination.tsx +112 -0
- package/templates/docker/src/components/data-table/data-table-range-filter.tsx +122 -0
- package/templates/docker/src/components/data-table/data-table-slider-filter.tsx +256 -0
- package/templates/docker/src/components/data-table/data-table-sort-list.tsx +407 -0
- package/templates/docker/src/components/data-table/data-table-toolbar.tsx +149 -0
- package/templates/docker/src/components/data-table/data-table-view-options.tsx +89 -0
- package/templates/docker/src/components/data-table/data-table.tsx +105 -0
- package/templates/docker/src/components/form-dialog.tsx +135 -0
- package/templates/docker/src/components/ui/accordion.tsx +66 -0
- package/templates/docker/src/components/ui/calendar.tsx +220 -0
- package/templates/docker/src/components/ui/checkbox.tsx +32 -0
- package/templates/docker/src/components/ui/faceted.tsx +283 -0
- package/templates/docker/src/components/ui/form.tsx +167 -0
- package/templates/docker/src/components/ui/label.tsx +24 -0
- package/templates/docker/src/components/ui/popover.tsx +89 -0
- package/templates/docker/src/components/ui/progress.tsx +31 -0
- package/templates/docker/src/components/ui/scroll-area.tsx +6 -2
- package/templates/docker/src/components/ui/slider.tsx +63 -0
- package/templates/docker/src/components/ui/sortable.tsx +581 -0
- package/templates/docker/src/components/ui/switch.tsx +35 -0
- package/templates/docker/src/components/ui/textarea.tsx +18 -0
- package/templates/docker/src/config/data-table.ts +82 -0
- package/templates/docker/src/env-check.ts +74 -0
- package/templates/docker/src/hooks/use-callback-ref.ts +27 -0
- package/templates/docker/src/hooks/use-data-table.ts +316 -0
- package/templates/docker/src/hooks/use-debounced-callback.ts +28 -0
- package/templates/docker/src/lib/action-types.ts +7 -41
- package/templates/docker/src/lib/agent-query.ts +4 -2
- package/templates/docker/src/lib/agent.ts +363 -31
- package/templates/docker/src/lib/auth/admin-permissions.ts +38 -0
- package/templates/docker/src/lib/auth/audit.ts +19 -4
- package/templates/docker/src/lib/auth/byot.ts +3 -3
- package/templates/docker/src/lib/auth/client.ts +33 -3
- package/templates/docker/src/lib/auth/detect.ts +29 -8
- package/templates/docker/src/lib/auth/managed.ts +104 -14
- package/templates/docker/src/lib/auth/middleware.ts +53 -6
- package/templates/docker/src/lib/auth/migrate.ts +140 -15
- package/templates/docker/src/lib/auth/oauth-state.ts +123 -0
- package/templates/docker/src/lib/auth/org-permissions.ts +55 -0
- package/templates/docker/src/lib/auth/permissions.ts +26 -19
- package/templates/docker/src/lib/auth/server.ts +355 -9
- package/templates/docker/src/lib/auth/simple-key.ts +3 -3
- package/templates/docker/src/lib/auth/types.ts +15 -21
- package/templates/docker/src/lib/billing/enforcement.ts +368 -0
- package/templates/docker/src/lib/billing/plans.ts +155 -0
- package/templates/docker/src/lib/cache/index.ts +92 -0
- package/templates/docker/src/lib/cache/keys.ts +30 -0
- package/templates/docker/src/lib/cache/lru.ts +79 -0
- package/templates/docker/src/lib/cache/types.ts +31 -0
- package/templates/docker/src/lib/compose-refs.ts +62 -0
- package/templates/docker/src/lib/config.ts +563 -11
- package/templates/docker/src/lib/connection-types.ts +9 -0
- package/templates/docker/src/lib/conversation-types.ts +1 -25
- package/templates/docker/src/lib/conversations.ts +345 -14
- package/templates/docker/src/lib/data-table.ts +61 -0
- package/templates/docker/src/lib/db/connection.ts +793 -39
- package/templates/docker/src/lib/db/internal.ts +985 -139
- package/templates/docker/src/lib/db/migrate.ts +295 -0
- package/templates/docker/src/lib/db/migrations/0000_baseline.sql +703 -0
- package/templates/docker/src/lib/db/migrations/0001_teams_installations.sql +14 -0
- package/templates/docker/src/lib/db/migrations/0002_discord_installations.sql +14 -0
- package/templates/docker/src/lib/db/migrations/0003_telegram_installations.sql +15 -0
- package/templates/docker/src/lib/db/migrations/0004_sandbox_credentials.sql +18 -0
- package/templates/docker/src/lib/db/migrations/0005_oauth_state.sql +16 -0
- package/templates/docker/src/lib/db/migrations/0006_byot_credentials.sql +14 -0
- package/templates/docker/src/lib/db/migrations/0007_gchat_installations.sql +15 -0
- package/templates/docker/src/lib/db/migrations/0008_github_installations.sql +14 -0
- package/templates/docker/src/lib/db/migrations/0009_linear_installations.sql +15 -0
- package/templates/docker/src/lib/db/migrations/0010_whatsapp_installations.sql +14 -0
- package/templates/docker/src/lib/db/migrations/0011_email_installations.sql +16 -0
- package/templates/docker/src/lib/db/migrations/0012_region_migrations.sql +25 -0
- package/templates/docker/src/lib/db/schema.ts +1120 -0
- package/templates/docker/src/lib/db/source-rate-limit.ts +89 -139
- package/templates/docker/src/lib/demo.ts +308 -0
- package/templates/docker/src/lib/discord/store.ts +225 -0
- package/templates/docker/src/lib/effect/ai.ts +243 -0
- package/templates/docker/src/lib/effect/errors.ts +234 -0
- package/templates/docker/src/lib/effect/hono.ts +454 -0
- package/templates/docker/src/lib/effect/index.ts +137 -0
- package/templates/docker/src/lib/effect/layers.ts +496 -0
- package/templates/docker/src/lib/effect/services.ts +776 -0
- package/templates/docker/src/lib/effect/sql.ts +178 -0
- package/templates/docker/src/lib/effect/toolkit.ts +123 -0
- package/templates/docker/src/lib/email/delivery.ts +232 -0
- package/templates/docker/src/lib/email/engine.ts +349 -0
- package/templates/docker/src/lib/email/hooks.ts +107 -0
- package/templates/docker/src/lib/email/index.ts +16 -0
- package/templates/docker/src/lib/email/scheduler.ts +72 -0
- package/templates/docker/src/lib/email/sequence.ts +73 -0
- package/templates/docker/src/lib/email/store.ts +163 -0
- package/templates/docker/src/lib/email/templates.ts +215 -0
- package/templates/docker/src/lib/format.ts +67 -0
- package/templates/docker/src/lib/gchat/store.ts +202 -0
- package/templates/docker/src/lib/github/store.ts +197 -0
- package/templates/docker/src/lib/id.ts +29 -0
- package/templates/docker/src/lib/integrations/types.ts +166 -0
- package/templates/docker/src/lib/learn/pattern-analyzer.ts +224 -0
- package/templates/docker/src/lib/learn/pattern-cache.ts +229 -0
- package/templates/docker/src/lib/learn/pattern-proposer.ts +87 -0
- package/templates/docker/src/lib/learn/suggestion-helpers.ts +34 -0
- package/templates/docker/src/lib/learn/suggestions.ts +139 -0
- package/templates/docker/src/lib/linear/store.ts +200 -0
- package/templates/docker/src/lib/logger.ts +35 -3
- package/templates/docker/src/lib/metering.ts +272 -0
- package/templates/docker/src/lib/parsers.ts +99 -0
- package/templates/docker/src/lib/plugins/hooks.ts +13 -11
- package/templates/docker/src/lib/plugins/index.ts +3 -1
- package/templates/docker/src/lib/plugins/registry.ts +58 -6
- package/templates/docker/src/lib/plugins/settings.ts +147 -0
- package/templates/docker/src/lib/plugins/wiring.ts +6 -9
- package/templates/docker/src/lib/profiler.ts +1665 -0
- package/templates/docker/src/lib/providers.ts +188 -13
- package/templates/docker/src/lib/rls.ts +172 -60
- package/templates/docker/src/lib/sandbox/credentials.ts +206 -0
- package/templates/docker/src/lib/sandbox/validate.ts +179 -0
- package/templates/docker/src/lib/scheduled-task-types.ts +26 -94
- package/templates/docker/src/lib/scheduled-tasks.ts +174 -34
- package/templates/docker/src/lib/scheduler/delivery.ts +248 -150
- package/templates/docker/src/lib/scheduler/engine.ts +190 -154
- package/templates/docker/src/lib/scheduler/executor.ts +74 -23
- package/templates/docker/src/lib/scheduler/preview.ts +72 -0
- package/templates/docker/src/lib/security/abuse.ts +463 -0
- package/templates/docker/src/lib/semantic/diff.ts +267 -0
- package/templates/docker/src/lib/semantic/entities.ts +167 -0
- package/templates/docker/src/lib/semantic/files.ts +283 -0
- package/templates/docker/src/lib/semantic/index.ts +27 -0
- package/templates/docker/src/lib/{semantic-index.ts → semantic/search.ts} +80 -9
- package/templates/docker/src/lib/semantic/sync.ts +581 -0
- package/templates/docker/src/lib/{semantic.ts → semantic/whitelist.ts} +189 -3
- package/templates/docker/src/lib/settings.ts +817 -0
- package/templates/docker/src/lib/sidecar-types.ts +13 -0
- package/templates/docker/src/lib/slack/store.ts +134 -25
- package/templates/docker/src/lib/startup.ts +528 -362
- package/templates/docker/src/lib/teams/store.ts +216 -0
- package/templates/docker/src/lib/telegram/store.ts +202 -0
- package/templates/docker/src/lib/telemetry.ts +40 -0
- package/templates/docker/src/lib/tools/actions/audit.ts +8 -5
- package/templates/docker/src/lib/tools/actions/email.ts +3 -1
- package/templates/docker/src/lib/tools/actions/handler.ts +276 -93
- package/templates/docker/src/lib/tools/actions/jira.ts +2 -2
- package/templates/docker/src/lib/tools/backends/detect.ts +16 -0
- package/templates/docker/src/lib/tools/backends/index.ts +11 -0
- package/templates/docker/src/lib/tools/backends/nsjail.ts +213 -0
- package/templates/docker/src/lib/tools/backends/shared.ts +103 -0
- package/templates/docker/src/lib/tools/backends/types.ts +26 -0
- package/templates/docker/src/lib/tools/explore-nsjail.ts +7 -228
- package/templates/docker/src/lib/tools/explore-sandbox.ts +4 -29
- package/templates/docker/src/lib/tools/explore-sidecar.ts +18 -2
- package/templates/docker/src/lib/tools/explore.ts +246 -54
- package/templates/docker/src/lib/tools/index.ts +17 -0
- package/templates/docker/src/lib/tools/python-nsjail.ts +11 -139
- package/templates/docker/src/lib/tools/python-sandbox.ts +9 -132
- package/templates/docker/src/lib/tools/python-sidecar.ts +184 -3
- package/templates/docker/src/lib/tools/python-stream.ts +33 -0
- package/templates/docker/src/lib/tools/python-wrapper.ts +129 -0
- package/templates/docker/src/lib/tools/python.ts +115 -15
- package/templates/docker/src/lib/tools/registry.ts +14 -2
- package/templates/docker/src/lib/tools/sql.ts +778 -362
- package/templates/docker/src/lib/tracing.ts +16 -0
- package/templates/docker/src/lib/whatsapp/store.ts +198 -0
- package/templates/docker/src/lib/workspace.ts +89 -0
- package/templates/docker/src/progress.ts +121 -0
- package/templates/docker/src/types/data-table.ts +48 -0
- package/templates/docker/src/ui/atlas-chat-reexport.ts +3 -0
- package/templates/docker/src/ui/components/actions/action-approval-card.tsx +26 -19
- package/templates/docker/src/ui/components/actions/action-status-badge.tsx +3 -3
- package/templates/docker/src/ui/components/admin/admin-layout.tsx +57 -39
- package/templates/docker/src/ui/components/admin/admin-sidebar.tsx +213 -35
- package/templates/docker/src/ui/components/admin/delivery-status-badge.tsx +53 -0
- package/templates/docker/src/ui/components/admin/empty-state.tsx +27 -6
- package/templates/docker/src/ui/components/admin/entity-detail.tsx +3 -52
- package/templates/docker/src/ui/components/admin/error-banner.tsx +2 -2
- package/templates/docker/src/ui/components/admin/feature-disabled.tsx +28 -5
- package/templates/docker/src/ui/components/admin-content-wrapper.tsx +87 -0
- package/templates/docker/src/ui/components/atlas-chat.tsx +449 -166
- package/templates/docker/src/ui/components/branding-head.tsx +41 -0
- package/templates/docker/src/ui/components/chart/chart-detection.ts +62 -5
- package/templates/docker/src/ui/components/chart/result-chart.tsx +316 -125
- package/templates/docker/src/ui/components/chat/api-key-bar.tsx +4 -4
- package/templates/docker/src/ui/components/chat/data-table.tsx +45 -4
- package/templates/docker/src/ui/components/chat/error-banner.tsx +86 -5
- package/templates/docker/src/ui/components/chat/follow-up-chips.tsx +29 -0
- package/templates/docker/src/ui/components/chat/markdown.tsx +24 -0
- package/templates/docker/src/ui/components/chat/prompt-library.tsx +206 -0
- package/templates/docker/src/ui/components/chat/python-result-card.tsx +106 -78
- package/templates/docker/src/ui/components/chat/result-card-base.tsx +101 -0
- package/templates/docker/src/ui/components/chat/share-dialog.tsx +377 -0
- package/templates/docker/src/ui/components/chat/sql-result-card.tsx +94 -73
- package/templates/docker/src/ui/components/chat/suggestion-chips.tsx +46 -0
- package/templates/docker/src/ui/components/chat/tool-part.tsx +16 -4
- package/templates/docker/src/ui/components/conversations/conversation-item.tsx +48 -17
- package/templates/docker/src/ui/components/conversations/conversation-list.tsx +38 -24
- package/templates/docker/src/ui/components/conversations/conversation-sidebar.tsx +66 -7
- package/templates/docker/src/ui/components/conversations/delete-confirmation.tsx +9 -2
- package/templates/docker/src/ui/components/error-boundary.tsx +66 -0
- package/templates/docker/src/ui/components/notebook/delete-cell-dialog.tsx +48 -0
- package/templates/docker/src/ui/components/notebook/fork-branch-selector.tsx +68 -0
- package/templates/docker/src/ui/components/notebook/notebook-cell-input.tsx +76 -0
- package/templates/docker/src/ui/components/notebook/notebook-cell-output.tsx +58 -0
- package/templates/docker/src/ui/components/notebook/notebook-cell-toolbar.tsx +91 -0
- package/templates/docker/src/ui/components/notebook/notebook-cell.tsx +119 -0
- package/templates/docker/src/ui/components/notebook/notebook-empty-state.tsx +19 -0
- package/templates/docker/src/ui/components/notebook/notebook-export.ts +287 -0
- package/templates/docker/src/ui/components/notebook/notebook-input-bar.tsx +49 -0
- package/templates/docker/src/ui/components/notebook/notebook-shell.tsx +266 -0
- package/templates/docker/src/ui/components/notebook/notebook-text-cell.tsx +152 -0
- package/templates/docker/src/ui/components/notebook/types.ts +39 -0
- package/templates/docker/src/ui/components/notebook/use-keyboard-nav.ts +109 -0
- package/templates/docker/src/ui/components/notebook/use-notebook.ts +684 -0
- package/templates/docker/src/ui/components/org-switcher.tsx +111 -0
- package/templates/docker/src/ui/components/region-picker.tsx +103 -0
- package/templates/docker/src/ui/components/schema-explorer/schema-explorer.tsx +522 -0
- package/templates/docker/src/ui/components/social-icons.tsx +26 -0
- package/templates/docker/src/ui/components/tour/guided-tour.tsx +81 -0
- package/templates/docker/src/ui/components/tour/index.ts +5 -0
- package/templates/docker/src/ui/components/tour/nav-bar.tsx +100 -0
- package/templates/docker/src/ui/components/tour/tour-overlay.tsx +298 -0
- package/templates/docker/src/ui/components/tour/tour-steps.ts +43 -0
- package/templates/docker/src/ui/components/tour/types.ts +21 -0
- package/templates/docker/src/ui/components/tour/use-tour.ts +193 -0
- package/templates/docker/src/ui/context-reexport.ts +3 -0
- package/templates/docker/src/ui/hooks/theme-init-script.ts +17 -0
- package/templates/docker/src/ui/hooks/use-admin-fetch.ts +38 -30
- package/templates/docker/src/ui/hooks/use-admin-mutation.ts +188 -0
- package/templates/docker/src/ui/hooks/use-atlas-transport.ts +225 -0
- package/templates/docker/src/ui/hooks/use-branding.ts +68 -0
- package/templates/docker/src/ui/hooks/use-conversations.ts +106 -83
- package/templates/docker/src/ui/hooks/use-dark-mode.ts +134 -10
- package/templates/docker/src/ui/hooks/use-deploy-mode.ts +36 -0
- package/templates/docker/src/ui/hooks/use-platform-admin-guard.ts +49 -0
- package/templates/docker/src/ui/lib/action-types.ts +11 -63
- package/templates/docker/src/ui/lib/admin-schemas.ts +744 -0
- package/templates/docker/src/ui/lib/fetch-client.ts +84 -0
- package/templates/docker/src/ui/lib/fetch-error.ts +54 -0
- package/templates/docker/src/ui/lib/helpers.ts +94 -1
- package/templates/docker/src/ui/lib/types.ts +149 -140
- package/templates/docker/tsconfig.json +4 -2
- package/templates/nextjs-standalone/bin/__tests__/duckdb-ingest.test.ts +17 -14
- package/templates/nextjs-standalone/bin/__tests__/failure-threshold.test.ts +148 -0
- package/templates/nextjs-standalone/bin/__tests__/fatal-error-propagation.test.ts +267 -0
- package/templates/nextjs-standalone/bin/__tests__/profiler-heuristics.test.ts +5 -5
- package/templates/nextjs-standalone/bin/__tests__/schema-drift.test.ts +39 -0
- package/templates/nextjs-standalone/bin/atlas.ts +981 -1819
- package/templates/nextjs-standalone/bin/benchmark.ts +14 -16
- package/templates/nextjs-standalone/bin/enrich.ts +7 -2
- package/templates/nextjs-standalone/brand.css +13 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/catalog.yml +222 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/alerts.yml +195 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/assets.yml +191 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/compliance_assessments.yml +170 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/incidents.yml +219 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/organizations.yml +136 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/plans.yml +114 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/remediation_actions.yml +212 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/scan_results.yml +215 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/scans.yml +180 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/subscriptions.yml +184 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/users.yml +140 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/entities/vulnerabilities.yml +154 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/glossary.yml +207 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/metrics/business.yml +148 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/metrics/compliance.yml +138 -0
- package/templates/nextjs-standalone/data/cybersec-semantic/metrics/security.yml +181 -0
- package/templates/nextjs-standalone/data/cybersec.sql +8 -8
- package/templates/nextjs-standalone/data/demo.sql +3 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/catalog.yml +221 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/categories.yml +91 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/customers.yml +133 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/email_campaigns.yml +119 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/inventory_levels.yml +153 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/order_items.yml +159 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/orders.yml +199 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/payments.yml +140 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/product_reviews.yml +155 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/products.yml +178 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/promotions.yml +171 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/returns.yml +144 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/sellers.yml +124 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/entities/shipments.yml +159 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/glossary.yml +193 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/metrics/customers.yml +116 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/metrics/operations.yml +131 -0
- package/templates/nextjs-standalone/data/ecommerce-semantic/metrics/revenue.yml +120 -0
- package/templates/nextjs-standalone/docs/deploy.md +2 -1
- package/templates/nextjs-standalone/ee/src/__mocks__/internal.ts +170 -0
- package/templates/nextjs-standalone/ee/src/audit/purge-scheduler.ts +113 -0
- package/templates/nextjs-standalone/ee/src/audit/retention.ts +467 -0
- package/templates/nextjs-standalone/ee/src/auth/ip-allowlist.ts +367 -0
- package/templates/nextjs-standalone/ee/src/auth/roles.ts +562 -0
- package/templates/nextjs-standalone/ee/src/auth/scim.ts +343 -0
- package/templates/nextjs-standalone/ee/src/auth/sso.ts +538 -0
- package/templates/nextjs-standalone/ee/src/backups/engine.ts +355 -0
- package/templates/nextjs-standalone/ee/src/backups/index.ts +26 -0
- package/templates/nextjs-standalone/ee/src/backups/restore.ts +169 -0
- package/templates/nextjs-standalone/ee/src/backups/scheduler.ts +153 -0
- package/templates/nextjs-standalone/ee/src/backups/verify.ts +124 -0
- package/templates/nextjs-standalone/ee/src/branding/white-label.ts +228 -0
- package/templates/nextjs-standalone/ee/src/compliance/masking.ts +477 -0
- package/templates/nextjs-standalone/ee/src/compliance/patterns.ts +16 -0
- package/templates/nextjs-standalone/ee/src/compliance/pii-detection.ts +217 -0
- package/templates/nextjs-standalone/ee/src/compliance/reports.ts +402 -0
- package/templates/nextjs-standalone/ee/src/deploy-mode.ts +37 -0
- package/templates/nextjs-standalone/ee/src/governance/approval.ts +699 -0
- package/templates/nextjs-standalone/ee/src/index.ts +74 -0
- package/templates/nextjs-standalone/ee/src/platform/domains.ts +562 -0
- package/templates/nextjs-standalone/ee/src/platform/model-routing.ts +382 -0
- package/templates/nextjs-standalone/ee/src/platform/residency.ts +265 -0
- package/templates/nextjs-standalone/ee/src/sla/alerting.ts +382 -0
- package/templates/nextjs-standalone/ee/src/sla/index.ts +12 -0
- package/templates/nextjs-standalone/ee/src/sla/metrics.ts +275 -0
- package/templates/nextjs-standalone/ee/src/test-setup.ts +1 -0
- package/templates/nextjs-standalone/next.config.ts +1 -1
- package/templates/nextjs-standalone/package.json +50 -30
- package/templates/nextjs-standalone/src/api/index.ts +336 -24
- package/templates/nextjs-standalone/src/api/routes/actions.ts +443 -176
- package/templates/nextjs-standalone/src/api/routes/admin-abuse.ts +219 -0
- package/templates/nextjs-standalone/src/api/routes/admin-approval.ts +418 -0
- package/templates/nextjs-standalone/src/api/routes/admin-audit-retention.ts +405 -0
- package/templates/nextjs-standalone/src/api/routes/admin-auth.ts +122 -0
- package/templates/nextjs-standalone/src/api/routes/admin-branding.ts +252 -0
- package/templates/nextjs-standalone/src/api/routes/admin-compliance.ts +352 -0
- package/templates/nextjs-standalone/src/api/routes/admin-domains.ts +334 -0
- package/templates/nextjs-standalone/src/api/routes/admin-integrations.ts +2667 -0
- package/templates/nextjs-standalone/src/api/routes/admin-ip-allowlist.ts +261 -0
- package/templates/nextjs-standalone/src/api/routes/admin-learned-patterns.ts +525 -0
- package/templates/nextjs-standalone/src/api/routes/admin-model-config.ts +252 -0
- package/templates/nextjs-standalone/src/api/routes/admin-onboarding-emails.ts +145 -0
- package/templates/nextjs-standalone/src/api/routes/admin-orgs.ts +710 -0
- package/templates/nextjs-standalone/src/api/routes/admin-prompts.ts +694 -0
- package/templates/nextjs-standalone/src/api/routes/admin-residency.ts +570 -0
- package/templates/nextjs-standalone/src/api/routes/admin-roles.ts +296 -0
- package/templates/nextjs-standalone/src/api/routes/admin-router.ts +120 -0
- package/templates/nextjs-standalone/src/api/routes/admin-sandbox.ts +417 -0
- package/templates/nextjs-standalone/src/api/routes/admin-scim.ts +262 -0
- package/templates/nextjs-standalone/src/api/routes/admin-sso.ts +545 -0
- package/templates/nextjs-standalone/src/api/routes/admin-suggestions.ts +176 -0
- package/templates/nextjs-standalone/src/api/routes/admin-usage.ts +310 -0
- package/templates/nextjs-standalone/src/api/routes/admin.ts +4156 -898
- package/templates/nextjs-standalone/src/api/routes/auth-preamble.ts +105 -0
- package/templates/nextjs-standalone/src/api/routes/billing.ts +397 -0
- package/templates/nextjs-standalone/src/api/routes/chat.ts +597 -334
- package/templates/nextjs-standalone/src/api/routes/conversations.ts +987 -132
- package/templates/nextjs-standalone/src/api/routes/demo.ts +673 -0
- package/templates/nextjs-standalone/src/api/routes/discord.ts +274 -0
- package/templates/nextjs-standalone/src/api/routes/ee-error-handler.ts +32 -0
- package/templates/nextjs-standalone/src/api/routes/health.ts +129 -14
- package/templates/nextjs-standalone/src/api/routes/middleware.ts +244 -0
- package/templates/nextjs-standalone/src/api/routes/onboarding-emails.ts +134 -0
- package/templates/nextjs-standalone/src/api/routes/onboarding.ts +1109 -0
- package/templates/nextjs-standalone/src/api/routes/openapi.ts +184 -1597
- package/templates/nextjs-standalone/src/api/routes/platform-admin.ts +760 -0
- package/templates/nextjs-standalone/src/api/routes/platform-backups.ts +436 -0
- package/templates/nextjs-standalone/src/api/routes/platform-domains.ts +235 -0
- package/templates/nextjs-standalone/src/api/routes/platform-residency.ts +257 -0
- package/templates/nextjs-standalone/src/api/routes/platform-sla.ts +379 -0
- package/templates/nextjs-standalone/src/api/routes/prompts.ts +221 -0
- package/templates/nextjs-standalone/src/api/routes/public-branding.ts +106 -0
- package/templates/nextjs-standalone/src/api/routes/query.ts +330 -219
- package/templates/nextjs-standalone/src/api/routes/scheduled-tasks.ts +393 -297
- package/templates/nextjs-standalone/src/api/routes/semantic.ts +179 -0
- package/templates/nextjs-standalone/src/api/routes/sessions.ts +210 -0
- package/templates/nextjs-standalone/src/api/routes/shared-domains.ts +98 -0
- package/templates/nextjs-standalone/src/api/routes/shared-schemas.ts +139 -0
- package/templates/nextjs-standalone/src/api/routes/slack.ts +209 -52
- package/templates/nextjs-standalone/src/api/routes/suggestions.ts +233 -0
- package/templates/nextjs-standalone/src/api/routes/tables.ts +67 -0
- package/templates/nextjs-standalone/src/api/routes/teams.ts +222 -0
- package/templates/nextjs-standalone/src/api/routes/validate-sql.ts +188 -0
- package/templates/nextjs-standalone/src/api/routes/validation-hook.ts +62 -0
- package/templates/nextjs-standalone/src/api/routes/widget-loader.ts +356 -0
- package/templates/nextjs-standalone/src/api/routes/widget.ts +428 -0
- package/templates/nextjs-standalone/src/api/routes/wizard.ts +852 -0
- package/templates/nextjs-standalone/src/api/server.ts +187 -69
- package/templates/nextjs-standalone/src/app/error.tsx +5 -2
- package/templates/nextjs-standalone/src/app/globals.css +1 -1
- package/templates/nextjs-standalone/src/app/layout.tsx +7 -2
- package/templates/nextjs-standalone/src/app/page.tsx +39 -5
- package/templates/nextjs-standalone/src/components/data-table/data-table-column-header.tsx +99 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table-date-filter.tsx +225 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table-expandable.tsx +125 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table-faceted-filter.tsx +189 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table-pagination.tsx +112 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table-range-filter.tsx +122 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table-slider-filter.tsx +256 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table-sort-list.tsx +407 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table-toolbar.tsx +149 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table-view-options.tsx +89 -0
- package/templates/nextjs-standalone/src/components/data-table/data-table.tsx +105 -0
- package/templates/nextjs-standalone/src/components/form-dialog.tsx +135 -0
- package/templates/nextjs-standalone/src/components/ui/accordion.tsx +66 -0
- package/templates/nextjs-standalone/src/components/ui/calendar.tsx +220 -0
- package/templates/nextjs-standalone/src/components/ui/checkbox.tsx +32 -0
- package/templates/nextjs-standalone/src/components/ui/faceted.tsx +283 -0
- package/templates/nextjs-standalone/src/components/ui/form.tsx +167 -0
- package/templates/nextjs-standalone/src/components/ui/label.tsx +24 -0
- package/templates/nextjs-standalone/src/components/ui/popover.tsx +89 -0
- package/templates/nextjs-standalone/src/components/ui/progress.tsx +31 -0
- package/templates/nextjs-standalone/src/components/ui/scroll-area.tsx +6 -2
- package/templates/nextjs-standalone/src/components/ui/slider.tsx +63 -0
- package/templates/nextjs-standalone/src/components/ui/sortable.tsx +581 -0
- package/templates/nextjs-standalone/src/components/ui/switch.tsx +35 -0
- package/templates/nextjs-standalone/src/components/ui/textarea.tsx +18 -0
- package/templates/nextjs-standalone/src/config/data-table.ts +82 -0
- package/templates/nextjs-standalone/src/env-check.ts +74 -0
- package/templates/nextjs-standalone/src/hooks/use-callback-ref.ts +27 -0
- package/templates/nextjs-standalone/src/hooks/use-data-table.ts +316 -0
- package/templates/nextjs-standalone/src/hooks/use-debounced-callback.ts +28 -0
- package/templates/nextjs-standalone/src/lib/action-types.ts +7 -41
- package/templates/nextjs-standalone/src/lib/agent-query.ts +4 -2
- package/templates/nextjs-standalone/src/lib/agent.ts +363 -31
- package/templates/nextjs-standalone/src/lib/api-url.ts +2 -3
- package/templates/nextjs-standalone/src/lib/auth/admin-permissions.ts +38 -0
- package/templates/nextjs-standalone/src/lib/auth/audit.ts +19 -4
- package/templates/nextjs-standalone/src/lib/auth/byot.ts +3 -3
- package/templates/nextjs-standalone/src/lib/auth/detect.ts +29 -8
- package/templates/nextjs-standalone/src/lib/auth/managed.ts +104 -14
- package/templates/nextjs-standalone/src/lib/auth/middleware.ts +53 -6
- package/templates/nextjs-standalone/src/lib/auth/migrate.ts +140 -15
- package/templates/nextjs-standalone/src/lib/auth/oauth-state.ts +123 -0
- package/templates/nextjs-standalone/src/lib/auth/org-permissions.ts +55 -0
- package/templates/nextjs-standalone/src/lib/auth/permissions.ts +26 -19
- package/templates/nextjs-standalone/src/lib/auth/server.ts +355 -9
- package/templates/nextjs-standalone/src/lib/auth/simple-key.ts +3 -3
- package/templates/nextjs-standalone/src/lib/auth/types.ts +15 -21
- package/templates/nextjs-standalone/src/lib/billing/enforcement.ts +368 -0
- package/templates/nextjs-standalone/src/lib/billing/plans.ts +155 -0
- package/templates/nextjs-standalone/src/lib/cache/index.ts +92 -0
- package/templates/nextjs-standalone/src/lib/cache/keys.ts +30 -0
- package/templates/nextjs-standalone/src/lib/cache/lru.ts +79 -0
- package/templates/nextjs-standalone/src/lib/cache/types.ts +31 -0
- package/templates/nextjs-standalone/src/lib/compose-refs.ts +62 -0
- package/templates/nextjs-standalone/src/lib/config.ts +563 -11
- package/templates/nextjs-standalone/src/lib/connection-types.ts +9 -0
- package/templates/nextjs-standalone/src/lib/conversation-types.ts +1 -25
- package/templates/nextjs-standalone/src/lib/conversations.ts +345 -14
- package/templates/nextjs-standalone/src/lib/data-table.ts +61 -0
- package/templates/nextjs-standalone/src/lib/db/connection.ts +793 -39
- package/templates/nextjs-standalone/src/lib/db/internal.ts +985 -139
- package/templates/nextjs-standalone/src/lib/db/migrate.ts +295 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0000_baseline.sql +703 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0001_teams_installations.sql +14 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0002_discord_installations.sql +14 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0003_telegram_installations.sql +15 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0004_sandbox_credentials.sql +18 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0005_oauth_state.sql +16 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0006_byot_credentials.sql +14 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0007_gchat_installations.sql +15 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0008_github_installations.sql +14 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0009_linear_installations.sql +15 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0010_whatsapp_installations.sql +14 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0011_email_installations.sql +16 -0
- package/templates/nextjs-standalone/src/lib/db/migrations/0012_region_migrations.sql +25 -0
- package/templates/nextjs-standalone/src/lib/db/schema.ts +1120 -0
- package/templates/nextjs-standalone/src/lib/db/source-rate-limit.ts +89 -139
- package/templates/nextjs-standalone/src/lib/demo.ts +308 -0
- package/templates/nextjs-standalone/src/lib/discord/store.ts +225 -0
- package/templates/nextjs-standalone/src/lib/effect/ai.ts +243 -0
- package/templates/nextjs-standalone/src/lib/effect/errors.ts +234 -0
- package/templates/nextjs-standalone/src/lib/effect/hono.ts +454 -0
- package/templates/nextjs-standalone/src/lib/effect/index.ts +137 -0
- package/templates/nextjs-standalone/src/lib/effect/layers.ts +496 -0
- package/templates/nextjs-standalone/src/lib/effect/services.ts +776 -0
- package/templates/nextjs-standalone/src/lib/effect/sql.ts +178 -0
- package/templates/nextjs-standalone/src/lib/effect/toolkit.ts +123 -0
- package/templates/nextjs-standalone/src/lib/email/delivery.ts +232 -0
- package/templates/nextjs-standalone/src/lib/email/engine.ts +349 -0
- package/templates/nextjs-standalone/src/lib/email/hooks.ts +107 -0
- package/templates/nextjs-standalone/src/lib/email/index.ts +16 -0
- package/templates/nextjs-standalone/src/lib/email/scheduler.ts +72 -0
- package/templates/nextjs-standalone/src/lib/email/sequence.ts +73 -0
- package/templates/nextjs-standalone/src/lib/email/store.ts +163 -0
- package/templates/nextjs-standalone/src/lib/email/templates.ts +215 -0
- package/templates/nextjs-standalone/src/lib/format.test.ts +117 -0
- package/templates/nextjs-standalone/src/lib/format.ts +67 -0
- package/templates/nextjs-standalone/src/lib/gchat/store.ts +202 -0
- package/templates/nextjs-standalone/src/lib/github/store.ts +197 -0
- package/templates/nextjs-standalone/src/lib/id.ts +29 -0
- package/templates/nextjs-standalone/src/lib/integrations/types.ts +166 -0
- package/templates/nextjs-standalone/src/lib/learn/pattern-analyzer.ts +224 -0
- package/templates/nextjs-standalone/src/lib/learn/pattern-cache.ts +229 -0
- package/templates/nextjs-standalone/src/lib/learn/pattern-proposer.ts +87 -0
- package/templates/nextjs-standalone/src/lib/learn/suggestion-helpers.ts +34 -0
- package/templates/nextjs-standalone/src/lib/learn/suggestions.ts +139 -0
- package/templates/nextjs-standalone/src/lib/linear/store.ts +200 -0
- package/templates/nextjs-standalone/src/lib/logger.ts +35 -3
- package/templates/nextjs-standalone/src/lib/metering.ts +272 -0
- package/templates/nextjs-standalone/src/lib/parsers.ts +99 -0
- package/templates/nextjs-standalone/src/lib/plugins/hooks.ts +13 -11
- package/templates/nextjs-standalone/src/lib/plugins/index.ts +3 -1
- package/templates/nextjs-standalone/src/lib/plugins/registry.ts +58 -6
- package/templates/nextjs-standalone/src/lib/plugins/settings.ts +147 -0
- package/templates/nextjs-standalone/src/lib/plugins/wiring.ts +6 -9
- package/templates/nextjs-standalone/src/lib/profiler.ts +1665 -0
- package/templates/nextjs-standalone/src/lib/providers.ts +188 -13
- package/templates/nextjs-standalone/src/lib/rls.ts +172 -60
- package/templates/nextjs-standalone/src/lib/sandbox/credentials.ts +206 -0
- package/templates/nextjs-standalone/src/lib/sandbox/validate.ts +179 -0
- package/templates/nextjs-standalone/src/lib/scheduled-task-types.ts +26 -94
- package/templates/nextjs-standalone/src/lib/scheduled-tasks.ts +174 -34
- package/templates/nextjs-standalone/src/lib/scheduler/delivery.ts +248 -150
- package/templates/nextjs-standalone/src/lib/scheduler/engine.ts +190 -154
- package/templates/nextjs-standalone/src/lib/scheduler/executor.ts +74 -23
- package/templates/nextjs-standalone/src/lib/scheduler/preview.ts +72 -0
- package/templates/nextjs-standalone/src/lib/security/abuse.ts +463 -0
- package/templates/nextjs-standalone/src/lib/semantic/diff.ts +267 -0
- package/templates/nextjs-standalone/src/lib/semantic/entities.ts +167 -0
- package/templates/nextjs-standalone/src/lib/semantic/files.ts +283 -0
- package/templates/nextjs-standalone/src/lib/semantic/index.ts +27 -0
- package/templates/nextjs-standalone/src/lib/{semantic-index.ts → semantic/search.ts} +80 -9
- package/templates/nextjs-standalone/src/lib/semantic/sync.ts +581 -0
- package/templates/nextjs-standalone/src/lib/{semantic.ts → semantic/whitelist.ts} +189 -3
- package/templates/nextjs-standalone/src/lib/settings.ts +817 -0
- package/templates/nextjs-standalone/src/lib/sidecar-types.ts +13 -0
- package/templates/nextjs-standalone/src/lib/slack/store.ts +134 -25
- package/templates/nextjs-standalone/src/lib/startup.ts +528 -362
- package/templates/nextjs-standalone/src/lib/teams/store.ts +216 -0
- package/templates/nextjs-standalone/src/lib/telegram/store.ts +202 -0
- package/templates/nextjs-standalone/src/lib/telemetry.ts +40 -0
- package/templates/nextjs-standalone/src/lib/tools/actions/audit.ts +8 -5
- package/templates/nextjs-standalone/src/lib/tools/actions/email.ts +3 -1
- package/templates/nextjs-standalone/src/lib/tools/actions/handler.ts +276 -93
- package/templates/nextjs-standalone/src/lib/tools/actions/jira.ts +2 -2
- package/templates/nextjs-standalone/src/lib/tools/backends/detect.ts +16 -0
- package/templates/nextjs-standalone/src/lib/tools/backends/index.ts +11 -0
- package/templates/nextjs-standalone/src/lib/tools/backends/nsjail.ts +213 -0
- package/templates/nextjs-standalone/src/lib/tools/backends/shared.ts +103 -0
- package/templates/nextjs-standalone/src/lib/tools/backends/types.ts +26 -0
- package/templates/nextjs-standalone/src/lib/tools/explore-nsjail.ts +7 -228
- package/templates/nextjs-standalone/src/lib/tools/explore-sandbox.ts +4 -29
- package/templates/nextjs-standalone/src/lib/tools/explore-sidecar.ts +18 -2
- package/templates/nextjs-standalone/src/lib/tools/explore.ts +246 -54
- package/templates/nextjs-standalone/src/lib/tools/index.ts +17 -0
- package/templates/nextjs-standalone/src/lib/tools/python-nsjail.ts +11 -139
- package/templates/nextjs-standalone/src/lib/tools/python-sandbox.ts +9 -132
- package/templates/nextjs-standalone/src/lib/tools/python-sidecar.ts +184 -3
- package/templates/nextjs-standalone/src/lib/tools/python-stream.ts +33 -0
- package/templates/nextjs-standalone/src/lib/tools/python-wrapper.ts +129 -0
- package/templates/nextjs-standalone/src/lib/tools/python.ts +115 -15
- package/templates/nextjs-standalone/src/lib/tools/registry.ts +14 -2
- package/templates/nextjs-standalone/src/lib/tools/sql.ts +778 -362
- package/templates/nextjs-standalone/src/lib/tracing.ts +16 -0
- package/templates/nextjs-standalone/src/lib/whatsapp/store.ts +198 -0
- package/templates/nextjs-standalone/src/lib/workspace.ts +89 -0
- package/templates/nextjs-standalone/src/progress.ts +121 -0
- package/templates/nextjs-standalone/src/types/data-table.ts +48 -0
- package/templates/nextjs-standalone/src/ui/atlas-chat-reexport.ts +3 -0
- package/templates/nextjs-standalone/src/ui/components/actions/action-approval-card.tsx +26 -19
- package/templates/nextjs-standalone/src/ui/components/actions/action-status-badge.tsx +3 -3
- package/templates/nextjs-standalone/src/ui/components/admin/admin-layout.tsx +57 -39
- package/templates/nextjs-standalone/src/ui/components/admin/admin-sidebar.tsx +213 -35
- package/templates/nextjs-standalone/src/ui/components/admin/delivery-status-badge.tsx +53 -0
- package/templates/nextjs-standalone/src/ui/components/admin/empty-state.tsx +27 -6
- package/templates/nextjs-standalone/src/ui/components/admin/entity-detail.tsx +3 -52
- package/templates/nextjs-standalone/src/ui/components/admin/error-banner.tsx +2 -2
- package/templates/nextjs-standalone/src/ui/components/admin/feature-disabled.tsx +28 -5
- package/templates/nextjs-standalone/src/ui/components/admin-content-wrapper.tsx +87 -0
- package/templates/nextjs-standalone/src/ui/components/atlas-chat.tsx +449 -166
- package/templates/nextjs-standalone/src/ui/components/branding-head.tsx +41 -0
- package/templates/nextjs-standalone/src/ui/components/chart/chart-detection.ts +62 -5
- package/templates/nextjs-standalone/src/ui/components/chart/result-chart.tsx +316 -125
- package/templates/nextjs-standalone/src/ui/components/chat/api-key-bar.tsx +4 -4
- package/templates/nextjs-standalone/src/ui/components/chat/data-table.tsx +45 -4
- package/templates/nextjs-standalone/src/ui/components/chat/error-banner.tsx +86 -5
- package/templates/nextjs-standalone/src/ui/components/chat/follow-up-chips.tsx +29 -0
- package/templates/nextjs-standalone/src/ui/components/chat/markdown.tsx +24 -0
- package/templates/nextjs-standalone/src/ui/components/chat/prompt-library.tsx +206 -0
- package/templates/nextjs-standalone/src/ui/components/chat/python-result-card.tsx +106 -78
- package/templates/nextjs-standalone/src/ui/components/chat/result-card-base.tsx +101 -0
- package/templates/nextjs-standalone/src/ui/components/chat/share-dialog.tsx +377 -0
- package/templates/nextjs-standalone/src/ui/components/chat/sql-result-card.tsx +94 -73
- package/templates/nextjs-standalone/src/ui/components/chat/suggestion-chips.tsx +46 -0
- package/templates/nextjs-standalone/src/ui/components/chat/tool-part.tsx +16 -4
- package/templates/nextjs-standalone/src/ui/components/conversations/conversation-item.tsx +48 -17
- package/templates/nextjs-standalone/src/ui/components/conversations/conversation-list.tsx +38 -24
- package/templates/nextjs-standalone/src/ui/components/conversations/conversation-sidebar.tsx +66 -7
- package/templates/nextjs-standalone/src/ui/components/conversations/delete-confirmation.tsx +9 -2
- package/templates/nextjs-standalone/src/ui/components/error-boundary.tsx +66 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/delete-cell-dialog.tsx +48 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/fork-branch-selector.tsx +68 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/notebook-cell-input.tsx +76 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/notebook-cell-output.tsx +58 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/notebook-cell-toolbar.tsx +91 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/notebook-cell.tsx +119 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/notebook-empty-state.tsx +19 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/notebook-export.ts +287 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/notebook-input-bar.tsx +49 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/notebook-shell.tsx +266 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/notebook-text-cell.tsx +152 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/types.ts +39 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/use-keyboard-nav.ts +109 -0
- package/templates/nextjs-standalone/src/ui/components/notebook/use-notebook.ts +684 -0
- package/templates/nextjs-standalone/src/ui/components/org-switcher.tsx +111 -0
- package/templates/nextjs-standalone/src/ui/components/region-picker.tsx +103 -0
- package/templates/nextjs-standalone/src/ui/components/schema-explorer/schema-explorer.tsx +522 -0
- package/templates/nextjs-standalone/src/ui/components/social-icons.tsx +26 -0
- package/templates/nextjs-standalone/src/ui/components/tour/guided-tour.tsx +81 -0
- package/templates/nextjs-standalone/src/ui/components/tour/index.ts +5 -0
- package/templates/nextjs-standalone/src/ui/components/tour/nav-bar.tsx +100 -0
- package/templates/nextjs-standalone/src/ui/components/tour/tour-overlay.tsx +298 -0
- package/templates/nextjs-standalone/src/ui/components/tour/tour-steps.ts +43 -0
- package/templates/nextjs-standalone/src/ui/components/tour/types.ts +21 -0
- package/templates/nextjs-standalone/src/ui/components/tour/use-tour.ts +193 -0
- package/templates/nextjs-standalone/src/ui/context-reexport.ts +3 -0
- package/templates/nextjs-standalone/src/ui/hooks/theme-init-script.ts +17 -0
- package/templates/nextjs-standalone/src/ui/hooks/use-admin-fetch.ts +38 -30
- package/templates/nextjs-standalone/src/ui/hooks/use-admin-mutation.ts +188 -0
- package/templates/nextjs-standalone/src/ui/hooks/use-atlas-transport.ts +225 -0
- package/templates/nextjs-standalone/src/ui/hooks/use-branding.ts +68 -0
- package/templates/nextjs-standalone/src/ui/hooks/use-conversations.ts +106 -83
- package/templates/nextjs-standalone/src/ui/hooks/use-dark-mode.ts +134 -10
- package/templates/nextjs-standalone/src/ui/hooks/use-deploy-mode.ts +36 -0
- package/templates/nextjs-standalone/src/ui/hooks/use-platform-admin-guard.ts +49 -0
- package/templates/nextjs-standalone/src/ui/lib/action-types.ts +11 -63
- package/templates/nextjs-standalone/src/ui/lib/admin-schemas.ts +744 -0
- package/templates/nextjs-standalone/src/ui/lib/fetch-client.ts +84 -0
- package/templates/nextjs-standalone/src/ui/lib/fetch-error.ts +54 -0
- package/templates/nextjs-standalone/src/ui/lib/helpers.ts +94 -1
- package/templates/nextjs-standalone/src/ui/lib/types.ts +149 -140
- package/templates/nextjs-standalone/tsconfig.json +3 -2
- package/templates/docker/src/api/__tests__/actions.test.ts +0 -683
- package/templates/docker/src/api/__tests__/admin.test.ts +0 -820
- package/templates/docker/src/api/__tests__/auth.test.ts +0 -165
- package/templates/docker/src/api/__tests__/chat.test.ts +0 -376
- package/templates/docker/src/api/__tests__/conversations.test.ts +0 -555
- package/templates/docker/src/api/__tests__/cors.test.ts +0 -135
- package/templates/docker/src/api/__tests__/health-plugin.test.ts +0 -176
- package/templates/docker/src/api/__tests__/health.test.ts +0 -283
- package/templates/docker/src/api/__tests__/query.test.ts +0 -891
- package/templates/docker/src/api/__tests__/scheduled-tasks.test.ts +0 -601
- package/templates/docker/src/api/__tests__/slack.test.ts +0 -847
- package/templates/docker/src/lib/__tests__/agent-cache.test.ts +0 -439
- package/templates/docker/src/lib/__tests__/agent-dialect.test.ts +0 -131
- package/templates/docker/src/lib/__tests__/agent-health-annotations.test.ts +0 -166
- package/templates/docker/src/lib/__tests__/agent-integration.test.ts +0 -516
- package/templates/docker/src/lib/__tests__/config-actions.test.ts +0 -166
- package/templates/docker/src/lib/__tests__/config.test.ts +0 -1113
- package/templates/docker/src/lib/__tests__/conversations.test.ts +0 -589
- package/templates/docker/src/lib/__tests__/errors.test.ts +0 -256
- package/templates/docker/src/lib/__tests__/logger.test.ts +0 -200
- package/templates/docker/src/lib/__tests__/plugin-aware-validation.test.ts +0 -321
- package/templates/docker/src/lib/__tests__/providers.test.ts +0 -130
- package/templates/docker/src/lib/__tests__/rls.test.ts +0 -435
- package/templates/docker/src/lib/__tests__/scheduled-task-types.test.ts +0 -124
- package/templates/docker/src/lib/__tests__/scheduled-tasks.test.ts +0 -550
- package/templates/docker/src/lib/__tests__/semantic-index.test.ts +0 -547
- package/templates/docker/src/lib/__tests__/semantic-multisource.test.ts +0 -544
- package/templates/docker/src/lib/__tests__/semantic.test.ts +0 -363
- package/templates/docker/src/lib/__tests__/startup-actions.test.ts +0 -461
- package/templates/docker/src/lib/__tests__/startup-first-run.test.ts +0 -429
- package/templates/docker/src/lib/__tests__/startup.test.ts +0 -470
- package/templates/docker/src/lib/__tests__/tracing.test.ts +0 -28
- package/templates/docker/src/lib/auth/__tests__/audit.test.ts +0 -418
- package/templates/docker/src/lib/auth/__tests__/byot-integration.test.ts +0 -222
- package/templates/docker/src/lib/auth/__tests__/byot.test.ts +0 -366
- package/templates/docker/src/lib/auth/__tests__/detect.test.ts +0 -190
- package/templates/docker/src/lib/auth/__tests__/managed.test.ts +0 -173
- package/templates/docker/src/lib/auth/__tests__/middleware.test.ts +0 -456
- package/templates/docker/src/lib/auth/__tests__/migrate.test.ts +0 -203
- package/templates/docker/src/lib/auth/__tests__/permissions.test.ts +0 -225
- package/templates/docker/src/lib/auth/__tests__/server.test.ts +0 -34
- package/templates/docker/src/lib/auth/__tests__/simple-key.test.ts +0 -176
- package/templates/docker/src/lib/auth/__tests__/types.test.ts +0 -44
- package/templates/docker/src/lib/db/__tests__/connection.test.ts +0 -144
- package/templates/docker/src/lib/db/__tests__/internal.test.ts +0 -387
- package/templates/docker/src/lib/db/__tests__/registry-health.test.ts +0 -190
- package/templates/docker/src/lib/db/__tests__/registry-pool-limits.test.ts +0 -137
- package/templates/docker/src/lib/db/__tests__/registry.test.ts +0 -398
- package/templates/docker/src/lib/db/__tests__/source-rate-limit.test.ts +0 -130
- package/templates/docker/src/lib/errors.ts +0 -154
- package/templates/docker/src/lib/plugins/__tests__/hooks-integration.test.ts +0 -204
- package/templates/docker/src/lib/plugins/__tests__/hooks.test.ts +0 -529
- package/templates/docker/src/lib/plugins/__tests__/migrate.test.ts +0 -875
- package/templates/docker/src/lib/plugins/__tests__/registry.test.ts +0 -373
- package/templates/docker/src/lib/plugins/__tests__/tools.test.ts +0 -49
- package/templates/docker/src/lib/plugins/__tests__/wiring.test.ts +0 -799
- package/templates/docker/src/lib/scheduler/__tests__/delivery.test.ts +0 -192
- package/templates/docker/src/lib/scheduler/__tests__/engine.test.ts +0 -248
- package/templates/docker/src/lib/scheduler/__tests__/format-email.test.ts +0 -96
- package/templates/docker/src/lib/scheduler/__tests__/format-slack.test.ts +0 -78
- package/templates/docker/src/lib/scheduler/__tests__/format-webhook.test.ts +0 -78
- package/templates/docker/src/lib/scheduler/index.ts +0 -7
- package/templates/docker/src/lib/slack/__tests__/api.test.ts +0 -160
- package/templates/docker/src/lib/slack/__tests__/format.test.ts +0 -237
- package/templates/docker/src/lib/slack/__tests__/store.test.ts +0 -188
- package/templates/docker/src/lib/slack/__tests__/threads.test.ts +0 -112
- package/templates/docker/src/lib/slack/__tests__/verify.test.ts +0 -111
- package/templates/docker/src/lib/tools/__tests__/action-permissions.test.ts +0 -594
- package/templates/docker/src/lib/tools/__tests__/custom-validation.test.ts +0 -240
- package/templates/docker/src/lib/tools/__tests__/explore-backend.test.ts +0 -267
- package/templates/docker/src/lib/tools/__tests__/explore-nsjail.test.ts +0 -506
- package/templates/docker/src/lib/tools/__tests__/explore-plugin.test.ts +0 -374
- package/templates/docker/src/lib/tools/__tests__/explore-sdk-compat.test.ts +0 -82
- package/templates/docker/src/lib/tools/__tests__/explore-sidecar.test.ts +0 -210
- package/templates/docker/src/lib/tools/__tests__/python-nsjail.test.ts +0 -515
- package/templates/docker/src/lib/tools/__tests__/python-sandbox.test.ts +0 -397
- package/templates/docker/src/lib/tools/__tests__/python-sidecar.test.ts +0 -365
- package/templates/docker/src/lib/tools/__tests__/python.test.ts +0 -331
- package/templates/docker/src/lib/tools/__tests__/registry-actions.test.ts +0 -132
- package/templates/docker/src/lib/tools/__tests__/registry.test.ts +0 -242
- package/templates/docker/src/lib/tools/__tests__/sql-audit.test.ts +0 -227
- package/templates/docker/src/lib/tools/__tests__/sql-connection-whitelist.test.ts +0 -100
- package/templates/docker/src/lib/tools/__tests__/sql-ratelimit.test.ts +0 -227
- package/templates/docker/src/lib/tools/__tests__/sql.test.ts +0 -709
- package/templates/docker/src/lib/tools/actions/__tests__/audit.test.ts +0 -211
- package/templates/docker/src/lib/tools/actions/__tests__/email.test.ts +0 -378
- package/templates/docker/src/lib/tools/actions/__tests__/handler.test.ts +0 -681
- package/templates/docker/src/lib/tools/actions/__tests__/jira.test.ts +0 -427
- package/templates/docker/src/test-setup.ts +0 -38
- package/templates/docker/src/types/vercel-sandbox.d.ts +0 -61
- package/templates/docker/src/ui/components/chat/managed-auth-card.tsx +0 -116
- package/templates/nextjs-standalone/src/api/__tests__/actions.test.ts +0 -683
- package/templates/nextjs-standalone/src/api/__tests__/admin.test.ts +0 -820
- package/templates/nextjs-standalone/src/api/__tests__/auth.test.ts +0 -165
- package/templates/nextjs-standalone/src/api/__tests__/chat.test.ts +0 -376
- package/templates/nextjs-standalone/src/api/__tests__/conversations.test.ts +0 -555
- package/templates/nextjs-standalone/src/api/__tests__/cors.test.ts +0 -135
- package/templates/nextjs-standalone/src/api/__tests__/health-plugin.test.ts +0 -176
- package/templates/nextjs-standalone/src/api/__tests__/health.test.ts +0 -283
- package/templates/nextjs-standalone/src/api/__tests__/query.test.ts +0 -891
- package/templates/nextjs-standalone/src/api/__tests__/scheduled-tasks.test.ts +0 -601
- package/templates/nextjs-standalone/src/api/__tests__/slack.test.ts +0 -847
- package/templates/nextjs-standalone/src/app/global-error.tsx +0 -68
- package/templates/nextjs-standalone/src/lib/__tests__/agent-cache.test.ts +0 -439
- package/templates/nextjs-standalone/src/lib/__tests__/agent-dialect.test.ts +0 -131
- package/templates/nextjs-standalone/src/lib/__tests__/agent-health-annotations.test.ts +0 -166
- package/templates/nextjs-standalone/src/lib/__tests__/agent-integration.test.ts +0 -516
- package/templates/nextjs-standalone/src/lib/__tests__/config-actions.test.ts +0 -166
- package/templates/nextjs-standalone/src/lib/__tests__/config.test.ts +0 -1113
- package/templates/nextjs-standalone/src/lib/__tests__/conversations.test.ts +0 -589
- package/templates/nextjs-standalone/src/lib/__tests__/errors.test.ts +0 -256
- package/templates/nextjs-standalone/src/lib/__tests__/logger.test.ts +0 -200
- package/templates/nextjs-standalone/src/lib/__tests__/plugin-aware-validation.test.ts +0 -321
- package/templates/nextjs-standalone/src/lib/__tests__/providers.test.ts +0 -130
- package/templates/nextjs-standalone/src/lib/__tests__/rls.test.ts +0 -435
- package/templates/nextjs-standalone/src/lib/__tests__/scheduled-task-types.test.ts +0 -124
- package/templates/nextjs-standalone/src/lib/__tests__/scheduled-tasks.test.ts +0 -550
- package/templates/nextjs-standalone/src/lib/__tests__/semantic-index.test.ts +0 -547
- package/templates/nextjs-standalone/src/lib/__tests__/semantic-multisource.test.ts +0 -544
- package/templates/nextjs-standalone/src/lib/__tests__/semantic.test.ts +0 -363
- package/templates/nextjs-standalone/src/lib/__tests__/startup-actions.test.ts +0 -461
- package/templates/nextjs-standalone/src/lib/__tests__/startup-first-run.test.ts +0 -429
- package/templates/nextjs-standalone/src/lib/__tests__/startup.test.ts +0 -470
- package/templates/nextjs-standalone/src/lib/__tests__/tracing.test.ts +0 -28
- package/templates/nextjs-standalone/src/lib/auth/__tests__/audit.test.ts +0 -418
- package/templates/nextjs-standalone/src/lib/auth/__tests__/byot-integration.test.ts +0 -222
- package/templates/nextjs-standalone/src/lib/auth/__tests__/byot.test.ts +0 -366
- package/templates/nextjs-standalone/src/lib/auth/__tests__/detect.test.ts +0 -190
- package/templates/nextjs-standalone/src/lib/auth/__tests__/managed.test.ts +0 -173
- package/templates/nextjs-standalone/src/lib/auth/__tests__/middleware.test.ts +0 -456
- package/templates/nextjs-standalone/src/lib/auth/__tests__/migrate.test.ts +0 -203
- package/templates/nextjs-standalone/src/lib/auth/__tests__/permissions.test.ts +0 -225
- package/templates/nextjs-standalone/src/lib/auth/__tests__/server.test.ts +0 -34
- package/templates/nextjs-standalone/src/lib/auth/__tests__/simple-key.test.ts +0 -176
- package/templates/nextjs-standalone/src/lib/auth/__tests__/types.test.ts +0 -44
- package/templates/nextjs-standalone/src/lib/db/__tests__/connection.test.ts +0 -144
- package/templates/nextjs-standalone/src/lib/db/__tests__/internal.test.ts +0 -387
- package/templates/nextjs-standalone/src/lib/db/__tests__/registry-health.test.ts +0 -190
- package/templates/nextjs-standalone/src/lib/db/__tests__/registry-pool-limits.test.ts +0 -137
- package/templates/nextjs-standalone/src/lib/db/__tests__/registry.test.ts +0 -398
- package/templates/nextjs-standalone/src/lib/db/__tests__/source-rate-limit.test.ts +0 -130
- package/templates/nextjs-standalone/src/lib/errors.ts +0 -154
- package/templates/nextjs-standalone/src/lib/plugins/__tests__/hooks-integration.test.ts +0 -204
- package/templates/nextjs-standalone/src/lib/plugins/__tests__/hooks.test.ts +0 -529
- package/templates/nextjs-standalone/src/lib/plugins/__tests__/migrate.test.ts +0 -875
- package/templates/nextjs-standalone/src/lib/plugins/__tests__/registry.test.ts +0 -373
- package/templates/nextjs-standalone/src/lib/plugins/__tests__/tools.test.ts +0 -49
- package/templates/nextjs-standalone/src/lib/plugins/__tests__/wiring.test.ts +0 -799
- package/templates/nextjs-standalone/src/lib/scheduler/__tests__/delivery.test.ts +0 -192
- package/templates/nextjs-standalone/src/lib/scheduler/__tests__/engine.test.ts +0 -248
- package/templates/nextjs-standalone/src/lib/scheduler/__tests__/format-email.test.ts +0 -96
- package/templates/nextjs-standalone/src/lib/scheduler/__tests__/format-slack.test.ts +0 -78
- package/templates/nextjs-standalone/src/lib/scheduler/__tests__/format-webhook.test.ts +0 -78
- package/templates/nextjs-standalone/src/lib/scheduler/index.ts +0 -7
- package/templates/nextjs-standalone/src/lib/slack/__tests__/api.test.ts +0 -160
- package/templates/nextjs-standalone/src/lib/slack/__tests__/format.test.ts +0 -237
- package/templates/nextjs-standalone/src/lib/slack/__tests__/store.test.ts +0 -188
- package/templates/nextjs-standalone/src/lib/slack/__tests__/threads.test.ts +0 -112
- package/templates/nextjs-standalone/src/lib/slack/__tests__/verify.test.ts +0 -111
- package/templates/nextjs-standalone/src/lib/tools/__tests__/action-permissions.test.ts +0 -594
- package/templates/nextjs-standalone/src/lib/tools/__tests__/custom-validation.test.ts +0 -240
- package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-backend.test.ts +0 -267
- package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-nsjail.test.ts +0 -506
- package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-plugin.test.ts +0 -374
- package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-sdk-compat.test.ts +0 -82
- package/templates/nextjs-standalone/src/lib/tools/__tests__/explore-sidecar.test.ts +0 -210
- package/templates/nextjs-standalone/src/lib/tools/__tests__/python-nsjail.test.ts +0 -515
- package/templates/nextjs-standalone/src/lib/tools/__tests__/python-sandbox.test.ts +0 -397
- package/templates/nextjs-standalone/src/lib/tools/__tests__/python-sidecar.test.ts +0 -365
- package/templates/nextjs-standalone/src/lib/tools/__tests__/python.test.ts +0 -331
- package/templates/nextjs-standalone/src/lib/tools/__tests__/registry-actions.test.ts +0 -132
- package/templates/nextjs-standalone/src/lib/tools/__tests__/registry.test.ts +0 -242
- package/templates/nextjs-standalone/src/lib/tools/__tests__/sql-audit.test.ts +0 -227
- package/templates/nextjs-standalone/src/lib/tools/__tests__/sql-connection-whitelist.test.ts +0 -100
- package/templates/nextjs-standalone/src/lib/tools/__tests__/sql-ratelimit.test.ts +0 -227
- package/templates/nextjs-standalone/src/lib/tools/__tests__/sql.test.ts +0 -709
- package/templates/nextjs-standalone/src/lib/tools/actions/__tests__/audit.test.ts +0 -211
- package/templates/nextjs-standalone/src/lib/tools/actions/__tests__/email.test.ts +0 -378
- package/templates/nextjs-standalone/src/lib/tools/actions/__tests__/handler.test.ts +0 -681
- package/templates/nextjs-standalone/src/lib/tools/actions/__tests__/jira.test.ts +0 -427
- package/templates/nextjs-standalone/src/test-setup.ts +0 -38
- package/templates/nextjs-standalone/src/ui/components/chat/managed-auth-card.tsx +0 -116
|
@@ -32,6 +32,17 @@ import type { ToolRegistry } from "./tools/registry";
|
|
|
32
32
|
import { ACTION_APPROVAL_MODES, type ActionApprovalMode } from "@atlas/api/lib/action-types";
|
|
33
33
|
import { ATLAS_ROLES } from "@atlas/api/lib/auth/types";
|
|
34
34
|
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Sandbox backend names (used in config validation and explore backend selection)
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Backend names operators can use in `sandbox.priority`.
|
|
41
|
+
* Plugin backends are always tried first and are not included here.
|
|
42
|
+
*/
|
|
43
|
+
const SANDBOX_BACKEND_NAMES = ["vercel-sandbox", "nsjail", "sidecar", "just-bash"] as const;
|
|
44
|
+
export type SandboxBackendName = (typeof SANDBOX_BACKEND_NAMES)[number];
|
|
45
|
+
|
|
35
46
|
const log = createLogger("config");
|
|
36
47
|
|
|
37
48
|
// ---------------------------------------------------------------------------
|
|
@@ -91,6 +102,8 @@ const PerActionConfigSchema = z.object({
|
|
|
91
102
|
approval: ActionApprovalSchema.optional(),
|
|
92
103
|
/** Minimum role required to approve this action. Overrides the approval mode's default role mapping. */
|
|
93
104
|
requiredRole: AtlasRoleSchema.optional(),
|
|
105
|
+
/** Execution timeout in milliseconds. Overrides the global defaults.timeout. */
|
|
106
|
+
timeout: z.number().int().positive().optional(),
|
|
94
107
|
credentials: z.record(z.string(), z.object({ env: z.string() })).optional(),
|
|
95
108
|
rateLimit: z.number().int().positive().optional(),
|
|
96
109
|
}).passthrough();
|
|
@@ -103,15 +116,36 @@ const ActionsConfigSchema = z.object({
|
|
|
103
116
|
|
|
104
117
|
export type ActionsConfig = z.infer<typeof ActionsConfigSchema>;
|
|
105
118
|
|
|
106
|
-
const
|
|
107
|
-
/**
|
|
108
|
-
tables: z.array(z.string().min(1)).min(1),
|
|
109
|
-
/** Column name to filter on in the matched tables. Must be a valid SQL identifier. */
|
|
119
|
+
const RLSConditionSchema = z.object({
|
|
120
|
+
/** Column name to filter on. Must be a valid SQL identifier. */
|
|
110
121
|
column: z.string().min(1).regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, "Must be a valid column name"),
|
|
111
122
|
/** Claim path to extract the filter value from the user's claims. Supports dot-delimited paths. */
|
|
112
123
|
claim: z.string().min(1),
|
|
113
124
|
});
|
|
114
125
|
|
|
126
|
+
export type RLSCondition = z.infer<typeof RLSConditionSchema>;
|
|
127
|
+
|
|
128
|
+
const RLSPolicySchema = z.object({
|
|
129
|
+
/** Tables this policy applies to. Use ["*"] for all tables. */
|
|
130
|
+
tables: z.array(z.string().min(1)).min(1),
|
|
131
|
+
/** Column name to filter on (single-condition shorthand). */
|
|
132
|
+
column: z.string().min(1).regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, "Must be a valid column name").optional(),
|
|
133
|
+
/** Claim path (single-condition shorthand). */
|
|
134
|
+
claim: z.string().min(1).optional(),
|
|
135
|
+
/** Multiple column/claim conditions — ANDed together within this policy. */
|
|
136
|
+
conditions: z.array(RLSConditionSchema).min(1).optional(),
|
|
137
|
+
}).refine(
|
|
138
|
+
(p) => {
|
|
139
|
+
const hasSingle = p.column !== undefined || p.claim !== undefined;
|
|
140
|
+
const hasConditions = p.conditions !== undefined;
|
|
141
|
+
if (hasSingle && hasConditions) return false;
|
|
142
|
+
if (!hasSingle && !hasConditions) return false;
|
|
143
|
+
if (hasSingle && (p.column === undefined || p.claim === undefined)) return false;
|
|
144
|
+
return true;
|
|
145
|
+
},
|
|
146
|
+
{ message: "Each policy must specify either { column, claim } or { conditions: [...] }, not both" },
|
|
147
|
+
);
|
|
148
|
+
|
|
115
149
|
export type RLSPolicy = z.infer<typeof RLSPolicySchema>;
|
|
116
150
|
|
|
117
151
|
const RLSConfigSchema = z.object({
|
|
@@ -119,6 +153,8 @@ const RLSConfigSchema = z.object({
|
|
|
119
153
|
enabled: z.boolean().default(false),
|
|
120
154
|
/** RLS policies. Each policy maps a claim to a column on one or more tables. */
|
|
121
155
|
policies: z.array(RLSPolicySchema).default([]),
|
|
156
|
+
/** How to combine conditions from different policies. "and" (default) requires all policies to match. "or" requires at least one policy to match. */
|
|
157
|
+
combineWith: z.enum(["and", "or"]).default("and"),
|
|
122
158
|
}).refine(
|
|
123
159
|
(cfg) => !cfg.enabled || cfg.policies.length > 0,
|
|
124
160
|
{ message: "RLS is enabled but no policies are defined", path: ["policies"] },
|
|
@@ -126,6 +162,90 @@ const RLSConfigSchema = z.object({
|
|
|
126
162
|
|
|
127
163
|
export type RLSConfig = z.infer<typeof RLSConfigSchema>;
|
|
128
164
|
|
|
165
|
+
const SandboxConfigSchema = z.object({
|
|
166
|
+
/**
|
|
167
|
+
* Ordered list of explore backends to try. The first available backend is
|
|
168
|
+
* used. Plugin backends are always tried first (not listed here).
|
|
169
|
+
*
|
|
170
|
+
* Valid values: "vercel-sandbox", "nsjail", "sidecar", "just-bash".
|
|
171
|
+
*
|
|
172
|
+
* @example ["sidecar", "nsjail", "just-bash"]
|
|
173
|
+
*/
|
|
174
|
+
priority: z.array(z.enum(SANDBOX_BACKEND_NAMES)).min(1)
|
|
175
|
+
.refine(
|
|
176
|
+
(arr) => new Set(arr).size === arr.length,
|
|
177
|
+
{ message: "sandbox.priority must not contain duplicate backend names" },
|
|
178
|
+
)
|
|
179
|
+
.optional(),
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
export type SandboxConfig = z.infer<typeof SandboxConfigSchema>;
|
|
183
|
+
|
|
184
|
+
/** Modules that can never be unblocked via `allowModules`. */
|
|
185
|
+
const PYTHON_CRITICAL_MODULES = ["os", "subprocess", "sys", "shutil"];
|
|
186
|
+
|
|
187
|
+
const PythonConfigSchema = z.object({
|
|
188
|
+
/** Additional modules to block (added to the default blocked list). */
|
|
189
|
+
blockedModules: z.array(z.string().min(1, "Module name must not be empty")).default([]),
|
|
190
|
+
/** Modules to remove from the default blocked list. Critical modules (os, subprocess, sys, shutil) cannot be unblocked. */
|
|
191
|
+
allowModules: z.array(z.string().min(1, "Module name must not be empty")).default([]),
|
|
192
|
+
}).refine(
|
|
193
|
+
(cfg) => !cfg.allowModules.some((m: string) => PYTHON_CRITICAL_MODULES.includes(m)),
|
|
194
|
+
{
|
|
195
|
+
message: `Cannot unblock critical Python modules (${PYTHON_CRITICAL_MODULES.join(", ")}). These are blocked regardless of configuration.`,
|
|
196
|
+
path: ["allowModules"],
|
|
197
|
+
},
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
export type PythonConfig = z.infer<typeof PythonConfigSchema>;
|
|
201
|
+
|
|
202
|
+
const OrgPoolConfigSchema = z.object({
|
|
203
|
+
/** Max connections per pool per org. Default 5. */
|
|
204
|
+
maxConnections: z.number().int().positive().default(5),
|
|
205
|
+
/** Idle timeout in ms for per-org pool connections. Default 30000. */
|
|
206
|
+
idleTimeoutMs: z.number().int().positive().default(30000),
|
|
207
|
+
/** Max org pool sets before LRU eviction. Default 50. */
|
|
208
|
+
maxOrgs: z.number().int().positive().default(50),
|
|
209
|
+
/** Warmup probes when an org pool is first created. Default 2. */
|
|
210
|
+
warmupProbes: z.number().int().nonnegative().default(2),
|
|
211
|
+
/** Consecutive query errors before auto-drain of an org pool. Default 5. */
|
|
212
|
+
drainThreshold: z.number().int().positive().default(5),
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
export type OrgPoolConfigInput = z.input<typeof OrgPoolConfigSchema>;
|
|
216
|
+
|
|
217
|
+
const PoolConfigSchema = z.object({
|
|
218
|
+
/** Per-org pool isolation settings. When configured, each org gets its own
|
|
219
|
+
* connection pool for noisy-neighbor isolation in SaaS mode. */
|
|
220
|
+
perOrg: OrgPoolConfigSchema.optional(),
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
const RegionConfigSchema = z.object({
|
|
224
|
+
/** Human-readable region label for the admin console. */
|
|
225
|
+
label: z.string().min(1),
|
|
226
|
+
/** Database URL for the region's internal database. */
|
|
227
|
+
databaseUrl: z.string().min(1, "Region database URL must not be empty"),
|
|
228
|
+
/** Optional datasource URL override for analytics in this region. */
|
|
229
|
+
datasourceUrl: z.string().min(1).optional(),
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
export type RegionConfigInput = z.input<typeof RegionConfigSchema>;
|
|
233
|
+
|
|
234
|
+
const ResidencyConfigSchema = z.object({
|
|
235
|
+
/** Available regions and their database configuration. Keys are region identifiers (e.g. "eu-west"). */
|
|
236
|
+
regions: z.record(z.string().min(1), RegionConfigSchema).refine(
|
|
237
|
+
(r) => Object.keys(r).length > 0,
|
|
238
|
+
{ message: "At least one region must be configured when residency is enabled" },
|
|
239
|
+
),
|
|
240
|
+
/** Default region for new workspaces. Must be a key in the regions map. */
|
|
241
|
+
defaultRegion: z.string().min(1),
|
|
242
|
+
}).refine(
|
|
243
|
+
(cfg) => cfg.defaultRegion in cfg.regions,
|
|
244
|
+
{ message: "defaultRegion must be one of the configured regions", path: ["defaultRegion"] },
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
export type ResidencyConfig = z.infer<typeof ResidencyConfigSchema>;
|
|
248
|
+
|
|
129
249
|
const AtlasConfigSchema = z.object({
|
|
130
250
|
/**
|
|
131
251
|
* Named datasource connections. The "default" key is used when no
|
|
@@ -195,6 +315,98 @@ const AtlasConfigSchema = z.object({
|
|
|
195
315
|
* automatic WHERE clause injection based on the authenticated user's claims.
|
|
196
316
|
*/
|
|
197
317
|
rls: RLSConfigSchema.optional(),
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Sandbox / explore backend configuration. Override the default backend
|
|
321
|
+
* selection priority for the explore tool.
|
|
322
|
+
*/
|
|
323
|
+
sandbox: SandboxConfigSchema.optional(),
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Python tool import guard configuration. Customize which modules are
|
|
327
|
+
* blocked or allowed in the defense-in-depth import checker.
|
|
328
|
+
*/
|
|
329
|
+
python: PythonConfigSchema.optional(),
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Session timeout configuration. Idle timeout invalidates sessions that
|
|
333
|
+
* haven't been used within the specified duration. Absolute timeout
|
|
334
|
+
* invalidates sessions after a fixed duration regardless of activity.
|
|
335
|
+
* Values are in seconds. 0 means disabled.
|
|
336
|
+
*/
|
|
337
|
+
session: z.object({
|
|
338
|
+
/** Seconds of inactivity before a session is invalidated. 0 = disabled. */
|
|
339
|
+
idleTimeout: z.number().int().nonnegative().default(0),
|
|
340
|
+
/** Maximum session lifetime in seconds from creation. 0 = disabled. */
|
|
341
|
+
absoluteTimeout: z.number().int().nonnegative().default(0),
|
|
342
|
+
}).optional(),
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Semantic index configuration. When enabled (default), a pre-computed
|
|
346
|
+
* summary of the semantic layer is injected into the agent system prompt
|
|
347
|
+
* to reduce explore tool calls.
|
|
348
|
+
*/
|
|
349
|
+
semanticIndex: z.object({
|
|
350
|
+
/** Whether the semantic index is enabled. Default: true. */
|
|
351
|
+
enabled: z.boolean().default(true),
|
|
352
|
+
}).optional(),
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Connection pool configuration. The `perOrg` sub-key enables tenant-scoped
|
|
356
|
+
* pooling in SaaS mode — each org gets isolated pool instances to prevent
|
|
357
|
+
* noisy-neighbor issues.
|
|
358
|
+
*/
|
|
359
|
+
pool: PoolConfigSchema.optional(),
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Query result cache configuration. When enabled (default), identical
|
|
363
|
+
* queries return cached results within the TTL. Cache keys include
|
|
364
|
+
* orgId for tenant isolation.
|
|
365
|
+
*/
|
|
366
|
+
cache: z.object({
|
|
367
|
+
/** Whether query caching is enabled. Default: true. */
|
|
368
|
+
enabled: z.boolean().default(true),
|
|
369
|
+
/** Time-to-live in milliseconds. Default: 300000 (5 minutes). */
|
|
370
|
+
ttl: z.number().int().positive().default(300_000),
|
|
371
|
+
/** Maximum number of cached entries. Default: 1000. */
|
|
372
|
+
maxSize: z.number().int().positive().default(1000),
|
|
373
|
+
}).optional(),
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Dynamic learning configuration. Controls how learned query patterns
|
|
377
|
+
* are promoted and injected into agent context.
|
|
378
|
+
*/
|
|
379
|
+
learn: z.object({
|
|
380
|
+
/** Minimum confidence score for a pattern to be eligible for auto-promotion. Default: 0.7. */
|
|
381
|
+
confidenceThreshold: z.number().min(0).max(1).default(0.7),
|
|
382
|
+
}).optional(),
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Enterprise feature gating. When enabled, enterprise-only features
|
|
386
|
+
* in `/ee` are unlocked at runtime. A license key is required for
|
|
387
|
+
* production use. AGPL core is completely unaffected when this is
|
|
388
|
+
* absent or disabled.
|
|
389
|
+
*/
|
|
390
|
+
enterprise: z.object({
|
|
391
|
+
/** Whether enterprise features are enabled. Default: false. */
|
|
392
|
+
enabled: z.boolean().default(false),
|
|
393
|
+
/** License key for enterprise features. */
|
|
394
|
+
licenseKey: z.string().min(1).optional(),
|
|
395
|
+
}).optional(),
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Deploy mode. "saas" enables hosted product features (enterprise-gated),
|
|
399
|
+
* "self-hosted" disables them, "auto" (default) detects from environment.
|
|
400
|
+
* The resolved binary value is exposed as `deployMode` on ResolvedConfig.
|
|
401
|
+
*/
|
|
402
|
+
deployMode: z.enum(["auto", "saas", "self-hosted"]).optional().default("auto"),
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Data residency configuration. When configured, workspaces are assigned
|
|
406
|
+
* to geographic regions and connections route to region-specific databases.
|
|
407
|
+
* Requires enterprise features to be enabled.
|
|
408
|
+
*/
|
|
409
|
+
residency: ResidencyConfigSchema.optional(),
|
|
198
410
|
});
|
|
199
411
|
|
|
200
412
|
/** The output type after Zod parsing (defaults applied, all fields present). */
|
|
@@ -203,8 +415,8 @@ export type AtlasConfig = z.infer<typeof AtlasConfigSchema>;
|
|
|
203
415
|
/** The input type for user-authored config (optional fields allowed). */
|
|
204
416
|
export type AtlasConfigInput = z.input<typeof AtlasConfigSchema>;
|
|
205
417
|
|
|
206
|
-
/** Expose schemas for external validation (e.g. tests). */
|
|
207
|
-
export { AtlasConfigSchema, RateLimitConfigSchema, RLSPolicySchema, RLSConfigSchema };
|
|
418
|
+
/** Expose schemas and formatter for external validation (e.g. tests, CLI). */
|
|
419
|
+
export { AtlasConfigSchema, RateLimitConfigSchema, RLSConditionSchema, RLSPolicySchema, RLSConfigSchema, SandboxConfigSchema, PythonConfigSchema, PoolConfigSchema, OrgPoolConfigSchema, ResidencyConfigSchema };
|
|
208
420
|
|
|
209
421
|
/**
|
|
210
422
|
* The resolved config after merging the config file with env var defaults.
|
|
@@ -230,6 +442,26 @@ export interface ResolvedConfig {
|
|
|
230
442
|
};
|
|
231
443
|
/** Row-Level Security configuration. */
|
|
232
444
|
rls?: RLSConfig;
|
|
445
|
+
/** Sandbox / explore backend configuration. */
|
|
446
|
+
sandbox?: SandboxConfig;
|
|
447
|
+
/** Python tool import guard overrides. */
|
|
448
|
+
python?: PythonConfig;
|
|
449
|
+
/** Session timeout configuration. */
|
|
450
|
+
session?: { idleTimeout: number; absoluteTimeout: number };
|
|
451
|
+
/** Semantic index configuration. */
|
|
452
|
+
semanticIndex?: { enabled: boolean };
|
|
453
|
+
/** Connection pool configuration for tenant-scoped pooling. */
|
|
454
|
+
pool?: { perOrg?: { maxConnections: number; idleTimeoutMs: number; maxOrgs: number; warmupProbes: number; drainThreshold: number } };
|
|
455
|
+
/** Query result cache configuration. */
|
|
456
|
+
cache?: { enabled: boolean; ttl: number; maxSize: number };
|
|
457
|
+
/** Dynamic learning configuration. */
|
|
458
|
+
learn?: { confidenceThreshold: number };
|
|
459
|
+
/** Enterprise feature gating. */
|
|
460
|
+
enterprise?: { enabled: boolean; licenseKey?: string };
|
|
461
|
+
/** Data residency configuration for region-based routing. */
|
|
462
|
+
residency?: ResidencyConfig;
|
|
463
|
+
/** Resolved deploy mode — binary "saas" or "self-hosted" (auto is resolved at boot). */
|
|
464
|
+
deployMode?: "saas" | "self-hosted";
|
|
233
465
|
/** Whether the config was loaded from a file or synthesized from env vars. */
|
|
234
466
|
source: "file" | "env";
|
|
235
467
|
}
|
|
@@ -331,7 +563,39 @@ export function configFromEnv(): ResolvedConfig {
|
|
|
331
563
|
`Got: ATLAS_RLS_COLUMN=${column ?? "(unset)"}, ATLAS_RLS_CLAIM=${claim ?? "(unset)"}`,
|
|
332
564
|
);
|
|
333
565
|
}
|
|
334
|
-
|
|
566
|
+
const rlsParseResult = RLSConfigSchema.safeParse({
|
|
567
|
+
enabled: true,
|
|
568
|
+
policies: [{ tables: ["*"], column, claim }],
|
|
569
|
+
combineWith: "and",
|
|
570
|
+
});
|
|
571
|
+
if (!rlsParseResult.success) {
|
|
572
|
+
throw new Error(
|
|
573
|
+
`Invalid RLS environment variable configuration: ${rlsParseResult.error.issues.map((i) => i.message).join("; ")}. ` +
|
|
574
|
+
`Check ATLAS_RLS_COLUMN (must be a valid SQL identifier) and ATLAS_RLS_CLAIM.`,
|
|
575
|
+
);
|
|
576
|
+
}
|
|
577
|
+
rls = rlsParseResult.data;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// Sandbox priority from env var (comma-separated backend names)
|
|
581
|
+
let sandbox: SandboxConfig | undefined;
|
|
582
|
+
const rawPriority = process.env.ATLAS_SANDBOX_PRIORITY;
|
|
583
|
+
if (rawPriority) {
|
|
584
|
+
const names = rawPriority.split(",").map((s) => s.trim()).filter(Boolean);
|
|
585
|
+
if (names.length === 0) {
|
|
586
|
+
throw new Error(
|
|
587
|
+
`ATLAS_SANDBOX_PRIORITY is set but empty after parsing. ` +
|
|
588
|
+
`Expected comma-separated backend names: ${SANDBOX_BACKEND_NAMES.join(", ")}`,
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
const parseResult = SandboxConfigSchema.safeParse({ priority: names });
|
|
592
|
+
if (!parseResult.success) {
|
|
593
|
+
throw new Error(
|
|
594
|
+
`Invalid ATLAS_SANDBOX_PRIORITY: ${parseResult.error.issues.map((i) => i.message).join("; ")}. ` +
|
|
595
|
+
`Valid backends: ${SANDBOX_BACKEND_NAMES.join(", ")}`,
|
|
596
|
+
);
|
|
597
|
+
}
|
|
598
|
+
sandbox = parseResult.data;
|
|
335
599
|
}
|
|
336
600
|
|
|
337
601
|
return {
|
|
@@ -343,6 +607,48 @@ export function configFromEnv(): ResolvedConfig {
|
|
|
343
607
|
maxTotalConnections: 100,
|
|
344
608
|
...(scheduler ? { scheduler } : {}),
|
|
345
609
|
...(rls ? { rls } : {}),
|
|
610
|
+
...(sandbox ? { sandbox } : {}),
|
|
611
|
+
// Session timeout from env vars
|
|
612
|
+
...((() => {
|
|
613
|
+
const idle = parseInt(process.env.ATLAS_SESSION_IDLE_TIMEOUT ?? "", 10);
|
|
614
|
+
const abs = parseInt(process.env.ATLAS_SESSION_ABSOLUTE_TIMEOUT ?? "", 10);
|
|
615
|
+
const idleTimeout = Number.isFinite(idle) && idle > 0 ? idle : 0;
|
|
616
|
+
const absoluteTimeout = Number.isFinite(abs) && abs > 0 ? abs : 0;
|
|
617
|
+
return (idleTimeout > 0 || absoluteTimeout > 0) ? { session: { idleTimeout, absoluteTimeout } } : {};
|
|
618
|
+
})()),
|
|
619
|
+
// Semantic index from env vars
|
|
620
|
+
...(process.env.ATLAS_SEMANTIC_INDEX_ENABLED === "false"
|
|
621
|
+
? { semanticIndex: { enabled: false } }
|
|
622
|
+
: {}),
|
|
623
|
+
// Cache config from env vars
|
|
624
|
+
...((() => {
|
|
625
|
+
const enabled = process.env.ATLAS_CACHE_ENABLED !== "false" && process.env.ATLAS_CACHE_ENABLED !== "0";
|
|
626
|
+
const ttl = parseInt(process.env.ATLAS_CACHE_TTL ?? "", 10);
|
|
627
|
+
const maxSize = parseInt(process.env.ATLAS_CACHE_MAX_SIZE ?? "", 10);
|
|
628
|
+
return {
|
|
629
|
+
cache: {
|
|
630
|
+
enabled,
|
|
631
|
+
ttl: Number.isFinite(ttl) && ttl > 0 ? ttl : 300_000,
|
|
632
|
+
maxSize: Number.isFinite(maxSize) && maxSize > 0 ? maxSize : 1000,
|
|
633
|
+
},
|
|
634
|
+
};
|
|
635
|
+
})()),
|
|
636
|
+
// Learn config from env vars
|
|
637
|
+
...((() => {
|
|
638
|
+
const threshold = parseFloat(process.env.ATLAS_LEARN_CONFIDENCE_THRESHOLD ?? "");
|
|
639
|
+
return {
|
|
640
|
+
learn: {
|
|
641
|
+
confidenceThreshold: Number.isFinite(threshold) && threshold >= 0 && threshold <= 1 ? threshold : 0.7,
|
|
642
|
+
},
|
|
643
|
+
};
|
|
644
|
+
})()),
|
|
645
|
+
// Enterprise config from env vars
|
|
646
|
+
enterprise: {
|
|
647
|
+
enabled: process.env.ATLAS_ENTERPRISE_ENABLED === "true",
|
|
648
|
+
...(process.env.ATLAS_ENTERPRISE_LICENSE_KEY
|
|
649
|
+
? { licenseKey: process.env.ATLAS_ENTERPRISE_LICENSE_KEY }
|
|
650
|
+
: {}),
|
|
651
|
+
},
|
|
346
652
|
source: "env",
|
|
347
653
|
};
|
|
348
654
|
}
|
|
@@ -475,6 +781,184 @@ function validatePlugins(plugins: unknown[]): void {
|
|
|
475
781
|
}
|
|
476
782
|
}
|
|
477
783
|
|
|
784
|
+
// ---------------------------------------------------------------------------
|
|
785
|
+
// Zod error formatting
|
|
786
|
+
// ---------------------------------------------------------------------------
|
|
787
|
+
|
|
788
|
+
/** Loosely-typed Zod issue — works across Zod v3 and v4. */
|
|
789
|
+
type Issue = z.ZodError["issues"][number];
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
* Human-readable labels for config fields. Used to give context beyond
|
|
793
|
+
* raw Zod type names (e.g. "connection URL" for datasources.*.url).
|
|
794
|
+
*/
|
|
795
|
+
const FIELD_HINTS: Record<string, string> = {
|
|
796
|
+
"datasources.*.url": "connection URL",
|
|
797
|
+
auth: "auth mode",
|
|
798
|
+
semanticLayer: "path to the semantic layer directory",
|
|
799
|
+
maxTotalConnections: "max total pool connections",
|
|
800
|
+
};
|
|
801
|
+
|
|
802
|
+
/** Map of common misspellings/variants to the correct value. */
|
|
803
|
+
const COMMON_SUGGESTIONS: Record<string, Record<string, string>> = {
|
|
804
|
+
auth: {
|
|
805
|
+
"apiKey": "api-key",
|
|
806
|
+
"api_key": "api-key",
|
|
807
|
+
"apikey": "api-key",
|
|
808
|
+
"API-KEY": "api-key",
|
|
809
|
+
"API_KEY": "api-key",
|
|
810
|
+
"basic": "api-key",
|
|
811
|
+
"bearer": "byot",
|
|
812
|
+
"token": "byot",
|
|
813
|
+
"bring-your-own-token": "byot",
|
|
814
|
+
"true": "managed",
|
|
815
|
+
"false": "none",
|
|
816
|
+
"off": "none",
|
|
817
|
+
"on": "auto",
|
|
818
|
+
"default": "auto",
|
|
819
|
+
},
|
|
820
|
+
};
|
|
821
|
+
|
|
822
|
+
/**
|
|
823
|
+
* Look up a human-readable hint for a field path. Supports wildcards:
|
|
824
|
+
* `datasources.mydb.url` matches `datasources.*.url`.
|
|
825
|
+
*/
|
|
826
|
+
function getFieldHint(fieldPath: string): string | undefined {
|
|
827
|
+
if (FIELD_HINTS[fieldPath]) return FIELD_HINTS[fieldPath];
|
|
828
|
+
// Try wildcard: replace middle segments with *
|
|
829
|
+
const parts = fieldPath.split(".");
|
|
830
|
+
if (parts.length >= 3) {
|
|
831
|
+
const wildcard = `${parts[0]}.*.${parts.slice(2).join(".")}`;
|
|
832
|
+
if (FIELD_HINTS[wildcard]) return FIELD_HINTS[wildcard];
|
|
833
|
+
}
|
|
834
|
+
return undefined;
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
/**
|
|
838
|
+
* Extract the received value from the issue's message (Zod v4 encodes
|
|
839
|
+
* it in the message string rather than a dedicated field).
|
|
840
|
+
*/
|
|
841
|
+
function extractReceived(issue: Issue): string | undefined {
|
|
842
|
+
// Zod v4 invalid_type message: "Invalid input: expected string, received number"
|
|
843
|
+
const match = issue.message.match(/received (\S+)/);
|
|
844
|
+
if (match) return match[1];
|
|
845
|
+
return undefined;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* Check if the received value for a field has a common suggestion.
|
|
850
|
+
*/
|
|
851
|
+
function getSuggestion(fieldPath: string, input: unknown): string | undefined {
|
|
852
|
+
const topField = fieldPath.split(".")[0];
|
|
853
|
+
const suggestions = COMMON_SUGGESTIONS[topField];
|
|
854
|
+
if (!suggestions || typeof input !== "string") return undefined;
|
|
855
|
+
const correct = suggestions[input];
|
|
856
|
+
if (correct) return `Did you mean "${correct}"?`;
|
|
857
|
+
return undefined;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
/**
|
|
861
|
+
* Format a single Zod issue into a human-readable line.
|
|
862
|
+
*/
|
|
863
|
+
function formatIssue(issue: Issue, rawInput: unknown): string {
|
|
864
|
+
const fieldPath = issue.path.length > 0
|
|
865
|
+
? issue.path.map(String).join(".")
|
|
866
|
+
: "(root)";
|
|
867
|
+
const hint = getFieldHint(fieldPath);
|
|
868
|
+
|
|
869
|
+
// Resolve the value that was actually passed for this path
|
|
870
|
+
let inputAtPath: unknown = rawInput;
|
|
871
|
+
for (const segment of issue.path) {
|
|
872
|
+
if (inputAtPath != null && typeof inputAtPath === "object") {
|
|
873
|
+
inputAtPath = (inputAtPath as Record<string, unknown>)[String(segment)];
|
|
874
|
+
} else {
|
|
875
|
+
inputAtPath = undefined;
|
|
876
|
+
break;
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
let line: string;
|
|
881
|
+
// Use unknown-typed accessor to handle Zod v4 issue shapes safely
|
|
882
|
+
const issueObj = issue as unknown as Record<string, unknown>;
|
|
883
|
+
|
|
884
|
+
switch (issue.code) {
|
|
885
|
+
case "invalid_type": {
|
|
886
|
+
const expected = String(issueObj.expected ?? "unknown");
|
|
887
|
+
const received = extractReceived(issue) ?? typeof inputAtPath;
|
|
888
|
+
const expectedLabel = hint ? `${expected} (${hint})` : expected;
|
|
889
|
+
line = `Config error at ${fieldPath}: expected ${expectedLabel}, got ${received}`;
|
|
890
|
+
break;
|
|
891
|
+
}
|
|
892
|
+
case "invalid_union": {
|
|
893
|
+
// Zod v4: `errors` is an array of issue arrays
|
|
894
|
+
const unionErrors = issueObj.errors as unknown[][] | undefined;
|
|
895
|
+
const validOptions: string[] = [];
|
|
896
|
+
if (unionErrors) {
|
|
897
|
+
for (const errGroup of unionErrors) {
|
|
898
|
+
const issues = Array.isArray(errGroup) ? errGroup : [];
|
|
899
|
+
for (const sub of issues) {
|
|
900
|
+
const subObj = sub as Record<string, unknown>;
|
|
901
|
+
// Zod v4 uses "invalid_value" with a "values" array
|
|
902
|
+
if (subObj.code === "invalid_value" && Array.isArray(subObj.values)) {
|
|
903
|
+
for (const v of subObj.values) {
|
|
904
|
+
const opt = `"${v}"`;
|
|
905
|
+
if (!validOptions.includes(opt)) validOptions.push(opt);
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
// Zod v3 uses "invalid_literal" with "expected"
|
|
909
|
+
if (subObj.code === "invalid_literal" && subObj.expected !== undefined) {
|
|
910
|
+
const opt = `"${subObj.expected}"`;
|
|
911
|
+
if (!validOptions.includes(opt)) validOptions.push(opt);
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
if (validOptions.length > 0) {
|
|
917
|
+
line = `Config error at ${fieldPath}: invalid value. Valid options: ${validOptions.join(", ")}`;
|
|
918
|
+
} else {
|
|
919
|
+
line = `Config error at ${fieldPath}: ${issue.message}`;
|
|
920
|
+
}
|
|
921
|
+
break;
|
|
922
|
+
}
|
|
923
|
+
case "invalid_value": {
|
|
924
|
+
// Zod v4 uses "invalid_value" for enums and literals
|
|
925
|
+
const values = issueObj.values as unknown[] | undefined;
|
|
926
|
+
if (values && values.length > 0) {
|
|
927
|
+
line = `Config error at ${fieldPath}: invalid value. Valid options: ${values.map((o) => `"${o}"`).join(", ")}`;
|
|
928
|
+
} else {
|
|
929
|
+
line = `Config error at ${fieldPath}: ${issue.message}`;
|
|
930
|
+
}
|
|
931
|
+
break;
|
|
932
|
+
}
|
|
933
|
+
default: {
|
|
934
|
+
line = `Config error at ${fieldPath}: ${issue.message}`;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
// Append suggestion for common mistakes
|
|
939
|
+
const suggestion = getSuggestion(fieldPath, inputAtPath);
|
|
940
|
+
if (suggestion) {
|
|
941
|
+
line += ` — ${suggestion}`;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
return line;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
/**
|
|
948
|
+
* Format a ZodError into human-readable, multi-line error messages.
|
|
949
|
+
*
|
|
950
|
+
* Each line shows the field path, expected type, and received value.
|
|
951
|
+
* Common mistakes get targeted suggestions (e.g. "did you mean 'api-key'?").
|
|
952
|
+
* All errors are shown, not just the first one.
|
|
953
|
+
*
|
|
954
|
+
* @param error - The ZodError to format.
|
|
955
|
+
* @param rawInput - The original input that was validated (used to resolve
|
|
956
|
+
* actual received values and to generate suggestions).
|
|
957
|
+
*/
|
|
958
|
+
export function formatZodErrors(error: z.ZodError, rawInput?: unknown): string {
|
|
959
|
+
return error.issues.map((issue) => ` - ${formatIssue(issue, rawInput)}`).join("\n");
|
|
960
|
+
}
|
|
961
|
+
|
|
478
962
|
/**
|
|
479
963
|
* Validate a raw config object against the Zod schema and return a
|
|
480
964
|
* ResolvedConfig. Throws on validation failure with human-readable errors.
|
|
@@ -488,10 +972,7 @@ export function validateAndResolve(raw: unknown): ResolvedConfig {
|
|
|
488
972
|
|
|
489
973
|
const parseResult = AtlasConfigSchema.safeParse(raw);
|
|
490
974
|
if (!parseResult.success) {
|
|
491
|
-
|
|
492
|
-
.map((issue) => ` - ${issue.path.join(".")}: ${issue.message}`)
|
|
493
|
-
.join("\n");
|
|
494
|
-
throw new Error(`Invalid atlas.config.ts:\n${formatted}`);
|
|
975
|
+
throw new Error(`Invalid atlas.config.ts:\n${formatZodErrors(parseResult.error, raw)}`);
|
|
495
976
|
}
|
|
496
977
|
|
|
497
978
|
const config = parseResult.data;
|
|
@@ -511,6 +992,15 @@ export function validateAndResolve(raw: unknown): ResolvedConfig {
|
|
|
511
992
|
...(config.plugins?.length ? { plugins: config.plugins } : {}),
|
|
512
993
|
...(config.scheduler ? { scheduler: config.scheduler } : {}),
|
|
513
994
|
...(config.rls ? { rls: config.rls } : {}),
|
|
995
|
+
...(config.sandbox ? { sandbox: config.sandbox } : {}),
|
|
996
|
+
...(config.python ? { python: config.python } : {}),
|
|
997
|
+
...(config.session ? { session: config.session } : {}),
|
|
998
|
+
...(config.semanticIndex ? { semanticIndex: config.semanticIndex } : {}),
|
|
999
|
+
...(config.pool ? { pool: config.pool } : {}),
|
|
1000
|
+
...(config.cache ? { cache: config.cache } : {}),
|
|
1001
|
+
...(config.learn ? { learn: config.learn } : {}),
|
|
1002
|
+
...(config.enterprise ? { enterprise: config.enterprise } : {}),
|
|
1003
|
+
...(config.residency ? { residency: config.residency } : {}),
|
|
514
1004
|
source: "file",
|
|
515
1005
|
};
|
|
516
1006
|
}
|
|
@@ -531,6 +1021,43 @@ export function validateAndResolve(raw: unknown): ResolvedConfig {
|
|
|
531
1021
|
* @throws {Error} When the config file exists but is invalid (Zod errors
|
|
532
1022
|
* are formatted into a human-readable message).
|
|
533
1023
|
*/
|
|
1024
|
+
/**
|
|
1025
|
+
* Resolve the deploy mode for a ResolvedConfig.
|
|
1026
|
+
*
|
|
1027
|
+
* Tries to load `resolveDeployMode` from the enterprise (`ee/`) package.
|
|
1028
|
+
* When the enterprise module is not available, falls back to `"self-hosted"`.
|
|
1029
|
+
* Mutates `resolved.deployMode` in place and logs the result.
|
|
1030
|
+
*/
|
|
1031
|
+
async function applyDeployMode(
|
|
1032
|
+
resolved: ResolvedConfig,
|
|
1033
|
+
configFileValue?: "auto" | "saas" | "self-hosted",
|
|
1034
|
+
): Promise<void> {
|
|
1035
|
+
// Env var takes priority over config file; config file takes priority over default
|
|
1036
|
+
const rawSetting = (process.env.ATLAS_DEPLOY_MODE ?? configFileValue) as
|
|
1037
|
+
| "saas" | "self-hosted" | "auto" | undefined;
|
|
1038
|
+
|
|
1039
|
+
// Warn on unrecognized values
|
|
1040
|
+
if (rawSetting && !["auto", "saas", "self-hosted"].includes(rawSetting)) {
|
|
1041
|
+
log.warn(
|
|
1042
|
+
{ value: rawSetting },
|
|
1043
|
+
"Unrecognized ATLAS_DEPLOY_MODE value — treating as auto",
|
|
1044
|
+
);
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
try {
|
|
1048
|
+
const { resolveDeployMode } = await import("@atlas/ee/deploy-mode");
|
|
1049
|
+
resolved.deployMode = resolveDeployMode(rawSetting);
|
|
1050
|
+
} catch (err) {
|
|
1051
|
+
// ee/ module not available — default to self-hosted
|
|
1052
|
+
log.debug(
|
|
1053
|
+
{ err: err instanceof Error ? err.message : String(err) },
|
|
1054
|
+
"Deploy mode resolution unavailable — defaulting to self-hosted",
|
|
1055
|
+
);
|
|
1056
|
+
resolved.deployMode = "self-hosted";
|
|
1057
|
+
}
|
|
1058
|
+
log.info({ deployMode: resolved.deployMode }, "Deploy mode resolved");
|
|
1059
|
+
}
|
|
1060
|
+
|
|
534
1061
|
export async function loadConfig(
|
|
535
1062
|
projectRoot: string = process.cwd(),
|
|
536
1063
|
): Promise<ResolvedConfig> {
|
|
@@ -539,11 +1066,15 @@ export async function loadConfig(
|
|
|
539
1066
|
if (raw === null) {
|
|
540
1067
|
log.info("No atlas.config.ts found — using environment variables");
|
|
541
1068
|
const resolved = configFromEnv();
|
|
1069
|
+
await applyDeployMode(resolved);
|
|
542
1070
|
_resolved = resolved;
|
|
543
1071
|
return resolved;
|
|
544
1072
|
}
|
|
545
1073
|
|
|
1074
|
+
const configDeployMode = (raw as Record<string, unknown>).deployMode as
|
|
1075
|
+
| "auto" | "saas" | "self-hosted" | undefined;
|
|
546
1076
|
const resolved = validateAndResolve(raw);
|
|
1077
|
+
await applyDeployMode(resolved, configDeployMode);
|
|
547
1078
|
|
|
548
1079
|
log.info(
|
|
549
1080
|
{
|
|
@@ -556,6 +1087,18 @@ export async function loadConfig(
|
|
|
556
1087
|
);
|
|
557
1088
|
|
|
558
1089
|
_resolved = resolved;
|
|
1090
|
+
|
|
1091
|
+
// Flush query cache on config reload to avoid stale results
|
|
1092
|
+
try {
|
|
1093
|
+
const { flushCache } = await import("@atlas/api/lib/cache/index");
|
|
1094
|
+
flushCache();
|
|
1095
|
+
} catch (err) {
|
|
1096
|
+
// Dynamic import may fail on first load before cache is wired — other errors must be logged
|
|
1097
|
+
if (err instanceof Error && !err.message.includes("Cannot find module")) {
|
|
1098
|
+
log.warn({ err: err.message }, "Failed to flush query cache during config reload");
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
|
|
559
1102
|
return resolved;
|
|
560
1103
|
}
|
|
561
1104
|
|
|
@@ -585,6 +1128,10 @@ export async function applyDatasources(
|
|
|
585
1128
|
|
|
586
1129
|
connRegistry.setMaxTotalConnections(config.maxTotalConnections);
|
|
587
1130
|
|
|
1131
|
+
if (config.pool?.perOrg) {
|
|
1132
|
+
connRegistry.setOrgPoolConfig(config.pool.perOrg);
|
|
1133
|
+
}
|
|
1134
|
+
|
|
588
1135
|
for (const [id, ds] of Object.entries(config.datasources)) {
|
|
589
1136
|
try {
|
|
590
1137
|
log.info({ connectionId: id }, "Registering datasource from config");
|
|
@@ -700,3 +1247,8 @@ export async function initializeConfig(
|
|
|
700
1247
|
export function _resetConfig(): void {
|
|
701
1248
|
_resolved = null;
|
|
702
1249
|
}
|
|
1250
|
+
|
|
1251
|
+
/** Set the cached config directly. For testing only. */
|
|
1252
|
+
export function _setConfigForTest(config: ResolvedConfig | null): void {
|
|
1253
|
+
_resolved = config;
|
|
1254
|
+
}
|