@noodleseed/one 0.63.0 → 0.64.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 (440) hide show
  1. package/dist/auth-discovery.d.ts +17 -0
  2. package/dist/auth-discovery.d.ts.map +1 -0
  3. package/dist/auth-discovery.js +54 -0
  4. package/dist/auth-discovery.js.map +1 -0
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +3 -0
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/catalog-data-platform-auth.d.ts +7 -0
  9. package/dist/commands/catalog-data-platform-auth.d.ts.map +1 -0
  10. package/dist/commands/catalog-data-platform-auth.js +47 -0
  11. package/dist/commands/catalog-data-platform-auth.js.map +1 -0
  12. package/dist/commands/catalog.d.ts.map +1 -1
  13. package/dist/commands/catalog.js +6 -3
  14. package/dist/commands/catalog.js.map +1 -1
  15. package/dist/commands/docs-mcp.d.ts +3 -3
  16. package/dist/commands/docs-mcp.js +3 -3
  17. package/dist/commands/platform-auth-finalization-args.d.ts +13 -0
  18. package/dist/commands/platform-auth-finalization-args.d.ts.map +1 -0
  19. package/dist/commands/platform-auth-finalization-args.js +29 -0
  20. package/dist/commands/platform-auth-finalization-args.js.map +1 -0
  21. package/dist/commands/platform-auth-migration-args.d.ts +71 -0
  22. package/dist/commands/platform-auth-migration-args.d.ts.map +1 -0
  23. package/dist/commands/platform-auth-migration-args.js +320 -0
  24. package/dist/commands/platform-auth-migration-args.js.map +1 -0
  25. package/dist/commands/platform-auth-migration-ops.d.ts +3 -0
  26. package/dist/commands/platform-auth-migration-ops.d.ts.map +1 -0
  27. package/dist/commands/platform-auth-migration-ops.js +369 -0
  28. package/dist/commands/platform-auth-migration-ops.js.map +1 -0
  29. package/dist/commands/project-setup.js +1 -1
  30. package/dist/commands/project-setup.js.map +1 -1
  31. package/dist/config.d.ts +4 -4
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/control-plane.d.ts +0 -11
  34. package/dist/control-plane.d.ts.map +1 -1
  35. package/dist/control-plane.js +1 -8
  36. package/dist/control-plane.js.map +1 -1
  37. package/dist/doctor.d.ts.map +1 -1
  38. package/dist/doctor.js +3 -5
  39. package/dist/doctor.js.map +1 -1
  40. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -1
  41. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
  42. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -1
  43. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
  44. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +1 -0
  45. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
  46. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts +2 -2
  47. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts.map +1 -1
  48. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js +1 -1
  49. package/node_modules/@noodle-borg/auth/dist/verify.d.ts +1 -1
  50. package/node_modules/@noodle-borg/auth/dist/verify.d.ts.map +1 -1
  51. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts +26 -0
  52. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts.map +1 -1
  53. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js +105 -1
  54. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js.map +1 -1
  55. package/node_modules/@noodle-borg/service/dist/control-plane-auth-bootstrap.d.ts +25 -0
  56. package/node_modules/@noodle-borg/service/dist/control-plane-auth-bootstrap.d.ts.map +1 -0
  57. package/node_modules/@noodle-borg/service/dist/control-plane-auth-bootstrap.js +99 -0
  58. package/node_modules/@noodle-borg/service/dist/control-plane-auth-bootstrap.js.map +1 -0
  59. package/node_modules/@noodle-borg/service/dist/index.d.ts +15 -0
  60. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  61. package/node_modules/@noodle-borg/service/dist/index.js +15 -0
  62. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  63. package/node_modules/@noodle-borg/service/dist/main.js +112 -19
  64. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
  65. package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts +1 -1
  66. package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts.map +1 -1
  67. package/node_modules/@noodle-borg/service/dist/oauth/app.js +9 -1
  68. package/node_modules/@noodle-borg/service/dist/oauth/app.js.map +1 -1
  69. package/node_modules/@noodle-borg/service/dist/oauth/authorization-initiation.d.ts +24 -0
  70. package/node_modules/@noodle-borg/service/dist/oauth/authorization-initiation.d.ts.map +1 -0
  71. package/node_modules/@noodle-borg/service/dist/oauth/authorization-initiation.js +88 -0
  72. package/node_modules/@noodle-borg/service/dist/oauth/authorization-initiation.js.map +1 -0
  73. package/node_modules/@noodle-borg/service/dist/oauth/branding.d.ts +2 -0
  74. package/node_modules/@noodle-borg/service/dist/oauth/branding.d.ts.map +1 -1
  75. package/node_modules/@noodle-borg/service/dist/oauth/branding.js +3 -2
  76. package/node_modules/@noodle-borg/service/dist/oauth/branding.js.map +1 -1
  77. package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.d.ts +1 -1
  78. package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.d.ts.map +1 -1
  79. package/node_modules/@noodle-borg/service/dist/oauth/consent-token.d.ts +5 -0
  80. package/node_modules/@noodle-borg/service/dist/oauth/consent-token.d.ts.map +1 -0
  81. package/node_modules/@noodle-borg/service/dist/oauth/consent-token.js +19 -0
  82. package/node_modules/@noodle-borg/service/dist/oauth/consent-token.js.map +1 -0
  83. package/node_modules/@noodle-borg/service/dist/oauth/consent.js +1 -1
  84. package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.d.ts.map +1 -1
  85. package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.js +216 -28
  86. package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.js.map +1 -1
  87. package/node_modules/@noodle-borg/service/dist/oauth/first-party-client.d.ts +13 -0
  88. package/node_modules/@noodle-borg/service/dist/oauth/first-party-client.d.ts.map +1 -0
  89. package/node_modules/@noodle-borg/service/dist/oauth/first-party-client.js +62 -0
  90. package/node_modules/@noodle-borg/service/dist/oauth/first-party-client.js.map +1 -0
  91. package/node_modules/@noodle-borg/service/dist/oauth/metadata.d.ts +4 -0
  92. package/node_modules/@noodle-borg/service/dist/oauth/metadata.d.ts.map +1 -0
  93. package/node_modules/@noodle-borg/service/dist/oauth/metadata.js +20 -0
  94. package/node_modules/@noodle-borg/service/dist/oauth/metadata.js.map +1 -0
  95. package/node_modules/@noodle-borg/service/dist/oauth/paths.d.ts.map +1 -1
  96. package/node_modules/@noodle-borg/service/dist/oauth/paths.js +2 -0
  97. package/node_modules/@noodle-borg/service/dist/oauth/paths.js.map +1 -1
  98. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.d.ts +15 -0
  99. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.d.ts.map +1 -0
  100. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.js +58 -0
  101. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.js.map +1 -0
  102. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-postgres.d.ts +8 -0
  103. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-postgres.d.ts.map +1 -0
  104. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-postgres.js +49 -0
  105. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-postgres.js.map +1 -0
  106. package/node_modules/@noodle-borg/service/dist/oauth/postgres-time.d.ts +3 -0
  107. package/node_modules/@noodle-borg/service/dist/oauth/postgres-time.d.ts.map +1 -0
  108. package/node_modules/@noodle-borg/service/dist/oauth/postgres-time.js +7 -0
  109. package/node_modules/@noodle-borg/service/dist/oauth/postgres-time.js.map +1 -0
  110. package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts +20 -25
  111. package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts.map +1 -1
  112. package/node_modules/@noodle-borg/service/dist/oauth/provider.js +105 -196
  113. package/node_modules/@noodle-borg/service/dist/oauth/provider.js.map +1 -1
  114. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts +36 -0
  115. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts.map +1 -0
  116. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js +157 -0
  117. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js.map +1 -0
  118. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.d.ts +4 -0
  119. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.d.ts.map +1 -0
  120. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.js +110 -0
  121. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.js.map +1 -0
  122. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.d.ts +7 -4
  123. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.d.ts.map +1 -1
  124. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js +63 -120
  125. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js.map +1 -1
  126. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +19 -6
  127. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts.map +1 -1
  128. package/node_modules/@noodle-borg/service/dist/oauth/store.js +24 -2
  129. package/node_modules/@noodle-borg/service/dist/oauth/store.js.map +1 -1
  130. package/node_modules/@noodle-borg/service/dist/oauth/tokens.d.ts +1 -1
  131. package/node_modules/@noodle-borg/service/dist/oauth/tokens.d.ts.map +1 -1
  132. package/node_modules/@noodle-borg/service/dist/oauth/tokens.js +1 -1
  133. package/node_modules/@noodle-borg/service/dist/oauth/tokens.js.map +1 -1
  134. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-availability.d.ts +4 -0
  135. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-availability.d.ts.map +1 -0
  136. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-availability.js +8 -0
  137. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-availability.js.map +1 -0
  138. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-handler.d.ts +34 -0
  139. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-handler.d.ts.map +1 -0
  140. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-handler.js +109 -0
  141. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-handler.js.map +1 -0
  142. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-support.d.ts +22 -0
  143. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-support.d.ts.map +1 -0
  144. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-support.js +30 -0
  145. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-support.js.map +1 -0
  146. package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.d.ts +21 -0
  147. package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.d.ts.map +1 -0
  148. package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.js +56 -0
  149. package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.js.map +1 -0
  150. package/node_modules/@noodle-borg/service/dist/oauth/upstream-federation.d.ts +30 -0
  151. package/node_modules/@noodle-borg/service/dist/oauth/upstream-federation.d.ts.map +1 -0
  152. package/node_modules/@noodle-borg/service/dist/oauth/upstream-federation.js +94 -0
  153. package/node_modules/@noodle-borg/service/dist/oauth/upstream-federation.js.map +1 -0
  154. package/node_modules/@noodle-borg/service/dist/oauth/upstream-human.d.ts +33 -0
  155. package/node_modules/@noodle-borg/service/dist/oauth/upstream-human.d.ts.map +1 -0
  156. package/node_modules/@noodle-borg/service/dist/oauth/upstream-human.js +27 -0
  157. package/node_modules/@noodle-borg/service/dist/oauth/upstream-human.js.map +1 -0
  158. package/node_modules/@noodle-borg/service/dist/oauth/upstream-provider-choice.d.ts +13 -0
  159. package/node_modules/@noodle-borg/service/dist/oauth/upstream-provider-choice.d.ts.map +1 -0
  160. package/node_modules/@noodle-borg/service/dist/oauth/upstream-provider-choice.js +63 -0
  161. package/node_modules/@noodle-borg/service/dist/oauth/upstream-provider-choice.js.map +1 -0
  162. package/node_modules/@noodle-borg/service/dist/oauth/upstream-rollout-store.d.ts +20 -0
  163. package/node_modules/@noodle-borg/service/dist/oauth/upstream-rollout-store.d.ts.map +1 -0
  164. package/node_modules/@noodle-borg/service/dist/oauth/upstream-rollout-store.js +40 -0
  165. package/node_modules/@noodle-borg/service/dist/oauth/upstream-rollout-store.js.map +1 -0
  166. package/node_modules/@noodle-borg/service/dist/oauth/workos-events.d.ts +115 -0
  167. package/node_modules/@noodle-borg/service/dist/oauth/workos-events.d.ts.map +1 -0
  168. package/node_modules/@noodle-borg/service/dist/oauth/workos-events.js +310 -0
  169. package/node_modules/@noodle-borg/service/dist/oauth/workos-events.js.map +1 -0
  170. package/node_modules/@noodle-borg/service/dist/oauth/workos.d.ts +65 -0
  171. package/node_modules/@noodle-borg/service/dist/oauth/workos.d.ts.map +1 -0
  172. package/node_modules/@noodle-borg/service/dist/oauth/workos.js +85 -0
  173. package/node_modules/@noodle-borg/service/dist/oauth/workos.js.map +1 -0
  174. package/node_modules/@noodle-borg/service/dist/options.d.ts +11 -2
  175. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  176. package/node_modules/@noodle-borg/service/dist/personal-workspace.d.ts +2 -0
  177. package/node_modules/@noodle-borg/service/dist/personal-workspace.d.ts.map +1 -1
  178. package/node_modules/@noodle-borg/service/dist/personal-workspace.js +8 -2
  179. package/node_modules/@noodle-borg/service/dist/personal-workspace.js.map +1 -1
  180. package/node_modules/@noodle-borg/service/dist/platform-auth-configuration.d.ts +67 -0
  181. package/node_modules/@noodle-borg/service/dist/platform-auth-configuration.d.ts.map +1 -0
  182. package/node_modules/@noodle-borg/service/dist/platform-auth-configuration.js +54 -0
  183. package/node_modules/@noodle-borg/service/dist/platform-auth-configuration.js.map +1 -0
  184. package/node_modules/@noodle-borg/service/dist/platform-auth-frozen-candidate-postgres.d.ts +25 -0
  185. package/node_modules/@noodle-borg/service/dist/platform-auth-frozen-candidate-postgres.d.ts.map +1 -0
  186. package/node_modules/@noodle-borg/service/dist/platform-auth-frozen-candidate-postgres.js +61 -0
  187. package/node_modules/@noodle-borg/service/dist/platform-auth-frozen-candidate-postgres.js.map +1 -0
  188. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-legacy-sources-postgres.d.ts +32 -0
  189. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-legacy-sources-postgres.d.ts.map +1 -0
  190. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-legacy-sources-postgres.js +231 -0
  191. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-legacy-sources-postgres.js.map +1 -0
  192. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-postgres.d.ts +29 -0
  193. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-postgres.d.ts.map +1 -0
  194. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-postgres.js +350 -0
  195. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-postgres.js.map +1 -0
  196. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-subjects-postgres.d.ts +50 -0
  197. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-subjects-postgres.d.ts.map +1 -0
  198. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-subjects-postgres.js +239 -0
  199. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-subjects-postgres.js.map +1 -0
  200. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-paging.d.ts +66 -0
  201. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-paging.d.ts.map +1 -0
  202. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-paging.js +77 -0
  203. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-paging.js.map +1 -0
  204. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-postgres.d.ts +40 -0
  205. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-postgres.d.ts.map +1 -0
  206. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-postgres.js +355 -0
  207. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-postgres.js.map +1 -0
  208. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-progress-postgres.d.ts +41 -0
  209. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-progress-postgres.d.ts.map +1 -0
  210. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-progress-postgres.js +230 -0
  211. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-progress-postgres.js.map +1 -0
  212. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-source-fence-postgres.d.ts +20 -0
  213. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-source-fence-postgres.d.ts.map +1 -0
  214. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-source-fence-postgres.js +126 -0
  215. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-source-fence-postgres.js.map +1 -0
  216. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-sources.d.ts +8 -0
  217. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-sources.d.ts.map +1 -0
  218. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-sources.js +86 -0
  219. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-sources.js.map +1 -0
  220. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-postgres.d.ts +42 -0
  221. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-postgres.d.ts.map +1 -0
  222. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-postgres.js +368 -0
  223. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-postgres.js.map +1 -0
  224. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-runs-postgres.d.ts +86 -0
  225. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-runs-postgres.d.ts.map +1 -0
  226. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-runs-postgres.js +474 -0
  227. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-runs-postgres.js.map +1 -0
  228. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-schema.d.ts +17 -0
  229. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-schema.d.ts.map +1 -0
  230. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-schema.js +435 -0
  231. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-schema.js.map +1 -0
  232. package/node_modules/@noodle-borg/service/dist/platform-auth-migration.d.ts +202 -0
  233. package/node_modules/@noodle-borg/service/dist/platform-auth-migration.d.ts.map +1 -0
  234. package/node_modules/@noodle-borg/service/dist/platform-auth-migration.js +313 -0
  235. package/node_modules/@noodle-borg/service/dist/platform-auth-migration.js.map +1 -0
  236. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-batches.d.ts +48 -0
  237. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-batches.d.ts.map +1 -0
  238. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-batches.js +158 -0
  239. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-batches.js.map +1 -0
  240. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-effects.d.ts +43 -0
  241. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-effects.d.ts.map +1 -0
  242. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-effects.js +92 -0
  243. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-effects.js.map +1 -0
  244. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-operation-postgres.d.ts +31 -0
  245. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-operation-postgres.d.ts.map +1 -0
  246. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-operation-postgres.js +94 -0
  247. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-operation-postgres.js.map +1 -0
  248. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-ports.d.ts +102 -0
  249. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-ports.d.ts.map +1 -0
  250. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-ports.js +2 -0
  251. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-ports.js.map +1 -0
  252. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-postgres.d.ts +17 -0
  253. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-postgres.d.ts.map +1 -0
  254. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-postgres.js +367 -0
  255. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-postgres.js.map +1 -0
  256. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-remote-status.d.ts +10 -0
  257. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-remote-status.d.ts.map +1 -0
  258. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-remote-status.js +37 -0
  259. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-remote-status.js.map +1 -0
  260. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-rollout.d.ts +36 -0
  261. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-rollout.d.ts.map +1 -0
  262. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-rollout.js +156 -0
  263. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-rollout.js.map +1 -0
  264. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-schema.d.ts +4 -0
  265. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-schema.d.ts.map +1 -0
  266. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-schema.js +162 -0
  267. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-schema.js.map +1 -0
  268. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-postgres.d.ts +92 -0
  269. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-postgres.d.ts.map +1 -0
  270. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-postgres.js +271 -0
  271. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-postgres.js.map +1 -0
  272. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-support.d.ts +13 -0
  273. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-support.d.ts.map +1 -0
  274. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-support.js +67 -0
  275. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-support.js.map +1 -0
  276. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-support.d.ts +15 -0
  277. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-support.d.ts.map +1 -0
  278. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-support.js +47 -0
  279. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-support.js.map +1 -0
  280. package/node_modules/@noodle-borg/service/dist/platform-auth-operator.d.ts +1569 -0
  281. package/node_modules/@noodle-borg/service/dist/platform-auth-operator.d.ts.map +1 -0
  282. package/node_modules/@noodle-borg/service/dist/platform-auth-operator.js +274 -0
  283. package/node_modules/@noodle-borg/service/dist/platform-auth-operator.js.map +1 -0
  284. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres-support.d.ts +41 -0
  285. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres-support.d.ts.map +1 -0
  286. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres-support.js +163 -0
  287. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres-support.js.map +1 -0
  288. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres.d.ts +34 -0
  289. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres.d.ts.map +1 -0
  290. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres.js +274 -0
  291. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres.js.map +1 -0
  292. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-schema.d.ts +3 -0
  293. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-schema.d.ts.map +1 -0
  294. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-schema.js +120 -0
  295. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-schema.js.map +1 -0
  296. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification.d.ts +79 -0
  297. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification.d.ts.map +1 -0
  298. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification.js +88 -0
  299. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification.js.map +1 -0
  300. package/node_modules/@noodle-borg/service/dist/platform-auth-rollback-guard.d.ts +6 -0
  301. package/node_modules/@noodle-borg/service/dist/platform-auth-rollback-guard.d.ts.map +1 -0
  302. package/node_modules/@noodle-borg/service/dist/platform-auth-rollback-guard.js +38 -0
  303. package/node_modules/@noodle-borg/service/dist/platform-auth-rollback-guard.js.map +1 -0
  304. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-postgres.d.ts +61 -0
  305. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-postgres.d.ts.map +1 -0
  306. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-postgres.js +292 -0
  307. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-postgres.js.map +1 -0
  308. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-readiness-postgres.d.ts +19 -0
  309. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-readiness-postgres.d.ts.map +1 -0
  310. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-readiness-postgres.js +121 -0
  311. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-readiness-postgres.js.map +1 -0
  312. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-support.d.ts +119 -0
  313. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-support.d.ts.map +1 -0
  314. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-support.js +194 -0
  315. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-support.js.map +1 -0
  316. package/node_modules/@noodle-borg/service/dist/platform-auth-runtime.d.ts +36 -0
  317. package/node_modules/@noodle-borg/service/dist/platform-auth-runtime.d.ts.map +1 -0
  318. package/node_modules/@noodle-borg/service/dist/platform-auth-runtime.js +93 -0
  319. package/node_modules/@noodle-borg/service/dist/platform-auth-runtime.js.map +1 -0
  320. package/node_modules/@noodle-borg/service/dist/platform-auth-service-bootstrap.d.ts +32 -0
  321. package/node_modules/@noodle-borg/service/dist/platform-auth-service-bootstrap.d.ts.map +1 -0
  322. package/node_modules/@noodle-borg/service/dist/platform-auth-service-bootstrap.js +68 -0
  323. package/node_modules/@noodle-borg/service/dist/platform-auth-service-bootstrap.js.map +1 -0
  324. package/node_modules/@noodle-borg/service/dist/platform-identity-maintenance.d.ts +36 -0
  325. package/node_modules/@noodle-borg/service/dist/platform-identity-maintenance.d.ts.map +1 -0
  326. package/node_modules/@noodle-borg/service/dist/platform-identity-maintenance.js +92 -0
  327. package/node_modules/@noodle-borg/service/dist/platform-identity-maintenance.js.map +1 -0
  328. package/node_modules/@noodle-borg/service/dist/platform-identity-postgres.d.ts +23 -0
  329. package/node_modules/@noodle-borg/service/dist/platform-identity-postgres.d.ts.map +1 -0
  330. package/node_modules/@noodle-borg/service/dist/platform-identity-postgres.js +231 -0
  331. package/node_modules/@noodle-borg/service/dist/platform-identity-postgres.js.map +1 -0
  332. package/node_modules/@noodle-borg/service/dist/platform-identity-schema-postgres.d.ts +13 -0
  333. package/node_modules/@noodle-borg/service/dist/platform-identity-schema-postgres.d.ts.map +1 -0
  334. package/node_modules/@noodle-borg/service/dist/platform-identity-schema-postgres.js +399 -0
  335. package/node_modules/@noodle-borg/service/dist/platform-identity-schema-postgres.js.map +1 -0
  336. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-enqueue.d.ts +18 -0
  337. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-enqueue.d.ts.map +1 -0
  338. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-enqueue.js +25 -0
  339. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-enqueue.js.map +1 -0
  340. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-evidence-postgres.d.ts +15 -0
  341. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-evidence-postgres.d.ts.map +1 -0
  342. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-evidence-postgres.js +74 -0
  343. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-evidence-postgres.js.map +1 -0
  344. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-postgres.d.ts +19 -0
  345. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-postgres.d.ts.map +1 -0
  346. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-postgres.js +249 -0
  347. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-postgres.js.map +1 -0
  348. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-recovery-postgres.d.ts +34 -0
  349. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-recovery-postgres.d.ts.map +1 -0
  350. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-recovery-postgres.js +275 -0
  351. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-recovery-postgres.js.map +1 -0
  352. package/node_modules/@noodle-borg/service/dist/platform-identity-sync.d.ts +98 -0
  353. package/node_modules/@noodle-borg/service/dist/platform-identity-sync.d.ts.map +1 -0
  354. package/node_modules/@noodle-borg/service/dist/platform-identity-sync.js +179 -0
  355. package/node_modules/@noodle-borg/service/dist/platform-identity-sync.js.map +1 -0
  356. package/node_modules/@noodle-borg/service/dist/platform-identity.d.ts +110 -0
  357. package/node_modules/@noodle-borg/service/dist/platform-identity.d.ts.map +1 -0
  358. package/node_modules/@noodle-borg/service/dist/platform-identity.js +312 -0
  359. package/node_modules/@noodle-borg/service/dist/platform-identity.js.map +1 -0
  360. package/node_modules/@noodle-borg/service/dist/routes/auth-discovery.d.ts +6 -0
  361. package/node_modules/@noodle-borg/service/dist/routes/auth-discovery.d.ts.map +1 -0
  362. package/node_modules/@noodle-borg/service/dist/routes/auth-discovery.js +36 -0
  363. package/node_modules/@noodle-borg/service/dist/routes/auth-discovery.js.map +1 -0
  364. package/node_modules/@noodle-borg/service/dist/routes/billing-read.d.ts.map +1 -1
  365. package/node_modules/@noodle-borg/service/dist/routes/billing-read.js +3 -9
  366. package/node_modules/@noodle-borg/service/dist/routes/billing-read.js.map +1 -1
  367. package/node_modules/@noodle-borg/service/dist/routes/billing-stripe.d.ts.map +1 -1
  368. package/node_modules/@noodle-borg/service/dist/routes/billing-stripe.js +3 -3
  369. package/node_modules/@noodle-borg/service/dist/routes/billing-stripe.js.map +1 -1
  370. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.d.ts.map +1 -1
  371. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.js +3 -1
  372. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.js.map +1 -1
  373. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration-dispatch.d.ts +8 -0
  374. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration-dispatch.d.ts.map +1 -0
  375. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration-dispatch.js +40 -0
  376. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration-dispatch.js.map +1 -0
  377. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration.d.ts +13 -0
  378. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration.d.ts.map +1 -0
  379. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration.js +158 -0
  380. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration.js.map +1 -0
  381. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts +21 -3
  382. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts.map +1 -1
  383. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  384. package/node_modules/@noodle-borg/service/dist/serve.js +61 -146
  385. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  386. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts +1 -0
  387. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts.map +1 -1
  388. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +3 -0
  389. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js.map +1 -1
  390. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  391. package/node_modules/@noodle-borg/service/dist/service.js +17 -29
  392. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  393. package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts.map +1 -1
  394. package/node_modules/@noodle-borg/service/dist/store/control-plane.js +60 -19
  395. package/node_modules/@noodle-borg/service/dist/store/control-plane.js.map +1 -1
  396. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts +1 -2
  397. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts.map +1 -1
  398. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js +0 -40
  399. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js.map +1 -1
  400. package/node_modules/@noodle-borg/service/dist/store/postgres-personal-workspace.d.ts +5 -0
  401. package/node_modules/@noodle-borg/service/dist/store/postgres-personal-workspace.d.ts.map +1 -0
  402. package/node_modules/@noodle-borg/service/dist/store/postgres-personal-workspace.js +176 -0
  403. package/node_modules/@noodle-borg/service/dist/store/postgres-personal-workspace.js.map +1 -0
  404. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts +2 -0
  405. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
  406. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +43 -1
  407. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
  408. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.js +2 -1
  409. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.js.map +1 -1
  410. package/node_modules/@noodle-borg/service/dist/workos-directory.d.ts +71 -0
  411. package/node_modules/@noodle-borg/service/dist/workos-directory.d.ts.map +1 -0
  412. package/node_modules/@noodle-borg/service/dist/workos-directory.js +175 -0
  413. package/node_modules/@noodle-borg/service/dist/workos-directory.js.map +1 -0
  414. package/node_modules/@noodle-borg/service/package.json +1 -0
  415. package/node_modules/@workos-inc/node/LICENSE +21 -0
  416. package/node_modules/@workos-inc/node/README.md +140 -0
  417. package/node_modules/@workos-inc/node/lib/factory-B8vTFojy.d.cts +9727 -0
  418. package/node_modules/@workos-inc/node/lib/factory-B8vTFojy.d.mts +9727 -0
  419. package/node_modules/@workos-inc/node/lib/factory-CoKXdPX2.cjs +8426 -0
  420. package/node_modules/@workos-inc/node/lib/factory-CoKXdPX2.cjs.map +1 -0
  421. package/node_modules/@workos-inc/node/lib/factory-MKPb5Egh.mjs +8241 -0
  422. package/node_modules/@workos-inc/node/lib/factory-MKPb5Egh.mjs.map +1 -0
  423. package/node_modules/@workos-inc/node/lib/index.cjs +449 -0
  424. package/node_modules/@workos-inc/node/lib/index.cjs.map +1 -0
  425. package/node_modules/@workos-inc/node/lib/index.d.cts +478 -0
  426. package/node_modules/@workos-inc/node/lib/index.d.mts +478 -0
  427. package/node_modules/@workos-inc/node/lib/index.mjs +394 -0
  428. package/node_modules/@workos-inc/node/lib/index.mjs.map +1 -0
  429. package/node_modules/@workos-inc/node/lib/index.worker.cjs +60 -0
  430. package/node_modules/@workos-inc/node/lib/index.worker.cjs.map +1 -0
  431. package/node_modules/@workos-inc/node/lib/index.worker.d.cts +16 -0
  432. package/node_modules/@workos-inc/node/lib/index.worker.d.mts +16 -0
  433. package/node_modules/@workos-inc/node/lib/index.worker.mjs +35 -0
  434. package/node_modules/@workos-inc/node/lib/index.worker.mjs.map +1 -0
  435. package/node_modules/@workos-inc/node/lib/webapi-BgpV54gi.mjs +3224 -0
  436. package/node_modules/@workos-inc/node/lib/webapi-BgpV54gi.mjs.map +1 -0
  437. package/node_modules/@workos-inc/node/lib/webapi-BzGFatFp.cjs +3271 -0
  438. package/node_modules/@workos-inc/node/lib/webapi-BzGFatFp.cjs.map +1 -0
  439. package/node_modules/@workos-inc/node/package.json +96 -0
  440. package/package.json +2 -1
