@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,435 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { ensurePlatformAuthInventorySourceFenceSchema } from './platform-auth-inventory-source-fence-postgres.js';
3
+ /** Additive Task 3 storage kept separate from the canonical identity schema. */
4
+ export async function ensurePlatformAuthMigrationSchema(pool) {
5
+ await pool.query(`
6
+ ALTER TABLE platform_auth_rollout_state
7
+ ADD COLUMN IF NOT EXISTS workos_client_fingerprint text
8
+ CHECK (workos_client_fingerprint IS NULL OR workos_client_fingerprint ~ '^[0-9a-f]{64}$'),
9
+ ADD COLUMN IF NOT EXISTS workos_realm_fingerprint text
10
+ CHECK (workos_realm_fingerprint IS NULL OR workos_realm_fingerprint ~ '^[0-9a-f]{64}$'),
11
+ ADD COLUMN IF NOT EXISTS rollout_inventory_run_id text,
12
+ ADD COLUMN IF NOT EXISTS rollout_inventory_checksum text
13
+ CHECK (rollout_inventory_checksum IS NULL OR rollout_inventory_checksum ~ '^[0-9a-f]{64}$'),
14
+ ADD COLUMN IF NOT EXISTS rollout_import_run_id text,
15
+ ADD COLUMN IF NOT EXISTS rollout_import_lineage_checksum text
16
+ CHECK (rollout_import_lineage_checksum IS NULL OR rollout_import_lineage_checksum ~ '^[0-9a-f]{64}$'),
17
+ ADD COLUMN IF NOT EXISTS workos_recovery_enabled boolean NOT NULL DEFAULT false
18
+ `);
19
+ await pool.query(`
20
+ CREATE TABLE IF NOT EXISTS platform_auth_inventory_candidates (
21
+ migration_run_id text NOT NULL REFERENCES identity_migration_runs(id) ON DELETE RESTRICT,
22
+ source_subject text NOT NULL,
23
+ source_realm text NOT NULL,
24
+ principal_id text REFERENCES platform_principals(principal_id) ON DELETE RESTRICT,
25
+ normalized_email text,
26
+ email_fingerprint text,
27
+ provenance text[] NOT NULL,
28
+ blocker_codes text[] NOT NULL DEFAULT '{}'::text[],
29
+ source_fingerprint text NOT NULL,
30
+ candidate_fingerprint text,
31
+ created_at timestamptz NOT NULL DEFAULT now(),
32
+ PRIMARY KEY (migration_run_id, source_subject),
33
+ CHECK (cardinality(provenance) >= 1),
34
+ CHECK (provenance <@ ARRAY['principal', 'google_link', 'google_billing', 'org_membership', 'refresh_family', 'developer_grant', 'owner_only_deployer', 'consent_grant', 'device_authorization', 'welcome_provisioning']::text[]),
35
+ CHECK (source_fingerprint ~ '^[0-9a-f]{64}$'),
36
+ CHECK (email_fingerprint IS NULL OR email_fingerprint ~ '^[0-9a-f]{64}$'),
37
+ CHECK (blocker_codes <@ ARRAY['missing_verified_email', 'multiple_current_verified_emails', 'shared_verified_email', 'external_id_too_long', 'conflicting_workos_user', 'ambiguous_platform_customer_evidence']::text[])
38
+ )
39
+ `);
40
+ await pool.query(`
41
+ ALTER TABLE platform_auth_inventory_candidates
42
+ ADD COLUMN IF NOT EXISTS candidate_fingerprint text,
43
+ ADD COLUMN IF NOT EXISTS source_realm text
44
+ `);
45
+ await pool.query(`
46
+ CREATE TABLE IF NOT EXISTS platform_auth_inventory_progress (
47
+ migration_run_id text PRIMARY KEY REFERENCES identity_migration_runs(id) ON DELETE RESTRICT,
48
+ phase text NOT NULL CHECK (phase IN ('remote', 'local', 'completed')),
49
+ remote_after text,
50
+ remote_page_count integer NOT NULL DEFAULT 0 CHECK (remote_page_count >= 0),
51
+ remote_user_count integer NOT NULL DEFAULT 0 CHECK (remote_user_count >= 0),
52
+ remote_chain_hash text NOT NULL CHECK (remote_chain_hash ~ '^[0-9a-f]{64}$'),
53
+ local_after_subject text,
54
+ local_subject_count integer NOT NULL DEFAULT 0 CHECK (local_subject_count >= 0),
55
+ candidate_count integer NOT NULL DEFAULT 0 CHECK (candidate_count >= 0),
56
+ excluded_count integer NOT NULL DEFAULT 0 CHECK (excluded_count >= 0),
57
+ candidate_chain_hash text NOT NULL CHECK (candidate_chain_hash ~ '^[0-9a-f]{64}$'),
58
+ excluded_chain_hash text NOT NULL CHECK (excluded_chain_hash ~ '^[0-9a-f]{64}$'),
59
+ artifact_counts jsonb,
60
+ blocker_counts jsonb NOT NULL DEFAULT '{}'::jsonb,
61
+ terminal_error text CHECK (terminal_error IS NULL OR terminal_error = 'inventory_unavailable'),
62
+ lease_token_hash text CHECK (lease_token_hash IS NULL OR lease_token_hash ~ '^[0-9a-f]{64}$'),
63
+ lease_expires_at timestamptz,
64
+ created_at timestamptz NOT NULL DEFAULT now(),
65
+ updated_at timestamptz NOT NULL DEFAULT now(),
66
+ CHECK ((lease_token_hash IS NULL) = (lease_expires_at IS NULL)),
67
+ CHECK ((phase = 'remote' AND local_after_subject IS NULL)
68
+ OR phase IN ('local', 'completed'))
69
+ )
70
+ `);
71
+ await ensurePlatformAuthInventorySourceFenceSchema(pool);
72
+ await pool.query(`
73
+ CREATE TABLE IF NOT EXISTS platform_auth_inventory_remote_pages (
74
+ migration_run_id text NOT NULL REFERENCES identity_migration_runs(id) ON DELETE RESTRICT,
75
+ page_number integer NOT NULL CHECK (page_number >= 0),
76
+ input_cursor_fingerprint text NOT NULL CHECK (input_cursor_fingerprint ~ '^[0-9a-f]{64}$'),
77
+ next_cursor text,
78
+ next_cursor_fingerprint text CHECK (next_cursor_fingerprint IS NULL OR next_cursor_fingerprint ~ '^[0-9a-f]{64}$'),
79
+ row_count integer NOT NULL CHECK (row_count BETWEEN 0 AND 100),
80
+ page_fingerprint text NOT NULL CHECK (page_fingerprint ~ '^[0-9a-f]{64}$'),
81
+ created_at timestamptz NOT NULL DEFAULT now(),
82
+ PRIMARY KEY (migration_run_id, page_number),
83
+ UNIQUE (migration_run_id, input_cursor_fingerprint)
84
+ )
85
+ `);
86
+ await pool.query(`
87
+ CREATE TABLE IF NOT EXISTS platform_auth_inventory_remote_users (
88
+ migration_run_id text NOT NULL REFERENCES identity_migration_runs(id) ON DELETE RESTRICT,
89
+ remote_user_id text NOT NULL,
90
+ external_id text,
91
+ normalized_email text NOT NULL,
92
+ verified boolean NOT NULL,
93
+ page_number integer NOT NULL,
94
+ ordinal integer NOT NULL CHECK (ordinal >= 0 AND ordinal < 100),
95
+ row_fingerprint text NOT NULL CHECK (row_fingerprint ~ '^[0-9a-f]{64}$'),
96
+ created_at timestamptz NOT NULL DEFAULT now(),
97
+ PRIMARY KEY (migration_run_id, remote_user_id),
98
+ FOREIGN KEY (migration_run_id, page_number)
99
+ REFERENCES platform_auth_inventory_remote_pages(migration_run_id, page_number)
100
+ ON DELETE RESTRICT
101
+ )
102
+ `);
103
+ await pool.query(`
104
+ CREATE INDEX IF NOT EXISTS platform_auth_inventory_remote_users_email_idx
105
+ ON platform_auth_inventory_remote_users (migration_run_id, normalized_email)
106
+ `);
107
+ await pool.query(`
108
+ CREATE INDEX IF NOT EXISTS platform_auth_inventory_remote_users_external_idx
109
+ ON platform_auth_inventory_remote_users (migration_run_id, external_id)
110
+ WHERE external_id IS NOT NULL
111
+ `);
112
+ await pool.query(`
113
+ CREATE TABLE IF NOT EXISTS platform_auth_inventory_exclusions (
114
+ migration_run_id text NOT NULL REFERENCES identity_migration_runs(id) ON DELETE RESTRICT,
115
+ subject_fingerprint text NOT NULL CHECK (subject_fingerprint ~ '^[0-9a-f]{64}$'),
116
+ exclusion_kind text NOT NULL CHECK (exclusion_kind IN ('non_platform_identity', 'suspended_principal', 'suspended_principal_with_authority', 'workload', 'synthetic')),
117
+ entry_fingerprint text NOT NULL CHECK (entry_fingerprint ~ '^[0-9a-f]{64}$'),
118
+ created_at timestamptz NOT NULL DEFAULT now(),
119
+ PRIMARY KEY (migration_run_id, subject_fingerprint)
120
+ )
121
+ `);
122
+ await pool.query(`
123
+ ALTER TABLE platform_auth_inventory_candidates
124
+ DROP CONSTRAINT IF EXISTS platform_auth_inventory_candidates_provenance_check
125
+ `);
126
+ await pool.query(`
127
+ ALTER TABLE platform_auth_inventory_candidates
128
+ ADD CONSTRAINT platform_auth_inventory_candidates_provenance_check
129
+ CHECK (provenance <@ ARRAY['principal', 'google_link', 'google_billing', 'org_membership', 'refresh_family', 'developer_grant', 'owner_only_deployer', 'consent_grant', 'device_authorization', 'welcome_provisioning']::text[]) NOT VALID
130
+ `);
131
+ await pool.query(`
132
+ ALTER TABLE identity_migration_runs
133
+ DROP CONSTRAINT IF EXISTS identity_migration_runs_inventory_format_check
134
+ `);
135
+ await pool.query(`
136
+ ALTER TABLE identity_migration_runs
137
+ ADD CONSTRAINT identity_migration_runs_inventory_format_check
138
+ CHECK (inventory_format IS NULL OR inventory_format IN ('legacy_v0', 'v1', 'v2')) NOT VALID
139
+ `);
140
+ await pool.query(`
141
+ CREATE OR REPLACE FUNCTION platform_auth_inventory_staging_append_only() RETURNS trigger AS $$
142
+ BEGIN
143
+ IF TG_OP = 'INSERT' THEN
144
+ IF NOT EXISTS (SELECT 1 FROM identity_migration_runs
145
+ WHERE id = NEW.migration_run_id AND kind = 'inventory' AND state = 'running') THEN
146
+ RAISE EXCEPTION 'completed inventory staging is frozen';
147
+ END IF;
148
+ RETURN NEW;
149
+ END IF;
150
+ RAISE EXCEPTION 'platform auth inventory staging is append-only';
151
+ END;
152
+ $$ LANGUAGE plpgsql
153
+ `);
154
+ await pool.query(`
155
+ CREATE OR REPLACE FUNCTION platform_auth_inventory_progress_guard() RETURNS trigger AS $$
156
+ BEGIN
157
+ IF TG_OP = 'DELETE' OR OLD.phase = 'completed' OR OLD.terminal_error IS NOT NULL THEN
158
+ RAISE EXCEPTION 'terminal inventory progress is immutable';
159
+ END IF;
160
+ IF OLD.migration_run_id IS DISTINCT FROM NEW.migration_run_id
161
+ OR NEW.remote_page_count < OLD.remote_page_count
162
+ OR NEW.remote_user_count < OLD.remote_user_count
163
+ OR NEW.local_subject_count < OLD.local_subject_count
164
+ OR NEW.candidate_count < OLD.candidate_count
165
+ OR NEW.excluded_count < OLD.excluded_count
166
+ OR (OLD.local_source_epoch IS NOT NULL
167
+ AND NEW.local_source_epoch IS DISTINCT FROM OLD.local_source_epoch)
168
+ OR (OLD.local_snapshot_at IS NOT NULL
169
+ AND NEW.local_snapshot_at IS DISTINCT FROM OLD.local_snapshot_at)
170
+ OR (OLD.phase = 'local' AND NEW.phase = 'remote') THEN
171
+ RAISE EXCEPTION 'inventory progress cannot move backwards';
172
+ END IF;
173
+ RETURN NEW;
174
+ END;
175
+ $$ LANGUAGE plpgsql
176
+ `);
177
+ await pool.query(`
178
+ DROP TRIGGER IF EXISTS platform_auth_inventory_remote_pages_append_only_trigger
179
+ ON platform_auth_inventory_remote_pages;
180
+ CREATE TRIGGER platform_auth_inventory_remote_pages_append_only_trigger
181
+ BEFORE INSERT OR UPDATE OR DELETE ON platform_auth_inventory_remote_pages
182
+ FOR EACH ROW EXECUTE FUNCTION platform_auth_inventory_staging_append_only();
183
+ DROP TRIGGER IF EXISTS platform_auth_inventory_remote_users_append_only_trigger
184
+ ON platform_auth_inventory_remote_users;
185
+ CREATE TRIGGER platform_auth_inventory_remote_users_append_only_trigger
186
+ BEFORE INSERT OR UPDATE OR DELETE ON platform_auth_inventory_remote_users
187
+ FOR EACH ROW EXECUTE FUNCTION platform_auth_inventory_staging_append_only();
188
+ DROP TRIGGER IF EXISTS platform_auth_inventory_exclusions_append_only_trigger
189
+ ON platform_auth_inventory_exclusions;
190
+ CREATE TRIGGER platform_auth_inventory_exclusions_append_only_trigger
191
+ BEFORE INSERT OR UPDATE OR DELETE ON platform_auth_inventory_exclusions
192
+ FOR EACH ROW EXECUTE FUNCTION platform_auth_inventory_staging_append_only();
193
+ DROP TRIGGER IF EXISTS platform_auth_inventory_progress_guard_trigger
194
+ ON platform_auth_inventory_progress;
195
+ CREATE TRIGGER platform_auth_inventory_progress_guard_trigger
196
+ BEFORE UPDATE OR DELETE ON platform_auth_inventory_progress
197
+ FOR EACH ROW EXECUTE FUNCTION platform_auth_inventory_progress_guard()
198
+ `);
199
+ await pool.query(`
200
+ CREATE TABLE IF NOT EXISTS platform_auth_rollout_previews (
201
+ checksum text PRIMARY KEY CHECK (checksum ~ '^[0-9a-f]{64}$'),
202
+ expected_generation bigint NOT NULL CHECK (expected_generation >= 0),
203
+ operation text NOT NULL CHECK (operation IN ('activate', 'rollback', 'finalize')),
204
+ percentage integer NOT NULL CHECK (percentage BETWEEN 0 AND 100),
205
+ cohort_mode text NOT NULL CHECK (cohort_mode IN ('preserve', 'replace')),
206
+ canary_client_set_hash text NOT NULL CHECK (canary_client_set_hash ~ '^[0-9a-f]{64}$'),
207
+ canary_client_count integer NOT NULL CHECK (canary_client_count >= 0),
208
+ recovery_client_set_hash text NOT NULL CHECK (recovery_client_set_hash ~ '^[0-9a-f]{64}$'),
209
+ recovery_client_count integer NOT NULL CHECK (recovery_client_count >= 0),
210
+ release_sha text NOT NULL CHECK (release_sha ~ '^[0-9a-f]{40}$'),
211
+ inventory_run_hash text,
212
+ inventory_checksum text,
213
+ import_run_hash text,
214
+ import_lineage_checksum text,
215
+ workos_realm_fingerprint text,
216
+ workos_client_fingerprint text
217
+ CHECK (workos_client_fingerprint IS NULL OR workos_client_fingerprint ~ '^[0-9a-f]{64}$'),
218
+ rollback_rehearsal_checksum text
219
+ CHECK (rollback_rehearsal_checksum IS NULL OR rollback_rehearsal_checksum ~ '^[0-9a-f]{64}$'),
220
+ staging_workos_only_smoke_checksum text
221
+ CHECK (staging_workos_only_smoke_checksum IS NULL OR staging_workos_only_smoke_checksum ~ '^[0-9a-f]{64}$'),
222
+ aggregate_checksum text NOT NULL CHECK (aggregate_checksum ~ '^[0-9a-f]{64}$'),
223
+ expires_at timestamptz NOT NULL,
224
+ created_at timestamptz NOT NULL DEFAULT now()
225
+ )
226
+ `);
227
+ await pool.query(`
228
+ ALTER TABLE platform_auth_rollout_previews
229
+ ADD COLUMN IF NOT EXISTS inventory_run_hash text,
230
+ ADD COLUMN IF NOT EXISTS inventory_checksum text,
231
+ ADD COLUMN IF NOT EXISTS import_run_hash text,
232
+ ADD COLUMN IF NOT EXISTS import_lineage_checksum text,
233
+ ADD COLUMN IF NOT EXISTS cohort_mode text,
234
+ ADD COLUMN IF NOT EXISTS workos_realm_fingerprint text,
235
+ ADD COLUMN IF NOT EXISTS workos_client_fingerprint text
236
+ CHECK (workos_client_fingerprint IS NULL OR workos_client_fingerprint ~ '^[0-9a-f]{64}$'),
237
+ ADD COLUMN IF NOT EXISTS rollback_rehearsal_checksum text
238
+ CHECK (rollback_rehearsal_checksum IS NULL OR rollback_rehearsal_checksum ~ '^[0-9a-f]{64}$'),
239
+ ADD COLUMN IF NOT EXISTS staging_workos_only_smoke_checksum text
240
+ CHECK (staging_workos_only_smoke_checksum IS NULL OR staging_workos_only_smoke_checksum ~ '^[0-9a-f]{64}$')
241
+ `);
242
+ await pool.query(`
243
+ CREATE TABLE IF NOT EXISTS platform_auth_rollout_evidence_v2 (
244
+ idempotency_key_hash text PRIMARY KEY CHECK (idempotency_key_hash ~ '^[0-9a-f]{64}$'),
245
+ request_fingerprint text NOT NULL CHECK (request_fingerprint ~ '^[0-9a-f]{64}$'),
246
+ replay_request_fingerprint text
247
+ CHECK (replay_request_fingerprint IS NULL OR replay_request_fingerprint ~ '^[0-9a-f]{64}$'),
248
+ actor_fingerprint text CHECK (actor_fingerprint IS NULL OR actor_fingerprint ~ '^[0-9a-f]{64}$'),
249
+ operation text NOT NULL CHECK (operation IN ('activate', 'rollback', 'finalize')),
250
+ release_sha text NOT NULL CHECK (release_sha ~ '^[0-9a-f]{40}$'),
251
+ preview_checksum text NOT NULL CHECK (preview_checksum ~ '^[0-9a-f]{64}$'),
252
+ lineage_fingerprint text,
253
+ rollback_rehearsal_checksum text
254
+ CHECK (rollback_rehearsal_checksum IS NULL OR rollback_rehearsal_checksum ~ '^[0-9a-f]{64}$'),
255
+ staging_workos_only_smoke_checksum text
256
+ CHECK (staging_workos_only_smoke_checksum IS NULL OR staging_workos_only_smoke_checksum ~ '^[0-9a-f]{64}$'),
257
+ prior_state jsonb NOT NULL,
258
+ applied_state jsonb NOT NULL,
259
+ created_at timestamptz NOT NULL DEFAULT now()
260
+ )
261
+ `);
262
+ await pool.query(`
263
+ ALTER TABLE platform_auth_rollout_evidence_v2
264
+ ADD COLUMN IF NOT EXISTS lineage_fingerprint text,
265
+ ADD COLUMN IF NOT EXISTS replay_request_fingerprint text
266
+ CHECK (replay_request_fingerprint IS NULL OR replay_request_fingerprint ~ '^[0-9a-f]{64}$'),
267
+ ADD COLUMN IF NOT EXISTS rollback_rehearsal_checksum text
268
+ CHECK (rollback_rehearsal_checksum IS NULL OR rollback_rehearsal_checksum ~ '^[0-9a-f]{64}$'),
269
+ ADD COLUMN IF NOT EXISTS staging_workos_only_smoke_checksum text
270
+ CHECK (staging_workos_only_smoke_checksum IS NULL OR staging_workos_only_smoke_checksum ~ '^[0-9a-f]{64}$')
271
+ `);
272
+ }
273
+ /**
274
+ * Upgrades the rollout clock and frozen inventory shape shipped by preceding releases. Original inventory
275
+ * checksums remain unchanged; unsupported custom-realm evidence fails closed instead of guessing mutable
276
+ * identity state.
277
+ */
278
+ export async function upgradePlatformAuthMigrationSchema(pool) {
279
+ const connection = pool.connect === undefined ? pool : await pool.connect();
280
+ try {
281
+ await connection.query('BEGIN');
282
+ await connection.query('SELECT pg_advisory_xact_lock(hashtextextended($1, 0))', [
283
+ 'platform-auth-inventory-schema:v1',
284
+ ]);
285
+ await connection.query('ALTER TABLE platform_auth_rollout_state ADD COLUMN IF NOT EXISTS workos_stage_since timestamptz');
286
+ await connection.query('UPDATE platform_auth_rollout_state SET workos_stage_since = COALESCE(workos_stage_since, workos_default_since, updated_at) WHERE workos_percentage > 0 AND workos_stage_since IS NULL');
287
+ await connection.query('LOCK TABLE identity_migration_runs, platform_auth_inventory_candidates IN ACCESS EXCLUSIVE MODE');
288
+ const triggers = await connection.query(`SELECT trigger.tgname
289
+ FROM pg_trigger trigger
290
+ WHERE NOT trigger.tgisinternal
291
+ AND (
292
+ (trigger.tgname = 'completed_identity_migration_run_append_only_trigger'
293
+ AND trigger.tgrelid = to_regclass('identity_migration_runs'))
294
+ OR
295
+ (trigger.tgname = 'platform_auth_inventory_candidate_append_only_trigger'
296
+ AND trigger.tgrelid = to_regclass('platform_auth_inventory_candidates'))
297
+ )`);
298
+ const triggerNames = new Set(triggers.rows.map((row) => row.tgname));
299
+ if (triggerNames.has('completed_identity_migration_run_append_only_trigger'))
300
+ await connection.query('ALTER TABLE identity_migration_runs DISABLE TRIGGER completed_identity_migration_run_append_only_trigger');
301
+ if (triggerNames.has('platform_auth_inventory_candidate_append_only_trigger'))
302
+ await connection.query('ALTER TABLE platform_auth_inventory_candidates DISABLE TRIGGER platform_auth_inventory_candidate_append_only_trigger');
303
+ const runs = await connection.query(`SELECT id, frozen_checksum, source_fingerprint, workos_realm_fingerprint,
304
+ google_realm, excluded_fingerprint, inventory_format, safe_result
305
+ FROM identity_migration_runs
306
+ WHERE kind = 'inventory' AND state = 'completed' AND inventory_format IS NULL
307
+ ORDER BY id FOR UPDATE`);
308
+ for (const run of runs.rows) {
309
+ const candidates = await connection.query(`SELECT migration_run_id, source_subject, source_realm, principal_id,
310
+ normalized_email, email_fingerprint, provenance, blocker_codes,
311
+ source_fingerprint, candidate_fingerprint
312
+ FROM platform_auth_inventory_candidates
313
+ WHERE migration_run_id = $1 ORDER BY source_subject FOR UPDATE`, [run.id]);
314
+ const isLegacy = run.google_realm === null ||
315
+ run.excluded_fingerprint === null ||
316
+ candidates.rows.some((candidate) => candidate.source_realm === null || candidate.candidate_fingerprint === null);
317
+ if (!isLegacy) {
318
+ await connection.query("UPDATE identity_migration_runs SET inventory_format = 'v1' WHERE id = $1", [run.id]);
319
+ continue;
320
+ }
321
+ await upgradeLegacyInventory(connection, run, candidates.rows);
322
+ }
323
+ await connection.query('ALTER TABLE identity_migration_runs DROP CONSTRAINT IF EXISTS identity_migration_runs_inventory_format_check');
324
+ await connection.query("ALTER TABLE identity_migration_runs ADD CONSTRAINT identity_migration_runs_inventory_format_check CHECK (inventory_format IS NULL OR inventory_format IN ('legacy_v0', 'v1', 'v2')) NOT VALID");
325
+ await connection.query('ALTER TABLE identity_migration_runs VALIDATE CONSTRAINT identity_migration_runs_inventory_format_check');
326
+ if (triggerNames.has('platform_auth_inventory_candidate_append_only_trigger'))
327
+ await connection.query('ALTER TABLE platform_auth_inventory_candidates ENABLE TRIGGER platform_auth_inventory_candidate_append_only_trigger');
328
+ if (triggerNames.has('completed_identity_migration_run_append_only_trigger'))
329
+ await connection.query('ALTER TABLE identity_migration_runs ENABLE TRIGGER completed_identity_migration_run_append_only_trigger');
330
+ await connection.query('COMMIT');
331
+ }
332
+ catch (error) {
333
+ await connection.query('ROLLBACK').catch(() => undefined);
334
+ throw error;
335
+ }
336
+ finally {
337
+ connection.release?.();
338
+ }
339
+ }
340
+ async function upgradeLegacyInventory(connection, run, candidates) {
341
+ const googleRealm = run.google_realm ?? 'accounts.google.com';
342
+ const blockerCounts = new Map();
343
+ const checksumEntries = [];
344
+ for (const candidate of candidates) {
345
+ const realmFingerprint = schemaHash({
346
+ subject: candidate.source_subject,
347
+ realm: googleRealm,
348
+ provenance: candidate.provenance,
349
+ });
350
+ const omittedRealmFingerprint = schemaHash({
351
+ subject: candidate.source_subject,
352
+ provenance: candidate.provenance,
353
+ });
354
+ if ((candidate.source_realm !== null && candidate.source_realm !== googleRealm) ||
355
+ (candidate.source_fingerprint !== realmFingerprint &&
356
+ candidate.source_fingerprint !== omittedRealmFingerprint) ||
357
+ (candidate.normalized_email === null) !== (candidate.email_fingerprint === null) ||
358
+ (candidate.normalized_email !== null &&
359
+ candidate.email_fingerprint !== schemaHash(candidate.normalized_email)))
360
+ throw new Error('legacy platform-auth inventory lineage cannot be upgraded safely');
361
+ for (const code of candidate.blocker_codes)
362
+ blockerCounts.set(code, (blockerCounts.get(code) ?? 0) + 1);
363
+ const candidateFingerprint = candidateDigest(candidate);
364
+ await connection.query(`UPDATE platform_auth_inventory_candidates
365
+ SET source_realm = $3, candidate_fingerprint = $4
366
+ WHERE migration_run_id = $1 AND source_subject = $2`, [run.id, candidate.source_subject, googleRealm, candidateFingerprint]);
367
+ checksumEntries.push({
368
+ sourceFingerprint: candidate.source_fingerprint,
369
+ emailFingerprint: candidate.email_fingerprint ?? undefined,
370
+ provenance: candidate.provenance,
371
+ blockerCodes: candidate.blocker_codes,
372
+ });
373
+ }
374
+ const safe = normalizeLegacySafeResult(run.safe_result, candidates.length, blockerCounts);
375
+ if (run.frozen_checksum === null ||
376
+ run.source_fingerprint !== schemaHash(checksumEntries) ||
377
+ run.workos_realm_fingerprint === null ||
378
+ run.frozen_checksum !==
379
+ schemaHash({
380
+ algorithm: 'inventory-v1',
381
+ googleRealm,
382
+ workosRealm: run.workos_realm_fingerprint,
383
+ safe,
384
+ candidates: checksumEntries,
385
+ }))
386
+ throw new Error('legacy platform-auth inventory lineage cannot be upgraded safely');
387
+ await connection.query(`UPDATE identity_migration_runs
388
+ SET google_realm = $2, inventory_format = 'legacy_v0'
389
+ WHERE id = $1`, [run.id, googleRealm]);
390
+ }
391
+ function candidateDigest(candidate) {
392
+ return schemaHash({
393
+ sourceFingerprint: candidate.source_fingerprint,
394
+ principalFingerprint: candidate.principal_id === null ? undefined : schemaHash(candidate.principal_id),
395
+ emailFingerprint: candidate.email_fingerprint ?? undefined,
396
+ provenance: candidate.provenance,
397
+ blockerCodes: candidate.blocker_codes,
398
+ });
399
+ }
400
+ function normalizeLegacySafeResult(value, candidateCount, blockerCounts) {
401
+ if (typeof value !== 'object' || value === null)
402
+ throw new Error('legacy platform-auth inventory lineage cannot be upgraded safely');
403
+ const stored = value;
404
+ if (stored.candidateCount !== candidateCount ||
405
+ typeof stored.excludedCount !== 'number' ||
406
+ !Number.isInteger(stored.excludedCount) ||
407
+ stored.excludedCount < 0 ||
408
+ typeof stored.blockers !== 'object' ||
409
+ stored.blockers === null)
410
+ throw new Error('legacy platform-auth inventory lineage cannot be upgraded safely');
411
+ const blockers = {};
412
+ for (const code of LEGACY_BLOCKER_ORDER) {
413
+ const expected = blockerCounts.get(code) ?? 0;
414
+ if ((stored.blockers[code] ?? 0) !== expected)
415
+ throw new Error('legacy platform-auth inventory lineage cannot be upgraded safely');
416
+ if (expected > 0)
417
+ blockers[code] = expected;
418
+ }
419
+ if (Object.keys(stored.blockers).some((code) => !LEGACY_BLOCKER_SET.has(code)))
420
+ throw new Error('legacy platform-auth inventory lineage cannot be upgraded safely');
421
+ return { candidateCount, excludedCount: stored.excludedCount, blockers };
422
+ }
423
+ const LEGACY_BLOCKER_ORDER = [
424
+ 'ambiguous_platform_customer_evidence',
425
+ 'missing_verified_email',
426
+ 'multiple_current_verified_emails',
427
+ 'external_id_too_long',
428
+ 'shared_verified_email',
429
+ 'conflicting_workos_user',
430
+ ];
431
+ const LEGACY_BLOCKER_SET = new Set(LEGACY_BLOCKER_ORDER);
432
+ function schemaHash(value) {
433
+ return createHash('sha256').update(JSON.stringify(value)).digest('hex');
434
+ }
435
+ //# sourceMappingURL=platform-auth-migration-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-auth-migration-schema.js","sourceRoot":"","sources":["../src/platform-auth-migration-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ export type PlatformAuthBlockerCode = 'missing_verified_email' | 'multiple_current_verified_emails' | 'shared_verified_email' | 'external_id_too_long' | 'conflicting_workos_user' | 'ambiguous_platform_customer_evidence';
2
+ export interface PlatformAuthInventory {
3
+ readonly candidateCount: number;
4
+ readonly excludedCount: number;
5
+ readonly blockers: Readonly<Partial<Record<PlatformAuthBlockerCode, number>>>;
6
+ readonly checksum: string;
7
+ }
8
+ /** Only authoritative current roots are accepted; historical/audit evidence is intentionally not a root. */
9
+ export interface PlatformAuthInventoryInput {
10
+ readonly principals: readonly {
11
+ readonly principalId: string;
12
+ readonly verifiedEmails: readonly string[];
13
+ }[];
14
+ readonly orgMemberships: readonly string[];
15
+ readonly googleBillingOwners: readonly string[];
16
+ readonly activeRefreshFamilies: readonly string[];
17
+ readonly developerGrants: readonly string[];
18
+ readonly ownerOnlyDeployers: readonly {
19
+ readonly subject: string;
20
+ readonly kind: 'human' | 'github_run' | 'workload' | 'synthetic';
21
+ }[];
22
+ readonly excludedActors: readonly {
23
+ readonly subject: string;
24
+ readonly kind: 'customer' | 'delegated' | 'assistant' | 'github_run' | 'workload' | 'synthetic' | 'invitation' | 'allowlist_only' | 'audit_only';
25
+ }[];
26
+ readonly workosUsers: readonly {
27
+ readonly externalId: string | undefined;
28
+ readonly normalizedEmail: string;
29
+ readonly verified: boolean;
30
+ }[];
31
+ }
32
+ /** Computes aggregate-only inventory. Its return value deliberately cannot be used to enumerate identities. */
33
+ export declare class PlatformAuthInventoryService {
34
+ inspect(input: PlatformAuthInventoryInput): Promise<PlatformAuthInventory>;
35
+ }
36
+ export interface PlatformAuthDirectoryUser {
37
+ readonly id: string;
38
+ readonly externalId: string | undefined;
39
+ readonly normalizedEmail: string;
40
+ readonly verified: boolean;
41
+ }
42
+ /** Provider-neutral directory boundary. Implementations must bound email results to two. */
43
+ export interface PlatformAuthDirectory {
44
+ findUserByExternalId(externalId: string): Promise<PlatformAuthDirectoryUser | undefined>;
45
+ listUsersByNormalizedEmail(normalizedEmail: string): Promise<readonly PlatformAuthDirectoryUser[]>;
46
+ createVerifiedUser(input: {
47
+ readonly externalId: string;
48
+ readonly normalizedEmail: string;
49
+ }): Promise<PlatformAuthDirectoryUser>;
50
+ /** Complete bounded snapshot used only by the controlled migration inventory preflight. */
51
+ snapshotUsers?(): Promise<readonly PlatformAuthDirectoryUser[]>;
52
+ /** One provider page for the durable inventory preflight; callers persist the opaque cursor. */
53
+ listInventoryPage?(input: {
54
+ readonly after?: string;
55
+ readonly limit: number;
56
+ }): Promise<{
57
+ readonly users: readonly PlatformAuthDirectoryUser[];
58
+ readonly nextAfter?: string;
59
+ }>;
60
+ }
61
+ export type PlatformAuthDirectoryFailureKind = 'conflict' | 'rate_limited' | 'transient' | 'permanent' | 'unauthorized';
62
+ export interface PlatformAuthDirectoryFailure {
63
+ readonly kind: PlatformAuthDirectoryFailureKind;
64
+ /** Provider-supplied retry time. The migration ledger preserves it exactly when valid. */
65
+ readonly retryAt?: string;
66
+ }
67
+ export declare class PlatformAuthMigrationError extends Error {
68
+ readonly code: 'source_remap_forbidden' | 'reconciliation_drift' | 'stale_lease' | 'invalid_import' | 'idempotency_conflict' | 'stale_generation' | 'release_sha_mismatch' | 'preview_mismatch' | 'remote_verification_incomplete' | 'rollout_transition_invalid' | 'finalize_precondition_failed' | 'inventory_unavailable';
69
+ constructor(code: 'source_remap_forbidden' | 'reconciliation_drift' | 'stale_lease' | 'invalid_import' | 'idempotency_conflict' | 'stale_generation' | 'release_sha_mismatch' | 'preview_mismatch' | 'remote_verification_incomplete' | 'rollout_transition_invalid' | 'finalize_precondition_failed' | 'inventory_unavailable');
70
+ }
71
+ interface ImportEntry {
72
+ runId: string;
73
+ realm: string;
74
+ principalId: string;
75
+ email: string;
76
+ state: 'pending' | 'reconcile_required' | 'linked' | 'blocked' | 'failed';
77
+ leaseToken?: string;
78
+ leaseExpiresAt?: number;
79
+ attempt: number;
80
+ remoteUserId?: string;
81
+ retryAt?: number;
82
+ }
83
+ export interface PlatformAuthImportLease {
84
+ readonly key: string;
85
+ readonly leaseToken: string;
86
+ readonly attempt: number;
87
+ }
88
+ export interface PlatformAuthMigrationStore {
89
+ recordBackfill(input: {
90
+ readonly source: {
91
+ readonly provider: string;
92
+ readonly realm: string;
93
+ readonly subject: string;
94
+ };
95
+ readonly principalId: string;
96
+ readonly verifiedEmail?: string;
97
+ readonly runId?: string;
98
+ }): Promise<'backfilled' | 'already_backfilled'>;
99
+ claimImport(input: PlatformAuthImportInput, options?: {
100
+ readonly forceExpired?: boolean;
101
+ readonly terminalRetry?: 'explicit_operator_reconcile';
102
+ }): Promise<PlatformAuthImportLease>;
103
+ finishImport(lease: PlatformAuthImportLease, result: {
104
+ readonly state: 'pending' | 'reconcile_required' | 'linked' | 'blocked' | 'failed';
105
+ readonly remoteUserId?: string;
106
+ readonly retryAt?: string;
107
+ }): Promise<{
108
+ readonly state: 'pending' | 'reconcile_required' | 'linked' | 'blocked' | 'failed';
109
+ }>;
110
+ }
111
+ export interface PlatformAuthImportInput {
112
+ readonly runId: string;
113
+ readonly realm: string;
114
+ readonly principalId: string;
115
+ readonly verifiedEmail: string;
116
+ }
117
+ /** In-memory contract store; the Postgres implementation uses the same lease fencing fields. */
118
+ export declare class InMemoryPlatformAuthMigrationStore implements PlatformAuthMigrationStore {
119
+ #private;
120
+ recordBackfill(input: {
121
+ readonly source: {
122
+ readonly provider: string;
123
+ readonly realm: string;
124
+ readonly subject: string;
125
+ };
126
+ readonly principalId: string;
127
+ readonly verifiedEmail?: string;
128
+ readonly runId?: string;
129
+ }): Promise<'backfilled' | 'already_backfilled'>;
130
+ claimImport(input: PlatformAuthImportInput, options?: {
131
+ readonly forceExpired?: boolean;
132
+ readonly terminalRetry?: 'explicit_operator_reconcile';
133
+ }): Promise<PlatformAuthImportLease>;
134
+ finishImport(lease: PlatformAuthImportLease, result: {
135
+ readonly state: ImportEntry['state'];
136
+ readonly remoteUserId?: string;
137
+ readonly retryAt?: string;
138
+ }): Promise<{
139
+ readonly state: ImportEntry['state'];
140
+ }>;
141
+ getRollout(): PlatformAuthRolloutState;
142
+ setRollout(state: PlatformAuthRolloutState): void;
143
+ replayRollout(keyHash: string, request: string): PlatformAuthRolloutState | undefined;
144
+ recordRollout(keyHash: string, request: string, result: PlatformAuthRolloutState): void;
145
+ }
146
+ export declare class PlatformAuthImportService {
147
+ #private;
148
+ constructor(store: PlatformAuthMigrationStore, directory: PlatformAuthDirectory);
149
+ backfill(input: {
150
+ readonly runId: string;
151
+ readonly source: {
152
+ readonly provider: string;
153
+ readonly realm: string;
154
+ readonly subject: string;
155
+ };
156
+ readonly principalId: string;
157
+ readonly verifiedEmail: string;
158
+ }): Promise<{
159
+ readonly state: 'backfilled' | 'already_backfilled';
160
+ }>;
161
+ importOne(input: PlatformAuthImportInput): Promise<{
162
+ readonly state: ImportEntry['state'];
163
+ }>;
164
+ reconcileOne(input: PlatformAuthImportInput, options?: {
165
+ readonly terminalRetry?: 'explicit_operator_reconcile';
166
+ }): Promise<{
167
+ readonly state: ImportEntry['state'];
168
+ }>;
169
+ }
170
+ export interface PlatformAuthRolloutState {
171
+ readonly generation: number;
172
+ readonly workosPercentage: number;
173
+ readonly canaryClientIds: readonly string[];
174
+ readonly recoveryClientIds?: readonly string[];
175
+ readonly lifecycle: 'google' | 'workos' | 'finalized';
176
+ }
177
+ type RolloutOperation = 'activate' | 'rollback' | 'finalize';
178
+ export declare class PlatformAuthRolloutService {
179
+ #private;
180
+ constructor(store: InMemoryPlatformAuthMigrationStore, buildInfo: {
181
+ readonly gitSha: string;
182
+ });
183
+ preview(input: {
184
+ readonly operation: RolloutOperation;
185
+ readonly percentage: number;
186
+ readonly canaryClientIds: readonly string[];
187
+ }): Promise<{
188
+ readonly generation: number;
189
+ readonly checksum: string;
190
+ }>;
191
+ mutate(input: {
192
+ readonly operation: RolloutOperation;
193
+ readonly percentage: number;
194
+ readonly canaryClientIds?: readonly string[];
195
+ readonly expectedGeneration: number;
196
+ readonly releaseSha: string;
197
+ readonly idempotencyKey: string;
198
+ readonly previewChecksum: string;
199
+ }): Promise<PlatformAuthRolloutState>;
200
+ }
201
+ export {};
202
+ //# sourceMappingURL=platform-auth-migration.d.ts.map