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.
Files changed (604) hide show
  1. package/README.md +68 -33
  2. package/component-catalog.json +3 -3
  3. package/component-catalog.md +3 -3
  4. package/dist/add-module.js +10 -3
  5. package/dist/add-route.d.ts +12 -1
  6. package/dist/add-route.js +38 -4
  7. package/dist/cli.js +12 -7
  8. package/dist/derive-architecture.d.ts +3 -4
  9. package/dist/derive-architecture.js +75 -22
  10. package/dist/lib/design-checks.d.ts +9 -4
  11. package/dist/lib/design-checks.js +13 -7
  12. package/dist/lib/extract-module-bundle.js +29 -2
  13. package/dist/lib/fetch-template-snapshot.d.ts +1 -1
  14. package/dist/lib/fetch-template-snapshot.js +7 -3
  15. package/dist/lib/import-graph.d.ts +1 -1
  16. package/dist/lib/import-graph.js +4 -4
  17. package/dist/lib/module-license-gate.d.ts +12 -1
  18. package/dist/lib/module-license-gate.js +34 -12
  19. package/dist/lib/scaffold-render-sweep.d.ts +33 -0
  20. package/dist/lib/scaffold-render-sweep.js +45 -0
  21. package/dist/module-architecture.d.ts +20 -3
  22. package/dist/module-architecture.js +122 -538
  23. package/dist/paid-sections.d.ts +25 -1
  24. package/dist/paid-sections.js +88 -3
  25. package/dist/surfaces.js +10 -2
  26. package/dist/sync-routes.d.ts +30 -4
  27. package/dist/sync-routes.js +271 -18
  28. package/dist/template-record.d.ts +14 -4
  29. package/dist/template-record.js +23 -5
  30. package/dist/topology.d.ts +16 -3
  31. package/dist/topology.js +31 -19
  32. package/dist/update.d.ts +10 -1
  33. package/dist/update.js +540 -16
  34. package/package.json +3 -3
  35. package/release-scope.json +1 -1
  36. package/templates/.claude/cloudparity-repo-hooks.json +5 -0
  37. package/templates/.claude/hooks/template-guard.sh +137 -0
  38. package/templates/.claude/rules/extending.md +106 -0
  39. package/templates/.claude/rules/loop-contract.md +2 -2
  40. package/templates/.claude/settings.json +11 -0
  41. package/templates/.env.example +9 -5
  42. package/templates/.github/workflows/ci.yml +7 -4
  43. package/templates/CLAUDE.md +15 -3
  44. package/templates/CONVENTIONS.md +8 -10
  45. package/templates/README.md +14 -13
  46. package/templates/apps/api/.env.example +9 -2
  47. package/templates/apps/api/CLAUDE.md +122 -82
  48. package/templates/apps/api/jest.config.cjs +15 -5
  49. package/templates/apps/api/package.json +16 -20
  50. package/templates/apps/api/src/__tests__/trusted-origins.server.test.ts +2 -2
  51. package/templates/apps/api/src/__tests__/vercel-handler.test.ts +4 -4
  52. package/templates/apps/api/src/index.ts +1 -1
  53. package/templates/apps/api/src/lib/__mocks__/prisma.ts +7 -4
  54. package/templates/apps/api/src/modules/commerce.ts +10 -0
  55. package/templates/apps/api/src/modules/content-write.ts +10 -0
  56. package/templates/apps/api/src/modules/multi-tenant.ts +10 -0
  57. package/templates/apps/api/src/modules/scheduling.ts +10 -0
  58. package/templates/apps/api/src/modules/signal-collectors.ts +10 -0
  59. package/templates/apps/api/src/modules/workspace.ts +10 -0
  60. package/templates/apps/api/src/server.ts +117 -1857
  61. package/templates/apps/api/vercel.json +2 -2
  62. package/templates/apps/mcp/CLAUDE.md +77 -24
  63. package/templates/apps/mcp/__tests__/app-entry.test.ts +4 -254
  64. package/templates/apps/mcp/__tests__/boot-file.test.ts +92 -0
  65. package/templates/apps/mcp/jest.config.cjs +6 -1
  66. package/templates/apps/mcp/package.json +5 -12
  67. package/templates/apps/mcp/src/app.ts +8 -7
  68. package/templates/apps/mcp/src/index.ts +6 -34
  69. package/templates/apps/mcp/src/lib/paid-tools.generated.ts +10 -0
  70. package/templates/apps/mcp/src/lib/topology.generated.ts +2 -2
  71. package/templates/apps/mcp/src/site.ts +12 -0
  72. package/templates/apps/web/.env.example +1 -1
  73. package/templates/apps/web/CLAUDE.md +21 -5
  74. package/templates/apps/web/app/.well-known/mcp.json/route.ts +9 -3
  75. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +1 -1
  76. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +14 -4
  77. package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +1 -1
  78. package/templates/apps/web/app/[locale]/contact/intake-script.ts +1 -1
  79. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/magnet-page.test.tsx +22 -1
  80. package/templates/apps/web/app/[locale]/flows/[slug]/magnet-page.tsx +28 -7
  81. package/templates/apps/web/app/[locale]/pricing/__tests__/unconnected.test.tsx +43 -0
  82. package/templates/apps/web/app/[locale]/pricing/page.tsx +7 -3
  83. package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/__tests__/route.test.ts +222 -0
  84. package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/route.ts +10 -3
  85. package/templates/apps/web/app/api/revalidate/route.ts +3 -3
  86. package/templates/apps/web/auth.ts +2 -2
  87. package/templates/apps/web/jest.config.cjs +1 -0
  88. package/templates/apps/web/lib/__tests__/magnet-routes.test.ts +7 -0
  89. package/templates/apps/web/lib/auth-email.ts +1 -1
  90. package/templates/apps/web/lib/magnet-routes.ts +3 -1
  91. package/templates/apps/web/lib/newsletter.actions.ts +9 -6
  92. package/templates/apps/web/lib/relay.ts +2 -2
  93. package/templates/apps/web/lib/release-scope.ts +47 -0
  94. package/templates/apps/web/lib/server-api.ts +1 -1
  95. package/templates/apps/web/src/lib/commerce-claim.ts +1 -1
  96. package/templates/customizations.yaml +37 -0
  97. package/templates/database/prisma.config.ts +10 -14
  98. package/templates/database/seed-test.ts +2 -2
  99. package/templates/database/seed.ts +32 -5
  100. package/templates/package.json +12 -6
  101. package/templates/pnpm-workspace.yaml +0 -1
  102. package/templates/project.yaml +16 -8
  103. package/templates/tools/jest/reporters.cjs +65 -0
  104. package/templates/tools/lint-architecture.ts +757 -7
  105. package/templates/tsconfig.json +1 -2
  106. package/versions.json +48 -35
  107. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +0 -409
  108. package/templates/apps/api/src/__tests__/factories/agent-caller.ts +0 -102
  109. package/templates/apps/api/src/__tests__/factories/content-fixture.ts +0 -138
  110. package/templates/apps/api/src/__tests__/factories/in-memory-prisma.ts +0 -441
  111. package/templates/apps/api/src/__tests__/factories/index.ts +0 -70
  112. package/templates/apps/api/src/__tests__/factories/lead-fixture.ts +0 -82
  113. package/templates/apps/api/src/__tests__/leads-forwarded-rate-limit.test.ts +0 -135
  114. package/templates/apps/api/src/__tests__/services/enrichment-shim.test.ts +0 -126
  115. package/templates/apps/api/src/__tests__/stripe-boot.test.ts +0 -132
  116. package/templates/apps/api/src/__tests__/support/hub-sign-in-fake-db.ts +0 -362
  117. package/templates/apps/api/src/bin/__tests__/rate-limit-probe.test.ts +0 -184
  118. package/templates/apps/api/src/bin/abandon-sweep.ts +0 -42
  119. package/templates/apps/api/src/bin/rate-limit-probe.ts +0 -53
  120. package/templates/apps/api/src/bin/spokes.ts +0 -198
  121. package/templates/apps/api/src/bin/stripe-connections-rekey.ts +0 -45
  122. package/templates/apps/api/src/config/__tests__/hub-require-spoke-key.test.ts +0 -196
  123. package/templates/apps/api/src/config/__tests__/index.test.ts +0 -233
  124. package/templates/apps/api/src/config/__tests__/modules.test.ts +0 -76
  125. package/templates/apps/api/src/config/__tests__/stripe-connection-key.test.ts +0 -185
  126. package/templates/apps/api/src/config/__tests__/trusted-origins.test.ts +0 -238
  127. package/templates/apps/api/src/config/index.ts +0 -596
  128. package/templates/apps/api/src/config/modules.ts +0 -83
  129. package/templates/apps/api/src/lib/__tests__/agent-store.test.ts +0 -581
  130. package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +0 -143
  131. package/templates/apps/api/src/lib/__tests__/consent-ledger-double.ts +0 -237
  132. package/templates/apps/api/src/lib/__tests__/consent-store.test.ts +0 -353
  133. package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +0 -201
  134. package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +0 -224
  135. package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +0 -120
  136. package/templates/apps/api/src/lib/__tests__/errors.test.ts +0 -94
  137. package/templates/apps/api/src/lib/__tests__/file-fallback.test.ts +0 -144
  138. package/templates/apps/api/src/lib/__tests__/fixtures/HomePage/home.mdx +0 -8
  139. package/templates/apps/api/src/lib/__tests__/flow-completion-store.test.ts +0 -149
  140. package/templates/apps/api/src/lib/__tests__/flow-rename-race.db.test.ts +0 -116
  141. package/templates/apps/api/src/lib/__tests__/hub-sign-in-store.test.ts +0 -209
  142. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +0 -257
  143. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +0 -96
  144. package/templates/apps/api/src/lib/__tests__/outbound-http.test.ts +0 -125
  145. package/templates/apps/api/src/lib/__tests__/prisma.test.ts +0 -165
  146. package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +0 -317
  147. package/templates/apps/api/src/lib/__tests__/require-paid-tier.test.ts +0 -129
  148. package/templates/apps/api/src/lib/__tests__/site.test.ts +0 -292
  149. package/templates/apps/api/src/lib/__tests__/slice-load.test.ts +0 -89
  150. package/templates/apps/api/src/lib/__tests__/spoke-store.test.ts +0 -202
  151. package/templates/apps/api/src/lib/__tests__/stripe-admission.test.ts +0 -217
  152. package/templates/apps/api/src/lib/__tests__/stripe.test.ts +0 -82
  153. package/templates/apps/api/src/lib/agent-store.ts +0 -613
  154. package/templates/apps/api/src/lib/auth-email-budget.ts +0 -161
  155. package/templates/apps/api/src/lib/consent-store.ts +0 -363
  156. package/templates/apps/api/src/lib/content-adapter.ts +0 -112
  157. package/templates/apps/api/src/lib/deliverable-asset-store.ts +0 -96
  158. package/templates/apps/api/src/lib/error-serializer.ts +0 -164
  159. package/templates/apps/api/src/lib/errors.ts +0 -95
  160. package/templates/apps/api/src/lib/file-fallback.ts +0 -87
  161. package/templates/apps/api/src/lib/flow-completion-store.ts +0 -136
  162. package/templates/apps/api/src/lib/hub-sign-in-store.ts +0 -455
  163. package/templates/apps/api/src/lib/lead-capture-store.ts +0 -122
  164. package/templates/apps/api/src/lib/lead-delivery.ts +0 -52
  165. package/templates/apps/api/src/lib/license-key-store.ts +0 -45
  166. package/templates/apps/api/src/lib/locales.ts +0 -201
  167. package/templates/apps/api/src/lib/outbound-http.ts +0 -127
  168. package/templates/apps/api/src/lib/prisma.ts +0 -21
  169. package/templates/apps/api/src/lib/proposal-paid-store.ts +0 -66
  170. package/templates/apps/api/src/lib/rate-limit-probe.ts +0 -165
  171. package/templates/apps/api/src/lib/rate-limit-store.ts +0 -142
  172. package/templates/apps/api/src/lib/require-commerce-claim.ts +0 -250
  173. package/templates/apps/api/src/lib/require-paid-tier.ts +0 -53
  174. package/templates/apps/api/src/lib/site.ts +0 -254
  175. package/templates/apps/api/src/lib/slice-load.ts +0 -90
  176. package/templates/apps/api/src/lib/spoke-store.ts +0 -180
  177. package/templates/apps/api/src/lib/stripe.ts +0 -318
  178. package/templates/apps/api/src/lib/webhook-idempotency.ts +0 -156
  179. package/templates/apps/api/src/middleware/__tests__/adversarial/bearer-token-format.test.ts +0 -111
  180. package/templates/apps/api/src/middleware/__tests__/adversarial/cookie-or-bearer-precedence.test.ts +0 -172
  181. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-bearer-skip.test.ts +0 -119
  182. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-cookie-path.test.ts +0 -138
  183. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-trusted-origins.test.ts +0 -142
  184. package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +0 -155
  185. package/templates/apps/api/src/middleware/__tests__/adversarial/session-timeout.test.ts +0 -139
  186. package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +0 -562
  187. package/templates/apps/api/src/middleware/__tests__/auth.both-present-precedence.test.ts +0 -76
  188. package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +0 -220
  189. package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +0 -97
  190. package/templates/apps/api/src/middleware/__tests__/auth.hub-session-path.test.ts +0 -557
  191. package/templates/apps/api/src/middleware/__tests__/auth.neither-present.test.ts +0 -72
  192. package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +0 -140
  193. package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +0 -721
  194. package/templates/apps/api/src/middleware/__tests__/rate-limit-cross-isolate.db.test.ts +0 -220
  195. package/templates/apps/api/src/middleware/__tests__/rate-limit-store.test.ts +0 -430
  196. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +0 -1409
  197. package/templates/apps/api/src/middleware/__tests__/write-budget.test.ts +0 -174
  198. package/templates/apps/api/src/middleware/auth.ts +0 -864
  199. package/templates/apps/api/src/middleware/default-tenant.ts +0 -166
  200. package/templates/apps/api/src/middleware/rate-limit.ts +0 -983
  201. package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +0 -264
  202. package/templates/apps/api/src/openapi/__tests__/spec-identity.test.ts +0 -182
  203. package/templates/apps/api/src/openapi/index.ts +0 -18
  204. package/templates/apps/api/src/openapi/spec.ts +0 -1815
  205. package/templates/apps/api/src/openapi/surface-drift.ts +0 -195
  206. package/templates/apps/api/src/routes/aeo/__tests__/index.test.ts +0 -175
  207. package/templates/apps/api/src/routes/aeo/index.ts +0 -107
  208. package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +0 -196
  209. package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +0 -249
  210. package/templates/apps/api/src/routes/auth/__tests__/hub-sign-in.test.ts +0 -532
  211. package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +0 -313
  212. package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +0 -413
  213. package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +0 -609
  214. package/templates/apps/api/src/routes/auth/hub-sign-in.ts +0 -242
  215. package/templates/apps/api/src/routes/auth/tokens.ts +0 -211
  216. package/templates/apps/api/src/routes/auth/transactional-email.ts +0 -301
  217. package/templates/apps/api/src/routes/auth/user.ts +0 -305
  218. package/templates/apps/api/src/routes/billing/plan-checkout.ts +0 -325
  219. package/templates/apps/api/src/routes/checkout/__tests__/live-key.test.ts +0 -178
  220. package/templates/apps/api/src/routes/checkout/__tests__/offerings-authorization.test.ts +0 -1300
  221. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +0 -448
  222. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +0 -1742
  223. package/templates/apps/api/src/routes/checkout/index.ts +0 -34
  224. package/templates/apps/api/src/routes/checkout/session.ts +0 -171
  225. package/templates/apps/api/src/routes/checkout/sessions.ts +0 -540
  226. package/templates/apps/api/src/routes/consent/__tests__/account.test.ts +0 -386
  227. package/templates/apps/api/src/routes/consent/__tests__/sign-up-rate-limit.test.ts +0 -160
  228. package/templates/apps/api/src/routes/consent/account.ts +0 -268
  229. package/templates/apps/api/src/routes/consent/cookie.ts +0 -90
  230. package/templates/apps/api/src/routes/consent/index.ts +0 -26
  231. package/templates/apps/api/src/routes/consent/unsubscribe.ts +0 -127
  232. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +0 -853
  233. package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +0 -230
  234. package/templates/apps/api/src/routes/content/__tests__/list-types.test.ts +0 -44
  235. package/templates/apps/api/src/routes/content/__tests__/locale.test.ts +0 -118
  236. package/templates/apps/api/src/routes/content/__tests__/offerings.test.ts +0 -731
  237. package/templates/apps/api/src/routes/content/__tests__/pricing.test.ts +0 -753
  238. package/templates/apps/api/src/routes/content/__tests__/rate-limit.test.ts +0 -51
  239. package/templates/apps/api/src/routes/content/__tests__/search.test.ts +0 -450
  240. package/templates/apps/api/src/routes/content/__tests__/shown-offerings.test.ts +0 -762
  241. package/templates/apps/api/src/routes/content/get-page.ts +0 -268
  242. package/templates/apps/api/src/routes/content/index.ts +0 -49
  243. package/templates/apps/api/src/routes/content/list-pages.ts +0 -95
  244. package/templates/apps/api/src/routes/content/list-types.ts +0 -19
  245. package/templates/apps/api/src/routes/content/offerings.ts +0 -184
  246. package/templates/apps/api/src/routes/content/pricing.ts +0 -176
  247. package/templates/apps/api/src/routes/content/rate-limit.ts +0 -22
  248. package/templates/apps/api/src/routes/content/search.ts +0 -129
  249. package/templates/apps/api/src/routes/content/shown-offerings.ts +0 -229
  250. package/templates/apps/api/src/routes/content/slug.ts +0 -9
  251. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +0 -88
  252. package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +0 -171
  253. package/templates/apps/api/src/routes/leads/__tests__/magnet-completion.test.ts +0 -515
  254. package/templates/apps/api/src/routes/leads/__tests__/spoke.test.ts +0 -392
  255. package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +0 -165
  256. package/templates/apps/api/src/routes/leads/index.ts +0 -573
  257. package/templates/apps/api/src/routes/leads/list.ts +0 -104
  258. package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +0 -626
  259. package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +0 -1268
  260. package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +0 -847
  261. package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +0 -480
  262. package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +0 -465
  263. package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +0 -872
  264. package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +0 -1022
  265. package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +0 -484
  266. package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +0 -535
  267. package/templates/apps/api/src/routes/project-listings/index.ts +0 -164
  268. package/templates/apps/api/src/routes/project-listings/me.ts +0 -87
  269. package/templates/apps/api/src/routes/project-listings/patch-copy.ts +0 -224
  270. package/templates/apps/api/src/routes/project-listings/patch-draft.ts +0 -102
  271. package/templates/apps/api/src/routes/project-listings/public.ts +0 -98
  272. package/templates/apps/api/src/routes/project-listings/respond.ts +0 -48
  273. package/templates/apps/api/src/routes/project-listings/resume-token.ts +0 -27
  274. package/templates/apps/api/src/routes/project-listings/start.ts +0 -140
  275. package/templates/apps/api/src/routes/project-listings/submit.ts +0 -130
  276. package/templates/apps/api/src/routes/project-listings/verify-email.ts +0 -150
  277. package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +0 -686
  278. package/templates/apps/api/src/routes/requests/confirm.ts +0 -601
  279. package/templates/apps/api/src/routes/requests/index.ts +0 -54
  280. package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +0 -306
  281. package/templates/apps/api/src/routes/test/auth/session.ts +0 -143
  282. package/templates/apps/api/src/routes/webhooks/README.md +0 -398
  283. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-checkout-consent.test.ts +0 -649
  284. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +0 -749
  285. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +0 -448
  286. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +0 -264
  287. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode-live.test.ts +0 -159
  288. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode.test.ts +0 -158
  289. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-offerings.test.ts +0 -814
  290. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +0 -301
  291. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-proposal-paid.test.ts +0 -369
  292. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +0 -215
  293. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +0 -301
  294. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-site-filter.test.ts +0 -808
  295. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +0 -1155
  296. package/templates/apps/api/src/routes/webhooks/index.ts +0 -141
  297. package/templates/apps/api/src/routes/webhooks/stripe-offerings.ts +0 -384
  298. package/templates/apps/api/src/routes/webhooks/stripe.ts +0 -2026
  299. package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +0 -528
  300. package/templates/apps/api/src/services/__tests__/answer-distributions.test.ts +0 -132
  301. package/templates/apps/api/src/services/__tests__/audit-log.test.ts +0 -1028
  302. package/templates/apps/api/src/services/__tests__/checkout-plan.test.ts +0 -313
  303. package/templates/apps/api/src/services/__tests__/consent-ledger.test.ts +0 -503
  304. package/templates/apps/api/src/services/__tests__/consent-migration.test.ts +0 -65
  305. package/templates/apps/api/src/services/__tests__/consent.test.ts +0 -299
  306. package/templates/apps/api/src/services/__tests__/default-tenant.test.ts +0 -147
  307. package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +0 -867
  308. package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +0 -379
  309. package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +0 -368
  310. package/templates/apps/api/src/services/__tests__/entitlements.test.ts +0 -142
  311. package/templates/apps/api/src/services/__tests__/hub-sign-in.test.ts +0 -854
  312. package/templates/apps/api/src/services/__tests__/keyless-workspace-predicate.test.ts +0 -234
  313. package/templates/apps/api/src/services/__tests__/lead-accept-user.test.ts +0 -251
  314. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +0 -2660
  315. package/templates/apps/api/src/services/__tests__/listing-config.test.ts +0 -166
  316. package/templates/apps/api/src/services/__tests__/magnet-completion.test.ts +0 -389
  317. package/templates/apps/api/src/services/__tests__/person.test.ts +0 -1176
  318. package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +0 -444
  319. package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +0 -154
  320. package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +0 -137
  321. package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +0 -531
  322. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +0 -372
  323. package/templates/apps/api/src/services/__tests__/slack-notify.test.ts +0 -348
  324. package/templates/apps/api/src/services/__tests__/spoke-resolution.test.ts +0 -660
  325. package/templates/apps/api/src/services/__tests__/usage-aggregation.test.ts +0 -941
  326. package/templates/apps/api/src/services/__tests__/usage-credits.test.ts +0 -588
  327. package/templates/apps/api/src/services/__tests__/verified-email.test.ts +0 -78
  328. package/templates/apps/api/src/services/abandon-email.ts +0 -313
  329. package/templates/apps/api/src/services/aeo-score.ts +0 -325
  330. package/templates/apps/api/src/services/answer-distributions.ts +0 -138
  331. package/templates/apps/api/src/services/audit-log.ts +0 -961
  332. package/templates/apps/api/src/services/checkout-buyer.ts +0 -168
  333. package/templates/apps/api/src/services/consent.ts +0 -834
  334. package/templates/apps/api/src/services/default-tenant.ts +0 -416
  335. package/templates/apps/api/src/services/deliverable-fulfillment.ts +0 -755
  336. package/templates/apps/api/src/services/dunning-policy.ts +0 -294
  337. package/templates/apps/api/src/services/enrichment-shim.ts +0 -53
  338. package/templates/apps/api/src/services/entitlements.ts +0 -338
  339. package/templates/apps/api/src/services/hub-sign-in.ts +0 -472
  340. package/templates/apps/api/src/services/lead-accept-user.ts +0 -126
  341. package/templates/apps/api/src/services/lead-promotion.ts +0 -160
  342. package/templates/apps/api/src/services/lead-routing.ts +0 -1372
  343. package/templates/apps/api/src/services/leads-inbox.ts +0 -312
  344. package/templates/apps/api/src/services/listing-config.ts +0 -178
  345. package/templates/apps/api/src/services/magnet-completion.ts +0 -242
  346. package/templates/apps/api/src/services/offerings/__tests__/catalog.test.ts +0 -295
  347. package/templates/apps/api/src/services/offerings/__tests__/checkout-session-record.test.ts +0 -268
  348. package/templates/apps/api/src/services/offerings/__tests__/connection.test.ts +0 -868
  349. package/templates/apps/api/src/services/offerings/__tests__/fixtures.ts +0 -416
  350. package/templates/apps/api/src/services/offerings/__tests__/org-products.test.ts +0 -396
  351. package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +0 -681
  352. package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +0 -231
  353. package/templates/apps/api/src/services/offerings/catalog.ts +0 -308
  354. package/templates/apps/api/src/services/offerings/checkout-authorization.ts +0 -385
  355. package/templates/apps/api/src/services/offerings/checkout-session-record.ts +0 -192
  356. package/templates/apps/api/src/services/offerings/connection.ts +0 -1003
  357. package/templates/apps/api/src/services/offerings/index.ts +0 -614
  358. package/templates/apps/api/src/services/offerings/source.ts +0 -140
  359. package/templates/apps/api/src/services/offerings/store.ts +0 -150
  360. package/templates/apps/api/src/services/owner-workspaces.ts +0 -132
  361. package/templates/apps/api/src/services/person.ts +0 -1188
  362. package/templates/apps/api/src/services/plan-offerings.ts +0 -125
  363. package/templates/apps/api/src/services/project-listing-resume-email.ts +0 -326
  364. package/templates/apps/api/src/services/project-listings.ts +0 -2073
  365. package/templates/apps/api/src/services/public-site-resolver.ts +0 -396
  366. package/templates/apps/api/src/services/request-confirm.ts +0 -698
  367. package/templates/apps/api/src/services/revalidation.ts +0 -235
  368. package/templates/apps/api/src/services/slack-notify.ts +0 -291
  369. package/templates/apps/api/src/services/usage-aggregation.ts +0 -516
  370. package/templates/apps/api/src/services/usage-credits.ts +0 -340
  371. package/templates/apps/api/src/services/verified-email.ts +0 -71
  372. package/templates/apps/mcp/__tests__/abuse/daily-cap.test.ts +0 -52
  373. package/templates/apps/mcp/__tests__/abuse/email-validator.test.ts +0 -46
  374. package/templates/apps/mcp/__tests__/abuse/guard.test.ts +0 -198
  375. package/templates/apps/mcp/__tests__/abuse/honeypot.test.ts +0 -36
  376. package/templates/apps/mcp/__tests__/abuse/user-agent-deny.test.ts +0 -54
  377. package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +0 -116
  378. package/templates/apps/mcp/__tests__/audit-single-page.test.ts +0 -299
  379. package/templates/apps/mcp/__tests__/boot.test.ts +0 -280
  380. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +0 -359
  381. package/templates/apps/mcp/__tests__/config/modules.test.ts +0 -78
  382. package/templates/apps/mcp/__tests__/get_business_hours.test.ts +0 -82
  383. package/templates/apps/mcp/__tests__/get_faq.test.ts +0 -80
  384. package/templates/apps/mcp/__tests__/get_locations.test.ts +0 -65
  385. package/templates/apps/mcp/__tests__/get_offerings.test.ts +0 -557
  386. package/templates/apps/mcp/__tests__/get_pricing.test.ts +0 -524
  387. package/templates/apps/mcp/__tests__/get_site_info.test.ts +0 -81
  388. package/templates/apps/mcp/__tests__/http-transport.test.ts +0 -1151
  389. package/templates/apps/mcp/__tests__/index.test.ts +0 -195
  390. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +0 -191
  391. package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +0 -531
  392. package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +0 -65
  393. package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -187
  394. package/templates/apps/mcp/__tests__/lib/content-root.test.ts +0 -93
  395. package/templates/apps/mcp/__tests__/lib/errors.test.ts +0 -75
  396. package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +0 -165
  397. package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +0 -124
  398. package/templates/apps/mcp/__tests__/list_pages.test.ts +0 -228
  399. package/templates/apps/mcp/__tests__/locale.test.ts +0 -135
  400. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +0 -175
  401. package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +0 -101
  402. package/templates/apps/mcp/__tests__/read_content.test.ts +0 -474
  403. package/templates/apps/mcp/__tests__/request_callback.test.ts +0 -225
  404. package/templates/apps/mcp/__tests__/search_content.test.ts +0 -256
  405. package/templates/apps/mcp/__tests__/server.test.ts +0 -388
  406. package/templates/apps/mcp/__tests__/start_purchase.test.ts +0 -448
  407. package/templates/apps/mcp/__tests__/submit_lead.test.ts +0 -307
  408. package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +0 -223
  409. package/templates/apps/mcp/__tests__/tools/create_project.test.ts +0 -243
  410. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +0 -451
  411. package/templates/apps/mcp/src/abuse/daily-cap.ts +0 -47
  412. package/templates/apps/mcp/src/abuse/email-validator.ts +0 -25
  413. package/templates/apps/mcp/src/abuse/honeypot.ts +0 -21
  414. package/templates/apps/mcp/src/abuse/index.ts +0 -342
  415. package/templates/apps/mcp/src/abuse/user-agent-deny.ts +0 -58
  416. package/templates/apps/mcp/src/boot.ts +0 -167
  417. package/templates/apps/mcp/src/config/modules.ts +0 -43
  418. package/templates/apps/mcp/src/http-transport.ts +0 -526
  419. package/templates/apps/mcp/src/lib/audit-single-page.ts +0 -308
  420. package/templates/apps/mcp/src/lib/commerce-claim.ts +0 -263
  421. package/templates/apps/mcp/src/lib/content-adapter.ts +0 -142
  422. package/templates/apps/mcp/src/lib/empty-content-adapter.ts +0 -139
  423. package/templates/apps/mcp/src/lib/errors.ts +0 -61
  424. package/templates/apps/mcp/src/lib/license-key-store.ts +0 -45
  425. package/templates/apps/mcp/src/lib/locales.ts +0 -171
  426. package/templates/apps/mcp/src/lib/prisma.ts +0 -39
  427. package/templates/apps/mcp/src/lib/public-workspace.ts +0 -133
  428. package/templates/apps/mcp/src/lib/resolve-locale.ts +0 -30
  429. package/templates/apps/mcp/src/lib/shown-offerings.ts +0 -105
  430. package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +0 -59
  431. package/templates/apps/mcp/src/request-context.ts +0 -52
  432. package/templates/apps/mcp/src/server.ts +0 -343
  433. package/templates/apps/mcp/src/serverless-app.ts +0 -88
  434. package/templates/apps/mcp/src/tools/audit.ts +0 -127
  435. package/templates/apps/mcp/src/tools/capture_lead.ts +0 -64
  436. package/templates/apps/mcp/src/tools/create_project.ts +0 -134
  437. package/templates/apps/mcp/src/tools/get_business_hours.ts +0 -68
  438. package/templates/apps/mcp/src/tools/get_faq.ts +0 -71
  439. package/templates/apps/mcp/src/tools/get_locations.ts +0 -88
  440. package/templates/apps/mcp/src/tools/get_offerings.ts +0 -96
  441. package/templates/apps/mcp/src/tools/get_pricing.ts +0 -94
  442. package/templates/apps/mcp/src/tools/get_site_info.ts +0 -86
  443. package/templates/apps/mcp/src/tools/index.ts +0 -137
  444. package/templates/apps/mcp/src/tools/list_pages.ts +0 -74
  445. package/templates/apps/mcp/src/tools/person_notes.ts +0 -25
  446. package/templates/apps/mcp/src/tools/proposals.ts +0 -27
  447. package/templates/apps/mcp/src/tools/purchase.ts +0 -205
  448. package/templates/apps/mcp/src/tools/read_content.ts +0 -75
  449. package/templates/apps/mcp/src/tools/request_callback.ts +0 -59
  450. package/templates/apps/mcp/src/tools/search_content.ts +0 -67
  451. package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +0 -57
  452. package/templates/apps/mcp/src/workspace-server.ts +0 -224
  453. package/templates/database/CHANGELOG.md +0 -961
  454. package/templates/database/LICENSE +0 -202
  455. package/templates/database/NOTICE +0 -2
  456. package/templates/database/README.md +0 -243
  457. package/templates/database/__tests__/agents.db.test.ts +0 -320
  458. package/templates/database/__tests__/appointment.db.test.ts +0 -106
  459. package/templates/database/__tests__/artifact-content-store.db.test.ts +0 -316
  460. package/templates/database/__tests__/composite-fence.db.test.ts +0 -206
  461. package/templates/database/__tests__/consent-ledger.db.test.ts +0 -345
  462. package/templates/database/__tests__/consent-source-checkout-migration.test.ts +0 -79
  463. package/templates/database/__tests__/fence-fan-out.db.test.ts +0 -715
  464. package/templates/database/__tests__/fixtures/appointment-create-probe.ts +0 -79
  465. package/templates/database/__tests__/fixtures/person-backfill.json +0 -264
  466. package/templates/database/__tests__/fixtures/person-contact-backfill.json +0 -182
  467. package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +0 -100
  468. package/templates/database/__tests__/flow-completion-migration.test.ts +0 -115
  469. package/templates/database/__tests__/flow-completion.db.test.ts +0 -136
  470. package/templates/database/__tests__/flow-workspace-key.db.test.ts +0 -263
  471. package/templates/database/__tests__/flows-listing-diagnostic.test.ts +0 -392
  472. package/templates/database/__tests__/flows-presets.test.ts +0 -173
  473. package/templates/database/__tests__/in-page-magnets-migration.test.ts +0 -161
  474. package/templates/database/__tests__/lead-idempotency-key.db.test.ts +0 -92
  475. package/templates/database/__tests__/member-area.db.test.ts +0 -257
  476. package/templates/database/__tests__/member-contract-migration.test.ts +0 -85
  477. package/templates/database/__tests__/member-contract.db.test.ts +0 -413
  478. package/templates/database/__tests__/offerings-checkout-session.db.test.ts +0 -270
  479. package/templates/database/__tests__/offerings-migration.test.ts +0 -197
  480. package/templates/database/__tests__/offerings-shown-price-ids-migration.test.ts +0 -86
  481. package/templates/database/__tests__/offerings.db.test.ts +0 -303
  482. package/templates/database/__tests__/outbound-message-action.db.test.ts +0 -80
  483. package/templates/database/__tests__/person-contact.db.test.ts +0 -563
  484. package/templates/database/__tests__/person-notes.db.test.ts +0 -249
  485. package/templates/database/__tests__/person.db.test.ts +0 -586
  486. package/templates/database/__tests__/piece-kind-migration.test.ts +0 -67
  487. package/templates/database/__tests__/piece-kind.db.test.ts +0 -208
  488. package/templates/database/__tests__/prefixed-ids.db.test.ts +0 -222
  489. package/templates/database/__tests__/project-listing-consent-at.db.test.ts +0 -111
  490. package/templates/database/__tests__/seed.test.ts +0 -240
  491. package/templates/database/__tests__/spoke-registry.db.test.ts +0 -191
  492. package/templates/database/__tests__/tenancy.test.ts +0 -141
  493. package/templates/database/__tests__/user-cascade.test.ts +0 -140
  494. package/templates/database/_gitignore +0 -8
  495. package/templates/database/auth/.gitkeep +0 -0
  496. package/templates/database/auth/schema.prisma +0 -641
  497. package/templates/database/config/.gitkeep +0 -0
  498. package/templates/database/config/schema.prisma +0 -441
  499. package/templates/database/content/.gitkeep +0 -0
  500. package/templates/database/content/schema.prisma +0 -339
  501. package/templates/database/eslint.config.mjs +0 -69
  502. package/templates/database/flows/listing-diagnostic.ts +0 -182
  503. package/templates/database/flows/presets.ts +0 -315
  504. package/templates/database/inbox/.gitkeep +0 -0
  505. package/templates/database/inbox/README.md +0 -3
  506. package/templates/database/inbox/__tests__/schema.test.ts +0 -44
  507. package/templates/database/inbox/schema.prisma +0 -1447
  508. package/templates/database/jest.config.cjs +0 -36
  509. package/templates/database/migrations/20260508000000_add_inbox_namespace/migration.sql +0 -328
  510. package/templates/database/migrations/20260513000000_better_auth_migration/migration.sql +0 -100
  511. package/templates/database/migrations/20260515000000_add_user_billing_fields/migration.sql +0 -28
  512. package/templates/database/migrations/20260516000000_add_user_tier_care_plan_seat/migration.sql +0 -25
  513. package/templates/database/migrations/20260518000000_add_telemetry_records/migration.sql +0 -42
  514. package/templates/database/migrations/20260525000000_theme_wiring/migration.sql +0 -67
  515. package/templates/database/migrations/20260710000000_retire_commercial_tier/migration.sql +0 -21
  516. package/templates/database/migrations/20260712215647_add_multi_tenant_tenancy/migration.sql +0 -201
  517. package/templates/database/migrations/20260713143320_reanchor_site_config_to_workspace/migration.sql +0 -67
  518. package/templates/database/migrations/20260713174000_add_audit_logs/migration.sql +0 -46
  519. package/templates/database/migrations/20260713190000_drop_telemetry_records/migration.sql +0 -25
  520. package/templates/database/migrations/20260713192000_add_uuidv7_function/migration.sql +0 -49
  521. package/templates/database/migrations/20260713192429_prefixed_uuid_entity_ids/migration.sql +0 -197
  522. package/templates/database/migrations/20260713200000_add_org_billing/migration.sql +0 -32
  523. package/templates/database/migrations/20260714000000_add_lead_promotion_fields/migration.sql +0 -22
  524. package/templates/database/migrations/20260714010000_add_usage_billing_content_models/migration.sql +0 -151
  525. package/templates/database/migrations/20260714020000_add_usage_billing_auth_config_models/migration.sql +0 -223
  526. package/templates/database/migrations/20260714030000_credit_balance_non_negative/migration.sql +0 -22
  527. package/templates/database/migrations/20260714030000_widen_usage_billing_report_aggregates/migration.sql +0 -32
  528. package/templates/database/migrations/20260810233516_add_flow_engine_models/migration.sql +0 -40
  529. package/templates/database/migrations/20260811020000_add_flow_session_abandon_email_columns/migration.sql +0 -4
  530. package/templates/database/migrations/20260811030000_add_flow_session_abandon_email_index/migration.sql +0 -2
  531. package/templates/database/migrations/20260811040000_add_flow_session_segment/migration.sql +0 -2
  532. package/templates/database/migrations/20260811050000_add_deliverable_models/migration.sql +0 -29
  533. package/templates/database/migrations/20260812000000_add_deliverable_grant_send_columns/migration.sql +0 -6
  534. package/templates/database/migrations/20260902222948_add_waitlist_experiment_models/migration.sql +0 -39
  535. package/templates/database/migrations/20260902224500_add_waitlist_id_format_checks/migration.sql +0 -24
  536. package/templates/database/migrations/20260903004112_add_flow_session_flags_aeo_score/migration.sql +0 -3
  537. package/templates/database/migrations/20260903010000_add_playbook_instance/migration.sql +0 -33
  538. package/templates/database/migrations/20260904000000_add_waitlist_followup_send/migration.sql +0 -30
  539. package/templates/database/migrations/20260905230000_add_flow_checkout/migration.sql +0 -47
  540. package/templates/database/migrations/20260906000000_add_flow_checkout_idempotency/migration.sql +0 -16
  541. package/templates/database/migrations/20260907120000_add_project_listing/migration.sql +0 -47
  542. package/templates/database/migrations/20260907130000_add_project_listing_slack_columns/migration.sql +0 -10
  543. package/templates/database/migrations/20260907180000_add_listing_csv_send/migration.sql +0 -26
  544. package/templates/database/migrations/20260909120000_project_listings_platform/migration.sql +0 -90
  545. package/templates/database/migrations/20260909180000_listing_draft_and_fields/migration.sql +0 -174
  546. package/templates/database/migrations/20260910120000_listing_public_site_key/migration.sql +0 -14
  547. package/templates/database/migrations/20260911120000_listing_copy_edit_audit/migration.sql +0 -25
  548. package/templates/database/migrations/20260911140000_listing_structured_address/migration.sql +0 -32
  549. package/templates/database/migrations/20260911180000_consent_grants/migration.sql +0 -71
  550. package/templates/database/migrations/20260911200000_listing_site_answers/migration.sql +0 -30
  551. package/templates/database/migrations/20260912120000_listing_owner_link/migration.sql +0 -49
  552. package/templates/database/migrations/20260914120000_listing_founder_identity/migration.sql +0 -123
  553. package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +0 -15
  554. package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +0 -158
  555. package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +0 -40
  556. package/templates/database/migrations/20260918120000_add_appointment/migration.sql +0 -67
  557. package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +0 -70
  558. package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +0 -181
  559. package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +0 -172
  560. package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +0 -41
  561. package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +0 -185
  562. package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +0 -70
  563. package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +0 -57
  564. package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +0 -68
  565. package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +0 -1067
  566. package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +0 -210
  567. package/templates/database/migrations/20261003120000_spoke_registry/migration.sql +0 -80
  568. package/templates/database/migrations/20261003130000_scheduling_connection/migration.sql +0 -49
  569. package/templates/database/migrations/20261005120000_agents/migration.sql +0 -84
  570. package/templates/database/migrations/20261008120000_user_last_workspace/migration.sql +0 -35
  571. package/templates/database/migrations/20261008130000_lead_idempotency_key/migration.sql +0 -20
  572. package/templates/database/migrations/20261009120000_agent_grants/migration.sql +0 -33
  573. package/templates/database/migrations/20261010120000_person/migration.sql +0 -106
  574. package/templates/database/migrations/20261010121000_person_backfill/migration.sql +0 -132
  575. package/templates/database/migrations/20261010130000_agent_grants_people_read/migration.sql +0 -20
  576. package/templates/database/migrations/20261011120000_member_area/migration.sql +0 -158
  577. package/templates/database/migrations/20261011130000_agent_grants_member_pieces_manage/migration.sql +0 -21
  578. package/templates/database/migrations/20261012120000_member_contract/migration.sql +0 -192
  579. package/templates/database/migrations/20261013120000_lead_spoke_checkout/migration.sql +0 -20
  580. package/templates/database/migrations/20261014120000_consent_ledger/migration.sql +0 -122
  581. package/templates/database/migrations/20261014120000_person_contact/migration.sql +0 -231
  582. package/templates/database/migrations/20261015120000_person_notes/migration.sql +0 -77
  583. package/templates/database/migrations/20261015120000_rate_limit_counters/migration.sql +0 -43
  584. package/templates/database/migrations/20261016120000_piece_kind/migration.sql +0 -95
  585. package/templates/database/migrations/20261017120000_outbound_message_action/migration.sql +0 -30
  586. package/templates/database/migrations/20261018120000_flow_completion/migration.sql +0 -52
  587. package/templates/database/migrations/20261019120000_consent_source_checkout/migration.sql +0 -27
  588. package/templates/database/migrations/20261020120000_offerings_data_model/migration.sql +0 -146
  589. package/templates/database/migrations/20261021120000_offerings_checkout_session/migration.sql +0 -77
  590. package/templates/database/migrations/20261022120000_in_page_magnets/migration.sql +0 -45
  591. package/templates/database/migrations/20261023120000_offerings_shown_price_ids/migration.sql +0 -47
  592. package/templates/database/migrations/20261024120000_organization_plan_checkout_session/migration.sql +0 -16
  593. package/templates/database/migrations/migration_lock.toml +0 -3
  594. package/templates/database/ops/.gitkeep +0 -0
  595. package/templates/database/ops/schema.prisma +0 -43
  596. package/templates/database/package.json +0 -89
  597. package/templates/database/schema.prisma +0 -71
  598. package/templates/database/scripts/db-generate-locked.sh +0 -80
  599. package/templates/database/scripts/person-backfill.sql +0 -132
  600. package/templates/database/tenancy.ts +0 -183
  601. package/templates/database/tsconfig.build.json +0 -16
  602. package/templates/database/tsconfig.flows.json +0 -15
  603. package/templates/database/tsconfig.json +0 -16
  604. 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