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,641 +0,0 @@
|
|
|
1
|
-
// auth namespace — tenancy models (Organization, Workspace, Membership, Invitation)
|
|
2
|
-
//
|
|
3
|
-
// The multi-tenant module's Organization → Workspace → Membership layer
|
|
4
|
-
// (FEAT-042). Per ADR 0009, the auth namespace's charter is identity + tenancy
|
|
5
|
-
// membership, so these live beside User/Session — @relation to User is allowed
|
|
6
|
-
// here (same namespace).
|
|
7
|
-
//
|
|
8
|
-
// Organization is the tenant boundary (members, billing, security key on
|
|
9
|
-
// organizationId). Workspace is the working context (operational config + all
|
|
10
|
-
// domain content key on workspaceId). Membership is org-level; workspace
|
|
11
|
-
// visibility follows org membership (per-workspace ACL is a future additive
|
|
12
|
-
// concern — do not add a workspace-member table without a new design pass).
|
|
13
|
-
//
|
|
14
|
-
// Organization / Membership / Invitation are managed by the Better Auth
|
|
15
|
-
// organization plugin (apps/workspace auth config maps member → Membership via
|
|
16
|
-
// modelName). Workspace is AILK's own model: the plugin's teams feature was
|
|
17
|
-
// evaluated and rejected because setActiveTeam requires per-team membership
|
|
18
|
-
// rows, contradicting org-level membership (see
|
|
19
|
-
// docs/research/ploy-capture/lessons/better-auth-teams-rejected-for-workspaces.md).
|
|
20
|
-
//
|
|
21
|
-
// Generator + datasource blocks live in database/schema.prisma (the root schema
|
|
22
|
-
// file). This file holds only model definitions for the auth-namespace tenancy
|
|
23
|
-
// tables; the same models are registered in the root schema for generation.
|
|
24
|
-
|
|
25
|
-
/// Role — membership role within an Organization. Hierarchy: owner > admin > member.
|
|
26
|
-
/// Values are lowercase to match the Better Auth organization plugin's role
|
|
27
|
-
/// strings ("owner" | "admin" | "member") so plugin writes pass Prisma enum
|
|
28
|
-
/// validation unmapped. Distinct from User.role (a per-deployment String).
|
|
29
|
-
enum Role {
|
|
30
|
-
owner
|
|
31
|
-
admin
|
|
32
|
-
member
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/// Organization — the tenant boundary. Owns membership, billing, security.
|
|
36
|
-
model Organization {
|
|
37
|
-
id String @id @default(dbgenerated("('org_'::text || (uuidv7())::text)")) @db.Text
|
|
38
|
-
name String
|
|
39
|
-
slug String @unique
|
|
40
|
-
logo String?
|
|
41
|
-
metadata String?
|
|
42
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
43
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
44
|
-
|
|
45
|
-
// Org-level billing identity + tier/subscription projection (org-scoped
|
|
46
|
-
// billing, #3601). Mirrors the User billing shape (see User L134-144) at the
|
|
47
|
-
// Organization level: in a multi-tenant deployment the Organization is the
|
|
48
|
-
// billing entity (individuals are billed as orgs-of-one on their sentinel
|
|
49
|
-
// default Organization). The Stripe webhook is the only writer (see
|
|
50
|
-
// apps/api/src/routes/webhooks/stripe.ts, keyed on checkout
|
|
51
|
-
// metadata.organizationId). Single-tenant deployments keep User-scoped
|
|
52
|
-
// billing (User fields above) and never touch these.
|
|
53
|
-
billingProvider String? @map("billing_provider") // "stripe"; provider-agnostic
|
|
54
|
-
billingCustomerId String? @map("billing_customer_id") // cus_xxx or equivalent
|
|
55
|
-
tier String @default("free") // "free" | "pro" | "pro_plus" | "enterprise"
|
|
56
|
-
hasCarePlan Boolean @default(false) @map("has_care_plan")
|
|
57
|
-
seatCount Int @default(1) @map("seat_count")
|
|
58
|
-
// #9067 D13 — the one plan Checkout this Organization has open, recorded by
|
|
59
|
-
// POST /v1/billing/plan-checkout. The webhook binds billingCustomerId only
|
|
60
|
-
// for this session, into an empty column, and clears it. Server-side only.
|
|
61
|
-
planCheckoutSessionId String? @unique @map("plan_checkout_session_id")
|
|
62
|
-
|
|
63
|
-
// Usage-billing balance counters — the Company-counter live on-demand
|
|
64
|
-
// credit model (FEAT-047 P1.S2, #3710 — capture D6, NOT a CreditUsagePeriod
|
|
65
|
-
// ledger table). Same-namespace additions to the existing billing identity
|
|
66
|
-
// fields above — no new relation. Read/written by the credit waterfall
|
|
67
|
-
// (apps/api/src/services/usage-credits.ts, #3716, the sanctioned
|
|
68
|
-
// tenant-scope exception) and the entitlement resolver (P1.S3).
|
|
69
|
-
usageBillingEnabled Boolean @default(false) @map("usage_billing_enabled")
|
|
70
|
-
stripeUsageMeterItemId String? @map("stripe_usage_meter_item_id")
|
|
71
|
-
includedCreditsCents Int @default(0) @map("included_credits_cents")
|
|
72
|
-
includedCreditsUsedCents Int @default(0) @map("included_credits_used_cents")
|
|
73
|
-
onDemandLimitCents Int? @map("on_demand_limit_cents")
|
|
74
|
-
onDemandUsedCents Int @default(0) @map("on_demand_used_cents")
|
|
75
|
-
onDemandPrechargedCents Int @default(0) @map("on_demand_precharged_cents")
|
|
76
|
-
/// Carry-forward credit balance. DB CHECK `>= 0`
|
|
77
|
-
/// (`organizations_on_demand_credit_balance_non_negative`, migration
|
|
78
|
-
/// 20260714030000) — Prisma cannot model CHECK, so the migration is the
|
|
79
|
-
/// source of truth. Debited only via the credit waterfall's compare-and-swap
|
|
80
|
-
/// (apps/api/src/services/usage-credits.ts, #3730); a negative balance would
|
|
81
|
-
/// INVERT the debit and hand out free credits.
|
|
82
|
-
onDemandCreditBalanceCents Int @default(0) @map("on_demand_credit_balance_cents")
|
|
83
|
-
creditsCycleEnd DateTime? @map("credits_cycle_end")
|
|
84
|
-
limitAllocationMode String @default("COMPANY_WIDE") @map("limit_allocation_mode") // "COMPANY_WIDE" | "INDIVIDUAL"
|
|
85
|
-
|
|
86
|
-
memberships Membership[]
|
|
87
|
-
invitations Invitation[]
|
|
88
|
-
workspaces Workspace[]
|
|
89
|
-
// #3591 — the agents (delegates) of this organization's members.
|
|
90
|
-
agents Agent[]
|
|
91
|
-
|
|
92
|
-
@@unique([billingProvider, billingCustomerId])
|
|
93
|
-
@@map("organizations")
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/// Workspace — working context under an Organization. URL scope for all
|
|
97
|
-
/// domain content; operational config keys on workspaceId. Flat (org →
|
|
98
|
-
/// workspaces): no nesting — a future positioning-entity tree is a separate
|
|
99
|
-
/// feature and must not require tenancy rework.
|
|
100
|
-
model Workspace {
|
|
101
|
-
id String @id @default(dbgenerated("('wksp_'::text || (uuidv7())::text)")) @db.Text
|
|
102
|
-
organizationId String @map("organization_id")
|
|
103
|
-
name String
|
|
104
|
-
slug String
|
|
105
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
106
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
107
|
-
|
|
108
|
-
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
109
|
-
// #7532 — the hub's spoke registry rows bound to this workspace.
|
|
110
|
-
spokes Spoke[]
|
|
111
|
-
// #3591 — the agents bound to this workspace.
|
|
112
|
-
agents Agent[]
|
|
113
|
-
// #7803 — the people who last activated this workspace (User.lastWorkspaceId).
|
|
114
|
-
// Read and written only by apps/api/src/services/tenant-context.ts.
|
|
115
|
-
lastActiveUsers User[] @relation("UserLastWorkspace")
|
|
116
|
-
|
|
117
|
-
@@unique([organizationId, slug])
|
|
118
|
-
@@index([organizationId])
|
|
119
|
-
@@map("workspaces")
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/// Spoke — one separately deployed site (a spoke) that calls this hub API
|
|
123
|
-
/// server-to-server, bound to exactly ONE workspace (#7532, spec
|
|
124
|
-
/// docs/specs/7532-a-spoke-s-public-reads-spec.md D1).
|
|
125
|
-
///
|
|
126
|
-
/// The spoke authenticates with a hub-minted key sent in `x-ailk-spoke-key`.
|
|
127
|
-
/// Only the key's SHA-256 digest is stored (`credentialHash`) plus a short
|
|
128
|
-
/// recognisable `credentialPrefix`; the key itself never is. Several rows may
|
|
129
|
-
/// bind one workspace, so a key rotates by registering a second spoke and
|
|
130
|
-
/// revoking the first. `revokedAt` set refuses the key on the next request.
|
|
131
|
-
///
|
|
132
|
-
/// Room to extend (operator amendment; built by neither this unit): REL-002's
|
|
133
|
-
/// sign-in client and #7533's SchedulingConnection each add ONE nullable,
|
|
134
|
-
/// unique column in their own migration, so a spoke stays one record.
|
|
135
|
-
model Spoke {
|
|
136
|
-
id String @id @default(dbgenerated("('spoke_'::text || (uuidv7())::text)")) @db.Text
|
|
137
|
-
workspaceId String @map("workspace_id")
|
|
138
|
-
name String @db.VarChar(120)
|
|
139
|
-
credentialHash String @unique @map("credential_hash") @db.Char(64)
|
|
140
|
-
credentialPrefix String @map("credential_prefix") @db.VarChar(24)
|
|
141
|
-
revokedAt DateTime? @map("revoked_at")
|
|
142
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
143
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
144
|
-
|
|
145
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
146
|
-
|
|
147
|
-
@@index([workspaceId])
|
|
148
|
-
@@map("spokes")
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/// AgentPermissionLevel — an agent's ceiling (#3591, spec
|
|
152
|
-
/// docs/specs/3591-tenant-scoped-agent-auth-secure-spec.md D1, D5). The agent
|
|
153
|
-
/// acts with the LOWER of its person's `Role` and this. One value in v1;
|
|
154
|
-
/// raising the ceiling later is a new value here and in
|
|
155
|
-
/// `@working-theory/validation`'s `AGENT_PERMISSION_LEVELS`.
|
|
156
|
-
enum AgentPermissionLevel {
|
|
157
|
-
member
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/// Agent — a stored delegate of ONE person, bound to ONE workspace (#3591,
|
|
161
|
-
/// spec docs/specs/3591-tenant-scoped-agent-auth-secure-spec.md D1, D2).
|
|
162
|
-
///
|
|
163
|
-
/// The agent signs in with a key (`ailk_agt_…`, shown once) and passes the
|
|
164
|
-
/// same tenant guard a browser session does, through its person's live
|
|
165
|
-
/// `Membership` (`responsibleMembershipId`). Removing that membership deletes
|
|
166
|
-
/// the agent (the FK below), so a re-invite cannot revive it.
|
|
167
|
-
///
|
|
168
|
-
/// Only the key's SHA-256 digest is stored (`credentialHash`) plus a short
|
|
169
|
-
/// recognisable `credentialPrefix`; the key itself never is.
|
|
170
|
-
/// `keyIssuedToMembershipId` is the owner or admin who created or last
|
|
171
|
-
/// re-keyed the agent — the only person who has seen its key. Removing that
|
|
172
|
-
/// membership sets the column null and the guard refuses the agent until it
|
|
173
|
-
/// is re-keyed. `createdByUserId` is a plain column with no relation, so
|
|
174
|
-
/// deleting the creator does not delete the agents they made for others.
|
|
175
|
-
/// `apps/api/src/lib/agent-store.ts` is the only file that names
|
|
176
|
-
/// `prisma.agent`.
|
|
177
|
-
///
|
|
178
|
-
/// `grants` (#7864, spec docs/specs/7864-agent-key-grants-spec.md D2, D3)
|
|
179
|
-
/// lists the permissions an owner or admin granted this agent one by one —
|
|
180
|
-
/// only the seven `@working-theory/validation` names in
|
|
181
|
-
/// `AGENT_GRANTABLE_PERMISSIONS` (content-edit, content-publish, assets-write,
|
|
182
|
-
/// magnets-manage, meeting-types-manage, people-read since #852,
|
|
183
|
-
/// member-pieces-manage since #7878), held to that set by the
|
|
184
|
-
/// `agents_grants_allowed` CHECK. A grant never raises the ceiling above. The
|
|
185
|
-
/// agent holds a stored grant only while its person's own role holds it too:
|
|
186
|
-
/// the tenant guards clamp it on every request, so a demoted person's agent
|
|
187
|
-
/// keeps the row but loses the permission.
|
|
188
|
-
model Agent {
|
|
189
|
-
id String @id @default(dbgenerated("('agent_'::text || (uuidv7())::text)")) @db.Text
|
|
190
|
-
organizationId String @map("organization_id")
|
|
191
|
-
workspaceId String @map("workspace_id")
|
|
192
|
-
responsibleMembershipId String @map("responsible_membership_id")
|
|
193
|
-
name String @db.VarChar(80)
|
|
194
|
-
permissionLevel AgentPermissionLevel @default(member) @map("permission_level")
|
|
195
|
-
grants String[] @default([]) @map("grants")
|
|
196
|
-
enabled Boolean @default(true)
|
|
197
|
-
credentialHash String @unique @map("credential_hash") @db.Char(64)
|
|
198
|
-
credentialPrefix String @map("credential_prefix") @db.VarChar(24)
|
|
199
|
-
lastActiveAt DateTime? @map("last_active_at")
|
|
200
|
-
createdByUserId String @map("created_by_user_id")
|
|
201
|
-
keyIssuedToMembershipId String? @map("key_issued_to_membership_id")
|
|
202
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
203
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
204
|
-
|
|
205
|
-
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
206
|
-
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
207
|
-
responsible Membership @relation("AgentResponsible", fields: [responsibleMembershipId], references: [id], onDelete: Cascade)
|
|
208
|
-
keyIssuedTo Membership? @relation("AgentKeyIssuedTo", fields: [keyIssuedToMembershipId], references: [id], onDelete: SetNull)
|
|
209
|
-
|
|
210
|
-
@@index([organizationId])
|
|
211
|
-
@@index([workspaceId])
|
|
212
|
-
@@index([responsibleMembershipId])
|
|
213
|
-
@@map("agents")
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/// Membership — User ↔ Organization with a Role. Managed by the Better Auth
|
|
217
|
-
/// organization plugin (modelName "membership"). Org-level: grants visibility
|
|
218
|
-
/// into every workspace of the organization.
|
|
219
|
-
model Membership {
|
|
220
|
-
id String @id @default(dbgenerated("('member_'::text || (uuidv7())::text)")) @db.Text
|
|
221
|
-
organizationId String @map("organization_id")
|
|
222
|
-
userId String @map("user_id")
|
|
223
|
-
role Role @default(member)
|
|
224
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
225
|
-
|
|
226
|
-
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
227
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
228
|
-
// #3591 — the agents this person is responsible for, and the agents whose
|
|
229
|
-
// current key this person was the one shown.
|
|
230
|
-
agents Agent[] @relation("AgentResponsible")
|
|
231
|
-
agentKeysIssued Agent[] @relation("AgentKeyIssuedTo")
|
|
232
|
-
|
|
233
|
-
@@unique([organizationId, userId])
|
|
234
|
-
@@index([userId])
|
|
235
|
-
@@index([organizationId])
|
|
236
|
-
@@map("memberships")
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/// Invitation — pending invite of an email address into an Organization.
|
|
240
|
-
/// Managed by the Better Auth organization plugin. status:
|
|
241
|
-
/// "pending" | "accepted" | "rejected" | "canceled".
|
|
242
|
-
model Invitation {
|
|
243
|
-
id String @id @default(dbgenerated("('invite_'::text || (uuidv7())::text)")) @db.Text
|
|
244
|
-
organizationId String @map("organization_id")
|
|
245
|
-
email String
|
|
246
|
-
role Role @default(member)
|
|
247
|
-
status String @default("pending")
|
|
248
|
-
expiresAt DateTime? @map("expires_at")
|
|
249
|
-
inviterId String @map("inviter_id")
|
|
250
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
251
|
-
|
|
252
|
-
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
253
|
-
inviter User @relation("sent_invitations", fields: [inviterId], references: [id], onDelete: Cascade)
|
|
254
|
-
|
|
255
|
-
@@index([organizationId])
|
|
256
|
-
@@index([email])
|
|
257
|
-
@@map("invitations")
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// ============================================================================
|
|
261
|
-
// Usage-billing balances/subscription/plan (FEAT-047 P1.S2, #3710 — Epic
|
|
262
|
-
// #3704). Per ADR 0009 D2 (roadmap §4), billing balances/subscription/plan
|
|
263
|
-
// live in `auth` (identity+tenancy charter); pricing/markup/model config
|
|
264
|
-
// lives in `config` (see database/config/schema.prisma). organizationId is a
|
|
265
|
-
// plain String stable-id — no @relation to Organization, even though both
|
|
266
|
-
// live in this namespace (spec D4: cross-namespace assembly + billing writes
|
|
267
|
-
// are keyed on explicit id, not relation traversal — mirrors the sanctioned
|
|
268
|
-
// usage-credits.ts / entitlements.ts / webhooks/stripe.ts read/write shape).
|
|
269
|
-
// Field roster ported from docs/research/wt-billing-capture/schema.md.
|
|
270
|
-
// ============================================================================
|
|
271
|
-
|
|
272
|
-
/// Subscription — one per Organization; the plan link + Stripe subscription
|
|
273
|
-
/// identity + enterprise contract terms. contractType/paymentMode are
|
|
274
|
-
/// nullable — "enterprise contract fields" only apply to sales-assisted /
|
|
275
|
-
/// enterprise deals; a self-serve subscription leaves them unset (no
|
|
276
|
-
/// business default invented — see spec §5.3).
|
|
277
|
-
model Subscription {
|
|
278
|
-
id String @id @default(dbgenerated("('orgsub_'::text || (uuidv7())::text)")) @db.Text
|
|
279
|
-
organizationId String @unique @map("organization_id")
|
|
280
|
-
planId String @map("plan_id")
|
|
281
|
-
|
|
282
|
-
stripeSubscriptionId String? @map("stripe_subscription_id")
|
|
283
|
-
stripePriceId String? @map("stripe_price_id")
|
|
284
|
-
stripeCustomerId String? @map("stripe_customer_id")
|
|
285
|
-
|
|
286
|
-
contractType ContractType? @map("contract_type")
|
|
287
|
-
netTermsDays Int? @map("net_terms_days")
|
|
288
|
-
contractValueCents Int? @map("contract_value_cents")
|
|
289
|
-
paymentMode SubscriptionPaymentMode? @map("payment_mode")
|
|
290
|
-
|
|
291
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
292
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
293
|
-
|
|
294
|
-
@@map("subscriptions")
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
/// Plan — the plan catalog (allowances, limits, Stripe price). Global
|
|
298
|
-
/// (not org-scoped) — the definitions a Subscription.planId references by
|
|
299
|
-
/// stable id, no @relation (spec D4).
|
|
300
|
-
model Plan {
|
|
301
|
-
id String @id @default(dbgenerated("('plan_'::text || (uuidv7())::text)")) @db.Text
|
|
302
|
-
slug String @unique
|
|
303
|
-
tier Int
|
|
304
|
-
|
|
305
|
-
baseTokens Int @map("base_tokens")
|
|
306
|
-
// Decimal, never Float: usageMultiplier scales a money amount. DOUBLE
|
|
307
|
-
// PRECISION admits NaN/Infinity, and NaN compares false against every
|
|
308
|
-
// spend-limit comparison — a float here fails OPEN past the limit gate.
|
|
309
|
-
// Matches the sibling money-multiplier convention (LlmModel.
|
|
310
|
-
// consumptionMultiplier, database/config/schema.prisma).
|
|
311
|
-
usageMultiplier Decimal @map("usage_multiplier") @db.Decimal(5, 2)
|
|
312
|
-
isPooled Boolean @map("is_pooled")
|
|
313
|
-
monthlyDollarCreditCents Int @map("monthly_dollar_credit_cents")
|
|
314
|
-
|
|
315
|
-
features Json
|
|
316
|
-
limits Json
|
|
317
|
-
|
|
318
|
-
stripePriceId String? @map("stripe_price_id")
|
|
319
|
-
|
|
320
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
321
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
322
|
-
|
|
323
|
-
@@map("plans")
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/// UsageSettings — one per Organization; the usage-based-billing opt-in +
|
|
327
|
-
/// monthly spend-limit gate (read by the spend-limit check, P2).
|
|
328
|
-
model UsageSettings {
|
|
329
|
-
id String @id @default(dbgenerated("('usgset_'::text || (uuidv7())::text)")) @db.Text
|
|
330
|
-
organizationId String @unique @map("organization_id")
|
|
331
|
-
|
|
332
|
-
usageBasedBillingEnabled Boolean @default(false) @map("usage_based_billing_enabled")
|
|
333
|
-
monthlySpendLimitCents Int? @map("monthly_spend_limit_cents")
|
|
334
|
-
|
|
335
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
336
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
337
|
-
|
|
338
|
-
@@map("usage_settings")
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
// === Relocated from root schema.prisma (ADR-0009 D4 Phase 2, #3607) ===
|
|
343
|
-
|
|
344
|
-
/// User - Dashboard users (site owners, admins, end-users)
|
|
345
|
-
///
|
|
346
|
-
/// emailVerified is a Boolean per Better Auth's contract (NextAuth previously
|
|
347
|
-
/// stored the verification timestamp as DateTime?). The five custom relations
|
|
348
|
-
/// — ApiToken, RefreshToken, OAuthAuthorization, PushToken, UserData — keep
|
|
349
|
-
/// their onDelete: Cascade semantics so user removal cleanly tears down all
|
|
350
|
-
/// dependent rows.
|
|
351
|
-
model User {
|
|
352
|
-
id String @id @default(dbgenerated("('user_'::text || (uuidv7())::text)")) @db.Text
|
|
353
|
-
email String @unique
|
|
354
|
-
name String?
|
|
355
|
-
image String?
|
|
356
|
-
emailVerified Boolean @default(false) @map("email_verified")
|
|
357
|
-
|
|
358
|
-
// Profile extensions
|
|
359
|
-
role String @default("user") // "user", "admin", "owner"
|
|
360
|
-
|
|
361
|
-
// Billing identity — provider-agnostic so Stripe is v1 value, not baked-in name.
|
|
362
|
-
// Webhook is the only writer (see apps/api/src/routes/webhooks/stripe.ts).
|
|
363
|
-
// #771 self-serve dashboard reads billingCustomerId for Stripe customer-portal URL.
|
|
364
|
-
billingProvider String? @map("billing_provider") // "stripe"; future: "lemonsqueezy", "paddle"
|
|
365
|
-
billingCustomerId String? @map("billing_customer_id") // cus_xxx (Stripe) or equivalent
|
|
366
|
-
|
|
367
|
-
// Subscription tier projection — derived from the Stripe webhook's product-aware
|
|
368
|
-
// routing (#898). Defaults to "free" until a customer.subscription.created event
|
|
369
|
-
// fires; flips to "pro" / "pro_plus" / etc. based on the line item's product.
|
|
370
|
-
// hasCarePlan is true only for pro_plus today; seatCount mirrors the line item
|
|
371
|
-
// quantity from Stripe's adjustable-quantity widget (1–50).
|
|
372
|
-
tier String @default("free") // "free" | "pro" | "pro_plus" | "enterprise" (retired "agency"/"commercial" rows migrated to "enterprise" — #3516)
|
|
373
|
-
hasCarePlan Boolean @default(false) @map("has_care_plan")
|
|
374
|
-
seatCount Int @default(1) @map("seat_count")
|
|
375
|
-
|
|
376
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
377
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
378
|
-
|
|
379
|
-
// Better Auth relations
|
|
380
|
-
sessions Session[]
|
|
381
|
-
accounts Account[]
|
|
382
|
-
|
|
383
|
-
// API & OAuth
|
|
384
|
-
apiTokens ApiToken[]
|
|
385
|
-
refreshTokens RefreshToken[]
|
|
386
|
-
oauthAuthorizations OAuthAuthorization[]
|
|
387
|
-
pushTokens PushToken[]
|
|
388
|
-
|
|
389
|
-
// Extensions
|
|
390
|
-
userData UserData[]
|
|
391
|
-
|
|
392
|
-
// Tenancy (multi-tenant module — database/auth/schema.prisma)
|
|
393
|
-
memberships Membership[]
|
|
394
|
-
sentInvitations Invitation[] @relation("sent_invitations")
|
|
395
|
-
|
|
396
|
-
// #7803 — the workspace this person last activated, so a new sign-in lands
|
|
397
|
-
// there. Written only by activateWorkspace after its membership grant; read
|
|
398
|
-
// only by listTenancy, which reports it only when the workspace is in the
|
|
399
|
-
// caller's own listing (apps/api/src/services/tenant-context.ts). Deleting
|
|
400
|
-
// the workspace clears it. Never a Better Auth field, so no client can set it.
|
|
401
|
-
lastWorkspaceId String? @map("last_workspace_id")
|
|
402
|
-
lastWorkspace Workspace? @relation("UserLastWorkspace", fields: [lastWorkspaceId], references: [id], onDelete: SetNull)
|
|
403
|
-
|
|
404
|
-
@@unique([billingProvider, billingCustomerId])
|
|
405
|
-
@@index([lastWorkspaceId])
|
|
406
|
-
@@map("users")
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
/// Session - Active user sessions (Better Auth schema)
|
|
410
|
-
///
|
|
411
|
-
/// Session.token is the opaque cookie value the dual-mode preHandler reads.
|
|
412
|
-
/// Deleting a row revokes the session; deleting the parent User cascades.
|
|
413
|
-
model Session {
|
|
414
|
-
id String @id @default(dbgenerated("('sess_'::text || (uuidv7())::text)")) @db.Text
|
|
415
|
-
expiresAt DateTime @map("expires_at")
|
|
416
|
-
token String @unique
|
|
417
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
418
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
419
|
-
ipAddress String? @map("ip_address")
|
|
420
|
-
userAgent String? @map("user_agent")
|
|
421
|
-
userId String @map("user_id")
|
|
422
|
-
|
|
423
|
-
// Active tenant context (multi-tenant module). activeOrganizationId is the
|
|
424
|
-
// Better Auth organization plugin's session field; activeWorkspaceId is
|
|
425
|
-
// AILK's thin session extension (session.additionalFields in the
|
|
426
|
-
// apps/workspace auth config). Null in single-tenant deployments.
|
|
427
|
-
activeOrganizationId String? @map("active_organization_id")
|
|
428
|
-
activeWorkspaceId String? @map("active_workspace_id")
|
|
429
|
-
|
|
430
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
431
|
-
|
|
432
|
-
@@index([userId])
|
|
433
|
-
@@index([token])
|
|
434
|
-
@@map("sessions")
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
/// Account - OAuth provider connections (Google, GitHub, etc.)
|
|
438
|
-
///
|
|
439
|
-
/// Better Auth's account shape: one row per (providerId, accountId) pair.
|
|
440
|
-
/// Cascade on User removal keeps OAuth links from orphaning.
|
|
441
|
-
model Account {
|
|
442
|
-
id String @id @default(dbgenerated("('acct_'::text || (uuidv7())::text)")) @db.Text
|
|
443
|
-
accountId String @map("account_id")
|
|
444
|
-
providerId String @map("provider_id")
|
|
445
|
-
userId String @map("user_id")
|
|
446
|
-
accessToken String? @map("access_token") @db.Text
|
|
447
|
-
refreshToken String? @map("refresh_token") @db.Text
|
|
448
|
-
idToken String? @map("id_token") @db.Text
|
|
449
|
-
accessTokenExpiresAt DateTime? @map("access_token_expires_at")
|
|
450
|
-
refreshTokenExpiresAt DateTime? @map("refresh_token_expires_at")
|
|
451
|
-
scope String?
|
|
452
|
-
password String?
|
|
453
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
454
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
455
|
-
|
|
456
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
457
|
-
|
|
458
|
-
@@unique([providerId, accountId])
|
|
459
|
-
@@index([userId])
|
|
460
|
-
@@map("accounts")
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
/// Verification - Email / magic-link verification tokens (Better Auth schema)
|
|
464
|
-
model Verification {
|
|
465
|
-
id String @id @default(dbgenerated("('verify_'::text || (uuidv7())::text)")) @db.Text
|
|
466
|
-
identifier String
|
|
467
|
-
value String
|
|
468
|
-
expiresAt DateTime @map("expires_at")
|
|
469
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
470
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
471
|
-
|
|
472
|
-
@@index([identifier])
|
|
473
|
-
@@map("verifications")
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
/// ApiToken - Bearer tokens for non-web clients (mobile apps, API integrations)
|
|
477
|
-
model ApiToken {
|
|
478
|
-
id String @id @default(dbgenerated("('apitok_'::text || (uuidv7())::text)")) @db.Text
|
|
479
|
-
userId String @map("user_id")
|
|
480
|
-
|
|
481
|
-
// Token identification
|
|
482
|
-
name String // "iPhone", "Android App", "API Integration"
|
|
483
|
-
token String @unique // Hashed token
|
|
484
|
-
tokenPrefix String @map("token_prefix") // First 8 chars for identification
|
|
485
|
-
|
|
486
|
-
// Client info
|
|
487
|
-
clientType String @default("api") @map("client_type") // "mobile", "api", "cli"
|
|
488
|
-
deviceInfo String? @map("device_info") // "iPhone 15 Pro", "Android 14"
|
|
489
|
-
|
|
490
|
-
// Permissions
|
|
491
|
-
scopes String[] @default([]) // ["read:profile", "write:data"]
|
|
492
|
-
|
|
493
|
-
// Lifecycle
|
|
494
|
-
expiresAt DateTime? @map("expires_at")
|
|
495
|
-
lastUsedAt DateTime? @map("last_used_at")
|
|
496
|
-
lastUsedIp String? @map("last_used_ip")
|
|
497
|
-
revokedAt DateTime? @map("revoked_at")
|
|
498
|
-
|
|
499
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
500
|
-
|
|
501
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
502
|
-
refreshTokens RefreshToken[]
|
|
503
|
-
|
|
504
|
-
@@index([userId])
|
|
505
|
-
@@index([token])
|
|
506
|
-
@@index([tokenPrefix])
|
|
507
|
-
@@map("api_tokens")
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
/// RefreshToken - Long-lived tokens for mobile session refresh
|
|
511
|
-
model RefreshToken {
|
|
512
|
-
id String @id @default(dbgenerated("('reftok_'::text || (uuidv7())::text)")) @db.Text
|
|
513
|
-
userId String @map("user_id")
|
|
514
|
-
apiTokenId String @map("api_token_id")
|
|
515
|
-
|
|
516
|
-
token String @unique // Hashed
|
|
517
|
-
|
|
518
|
-
// Lifecycle
|
|
519
|
-
expiresAt DateTime @map("expires_at")
|
|
520
|
-
usedAt DateTime? @map("used_at") // Last time used to get new access token
|
|
521
|
-
revokedAt DateTime? @map("revoked_at")
|
|
522
|
-
|
|
523
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
524
|
-
|
|
525
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
526
|
-
apiToken ApiToken @relation(fields: [apiTokenId], references: [id], onDelete: Cascade)
|
|
527
|
-
|
|
528
|
-
@@index([userId])
|
|
529
|
-
@@index([apiTokenId])
|
|
530
|
-
@@index([token])
|
|
531
|
-
@@map("refresh_tokens")
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
/// OAuthClient - Registered OAuth applications (ChatGPT, Slack, etc.)
|
|
535
|
-
model OAuthClient {
|
|
536
|
-
id String @id @default(dbgenerated("('oauthc_'::text || (uuidv7())::text)")) @db.Text
|
|
537
|
-
|
|
538
|
-
// Client identification
|
|
539
|
-
name String // "ChatGPT Plugin", "Slack Bot"
|
|
540
|
-
description String?
|
|
541
|
-
logoUrl String? @map("logo_url")
|
|
542
|
-
|
|
543
|
-
// OAuth credentials
|
|
544
|
-
clientId String @unique @map("client_id") // Public identifier
|
|
545
|
-
clientSecret String @map("client_secret") // Hashed secret
|
|
546
|
-
|
|
547
|
-
// OAuth config
|
|
548
|
-
redirectUris String[] @map("redirect_uris") // Allowed callback URLs
|
|
549
|
-
scopes String[] @default([]) // Allowed scopes
|
|
550
|
-
|
|
551
|
-
// Settings
|
|
552
|
-
enabled Boolean @default(true)
|
|
553
|
-
trusted Boolean @default(false) // Skip consent screen
|
|
554
|
-
|
|
555
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
556
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
557
|
-
|
|
558
|
-
authorizations OAuthAuthorization[]
|
|
559
|
-
|
|
560
|
-
@@map("oauth_clients")
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
/// OAuthAuthorization - User grants to OAuth clients
|
|
564
|
-
model OAuthAuthorization {
|
|
565
|
-
id String @id @default(dbgenerated("('oautha_'::text || (uuidv7())::text)")) @db.Text
|
|
566
|
-
userId String @map("user_id")
|
|
567
|
-
clientId String @map("client_id")
|
|
568
|
-
|
|
569
|
-
// Granted scopes (may be subset of client's allowed scopes)
|
|
570
|
-
scopes String[]
|
|
571
|
-
|
|
572
|
-
// Tokens
|
|
573
|
-
accessToken String @unique @map("access_token") // Hashed
|
|
574
|
-
refreshToken String? @unique @map("refresh_token") // Hashed
|
|
575
|
-
|
|
576
|
-
// Lifecycle
|
|
577
|
-
expiresAt DateTime @map("expires_at")
|
|
578
|
-
revokedAt DateTime? @map("revoked_at")
|
|
579
|
-
|
|
580
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
581
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
582
|
-
|
|
583
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
584
|
-
client OAuthClient @relation(fields: [clientId], references: [id], onDelete: Cascade)
|
|
585
|
-
|
|
586
|
-
@@unique([userId, clientId])
|
|
587
|
-
@@index([userId])
|
|
588
|
-
@@index([clientId])
|
|
589
|
-
@@index([accessToken])
|
|
590
|
-
@@map("oauth_authorizations")
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
/// PushToken - Device tokens for push notifications
|
|
594
|
-
model PushToken {
|
|
595
|
-
id String @id @default(dbgenerated("('pushtok_'::text || (uuidv7())::text)")) @db.Text
|
|
596
|
-
userId String @map("user_id")
|
|
597
|
-
|
|
598
|
-
// Token details
|
|
599
|
-
token String @unique // FCM or APNs token
|
|
600
|
-
platform String // "ios", "android", "web"
|
|
601
|
-
|
|
602
|
-
// Device info
|
|
603
|
-
deviceId String? @map("device_id") // Unique device identifier
|
|
604
|
-
deviceName String? @map("device_name") // "iPhone 15 Pro"
|
|
605
|
-
appVersion String? @map("app_version") // "1.2.3"
|
|
606
|
-
|
|
607
|
-
// Status
|
|
608
|
-
enabled Boolean @default(true)
|
|
609
|
-
failedAt DateTime? @map("failed_at") // Last delivery failure
|
|
610
|
-
failCount Int @default(0) @map("fail_count")
|
|
611
|
-
|
|
612
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
613
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
614
|
-
|
|
615
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
616
|
-
|
|
617
|
-
@@index([userId])
|
|
618
|
-
@@index([platform])
|
|
619
|
-
@@map("push_tokens")
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
/// UserData - Flexible key-value storage for customer extensions
|
|
623
|
-
/// Use this for: preferences, saved items, custom fields, feature flags
|
|
624
|
-
model UserData {
|
|
625
|
-
id String @id @default(dbgenerated("('userd_'::text || (uuidv7())::text)")) @db.Text
|
|
626
|
-
userId String @map("user_id")
|
|
627
|
-
|
|
628
|
-
// Key-value storage
|
|
629
|
-
key String // "preferences", "saved_products", "notification_settings"
|
|
630
|
-
value Json // Flexible JSON storage
|
|
631
|
-
|
|
632
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
633
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
634
|
-
|
|
635
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
636
|
-
|
|
637
|
-
@@unique([userId, key])
|
|
638
|
-
@@index([userId])
|
|
639
|
-
@@index([key])
|
|
640
|
-
@@map("user_data")
|
|
641
|
-
}
|
|
File without changes
|