create-ailk 0.23.0 → 0.25.1
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 +68 -33
- package/component-catalog.json +3 -3
- package/component-catalog.md +3 -3
- package/dist/add-module.js +10 -3
- package/dist/add-route.d.ts +12 -1
- package/dist/add-route.js +38 -4
- package/dist/cli.js +12 -7
- package/dist/derive-architecture.d.ts +3 -4
- package/dist/derive-architecture.js +75 -22
- 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 +1 -1
- package/dist/lib/fetch-template-snapshot.js +7 -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 +34 -12
- package/dist/lib/scaffold-render-sweep.d.ts +33 -0
- package/dist/lib/scaffold-render-sweep.js +45 -0
- package/dist/module-architecture.d.ts +20 -3
- package/dist/module-architecture.js +122 -538
- package/dist/paid-sections.d.ts +25 -1
- package/dist/paid-sections.js +88 -3
- package/dist/surfaces.js +10 -2
- package/dist/sync-routes.d.ts +30 -4
- package/dist/sync-routes.js +271 -18
- package/dist/template-record.d.ts +14 -4
- package/dist/template-record.js +23 -5
- package/dist/topology.d.ts +16 -3
- package/dist/topology.js +31 -19
- package/dist/update.d.ts +10 -1
- package/dist/update.js +540 -16
- package/package.json +3 -3
- package/release-scope.json +1 -1
- 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 +9 -5
- package/templates/.github/workflows/ci.yml +7 -4
- package/templates/CLAUDE.md +15 -3
- package/templates/CONVENTIONS.md +8 -10
- package/templates/README.md +14 -13
- package/templates/apps/api/.env.example +9 -2
- package/templates/apps/api/CLAUDE.md +122 -82
- 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.ts +7 -4
- 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 -1857
- package/templates/apps/api/vercel.json +2 -2
- package/templates/apps/mcp/CLAUDE.md +77 -24
- 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 -12
- 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 +21 -5
- package/templates/apps/web/app/.well-known/mcp.json/route.ts +9 -3
- package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +14 -4
- package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +1 -1
- package/templates/apps/web/app/[locale]/contact/intake-script.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 +28 -7
- 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 +2 -2
- package/templates/apps/web/jest.config.cjs +1 -0
- package/templates/apps/web/lib/__tests__/magnet-routes.test.ts +7 -0
- package/templates/apps/web/lib/auth-email.ts +1 -1
- package/templates/apps/web/lib/magnet-routes.ts +3 -1
- package/templates/apps/web/lib/newsletter.actions.ts +9 -6
- 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/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 +32 -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 +757 -7
- package/templates/tsconfig.json +1 -2
- package/versions.json +48 -35
- 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 -292
- 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 -254
- 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 -318
- 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 -264
- 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 -1815
- 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 -325
- 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 -1300
- 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 -268
- package/templates/apps/api/src/routes/content/index.ts +0 -49
- package/templates/apps/api/src/routes/content/list-pages.ts +0 -95
- 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 -129
- package/templates/apps/api/src/routes/content/shown-offerings.ts +0 -229
- package/templates/apps/api/src/routes/content/slug.ts +0 -9
- 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 -573
- 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 -480
- package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +0 -465
- 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 -448
- 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 -808
- 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 -2026
- package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +0 -528
- 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 -867
- 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 -1176
- package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +0 -444
- package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +0 -154
- 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 -313
- 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 -755
- 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 -295
- 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 -868
- 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 -396
- package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +0 -681
- package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +0 -231
- package/templates/apps/api/src/services/offerings/catalog.ts +0 -308
- package/templates/apps/api/src/services/offerings/checkout-authorization.ts +0 -385
- package/templates/apps/api/src/services/offerings/checkout-session-record.ts +0 -192
- package/templates/apps/api/src/services/offerings/connection.ts +0 -1003
- 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 -1188
- 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 -2073
- 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 -1151
- 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 -65
- package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -187
- 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 -165
- package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +0 -124
- package/templates/apps/mcp/__tests__/list_pages.test.ts +0 -228
- package/templates/apps/mcp/__tests__/locale.test.ts +0 -135
- 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__/read_content.test.ts +0 -474
- package/templates/apps/mcp/__tests__/request_callback.test.ts +0 -225
- package/templates/apps/mcp/__tests__/search_content.test.ts +0 -256
- 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 -307
- package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +0 -223
- 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 -342
- 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 -526
- 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 -142
- package/templates/apps/mcp/src/lib/empty-content-adapter.ts +0 -139
- 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/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 -64
- 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 -137
- package/templates/apps/mcp/src/tools/list_pages.ts +0 -74
- 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 -75
- package/templates/apps/mcp/src/tools/request_callback.ts +0 -59
- package/templates/apps/mcp/src/tools/search_content.ts +0 -67
- package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +0 -57
- package/templates/apps/mcp/src/workspace-server.ts +0 -224
- package/templates/database/CHANGELOG.md +0 -961
- 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 -240
- package/templates/database/__tests__/spoke-registry.db.test.ts +0 -191
- package/templates/database/__tests__/tenancy.test.ts +0 -141
- 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/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,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The MCP server's own workspace resolution (#5876 spec D2/D4/D6/D7) — which
|
|
3
|
-
* workspace `CONTENT_ADAPTER=database` content reads serve, resolved ONCE at
|
|
4
|
-
* bootstrap and read synchronously thereafter by `content-adapter.ts`.
|
|
5
|
-
*
|
|
6
|
-
* WHY RESOLUTION HAPPENS AT BOOTSTRAP, NOT PER CALL (D4). Workspace
|
|
7
|
-
* resolution is I/O (a `workspace.count()` + `findUnique()`), but
|
|
8
|
-
* `getMcpContentAdapter()` stays SYNCHRONOUS — every one of its thirteen
|
|
9
|
-
* call sites (nine read tools, `audit-single-page.ts`, and the three write
|
|
10
|
-
* tools) calls it without `await`. Making it async would force `await` at
|
|
11
|
-
* every one of those sites, a needless cross-cutting edit to a hard-floor
|
|
12
|
-
* surface (`apps/mcp/src/tools/**`). So `apps/mcp/src/index.ts` awaits
|
|
13
|
-
* `initMcpPublicWorkspace()` once, before either transport branch, and the
|
|
14
|
-
* result is memoised here for `mcpPublicWorkspace()`'s synchronous read.
|
|
15
|
-
*
|
|
16
|
-
* A tool invoked before `initMcpPublicWorkspace()` has resolved sees the
|
|
17
|
-
* module's initial `{ kind: "not-required" }` state — which the seam reads
|
|
18
|
-
* exactly like an unresolved deployment under `database` mode (the empty
|
|
19
|
-
* adapter, never content). That is the accepted, safe-direction cost D4
|
|
20
|
-
* names, and it's what keeps the 350 pre-existing tests — which never call
|
|
21
|
-
* `init` — on the byte-identical MDX path.
|
|
22
|
-
*
|
|
23
|
-
* NO-OP UNLESS THE ENVIRONMENT SELECTS `database` (D6). On `mdx` and
|
|
24
|
-
* `projection`, `initMcpPublicWorkspace()`'s first statement is the same
|
|
25
|
-
* `resolvedAdapterKind()` test the seam itself uses, and it returns before
|
|
26
|
-
* any `await import()` — no database round-trip, no `DATABASE_URL` read, on
|
|
27
|
-
* every MDX-only deployment.
|
|
28
|
-
*
|
|
29
|
-
* THE ONE-WORKSPACE PREDICATE IS SHARED, NOT REIMPLEMENTED (D2). This module
|
|
30
|
-
* issues no direct tenant-model query of its own — it delegates to
|
|
31
|
-
* `@working-theory/database/tenancy`'s `resolveDefaultWorkspaceRow`, the same
|
|
32
|
-
* predicate `apps/api/src/services/default-tenant.ts` re-points at. One
|
|
33
|
-
* predicate, reached from two apps, never two predicates (NFR-7).
|
|
34
|
-
*
|
|
35
|
-
* THE LAZY CLIENT (D7). The `prisma` injection option is the seam AC-1/AC-2
|
|
36
|
-
* are scored through: when the caller supplies one, `./prisma.js` (the
|
|
37
|
-
* module that constructs a real `PrismaClient`) is never imported — which is
|
|
38
|
-
* what keeps every test in this repo's ordinary Jest run off a real
|
|
39
|
-
* database connection (NFR-6).
|
|
40
|
-
*/
|
|
41
|
-
import {
|
|
42
|
-
resolvedAdapterKind,
|
|
43
|
-
type ArtifactPrismaClient,
|
|
44
|
-
} from "@working-theory/content-adapters";
|
|
45
|
-
import {
|
|
46
|
-
resolveDefaultWorkspaceRow,
|
|
47
|
-
type WorkspacePredicateClient,
|
|
48
|
-
} from "@working-theory/database/tenancy";
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* The three answers the MCP server's own workspace resolution can reach.
|
|
52
|
-
* `reason` exists for the caller's own logging only — no MCP tool emits it
|
|
53
|
-
* to the (anonymous, unauthenticated) caller (NFR-4, mirroring
|
|
54
|
-
* `apps/api/src/services/public-site-resolver.ts`'s identical
|
|
55
|
-
* `PublicSiteResolution`). Unlike that HTTP twin, there is no `host-unmatched`
|
|
56
|
-
* arm here: an MCP stdio session carries no HTTP request and no host to
|
|
57
|
-
* mismatch against (§2.3 — a host→workspace branch is explicitly out of
|
|
58
|
-
* scope, #3635's to add).
|
|
59
|
-
*/
|
|
60
|
-
export type McpWorkspaceResolution =
|
|
61
|
-
| { kind: "not-required" }
|
|
62
|
-
| { kind: "resolved"; workspaceId: string; prisma: ArtifactPrismaClient }
|
|
63
|
-
| { kind: "unresolved"; reason: "ambiguous" };
|
|
64
|
-
|
|
65
|
-
export interface InitMcpPublicWorkspaceOptions {
|
|
66
|
-
/**
|
|
67
|
-
* Injection seam for tests (D7, D11) — when supplied, `initMcpPublicWorkspace()`
|
|
68
|
-
* uses it and never loads `./prisma.js`. Typed as the narrow surface THIS
|
|
69
|
-
* function itself calls (`workspace.count`/`findUnique`); the real
|
|
70
|
-
* `PrismaClient` (or a caller-injected structural equivalent) is
|
|
71
|
-
* structurally wider and also satisfies `ArtifactPrismaClient`, which is
|
|
72
|
-
* what the seam later forwards to `resolveContentAdapter()`.
|
|
73
|
-
*/
|
|
74
|
-
prisma?: WorkspacePredicateClient;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
let resolution: McpWorkspaceResolution = { kind: "not-required" };
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Resolves the MCP server's workspace, once. Memoises the result for
|
|
81
|
-
* `mcpPublicWorkspace()`'s synchronous read. Safe to call more than once
|
|
82
|
-
* (each call re-resolves and re-memoises) — production calls it exactly once,
|
|
83
|
-
* at bootstrap (`index.ts`).
|
|
84
|
-
*/
|
|
85
|
-
export async function initMcpPublicWorkspace(
|
|
86
|
-
options: InitMcpPublicWorkspaceOptions = {},
|
|
87
|
-
): Promise<McpWorkspaceResolution> {
|
|
88
|
-
if (resolvedAdapterKind() !== "database") {
|
|
89
|
-
resolution = { kind: "not-required" };
|
|
90
|
-
return resolution;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Deferred — see this file's header (D7) and #5852's identical deferral of
|
|
94
|
-
// apps/api's own client (`services/public-site-resolver.ts`).
|
|
95
|
-
const prisma =
|
|
96
|
-
options.prisma ?? (await import("./prisma.js")).getMcpPrismaClient();
|
|
97
|
-
const workspace = await resolveDefaultWorkspaceRow(prisma);
|
|
98
|
-
resolution =
|
|
99
|
-
workspace === null
|
|
100
|
-
? { kind: "unresolved", reason: "ambiguous" }
|
|
101
|
-
: {
|
|
102
|
-
kind: "resolved",
|
|
103
|
-
workspaceId: workspace.id,
|
|
104
|
-
prisma: prisma as unknown as ArtifactPrismaClient,
|
|
105
|
-
};
|
|
106
|
-
return resolution;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* The memoised resolution, read synchronously. `content-adapter.ts`'s
|
|
111
|
-
* `database` branch is the one caller in production; every arm other than
|
|
112
|
-
* `{ kind: "resolved" }` maps to the fail-closed empty adapter.
|
|
113
|
-
*/
|
|
114
|
-
export function mcpPublicWorkspace(): McpWorkspaceResolution {
|
|
115
|
-
return resolution;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/** Test-only injector — sets the memoised resolution directly, bypassing the
|
|
119
|
-
* tenancy predicate entirely. This is the seam `read_content.test.ts`,
|
|
120
|
-
* `list_pages.test.ts` and `fail-closed-tools.test.ts` use: they care about
|
|
121
|
-
* the CONTENT tools' behaviour under a given resolution, not about exercising
|
|
122
|
-
* the resolution logic itself (that's `public-workspace.test.ts`'s job, via
|
|
123
|
-
* the real `initMcpPublicWorkspace({ prisma: <stub> })`). */
|
|
124
|
-
export function __setMcpPublicWorkspaceForTest(
|
|
125
|
-
next: McpWorkspaceResolution,
|
|
126
|
-
): void {
|
|
127
|
-
resolution = next;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/** Test-only reset — returns to the module's initial, pre-bootstrap state. */
|
|
131
|
-
export function resetMcpPublicWorkspace(): void {
|
|
132
|
-
resolution = { kind: "not-required" };
|
|
133
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* resolveLocale — validate a caller-supplied locale against the project's
|
|
3
|
-
* allowlist. Phase 3 S3.
|
|
4
|
-
*
|
|
5
|
-
* Returns the requested locale when it's present in `readLocales()`;
|
|
6
|
-
* otherwise silently falls back to the project's default locale (AC-i18n-07).
|
|
7
|
-
*
|
|
8
|
-
* Failures reading `project.yaml` degrade to a default-locale-only allowlist
|
|
9
|
-
* — mirrors the same defensive behavior in `apps/api/src/routes/content/*`.
|
|
10
|
-
*
|
|
11
|
-
* This boundary check is defense-in-depth on top of the adapter's BCP-47
|
|
12
|
-
* regex; the adapter still applies its own check and fallback chain on
|
|
13
|
-
* every read.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { readDefaultLocale, readLocales } from "./locales.js";
|
|
17
|
-
|
|
18
|
-
export function resolveLocale(requested: string | undefined): string {
|
|
19
|
-
const defaultLocale = readDefaultLocale();
|
|
20
|
-
if (requested === undefined) return defaultLocale;
|
|
21
|
-
|
|
22
|
-
let allow: string[];
|
|
23
|
-
try {
|
|
24
|
-
allow = readLocales();
|
|
25
|
-
} catch {
|
|
26
|
-
allow = [defaultLocale];
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return allow.includes(requested) ? requested : defaultLocale;
|
|
30
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The MCP read of the site's Offerings shown set (#8933, spec D6).
|
|
3
|
-
*
|
|
4
|
-
* `get_pricing` and `get_offerings` answer a connected site's shown set —
|
|
5
|
-
* the persisted Stripe snapshot `GET /v1/content/shown-offerings` serves
|
|
6
|
-
* (#8924) — rather than its page content. apps/mcp reaches Offerings data
|
|
7
|
-
* only over HTTP (#8876 D9), so this file reads that route through
|
|
8
|
-
* `@working-theory/api-client` and hands the tools the current set, or
|
|
9
|
-
* `null` for the content path:
|
|
10
|
-
*
|
|
11
|
-
* 1. The deployment's own claim first: unless `mcpCommerceClaim()` reads
|
|
12
|
-
* `claimed`, no HTTP call is made at all. The API's claim, read inside
|
|
13
|
-
* the route, still decides; this one only spares an unlicensed host the
|
|
14
|
-
* call.
|
|
15
|
-
* 2. One `apiClient.offerings.shown()`, raced against
|
|
16
|
-
* `MCP_SHOWN_SET_BUDGET_MS`, so a hung API never holds a tool call.
|
|
17
|
-
* 3. A refusal, a body `shownOfferingsAnswerSchema` refuses, the budget
|
|
18
|
-
* passing or a rejection is `null` and one `console.error` line.
|
|
19
|
-
* 4. Otherwise `currentShownSet` — a `current` set with offerings, or `null`.
|
|
20
|
-
*
|
|
21
|
-
* The workspace is the API's: api-client sends the deployment's own spoke
|
|
22
|
-
* key, and no tool argument names one (identity-blind). No Stripe package is
|
|
23
|
-
* imported here or anywhere in apps/mcp (T7).
|
|
24
|
-
*
|
|
25
|
-
* T6 — every log line is `{ event, outcome }` plus an HTTP `status` or an
|
|
26
|
-
* error's class name as `errName`: never a body, a message, the shown set, a
|
|
27
|
-
* lookup key, an id, a name or a description. The log calls live here
|
|
28
|
-
* because the tool files may not call `console.*`.
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import { apiClient } from "@working-theory/api-client";
|
|
32
|
-
import { currentShownSet } from "@working-theory/content-adapters";
|
|
33
|
-
import {
|
|
34
|
-
shownOfferingsAnswerSchema,
|
|
35
|
-
type WorkspaceShownSetWire,
|
|
36
|
-
} from "@working-theory/validation";
|
|
37
|
-
|
|
38
|
-
import { mcpCommerceClaim } from "./commerce-claim.js";
|
|
39
|
-
|
|
40
|
-
/** The longest one tool call waits on the shown set before answering content. */
|
|
41
|
-
export const MCP_SHOWN_SET_BUDGET_MS = 5000;
|
|
42
|
-
|
|
43
|
-
const OVER_BUDGET = Symbol("over-budget");
|
|
44
|
-
|
|
45
|
-
/** An error's class name only — never its message, which may carry Stripe text. */
|
|
46
|
-
function errName(err: unknown): string {
|
|
47
|
-
return err instanceof Error ? err.constructor.name : typeof err;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** The site's current shown set, or `null` for the content path. */
|
|
51
|
-
export async function mcpCurrentShownSet(): Promise<WorkspaceShownSetWire | null> {
|
|
52
|
-
if (mcpCommerceClaim() !== "claimed") return null;
|
|
53
|
-
|
|
54
|
-
// Caught before the race, so a rejection after the budget is never unhandled.
|
|
55
|
-
const read = apiClient.offerings.shown().catch((err: unknown) => {
|
|
56
|
-
console.error({
|
|
57
|
-
event: "shown-offerings",
|
|
58
|
-
outcome: "unreachable",
|
|
59
|
-
errName: errName(err),
|
|
60
|
-
});
|
|
61
|
-
return null;
|
|
62
|
-
});
|
|
63
|
-
let timer: NodeJS.Timeout | undefined;
|
|
64
|
-
const budget = new Promise<typeof OVER_BUDGET>((resolve) => {
|
|
65
|
-
timer = setTimeout(() => resolve(OVER_BUDGET), MCP_SHOWN_SET_BUDGET_MS);
|
|
66
|
-
});
|
|
67
|
-
let res: Awaited<typeof read> | typeof OVER_BUDGET;
|
|
68
|
-
try {
|
|
69
|
-
res = await Promise.race([read, budget]);
|
|
70
|
-
} finally {
|
|
71
|
-
clearTimeout(timer);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (res === OVER_BUDGET) {
|
|
75
|
-
console.error({ event: "shown-offerings", outcome: "over_budget" });
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
if (res === null) return null;
|
|
79
|
-
if (!res.ok) {
|
|
80
|
-
console.error({
|
|
81
|
-
event: "shown-offerings",
|
|
82
|
-
outcome: "refused",
|
|
83
|
-
status: res.status,
|
|
84
|
-
});
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
const parsed = shownOfferingsAnswerSchema.safeParse(res.body);
|
|
88
|
-
if (!parsed.success) {
|
|
89
|
-
console.error({ event: "shown-offerings", outcome: "unreadable" });
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
return currentShownSet(parsed.data);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Logs a shown-set mapping that threw (D12): the tool then answers its
|
|
97
|
-
* content path, so no `ZodError` message ever reaches the agent.
|
|
98
|
-
*/
|
|
99
|
-
export function reportMappingFailure(err: unknown): void {
|
|
100
|
-
console.error({
|
|
101
|
-
event: "shown-offerings",
|
|
102
|
-
outcome: "mapping_failed",
|
|
103
|
-
errName: errName(err),
|
|
104
|
-
});
|
|
105
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* stripe-tax-signal — reads `commerce.stripe_tax` from project.yaml (#5949 D4).
|
|
3
|
-
*
|
|
4
|
-
* The declaration the audit's `tax-code-when-stripe-tax` rule grades against:
|
|
5
|
-
* "this site's Stripe account has Stripe Tax enabled, so every priced page owes
|
|
6
|
-
* a `stripe.taxCode`". Declarative only — nothing here calls Stripe, and no
|
|
7
|
-
* license claim is read.
|
|
8
|
-
*
|
|
9
|
-
* The actual YAML read + field extraction delegates to `loadCommerceConfig`
|
|
10
|
-
* (`@working-theory/aeo`, exported from the package root since #6012) — this
|
|
11
|
-
* file's own job is the directory PROBE: apps run from their own dirs in
|
|
12
|
-
* dev/build (`apps/mcp/`) but from repo root in some test setups, mirroring
|
|
13
|
-
* `apps/mcp/src/lib/locales.ts`'s own project.yaml probe (the same three
|
|
14
|
-
* candidates it walks; `apps/*` may not import `apps/*`, so a shared probe
|
|
15
|
-
* helper isn't an option either — only the parse/extract logic was the
|
|
16
|
-
* duplicate #6012 removes).
|
|
17
|
-
*
|
|
18
|
-
* NEVER throws. An unreadable, absent, malformed or non-boolean value all
|
|
19
|
-
* resolve to `undefined` — the site declares no Stripe Tax posture, and the
|
|
20
|
-
* rule passes saying so.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import { readFileSync } from "node:fs";
|
|
24
|
-
import { dirname, join } from "node:path";
|
|
25
|
-
|
|
26
|
-
import { loadCommerceConfig } from "@working-theory/aeo";
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Probe likely locations for project.yaml. Apps run from their own dirs in
|
|
30
|
-
* dev/build (`apps/mcp/`) but from repo root in some test setups — the same
|
|
31
|
-
* three candidates `locales.ts` walks.
|
|
32
|
-
*/
|
|
33
|
-
function resolveProjectYamlPath(cwd: string): string {
|
|
34
|
-
const candidates = [
|
|
35
|
-
join(cwd, "project.yaml"),
|
|
36
|
-
join(cwd, "..", "project.yaml"),
|
|
37
|
-
join(cwd, "..", "..", "project.yaml"),
|
|
38
|
-
];
|
|
39
|
-
for (const candidate of candidates) {
|
|
40
|
-
try {
|
|
41
|
-
readFileSync(candidate, "utf8");
|
|
42
|
-
return candidate;
|
|
43
|
-
} catch {
|
|
44
|
-
// continue
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return candidates[0] ?? join(cwd, "project.yaml");
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* `commerce.stripe_tax` at `projectRoot` (default: the process cwd), or
|
|
52
|
-
* `undefined` when the site declares none.
|
|
53
|
-
*/
|
|
54
|
-
export function readStripeTaxSignal(
|
|
55
|
-
projectRoot: string = process.cwd(),
|
|
56
|
-
): boolean | undefined {
|
|
57
|
-
const resolvedPath = resolveProjectYamlPath(projectRoot);
|
|
58
|
-
return loadCommerceConfig(dirname(resolvedPath)).stripeTaxEnabled;
|
|
59
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-request context for @working-theory/mcp, shared by the HTTP transport
|
|
3
|
-
* and the MCP lead-write tools (#8073).
|
|
4
|
-
*
|
|
5
|
-
* Deliberately dependency-free beyond `@working-theory/api-client` (already
|
|
6
|
-
* loaded by every tool): `http-transport.ts` imports Fastify and the full
|
|
7
|
-
* HTTP stack, and `src/index.ts`'s stdio branch dynamic-imports `server.js`
|
|
8
|
-
* specifically to avoid loading that stack for a local stdio caller. A tool
|
|
9
|
-
* importing `trustedCallerAddress` straight from `http-transport.ts` would
|
|
10
|
-
* pull Fastify into every stdio boot and, worse, close an import cycle
|
|
11
|
-
* (`http-transport.ts` → `server.ts` → `tools/*.ts` → `http-transport.ts`).
|
|
12
|
-
* This module sits below both: `http-transport.ts` populates the store,
|
|
13
|
-
* the tools read it, neither imports the other.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { AsyncLocalStorage } from "node:async_hooks";
|
|
17
|
-
|
|
18
|
-
import { visitorForwardHeaders } from "@working-theory/api-client";
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* The caller address the transport trusted for the POST request currently
|
|
22
|
-
* being handled — `request.ip`, Fastify's own `trustProxy`-resolved value
|
|
23
|
-
* (the Vercel entry trusts exactly one hop, #8070 D5), never the raw,
|
|
24
|
-
* caller-forgeable leftmost `X-Forwarded-For` entry. Populated by
|
|
25
|
-
* `http-transport.ts` for the duration of one `transport.handleRequest()`
|
|
26
|
-
* call and read by the three MCP lead-write tools (#8073) so they can
|
|
27
|
-
* forward it to the hub without the tool gaining an identity argument.
|
|
28
|
-
* `undefined` outside an HTTP request — stdio has no client address to
|
|
29
|
-
* forward.
|
|
30
|
-
*/
|
|
31
|
-
export const trustedCallerAddress = new AsyncLocalStorage<string>();
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* The two visitor-forwarding headers (`x-ailk-visitor-ip`,
|
|
35
|
-
* `x-ailk-visitor-forward-key`) for the request this call is running inside,
|
|
36
|
-
* or `undefined` when there is no trusted address for this call (not an HTTP
|
|
37
|
-
* request), no `AILK_VISITOR_FORWARD_KEY`, or `visitorForwardHeaders` itself
|
|
38
|
-
* declines (an unsafe transport, an unsafe key value). Read by the lead-write
|
|
39
|
-
* tools right before they call the hub (#8073).
|
|
40
|
-
*/
|
|
41
|
-
export function visitorForwardHeadersForThisCall():
|
|
42
|
-
| Record<string, string>
|
|
43
|
-
| undefined {
|
|
44
|
-
const address = trustedCallerAddress.getStore();
|
|
45
|
-
if (!address) return undefined;
|
|
46
|
-
return visitorForwardHeaders(
|
|
47
|
-
{
|
|
48
|
-
get: (name: string) => (name === "x-forwarded-for" ? address : null),
|
|
49
|
-
},
|
|
50
|
-
process.env.AILK_VISITOR_FORWARD_KEY,
|
|
51
|
-
);
|
|
52
|
-
}
|