@@ -0,0 +1,399 @@
1
+ import { ensurePlatformAuthMigrationSchema, upgradePlatformAuthMigrationSchema, } from './platform-auth-migration-schema.js';
2
+ import { ensurePlatformIdentitySyncOutboxSchema } from './platform-identity-sync-postgres.js';
3
+ /**
4
+ * Additive persistence for the platform-human identity migration. Every relationship uses RESTRICT so a
5
+ * rollback to the preceding release remains safe, and immutability is enforced by the database rather than
6
+ * application convention.
7
+ */
8
+ export async function ensurePlatformIdentitySchema(pool) {
9
+ await pool.query(`
10
+ CREATE TABLE IF NOT EXISTS platform_principals (
11
+ principal_id text PRIMARY KEY,
12
+ status text NOT NULL CHECK (status IN ('active', 'suspended')),
13
+ billing_identity_issuer text NOT NULL,
14
+ billing_subject text NOT NULL,
15
+ created_at timestamptz NOT NULL DEFAULT now(),
16
+ suspended_at timestamptz,
17
+ UNIQUE (billing_identity_issuer, billing_subject)
18
+ )
19
+ `);
20
+ await pool.query(`
21
+ CREATE TABLE IF NOT EXISTS platform_identity_links (
22
+ provider text NOT NULL,
23
+ realm text NOT NULL,
24
+ external_id text NOT NULL,
25
+ principal_id text NOT NULL REFERENCES platform_principals(principal_id) ON DELETE RESTRICT,
26
+ created_at timestamptz NOT NULL DEFAULT now(),
27
+ disabled_at timestamptz,
28
+ PRIMARY KEY (provider, realm, external_id),
29
+ UNIQUE (principal_id, provider, realm)
30
+ )
31
+ `);
32
+ await pool.query(`
33
+ CREATE TABLE IF NOT EXISTS platform_verified_emails (
34
+ principal_id text NOT NULL REFERENCES platform_principals(principal_id) ON DELETE RESTRICT,
35
+ original_email text NOT NULL,
36
+ normalized_email text NOT NULL,
37
+ provider text NOT NULL,
38
+ realm text NOT NULL,
39
+ status text NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'superseded')),
40
+ verified_at timestamptz NOT NULL DEFAULT now(),
41
+ observed_at timestamptz NOT NULL DEFAULT now(),
42
+ PRIMARY KEY (principal_id, normalized_email, provider, realm)
43
+ )
44
+ `);
45
+ await pool.query(`
46
+ CREATE INDEX IF NOT EXISTS platform_verified_emails_lookup_idx
47
+ ON platform_verified_emails (normalized_email)
48
+ `);
49
+ await pool.query(`
50
+ CREATE TABLE IF NOT EXISTS identity_migration_runs (
51
+ id text PRIMARY KEY,
52
+ kind text NOT NULL DEFAULT 'backfill' CHECK (kind IN ('inventory', 'backfill', 'import', 'reconcile')),
53
+ state text NOT NULL CHECK (state IN ('planned', 'running', 'completed', 'failed')),
54
+ release_sha text NOT NULL,
55
+ frozen_checksum text,
56
+ source_fingerprint text,
57
+ excluded_fingerprint text,
58
+ idempotency_key_hash text,
59
+ request_fingerprint text,
60
+ safe_result jsonb,
61
+ actor_fingerprint text,
62
+ workos_realm_fingerprint text,
63
+ google_realm text,
64
+ inventory_format text CHECK (inventory_format IS NULL OR inventory_format IN ('legacy_v0', 'v1', 'v2')),
65
+ inventory_run_id text REFERENCES identity_migration_runs(id) ON DELETE RESTRICT,
66
+ inventory_checksum text,
67
+ lineage_checksum text,
68
+ started_at timestamptz,
69
+ completed_at timestamptz,
70
+ created_at timestamptz NOT NULL DEFAULT now()
71
+ )
72
+ `);
73
+ await pool.query(`
74
+ CREATE TABLE IF NOT EXISTS identity_backfill_ledger (
75
+ source_provider text NOT NULL,
76
+ source_realm text NOT NULL,
77
+ source_subject text NOT NULL,
78
+ principal_id text NOT NULL REFERENCES platform_principals(principal_id) ON DELETE RESTRICT,
79
+ migration_run_id text REFERENCES identity_migration_runs(id) ON DELETE RESTRICT,
80
+ source_fingerprint text,
81
+ verified_email_fingerprint text,
82
+ state text NOT NULL DEFAULT 'completed' CHECK (state IN ('pending', 'completed', 'blocked', 'failed')),
83
+ completed_at timestamptz NOT NULL DEFAULT now(),
84
+ PRIMARY KEY (source_provider, source_realm, source_subject)
85
+ )
86
+ `);
87
+ await pool.query(`
88
+ CREATE TABLE IF NOT EXISTS workos_import_ledger (
89
+ principal_id text PRIMARY KEY REFERENCES platform_principals(principal_id) ON DELETE RESTRICT,
90
+ migration_run_id text REFERENCES identity_migration_runs(id) ON DELETE RESTRICT,
91
+ realm text NOT NULL DEFAULT 'default',
92
+ normalized_email text NOT NULL,
93
+ email_fingerprint text,
94
+ external_id text NOT NULL CHECK (char_length(external_id) <= 64),
95
+ state text NOT NULL CHECK (state IN ('pending', 'reconcile_required', 'linked', 'blocked', 'failed')),
96
+ lease_token text,
97
+ lease_expires_at timestamptz,
98
+ attempt_count integer NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
99
+ retry_at timestamptz,
100
+ outcome_code text,
101
+ remote_user_id text,
102
+ linked_at timestamptz,
103
+ created_at timestamptz NOT NULL DEFAULT now(),
104
+ updated_at timestamptz NOT NULL DEFAULT now(),
105
+ CONSTRAINT workos_import_ledger_external_id_unique UNIQUE (external_id)
106
+ )
107
+ `);
108
+ await pool.query(`
109
+ CREATE TABLE IF NOT EXISTS platform_identity_sync_outbox (
110
+ idempotency_key text PRIMARY KEY,
111
+ principal_id text NOT NULL REFERENCES platform_principals(principal_id) ON DELETE RESTRICT,
112
+ event_type text NOT NULL CHECK (event_type IN ('google_identity_upsert', 'verified_email_changed')),
113
+ created_at timestamptz NOT NULL DEFAULT now(),
114
+ delivered_at timestamptz,
115
+ attempt_count integer NOT NULL DEFAULT 0 CHECK (attempt_count >= 0)
116
+ )
117
+ `);
118
+ await ensurePlatformIdentitySyncOutboxSchema(pool);
119
+ await pool.query(`
120
+ CREATE TABLE IF NOT EXISTS workos_import_attempt_evidence (
121
+ id bigserial PRIMARY KEY,
122
+ principal_id text NOT NULL REFERENCES platform_principals(principal_id) ON DELETE RESTRICT,
123
+ migration_run_id text REFERENCES identity_migration_runs(id) ON DELETE RESTRICT,
124
+ attempt integer NOT NULL CHECK (attempt >= 0),
125
+ outcome_code text NOT NULL,
126
+ external_id_fingerprint text NOT NULL,
127
+ email_fingerprint text NOT NULL,
128
+ principal_fingerprint text,
129
+ retry_at timestamptz,
130
+ created_at timestamptz NOT NULL DEFAULT now()
131
+ )
132
+ `);
133
+ await pool.query(`
134
+ CREATE INDEX IF NOT EXISTS platform_identity_sync_outbox_pending_idx
135
+ ON platform_identity_sync_outbox (created_at)
136
+ WHERE delivered_at IS NULL
137
+ `);
138
+ await pool.query(`
139
+ CREATE TABLE IF NOT EXISTS platform_identity_event_cursors (
140
+ provider text NOT NULL,
141
+ stream text NOT NULL,
142
+ cursor text NOT NULL,
143
+ updated_at timestamptz NOT NULL DEFAULT now(),
144
+ PRIMARY KEY (provider, stream)
145
+ )
146
+ `);
147
+ await pool.query(`
148
+ CREATE TABLE IF NOT EXISTS platform_auth_rollout_state (
149
+ singleton boolean PRIMARY KEY DEFAULT true CHECK (singleton),
150
+ generation bigint NOT NULL DEFAULT 0 CHECK (generation >= 0),
151
+ workos_percentage integer NOT NULL DEFAULT 0 CHECK (workos_percentage BETWEEN 0 AND 100),
152
+ lifecycle text NOT NULL DEFAULT 'google' CHECK (lifecycle IN ('google', 'workos', 'finalized')),
153
+ finalized_at timestamptz,
154
+ release_sha text,
155
+ workos_default_since timestamptz,
156
+ workos_stage_since timestamptz,
157
+ workos_recovery_client_ids text[] NOT NULL DEFAULT '{}'::text[],
158
+ updated_at timestamptz NOT NULL DEFAULT now()
159
+ )
160
+ `);
161
+ await pool.query("ALTER TABLE platform_auth_rollout_state ADD COLUMN IF NOT EXISTS workos_canary_client_ids text[] NOT NULL DEFAULT '{}'::text[]");
162
+ await pool.query(`
163
+ CREATE TABLE IF NOT EXISTS platform_identity_event_receipts (
164
+ provider text NOT NULL,
165
+ event_id text NOT NULL,
166
+ occurred_at timestamptz NOT NULL,
167
+ received_at timestamptz NOT NULL DEFAULT now(),
168
+ PRIMARY KEY (provider, event_id)
169
+ )
170
+ `);
171
+ await pool.query(`
172
+ CREATE TABLE IF NOT EXISTS platform_identity_upstream_versions (
173
+ provider text NOT NULL,
174
+ realm text NOT NULL,
175
+ external_id text NOT NULL,
176
+ upstream_updated_at timestamptz NOT NULL,
177
+ PRIMARY KEY (provider, realm, external_id)
178
+ )
179
+ `);
180
+ await pool.query(`
181
+ CREATE TABLE IF NOT EXISTS platform_auth_rollout_operations (
182
+ idempotency_key text PRIMARY KEY,
183
+ expected_generation bigint NOT NULL CHECK (expected_generation >= 0),
184
+ applied_generation bigint NOT NULL CHECK (applied_generation >= 0),
185
+ operation text NOT NULL CHECK (operation IN ('activate', 'rollback', 'finalize')),
186
+ release_sha text NOT NULL,
187
+ preview_checksum text NOT NULL,
188
+ actor_subject text NOT NULL,
189
+ created_at timestamptz NOT NULL DEFAULT now(),
190
+ idempotency_key_hash text,
191
+ request_fingerprint text,
192
+ actor_fingerprint text,
193
+ prior_state jsonb,
194
+ applied_state jsonb
195
+ )
196
+ `);
197
+ await ensurePlatformAuthMigrationSchema(pool);
198
+ // Upgrade preceding Task 1 releases before dependent indexes/rows. No new code writes raw keys or actors.
199
+ await pool.query("ALTER TABLE identity_migration_runs ADD COLUMN IF NOT EXISTS kind text NOT NULL DEFAULT 'backfill'");
200
+ await pool.query('ALTER TABLE identity_migration_runs ADD COLUMN IF NOT EXISTS frozen_checksum text, ADD COLUMN IF NOT EXISTS source_fingerprint text, ADD COLUMN IF NOT EXISTS excluded_fingerprint text, ADD COLUMN IF NOT EXISTS idempotency_key_hash text, ADD COLUMN IF NOT EXISTS request_fingerprint text, ADD COLUMN IF NOT EXISTS safe_result jsonb, ADD COLUMN IF NOT EXISTS actor_fingerprint text, ADD COLUMN IF NOT EXISTS workos_realm_fingerprint text, ADD COLUMN IF NOT EXISTS google_realm text, ADD COLUMN IF NOT EXISTS inventory_format text, ADD COLUMN IF NOT EXISTS inventory_run_id text REFERENCES identity_migration_runs(id) ON DELETE RESTRICT, ADD COLUMN IF NOT EXISTS inventory_checksum text, ADD COLUMN IF NOT EXISTS lineage_checksum text');
201
+ await pool.query("ALTER TABLE identity_backfill_ledger ADD COLUMN IF NOT EXISTS source_fingerprint text, ADD COLUMN IF NOT EXISTS verified_email_fingerprint text, ADD COLUMN IF NOT EXISTS state text NOT NULL DEFAULT 'completed'");
202
+ await pool.query("ALTER TABLE workos_import_ledger ADD COLUMN IF NOT EXISTS migration_run_id text REFERENCES identity_migration_runs(id) ON DELETE RESTRICT, ADD COLUMN IF NOT EXISTS realm text NOT NULL DEFAULT 'default', ADD COLUMN IF NOT EXISTS email_fingerprint text, ADD COLUMN IF NOT EXISTS lease_token text, ADD COLUMN IF NOT EXISTS attempt_count integer NOT NULL DEFAULT 0, ADD COLUMN IF NOT EXISTS retry_at timestamptz, ADD COLUMN IF NOT EXISTS outcome_code text, ADD COLUMN IF NOT EXISTS linked_at timestamptz");
203
+ await pool.query('ALTER TABLE workos_import_ledger DROP CONSTRAINT IF EXISTS workos_import_ledger_state_check');
204
+ await pool.query('ALTER TABLE workos_import_attempt_evidence ALTER COLUMN principal_id DROP NOT NULL, ADD COLUMN IF NOT EXISTS principal_fingerprint text');
205
+ await pool.query("UPDATE workos_import_ledger SET state = 'linked' WHERE state = 'created'");
206
+ await pool.query("ALTER TABLE workos_import_ledger ADD CONSTRAINT workos_import_ledger_state_check CHECK (state IN ('pending', 'reconcile_required', 'linked', 'blocked', 'failed')) NOT VALID");
207
+ await pool.query('ALTER TABLE workos_import_ledger DROP CONSTRAINT IF EXISTS workos_import_ledger_external_id_check');
208
+ await pool.query('ALTER TABLE workos_import_ledger ADD CONSTRAINT workos_import_ledger_external_id_check CHECK (char_length(external_id) <= 64) NOT VALID');
209
+ await pool.query("ALTER TABLE platform_auth_rollout_state ADD COLUMN IF NOT EXISTS lifecycle text NOT NULL DEFAULT 'google', ADD COLUMN IF NOT EXISTS finalized_at timestamptz, ADD COLUMN IF NOT EXISTS release_sha text, ADD COLUMN IF NOT EXISTS workos_default_since timestamptz, ADD COLUMN IF NOT EXISTS workos_recovery_client_ids text[] NOT NULL DEFAULT '{}'::text[]");
210
+ await upgradePlatformAuthMigrationSchema(pool);
211
+ await pool.query('ALTER TABLE platform_auth_rollout_operations ADD COLUMN IF NOT EXISTS idempotency_key_hash text, ADD COLUMN IF NOT EXISTS request_fingerprint text, ADD COLUMN IF NOT EXISTS actor_fingerprint text, ADD COLUMN IF NOT EXISTS prior_state jsonb, ADD COLUMN IF NOT EXISTS applied_state jsonb');
212
+ await pool.query(`
213
+ CREATE UNIQUE INDEX IF NOT EXISTS workos_import_ledger_realm_email_reservation_v2
214
+ ON workos_import_ledger (realm, normalized_email)
215
+ WHERE state IN ('pending', 'reconcile_required', 'linked')
216
+ `);
217
+ await pool.query(`
218
+ DO $workos_import_index_upgrade$
219
+ BEGIN
220
+ IF to_regclass('workos_import_ledger_active_email_unique') IS NOT NULL
221
+ AND to_regclass('workos_import_ledger_realm_email_reservation_v2') IS NOT NULL THEN
222
+ DROP INDEX workos_import_ledger_active_email_unique;
223
+ END IF;
224
+ END
225
+ $workos_import_index_upgrade$
226
+ `);
227
+ await pool.query(`
228
+ CREATE UNIQUE INDEX IF NOT EXISTS workos_import_ledger_remote_user_unique
229
+ ON workos_import_ledger (realm, remote_user_id) WHERE remote_user_id IS NOT NULL
230
+ `);
231
+ await pool.query("INSERT INTO platform_auth_rollout_state (singleton, generation, workos_percentage, lifecycle) VALUES (true, 0, 0, 'google') ON CONFLICT (singleton) DO NOTHING");
232
+ await pool.query('ALTER TABLE workos_import_ledger VALIDATE CONSTRAINT workos_import_ledger_state_check');
233
+ await pool.query('ALTER TABLE workos_import_ledger VALIDATE CONSTRAINT workos_import_ledger_external_id_check');
234
+ await pool.query('CREATE UNIQUE INDEX IF NOT EXISTS platform_auth_rollout_operations_idempotency_hash_unique ON platform_auth_rollout_operations (idempotency_key_hash) WHERE idempotency_key_hash IS NOT NULL');
235
+ await pool.query('ALTER TABLE identity_migration_runs DROP CONSTRAINT IF EXISTS identity_migration_runs_kind_check');
236
+ await pool.query("ALTER TABLE identity_migration_runs ADD CONSTRAINT identity_migration_runs_kind_check CHECK (kind IN ('inventory', 'backfill', 'import', 'reconcile')) NOT VALID");
237
+ await pool.query('ALTER TABLE identity_migration_runs DROP CONSTRAINT IF EXISTS identity_migration_runs_state_check');
238
+ await pool.query("ALTER TABLE identity_migration_runs ADD CONSTRAINT identity_migration_runs_state_check CHECK (state IN ('planned', 'running', 'completed', 'failed')) NOT VALID");
239
+ await pool.query('ALTER TABLE workos_import_ledger DROP CONSTRAINT IF EXISTS workos_import_ledger_outcome_code_check');
240
+ await pool.query("ALTER TABLE workos_import_ledger ADD CONSTRAINT workos_import_ledger_outcome_code_check CHECK (outcome_code IS NULL OR outcome_code IN ('pending', 'reconcile_required', 'linked', 'blocked', 'failed')) NOT VALID");
241
+ await pool.query('ALTER TABLE workos_import_attempt_evidence DROP CONSTRAINT IF EXISTS workos_import_attempt_evidence_outcome_code_check');
242
+ await pool.query("ALTER TABLE workos_import_attempt_evidence ADD CONSTRAINT workos_import_attempt_evidence_outcome_code_check CHECK (outcome_code IN ('pending', 'reconcile_required', 'linked', 'blocked', 'failed')) NOT VALID");
243
+ await pool.query('ALTER TABLE platform_auth_rollout_state DROP CONSTRAINT IF EXISTS platform_auth_rollout_state_lifecycle_check');
244
+ await pool.query("ALTER TABLE platform_auth_rollout_state ADD CONSTRAINT platform_auth_rollout_state_lifecycle_check CHECK (lifecycle IN ('google', 'workos', 'finalized')) NOT VALID");
245
+ await pool.query('ALTER TABLE identity_migration_runs VALIDATE CONSTRAINT identity_migration_runs_kind_check');
246
+ await pool.query('ALTER TABLE identity_migration_runs VALIDATE CONSTRAINT identity_migration_runs_state_check');
247
+ await pool.query('ALTER TABLE workos_import_ledger VALIDATE CONSTRAINT workos_import_ledger_outcome_code_check');
248
+ await pool.query('ALTER TABLE workos_import_attempt_evidence VALIDATE CONSTRAINT workos_import_attempt_evidence_outcome_code_check');
249
+ await pool.query('ALTER TABLE platform_auth_rollout_state VALIDATE CONSTRAINT platform_auth_rollout_state_lifecycle_check');
250
+ await pool.query(`
251
+ CREATE OR REPLACE FUNCTION platform_identity_link_immutable() RETURNS trigger AS $$
252
+ BEGIN
253
+ IF OLD.provider IS DISTINCT FROM NEW.provider
254
+ OR OLD.realm IS DISTINCT FROM NEW.realm
255
+ OR OLD.external_id IS DISTINCT FROM NEW.external_id
256
+ OR OLD.principal_id IS DISTINCT FROM NEW.principal_id THEN
257
+ RAISE EXCEPTION 'identity link remapping is forbidden';
258
+ END IF;
259
+ IF OLD.disabled_at IS NOT NULL AND NEW IS DISTINCT FROM OLD THEN
260
+ RAISE EXCEPTION 'disabled identity links are immutable';
261
+ END IF;
262
+ RETURN NEW;
263
+ END;
264
+ $$ LANGUAGE plpgsql
265
+ `);
266
+ await pool.query(`
267
+ CREATE OR REPLACE FUNCTION platform_identity_link_no_delete() RETURNS trigger AS $$
268
+ BEGIN
269
+ RAISE EXCEPTION 'identity links cannot be deleted';
270
+ END;
271
+ $$ LANGUAGE plpgsql
272
+ `);
273
+ await pool.query(`
274
+ CREATE OR REPLACE FUNCTION platform_principal_billing_immutable() RETURNS trigger AS $$
275
+ BEGIN
276
+ IF OLD.billing_identity_issuer IS DISTINCT FROM NEW.billing_identity_issuer
277
+ OR OLD.billing_subject IS DISTINCT FROM NEW.billing_subject THEN
278
+ RAISE EXCEPTION 'platform principal billing identity is immutable';
279
+ END IF;
280
+ RETURN NEW;
281
+ END;
282
+ $$ LANGUAGE plpgsql
283
+ `);
284
+ await pool.query(`
285
+ CREATE OR REPLACE FUNCTION platform_rollout_operation_append_only() RETURNS trigger AS $$
286
+ BEGIN
287
+ RAISE EXCEPTION 'platform rollout operations are append-only';
288
+ END;
289
+ $$ LANGUAGE plpgsql
290
+ `);
291
+ await pool.query(`
292
+ CREATE OR REPLACE FUNCTION platform_rollout_evidence_v2_append_only() RETURNS trigger AS $$
293
+ BEGIN
294
+ RAISE EXCEPTION 'platform rollout evidence is append-only';
295
+ END;
296
+ $$ LANGUAGE plpgsql
297
+ `);
298
+ await pool.query(`
299
+ CREATE OR REPLACE FUNCTION completed_identity_migration_run_append_only() RETURNS trigger AS $$
300
+ BEGIN
301
+ IF OLD.state = 'completed' THEN
302
+ RAISE EXCEPTION 'completed identity migration runs are append-only';
303
+ END IF;
304
+ IF TG_OP = 'DELETE' THEN RETURN OLD; END IF;
305
+ IF OLD.id IS DISTINCT FROM NEW.id OR OLD.kind IS DISTINCT FROM NEW.kind
306
+ OR OLD.release_sha IS DISTINCT FROM NEW.release_sha
307
+ OR (OLD.source_fingerprint IS NOT NULL AND OLD.source_fingerprint IS DISTINCT FROM NEW.source_fingerprint)
308
+ OR (OLD.excluded_fingerprint IS NOT NULL AND OLD.excluded_fingerprint IS DISTINCT FROM NEW.excluded_fingerprint)
309
+ OR OLD.request_fingerprint IS DISTINCT FROM NEW.request_fingerprint
310
+ OR (OLD.workos_realm_fingerprint IS NOT NULL AND OLD.workos_realm_fingerprint IS DISTINCT FROM NEW.workos_realm_fingerprint)
311
+ OR (OLD.google_realm IS NOT NULL AND OLD.google_realm IS DISTINCT FROM NEW.google_realm)
312
+ OR (OLD.inventory_format IS NOT NULL AND OLD.inventory_format IS DISTINCT FROM NEW.inventory_format)
313
+ OR OLD.inventory_run_id IS DISTINCT FROM NEW.inventory_run_id
314
+ OR OLD.inventory_checksum IS DISTINCT FROM NEW.inventory_checksum
315
+ OR OLD.lineage_checksum IS DISTINCT FROM NEW.lineage_checksum THEN
316
+ RAISE EXCEPTION 'identity migration run lineage is immutable';
317
+ END IF;
318
+ RETURN NEW;
319
+ END;
320
+ $$ LANGUAGE plpgsql
321
+ `);
322
+ await pool.query(`
323
+ CREATE OR REPLACE FUNCTION platform_auth_inventory_candidate_append_only() RETURNS trigger AS $$
324
+ BEGIN
325
+ IF TG_OP = 'INSERT' THEN
326
+ IF NOT EXISTS (SELECT 1 FROM identity_migration_runs
327
+ WHERE id = NEW.migration_run_id AND kind = 'inventory' AND state = 'running') THEN
328
+ RAISE EXCEPTION 'completed inventory candidates are frozen';
329
+ END IF;
330
+ RETURN NEW;
331
+ END IF;
332
+ RAISE EXCEPTION 'platform auth inventory candidates are append-only';
333
+ END;
334
+ $$ LANGUAGE plpgsql
335
+ `);
336
+ await pool.query(`
337
+ CREATE OR REPLACE FUNCTION workos_import_attempt_evidence_append_only() RETURNS trigger AS $$
338
+ BEGIN
339
+ RAISE EXCEPTION 'WorkOS import attempt evidence is append-only';
340
+ END;
341
+ $$ LANGUAGE plpgsql
342
+ `);
343
+ await pool.query(`
344
+ DO $platform_identity_triggers$
345
+ BEGIN
346
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'platform_identity_link_immutable_trigger'
347
+ AND tgrelid = 'platform_identity_links'::regclass AND NOT tgisinternal) THEN
348
+ CREATE TRIGGER platform_identity_link_immutable_trigger BEFORE UPDATE ON platform_identity_links
349
+ FOR EACH ROW EXECUTE FUNCTION platform_identity_link_immutable();
350
+ END IF;
351
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'platform_identity_link_no_delete_trigger'
352
+ AND tgrelid = 'platform_identity_links'::regclass AND NOT tgisinternal) THEN
353
+ CREATE TRIGGER platform_identity_link_no_delete_trigger BEFORE DELETE ON platform_identity_links
354
+ FOR EACH ROW EXECUTE FUNCTION platform_identity_link_no_delete();
355
+ END IF;
356
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'platform_principal_billing_immutable_trigger'
357
+ AND tgrelid = 'platform_principals'::regclass AND NOT tgisinternal) THEN
358
+ CREATE TRIGGER platform_principal_billing_immutable_trigger BEFORE UPDATE ON platform_principals
359
+ FOR EACH ROW EXECUTE FUNCTION platform_principal_billing_immutable();
360
+ END IF;
361
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'platform_rollout_operation_append_only_update_trigger'
362
+ AND tgrelid = 'platform_auth_rollout_operations'::regclass AND NOT tgisinternal) THEN
363
+ CREATE TRIGGER platform_rollout_operation_append_only_update_trigger BEFORE UPDATE ON platform_auth_rollout_operations
364
+ FOR EACH ROW EXECUTE FUNCTION platform_rollout_operation_append_only();
365
+ END IF;
366
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'platform_rollout_operation_append_only_delete_trigger'
367
+ AND tgrelid = 'platform_auth_rollout_operations'::regclass AND NOT tgisinternal) THEN
368
+ CREATE TRIGGER platform_rollout_operation_append_only_delete_trigger BEFORE DELETE ON platform_auth_rollout_operations
369
+ FOR EACH ROW EXECUTE FUNCTION platform_rollout_operation_append_only();
370
+ END IF;
371
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'platform_rollout_evidence_v2_append_only_update_trigger'
372
+ AND tgrelid = 'platform_auth_rollout_evidence_v2'::regclass AND NOT tgisinternal) THEN
373
+ CREATE TRIGGER platform_rollout_evidence_v2_append_only_update_trigger BEFORE UPDATE ON platform_auth_rollout_evidence_v2
374
+ FOR EACH ROW EXECUTE FUNCTION platform_rollout_evidence_v2_append_only();
375
+ END IF;
376
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'platform_rollout_evidence_v2_append_only_delete_trigger'
377
+ AND tgrelid = 'platform_auth_rollout_evidence_v2'::regclass AND NOT tgisinternal) THEN
378
+ CREATE TRIGGER platform_rollout_evidence_v2_append_only_delete_trigger BEFORE DELETE ON platform_auth_rollout_evidence_v2
379
+ FOR EACH ROW EXECUTE FUNCTION platform_rollout_evidence_v2_append_only();
380
+ END IF;
381
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'completed_identity_migration_run_append_only_trigger'
382
+ AND tgrelid = 'identity_migration_runs'::regclass AND NOT tgisinternal) THEN
383
+ CREATE TRIGGER completed_identity_migration_run_append_only_trigger BEFORE UPDATE OR DELETE ON identity_migration_runs
384
+ FOR EACH ROW EXECUTE FUNCTION completed_identity_migration_run_append_only();
385
+ END IF;
386
+ DROP TRIGGER IF EXISTS platform_auth_inventory_candidate_append_only_trigger ON platform_auth_inventory_candidates;
387
+ CREATE TRIGGER platform_auth_inventory_candidate_append_only_trigger BEFORE INSERT OR UPDATE OR DELETE ON platform_auth_inventory_candidates
388
+ FOR EACH ROW EXECUTE FUNCTION platform_auth_inventory_candidate_append_only();
389
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'workos_import_attempt_evidence_append_only_trigger'
390
+ AND tgrelid = 'workos_import_attempt_evidence'::regclass AND NOT tgisinternal) THEN
391
+ CREATE TRIGGER workos_import_attempt_evidence_append_only_trigger BEFORE UPDATE OR DELETE ON workos_import_attempt_evidence
392
+ FOR EACH ROW EXECUTE FUNCTION workos_import_attempt_evidence_append_only();
393
+ END IF;
394
+ EXCEPTION WHEN duplicate_object THEN NULL;
395
+ END
396
+ $platform_identity_triggers$
397
+ `);
398
+ }
399
+ //# sourceMappingURL=platform-identity-schema-postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-identity-schema-postgres.js","sourceRoot":"","sources":["../src/platform-identity-schema-postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { PlatformIdentityQueryable } from './platform-identity-postgres.js';
2
+ /** Transaction-scoped enqueue helpers; callers commit identity/link/email evidence and its event together. */
3
+ export declare function enqueueGoogleIdentitySync(pool: PlatformIdentityQueryable, input: {
4
+ readonly principalId: string;
5
+ readonly transitionId: string;
6
+ readonly createdAt: string;
7
+ }): Promise<void>;
8
+ export declare function enqueueVerifiedEmailChanged(pool: PlatformIdentityQueryable, input: {
9
+ readonly principalId: string;
10
+ readonly transitionId: string;
11
+ readonly createdAt: string;
12
+ }): Promise<void>;
13
+ export declare function enqueueWorkOSExternalIdReconcile(pool: PlatformIdentityQueryable, input: {
14
+ readonly principalId: string;
15
+ readonly provider: string;
16
+ readonly createdAt: string;
17
+ }): Promise<void>;
18
+ //# sourceMappingURL=platform-identity-sync-enqueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-identity-sync-enqueue.d.ts","sourceRoot":"","sources":["../src/platform-identity-sync-enqueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEjF,8GAA8G;AAC9G,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,yBAAyB,EAC/B,KAAK,EAAE;IACL,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GACA,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,yBAAyB,EAC/B,KAAK,EAAE;IACL,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GACA,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,gCAAgC,CACpD,IAAI,EAAE,yBAAyB,EAC/B,KAAK,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC7F,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,25 @@
1
+ /** Transaction-scoped enqueue helpers; callers commit identity/link/email evidence and its event together. */
2
+ export async function enqueueGoogleIdentitySync(pool, input) {
3
+ await pool.query(`INSERT INTO platform_identity_sync_outbox (idempotency_key, principal_id, event_type, created_at)
4
+ VALUES ($1, $2, 'google_identity_upsert', $3) ON CONFLICT (idempotency_key) DO NOTHING`, [
5
+ `google_identity_upsert:${input.principalId}:${input.transitionId}`,
6
+ input.principalId,
7
+ input.createdAt,
8
+ ]);
9
+ }
10
+ export async function enqueueVerifiedEmailChanged(pool, input) {
11
+ await pool.query(`INSERT INTO platform_identity_sync_outbox (idempotency_key, principal_id, event_type, created_at)
12
+ VALUES ($1, $2, 'verified_email_changed', $3) ON CONFLICT (idempotency_key) DO NOTHING`, [
13
+ `verified_email_changed:${input.principalId}:${input.transitionId}`,
14
+ input.principalId,
15
+ input.createdAt,
16
+ ]);
17
+ }
18
+ export async function enqueueWorkOSExternalIdReconcile(pool, input) {
19
+ if (input.provider !== 'workos')
20
+ return;
21
+ await pool.query(`INSERT INTO platform_identity_sync_outbox (idempotency_key, principal_id, event_type, created_at)
22
+ VALUES ($1, $2, 'workos_external_id_reconcile', $3)
23
+ ON CONFLICT (idempotency_key) DO NOTHING`, [`workos_external_id_reconcile:${input.principalId}`, input.principalId, input.createdAt]);
24
+ }
25
+ //# sourceMappingURL=platform-identity-sync-enqueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-identity-sync-enqueue.js","sourceRoot":"","sources":["../src/platform-identity-sync-enqueue.ts"],"names":[],"mappings":"AAEA,8GAA8G;AAC9G,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAA+B,EAC/B,KAIC;IAED,MAAM,IAAI,CAAC,KAAK,CACd;4FACwF,EACxF;QACE,0BAA0B,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE;QACnE,KAAK,CAAC,WAAW;QACjB,KAAK,CAAC,SAAS;KAChB,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAA+B,EAC/B,KAIC;IAED,MAAM,IAAI,CAAC,KAAK,CACd;4FACwF,EACxF;QACE,0BAA0B,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE;QACnE,KAAK,CAAC,WAAW;QACjB,KAAK,CAAC,SAAS;KAChB,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,IAA+B,EAC/B,KAA8F;IAE9F,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO;IACxC,MAAM,IAAI,CAAC,KAAK,CACd;;8CAE0C,EAC1C,CAAC,gCAAgC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAC1F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { PoolClient } from 'pg';
2
+ import type { PlatformIdentitySyncEventType } from './platform-identity-sync.js';
3
+ export interface PlatformIdentitySyncEvidence {
4
+ readonly status: 'active' | 'suspended';
5
+ readonly googleEmails: readonly string[];
6
+ readonly workosEmails: readonly string[];
7
+ readonly sharedGoogleEmailPrincipalCount: number;
8
+ readonly sharedWorkosEmailPrincipalCount: number;
9
+ readonly googleLinkCount: number;
10
+ readonly workosUserIds: readonly string[];
11
+ }
12
+ export declare function loadPlatformIdentitySyncEvidence(client: PoolClient, principalId: string, googleRealm: string, workosRealm: string, lock?: boolean): Promise<PlatformIdentitySyncEvidence>;
13
+ export declare function platformIdentitySyncEmail(eventType: PlatformIdentitySyncEventType, evidence: PlatformIdentitySyncEvidence): string | undefined;
14
+ export declare function isValidPlatformIdentitySyncEvidence(eventType: PlatformIdentitySyncEventType, evidence: PlatformIdentitySyncEvidence): boolean;
15
+ //# sourceMappingURL=platform-identity-sync-evidence-postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-identity-sync-evidence-postgres.d.ts","sourceRoot":"","sources":["../src/platform-identity-sync-evidence-postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAEjF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,+BAA+B,EAAE,MAAM,CAAC;IACjD,QAAQ,CAAC,+BAA+B,EAAE,MAAM,CAAC;IACjD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,IAAI,UAAO,GACV,OAAO,CAAC,4BAA4B,CAAC,CAiEvC;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,6BAA6B,EACxC,QAAQ,EAAE,4BAA4B,GACrC,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,6BAA6B,EACxC,QAAQ,EAAE,4BAA4B,GACrC,OAAO,CAeT"}
@@ -0,0 +1,74 @@
1
+ export async function loadPlatformIdentitySyncEvidence(client, principalId, googleRealm, workosRealm, lock = true) {
2
+ const result = await client.query(`SELECT p.status,
3
+ ARRAY(SELECT DISTINCT e.normalized_email
4
+ FROM platform_verified_emails e
5
+ WHERE e.principal_id = p.principal_id AND e.status = 'active'
6
+ AND e.provider = 'google' AND e.realm = $2
7
+ ORDER BY e.normalized_email) AS google_emails,
8
+ ARRAY(SELECT DISTINCT e.normalized_email
9
+ FROM platform_verified_emails e
10
+ WHERE e.principal_id = p.principal_id AND e.status = 'active'
11
+ AND e.provider = 'workos' AND e.realm = $3
12
+ ORDER BY e.normalized_email) AS workos_emails,
13
+ (SELECT count(DISTINCT peer.principal_id)::text
14
+ FROM platform_verified_emails own
15
+ JOIN platform_verified_emails peer
16
+ ON peer.normalized_email = own.normalized_email AND peer.status = 'active'
17
+ WHERE own.principal_id = p.principal_id AND own.status = 'active'
18
+ AND own.provider = 'google' AND own.realm = $2
19
+ AND peer.principal_id <> p.principal_id) AS shared_google_email_principal_count,
20
+ (SELECT count(DISTINCT peer.principal_id)::text
21
+ FROM platform_verified_emails own
22
+ JOIN platform_verified_emails peer
23
+ ON peer.normalized_email = own.normalized_email AND peer.status = 'active'
24
+ WHERE own.principal_id = p.principal_id AND own.status = 'active'
25
+ AND own.provider = 'workos' AND own.realm = $3
26
+ AND peer.principal_id <> p.principal_id) AS shared_workos_email_principal_count,
27
+ (SELECT count(*)::text FROM platform_identity_links l
28
+ WHERE l.principal_id = p.principal_id AND l.provider = 'google'
29
+ AND l.realm = $2 AND l.disabled_at IS NULL) AS google_link_count,
30
+ ARRAY(SELECT l.external_id FROM platform_identity_links l
31
+ WHERE l.principal_id = p.principal_id AND l.provider = 'workos'
32
+ AND l.realm = $3 AND l.disabled_at IS NULL
33
+ ORDER BY l.external_id) AS workos_user_ids
34
+ FROM platform_principals p WHERE p.principal_id = $1 ${lock ? 'FOR UPDATE' : ''}`, [principalId, googleRealm, workosRealm]);
35
+ const row = result.rows[0];
36
+ return row === undefined
37
+ ? {
38
+ status: 'suspended',
39
+ googleEmails: [],
40
+ workosEmails: [],
41
+ sharedGoogleEmailPrincipalCount: 0,
42
+ sharedWorkosEmailPrincipalCount: 0,
43
+ googleLinkCount: 0,
44
+ workosUserIds: [],
45
+ }
46
+ : {
47
+ status: row.status,
48
+ googleEmails: row.google_emails,
49
+ workosEmails: row.workos_emails,
50
+ sharedGoogleEmailPrincipalCount: Number(row.shared_google_email_principal_count),
51
+ sharedWorkosEmailPrincipalCount: Number(row.shared_workos_email_principal_count),
52
+ googleLinkCount: Number(row.google_link_count),
53
+ workosUserIds: row.workos_user_ids,
54
+ };
55
+ }
56
+ export function platformIdentitySyncEmail(eventType, evidence) {
57
+ const emails = eventType === 'workos_external_id_reconcile' ? evidence.workosEmails : evidence.googleEmails;
58
+ return emails.length === 1 ? emails[0] : undefined;
59
+ }
60
+ export function isValidPlatformIdentitySyncEvidence(eventType, evidence) {
61
+ const email = platformIdentitySyncEmail(eventType, evidence);
62
+ const sharedEmailPrincipalCount = eventType === 'workos_external_id_reconcile'
63
+ ? evidence.sharedWorkosEmailPrincipalCount
64
+ : evidence.sharedGoogleEmailPrincipalCount;
65
+ if (evidence.status !== 'active' ||
66
+ email === undefined ||
67
+ sharedEmailPrincipalCount !== 0 ||
68
+ evidence.workosUserIds.length > 1)
69
+ return false;
70
+ if (eventType === 'workos_external_id_reconcile')
71
+ return evidence.workosUserIds.length === 1;
72
+ return evidence.googleLinkCount === 1;
73
+ }
74
+ //# sourceMappingURL=platform-identity-sync-evidence-postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-identity-sync-evidence-postgres.js","sourceRoot":"","sources":["../src/platform-identity-sync-evidence-postgres.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,MAAkB,EAClB,WAAmB,EACnB,WAAmB,EACnB,WAAmB,EACnB,IAAI,GAAG,IAAI;IAEX,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAS/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8DAgC0D,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EACpF,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CACxC,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,GAAG,KAAK,SAAS;QACtB,CAAC,CAAC;YACE,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,+BAA+B,EAAE,CAAC;YAClC,+BAA+B,EAAE,CAAC;YAClC,eAAe,EAAE,CAAC;YAClB,aAAa,EAAE,EAAE;SAClB;QACH,CAAC,CAAC;YACE,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,+BAA+B,EAAE,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC;YAChF,+BAA+B,EAAE,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC;YAChF,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC;YAC9C,aAAa,EAAE,GAAG,CAAC,eAAe;SACnC,CAAC;AACR,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,SAAwC,EACxC,QAAsC;IAEtC,MAAM,MAAM,GACV,SAAS,KAAK,8BAA8B,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;IAC/F,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,SAAwC,EACxC,QAAsC;IAEtC,MAAM,KAAK,GAAG,yBAAyB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,yBAAyB,GAC7B,SAAS,KAAK,8BAA8B;QAC1C,CAAC,CAAC,QAAQ,CAAC,+BAA+B;QAC1C,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC/C,IACE,QAAQ,CAAC,MAAM,KAAK,QAAQ;QAC5B,KAAK,KAAK,SAAS;QACnB,yBAAyB,KAAK,CAAC;QAC/B,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAEjC,OAAO,KAAK,CAAC;IACf,IAAI,SAAS,KAAK,8BAA8B;QAAE,OAAO,QAAQ,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7F,OAAO,QAAQ,CAAC,eAAe,KAAK,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Pool } from 'pg';
2
+ import type { PlatformIdentityQueryable } from './platform-identity-schema-postgres.js';
3
+ import type { PlatformIdentitySyncLease, PlatformIdentitySyncStore } from './platform-identity-sync.js';
4
+ /** Additive upgrade kept separate so the already-large canonical identity schema stays reviewable. */
5
+ export declare function ensurePlatformIdentitySyncOutboxSchema(pool: PlatformIdentityQueryable): Promise<void>;
6
+ /** Durable, lease-fenced outbox adapter. Remote calls occur only after the claim transaction commits. */
7
+ export declare class PostgresPlatformIdentitySyncStore implements PlatformIdentitySyncStore {
8
+ #private;
9
+ constructor(pool: Pool, input: {
10
+ readonly workosRealm: string;
11
+ readonly googleRealm?: string;
12
+ });
13
+ claimBatch(input: {
14
+ readonly limit: number;
15
+ readonly leaseSeconds: number;
16
+ }): Promise<readonly PlatformIdentitySyncLease[]>;
17
+ finish(lease: PlatformIdentitySyncLease, result: Parameters<PlatformIdentitySyncStore['finish']>[1]): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=platform-identity-sync-postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-identity-sync-postgres.d.ts","sourceRoot":"","sources":["../src/platform-identity-sync-postgres.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,IAAI,CAAC;AAC3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,KAAK,EAEV,yBAAyB,EAEzB,yBAAyB,EAC1B,MAAM,6BAA6B,CAAC;AAYrC,sGAAsG;AACtG,wBAAsB,sCAAsC,CAC1D,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAsEf;AAED,yGAAyG;AACzG,qBAAa,iCAAkC,YAAW,yBAAyB;;gBAKrE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAMxF,UAAU,CAAC,KAAK,EAAE;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,GAAG,OAAO,CAAC,SAAS,yBAAyB,EAAE,CAAC;IAsE3C,MAAM,CACV,KAAK,EAAE,yBAAyB,EAChC,MAAM,EAAE,UAAU,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC;CAuEjB"}