create-ailk 0.24.0 → 0.26.0
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/README.md +53 -22
- package/component-catalog.json +3 -3
- package/component-catalog.md +3 -3
- package/dist/add-module.js +4 -2
- package/dist/add-route.d.ts +12 -1
- package/dist/add-route.js +31 -3
- package/dist/cli.js +12 -7
- package/dist/derive-architecture.d.ts +3 -4
- package/dist/derive-architecture.js +65 -29
- package/dist/lib/design-checks.d.ts +9 -4
- package/dist/lib/design-checks.js +13 -7
- package/dist/lib/extract-module-bundle.js +29 -2
- package/dist/lib/fetch-template-snapshot.d.ts +2 -1
- package/dist/lib/fetch-template-snapshot.js +8 -3
- package/dist/lib/import-graph.d.ts +1 -1
- package/dist/lib/import-graph.js +4 -4
- package/dist/lib/module-license-gate.d.ts +12 -1
- package/dist/lib/module-license-gate.js +36 -15
- package/dist/lib/module-tier.d.ts +2 -8
- package/dist/lib/module-tier.js +13 -12
- package/dist/module-architecture.d.ts +20 -3
- package/dist/module-architecture.js +129 -552
- package/dist/paid-sections.d.ts +25 -1
- package/dist/paid-sections.js +88 -3
- package/dist/starter-grid.d.ts +6 -6
- package/dist/starter-grid.js +12 -5
- package/dist/surfaces.js +39 -2
- package/dist/template-record.d.ts +21 -3
- package/dist/template-record.js +38 -7
- package/dist/topology.d.ts +16 -3
- package/dist/topology.js +54 -23
- package/dist/update.d.ts +10 -1
- package/dist/update.js +715 -21
- package/package.json +3 -3
- package/release-scope.json +2 -2
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +8 -2
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +2 -2
- package/site-templates/marketing-site/ailk-template.json +7 -1
- package/site-templates/marketing-site/provenance.json +7 -1
- package/site-templates/saas-product/ailk-template.json +2 -1
- package/site-templates/saas-product/provenance.json +1 -0
- package/templates/.claude/cloudparity-repo-hooks.json +5 -0
- package/templates/.claude/hooks/template-guard.sh +137 -0
- package/templates/.claude/rules/extending.md +106 -0
- package/templates/.claude/rules/loop-contract.md +2 -2
- package/templates/.claude/settings.json +11 -0
- package/templates/.env.example +20 -5
- package/templates/.github/workflows/ci.yml +7 -4
- package/templates/CLAUDE.md +11 -1
- package/templates/CONVENTIONS.md +8 -10
- package/templates/README.md +14 -13
- package/templates/apps/api/.env.example +23 -2
- package/templates/apps/api/CLAUDE.md +119 -83
- package/templates/apps/api/jest.config.cjs +15 -5
- package/templates/apps/api/package.json +16 -20
- package/templates/apps/api/src/__tests__/trusted-origins.server.test.ts +2 -2
- package/templates/apps/api/src/__tests__/vercel-handler.test.ts +4 -4
- package/templates/apps/api/src/index.ts +1 -1
- package/templates/apps/api/src/lib/__mocks__/prisma-client.js +16 -0
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +3 -3
- package/templates/apps/api/src/modules/commerce.ts +10 -0
- package/templates/apps/api/src/modules/content-write.ts +10 -0
- package/templates/apps/api/src/modules/multi-tenant.ts +10 -0
- package/templates/apps/api/src/modules/scheduling.ts +10 -0
- package/templates/apps/api/src/modules/signal-collectors.ts +10 -0
- package/templates/apps/api/src/modules/workspace.ts +10 -0
- package/templates/apps/api/src/server.ts +117 -1882
- package/templates/apps/api/vercel.json +2 -2
- package/templates/apps/mcp/CLAUDE.md +90 -26
- package/templates/apps/mcp/__tests__/app-entry.test.ts +4 -254
- package/templates/apps/mcp/__tests__/boot-file.test.ts +92 -0
- package/templates/apps/mcp/jest.config.cjs +6 -1
- package/templates/apps/mcp/package.json +5 -13
- package/templates/apps/mcp/src/app.ts +8 -7
- package/templates/apps/mcp/src/index.ts +6 -34
- package/templates/apps/mcp/src/lib/paid-tools.generated.ts +10 -0
- package/templates/apps/mcp/src/lib/topology.generated.ts +2 -2
- package/templates/apps/mcp/src/site.ts +12 -0
- package/templates/apps/web/.env.example +1 -1
- package/templates/apps/web/CLAUDE.md +31 -3
- package/templates/apps/web/app/.well-known/mcp.json/route.ts +9 -3
- package/templates/apps/web/app/[locale]/(auth)/__tests__/auth-pages.test.tsx +43 -4
- package/templates/apps/web/app/[locale]/(auth)/legal-footnote.tsx +35 -0
- package/templates/apps/web/app/[locale]/(auth)/sign-in/__tests__/page.test.tsx +117 -8
- package/templates/apps/web/app/[locale]/(auth)/sign-in/page.tsx +14 -37
- package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +6 -6
- package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-text.ts +20 -35
- package/templates/apps/web/app/[locale]/(auth)/sign-up/__tests__/page.test.tsx +108 -0
- package/templates/apps/web/app/[locale]/(auth)/sign-up/__tests__/sign-up-card.test.tsx +111 -5
- package/templates/apps/web/app/[locale]/(auth)/sign-up/page.tsx +78 -16
- package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +132 -12
- package/templates/apps/web/app/[locale]/(authed)/__tests__/gate.test.tsx +53 -1
- package/templates/apps/web/app/[locale]/(authed)/account/__tests__/billing.test.tsx +38 -0
- package/templates/apps/web/app/[locale]/(authed)/account/billing/page.tsx +4 -2
- package/templates/apps/web/app/[locale]/(authed)/sign-in-gate.tsx +47 -24
- package/templates/apps/web/app/[locale]/(authed)/signed-out-gate.generated.tsx +23 -4
- package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +1 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/magnet-page.test.tsx +22 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/magnet-page.tsx +7 -3
- package/templates/apps/web/app/[locale]/layout.tsx +33 -13
- package/templates/apps/web/app/[locale]/meet/confirmed/BookingHandOff.tsx +128 -0
- package/templates/apps/web/app/[locale]/meet/confirmed/__tests__/BookingHandOff.test.tsx +126 -0
- package/templates/apps/web/app/[locale]/pricing/__tests__/unconnected.test.tsx +43 -0
- package/templates/apps/web/app/[locale]/pricing/page.tsx +7 -3
- package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/__tests__/route.test.ts +222 -0
- package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/route.ts +10 -3
- package/templates/apps/web/app/api/revalidate/route.ts +3 -3
- package/templates/apps/web/auth.ts +10 -6
- package/templates/apps/web/i18n/request.ts +49 -1
- package/templates/apps/web/jest.config.cjs +1 -0
- package/templates/apps/web/lib/__tests__/account-config.test.ts +7 -0
- package/templates/apps/web/lib/__tests__/auth-email.test.ts +276 -0
- package/templates/apps/web/lib/auth-email.ts +103 -21
- package/templates/apps/web/lib/hub-session/__tests__/sign-in-gate.test.tsx +72 -23
- package/templates/apps/web/lib/hub-session/sign-in-gate.tsx +94 -70
- package/templates/apps/web/lib/prisma-for-auth.ts +5 -2
- package/templates/apps/web/lib/relay.ts +2 -2
- package/templates/apps/web/lib/release-scope.ts +47 -0
- package/templates/apps/web/lib/server-api.ts +1 -1
- package/templates/apps/web/lib/sign-up-agreements.ts +291 -28
- package/templates/apps/web/lib/site-contributions.ts +18 -0
- package/templates/apps/web/messages/en.json +186 -20
- package/templates/apps/web/messages/site/en.json +1 -0
- package/templates/apps/web/src/lib/commerce-claim.ts +1 -1
- package/templates/customizations.yaml +37 -0
- package/templates/database/prisma.config.ts +10 -14
- package/templates/database/seed-test.ts +2 -2
- package/templates/database/seed.ts +5 -5
- package/templates/package.json +12 -6
- package/templates/pnpm-workspace.yaml +0 -1
- package/templates/project.yaml +16 -8
- package/templates/tools/jest/reporters.cjs +65 -0
- package/templates/tools/lint-architecture.ts +553 -7
- package/templates/tsconfig.json +1 -2
- package/versions.json +49 -36
- package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +0 -409
- package/templates/apps/api/src/__tests__/factories/agent-caller.ts +0 -102
- package/templates/apps/api/src/__tests__/factories/content-fixture.ts +0 -138
- package/templates/apps/api/src/__tests__/factories/in-memory-prisma.ts +0 -441
- package/templates/apps/api/src/__tests__/factories/index.ts +0 -70
- package/templates/apps/api/src/__tests__/factories/lead-fixture.ts +0 -82
- package/templates/apps/api/src/__tests__/leads-forwarded-rate-limit.test.ts +0 -135
- package/templates/apps/api/src/__tests__/services/enrichment-shim.test.ts +0 -126
- package/templates/apps/api/src/__tests__/stripe-boot.test.ts +0 -132
- package/templates/apps/api/src/__tests__/support/hub-sign-in-fake-db.ts +0 -362
- package/templates/apps/api/src/bin/__tests__/rate-limit-probe.test.ts +0 -184
- package/templates/apps/api/src/bin/abandon-sweep.ts +0 -42
- package/templates/apps/api/src/bin/rate-limit-probe.ts +0 -53
- package/templates/apps/api/src/bin/spokes.ts +0 -198
- package/templates/apps/api/src/bin/stripe-connections-rekey.ts +0 -45
- package/templates/apps/api/src/config/__tests__/hub-require-spoke-key.test.ts +0 -196
- package/templates/apps/api/src/config/__tests__/index.test.ts +0 -233
- package/templates/apps/api/src/config/__tests__/modules.test.ts +0 -76
- package/templates/apps/api/src/config/__tests__/stripe-connection-key.test.ts +0 -185
- package/templates/apps/api/src/config/__tests__/trusted-origins.test.ts +0 -238
- package/templates/apps/api/src/config/index.ts +0 -596
- package/templates/apps/api/src/config/modules.ts +0 -83
- package/templates/apps/api/src/lib/__tests__/agent-store.test.ts +0 -581
- package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +0 -143
- package/templates/apps/api/src/lib/__tests__/consent-ledger-double.ts +0 -237
- package/templates/apps/api/src/lib/__tests__/consent-store.test.ts +0 -353
- package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +0 -201
- package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +0 -224
- package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +0 -120
- package/templates/apps/api/src/lib/__tests__/errors.test.ts +0 -94
- package/templates/apps/api/src/lib/__tests__/file-fallback.test.ts +0 -144
- package/templates/apps/api/src/lib/__tests__/fixtures/HomePage/home.mdx +0 -8
- package/templates/apps/api/src/lib/__tests__/flow-completion-store.test.ts +0 -149
- package/templates/apps/api/src/lib/__tests__/flow-rename-race.db.test.ts +0 -116
- package/templates/apps/api/src/lib/__tests__/hub-sign-in-store.test.ts +0 -209
- package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +0 -257
- package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +0 -96
- package/templates/apps/api/src/lib/__tests__/outbound-http.test.ts +0 -125
- package/templates/apps/api/src/lib/__tests__/prisma.test.ts +0 -165
- package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +0 -317
- package/templates/apps/api/src/lib/__tests__/require-paid-tier.test.ts +0 -129
- package/templates/apps/api/src/lib/__tests__/site.test.ts +0 -308
- package/templates/apps/api/src/lib/__tests__/slice-load.test.ts +0 -89
- package/templates/apps/api/src/lib/__tests__/spoke-store.test.ts +0 -202
- package/templates/apps/api/src/lib/__tests__/stripe-admission.test.ts +0 -217
- package/templates/apps/api/src/lib/__tests__/stripe.test.ts +0 -82
- package/templates/apps/api/src/lib/agent-store.ts +0 -613
- package/templates/apps/api/src/lib/auth-email-budget.ts +0 -161
- package/templates/apps/api/src/lib/consent-store.ts +0 -363
- package/templates/apps/api/src/lib/content-adapter.ts +0 -112
- package/templates/apps/api/src/lib/deliverable-asset-store.ts +0 -96
- package/templates/apps/api/src/lib/error-serializer.ts +0 -164
- package/templates/apps/api/src/lib/errors.ts +0 -95
- package/templates/apps/api/src/lib/file-fallback.ts +0 -87
- package/templates/apps/api/src/lib/flow-completion-store.ts +0 -136
- package/templates/apps/api/src/lib/hub-sign-in-store.ts +0 -455
- package/templates/apps/api/src/lib/lead-capture-store.ts +0 -122
- package/templates/apps/api/src/lib/lead-delivery.ts +0 -52
- package/templates/apps/api/src/lib/license-key-store.ts +0 -45
- package/templates/apps/api/src/lib/locales.ts +0 -201
- package/templates/apps/api/src/lib/outbound-http.ts +0 -127
- package/templates/apps/api/src/lib/prisma.ts +0 -21
- package/templates/apps/api/src/lib/proposal-paid-store.ts +0 -66
- package/templates/apps/api/src/lib/rate-limit-probe.ts +0 -165
- package/templates/apps/api/src/lib/rate-limit-store.ts +0 -142
- package/templates/apps/api/src/lib/require-commerce-claim.ts +0 -250
- package/templates/apps/api/src/lib/require-paid-tier.ts +0 -53
- package/templates/apps/api/src/lib/site.ts +0 -257
- package/templates/apps/api/src/lib/slice-load.ts +0 -90
- package/templates/apps/api/src/lib/spoke-store.ts +0 -180
- package/templates/apps/api/src/lib/stripe.ts +0 -321
- package/templates/apps/api/src/lib/webhook-idempotency.ts +0 -156
- package/templates/apps/api/src/middleware/__tests__/adversarial/bearer-token-format.test.ts +0 -111
- package/templates/apps/api/src/middleware/__tests__/adversarial/cookie-or-bearer-precedence.test.ts +0 -172
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-bearer-skip.test.ts +0 -119
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-cookie-path.test.ts +0 -138
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-trusted-origins.test.ts +0 -142
- package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +0 -155
- package/templates/apps/api/src/middleware/__tests__/adversarial/session-timeout.test.ts +0 -139
- package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +0 -562
- package/templates/apps/api/src/middleware/__tests__/auth.both-present-precedence.test.ts +0 -76
- package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +0 -220
- package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +0 -97
- package/templates/apps/api/src/middleware/__tests__/auth.hub-session-path.test.ts +0 -557
- package/templates/apps/api/src/middleware/__tests__/auth.neither-present.test.ts +0 -72
- package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +0 -140
- package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +0 -721
- package/templates/apps/api/src/middleware/__tests__/rate-limit-cross-isolate.db.test.ts +0 -220
- package/templates/apps/api/src/middleware/__tests__/rate-limit-store.test.ts +0 -430
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +0 -1409
- package/templates/apps/api/src/middleware/__tests__/write-budget.test.ts +0 -174
- package/templates/apps/api/src/middleware/auth.ts +0 -864
- package/templates/apps/api/src/middleware/default-tenant.ts +0 -166
- package/templates/apps/api/src/middleware/rate-limit.ts +0 -983
- package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +0 -391
- package/templates/apps/api/src/openapi/__tests__/spec-identity.test.ts +0 -182
- package/templates/apps/api/src/openapi/index.ts +0 -18
- package/templates/apps/api/src/openapi/spec.ts +0 -2148
- package/templates/apps/api/src/openapi/surface-drift.ts +0 -195
- package/templates/apps/api/src/routes/aeo/__tests__/index.test.ts +0 -175
- package/templates/apps/api/src/routes/aeo/index.ts +0 -107
- package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +0 -196
- package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +0 -249
- package/templates/apps/api/src/routes/auth/__tests__/hub-sign-in.test.ts +0 -532
- package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +0 -313
- package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +0 -413
- package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +0 -609
- package/templates/apps/api/src/routes/auth/hub-sign-in.ts +0 -242
- package/templates/apps/api/src/routes/auth/tokens.ts +0 -211
- package/templates/apps/api/src/routes/auth/transactional-email.ts +0 -301
- package/templates/apps/api/src/routes/auth/user.ts +0 -305
- package/templates/apps/api/src/routes/billing/plan-checkout.ts +0 -332
- package/templates/apps/api/src/routes/checkout/__tests__/live-key.test.ts +0 -178
- package/templates/apps/api/src/routes/checkout/__tests__/offerings-authorization.test.ts +0 -1426
- package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +0 -448
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +0 -1742
- package/templates/apps/api/src/routes/checkout/index.ts +0 -34
- package/templates/apps/api/src/routes/checkout/session.ts +0 -171
- package/templates/apps/api/src/routes/checkout/sessions.ts +0 -540
- package/templates/apps/api/src/routes/consent/__tests__/account.test.ts +0 -386
- package/templates/apps/api/src/routes/consent/__tests__/sign-up-rate-limit.test.ts +0 -160
- package/templates/apps/api/src/routes/consent/account.ts +0 -268
- package/templates/apps/api/src/routes/consent/cookie.ts +0 -90
- package/templates/apps/api/src/routes/consent/index.ts +0 -26
- package/templates/apps/api/src/routes/consent/unsubscribe.ts +0 -127
- package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +0 -853
- package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +0 -230
- package/templates/apps/api/src/routes/content/__tests__/list-types.test.ts +0 -44
- package/templates/apps/api/src/routes/content/__tests__/locale.test.ts +0 -118
- package/templates/apps/api/src/routes/content/__tests__/offerings.test.ts +0 -731
- package/templates/apps/api/src/routes/content/__tests__/pricing.test.ts +0 -753
- package/templates/apps/api/src/routes/content/__tests__/rate-limit.test.ts +0 -51
- package/templates/apps/api/src/routes/content/__tests__/search.test.ts +0 -450
- package/templates/apps/api/src/routes/content/__tests__/shown-offerings.test.ts +0 -762
- package/templates/apps/api/src/routes/content/get-page.ts +0 -183
- package/templates/apps/api/src/routes/content/index.ts +0 -49
- package/templates/apps/api/src/routes/content/list-pages.ts +0 -74
- package/templates/apps/api/src/routes/content/list-types.ts +0 -19
- package/templates/apps/api/src/routes/content/offerings.ts +0 -184
- package/templates/apps/api/src/routes/content/pricing.ts +0 -176
- package/templates/apps/api/src/routes/content/rate-limit.ts +0 -22
- package/templates/apps/api/src/routes/content/search.ts +0 -100
- package/templates/apps/api/src/routes/content/shown-offerings.ts +0 -229
- package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +0 -88
- package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +0 -171
- package/templates/apps/api/src/routes/leads/__tests__/magnet-completion.test.ts +0 -515
- package/templates/apps/api/src/routes/leads/__tests__/spoke.test.ts +0 -392
- package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +0 -165
- package/templates/apps/api/src/routes/leads/index.ts +0 -639
- package/templates/apps/api/src/routes/leads/list.ts +0 -104
- package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +0 -626
- package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +0 -1268
- package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +0 -847
- package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +0 -491
- package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +0 -476
- package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +0 -872
- package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +0 -1022
- package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +0 -484
- package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +0 -535
- package/templates/apps/api/src/routes/project-listings/index.ts +0 -164
- package/templates/apps/api/src/routes/project-listings/me.ts +0 -87
- package/templates/apps/api/src/routes/project-listings/patch-copy.ts +0 -224
- package/templates/apps/api/src/routes/project-listings/patch-draft.ts +0 -102
- package/templates/apps/api/src/routes/project-listings/public.ts +0 -98
- package/templates/apps/api/src/routes/project-listings/respond.ts +0 -48
- package/templates/apps/api/src/routes/project-listings/resume-token.ts +0 -27
- package/templates/apps/api/src/routes/project-listings/start.ts +0 -140
- package/templates/apps/api/src/routes/project-listings/submit.ts +0 -130
- package/templates/apps/api/src/routes/project-listings/verify-email.ts +0 -150
- package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +0 -686
- package/templates/apps/api/src/routes/requests/confirm.ts +0 -601
- package/templates/apps/api/src/routes/requests/index.ts +0 -54
- package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +0 -306
- package/templates/apps/api/src/routes/test/auth/session.ts +0 -143
- package/templates/apps/api/src/routes/webhooks/README.md +0 -398
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-checkout-consent.test.ts +0 -649
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +0 -749
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +0 -449
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +0 -264
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode-live.test.ts +0 -159
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode.test.ts +0 -158
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-offerings.test.ts +0 -814
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +0 -301
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-proposal-paid.test.ts +0 -369
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +0 -215
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +0 -301
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-site-filter.test.ts +0 -809
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +0 -1155
- package/templates/apps/api/src/routes/webhooks/index.ts +0 -141
- package/templates/apps/api/src/routes/webhooks/stripe-offerings.ts +0 -384
- package/templates/apps/api/src/routes/webhooks/stripe.ts +0 -2028
- package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +0 -645
- package/templates/apps/api/src/services/__tests__/answer-distributions.test.ts +0 -132
- package/templates/apps/api/src/services/__tests__/audit-log.test.ts +0 -1028
- package/templates/apps/api/src/services/__tests__/checkout-plan.test.ts +0 -313
- package/templates/apps/api/src/services/__tests__/consent-ledger.test.ts +0 -503
- package/templates/apps/api/src/services/__tests__/consent-migration.test.ts +0 -65
- package/templates/apps/api/src/services/__tests__/consent.test.ts +0 -299
- package/templates/apps/api/src/services/__tests__/default-tenant.test.ts +0 -147
- package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +0 -877
- package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +0 -379
- package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +0 -368
- package/templates/apps/api/src/services/__tests__/entitlements.test.ts +0 -142
- package/templates/apps/api/src/services/__tests__/hub-sign-in.test.ts +0 -854
- package/templates/apps/api/src/services/__tests__/keyless-workspace-predicate.test.ts +0 -234
- package/templates/apps/api/src/services/__tests__/lead-accept-user.test.ts +0 -251
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +0 -2660
- package/templates/apps/api/src/services/__tests__/listing-config.test.ts +0 -166
- package/templates/apps/api/src/services/__tests__/magnet-completion.test.ts +0 -389
- package/templates/apps/api/src/services/__tests__/person.test.ts +0 -1204
- package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +0 -450
- package/templates/apps/api/src/services/__tests__/project-listings.counts.test.ts +0 -202
- package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +0 -151
- package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +0 -137
- package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +0 -531
- package/templates/apps/api/src/services/__tests__/revalidation.test.ts +0 -372
- package/templates/apps/api/src/services/__tests__/slack-notify.test.ts +0 -348
- package/templates/apps/api/src/services/__tests__/spoke-resolution.test.ts +0 -660
- package/templates/apps/api/src/services/__tests__/usage-aggregation.test.ts +0 -941
- package/templates/apps/api/src/services/__tests__/usage-credits.test.ts +0 -588
- package/templates/apps/api/src/services/__tests__/verified-email.test.ts +0 -78
- package/templates/apps/api/src/services/abandon-email.ts +0 -336
- package/templates/apps/api/src/services/aeo-score.ts +0 -325
- package/templates/apps/api/src/services/answer-distributions.ts +0 -138
- package/templates/apps/api/src/services/audit-log.ts +0 -961
- package/templates/apps/api/src/services/checkout-buyer.ts +0 -168
- package/templates/apps/api/src/services/consent.ts +0 -834
- package/templates/apps/api/src/services/default-tenant.ts +0 -416
- package/templates/apps/api/src/services/deliverable-fulfillment.ts +0 -750
- package/templates/apps/api/src/services/dunning-policy.ts +0 -294
- package/templates/apps/api/src/services/enrichment-shim.ts +0 -53
- package/templates/apps/api/src/services/entitlements.ts +0 -338
- package/templates/apps/api/src/services/hub-sign-in.ts +0 -472
- package/templates/apps/api/src/services/lead-accept-user.ts +0 -126
- package/templates/apps/api/src/services/lead-promotion.ts +0 -160
- package/templates/apps/api/src/services/lead-routing.ts +0 -1372
- package/templates/apps/api/src/services/leads-inbox.ts +0 -312
- package/templates/apps/api/src/services/listing-config.ts +0 -178
- package/templates/apps/api/src/services/magnet-completion.ts +0 -242
- package/templates/apps/api/src/services/offerings/__tests__/catalog.test.ts +0 -348
- package/templates/apps/api/src/services/offerings/__tests__/checkout-session-record.test.ts +0 -268
- package/templates/apps/api/src/services/offerings/__tests__/connection.test.ts +0 -975
- package/templates/apps/api/src/services/offerings/__tests__/fixtures.ts +0 -416
- package/templates/apps/api/src/services/offerings/__tests__/org-products.test.ts +0 -400
- package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +0 -685
- package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +0 -231
- package/templates/apps/api/src/services/offerings/catalog.ts +0 -318
- package/templates/apps/api/src/services/offerings/checkout-authorization.ts +0 -403
- package/templates/apps/api/src/services/offerings/checkout-session-record.ts +0 -192
- package/templates/apps/api/src/services/offerings/connection.ts +0 -1083
- package/templates/apps/api/src/services/offerings/index.ts +0 -614
- package/templates/apps/api/src/services/offerings/source.ts +0 -140
- package/templates/apps/api/src/services/offerings/store.ts +0 -150
- package/templates/apps/api/src/services/owner-workspaces.ts +0 -132
- package/templates/apps/api/src/services/person.ts +0 -1211
- package/templates/apps/api/src/services/plan-offerings.ts +0 -125
- package/templates/apps/api/src/services/project-listing-resume-email.ts +0 -326
- package/templates/apps/api/src/services/project-listings.ts +0 -2085
- package/templates/apps/api/src/services/public-site-resolver.ts +0 -396
- package/templates/apps/api/src/services/request-confirm.ts +0 -698
- package/templates/apps/api/src/services/revalidation.ts +0 -235
- package/templates/apps/api/src/services/slack-notify.ts +0 -291
- package/templates/apps/api/src/services/usage-aggregation.ts +0 -516
- package/templates/apps/api/src/services/usage-credits.ts +0 -340
- package/templates/apps/api/src/services/verified-email.ts +0 -71
- package/templates/apps/mcp/__tests__/abuse/daily-cap.test.ts +0 -52
- package/templates/apps/mcp/__tests__/abuse/email-validator.test.ts +0 -46
- package/templates/apps/mcp/__tests__/abuse/guard.test.ts +0 -198
- package/templates/apps/mcp/__tests__/abuse/honeypot.test.ts +0 -36
- package/templates/apps/mcp/__tests__/abuse/user-agent-deny.test.ts +0 -54
- package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +0 -116
- package/templates/apps/mcp/__tests__/audit-single-page.test.ts +0 -299
- package/templates/apps/mcp/__tests__/boot.test.ts +0 -280
- package/templates/apps/mcp/__tests__/catalog-drift.test.ts +0 -359
- package/templates/apps/mcp/__tests__/config/modules.test.ts +0 -78
- package/templates/apps/mcp/__tests__/get_business_hours.test.ts +0 -82
- package/templates/apps/mcp/__tests__/get_faq.test.ts +0 -80
- package/templates/apps/mcp/__tests__/get_locations.test.ts +0 -65
- package/templates/apps/mcp/__tests__/get_offerings.test.ts +0 -557
- package/templates/apps/mcp/__tests__/get_pricing.test.ts +0 -524
- package/templates/apps/mcp/__tests__/get_site_info.test.ts +0 -81
- package/templates/apps/mcp/__tests__/http-transport.test.ts +0 -1232
- package/templates/apps/mcp/__tests__/index.test.ts +0 -195
- package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +0 -191
- package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +0 -531
- package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +0 -70
- package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -162
- package/templates/apps/mcp/__tests__/lib/content-root.test.ts +0 -93
- package/templates/apps/mcp/__tests__/lib/errors.test.ts +0 -75
- package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +0 -180
- package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +0 -124
- package/templates/apps/mcp/__tests__/list_pages.test.ts +0 -268
- package/templates/apps/mcp/__tests__/locale.test.ts +0 -120
- package/templates/apps/mcp/__tests__/module-exclusion.test.ts +0 -175
- package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +0 -101
- package/templates/apps/mcp/__tests__/rate-limit-write.test.ts +0 -189
- package/templates/apps/mcp/__tests__/read_content.test.ts +0 -511
- package/templates/apps/mcp/__tests__/request_callback.test.ts +0 -160
- package/templates/apps/mcp/__tests__/search_content.test.ts +0 -271
- package/templates/apps/mcp/__tests__/server.test.ts +0 -388
- package/templates/apps/mcp/__tests__/start_purchase.test.ts +0 -448
- package/templates/apps/mcp/__tests__/submit_lead.test.ts +0 -222
- package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +0 -152
- package/templates/apps/mcp/__tests__/tools/create_project.test.ts +0 -243
- package/templates/apps/mcp/__tests__/tools/purchase.test.ts +0 -451
- package/templates/apps/mcp/src/abuse/daily-cap.ts +0 -47
- package/templates/apps/mcp/src/abuse/email-validator.ts +0 -25
- package/templates/apps/mcp/src/abuse/honeypot.ts +0 -21
- package/templates/apps/mcp/src/abuse/index.ts +0 -349
- package/templates/apps/mcp/src/abuse/user-agent-deny.ts +0 -58
- package/templates/apps/mcp/src/boot.ts +0 -167
- package/templates/apps/mcp/src/config/modules.ts +0 -43
- package/templates/apps/mcp/src/http-transport.ts +0 -564
- package/templates/apps/mcp/src/lib/audit-single-page.ts +0 -308
- package/templates/apps/mcp/src/lib/commerce-claim.ts +0 -263
- package/templates/apps/mcp/src/lib/content-adapter.ts +0 -116
- package/templates/apps/mcp/src/lib/empty-content-adapter.ts +0 -140
- package/templates/apps/mcp/src/lib/errors.ts +0 -61
- package/templates/apps/mcp/src/lib/license-key-store.ts +0 -45
- package/templates/apps/mcp/src/lib/locales.ts +0 -171
- package/templates/apps/mcp/src/lib/prisma.ts +0 -39
- package/templates/apps/mcp/src/lib/public-workspace.ts +0 -133
- package/templates/apps/mcp/src/lib/resolve-locale.ts +0 -30
- package/templates/apps/mcp/src/lib/shown-offerings.ts +0 -105
- package/templates/apps/mcp/src/lib/site-config.ts +0 -53
- package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +0 -59
- package/templates/apps/mcp/src/request-context.ts +0 -52
- package/templates/apps/mcp/src/server.ts +0 -343
- package/templates/apps/mcp/src/serverless-app.ts +0 -88
- package/templates/apps/mcp/src/tools/audit.ts +0 -127
- package/templates/apps/mcp/src/tools/capture_lead.ts +0 -66
- package/templates/apps/mcp/src/tools/create_project.ts +0 -134
- package/templates/apps/mcp/src/tools/get_business_hours.ts +0 -68
- package/templates/apps/mcp/src/tools/get_faq.ts +0 -71
- package/templates/apps/mcp/src/tools/get_locations.ts +0 -88
- package/templates/apps/mcp/src/tools/get_offerings.ts +0 -96
- package/templates/apps/mcp/src/tools/get_pricing.ts +0 -94
- package/templates/apps/mcp/src/tools/get_site_info.ts +0 -86
- package/templates/apps/mcp/src/tools/index.ts +0 -138
- package/templates/apps/mcp/src/tools/list_pages.ts +0 -68
- package/templates/apps/mcp/src/tools/person_notes.ts +0 -25
- package/templates/apps/mcp/src/tools/proposals.ts +0 -27
- package/templates/apps/mcp/src/tools/purchase.ts +0 -205
- package/templates/apps/mcp/src/tools/read_content.ts +0 -81
- package/templates/apps/mcp/src/tools/request_callback.ts +0 -52
- package/templates/apps/mcp/src/tools/search_content.ts +0 -63
- package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +0 -54
- package/templates/apps/mcp/src/workspace-server.ts +0 -224
- package/templates/database/CHANGELOG.md +0 -981
- package/templates/database/LICENSE +0 -202
- package/templates/database/NOTICE +0 -2
- package/templates/database/README.md +0 -243
- package/templates/database/__tests__/agents.db.test.ts +0 -320
- package/templates/database/__tests__/appointment.db.test.ts +0 -106
- package/templates/database/__tests__/artifact-content-store.db.test.ts +0 -316
- package/templates/database/__tests__/composite-fence.db.test.ts +0 -206
- package/templates/database/__tests__/consent-ledger.db.test.ts +0 -345
- package/templates/database/__tests__/consent-source-checkout-migration.test.ts +0 -79
- package/templates/database/__tests__/fence-fan-out.db.test.ts +0 -715
- package/templates/database/__tests__/fixtures/appointment-create-probe.ts +0 -79
- package/templates/database/__tests__/fixtures/person-backfill.json +0 -264
- package/templates/database/__tests__/fixtures/person-contact-backfill.json +0 -182
- package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +0 -100
- package/templates/database/__tests__/flow-completion-migration.test.ts +0 -115
- package/templates/database/__tests__/flow-completion.db.test.ts +0 -136
- package/templates/database/__tests__/flow-workspace-key.db.test.ts +0 -263
- package/templates/database/__tests__/flows-listing-diagnostic.test.ts +0 -392
- package/templates/database/__tests__/flows-presets.test.ts +0 -173
- package/templates/database/__tests__/in-page-magnets-migration.test.ts +0 -161
- package/templates/database/__tests__/lead-idempotency-key.db.test.ts +0 -92
- package/templates/database/__tests__/member-area.db.test.ts +0 -257
- package/templates/database/__tests__/member-contract-migration.test.ts +0 -85
- package/templates/database/__tests__/member-contract.db.test.ts +0 -413
- package/templates/database/__tests__/offerings-checkout-session.db.test.ts +0 -270
- package/templates/database/__tests__/offerings-migration.test.ts +0 -197
- package/templates/database/__tests__/offerings-shown-price-ids-migration.test.ts +0 -86
- package/templates/database/__tests__/offerings.db.test.ts +0 -303
- package/templates/database/__tests__/outbound-message-action.db.test.ts +0 -80
- package/templates/database/__tests__/person-contact.db.test.ts +0 -563
- package/templates/database/__tests__/person-notes.db.test.ts +0 -249
- package/templates/database/__tests__/person.db.test.ts +0 -586
- package/templates/database/__tests__/piece-kind-migration.test.ts +0 -67
- package/templates/database/__tests__/piece-kind.db.test.ts +0 -208
- package/templates/database/__tests__/prefixed-ids.db.test.ts +0 -222
- package/templates/database/__tests__/project-listing-consent-at.db.test.ts +0 -111
- package/templates/database/__tests__/seed.test.ts +0 -272
- package/templates/database/__tests__/spoke-registry.db.test.ts +0 -191
- package/templates/database/__tests__/tenancy.test.ts +0 -141
- package/templates/database/__tests__/trial-magnet-migration.test.ts +0 -186
- package/templates/database/__tests__/user-cascade.test.ts +0 -140
- package/templates/database/_gitignore +0 -8
- package/templates/database/auth/.gitkeep +0 -0
- package/templates/database/auth/schema.prisma +0 -641
- package/templates/database/config/.gitkeep +0 -0
- package/templates/database/config/schema.prisma +0 -441
- package/templates/database/content/.gitkeep +0 -0
- package/templates/database/content/schema.prisma +0 -339
- package/templates/database/eslint.config.mjs +0 -69
- package/templates/database/flows/listing-diagnostic.ts +0 -182
- package/templates/database/flows/presets.ts +0 -315
- package/templates/database/inbox/.gitkeep +0 -0
- package/templates/database/inbox/README.md +0 -3
- package/templates/database/inbox/__tests__/schema.test.ts +0 -44
- package/templates/database/inbox/schema.prisma +0 -1447
- package/templates/database/jest.config.cjs +0 -36
- package/templates/database/migrations/20260508000000_add_inbox_namespace/migration.sql +0 -328
- package/templates/database/migrations/20260513000000_better_auth_migration/migration.sql +0 -100
- package/templates/database/migrations/20260515000000_add_user_billing_fields/migration.sql +0 -28
- package/templates/database/migrations/20260516000000_add_user_tier_care_plan_seat/migration.sql +0 -25
- package/templates/database/migrations/20260518000000_add_telemetry_records/migration.sql +0 -42
- package/templates/database/migrations/20260525000000_theme_wiring/migration.sql +0 -67
- package/templates/database/migrations/20260710000000_retire_commercial_tier/migration.sql +0 -21
- package/templates/database/migrations/20260712215647_add_multi_tenant_tenancy/migration.sql +0 -201
- package/templates/database/migrations/20260713143320_reanchor_site_config_to_workspace/migration.sql +0 -67
- package/templates/database/migrations/20260713174000_add_audit_logs/migration.sql +0 -46
- package/templates/database/migrations/20260713190000_drop_telemetry_records/migration.sql +0 -25
- package/templates/database/migrations/20260713192000_add_uuidv7_function/migration.sql +0 -49
- package/templates/database/migrations/20260713192429_prefixed_uuid_entity_ids/migration.sql +0 -197
- package/templates/database/migrations/20260713200000_add_org_billing/migration.sql +0 -32
- package/templates/database/migrations/20260714000000_add_lead_promotion_fields/migration.sql +0 -22
- package/templates/database/migrations/20260714010000_add_usage_billing_content_models/migration.sql +0 -151
- package/templates/database/migrations/20260714020000_add_usage_billing_auth_config_models/migration.sql +0 -223
- package/templates/database/migrations/20260714030000_credit_balance_non_negative/migration.sql +0 -22
- package/templates/database/migrations/20260714030000_widen_usage_billing_report_aggregates/migration.sql +0 -32
- package/templates/database/migrations/20260810233516_add_flow_engine_models/migration.sql +0 -40
- package/templates/database/migrations/20260811020000_add_flow_session_abandon_email_columns/migration.sql +0 -4
- package/templates/database/migrations/20260811030000_add_flow_session_abandon_email_index/migration.sql +0 -2
- package/templates/database/migrations/20260811040000_add_flow_session_segment/migration.sql +0 -2
- package/templates/database/migrations/20260811050000_add_deliverable_models/migration.sql +0 -29
- package/templates/database/migrations/20260812000000_add_deliverable_grant_send_columns/migration.sql +0 -6
- package/templates/database/migrations/20260902222948_add_waitlist_experiment_models/migration.sql +0 -39
- package/templates/database/migrations/20260902224500_add_waitlist_id_format_checks/migration.sql +0 -24
- package/templates/database/migrations/20260903004112_add_flow_session_flags_aeo_score/migration.sql +0 -3
- package/templates/database/migrations/20260903010000_add_playbook_instance/migration.sql +0 -33
- package/templates/database/migrations/20260904000000_add_waitlist_followup_send/migration.sql +0 -30
- package/templates/database/migrations/20260905230000_add_flow_checkout/migration.sql +0 -47
- package/templates/database/migrations/20260906000000_add_flow_checkout_idempotency/migration.sql +0 -16
- package/templates/database/migrations/20260907120000_add_project_listing/migration.sql +0 -47
- package/templates/database/migrations/20260907130000_add_project_listing_slack_columns/migration.sql +0 -10
- package/templates/database/migrations/20260907180000_add_listing_csv_send/migration.sql +0 -26
- package/templates/database/migrations/20260909120000_project_listings_platform/migration.sql +0 -90
- package/templates/database/migrations/20260909180000_listing_draft_and_fields/migration.sql +0 -174
- package/templates/database/migrations/20260910120000_listing_public_site_key/migration.sql +0 -14
- package/templates/database/migrations/20260911120000_listing_copy_edit_audit/migration.sql +0 -25
- package/templates/database/migrations/20260911140000_listing_structured_address/migration.sql +0 -32
- package/templates/database/migrations/20260911180000_consent_grants/migration.sql +0 -71
- package/templates/database/migrations/20260911200000_listing_site_answers/migration.sql +0 -30
- package/templates/database/migrations/20260912120000_listing_owner_link/migration.sql +0 -49
- package/templates/database/migrations/20260914120000_listing_founder_identity/migration.sql +0 -123
- package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +0 -15
- package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +0 -158
- package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +0 -40
- package/templates/database/migrations/20260918120000_add_appointment/migration.sql +0 -67
- package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +0 -70
- package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +0 -181
- package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +0 -172
- package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +0 -41
- package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +0 -185
- package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +0 -70
- package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +0 -57
- package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +0 -68
- package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +0 -1067
- package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +0 -210
- package/templates/database/migrations/20261003120000_spoke_registry/migration.sql +0 -80
- package/templates/database/migrations/20261003130000_scheduling_connection/migration.sql +0 -49
- package/templates/database/migrations/20261005120000_agents/migration.sql +0 -84
- package/templates/database/migrations/20261008120000_user_last_workspace/migration.sql +0 -35
- package/templates/database/migrations/20261008130000_lead_idempotency_key/migration.sql +0 -20
- package/templates/database/migrations/20261009120000_agent_grants/migration.sql +0 -33
- package/templates/database/migrations/20261010120000_person/migration.sql +0 -106
- package/templates/database/migrations/20261010121000_person_backfill/migration.sql +0 -132
- package/templates/database/migrations/20261010130000_agent_grants_people_read/migration.sql +0 -20
- package/templates/database/migrations/20261011120000_member_area/migration.sql +0 -158
- package/templates/database/migrations/20261011130000_agent_grants_member_pieces_manage/migration.sql +0 -21
- package/templates/database/migrations/20261012120000_member_contract/migration.sql +0 -192
- package/templates/database/migrations/20261013120000_lead_spoke_checkout/migration.sql +0 -20
- package/templates/database/migrations/20261014120000_consent_ledger/migration.sql +0 -122
- package/templates/database/migrations/20261014120000_person_contact/migration.sql +0 -231
- package/templates/database/migrations/20261015120000_person_notes/migration.sql +0 -77
- package/templates/database/migrations/20261015120000_rate_limit_counters/migration.sql +0 -43
- package/templates/database/migrations/20261016120000_piece_kind/migration.sql +0 -95
- package/templates/database/migrations/20261017120000_outbound_message_action/migration.sql +0 -30
- package/templates/database/migrations/20261018120000_flow_completion/migration.sql +0 -52
- package/templates/database/migrations/20261019120000_consent_source_checkout/migration.sql +0 -27
- package/templates/database/migrations/20261020120000_offerings_data_model/migration.sql +0 -146
- package/templates/database/migrations/20261021120000_offerings_checkout_session/migration.sql +0 -77
- package/templates/database/migrations/20261022120000_in_page_magnets/migration.sql +0 -45
- package/templates/database/migrations/20261023120000_offerings_shown_price_ids/migration.sql +0 -47
- package/templates/database/migrations/20261024120000_organization_plan_checkout_session/migration.sql +0 -16
- package/templates/database/migrations/20261025120000_trial_magnet/migration.sql +0 -28
- package/templates/database/migrations/20261026120000_trial_magnet_proof_line/migration.sql +0 -23
- package/templates/database/migrations/migration_lock.toml +0 -3
- package/templates/database/ops/.gitkeep +0 -0
- package/templates/database/ops/schema.prisma +0 -43
- package/templates/database/package.json +0 -89
- package/templates/database/schema.prisma +0 -71
- package/templates/database/scripts/db-generate-locked.sh +0 -80
- package/templates/database/scripts/person-backfill.sql +0 -132
- package/templates/database/tenancy.ts +0 -183
- package/templates/database/tsconfig.build.json +0 -16
- package/templates/database/tsconfig.flows.json +0 -15
- package/templates/database/tsconfig.json +0 -16
- package/templates/database/tsconfig.tenancy.json +0 -14
|
@@ -1,441 +0,0 @@
|
|
|
1
|
-
// config namespace — site-wide settings and customer configuration (ADR-0009).
|
|
2
|
-
//
|
|
3
|
-
// SiteSetting is the site-wide key-value config store. Generator + datasource
|
|
4
|
-
// live in database/schema.prisma (the folder's single config file).
|
|
5
|
-
//
|
|
6
|
-
// The three site-config models (WorkspaceTheme / WorkspaceSiteIdentity /
|
|
7
|
-
// WorkspaceSEO) are workspace-scoped: keyed on a plain `workspaceId String` with
|
|
8
|
-
// NO cross-namespace @relation to auth/Workspace (a stable-ID per ADR-0009
|
|
9
|
-
// invariant #1). Cross-namespace integrity + cascade are the service layer's
|
|
10
|
-
// (ADR-0009 D3), delivered by the Phase 4 workspace-scoped write surface. Every
|
|
11
|
-
// model here is fenced by the architecture.yaml tenant-scope forbidden-pattern.
|
|
12
|
-
//
|
|
13
|
-
// SiteSetting and SiteListingConfig also carry the #6374 tenancy fence. The
|
|
14
|
-
// placement rule stated in database/inbox/schema.prisma's header applies
|
|
15
|
-
// here verbatim: `workspaceId` goes on the line immediately after `siteId`
|
|
16
|
-
// (immediately after `id` where there is no `siteId`), and no comment
|
|
17
|
-
// written for it contains a closing curly, because the drift guard's
|
|
18
|
-
// model-body collector stops at the first one.
|
|
19
|
-
|
|
20
|
-
/// SiteSetting - Key-value settings for the customer site
|
|
21
|
-
/// Use for: feature flags, custom config, cached Platform data
|
|
22
|
-
model SiteSetting {
|
|
23
|
-
id String @id @default(dbgenerated("('siteset_'::text || (uuidv7())::text)")) @db.Text
|
|
24
|
-
// #6374 D3 — the tenancy fence, in the shape this model's ABSENT site_id
|
|
25
|
-
// forces (operator disposition, 2026-09-20). This table is keyed BY the
|
|
26
|
-
// workspace: `key` loses its global @unique and the pair becomes unique
|
|
27
|
-
// instead, so two sellers may each hold a `feature_flags` row. Existing
|
|
28
|
-
// rows backfill to the SENTINEL workspace — a pre-fence row belonged to
|
|
29
|
-
// "the site", which is exactly what the alias `default` resolves to.
|
|
30
|
-
//
|
|
31
|
-
// The `key` TEXT itself does NOT change. `dunning-policy.ts` builds
|
|
32
|
-
// `commerce.dunning_policy:` + siteId from its UNRESOLVED siteId
|
|
33
|
-
// parameter, because this table never had a site_id column to scope by;
|
|
34
|
-
// the backfill leaves every key verbatim, so the read keeps building the
|
|
35
|
-
// key the same way and adds workspaceId from the resolver. Rebuilding the
|
|
36
|
-
// key from the RESOLVED id would match no row and silently hand every
|
|
37
|
-
// seller the built-in default policy.
|
|
38
|
-
//
|
|
39
|
-
// DO NOT MOVE this field — see the fence-fan-out note in
|
|
40
|
-
// database/inbox/schema.prisma's header: placement immediately after id is
|
|
41
|
-
// load-bearing, not cosmetic.
|
|
42
|
-
workspaceId String @map("workspace_id")
|
|
43
|
-
key String // "feature_flags", "cached_config", "custom_theme"
|
|
44
|
-
value Json
|
|
45
|
-
|
|
46
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
47
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
48
|
-
|
|
49
|
-
@@unique([workspaceId, key])
|
|
50
|
-
@@index([workspaceId])
|
|
51
|
-
@@map("site_settings")
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// ============================================================================
|
|
55
|
-
// Workspace site config — workspace-scoped design-system persistence (#3641).
|
|
56
|
-
//
|
|
57
|
-
// Three tables, one per @working-theory/site-config schema. Each row stores the
|
|
58
|
-
// Zod-validated JSON blob for a single workspace. Validation is enforced at the
|
|
59
|
-
// API layer; the DB stores the already-validated blob in a Json column.
|
|
60
|
-
//
|
|
61
|
-
// Design decisions (site-config-reanchor-spec §3):
|
|
62
|
-
// - workspaceId is a plain String stable-ID — NO @relation to auth/Workspace
|
|
63
|
-
// (ADR-0009 invariant #1: no cross-namespace @relation).
|
|
64
|
-
// - One table per schema (not a polymorphic config table) — different update
|
|
65
|
-
// cadences + consumer access patterns.
|
|
66
|
-
// - Json column for the blob — schema evolves without a DB migration on change.
|
|
67
|
-
// - @unique(workspaceId) — one active record per workspace per config type.
|
|
68
|
-
// ============================================================================
|
|
69
|
-
|
|
70
|
-
/// WorkspaceTheme — per-workspace ThemeSchema blob (#3641)
|
|
71
|
-
model WorkspaceTheme {
|
|
72
|
-
id String @id @default(dbgenerated("('theme_'::text || (uuidv7())::text)")) @db.Text
|
|
73
|
-
workspaceId String @unique @map("workspace_id")
|
|
74
|
-
data Json
|
|
75
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
76
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
77
|
-
|
|
78
|
-
@@map("workspace_themes")
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/// WorkspaceSiteIdentity — per-workspace SiteIdentitySchema blob (#3641).
|
|
82
|
-
///
|
|
83
|
-
/// #6254 AC-2 — carries `@@unique([id, workspaceId])`, a named Postgres
|
|
84
|
-
/// unique constraint over a pair already unique today (`id` is the PK, so
|
|
85
|
-
/// the pair is trivially unique too) — redundant now, load-bearing the
|
|
86
|
-
/// moment `workspaceId` ever drops its own `@unique` above (§2.3 of
|
|
87
|
-
/// docs/specs/6254-the-composite-fk-pattern-workspacesiteidentity-spec.md).
|
|
88
|
-
/// It is NOT the target of a Prisma `@relation` from the inbox-namespace
|
|
89
|
-
/// fenced models (Lead, ProjectListing, FlowDefinition, FlowSession):
|
|
90
|
-
/// ADR-0009 invariant #1 forbids a cross-namespace relation (this model is
|
|
91
|
-
/// `config`, they are `inbox`), and `site_id` never holds this model's
|
|
92
|
-
/// `siteid_<uuidv7>` id — it holds the WORKSPACE id, so a real FK would be
|
|
93
|
-
/// unsatisfiable for every existing row. Those four models enforce
|
|
94
|
-
/// site<->workspace agreement instead via a same-table equality CHECK
|
|
95
|
-
/// (`<table>_workspace_site_agree`) — see database/inbox/schema.prisma and
|
|
96
|
-
/// docs/database/namespaces.md.
|
|
97
|
-
model WorkspaceSiteIdentity {
|
|
98
|
-
id String @id @default(dbgenerated("('siteid_'::text || (uuidv7())::text)")) @db.Text
|
|
99
|
-
workspaceId String @unique @map("workspace_id")
|
|
100
|
-
data Json
|
|
101
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
102
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
103
|
-
|
|
104
|
-
@@unique([id, workspaceId])
|
|
105
|
-
@@map("workspace_site_identities")
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/// WorkspaceSEO — per-workspace SEOSchema blob (#3641)
|
|
109
|
-
model WorkspaceSEO {
|
|
110
|
-
id String @id @default(dbgenerated("('seo_'::text || (uuidv7())::text)")) @db.Text
|
|
111
|
-
workspaceId String @unique @map("workspace_id")
|
|
112
|
-
data Json
|
|
113
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
114
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
115
|
-
|
|
116
|
-
@@map("workspace_seos")
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/// WorkspaceMeetings — per-workspace MeetingsSchema blob: the operator's
|
|
120
|
-
/// enabled-slug gate for meeting types (#6183 S9b, D1). Structurally
|
|
121
|
-
/// identical to its three siblings above — same `@unique` key, same
|
|
122
|
-
/// Json-column convention, validation at the API layer. The field-level
|
|
123
|
-
/// `@map`s are load-bearing (not merely style, unlike the siblings' own
|
|
124
|
-
/// comment implies): `prisma validate` accepts a model without them, and
|
|
125
|
-
/// only `pnpm check:prisma-migration-drift` catches the resulting
|
|
126
|
-
/// camelCase/snake_case mismatch against a hand-written migration — the
|
|
127
|
-
/// exact class that shipped a P2022 on every `Appointment.noShow` write
|
|
128
|
-
/// (#6162). Keep every `@map` in lockstep with the migration's column names.
|
|
129
|
-
model WorkspaceMeetings {
|
|
130
|
-
id String @id @default(dbgenerated("('meet_'::text || (uuidv7())::text)")) @db.Text
|
|
131
|
-
workspaceId String @unique @map("workspace_id")
|
|
132
|
-
data Json
|
|
133
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
134
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
135
|
-
|
|
136
|
-
@@map("workspace_meetings")
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/// WorkspacePieceStages — a workspace's declared piece stages, in order
|
|
140
|
-
/// (#7877). One row per workspace, the WorkspaceMeetings shape; no row means
|
|
141
|
-
/// the product default (apps/api, tenant-db.ts DEFAULT_PIECE_STAGES).
|
|
142
|
-
model WorkspacePieceStages {
|
|
143
|
-
id String @id @default(dbgenerated("('pstages_'::text || (uuidv7())::text)")) @db.Text
|
|
144
|
-
workspaceId String @unique @map("workspace_id")
|
|
145
|
-
stages String[]
|
|
146
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
147
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
148
|
-
|
|
149
|
-
@@map("workspace_piece_stages")
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/// SchedulingConnection — a workspace's own scheduling provider account
|
|
153
|
-
/// (#7533 D1): the provider id, its credential and the per-connection webhook
|
|
154
|
-
/// entry point + secret, so each workspace reads and receives bookings through
|
|
155
|
-
/// its own account. One row per workspace, mirroring WorkspaceMeetings above:
|
|
156
|
-
/// a plain `workspaceId @unique` scalar, no relation, no foreign key (ADR 0009
|
|
157
|
-
/// invariant 1). The credential and the webhook secret are AES-256-GCM
|
|
158
|
-
/// ciphertext (`v1.<iv>.<tag>.<ct>`) under SCHEDULING_CREDENTIAL_KEY, bound to
|
|
159
|
-
/// the workspace and the column; only apps/api's
|
|
160
|
-
/// services/scheduling/connections.ts reads or writes them. `webhookToken` is
|
|
161
|
-
/// a 256-bit routing id, not an authenticator. `provider` has no CHECK — the
|
|
162
|
-
/// API accepts only the ids its factory table knows. Keep every `@map` in
|
|
163
|
-
/// lockstep with the migration's column names (see WorkspaceMeetings).
|
|
164
|
-
model SchedulingConnection {
|
|
165
|
-
id String @id @default(dbgenerated("('schconn_'::text || (uuidv7())::text)")) @db.Text
|
|
166
|
-
workspaceId String @unique @map("workspace_id")
|
|
167
|
-
provider String @db.VarChar(32)
|
|
168
|
-
credentialCiphertext String @map("credential_ciphertext") @db.Text
|
|
169
|
-
webhookToken String @unique @map("webhook_token") @db.VarChar(64)
|
|
170
|
-
webhookSecretCiphertext String @map("webhook_secret_ciphertext") @db.Text
|
|
171
|
-
baseUrl String? @map("base_url") @db.Text
|
|
172
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
173
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
174
|
-
|
|
175
|
-
@@map("scheduling_connections")
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/// StripeConnection — an Organization's own Stripe account, by a restricted
|
|
179
|
-
/// key (#8876 D1; contract docs/specs/8879-the-offerings-security-contract-key-spec.md
|
|
180
|
-
/// C1). One row per Organization on the SchedulingConnection shape: a plain
|
|
181
|
-
/// `organizationId @unique` scalar, no relation, no foreign key (ADR 0009
|
|
182
|
-
/// invariant 1). In hub-and-spoke every workspace reads its Organization's
|
|
183
|
-
/// one row; a single-tenant site's sentinel Organization holds its own — no
|
|
184
|
-
/// workspace-scoped key column exists anywhere. The key and the webhook
|
|
185
|
-
/// secret are `v1.<iv>.<tag>.<ct>` ciphertext (contract C2), written only by
|
|
186
|
-
/// apps/api's services/offerings/connection.ts; the migration's envelope
|
|
187
|
-
/// CHECKs refuse a value stored in clear. Every reader sees `mode` and
|
|
188
|
-
/// `keyLast4` only. `webhookToken` is a 256-bit routing id, not an
|
|
189
|
-
/// authenticator. Keep every `@map` in lockstep with the migration's column
|
|
190
|
-
/// names (see WorkspaceMeetings).
|
|
191
|
-
model StripeConnection {
|
|
192
|
-
id String @id @default(dbgenerated("('stripecon_'::text || (uuidv7())::text)")) @db.Text
|
|
193
|
-
organizationId String @unique @map("organization_id")
|
|
194
|
-
mode String @db.VarChar(8)
|
|
195
|
-
keyLast4 String @map("key_last4") @db.VarChar(4)
|
|
196
|
-
credentialCiphertext String @map("credential_ciphertext") @db.Text
|
|
197
|
-
webhookToken String @unique @map("webhook_token") @db.VarChar(64)
|
|
198
|
-
webhookSecretCiphertext String? @map("webhook_secret_ciphertext") @db.Text
|
|
199
|
-
liveAt DateTime? @map("live_at") @db.Timestamptz
|
|
200
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
201
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
202
|
-
|
|
203
|
-
@@map("stripe_connections")
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/// OrganizationOfferings — the Stripe Products an Organization has switched
|
|
207
|
-
/// on for its sites (#8876 D1, C2): the org-enabled set. Its own row, not a
|
|
208
|
-
/// column on the connection, because disconnecting deletes the connection and
|
|
209
|
-
/// keeps this set (contract C8). One row per Organization; no row is the
|
|
210
|
-
/// empty set.
|
|
211
|
-
model OrganizationOfferings {
|
|
212
|
-
id String @id @default(dbgenerated("('orgoffer_'::text || (uuidv7())::text)")) @db.Text
|
|
213
|
-
organizationId String @unique @map("organization_id")
|
|
214
|
-
enabledProductIds String[] @default([]) @map("enabled_product_ids")
|
|
215
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
216
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
217
|
-
|
|
218
|
-
@@map("organization_offerings")
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/// WorkspaceOfferings — what one workspace shows of its Organization's
|
|
222
|
-
/// enabled Products (#8876 D1): the shown set, Recommended per group, and the
|
|
223
|
-
/// last-good Stripe snapshot anonymous readers serve (contract T7). One row
|
|
224
|
-
/// per workspace, the WorkspaceMeetings shape. The two Recommended columns
|
|
225
|
-
/// must name a shown product (a CHECK), and `snapshot` and `snapshotAt` are
|
|
226
|
-
/// set together (a CHECK). `snapshot` is `offeringsSnapshotSchema`-shaped,
|
|
227
|
-
/// validated on read and write, never trusted. `shownPriceIds` (#9070 D1) is
|
|
228
|
-
/// the shown set at Price grain; empty means every Price of each shown
|
|
229
|
-
/// Product, the grain of a row saved before #9070.
|
|
230
|
-
model WorkspaceOfferings {
|
|
231
|
-
id String @id @default(dbgenerated("('wsoffer_'::text || (uuidv7())::text)")) @db.Text
|
|
232
|
-
workspaceId String @unique @map("workspace_id")
|
|
233
|
-
shownProductIds String[] @default([]) @map("shown_product_ids")
|
|
234
|
-
shownPriceIds String[] @default([]) @map("shown_price_ids")
|
|
235
|
-
recommendedPlanProductId String? @map("recommended_plan_product_id")
|
|
236
|
-
recommendedAddonProductId String? @map("recommended_addon_product_id")
|
|
237
|
-
snapshot Json?
|
|
238
|
-
snapshotAt DateTime? @map("snapshot_at") @db.Timestamptz
|
|
239
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
240
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
241
|
-
|
|
242
|
-
@@map("workspace_offerings")
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/// OfferingsCheckoutSession — the Offerings Checkout session record (#8930
|
|
246
|
-
/// D1; contract docs/specs/8879-the-offerings-security-contract-key-spec.md
|
|
247
|
-
/// A11, W5, A13). One row per Checkout Session the hub created, written
|
|
248
|
-
/// before the checkout route answers, so the per-Organization webhook and the
|
|
249
|
-
/// session read act only on a session this hub recorded — never on metadata
|
|
250
|
-
/// alone. Exactly A11's six columns beside the id and createdAt; no
|
|
251
|
-
/// updatedAt, because no path updates a record. Plain scalar keys, no
|
|
252
|
-
/// relation, no foreign key (ADR 0009 invariant 1); the migration's CHECKs
|
|
253
|
-
/// bound every column. Written and read only by apps/api's
|
|
254
|
-
/// services/offerings/checkout-session-record.ts. Keep every `@map` in
|
|
255
|
-
/// lockstep with the migration's column names (see WorkspaceMeetings).
|
|
256
|
-
model OfferingsCheckoutSession {
|
|
257
|
-
id String @id @default(dbgenerated("('ocsess_'::text || (uuidv7())::text)")) @db.Text
|
|
258
|
-
sessionId String @unique @map("session_id") @db.Text
|
|
259
|
-
workspaceId String @map("workspace_id")
|
|
260
|
-
organizationId String @map("organization_id")
|
|
261
|
-
priceId String @map("price_id") @db.VarChar(255)
|
|
262
|
-
lookupKey String @map("lookup_key") @db.VarChar(48)
|
|
263
|
-
mode String @db.VarChar(8)
|
|
264
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
265
|
-
|
|
266
|
-
@@map("offerings_checkout_sessions")
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/// SiteListingConfig — per-SITE project-listings config blob (#5033).
|
|
270
|
-
///
|
|
271
|
-
/// The fourth site-config model, and the one keyed on `siteId` rather than
|
|
272
|
-
/// `workspaceId`. `ProjectListing` is scoped by `siteId`, and its create path
|
|
273
|
-
/// is anonymous (a public application form, no session) — at the moment a
|
|
274
|
-
/// listing is created there is no workspace to resolve, so a tenant-guarded
|
|
275
|
-
/// workspace config would be unreadable from the one place these values are
|
|
276
|
-
/// needed. Otherwise identical to its three siblings above: `@unique` key,
|
|
277
|
-
/// one Zod-validated JSON blob (`siteListingConfigSchema` in
|
|
278
|
-
/// @working-theory/validation), validation at the API layer.
|
|
279
|
-
///
|
|
280
|
-
/// Carries the listing-window bounds and the featured switch — a site's own
|
|
281
|
-
/// commercial terms, which is why they are here and not a constant in the
|
|
282
|
-
/// published package. Never written from a request body; read server-side by
|
|
283
|
-
/// the anonymous create handler.
|
|
284
|
-
model SiteListingConfig {
|
|
285
|
-
id String @id @default(dbgenerated("('sltcfg_'::text || (uuidv7())::text)")) @db.Text
|
|
286
|
-
siteId String @unique @map("site_id")
|
|
287
|
-
// #6374 — the tenancy fence, extended to this model (spec
|
|
288
|
-
// docs/specs/6374-the-fence-schema-wave-spec.md D1). NOT NULL, no
|
|
289
|
-
// Prisma relation directive (ADR-0009 invariant #1), and
|
|
290
|
-
// site_listing_configs_workspace_site_agree CHECK (workspace_id = site_id)
|
|
291
|
-
// — since siteId IS the resolved workspace id, Postgres itself rejects a
|
|
292
|
-
// row whose two columns disagree. Operator-seeded config: there is no
|
|
293
|
-
// create/upsert of this model in the tree, and its one read
|
|
294
|
-
// (apps/api/src/services/listing-config.ts) already resolves the alias.
|
|
295
|
-
// DO NOT MOVE this field — see the fence-fan-out note in
|
|
296
|
-
// database/inbox/schema.prisma's header: placement immediately after
|
|
297
|
-
// siteId is load-bearing, not cosmetic.
|
|
298
|
-
workspaceId String @map("workspace_id")
|
|
299
|
-
|
|
300
|
-
/// The site's PUBLIC site key (#5048 D2) — the addressing token an anonymous
|
|
301
|
-
/// application carries in place of a siteId, so the server resolves the site
|
|
302
|
-
/// rather than trusting a request body. Public by design: it ships in browser
|
|
303
|
-
/// JavaScript and in an agent's request, and grants nothing on its own.
|
|
304
|
-
///
|
|
305
|
-
/// Nullable and @unique: a site that has not minted one is unreachable by key
|
|
306
|
-
/// and falls back to the single-tenant env path (AILK_LISTING_PUBLIC_KEY, see
|
|
307
|
-
/// apps/api/src/services/listing-config.ts), which is how the default
|
|
308
|
-
/// create-ailk scaffold works with no config row at all.
|
|
309
|
-
publicKey String? @unique @map("public_key")
|
|
310
|
-
|
|
311
|
-
data Json
|
|
312
|
-
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
313
|
-
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz
|
|
314
|
-
|
|
315
|
-
@@index([workspaceId])
|
|
316
|
-
@@map("site_listing_configs")
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// ============================================================================
|
|
320
|
-
// Usage-billing pricing/markup/model config (FEAT-047 P1.S2, #3710 — Epic
|
|
321
|
-
// #3704). Per ADR 0009 D2 (roadmap §4), pricing/markup/model config lives in
|
|
322
|
-
// `config`; balances/subscription/plan live in `auth` (see
|
|
323
|
-
// database/auth/schema.prisma). organizationId is a plain String stable-id —
|
|
324
|
-
// no @relation (ADR 0009 invariant 1). LlmModel.tier references ModelTier,
|
|
325
|
-
// defined in database/content/schema.prisma (FEAT-047 P1.S1, #3709, spec
|
|
326
|
-
// OQ-1) — an enum reference through the merged prismaSchemaFolder needs no
|
|
327
|
-
// @relation, so this is not a cross-namespace FK; ModelTier is NOT
|
|
328
|
-
// redefined here. Field roster ported from
|
|
329
|
-
// docs/research/wt-billing-capture/schema.md.
|
|
330
|
-
// ============================================================================
|
|
331
|
-
|
|
332
|
-
/// BillingMode — org- vs individual-billed. Ported from the capture (schema.md
|
|
333
|
-
/// § balance counters) for forward compatibility; no P1.S2 field consumes it
|
|
334
|
-
/// yet (Organization's billing-mode projection is out of this spec's field
|
|
335
|
-
/// roster — spec §2.1 item 1). Captured now so the enum name is stable when a
|
|
336
|
-
/// later phase wires it.
|
|
337
|
-
enum BillingMode {
|
|
338
|
-
INDIVIDUAL
|
|
339
|
-
ORGANIZATION
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
/// SubscriptionPaymentMode — how a Subscription is paid. Self-serve
|
|
343
|
-
/// subscriptions default to CARD; Subscription.paymentMode is nullable
|
|
344
|
-
/// (enterprise-only field, spec §5.3 — no business default invented).
|
|
345
|
-
enum SubscriptionPaymentMode {
|
|
346
|
-
CARD
|
|
347
|
-
INVOICE
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/// BillingCycle — MONTHLY vs YEARLY. Ported from the capture for forward
|
|
351
|
-
/// compatibility; no P1.S2 field consumes it yet (Plan's Stripe price id is
|
|
352
|
-
/// singular in this spec's field roster — a monthly/yearly price-id split is
|
|
353
|
-
/// a future additive column, not invented here).
|
|
354
|
-
enum BillingCycle {
|
|
355
|
-
MONTHLY
|
|
356
|
-
YEARLY
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/// ContractType — how a Subscription's deal was made. Subscription.contractType
|
|
360
|
-
/// is nullable (enterprise-only field — self-serve subscriptions leave it
|
|
361
|
-
/// unset).
|
|
362
|
-
enum ContractType {
|
|
363
|
-
SELF_SERVE
|
|
364
|
-
SALES_ASSISTED
|
|
365
|
-
ENTERPRISE
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
/// AiMarkupConfig — hierarchical per-org markup config: null provider+model =
|
|
369
|
-
/// org default; null model = provider-wide; both set = model-specific
|
|
370
|
-
/// (spec §2.1 item 5).
|
|
371
|
-
model AiMarkupConfig {
|
|
372
|
-
id String @id @default(dbgenerated("('markup_'::text || (uuidv7())::text)")) @db.Text
|
|
373
|
-
organizationId String @map("organization_id")
|
|
374
|
-
provider String?
|
|
375
|
-
model String?
|
|
376
|
-
|
|
377
|
-
markupPercent Decimal @map("markup_percent") @db.Decimal(5, 2)
|
|
378
|
-
|
|
379
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
380
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
381
|
-
|
|
382
|
-
@@unique([organizationId, provider, model])
|
|
383
|
-
@@map("ai_markup_configs")
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
/// LlmModelPricing — per-token provider rates, time-versioned by
|
|
387
|
-
/// effectiveFrom/effectiveTo (spec §2.1 item 6).
|
|
388
|
-
model LlmModelPricing {
|
|
389
|
-
id String @id @default(dbgenerated("('llmprc_'::text || (uuidv7())::text)")) @db.Text
|
|
390
|
-
provider String
|
|
391
|
-
model String
|
|
392
|
-
|
|
393
|
-
inputPricePerMillion Decimal @map("input_price_per_million") @db.Decimal(10, 4)
|
|
394
|
-
outputPricePerMillion Decimal @map("output_price_per_million") @db.Decimal(10, 4)
|
|
395
|
-
cachedInputPricePerMillion Decimal? @map("cached_input_price_per_million") @db.Decimal(10, 4)
|
|
396
|
-
|
|
397
|
-
effectiveFrom DateTime @map("effective_from")
|
|
398
|
-
effectiveTo DateTime? @map("effective_to")
|
|
399
|
-
|
|
400
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
401
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
402
|
-
|
|
403
|
-
@@unique([provider, model, effectiveFrom])
|
|
404
|
-
@@map("llm_model_pricing")
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/// LlmModel — the active model catalog: tier, consumption weighting, context
|
|
408
|
-
/// window (spec §2.1 item 7). provider+model is the natural key (not
|
|
409
|
-
/// time-versioned, unlike LlmModelPricing — this is the current-state
|
|
410
|
-
/// catalog row per model).
|
|
411
|
-
model LlmModel {
|
|
412
|
-
id String @id @default(dbgenerated("('llmmdl_'::text || (uuidv7())::text)")) @db.Text
|
|
413
|
-
provider String
|
|
414
|
-
model String
|
|
415
|
-
|
|
416
|
-
tier ModelTier
|
|
417
|
-
consumptionMultiplier Decimal @default(1.0) @map("consumption_multiplier") @db.Decimal(5, 2)
|
|
418
|
-
chargeExtendedContextAt2x Boolean @map("charge_extended_context_at_2x")
|
|
419
|
-
isAutoModel Boolean @map("is_auto_model")
|
|
420
|
-
defaultContext Int @map("default_context")
|
|
421
|
-
maxContext Int @map("max_context")
|
|
422
|
-
|
|
423
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
424
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
425
|
-
|
|
426
|
-
@@unique([provider, model])
|
|
427
|
-
@@map("llm_models")
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
/// HobbyResetTracker — drives the 90-day Hobby-tier reset (P4, spec §2.1
|
|
431
|
-
/// item 8).
|
|
432
|
-
model HobbyResetTracker {
|
|
433
|
-
id String @id @default(dbgenerated("('hbyrst_'::text || (uuidv7())::text)")) @db.Text
|
|
434
|
-
organizationId String @unique @map("organization_id")
|
|
435
|
-
lastResetAt DateTime @map("last_reset_at")
|
|
436
|
-
nextResetAt DateTime @map("next_reset_at")
|
|
437
|
-
|
|
438
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
439
|
-
|
|
440
|
-
@@map("hobby_reset_trackers")
|
|
441
|
-
}
|
|
File without changes
|