@openlup/platform 0.0.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/LICENSE +204 -0
  3. package/README.md +471 -1
  4. package/dist/bff/dispatch.d.ts +27 -0
  5. package/dist/bff/dispatch.js +47 -0
  6. package/dist/bff/envelope.d.ts +46 -0
  7. package/dist/bff/envelope.js +80 -0
  8. package/dist/bff/health.d.ts +24 -0
  9. package/dist/bff/health.js +19 -0
  10. package/dist/bff/index.d.ts +6 -0
  11. package/dist/bff/index.js +6 -0
  12. package/dist/bff/lazyRoute.d.ts +4 -0
  13. package/dist/bff/lazyRoute.js +13 -0
  14. package/dist/bff/requestContext.d.ts +17 -0
  15. package/dist/bff/requestContext.js +26 -0
  16. package/dist/bff/routerRewrite.d.ts +2 -0
  17. package/dist/bff/routerRewrite.js +31 -0
  18. package/dist/blob/binding.d.ts +16 -0
  19. package/dist/blob/binding.js +37 -0
  20. package/dist/blob/filesystem.d.ts +8 -0
  21. package/dist/blob/filesystem.js +71 -0
  22. package/dist/blob/index.d.ts +6 -0
  23. package/dist/blob/index.js +6 -0
  24. package/dist/blob/s3.d.ts +32 -0
  25. package/dist/blob/s3.js +56 -0
  26. package/dist/blob/s3Client.d.ts +25 -0
  27. package/dist/blob/s3Client.js +76 -0
  28. package/dist/blob/supabase.d.ts +40 -0
  29. package/dist/blob/supabase.js +59 -0
  30. package/dist/blob/vercel.d.ts +63 -0
  31. package/dist/blob/vercel.js +69 -0
  32. package/dist/composition/composeBundle.d.ts +47 -0
  33. package/dist/composition/composeBundle.js +45 -0
  34. package/dist/composition/httpBinding.d.ts +8 -0
  35. package/dist/composition/httpBinding.js +18 -0
  36. package/dist/composition/index.d.ts +3 -0
  37. package/dist/composition/index.js +3 -0
  38. package/dist/composition/nodeHost.d.ts +103 -0
  39. package/dist/composition/nodeHost.js +145 -0
  40. package/dist/data/binding.d.ts +34 -0
  41. package/dist/data/binding.js +92 -0
  42. package/dist/data/index.d.ts +5 -0
  43. package/dist/data/index.js +5 -0
  44. package/dist/data/postgresGateway.d.ts +42 -0
  45. package/dist/data/postgresGateway.js +135 -0
  46. package/dist/data/queryBuilder.d.ts +54 -0
  47. package/dist/data/queryBuilder.js +240 -0
  48. package/dist/data/queryBuilderSql.d.ts +76 -0
  49. package/dist/data/queryBuilderSql.js +145 -0
  50. package/dist/data/supabaseClientFactory.d.ts +34 -0
  51. package/dist/data/supabaseClientFactory.js +56 -0
  52. package/dist/data/supabaseGateway.d.ts +22 -0
  53. package/dist/data/supabaseGateway.js +49 -0
  54. package/dist/http/deadline.d.ts +20 -0
  55. package/dist/http/deadline.js +93 -0
  56. package/dist/http/index.d.ts +6 -0
  57. package/dist/http/index.js +5 -0
  58. package/dist/http/requestAdapter.d.ts +38 -0
  59. package/dist/http/requestAdapter.js +203 -0
  60. package/dist/http/runtime.d.ts +83 -0
  61. package/dist/http/runtime.js +199 -0
  62. package/dist/http/security.d.ts +44 -0
  63. package/dist/http/security.js +114 -0
  64. package/dist/http/staticAssets.d.ts +3 -0
  65. package/dist/http/staticAssets.js +42 -0
  66. package/dist/http/types.d.ts +23 -0
  67. package/dist/http/types.js +6 -0
  68. package/dist/identity/adminAuthBinding.d.ts +28 -0
  69. package/dist/identity/adminAuthBinding.js +66 -0
  70. package/dist/identity/adminAuthorization.d.ts +34 -0
  71. package/dist/identity/adminAuthorization.js +72 -0
  72. package/dist/identity/adminContracts.d.ts +70 -0
  73. package/dist/identity/adminContracts.js +43 -0
  74. package/dist/identity/adminMagicLinkHandler.d.ts +39 -0
  75. package/dist/identity/adminMagicLinkHandler.js +94 -0
  76. package/dist/identity/adminMeHandler.d.ts +15 -0
  77. package/dist/identity/adminMeHandler.js +49 -0
  78. package/dist/identity/adminPreflight.d.ts +16 -0
  79. package/dist/identity/adminPreflight.js +38 -0
  80. package/dist/identity/adminUserActionPorts.d.ts +31 -0
  81. package/dist/identity/adminUserActionPorts.js +51 -0
  82. package/dist/identity/adminUserHandlers.d.ts +38 -0
  83. package/dist/identity/adminUserHandlers.js +140 -0
  84. package/dist/identity/authVerifyUrl.d.ts +6 -0
  85. package/dist/identity/authVerifyUrl.js +54 -0
  86. package/dist/identity/contracts/contracts.d.ts +8 -0
  87. package/dist/identity/contracts/contracts.js +2 -0
  88. package/dist/identity/contracts/emailTrust.d.ts +3 -0
  89. package/dist/identity/contracts/emailTrust.js +4 -0
  90. package/dist/identity/contracts/index.d.ts +8 -0
  91. package/dist/identity/contracts/index.js +8 -0
  92. package/dist/identity/contracts/oidc.d.ts +3 -0
  93. package/dist/identity/contracts/oidc.js +9 -0
  94. package/dist/identity/contracts/operatorAuth.d.ts +35 -0
  95. package/dist/identity/contracts/operatorAuth.js +53 -0
  96. package/dist/identity/contracts/operatorInvitations.d.ts +37 -0
  97. package/dist/identity/contracts/operatorInvitations.js +1 -0
  98. package/dist/identity/contracts/ports.d.ts +22 -0
  99. package/dist/identity/contracts/ports.js +1 -0
  100. package/dist/identity/contracts/privacy.d.ts +62 -0
  101. package/dist/identity/contracts/privacy.js +99 -0
  102. package/dist/identity/contracts/providerList.d.ts +3 -0
  103. package/dist/identity/contracts/providerList.js +11 -0
  104. package/dist/identity/contracts/types.d.ts +16 -0
  105. package/dist/identity/contracts/types.js +4 -0
  106. package/dist/identity/contribution.d.ts +8 -0
  107. package/dist/identity/contribution.js +22 -0
  108. package/dist/identity/customerAuth.d.ts +8 -0
  109. package/dist/identity/customerAuth.js +1 -0
  110. package/dist/identity/customerAuthorization.d.ts +5 -0
  111. package/dist/identity/customerAuthorization.js +22 -0
  112. package/dist/identity/customerContracts.d.ts +42 -0
  113. package/dist/identity/customerContracts.js +43 -0
  114. package/dist/identity/customerIdentityBinding.d.ts +44 -0
  115. package/dist/identity/customerIdentityBinding.js +60 -0
  116. package/dist/identity/customerIdentityVerifier.d.ts +8 -0
  117. package/dist/identity/customerIdentityVerifier.js +101 -0
  118. package/dist/identity/customerMagicLinkHandler.d.ts +38 -0
  119. package/dist/identity/customerMagicLinkHandler.js +115 -0
  120. package/dist/identity/customerMeHandler.d.ts +11 -0
  121. package/dist/identity/customerMeHandler.js +46 -0
  122. package/dist/identity/customerPorts.d.ts +4 -0
  123. package/dist/identity/customerPorts.js +1 -0
  124. package/dist/identity/customerSessionBinding.d.ts +38 -0
  125. package/dist/identity/customerSessionBinding.js +80 -0
  126. package/dist/identity/customerSessionIssuer.d.ts +10 -0
  127. package/dist/identity/customerSessionIssuer.js +57 -0
  128. package/dist/identity/customerVerifyOtpHandler.d.ts +8 -0
  129. package/dist/identity/customerVerifyOtpHandler.js +41 -0
  130. package/dist/identity/directOperatorInvitationStore.d.ts +19 -0
  131. package/dist/identity/directOperatorInvitationStore.js +193 -0
  132. package/dist/identity/emailTrustPolicy.d.ts +14 -0
  133. package/dist/identity/emailTrustPolicy.js +16 -0
  134. package/dist/identity/identityPersonalDataContributor.d.ts +7 -0
  135. package/dist/identity/identityPersonalDataContributor.js +46 -0
  136. package/dist/identity/identityReadiness.d.ts +10 -0
  137. package/dist/identity/identityReadiness.js +25 -0
  138. package/dist/identity/index.d.ts +67 -0
  139. package/dist/identity/index.js +66 -0
  140. package/dist/identity/inviteAdminUserUseCase.d.ts +89 -0
  141. package/dist/identity/inviteAdminUserUseCase.js +75 -0
  142. package/dist/identity/jwtLibrary.d.ts +54 -0
  143. package/dist/identity/jwtLibrary.js +1 -0
  144. package/dist/identity/machineActorWriteFence.d.ts +4 -0
  145. package/dist/identity/machineActorWriteFence.js +13 -0
  146. package/dist/identity/magicLinkPorts.d.ts +28 -0
  147. package/dist/identity/magicLinkPorts.js +1 -0
  148. package/dist/identity/managedAccountLinkStore.d.ts +2 -0
  149. package/dist/identity/managedAccountLinkStore.js +93 -0
  150. package/dist/identity/managedAdminAuthVerifier.d.ts +7 -0
  151. package/dist/identity/managedAdminAuthVerifier.js +27 -0
  152. package/dist/identity/managedAdminUserGateways.d.ts +123 -0
  153. package/dist/identity/managedAdminUserGateways.js +127 -0
  154. package/dist/identity/managedClient.d.ts +90 -0
  155. package/dist/identity/managedClient.js +10 -0
  156. package/dist/identity/managedClientAuthLink.d.ts +3 -0
  157. package/dist/identity/managedClientAuthLink.js +115 -0
  158. package/dist/identity/managedCustomerMe.d.ts +13 -0
  159. package/dist/identity/managedCustomerMe.js +30 -0
  160. package/dist/identity/managedEmailTrustPolicy.d.ts +11 -0
  161. package/dist/identity/managedEmailTrustPolicy.js +105 -0
  162. package/dist/identity/managedIdentityVerifier.d.ts +2 -0
  163. package/dist/identity/managedIdentityVerifier.js +16 -0
  164. package/dist/identity/managedPrivacy.d.ts +4 -0
  165. package/dist/identity/managedPrivacy.js +39 -0
  166. package/dist/identity/messages.d.ts +29 -0
  167. package/dist/identity/messages.js +39 -0
  168. package/dist/identity/oidcIdentityVerifier.d.ts +45 -0
  169. package/dist/identity/oidcIdentityVerifier.js +309 -0
  170. package/dist/identity/oidcPrincipal.d.ts +2 -0
  171. package/dist/identity/oidcPrincipal.js +10 -0
  172. package/dist/identity/operatorAdminAuth.d.ts +6 -0
  173. package/dist/identity/operatorAdminAuth.js +13 -0
  174. package/dist/identity/operatorAuthHandlers.d.ts +18 -0
  175. package/dist/identity/operatorAuthHandlers.js +71 -0
  176. package/dist/identity/operatorIdentityVerifier.d.ts +8 -0
  177. package/dist/identity/operatorIdentityVerifier.js +19 -0
  178. package/dist/identity/operatorInvitationLifecycle.d.ts +7 -0
  179. package/dist/identity/operatorInvitationLifecycle.js +15 -0
  180. package/dist/identity/operatorInvitationPorts.d.ts +31 -0
  181. package/dist/identity/operatorInvitationPorts.js +1 -0
  182. package/dist/identity/operatorPorts.d.ts +37 -0
  183. package/dist/identity/operatorPorts.js +1 -0
  184. package/dist/identity/operatorSession.d.ts +13 -0
  185. package/dist/identity/operatorSession.js +31 -0
  186. package/dist/identity/operatorTokenAdminAuth.d.ts +15 -0
  187. package/dist/identity/operatorTokenAdminAuth.js +50 -0
  188. package/dist/identity/personalDataRegistry.d.ts +4 -0
  189. package/dist/identity/personalDataRegistry.js +11 -0
  190. package/dist/identity/platformAdminAuth.d.ts +15 -0
  191. package/dist/identity/platformAdminAuth.js +1 -0
  192. package/dist/identity/ports.d.ts +127 -0
  193. package/dist/identity/ports.js +38 -0
  194. package/dist/identity/postgresAccountLinkStore.d.ts +7 -0
  195. package/dist/identity/postgresAccountLinkStore.js +52 -0
  196. package/dist/identity/postgresCustomerMe.d.ts +3 -0
  197. package/dist/identity/postgresCustomerMe.js +21 -0
  198. package/dist/identity/postgresCustomerRecovery.d.ts +11 -0
  199. package/dist/identity/postgresCustomerRecovery.js +57 -0
  200. package/dist/identity/postgresOperatorIdentity.d.ts +5 -0
  201. package/dist/identity/postgresOperatorIdentity.js +137 -0
  202. package/dist/identity/postgresPrivacy.d.ts +7 -0
  203. package/dist/identity/postgresPrivacy.js +126 -0
  204. package/dist/identity/privacyHandlers.d.ts +10 -0
  205. package/dist/identity/privacyHandlers.js +35 -0
  206. package/dist/identity/privacyPorts.d.ts +72 -0
  207. package/dist/identity/privacyPorts.js +8 -0
  208. package/dist/identity/privacyUseCases.d.ts +5 -0
  209. package/dist/identity/privacyUseCases.js +55 -0
  210. package/dist/identity/reconcileAccountForPrincipal.d.ts +20 -0
  211. package/dist/identity/reconcileAccountForPrincipal.js +66 -0
  212. package/dist/identity/reconcileAccountHandler.d.ts +11 -0
  213. package/dist/identity/reconcileAccountHandler.js +30 -0
  214. package/dist/identity/removeAdminUserUseCase.d.ts +31 -0
  215. package/dist/identity/removeAdminUserUseCase.js +60 -0
  216. package/dist/identity/response.d.ts +3 -0
  217. package/dist/identity/response.js +2 -0
  218. package/dist/identity/sql.d.ts +44 -0
  219. package/dist/identity/sql.js +10 -0
  220. package/dist/job-ledger/index.d.ts +5 -0
  221. package/dist/job-ledger/index.js +3 -0
  222. package/dist/job-ledger/ports.d.ts +10 -0
  223. package/dist/job-ledger/ports.js +7 -0
  224. package/dist/job-ledger/postgres.d.ts +10 -0
  225. package/dist/job-ledger/postgres.js +101 -0
  226. package/dist/job-ledger/sql.d.ts +7 -0
  227. package/dist/job-ledger/sql.js +10 -0
  228. package/dist/job-ledger/supabase.d.ts +77 -0
  229. package/dist/job-ledger/supabase.js +202 -0
  230. package/dist/kernel/index.d.ts +1 -0
  231. package/dist/kernel/index.js +1 -0
  232. package/dist/kernel/platformKernel.d.ts +34 -0
  233. package/dist/kernel/platformKernel.js +115 -0
  234. package/dist/migrations/index.d.ts +1 -0
  235. package/dist/migrations/index.js +1 -0
  236. package/dist/migrations/postgresRunner.d.ts +50 -0
  237. package/dist/migrations/postgresRunner.js +176 -0
  238. package/dist/scheduler/advisoryLock.d.ts +44 -0
  239. package/dist/scheduler/advisoryLock.js +114 -0
  240. package/dist/scheduler/cronGuard.d.ts +10 -0
  241. package/dist/scheduler/cronGuard.js +19 -0
  242. package/dist/scheduler/cronSecret.d.ts +5 -0
  243. package/dist/scheduler/cronSecret.js +23 -0
  244. package/dist/scheduler/handlers.d.ts +9 -0
  245. package/dist/scheduler/handlers.js +10 -0
  246. package/dist/scheduler/httpEntry.d.ts +16 -0
  247. package/dist/scheduler/httpEntry.js +31 -0
  248. package/dist/scheduler/index.d.ts +9 -0
  249. package/dist/scheduler/index.js +9 -0
  250. package/dist/scheduler/jobRegistry.d.ts +21 -0
  251. package/dist/scheduler/jobRegistry.js +39 -0
  252. package/dist/scheduler/jobs.d.ts +48 -0
  253. package/dist/scheduler/jobs.js +92 -0
  254. package/dist/scheduler/nodeScheduler.d.ts +42 -0
  255. package/dist/scheduler/nodeScheduler.js +73 -0
  256. package/dist/scheduler/vercelScheduler.d.ts +29 -0
  257. package/dist/scheduler/vercelScheduler.js +51 -0
  258. package/package.json +116 -3
  259. package/release-gates.json +143 -0
  260. package/sql/20260809150000_job_run_ledger.sql +301 -0
  261. package/sql/20260809150001_job_run_ledger_v3.sql +70 -0
  262. package/sql/20260810180001_self_host_actor_auth.sql +40 -0
  263. package/sql/20260810204057_customer_identity_read.sql +31 -0
  264. package/sql/20260814090000_customer_selfservice_recovery.sql +477 -0
  265. package/sql/20260901143000_admin_membership_authority_foundation.sql +234 -0
  266. package/sql/20261018120000_identity_operator_invitations.sql +42 -0
  267. package/sql/20261018180000_identity_operator_challenges.sql +56 -0
  268. package/sql/20261018190000_identity_privacy_erasures.sql +15 -0
  269. package/src/bff/dispatch.ts +81 -0
  270. package/src/bff/envelope.ts +142 -0
  271. package/src/bff/health.ts +37 -0
  272. package/src/bff/index.ts +30 -0
  273. package/src/bff/lazyRoute.ts +28 -0
  274. package/src/bff/requestContext.ts +48 -0
  275. package/src/bff/routerRewrite.ts +38 -0
  276. package/src/blob/binding.ts +55 -0
  277. package/src/blob/filesystem.ts +86 -0
  278. package/src/blob/index.ts +17 -0
  279. package/src/blob/s3.ts +87 -0
  280. package/src/blob/s3Client.ts +91 -0
  281. package/src/blob/supabase.ts +88 -0
  282. package/src/blob/vercel.ts +127 -0
  283. package/src/composition/composeBundle.ts +109 -0
  284. package/src/composition/httpBinding.ts +30 -0
  285. package/src/composition/index.ts +17 -0
  286. package/src/composition/nodeHost.ts +289 -0
  287. package/src/data/binding.ts +157 -0
  288. package/src/data/index.ts +33 -0
  289. package/src/data/postgresGateway.ts +186 -0
  290. package/src/data/queryBuilder.ts +300 -0
  291. package/src/data/queryBuilderSql.ts +183 -0
  292. package/src/data/supabaseClientFactory.ts +92 -0
  293. package/src/data/supabaseGateway.ts +76 -0
  294. package/src/http/deadline.ts +117 -0
  295. package/src/http/index.ts +36 -0
  296. package/src/http/requestAdapter.ts +215 -0
  297. package/src/http/runtime.ts +319 -0
  298. package/src/http/security.ts +155 -0
  299. package/src/http/staticAssets.ts +42 -0
  300. package/src/http/types.ts +31 -0
  301. package/src/identity/adminAuthBinding.ts +76 -0
  302. package/src/identity/adminAuthorization.ts +106 -0
  303. package/src/identity/adminContracts.ts +52 -0
  304. package/src/identity/adminMagicLinkHandler.ts +132 -0
  305. package/src/identity/adminMeHandler.ts +64 -0
  306. package/src/identity/adminPreflight.ts +46 -0
  307. package/src/identity/adminUserActionPorts.ts +78 -0
  308. package/src/identity/adminUserHandlers.ts +174 -0
  309. package/src/identity/authVerifyUrl.ts +56 -0
  310. package/src/identity/contracts/contracts.ts +15 -0
  311. package/src/identity/contracts/emailTrust.ts +5 -0
  312. package/src/identity/contracts/index.ts +8 -0
  313. package/src/identity/contracts/oidc.ts +10 -0
  314. package/src/identity/contracts/operatorAuth.ts +61 -0
  315. package/src/identity/contracts/operatorInvitations.ts +32 -0
  316. package/src/identity/contracts/ports.ts +25 -0
  317. package/src/identity/contracts/privacy.ts +86 -0
  318. package/src/identity/contracts/providerList.ts +13 -0
  319. package/src/identity/contracts/types.ts +25 -0
  320. package/src/identity/contribution.ts +29 -0
  321. package/src/identity/customerAuth.ts +3 -0
  322. package/src/identity/customerAuthorization.ts +38 -0
  323. package/src/identity/customerContracts.ts +52 -0
  324. package/src/identity/customerIdentityBinding.ts +125 -0
  325. package/src/identity/customerIdentityVerifier.ts +141 -0
  326. package/src/identity/customerMagicLinkHandler.ts +171 -0
  327. package/src/identity/customerMeHandler.ts +64 -0
  328. package/src/identity/customerPorts.ts +2 -0
  329. package/src/identity/customerSessionBinding.ts +114 -0
  330. package/src/identity/customerSessionIssuer.ts +71 -0
  331. package/src/identity/customerVerifyOtpHandler.ts +44 -0
  332. package/src/identity/directOperatorInvitationStore.ts +178 -0
  333. package/src/identity/emailTrustPolicy.ts +16 -0
  334. package/src/identity/identityPersonalDataContributor.ts +48 -0
  335. package/src/identity/identityReadiness.ts +26 -0
  336. package/src/identity/index.ts +69 -0
  337. package/src/identity/inviteAdminUserUseCase.ts +134 -0
  338. package/src/identity/jwtLibrary.ts +24 -0
  339. package/src/identity/machineActorWriteFence.ts +19 -0
  340. package/src/identity/magicLinkPorts.ts +7 -0
  341. package/src/identity/managedAccountLinkStore.ts +105 -0
  342. package/src/identity/managedAdminAuthVerifier.ts +40 -0
  343. package/src/identity/managedAdminUserGateways.ts +164 -0
  344. package/src/identity/managedClient.ts +58 -0
  345. package/src/identity/managedClientAuthLink.ts +120 -0
  346. package/src/identity/managedCustomerMe.ts +52 -0
  347. package/src/identity/managedEmailTrustPolicy.ts +90 -0
  348. package/src/identity/managedIdentityVerifier.ts +20 -0
  349. package/src/identity/managedPrivacy.ts +37 -0
  350. package/src/identity/messages.ts +41 -0
  351. package/src/identity/oidcIdentityVerifier.ts +229 -0
  352. package/src/identity/oidcPrincipal.ts +10 -0
  353. package/src/identity/operatorAdminAuth.ts +14 -0
  354. package/src/identity/operatorAuthHandlers.ts +52 -0
  355. package/src/identity/operatorIdentityVerifier.ts +19 -0
  356. package/src/identity/operatorInvitationLifecycle.ts +14 -0
  357. package/src/identity/operatorInvitationPorts.ts +11 -0
  358. package/src/identity/operatorPorts.ts +11 -0
  359. package/src/identity/operatorSession.ts +30 -0
  360. package/src/identity/operatorTokenAdminAuth.ts +79 -0
  361. package/src/identity/personalDataRegistry.ts +8 -0
  362. package/src/identity/platformAdminAuth.ts +7 -0
  363. package/src/identity/ports.ts +158 -0
  364. package/src/identity/postgresAccountLinkStore.ts +49 -0
  365. package/src/identity/postgresCustomerMe.ts +33 -0
  366. package/src/identity/postgresCustomerRecovery.ts +72 -0
  367. package/src/identity/postgresOperatorIdentity.ts +123 -0
  368. package/src/identity/postgresPrivacy.ts +117 -0
  369. package/src/identity/privacyHandlers.ts +33 -0
  370. package/src/identity/privacyPorts.ts +52 -0
  371. package/src/identity/privacyUseCases.ts +48 -0
  372. package/src/identity/reconcileAccountForPrincipal.ts +99 -0
  373. package/src/identity/reconcileAccountHandler.ts +36 -0
  374. package/src/identity/removeAdminUserUseCase.ts +85 -0
  375. package/src/identity/response.ts +3 -0
  376. package/src/identity/sql.ts +10 -0
  377. package/src/job-ledger/index.ts +25 -0
  378. package/src/job-ledger/ports.ts +27 -0
  379. package/src/job-ledger/postgres.ts +121 -0
  380. package/src/job-ledger/sql.ts +12 -0
  381. package/src/job-ledger/supabase.ts +294 -0
  382. package/src/kernel/index.ts +17 -0
  383. package/src/kernel/platformKernel.ts +153 -0
  384. package/src/migrations/index.ts +10 -0
  385. package/src/migrations/postgresRunner.ts +255 -0
  386. package/src/scheduler/advisoryLock.ts +145 -0
  387. package/src/scheduler/cronGuard.ts +30 -0
  388. package/src/scheduler/cronSecret.ts +26 -0
  389. package/src/scheduler/handlers.ts +24 -0
  390. package/src/scheduler/httpEntry.ts +49 -0
  391. package/src/scheduler/index.ts +47 -0
  392. package/src/scheduler/jobRegistry.ts +57 -0
  393. package/src/scheduler/jobs.ts +119 -0
  394. package/src/scheduler/nodeScheduler.ts +123 -0
  395. package/src/scheduler/vercelScheduler.ts +71 -0
@@ -0,0 +1,9 @@
1
+ export { jobIdFromPath, jobRegistryFromConfig, loadJobRegistry, } from "./jobRegistry.js";
2
+ export { advisoryLockKey, createEnvAdvisoryLock, createNoopAdvisoryLock, createPgAdvisoryLock, } from "./advisoryLock.js";
3
+ export { createNodeScheduler, withAdvisoryLock, } from "./nodeScheduler.js";
4
+ export { bearerToken, createVercelScheduler, verifyCronAuth, } from "./vercelScheduler.js";
5
+ export { authorizeCron } from "./cronGuard.js";
6
+ export { cronSecretMatches } from "./cronSecret.js";
7
+ export { mergeScheduledJobHandlers, } from "./handlers.js";
8
+ export { createScheduledJobRegistry, cronFromCadenceSeconds, runScheduledJob, scheduledJobsFromContribution, } from "./jobs.js";
9
+ export { createScheduledJobHttpEntry } from "./httpEntry.js";
@@ -0,0 +1,21 @@
1
+ /** A scheduled job declared by path in the platform-runtime configuration (HTTP-invoked). */
2
+ export interface ScheduledJobDeclaration {
3
+ /** Stable job id used for advisory locking + job-run accounting (derived from the cron path). */
4
+ jobId: string;
5
+ /** Crontab expression (UTC), exactly as authored in the platform-runtime configuration. */
6
+ schedule: string;
7
+ /** The app endpoint a self-hosted scheduler invokes (Vercel cron hits this directly). */
8
+ path: string;
9
+ }
10
+ export interface PlatformRuntimeConfig {
11
+ crons?: Array<{
12
+ path: string;
13
+ schedule: string;
14
+ }>;
15
+ }
16
+ /** Derive the canonical jobId from a cron path: `/api/cron/nightly-report` -> `nightly-report`. */
17
+ export declare function jobIdFromPath(path: string): string;
18
+ /** Build the job registry from the deployment's platform-runtime configuration file. */
19
+ export declare function loadJobRegistry(configPath: string): ScheduledJobDeclaration[];
20
+ /** Same registry but built from an already-parsed config object (pure; no filesystem). */
21
+ export declare function jobRegistryFromConfig(config: PlatformRuntimeConfig): ScheduledJobDeclaration[];
@@ -0,0 +1,39 @@
1
+ // Scheduler job registry.
2
+ //
3
+ // SINGLE SOURCE: the cron job list is DERIVED from the deployment's platform-runtime
4
+ // configuration `crons` (the single source from which an adopter may generate a provider
5
+ // manifest), never a hand-copied list. Both scheduler adapters (hosted cron and node-cron) read
6
+ // this same registry so the set of jobs, their schedules, and their endpoint paths can never drift
7
+ // between providers.
8
+ //
9
+ // Pure: reads the configuration file the caller names, or an already-parsed object. No infra
10
+ // imports, no I/O against the network.
11
+ import { readFileSync } from "node:fs";
12
+ /** Derive the canonical jobId from a cron path: `/api/cron/nightly-report` -> `nightly-report`. */
13
+ export function jobIdFromPath(path) {
14
+ const trimmed = path.replace(/\/+$/, "");
15
+ const last = trimmed.split("/").filter(Boolean).pop();
16
+ if (!last) {
17
+ throw new Error(`scheduler: cannot derive jobId from cron path "${path}"`);
18
+ }
19
+ return last;
20
+ }
21
+ /** Build the job registry from the deployment's platform-runtime configuration file. */
22
+ export function loadJobRegistry(configPath) {
23
+ const raw = readFileSync(configPath, "utf8");
24
+ const config = JSON.parse(raw);
25
+ const crons = config.crons ?? [];
26
+ return crons.map((cron) => ({
27
+ jobId: jobIdFromPath(cron.path),
28
+ schedule: cron.schedule,
29
+ path: cron.path,
30
+ }));
31
+ }
32
+ /** Same registry but built from an already-parsed config object (pure; no filesystem). */
33
+ export function jobRegistryFromConfig(config) {
34
+ return (config.crons ?? []).map((cron) => ({
35
+ jobId: jobIdFromPath(cron.path),
36
+ schedule: cron.schedule,
37
+ path: cron.path,
38
+ }));
39
+ }
@@ -0,0 +1,48 @@
1
+ import type { JobLeasePort, PlatformJobFinishSummary, PlatformJobInvocation } from "@openlup/core/platform-runtime";
2
+ export interface ScheduledJobContext {
3
+ /** Who triggered this run; evidence only, never an authorization control. */
4
+ readonly invocation: PlatformJobInvocation;
5
+ /** The lease's run id when the job declares a lease. */
6
+ readonly runId?: string;
7
+ readonly signal?: AbortSignal;
8
+ }
9
+ export interface ScheduledJob {
10
+ readonly id: string;
11
+ /** Crontab expression (UTC). */
12
+ readonly schedule: string;
13
+ /** Claim a job-run lease of this many seconds before running. */
14
+ readonly lease?: {
15
+ readonly seconds: number;
16
+ };
17
+ run(context: ScheduledJobContext): Promise<PlatformJobFinishSummary | void> | PlatformJobFinishSummary | void;
18
+ }
19
+ export type ScheduledJobRunResult = {
20
+ readonly status: "completed";
21
+ readonly summary: PlatformJobFinishSummary | null;
22
+ } | {
23
+ readonly status: "skipped";
24
+ readonly reason: string;
25
+ };
26
+ /** Merge contributed jobs into one registry; refuses a duplicate id or an empty id or schedule. */
27
+ export declare function createScheduledJobRegistry(...contributions: ReadonlyArray<readonly ScheduledJob[]>): readonly ScheduledJob[];
28
+ /**
29
+ * The cron expression for a fixed cadence: a whole number of minutes that divides an hour, or a
30
+ * whole number of hours that divides a day. Any other cadence is refused rather than approximated.
31
+ */
32
+ export declare function cronFromCadenceSeconds(cadenceSeconds: number): string;
33
+ /**
34
+ * Jobs for a package contribution's cadence schedules; each run passes the invocation through. A
35
+ * run that reports `{ outcome: "failed" }` instead of throwing fails the job, so neither transport
36
+ * reports it as completed.
37
+ */
38
+ export declare function scheduledJobsFromContribution(schedules: ReadonlyArray<{
39
+ id: string;
40
+ cadenceSeconds: number;
41
+ run: (invocation: PlatformJobInvocation) => unknown;
42
+ }>): ScheduledJob[];
43
+ /** Run one job once, under its lease when it declares one. */
44
+ export declare function runScheduledJob(job: ScheduledJob, options: {
45
+ invocation: PlatformJobInvocation;
46
+ lease?: JobLeasePort;
47
+ signal?: AbortSignal;
48
+ }): Promise<ScheduledJobRunResult>;
@@ -0,0 +1,92 @@
1
+ // Transport-neutral scheduled jobs.
2
+ //
3
+ // A job is `{ id, schedule, lease?, run(context) }`. Domains and packages contribute jobs to a
4
+ // registry; a host runs them on its own timer or through an authenticated HTTP cron entry, and both
5
+ // call the same `run`. The in-process path carries no HTTP secret. When a job declares a lease, the
6
+ // runner claims it through the deployment's job-lease port first and skips the run when another
7
+ // instance holds it; a job that fences its own work (for example the outbox) declares no lease.
8
+ const EMPTY_SUMMARY = { checked: 0, updated: 0, failures: 0, skipped: false };
9
+ /** Merge contributed jobs into one registry; refuses a duplicate id or an empty id or schedule. */
10
+ export function createScheduledJobRegistry(...contributions) {
11
+ const seen = new Set();
12
+ const jobs = [];
13
+ for (const job of contributions.flat()) {
14
+ if (!job.id?.trim())
15
+ throw new Error("scheduled_job_id_required");
16
+ if (!job.schedule?.trim())
17
+ throw new Error(`scheduled_job_schedule_required:${job.id}`);
18
+ if (seen.has(job.id))
19
+ throw new Error(`scheduled_job_duplicate:${job.id}`);
20
+ seen.add(job.id);
21
+ jobs.push(job);
22
+ }
23
+ return Object.freeze(jobs);
24
+ }
25
+ /**
26
+ * The cron expression for a fixed cadence: a whole number of minutes that divides an hour, or a
27
+ * whole number of hours that divides a day. Any other cadence is refused rather than approximated.
28
+ */
29
+ export function cronFromCadenceSeconds(cadenceSeconds) {
30
+ if (Number.isInteger(cadenceSeconds) && cadenceSeconds > 0 && cadenceSeconds % 60 === 0) {
31
+ const minutes = cadenceSeconds / 60;
32
+ if (minutes < 60 && 60 % minutes === 0)
33
+ return minutes === 1 ? "* * * * *" : `*/${minutes} * * * *`;
34
+ if (minutes % 60 === 0) {
35
+ const hours = minutes / 60;
36
+ if (hours === 24)
37
+ return "0 0 * * *";
38
+ if (hours < 24 && 24 % hours === 0)
39
+ return hours === 1 ? "0 * * * *" : `0 */${hours} * * *`;
40
+ }
41
+ }
42
+ throw new Error(`scheduled_job_cadence_unsupported:${cadenceSeconds}`);
43
+ }
44
+ /**
45
+ * Jobs for a package contribution's cadence schedules; each run passes the invocation through. A
46
+ * run that reports `{ outcome: "failed" }` instead of throwing fails the job, so neither transport
47
+ * reports it as completed.
48
+ */
49
+ export function scheduledJobsFromContribution(schedules) {
50
+ return schedules.map((schedule) => ({
51
+ id: schedule.id,
52
+ schedule: cronFromCadenceSeconds(schedule.cadenceSeconds),
53
+ async run({ invocation }) {
54
+ const result = await schedule.run(invocation);
55
+ if (typeof result === "object" && result !== null && result.outcome === "failed") {
56
+ throw new Error(`scheduled_job_outcome_failed:${schedule.id}`);
57
+ }
58
+ },
59
+ }));
60
+ }
61
+ /** Run one job once, under its lease when it declares one. */
62
+ export async function runScheduledJob(job, options) {
63
+ if (!job.lease) {
64
+ const summary = await job.run({ invocation: options.invocation, signal: options.signal });
65
+ return { status: "completed", summary: summary ?? null };
66
+ }
67
+ if (!options.lease)
68
+ throw new Error(`scheduled_job_lease_port_required:${job.id}`);
69
+ const claim = await options.lease.claimJobRun(job.id, options.invocation, job.lease.seconds);
70
+ if (!claim.acquired)
71
+ return { status: "skipped", reason: claim.reason };
72
+ if (!claim.runId)
73
+ throw new Error(`scheduled_job_lease_without_run_id:${job.id}`);
74
+ let summary;
75
+ try {
76
+ summary = await job.run({ invocation: options.invocation, runId: claim.runId, signal: options.signal });
77
+ }
78
+ catch (error) {
79
+ try {
80
+ await options.lease.finishJobRun(job.id, claim.runId, options.invocation, "failed", { ...EMPTY_SUMMARY, failures: 1 });
81
+ }
82
+ catch (finishError) {
83
+ throw new AggregateError([error, finishError], `scheduled_job_failed_unfinished:${job.id}`);
84
+ }
85
+ throw error;
86
+ }
87
+ const finished = await options.lease.finishJobRun(job.id, claim.runId, options.invocation, "success", summary ?? EMPTY_SUMMARY);
88
+ // A refused finish means the lease no longer belongs to this run; its result cannot be recorded.
89
+ if (!finished)
90
+ throw new Error(`scheduled_job_finish_refused:${job.id}`);
91
+ return { status: "completed", summary: summary ?? null };
92
+ }
@@ -0,0 +1,42 @@
1
+ import type { SchedulerPort } from "@openlup/core/platform-runtime";
2
+ import type { ScheduledJobDeclaration } from "./jobRegistry.js";
3
+ import { type AdvisoryLock } from "./advisoryLock.js";
4
+ type CronEnv = Record<string, string | undefined> & {
5
+ CRON_SECRET?: string;
6
+ };
7
+ /** Minimal node-cron surface we depend on (keeps the package optional at type level). */
8
+ export interface CronScheduler {
9
+ schedule(expression: string, handler: () => void | Promise<void>, options?: {
10
+ timezone?: string;
11
+ }): {
12
+ stop: () => void;
13
+ };
14
+ }
15
+ export interface NodeSchedulerAdapter extends SchedulerPort {
16
+ readonly jobs: readonly ScheduledJobDeclaration[];
17
+ /** Stop all registered node-cron timers (graceful shutdown). */
18
+ stopAll(): void;
19
+ }
20
+ export interface CreateNodeSchedulerOptions {
21
+ /** node-cron instance (inject `import("node-cron")` at the host boot site). */
22
+ cron: CronScheduler;
23
+ /** Per-job advisory lock; defaults to a no-op (single-instance) — supply pg-backed in prod. */
24
+ lock?: AdvisoryLock;
25
+ /** Environment whose CRON_SECRET verifies an invocation. */
26
+ env: CronEnv;
27
+ /** The deployment's declared jobs (see `loadJobRegistry`). */
28
+ jobs: readonly ScheduledJobDeclaration[];
29
+ /** crontab timezone; jobs are authored in UTC to match Vercel. */
30
+ timezone?: string;
31
+ /** Structured error sink for failed job bodies (defaults to console.error). */
32
+ onError?: (jobId: string, error: unknown) => void;
33
+ }
34
+ /**
35
+ * Wrap a job body with the per-job advisory lock. Returns a guarded runner that:
36
+ * - tries to acquire the lock; if not acquired (another instance is running it) -> skip silently;
37
+ * - runs the body; always releases the lock in finally.
38
+ */
39
+ export declare function withAdvisoryLock(jobId: string, lock: AdvisoryLock, body: () => Promise<void> | void, onError: (jobId: string, error: unknown) => void): () => Promise<void>;
40
+ /** Build the Node scheduler adapter backed by node-cron + per-job advisory locks. */
41
+ export declare function createNodeScheduler(options: CreateNodeSchedulerOptions): NodeSchedulerAdapter;
42
+ export {};
@@ -0,0 +1,73 @@
1
+ // Node (self-hosted) SchedulerPort adapter.
2
+ //
3
+ // Unlike a managed host with an adopter-owned declarative cron manifest, a self-hosted Node bundle owns the timers itself.
4
+ // This adapter:
5
+ // 1. Takes its job set from the platform-runtime configuration `crons` (the SAME single source
6
+ // the managed-host adapter also reads), never a hand-copied list.
7
+ // 2. Registers each job with node-cron (injected lazily so `pg`/`node-cron` aren't required to
8
+ // typecheck or to run the default vercel-supabase path).
9
+ // 3. Wraps every job body in a PER-JOB advisory lock: multi-instance Node must not
10
+ // double-run a cron. Only the instance that acquires `pg_try_advisory_lock(<job>)` runs; others
11
+ // skip. The lock is released in a finally, even if the body throws.
12
+ import { verifyCronAuth } from "./vercelScheduler.js";
13
+ import { createNoopAdvisoryLock } from "./advisoryLock.js";
14
+ /**
15
+ * Wrap a job body with the per-job advisory lock. Returns a guarded runner that:
16
+ * - tries to acquire the lock; if not acquired (another instance is running it) -> skip silently;
17
+ * - runs the body; always releases the lock in finally.
18
+ */
19
+ export function withAdvisoryLock(jobId, lock, body, onError) {
20
+ return async () => {
21
+ const acquired = await lock.tryAcquire(jobId);
22
+ if (!acquired) {
23
+ // Another instance holds the lock for this minute — skip (no double-run).
24
+ return;
25
+ }
26
+ try {
27
+ await body();
28
+ }
29
+ catch (error) {
30
+ onError(jobId, error);
31
+ }
32
+ finally {
33
+ await lock.release(jobId);
34
+ }
35
+ };
36
+ }
37
+ /** Build the Node scheduler adapter backed by node-cron + per-job advisory locks. */
38
+ export function createNodeScheduler(options) {
39
+ const env = options.env;
40
+ const jobs = options.jobs;
41
+ const lock = options.lock ?? createNoopAdvisoryLock();
42
+ const onError = options.onError ??
43
+ ((jobId, error) => {
44
+ console.error(`[node-scheduler] job "${jobId}" failed`, error);
45
+ });
46
+ const scheduleById = new Map(jobs.map((job) => [job.jobId, job.schedule]));
47
+ const timers = [];
48
+ return {
49
+ jobs,
50
+ register(input) {
51
+ // Prefer an explicit schedule; fall back to the single-source registry when the caller
52
+ // omits one (empty string or undefined both fall back).
53
+ const explicit = input.schedule?.trim();
54
+ const schedule = explicit && explicit.length > 0 ? explicit : scheduleById.get(input.jobId);
55
+ if (!schedule) {
56
+ throw new Error(`node-scheduler: job "${input.jobId}" is not declared in config/platform-runtime.json crons`);
57
+ }
58
+ const guarded = withAdvisoryLock(input.jobId, lock, input.handler, onError);
59
+ const timer = options.cron.schedule(schedule, guarded, { timezone: options.timezone });
60
+ timers.push({ jobId: input.jobId, stop: timer.stop });
61
+ },
62
+ verifyInvocation(req) {
63
+ // Self-hosted invocations still present the shared CRON_SECRET; reuse the canonical check.
64
+ return verifyCronAuth(req, env);
65
+ },
66
+ stopAll() {
67
+ for (const timer of timers) {
68
+ timer.stop();
69
+ }
70
+ timers.length = 0;
71
+ },
72
+ };
73
+ }
@@ -0,0 +1,29 @@
1
+ import type { PlatformHttpRequest, SchedulerPort } from "@openlup/core/platform-runtime";
2
+ import type { ScheduledJobDeclaration } from "./jobRegistry.js";
3
+ type CronEnv = Record<string, string | undefined> & {
4
+ CRON_SECRET?: string;
5
+ };
6
+ export { bearerToken } from "./cronSecret.js";
7
+ /**
8
+ * Verify a cron invocation is authentic. Fail-CLOSED:
9
+ * - CRON_SECRET unset -> false (never authorize when no secret configured)
10
+ * - presented Bearer token != CRON_SECRET -> false
11
+ * - presented Bearer token == CRON_SECRET -> true
12
+ * This is the single canonical check that replaces the per-handler inline comparisons.
13
+ */
14
+ export declare function verifyCronAuth(req: PlatformHttpRequest, env: CronEnv): boolean;
15
+ export interface VercelSchedulerAdapter extends SchedulerPort {
16
+ /** The jobs this scheduler knows about, derived from the platform-runtime single source. */
17
+ readonly jobs: readonly ScheduledJobDeclaration[];
18
+ }
19
+ /**
20
+ * Build the Vercel cron scheduler adapter.
21
+ *
22
+ * `register()` validates the job is part of the declared registry (so callers can't silently
23
+ * register a job Vercel will never fire) but does NOT start a timer — Vercel's cron does that.
24
+ */
25
+ export declare function createVercelScheduler(options: {
26
+ env: CronEnv;
27
+ /** The deployment's declared jobs (see `loadJobRegistry`). */
28
+ jobs: readonly ScheduledJobDeclaration[];
29
+ }): VercelSchedulerAdapter;
@@ -0,0 +1,51 @@
1
+ // Vercel cron SchedulerPort adapter.
2
+ //
3
+ // On Vercel, scheduling is declarative: an adopter-owned `crons` manifest generated from the
4
+ // platform-runtime configuration (the same single source as `jobs`) tells Vercel to GET
5
+ // each `/api/cron/*` endpoint on its schedule. So `register()` is a no-op verification step here —
6
+ // the platform owns the timer. What this adapter OWNS is invocation authenticity: every cron
7
+ // endpoint must verify `Authorization: Bearer ${CRON_SECRET}`, fail-closed when the secret is unset.
8
+ //
9
+ // `verifyCronAuth(req, env)` is the reusable form of a bearer check against CRON_SECRET; cron
10
+ // handlers and the Node host call it instead of re-implementing the comparison.
11
+ import { bearerToken, cronSecretMatches } from "./cronSecret.js";
12
+ export { bearerToken } from "./cronSecret.js";
13
+ /**
14
+ * Verify a cron invocation is authentic. Fail-CLOSED:
15
+ * - CRON_SECRET unset -> false (never authorize when no secret configured)
16
+ * - presented Bearer token != CRON_SECRET -> false
17
+ * - presented Bearer token == CRON_SECRET -> true
18
+ * This is the single canonical check that replaces the per-handler inline comparisons.
19
+ */
20
+ export function verifyCronAuth(req, env) {
21
+ const expected = env.CRON_SECRET;
22
+ if (!expected) {
23
+ return false;
24
+ }
25
+ return cronSecretMatches(bearerToken(req), expected);
26
+ }
27
+ /**
28
+ * Build the Vercel cron scheduler adapter.
29
+ *
30
+ * `register()` validates the job is part of the declared registry (so callers can't silently
31
+ * register a job Vercel will never fire) but does NOT start a timer — Vercel's cron does that.
32
+ */
33
+ export function createVercelScheduler(options) {
34
+ const env = options.env;
35
+ const jobs = options.jobs;
36
+ const knownIds = new Set(jobs.map((job) => job.jobId));
37
+ return {
38
+ jobs,
39
+ register(input) {
40
+ // Vercel owns the timer through the adopter manifest. We only guard that the job is declared,
41
+ // surfacing drift between code and the single-source registry at registration time.
42
+ if (!knownIds.has(input.jobId)) {
43
+ throw new Error(`vercel-scheduler: job "${input.jobId}" is not declared in config/platform-runtime.json crons`);
44
+ }
45
+ // No-op timer: the handler at the cron path is invoked by Vercel directly.
46
+ },
47
+ verifyInvocation(req) {
48
+ return verifyCronAuth(req, env);
49
+ },
50
+ };
51
+ }
package/package.json CHANGED
@@ -1,7 +1,120 @@
1
1
  {
2
2
  "name": "@openlup/platform",
3
- "version": "0.0.0",
4
- "description": "Inert package-name registration placeholder; no platform implementation.",
3
+ "version": "0.16.0",
4
+ "private": false,
5
+ "description": "Runnable server substrate: Node HTTP runtime, BFF dispatch, scheduler, storage, data gateways and bundle composition; development preview.",
5
6
  "license": "Apache-2.0",
6
- "files": ["README.md"]
7
+ "type": "module",
8
+ "engines": {
9
+ "node": "24.x"
10
+ },
11
+ "packageManager": "npm@11.19.0",
12
+ "sideEffects": false,
13
+ "files": [
14
+ "dist/**",
15
+ "src/**",
16
+ "sql/**",
17
+ "README.md",
18
+ "CHANGELOG.md",
19
+ "LICENSE",
20
+ "release-gates.json"
21
+ ],
22
+ "scripts": {
23
+ "build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json",
24
+ "test": "vitest run test",
25
+ "ci": "npm run build && npm run test && npm run api:check",
26
+ "api:check": "node --experimental-strip-types ./scripts/api-contract.ts",
27
+ "test:consumer": "node --experimental-strip-types ./scripts/consumer-proof.ts",
28
+ "ci:required": "npm run test:consumer",
29
+ "prepack": "npm run build",
30
+ "prepublishOnly": "node -e \"throw new Error('PLATFORM_DIRECTORY_PUBLISH_REFUSED')\"",
31
+ "api:update": "npm run build && node --experimental-strip-types ./scripts/api-contract.ts --update"
32
+ },
33
+ "peerDependencies": {
34
+ "@openlup/core": "0.16.0",
35
+ "pg": "^8.22.0",
36
+ "@aws-sdk/client-s3": "^3.1144.0",
37
+ "@types/pg": "^8.20.0"
38
+ },
39
+ "peerDependenciesMeta": {
40
+ "pg": {
41
+ "optional": true
42
+ },
43
+ "@aws-sdk/client-s3": {
44
+ "optional": true
45
+ },
46
+ "@types/pg": {
47
+ "optional": true
48
+ }
49
+ },
50
+ "dependencies": {
51
+ "zod": "^4.4.3"
52
+ },
53
+ "exports": {
54
+ "./http": {
55
+ "types": "./dist/http/index.d.ts",
56
+ "import": "./dist/http/index.js",
57
+ "default": "./dist/http/index.js"
58
+ },
59
+ "./bff": {
60
+ "types": "./dist/bff/index.d.ts",
61
+ "import": "./dist/bff/index.js",
62
+ "default": "./dist/bff/index.js"
63
+ },
64
+ "./scheduler": {
65
+ "types": "./dist/scheduler/index.d.ts",
66
+ "import": "./dist/scheduler/index.js",
67
+ "default": "./dist/scheduler/index.js"
68
+ },
69
+ "./blob": {
70
+ "types": "./dist/blob/index.d.ts",
71
+ "import": "./dist/blob/index.js",
72
+ "default": "./dist/blob/index.js"
73
+ },
74
+ "./data": {
75
+ "types": "./dist/data/index.d.ts",
76
+ "import": "./dist/data/index.js",
77
+ "default": "./dist/data/index.js"
78
+ },
79
+ "./migrations": {
80
+ "types": "./dist/migrations/index.d.ts",
81
+ "import": "./dist/migrations/index.js",
82
+ "default": "./dist/migrations/index.js"
83
+ },
84
+ "./job-ledger": {
85
+ "types": "./dist/job-ledger/index.d.ts",
86
+ "import": "./dist/job-ledger/index.js",
87
+ "default": "./dist/job-ledger/index.js"
88
+ },
89
+ "./kernel": {
90
+ "types": "./dist/kernel/index.d.ts",
91
+ "import": "./dist/kernel/index.js",
92
+ "default": "./dist/kernel/index.js"
93
+ },
94
+ "./composition": {
95
+ "types": "./dist/composition/index.d.ts",
96
+ "import": "./dist/composition/index.js",
97
+ "default": "./dist/composition/index.js"
98
+ },
99
+ "./identity": {
100
+ "types": "./dist/identity/index.d.ts",
101
+ "import": "./dist/identity/index.js",
102
+ "default": "./dist/identity/index.js"
103
+ },
104
+ "./identity/contracts": {
105
+ "types": "./dist/identity/contracts/index.d.ts",
106
+ "import": "./dist/identity/contracts/index.js",
107
+ "default": "./dist/identity/contracts/index.js"
108
+ }
109
+ },
110
+ "repository": {
111
+ "type": "git",
112
+ "url": "git+https://github.com/openlup/openlup.git",
113
+ "directory": "packages/platform"
114
+ },
115
+ "publishConfig": {
116
+ "access": "public",
117
+ "provenance": true,
118
+ "tag": "preview"
119
+ }
7
120
  }