@noodleseed/one 0.63.1 → 0.65.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 (434) 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/agent-kit/package.json +1 -1
  47. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts +2 -2
  48. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts.map +1 -1
  49. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js +1 -1
  50. package/node_modules/@noodle-borg/auth/dist/verify.d.ts +1 -1
  51. package/node_modules/@noodle-borg/auth/dist/verify.d.ts.map +1 -1
  52. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts +26 -0
  53. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts.map +1 -1
  54. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js +105 -1
  55. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js.map +1 -1
  56. package/node_modules/@noodle-borg/service/dist/control-plane-auth-bootstrap.d.ts +25 -0
  57. package/node_modules/@noodle-borg/service/dist/control-plane-auth-bootstrap.d.ts.map +1 -0
  58. package/node_modules/@noodle-borg/service/dist/control-plane-auth-bootstrap.js +99 -0
  59. package/node_modules/@noodle-borg/service/dist/control-plane-auth-bootstrap.js.map +1 -0
  60. package/node_modules/@noodle-borg/service/dist/index.d.ts +15 -0
  61. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  62. package/node_modules/@noodle-borg/service/dist/index.js +15 -0
  63. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  64. package/node_modules/@noodle-borg/service/dist/main.js +112 -19
  65. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
  66. package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts +1 -1
  67. package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts.map +1 -1
  68. package/node_modules/@noodle-borg/service/dist/oauth/app.js +9 -1
  69. package/node_modules/@noodle-borg/service/dist/oauth/app.js.map +1 -1
  70. package/node_modules/@noodle-borg/service/dist/oauth/authorization-initiation.d.ts +24 -0
  71. package/node_modules/@noodle-borg/service/dist/oauth/authorization-initiation.d.ts.map +1 -0
  72. package/node_modules/@noodle-borg/service/dist/oauth/authorization-initiation.js +88 -0
  73. package/node_modules/@noodle-borg/service/dist/oauth/authorization-initiation.js.map +1 -0
  74. package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.d.ts +1 -1
  75. package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.d.ts.map +1 -1
  76. package/node_modules/@noodle-borg/service/dist/oauth/consent-token.d.ts +5 -0
  77. package/node_modules/@noodle-borg/service/dist/oauth/consent-token.d.ts.map +1 -0
  78. package/node_modules/@noodle-borg/service/dist/oauth/consent-token.js +19 -0
  79. package/node_modules/@noodle-borg/service/dist/oauth/consent-token.js.map +1 -0
  80. package/node_modules/@noodle-borg/service/dist/oauth/consent.js +1 -1
  81. package/node_modules/@noodle-borg/service/dist/oauth/first-party-client.d.ts +13 -0
  82. package/node_modules/@noodle-borg/service/dist/oauth/first-party-client.d.ts.map +1 -0
  83. package/node_modules/@noodle-borg/service/dist/oauth/first-party-client.js +62 -0
  84. package/node_modules/@noodle-borg/service/dist/oauth/first-party-client.js.map +1 -0
  85. package/node_modules/@noodle-borg/service/dist/oauth/metadata.d.ts +4 -0
  86. package/node_modules/@noodle-borg/service/dist/oauth/metadata.d.ts.map +1 -0
  87. package/node_modules/@noodle-borg/service/dist/oauth/metadata.js +20 -0
  88. package/node_modules/@noodle-borg/service/dist/oauth/metadata.js.map +1 -0
  89. package/node_modules/@noodle-borg/service/dist/oauth/paths.d.ts.map +1 -1
  90. package/node_modules/@noodle-borg/service/dist/oauth/paths.js +2 -0
  91. package/node_modules/@noodle-borg/service/dist/oauth/paths.js.map +1 -1
  92. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.d.ts +15 -0
  93. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.d.ts.map +1 -0
  94. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.js +58 -0
  95. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.js.map +1 -0
  96. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-postgres.d.ts +8 -0
  97. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-postgres.d.ts.map +1 -0
  98. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-postgres.js +49 -0
  99. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-postgres.js.map +1 -0
  100. package/node_modules/@noodle-borg/service/dist/oauth/postgres-time.d.ts +3 -0
  101. package/node_modules/@noodle-borg/service/dist/oauth/postgres-time.d.ts.map +1 -0
  102. package/node_modules/@noodle-borg/service/dist/oauth/postgres-time.js +7 -0
  103. package/node_modules/@noodle-borg/service/dist/oauth/postgres-time.js.map +1 -0
  104. package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts +20 -25
  105. package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts.map +1 -1
  106. package/node_modules/@noodle-borg/service/dist/oauth/provider.js +105 -196
  107. package/node_modules/@noodle-borg/service/dist/oauth/provider.js.map +1 -1
  108. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts +36 -0
  109. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts.map +1 -0
  110. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js +157 -0
  111. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js.map +1 -0
  112. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.d.ts +4 -0
  113. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.d.ts.map +1 -0
  114. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.js +110 -0
  115. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres-schema.js.map +1 -0
  116. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.d.ts +7 -4
  117. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.d.ts.map +1 -1
  118. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js +63 -120
  119. package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js.map +1 -1
  120. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +19 -6
  121. package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts.map +1 -1
  122. package/node_modules/@noodle-borg/service/dist/oauth/store.js +24 -2
  123. package/node_modules/@noodle-borg/service/dist/oauth/store.js.map +1 -1
  124. package/node_modules/@noodle-borg/service/dist/oauth/tokens.d.ts +1 -1
  125. package/node_modules/@noodle-borg/service/dist/oauth/tokens.d.ts.map +1 -1
  126. package/node_modules/@noodle-borg/service/dist/oauth/tokens.js +1 -1
  127. package/node_modules/@noodle-borg/service/dist/oauth/tokens.js.map +1 -1
  128. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-availability.d.ts +4 -0
  129. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-availability.d.ts.map +1 -0
  130. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-availability.js +8 -0
  131. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-availability.js.map +1 -0
  132. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-handler.d.ts +34 -0
  133. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-handler.d.ts.map +1 -0
  134. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-handler.js +109 -0
  135. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-handler.js.map +1 -0
  136. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-support.d.ts +22 -0
  137. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-support.d.ts.map +1 -0
  138. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-support.js +30 -0
  139. package/node_modules/@noodle-borg/service/dist/oauth/upstream-callback-support.js.map +1 -0
  140. package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.d.ts +21 -0
  141. package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.d.ts.map +1 -0
  142. package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.js +56 -0
  143. package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.js.map +1 -0
  144. package/node_modules/@noodle-borg/service/dist/oauth/upstream-federation.d.ts +30 -0
  145. package/node_modules/@noodle-borg/service/dist/oauth/upstream-federation.d.ts.map +1 -0
  146. package/node_modules/@noodle-borg/service/dist/oauth/upstream-federation.js +94 -0
  147. package/node_modules/@noodle-borg/service/dist/oauth/upstream-federation.js.map +1 -0
  148. package/node_modules/@noodle-borg/service/dist/oauth/upstream-human.d.ts +33 -0
  149. package/node_modules/@noodle-borg/service/dist/oauth/upstream-human.d.ts.map +1 -0
  150. package/node_modules/@noodle-borg/service/dist/oauth/upstream-human.js +27 -0
  151. package/node_modules/@noodle-borg/service/dist/oauth/upstream-human.js.map +1 -0
  152. package/node_modules/@noodle-borg/service/dist/oauth/upstream-provider-choice.d.ts +13 -0
  153. package/node_modules/@noodle-borg/service/dist/oauth/upstream-provider-choice.d.ts.map +1 -0
  154. package/node_modules/@noodle-borg/service/dist/oauth/upstream-provider-choice.js +63 -0
  155. package/node_modules/@noodle-borg/service/dist/oauth/upstream-provider-choice.js.map +1 -0
  156. package/node_modules/@noodle-borg/service/dist/oauth/upstream-rollout-store.d.ts +20 -0
  157. package/node_modules/@noodle-borg/service/dist/oauth/upstream-rollout-store.d.ts.map +1 -0
  158. package/node_modules/@noodle-borg/service/dist/oauth/upstream-rollout-store.js +40 -0
  159. package/node_modules/@noodle-borg/service/dist/oauth/upstream-rollout-store.js.map +1 -0
  160. package/node_modules/@noodle-borg/service/dist/oauth/workos-events.d.ts +115 -0
  161. package/node_modules/@noodle-borg/service/dist/oauth/workos-events.d.ts.map +1 -0
  162. package/node_modules/@noodle-borg/service/dist/oauth/workos-events.js +310 -0
  163. package/node_modules/@noodle-borg/service/dist/oauth/workos-events.js.map +1 -0
  164. package/node_modules/@noodle-borg/service/dist/oauth/workos.d.ts +65 -0
  165. package/node_modules/@noodle-borg/service/dist/oauth/workos.d.ts.map +1 -0
  166. package/node_modules/@noodle-borg/service/dist/oauth/workos.js +85 -0
  167. package/node_modules/@noodle-borg/service/dist/oauth/workos.js.map +1 -0
  168. package/node_modules/@noodle-borg/service/dist/options.d.ts +11 -2
  169. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  170. package/node_modules/@noodle-borg/service/dist/personal-workspace.d.ts +2 -0
  171. package/node_modules/@noodle-borg/service/dist/personal-workspace.d.ts.map +1 -1
  172. package/node_modules/@noodle-borg/service/dist/personal-workspace.js +8 -2
  173. package/node_modules/@noodle-borg/service/dist/personal-workspace.js.map +1 -1
  174. package/node_modules/@noodle-borg/service/dist/platform-auth-configuration.d.ts +67 -0
  175. package/node_modules/@noodle-borg/service/dist/platform-auth-configuration.d.ts.map +1 -0
  176. package/node_modules/@noodle-borg/service/dist/platform-auth-configuration.js +54 -0
  177. package/node_modules/@noodle-borg/service/dist/platform-auth-configuration.js.map +1 -0
  178. package/node_modules/@noodle-borg/service/dist/platform-auth-frozen-candidate-postgres.d.ts +25 -0
  179. package/node_modules/@noodle-borg/service/dist/platform-auth-frozen-candidate-postgres.d.ts.map +1 -0
  180. package/node_modules/@noodle-borg/service/dist/platform-auth-frozen-candidate-postgres.js +61 -0
  181. package/node_modules/@noodle-borg/service/dist/platform-auth-frozen-candidate-postgres.js.map +1 -0
  182. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-legacy-sources-postgres.d.ts +32 -0
  183. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-legacy-sources-postgres.d.ts.map +1 -0
  184. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-legacy-sources-postgres.js +231 -0
  185. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-legacy-sources-postgres.js.map +1 -0
  186. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-postgres.d.ts +29 -0
  187. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-postgres.d.ts.map +1 -0
  188. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-postgres.js +350 -0
  189. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-postgres.js.map +1 -0
  190. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-subjects-postgres.d.ts +50 -0
  191. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-subjects-postgres.d.ts.map +1 -0
  192. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-subjects-postgres.js +239 -0
  193. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-local-subjects-postgres.js.map +1 -0
  194. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-paging.d.ts +66 -0
  195. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-paging.d.ts.map +1 -0
  196. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-paging.js +77 -0
  197. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-paging.js.map +1 -0
  198. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-postgres.d.ts +40 -0
  199. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-postgres.d.ts.map +1 -0
  200. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-postgres.js +355 -0
  201. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-postgres.js.map +1 -0
  202. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-progress-postgres.d.ts +41 -0
  203. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-progress-postgres.d.ts.map +1 -0
  204. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-progress-postgres.js +230 -0
  205. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-progress-postgres.js.map +1 -0
  206. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-source-fence-postgres.d.ts +20 -0
  207. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-source-fence-postgres.d.ts.map +1 -0
  208. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-source-fence-postgres.js +126 -0
  209. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-source-fence-postgres.js.map +1 -0
  210. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-sources.d.ts +8 -0
  211. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-sources.d.ts.map +1 -0
  212. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-sources.js +86 -0
  213. package/node_modules/@noodle-borg/service/dist/platform-auth-inventory-sources.js.map +1 -0
  214. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-postgres.d.ts +42 -0
  215. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-postgres.d.ts.map +1 -0
  216. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-postgres.js +368 -0
  217. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-postgres.js.map +1 -0
  218. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-runs-postgres.d.ts +86 -0
  219. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-runs-postgres.d.ts.map +1 -0
  220. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-runs-postgres.js +474 -0
  221. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-runs-postgres.js.map +1 -0
  222. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-schema.d.ts +17 -0
  223. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-schema.d.ts.map +1 -0
  224. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-schema.js +435 -0
  225. package/node_modules/@noodle-borg/service/dist/platform-auth-migration-schema.js.map +1 -0
  226. package/node_modules/@noodle-borg/service/dist/platform-auth-migration.d.ts +202 -0
  227. package/node_modules/@noodle-borg/service/dist/platform-auth-migration.d.ts.map +1 -0
  228. package/node_modules/@noodle-borg/service/dist/platform-auth-migration.js +313 -0
  229. package/node_modules/@noodle-borg/service/dist/platform-auth-migration.js.map +1 -0
  230. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-batches.d.ts +48 -0
  231. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-batches.d.ts.map +1 -0
  232. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-batches.js +158 -0
  233. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-batches.js.map +1 -0
  234. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-effects.d.ts +43 -0
  235. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-effects.d.ts.map +1 -0
  236. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-effects.js +92 -0
  237. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-effects.js.map +1 -0
  238. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-operation-postgres.d.ts +31 -0
  239. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-operation-postgres.d.ts.map +1 -0
  240. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-operation-postgres.js +94 -0
  241. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-operation-postgres.js.map +1 -0
  242. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-ports.d.ts +102 -0
  243. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-ports.d.ts.map +1 -0
  244. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-ports.js +2 -0
  245. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-ports.js.map +1 -0
  246. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-postgres.d.ts +17 -0
  247. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-postgres.d.ts.map +1 -0
  248. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-postgres.js +367 -0
  249. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-postgres.js.map +1 -0
  250. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-remote-status.d.ts +10 -0
  251. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-remote-status.d.ts.map +1 -0
  252. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-remote-status.js +37 -0
  253. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-remote-status.js.map +1 -0
  254. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-rollout.d.ts +36 -0
  255. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-rollout.d.ts.map +1 -0
  256. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-rollout.js +156 -0
  257. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-rollout.js.map +1 -0
  258. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-schema.d.ts +4 -0
  259. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-schema.d.ts.map +1 -0
  260. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-schema.js +162 -0
  261. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-schema.js.map +1 -0
  262. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-postgres.d.ts +92 -0
  263. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-postgres.d.ts.map +1 -0
  264. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-postgres.js +271 -0
  265. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-postgres.js.map +1 -0
  266. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-support.d.ts +13 -0
  267. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-support.d.ts.map +1 -0
  268. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-support.js +67 -0
  269. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-state-support.js.map +1 -0
  270. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-support.d.ts +15 -0
  271. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-support.d.ts.map +1 -0
  272. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-support.js +47 -0
  273. package/node_modules/@noodle-borg/service/dist/platform-auth-operator-support.js.map +1 -0
  274. package/node_modules/@noodle-borg/service/dist/platform-auth-operator.d.ts +1569 -0
  275. package/node_modules/@noodle-borg/service/dist/platform-auth-operator.d.ts.map +1 -0
  276. package/node_modules/@noodle-borg/service/dist/platform-auth-operator.js +274 -0
  277. package/node_modules/@noodle-borg/service/dist/platform-auth-operator.js.map +1 -0
  278. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres-support.d.ts +41 -0
  279. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres-support.d.ts.map +1 -0
  280. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres-support.js +163 -0
  281. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres-support.js.map +1 -0
  282. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres.d.ts +34 -0
  283. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres.d.ts.map +1 -0
  284. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres.js +274 -0
  285. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-postgres.js.map +1 -0
  286. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-schema.d.ts +3 -0
  287. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-schema.d.ts.map +1 -0
  288. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-schema.js +120 -0
  289. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification-schema.js.map +1 -0
  290. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification.d.ts +79 -0
  291. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification.d.ts.map +1 -0
  292. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification.js +88 -0
  293. package/node_modules/@noodle-borg/service/dist/platform-auth-remote-verification.js.map +1 -0
  294. package/node_modules/@noodle-borg/service/dist/platform-auth-rollback-guard.d.ts +6 -0
  295. package/node_modules/@noodle-borg/service/dist/platform-auth-rollback-guard.d.ts.map +1 -0
  296. package/node_modules/@noodle-borg/service/dist/platform-auth-rollback-guard.js +38 -0
  297. package/node_modules/@noodle-borg/service/dist/platform-auth-rollback-guard.js.map +1 -0
  298. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-postgres.d.ts +61 -0
  299. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-postgres.d.ts.map +1 -0
  300. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-postgres.js +292 -0
  301. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-postgres.js.map +1 -0
  302. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-readiness-postgres.d.ts +19 -0
  303. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-readiness-postgres.d.ts.map +1 -0
  304. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-readiness-postgres.js +121 -0
  305. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-readiness-postgres.js.map +1 -0
  306. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-support.d.ts +119 -0
  307. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-support.d.ts.map +1 -0
  308. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-support.js +194 -0
  309. package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-support.js.map +1 -0
  310. package/node_modules/@noodle-borg/service/dist/platform-auth-runtime.d.ts +36 -0
  311. package/node_modules/@noodle-borg/service/dist/platform-auth-runtime.d.ts.map +1 -0
  312. package/node_modules/@noodle-borg/service/dist/platform-auth-runtime.js +93 -0
  313. package/node_modules/@noodle-borg/service/dist/platform-auth-runtime.js.map +1 -0
  314. package/node_modules/@noodle-borg/service/dist/platform-auth-service-bootstrap.d.ts +32 -0
  315. package/node_modules/@noodle-borg/service/dist/platform-auth-service-bootstrap.d.ts.map +1 -0
  316. package/node_modules/@noodle-borg/service/dist/platform-auth-service-bootstrap.js +68 -0
  317. package/node_modules/@noodle-borg/service/dist/platform-auth-service-bootstrap.js.map +1 -0
  318. package/node_modules/@noodle-borg/service/dist/platform-identity-maintenance.d.ts +36 -0
  319. package/node_modules/@noodle-borg/service/dist/platform-identity-maintenance.d.ts.map +1 -0
  320. package/node_modules/@noodle-borg/service/dist/platform-identity-maintenance.js +92 -0
  321. package/node_modules/@noodle-borg/service/dist/platform-identity-maintenance.js.map +1 -0
  322. package/node_modules/@noodle-borg/service/dist/platform-identity-postgres.d.ts +23 -0
  323. package/node_modules/@noodle-borg/service/dist/platform-identity-postgres.d.ts.map +1 -0
  324. package/node_modules/@noodle-borg/service/dist/platform-identity-postgres.js +231 -0
  325. package/node_modules/@noodle-borg/service/dist/platform-identity-postgres.js.map +1 -0
  326. package/node_modules/@noodle-borg/service/dist/platform-identity-schema-postgres.d.ts +13 -0
  327. package/node_modules/@noodle-borg/service/dist/platform-identity-schema-postgres.d.ts.map +1 -0
  328. package/node_modules/@noodle-borg/service/dist/platform-identity-schema-postgres.js +399 -0
  329. package/node_modules/@noodle-borg/service/dist/platform-identity-schema-postgres.js.map +1 -0
  330. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-enqueue.d.ts +18 -0
  331. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-enqueue.d.ts.map +1 -0
  332. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-enqueue.js +25 -0
  333. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-enqueue.js.map +1 -0
  334. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-evidence-postgres.d.ts +15 -0
  335. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-evidence-postgres.d.ts.map +1 -0
  336. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-evidence-postgres.js +74 -0
  337. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-evidence-postgres.js.map +1 -0
  338. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-postgres.d.ts +19 -0
  339. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-postgres.d.ts.map +1 -0
  340. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-postgres.js +249 -0
  341. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-postgres.js.map +1 -0
  342. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-recovery-postgres.d.ts +34 -0
  343. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-recovery-postgres.d.ts.map +1 -0
  344. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-recovery-postgres.js +275 -0
  345. package/node_modules/@noodle-borg/service/dist/platform-identity-sync-recovery-postgres.js.map +1 -0
  346. package/node_modules/@noodle-borg/service/dist/platform-identity-sync.d.ts +98 -0
  347. package/node_modules/@noodle-borg/service/dist/platform-identity-sync.d.ts.map +1 -0
  348. package/node_modules/@noodle-borg/service/dist/platform-identity-sync.js +179 -0
  349. package/node_modules/@noodle-borg/service/dist/platform-identity-sync.js.map +1 -0
  350. package/node_modules/@noodle-borg/service/dist/platform-identity.d.ts +110 -0
  351. package/node_modules/@noodle-borg/service/dist/platform-identity.d.ts.map +1 -0
  352. package/node_modules/@noodle-borg/service/dist/platform-identity.js +312 -0
  353. package/node_modules/@noodle-borg/service/dist/platform-identity.js.map +1 -0
  354. package/node_modules/@noodle-borg/service/dist/routes/auth-discovery.d.ts +6 -0
  355. package/node_modules/@noodle-borg/service/dist/routes/auth-discovery.d.ts.map +1 -0
  356. package/node_modules/@noodle-borg/service/dist/routes/auth-discovery.js +36 -0
  357. package/node_modules/@noodle-borg/service/dist/routes/auth-discovery.js.map +1 -0
  358. package/node_modules/@noodle-borg/service/dist/routes/billing-read.d.ts.map +1 -1
  359. package/node_modules/@noodle-borg/service/dist/routes/billing-read.js +3 -9
  360. package/node_modules/@noodle-borg/service/dist/routes/billing-read.js.map +1 -1
  361. package/node_modules/@noodle-borg/service/dist/routes/billing-stripe.d.ts.map +1 -1
  362. package/node_modules/@noodle-borg/service/dist/routes/billing-stripe.js +3 -3
  363. package/node_modules/@noodle-borg/service/dist/routes/billing-stripe.js.map +1 -1
  364. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.d.ts.map +1 -1
  365. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.js +3 -1
  366. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.js.map +1 -1
  367. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration-dispatch.d.ts +8 -0
  368. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration-dispatch.d.ts.map +1 -0
  369. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration-dispatch.js +40 -0
  370. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration-dispatch.js.map +1 -0
  371. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration.d.ts +13 -0
  372. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration.d.ts.map +1 -0
  373. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration.js +158 -0
  374. package/node_modules/@noodle-borg/service/dist/routes/platform-auth-migration.js.map +1 -0
  375. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts +21 -3
  376. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts.map +1 -1
  377. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  378. package/node_modules/@noodle-borg/service/dist/serve.js +61 -146
  379. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  380. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts +1 -0
  381. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts.map +1 -1
  382. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +3 -0
  383. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js.map +1 -1
  384. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  385. package/node_modules/@noodle-borg/service/dist/service.js +17 -29
  386. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  387. package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts.map +1 -1
  388. package/node_modules/@noodle-borg/service/dist/store/control-plane.js +60 -19
  389. package/node_modules/@noodle-borg/service/dist/store/control-plane.js.map +1 -1
  390. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts +1 -2
  391. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts.map +1 -1
  392. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js +0 -40
  393. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js.map +1 -1
  394. package/node_modules/@noodle-borg/service/dist/store/postgres-personal-workspace.d.ts +5 -0
  395. package/node_modules/@noodle-borg/service/dist/store/postgres-personal-workspace.d.ts.map +1 -0
  396. package/node_modules/@noodle-borg/service/dist/store/postgres-personal-workspace.js +176 -0
  397. package/node_modules/@noodle-borg/service/dist/store/postgres-personal-workspace.js.map +1 -0
  398. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts +2 -0
  399. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
  400. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +43 -1
  401. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
  402. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.js +2 -1
  403. package/node_modules/@noodle-borg/service/dist/store/postgres-signup.js.map +1 -1
  404. package/node_modules/@noodle-borg/service/dist/workos-directory.d.ts +71 -0
  405. package/node_modules/@noodle-borg/service/dist/workos-directory.d.ts.map +1 -0
  406. package/node_modules/@noodle-borg/service/dist/workos-directory.js +175 -0
  407. package/node_modules/@noodle-borg/service/dist/workos-directory.js.map +1 -0
  408. package/node_modules/@noodle-borg/service/package.json +1 -0
  409. package/node_modules/@workos-inc/node/LICENSE +21 -0
  410. package/node_modules/@workos-inc/node/README.md +140 -0
  411. package/node_modules/@workos-inc/node/lib/factory-B8vTFojy.d.cts +9727 -0
  412. package/node_modules/@workos-inc/node/lib/factory-B8vTFojy.d.mts +9727 -0
  413. package/node_modules/@workos-inc/node/lib/factory-CoKXdPX2.cjs +8426 -0
  414. package/node_modules/@workos-inc/node/lib/factory-CoKXdPX2.cjs.map +1 -0
  415. package/node_modules/@workos-inc/node/lib/factory-MKPb5Egh.mjs +8241 -0
  416. package/node_modules/@workos-inc/node/lib/factory-MKPb5Egh.mjs.map +1 -0
  417. package/node_modules/@workos-inc/node/lib/index.cjs +449 -0
  418. package/node_modules/@workos-inc/node/lib/index.cjs.map +1 -0
  419. package/node_modules/@workos-inc/node/lib/index.d.cts +478 -0
  420. package/node_modules/@workos-inc/node/lib/index.d.mts +478 -0
  421. package/node_modules/@workos-inc/node/lib/index.mjs +394 -0
  422. package/node_modules/@workos-inc/node/lib/index.mjs.map +1 -0
  423. package/node_modules/@workos-inc/node/lib/index.worker.cjs +60 -0
  424. package/node_modules/@workos-inc/node/lib/index.worker.cjs.map +1 -0
  425. package/node_modules/@workos-inc/node/lib/index.worker.d.cts +16 -0
  426. package/node_modules/@workos-inc/node/lib/index.worker.d.mts +16 -0
  427. package/node_modules/@workos-inc/node/lib/index.worker.mjs +35 -0
  428. package/node_modules/@workos-inc/node/lib/index.worker.mjs.map +1 -0
  429. package/node_modules/@workos-inc/node/lib/webapi-BgpV54gi.mjs +3224 -0
  430. package/node_modules/@workos-inc/node/lib/webapi-BgpV54gi.mjs.map +1 -0
  431. package/node_modules/@workos-inc/node/lib/webapi-BzGFatFp.cjs +3271 -0
  432. package/node_modules/@workos-inc/node/lib/webapi-BzGFatFp.cjs.map +1 -0
  433. package/node_modules/@workos-inc/node/package.json +96 -0
  434. package/package.json +2 -1
@@ -0,0 +1,157 @@
1
+ import { createJwtVerifier } from '@noodle-borg/auth';
2
+ import { noopLogger } from '@noodle-borg/transport-http';
3
+ import { createCustomerVerifierFactory } from '../customer-verifier.js';
4
+ import { geminiEnterpriseDefaultResourceForClient } from '../gemini-enterprise-oauth.js';
5
+ import { normalizeOAuthResource } from '../http-util.js';
6
+ import { ensurePersonalWorkspace } from '../personal-workspace.js';
7
+ import { PlatformPrincipalResolver } from '../platform-identity.js';
8
+ import { PostgresPlatformIdentityStore } from '../platform-identity-postgres.js';
9
+ import { allowedMcpBaseDomains, bridgeAuthForResource, managedSecretForResource, sealCustomerCredential, } from '../serve-resource-auth.js';
10
+ import { createDeveloperGrantAuthorizer, resolveDeveloperGrantStore, } from './developer-grant-bootstrap.js';
11
+ import { guardPlatformAccessTokenVerifier } from './platform-principal-guard.js';
12
+ /** Build the co-hosted authorization server and its durable upstream-human dependencies. */
13
+ export async function resolveServiceOAuthBootstrap(input) {
14
+ const { options } = input;
15
+ let authServerApp;
16
+ let resolvedVerifyOwnerToken = options.verifyOwnerToken;
17
+ let resolvedAuthServerIssuer = options.authServerIssuer;
18
+ let oauthStore;
19
+ let developerGrantStore = options.developerGrantStore;
20
+ let delegatedExchange;
21
+ const allowedMcpDomains = allowedMcpBaseDomains(options);
22
+ const rawCustomerVerifierFactory = createCustomerVerifierFactory({
23
+ allowInsecureLocalhost: options.customerVerifierAllowInsecureLocalhost === true,
24
+ ...(options.customerVerifierFirebaseJwks !== undefined
25
+ ? { firebaseJwks: options.customerVerifierFirebaseJwks }
26
+ : {}),
27
+ ...(options.customerVerifierFirebaseJwksUri !== undefined
28
+ ? { firebaseJwksUri: options.customerVerifierFirebaseJwksUri }
29
+ : {}),
30
+ });
31
+ if (options.oauth) {
32
+ if (input.pool) {
33
+ const { PostgresOAuthStore } = await import('./store-postgres.js');
34
+ const postgresOAuth = new PostgresOAuthStore(input.pool, {
35
+ enforcePlatformPrincipalSuspension: input.platformIdentityStore instanceof PostgresPlatformIdentityStore,
36
+ });
37
+ await postgresOAuth.ensureSchema();
38
+ oauthStore = postgresOAuth;
39
+ }
40
+ else {
41
+ const { InMemoryOAuthStore } = await import('./store.js');
42
+ oauthStore = new InMemoryOAuthStore();
43
+ }
44
+ developerGrantStore = await resolveDeveloperGrantStore({
45
+ ...(input.pool === undefined ? {} : { pool: input.pool }),
46
+ ...(options.developerGrantStore === undefined ? {} : { store: options.developerGrantStore }),
47
+ });
48
+ const [{ NoodleOAuthProvider }, { createOAuthApp }, { createConfiguredWorkOSHumanAuthenticator },] = await Promise.all([import('./provider.js'), import('./app.js'), import('./workos.js')]);
49
+ // Normalize once so the token `iss`, the verifier's expected issuer, and the PRM `authorization_servers`
50
+ // entry are byte-identical (a trailing-slash `PUBLIC_BASE_URL` would otherwise desync them).
51
+ const oauthIssuer = options.oauth.issuer.replace(/\/+$/, '');
52
+ const workosAuthenticator = createConfiguredWorkOSHumanAuthenticator(oauthIssuer, options.oauth.workos);
53
+ if (options.oauth.google === undefined && workosAuthenticator === undefined) {
54
+ throw new Error('self-hosted OAuth requires at least one upstream human authenticator');
55
+ }
56
+ const { reconcileConfiguredConsoleOAuthClient } = await import('./first-party-client.js');
57
+ await reconcileConfiguredConsoleOAuthClient(oauthStore, options.oauth.consoleClient, normalizeOAuthResource(options.publicBaseUrl ?? oauthIssuer));
58
+ // The same issuer/signer pair backs delegated token-exchange assertions (ADR 0152) so customer
59
+ // token endpoints verify them against the already-published platform JWKS.
60
+ delegatedExchange = { issuer: oauthIssuer, signer: options.oauth.signer };
61
+ const provider = new NoodleOAuthProvider({
62
+ issuer: oauthIssuer,
63
+ store: oauthStore,
64
+ signer: options.oauth.signer,
65
+ ...(options.oauth.google === undefined ? {} : { google: options.oauth.google }),
66
+ ...(workosAuthenticator === undefined
67
+ ? {}
68
+ : { upstreamAuthenticators: { workos: workosAuthenticator } }),
69
+ ...(input.platformIdentityStore === undefined
70
+ ? {}
71
+ : {
72
+ platformPrincipalResolver: new PlatformPrincipalResolver(input.platformIdentityStore),
73
+ }),
74
+ customerBridgeAuthForResource: async (resource) => {
75
+ const registry = input.registry();
76
+ return registry === undefined
77
+ ? undefined
78
+ : bridgeAuthForResource(registry, resource, allowedMcpDomains);
79
+ },
80
+ managedSecretForResource: async (resource, name) => {
81
+ const registry = input.registry();
82
+ return registry === undefined
83
+ ? undefined
84
+ : managedSecretForResource(registry, resource, name, allowedMcpDomains);
85
+ },
86
+ verifyCustomerBridgeToken: async (auth, token) => {
87
+ const identity = await rawCustomerVerifierFactory(auth)(token, auth.projectId ?? '');
88
+ return identity === null ? null : { ...identity, scopes: identity.scopes ?? [] };
89
+ },
90
+ sealCustomerCredential: (credential) => sealCustomerCredential(input.secretBox, credential),
91
+ signupAuthorizer: input.controlPlaneStore,
92
+ signupMode: options.controlPlaneSignupMode ?? 'restricted',
93
+ deniedSignupDomains: options.deniedSignupDomains ?? [],
94
+ deniedSignupSubjects: options.deniedSignupSubjects ?? [],
95
+ ...(input.platformIdentityStore === undefined ||
96
+ (options.controlPlaneSignupMode ?? 'restricted') !== 'public'
97
+ ? {}
98
+ : {
99
+ provisionPlatformPrincipal: async (identity) => {
100
+ await ensurePersonalWorkspace(input.controlPlaneStore, {
101
+ ...identity,
102
+ superAdmin: false,
103
+ });
104
+ },
105
+ }),
106
+ developerGrantAuthorizer: createDeveloperGrantAuthorizer({
107
+ controlPlane: input.controlPlaneStore,
108
+ grants: developerGrantStore,
109
+ registry: input.registry,
110
+ }),
111
+ logger: options.logger ?? noopLogger,
112
+ defaultResourceForClient: (client) => geminiEnterpriseDefaultResourceForClient(client, oauthIssuer),
113
+ ...(options.oauth.allowedEmailDomain !== undefined
114
+ ? { allowedEmailDomain: options.oauth.allowedEmailDomain }
115
+ : {}),
116
+ ...(options.oauth.refreshTokenGraceSeconds !== undefined
117
+ ? { refreshTokenGraceSeconds: options.oauth.refreshTokenGraceSeconds }
118
+ : {}),
119
+ ...(options.oauth.refreshTokenRecoverySeconds !== undefined
120
+ ? { refreshTokenRecoverySeconds: options.oauth.refreshTokenRecoverySeconds }
121
+ : {}),
122
+ ...(input.platformAuth.rolloutStore === undefined
123
+ ? {}
124
+ : { upstreamRolloutStore: input.platformAuth.rolloutStore }),
125
+ });
126
+ authServerApp = createOAuthApp(provider, {
127
+ trustProxy: options.tls?.trustProxy === true,
128
+ });
129
+ resolvedAuthServerIssuer = resolvedAuthServerIssuer ?? oauthIssuer;
130
+ // Resource-server verification uses the AS signing key directly (co-hosted, same process), so an
131
+ // owner-only endpoint validates tokens without an HTTP JWKS fetch. Multi-instance-safe because the key is
132
+ // shared via env.
133
+ resolvedVerifyOwnerToken =
134
+ resolvedVerifyOwnerToken ??
135
+ createJwtVerifier({
136
+ issuer: oauthIssuer,
137
+ keyResolver: await options.oauth.signer.verifierKey(),
138
+ });
139
+ }
140
+ if (resolvedVerifyOwnerToken !== undefined && input.platformIdentityStore !== undefined) {
141
+ resolvedVerifyOwnerToken = guardPlatformAccessTokenVerifier(resolvedVerifyOwnerToken, new PlatformPrincipalResolver(input.platformIdentityStore));
142
+ }
143
+ return {
144
+ rawCustomerVerifierFactory,
145
+ ...(authServerApp === undefined ? {} : { authServerApp }),
146
+ ...(resolvedVerifyOwnerToken === undefined
147
+ ? {}
148
+ : { verifyOwnerToken: resolvedVerifyOwnerToken }),
149
+ ...(resolvedAuthServerIssuer === undefined
150
+ ? {}
151
+ : { authServerIssuer: resolvedAuthServerIssuer }),
152
+ ...(oauthStore === undefined ? {} : { oauthStore }),
153
+ ...(developerGrantStore === undefined ? {} : { developerGrantStore }),
154
+ ...(delegatedExchange === undefined ? {} : { delegatedExchange }),
155
+ };
156
+ }
157
+ //# sourceMappingURL=service-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-bootstrap.js","sourceRoot":"","sources":["../../src/oauth/service-bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Pool } from 'pg';
2
+ /** Creates and additively upgrades the shared OAuth authorization-server tables. */
3
+ export declare function ensureOAuthStoreSchema(pool: Pool, enforcePlatformPrincipalSuspension: boolean): Promise<void>;
4
+ //# sourceMappingURL=store-postgres-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-postgres-schema.d.ts","sourceRoot":"","sources":["../../src/oauth/store-postgres-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAK/B,oFAAoF;AACpF,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,kCAAkC,EAAE,OAAO,GAC1C,OAAO,CAAC,IAAI,CAAC,CA8Hf"}
@@ -0,0 +1,110 @@
1
+ import { installPlatformAuthInventorySourceFenceTriggers } from '../platform-auth-inventory-source-fence-postgres.js';
2
+ import { ensureDeviceAuthorizationSchema } from './device-store-postgres-schema.js';
3
+ import { ensurePlatformPrincipalSuspensionRefreshTrigger } from './platform-principal-postgres.js';
4
+ /** Creates and additively upgrades the shared OAuth authorization-server tables. */
5
+ export async function ensureOAuthStoreSchema(pool, enforcePlatformPrincipalSuspension) {
6
+ await pool.query(`
7
+ CREATE TABLE IF NOT EXISTS oauth_clients (
8
+ client_id text PRIMARY KEY,
9
+ client jsonb NOT NULL,
10
+ first_party_owner text,
11
+ created_at timestamptz NOT NULL DEFAULT now()
12
+ )
13
+ `);
14
+ await pool.query('ALTER TABLE oauth_clients ADD COLUMN IF NOT EXISTS first_party_owner text');
15
+ await pool.query(`
16
+ ALTER TABLE oauth_clients DROP CONSTRAINT IF EXISTS oauth_clients_first_party_owner_check;
17
+ ALTER TABLE oauth_clients ADD CONSTRAINT oauth_clients_first_party_owner_check
18
+ CHECK (first_party_owner IS NULL OR first_party_owner = 'console')
19
+ `);
20
+ await pool.query(`
21
+ CREATE TABLE IF NOT EXISTS oauth_pending_authorizations (
22
+ state text PRIMARY KEY,
23
+ client_id text NOT NULL,
24
+ redirect_uri text NOT NULL,
25
+ code_challenge text NOT NULL,
26
+ client_state text,
27
+ resource text NOT NULL,
28
+ scope text,
29
+ upstream_provider text NOT NULL DEFAULT 'google',
30
+ expires_at timestamptz NOT NULL
31
+ )
32
+ `);
33
+ await pool.query(`
34
+ CREATE TABLE IF NOT EXISTS oauth_authorization_codes (
35
+ code text PRIMARY KEY,
36
+ client_id text NOT NULL,
37
+ code_challenge text NOT NULL,
38
+ redirect_uri text NOT NULL,
39
+ resource text NOT NULL,
40
+ owner_subject text NOT NULL,
41
+ owner_email text,
42
+ owner_locale text,
43
+ owner_time_zone text,
44
+ scope text,
45
+ identity_kind text,
46
+ identity_provider text,
47
+ developer_grant_id text,
48
+ expires_at timestamptz NOT NULL
49
+ )
50
+ `);
51
+ await pool.query(`
52
+ CREATE TABLE IF NOT EXISTS oauth_refresh_tokens (
53
+ token text PRIMARY KEY,
54
+ client_id text NOT NULL,
55
+ owner_subject text NOT NULL,
56
+ owner_email text,
57
+ owner_locale text,
58
+ owner_time_zone text,
59
+ resource text NOT NULL,
60
+ scope text,
61
+ identity_kind text,
62
+ identity_provider text,
63
+ developer_grant_id text,
64
+ expires_at timestamptz NOT NULL,
65
+ family_id text,
66
+ rotated_at timestamptz,
67
+ superseded_by text
68
+ )
69
+ `);
70
+ if (enforcePlatformPrincipalSuspension) {
71
+ await ensurePlatformPrincipalSuspensionRefreshTrigger(pool);
72
+ }
73
+ await pool.query("ALTER TABLE oauth_pending_authorizations ADD COLUMN IF NOT EXISTS upstream_provider text NOT NULL DEFAULT 'google'");
74
+ await pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS identity_kind text');
75
+ await pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS owner_locale text');
76
+ await pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS owner_time_zone text');
77
+ await pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS identity_provider text');
78
+ await pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS developer_grant_id text');
79
+ await pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS identity_kind text');
80
+ await pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS owner_locale text');
81
+ await pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS owner_time_zone text');
82
+ await pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS identity_provider text');
83
+ await pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS developer_grant_id text');
84
+ await pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS family_id text');
85
+ await pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS rotated_at timestamptz');
86
+ await pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS superseded_by text');
87
+ await pool.query('CREATE INDEX IF NOT EXISTS oauth_refresh_tokens_family_id_idx ON oauth_refresh_tokens (family_id)');
88
+ await pool.query(`
89
+ CREATE TABLE IF NOT EXISTS oauth_consent_grants (
90
+ client_id text NOT NULL,
91
+ owner_subject text NOT NULL,
92
+ resource text NOT NULL,
93
+ granted_at timestamptz NOT NULL DEFAULT now(),
94
+ PRIMARY KEY (client_id, owner_subject, resource)
95
+ )
96
+ `);
97
+ await pool.query(`
98
+ CREATE TABLE IF NOT EXISTS oauth_delegated_credentials (
99
+ resource text NOT NULL,
100
+ provider text NOT NULL,
101
+ subject text NOT NULL,
102
+ credential jsonb NOT NULL,
103
+ updated_at timestamptz NOT NULL,
104
+ PRIMARY KEY (resource, provider, subject)
105
+ )
106
+ `);
107
+ await ensureDeviceAuthorizationSchema(pool);
108
+ await installPlatformAuthInventorySourceFenceTriggers(pool);
109
+ }
110
+ //# sourceMappingURL=store-postgres-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-postgres-schema.js","sourceRoot":"","sources":["../../src/oauth/store-postgres-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,+CAA+C,EAAE,MAAM,qDAAqD,CAAC;AACtH,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,+CAA+C,EAAE,MAAM,kCAAkC,CAAC;AAEnG,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAU,EACV,kCAA2C;IAE3C,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;GAOhB,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC9F,MAAM,IAAI,CAAC,KAAK,CAAC;;;;GAIhB,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;GAYhB,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;GAiBhB,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;GAkBhB,CAAC,CAAC;IACH,IAAI,kCAAkC,EAAE,CAAC;QACvC,MAAM,+CAA+C,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,CAAC,KAAK,CACd,oHAAoH,CACrH,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CACd,mFAAmF,CACpF,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CACd,kFAAkF,CACnF,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CACd,qFAAqF,CACtF,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CACd,uFAAuF,CACxF,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CACd,wFAAwF,CACzF,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;IACjG,MAAM,IAAI,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;IAChG,MAAM,IAAI,CAAC,KAAK,CACd,gFAAgF,CACjF,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CACd,kFAAkF,CACnF,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CACd,mFAAmF,CACpF,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC7F,MAAM,IAAI,CAAC,KAAK,CACd,kFAAkF,CACnF,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;IACjG,MAAM,IAAI,CAAC,KAAK,CACd,mGAAmG,CACpG,CAAC;IACF,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;;GAQhB,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;;;GAShB,CAAC,CAAC;IACH,MAAM,+BAA+B,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,+CAA+C,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC"}
@@ -2,8 +2,7 @@ import type { OAuthClientInformationFull } from '@modelcontextprotocol/sdk/share
2
2
  import type { Pool } from 'pg';
3
3
  import type { DeviceAuthorizationIdentity, DeviceAuthorizationPoll, DeviceAuthorizationRecord, DeviceBrowserSessionRecord } from './device-store.js';
4
4
  import type { AuthorizationCodeRecord, ConsentGrantRecord, DelegatedCredentialLookup, DelegatedCredentialRecord, OAuthStore, PendingAuthorizationRecord, RefreshRotation, RefreshRotationInput, RefreshTokenRecord } from './store.js';
5
- /**
6
- * Relational {@link OAuthStore} for the self-hosted authorization server (OA-2,
5
+ /** Relational {@link OAuthStore} for the self-hosted authorization server (OA-2,
7
6
  * [ADR 0042](../../../../docs/decisions/0042-self-hosted-oauth-authorization-server.md)). Shares the injected
8
7
  * `pg.Pool` with {@link PostgresArtifactStore} so the AS state lives in the same strongly-consistent store
9
8
  * that backs deployments — any Cloud Run instance can complete a flow another started.
@@ -14,13 +13,16 @@ import type { AuthorizationCodeRecord, ConsentGrantRecord, DelegatedCredentialLo
14
13
  */
15
14
  export declare class PostgresOAuthStore implements OAuthStore {
16
15
  #private;
17
- constructor(pool: Pool);
16
+ constructor(pool: Pool, options?: {
17
+ readonly enforcePlatformPrincipalSuspension?: boolean;
18
+ });
18
19
  /** Create the OAuth tables if absent (idempotent). Run once at startup before serving AS endpoints. */
19
20
  ensureSchema(): Promise<void>;
20
21
  getClient(clientId: string): Promise<OAuthClientInformationFull | undefined>;
21
22
  putClient(client: OAuthClientInformationFull): Promise<OAuthClientInformationFull>;
23
+ putFirstPartyClient(owner: 'console', client: OAuthClientInformationFull): Promise<OAuthClientInformationFull>;
22
24
  createPendingAuthorization(record: PendingAuthorizationRecord): Promise<void>;
23
- consumePendingAuthorization(state: string): Promise<PendingAuthorizationRecord | undefined>;
25
+ consumePendingAuthorization(state: string, expectedUpstreamProvider: PendingAuthorizationRecord['upstreamProvider']): Promise<PendingAuthorizationRecord | undefined>;
24
26
  createAuthorizationCode(record: AuthorizationCodeRecord): Promise<void>;
25
27
  getAuthorizationCode(code: string): Promise<AuthorizationCodeRecord | undefined>;
26
28
  redeemAuthorizationCode(code: string): Promise<AuthorizationCodeRecord | undefined>;
@@ -38,6 +40,7 @@ export declare class PostgresOAuthStore implements OAuthStore {
38
40
  }): Promise<DeviceAuthorizationPoll>;
39
41
  completeDeviceTokenIssuance(deviceCode: string, clientId: string): Promise<boolean>;
40
42
  createRefreshToken(record: RefreshTokenRecord): Promise<void>;
43
+ getRefreshToken(token: string): Promise<RefreshTokenRecord | undefined>;
41
44
  consumeRefreshToken(token: string): Promise<RefreshTokenRecord | undefined>;
42
45
  createConsentGrant(grant: ConsentGrantRecord): Promise<void>;
43
46
  hasConsentGrant(clientId: string, ownerSubject: string, resource: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"store-postgres.d.ts","sourceRoot":"","sources":["../../src/oauth/store-postgres.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store-postgres.d.ts","sourceRoot":"","sources":["../../src/oauth/store-postgres.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import { ensureDeviceAuthorizationSchema } from './device-store-postgres-schema.js';
2
1
  import { deviceBrowserRowToRecord, deviceRowToRecord, } from './device-store-postgres-types.js';
3
- /**
4
- * Relational {@link OAuthStore} for the self-hosted authorization server (OA-2,
2
+ import { lockAndAssertPlatformRefreshPrincipal } from './platform-principal-postgres.js';
3
+ import { postgresEpochSeconds, postgresTimestampIsLive } from './postgres-time.js';
4
+ import { ensureOAuthStoreSchema } from './store-postgres-schema.js';
5
+ /** Relational {@link OAuthStore} for the self-hosted authorization server (OA-2,
5
6
  * [ADR 0042](../../../../docs/decisions/0042-self-hosted-oauth-authorization-server.md)). Shares the injected
6
7
  * `pg.Pool` with {@link PostgresArtifactStore} so the AS state lives in the same strongly-consistent store
7
8
  * that backs deployments — any Cloud Run instance can complete a flow another started.
@@ -12,116 +13,44 @@ import { deviceBrowserRowToRecord, deviceRowToRecord, } from './device-store-pos
12
13
  */
13
14
  export class PostgresOAuthStore {
14
15
  #pool;
15
- constructor(pool) {
16
+ #enforcePlatformPrincipalSuspension;
17
+ constructor(pool, options = {}) {
16
18
  this.#pool = pool;
19
+ this.#enforcePlatformPrincipalSuspension = options.enforcePlatformPrincipalSuspension === true;
17
20
  }
18
21
  /** Create the OAuth tables if absent (idempotent). Run once at startup before serving AS endpoints. */
19
22
  async ensureSchema() {
20
- await this.#pool.query(`
21
- CREATE TABLE IF NOT EXISTS oauth_clients (
22
- client_id text PRIMARY KEY,
23
- client jsonb NOT NULL,
24
- created_at timestamptz NOT NULL DEFAULT now()
25
- )
26
- `);
27
- await this.#pool.query(`
28
- CREATE TABLE IF NOT EXISTS oauth_pending_authorizations (
29
- state text PRIMARY KEY,
30
- client_id text NOT NULL,
31
- redirect_uri text NOT NULL,
32
- code_challenge text NOT NULL,
33
- client_state text,
34
- resource text NOT NULL,
35
- scope text,
36
- expires_at timestamptz NOT NULL
37
- )
38
- `);
39
- await this.#pool.query(`
40
- CREATE TABLE IF NOT EXISTS oauth_authorization_codes (
41
- code text PRIMARY KEY,
42
- client_id text NOT NULL,
43
- code_challenge text NOT NULL,
44
- redirect_uri text NOT NULL,
45
- resource text NOT NULL,
46
- owner_subject text NOT NULL,
47
- owner_email text,
48
- owner_locale text,
49
- owner_time_zone text,
50
- scope text,
51
- identity_kind text,
52
- identity_provider text,
53
- developer_grant_id text,
54
- expires_at timestamptz NOT NULL
55
- )
56
- `);
57
- await this.#pool.query(`
58
- CREATE TABLE IF NOT EXISTS oauth_refresh_tokens (
59
- token text PRIMARY KEY,
60
- client_id text NOT NULL,
61
- owner_subject text NOT NULL,
62
- owner_email text,
63
- owner_locale text,
64
- owner_time_zone text,
65
- resource text NOT NULL,
66
- scope text,
67
- identity_kind text,
68
- identity_provider text,
69
- developer_grant_id text,
70
- expires_at timestamptz NOT NULL,
71
- family_id text,
72
- rotated_at timestamptz,
73
- superseded_by text
74
- )
75
- `);
76
- await this.#pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS identity_kind text');
77
- await this.#pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS owner_locale text');
78
- await this.#pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS owner_time_zone text');
79
- await this.#pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS identity_provider text');
80
- await this.#pool.query('ALTER TABLE oauth_authorization_codes ADD COLUMN IF NOT EXISTS developer_grant_id text');
81
- await this.#pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS identity_kind text');
82
- await this.#pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS owner_locale text');
83
- await this.#pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS owner_time_zone text');
84
- await this.#pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS identity_provider text');
85
- await this.#pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS developer_grant_id text');
86
- // Rotation hardening columns + family index (idempotent; covers tables created before this change).
87
- await this.#pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS family_id text');
88
- await this.#pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS rotated_at timestamptz');
89
- await this.#pool.query('ALTER TABLE oauth_refresh_tokens ADD COLUMN IF NOT EXISTS superseded_by text');
90
- await this.#pool.query('CREATE INDEX IF NOT EXISTS oauth_refresh_tokens_family_id_idx ON oauth_refresh_tokens (family_id)');
91
- await this.#pool.query(`
92
- CREATE TABLE IF NOT EXISTS oauth_consent_grants (
93
- client_id text NOT NULL,
94
- owner_subject text NOT NULL,
95
- resource text NOT NULL,
96
- granted_at timestamptz NOT NULL DEFAULT now(),
97
- PRIMARY KEY (client_id, owner_subject, resource)
98
- )
99
- `);
100
- await this.#pool.query(`
101
- CREATE TABLE IF NOT EXISTS oauth_delegated_credentials (
102
- resource text NOT NULL,
103
- provider text NOT NULL,
104
- subject text NOT NULL,
105
- credential jsonb NOT NULL,
106
- updated_at timestamptz NOT NULL,
107
- PRIMARY KEY (resource, provider, subject)
108
- )
109
- `);
110
- await ensureDeviceAuthorizationSchema(this.#pool);
23
+ await ensureOAuthStoreSchema(this.#pool, this.#enforcePlatformPrincipalSuspension);
111
24
  }
112
25
  async getClient(clientId) {
113
26
  const { rows } = await this.#pool.query('SELECT client FROM oauth_clients WHERE client_id = $1', [clientId]);
114
27
  return rows[0]?.client;
115
28
  }
116
29
  async putClient(client) {
117
- await this.#pool.query(`INSERT INTO oauth_clients (client_id, client) VALUES ($1, $2::jsonb)
118
- ON CONFLICT (client_id) DO UPDATE SET client = EXCLUDED.client`, [client.client_id, JSON.stringify(client)]);
30
+ const result = await this.#pool.query(`INSERT INTO oauth_clients (client_id, client) VALUES ($1, $2::jsonb)
31
+ ON CONFLICT (client_id) DO UPDATE SET client = EXCLUDED.client
32
+ WHERE oauth_clients.first_party_owner IS NULL
33
+ RETURNING client_id`, [client.client_id, JSON.stringify(client)]);
34
+ if (result.rows[0] === undefined) {
35
+ throw new Error('OAuth client ID is reserved by a first-party client');
36
+ }
37
+ return client;
38
+ }
39
+ async putFirstPartyClient(owner, client) {
40
+ const result = await this.#pool.query(`INSERT INTO oauth_clients (client_id, client, first_party_owner)
41
+ VALUES ($1, $2::jsonb, $3)
42
+ ON CONFLICT (client_id) DO UPDATE SET client = EXCLUDED.client
43
+ WHERE oauth_clients.first_party_owner = EXCLUDED.first_party_owner
44
+ RETURNING client_id`, [client.client_id, JSON.stringify(client), owner]);
45
+ if (result.rows[0] === undefined) {
46
+ throw new Error('OAuth client ID is already registered through DCR');
47
+ }
119
48
  return client;
120
49
  }
121
50
  async createPendingAuthorization(record) {
122
51
  await this.#pool.query(`INSERT INTO oauth_pending_authorizations
123
- (state, client_id, redirect_uri, code_challenge, client_state, resource, scope, expires_at)
124
- VALUES ($1, $2, $3, $4, $5, $6, $7, to_timestamp($8))`, [
52
+ (state, client_id, redirect_uri, code_challenge, client_state, resource, scope, upstream_provider, expires_at)
53
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, to_timestamp($9))`, [
125
54
  record.state,
126
55
  record.clientId,
127
56
  record.redirectUri,
@@ -129,13 +58,16 @@ export class PostgresOAuthStore {
129
58
  record.clientState ?? null,
130
59
  record.resource,
131
60
  record.scope ?? null,
61
+ record.upstreamProvider,
132
62
  record.expiresAt,
133
63
  ]);
134
64
  }
135
- async consumePendingAuthorization(state) {
136
- const { rows } = await this.#pool.query('DELETE FROM oauth_pending_authorizations WHERE state = $1 RETURNING *', [state]);
65
+ async consumePendingAuthorization(state, expectedUpstreamProvider) {
66
+ const { rows } = await this.#pool.query(`DELETE FROM oauth_pending_authorizations
67
+ WHERE state = $1 AND upstream_provider = $2
68
+ RETURNING *`, [state, expectedUpstreamProvider]);
137
69
  const row = rows[0];
138
- if (!row || !live(row.expires_at))
70
+ if (!row || !postgresTimestampIsLive(row.expires_at))
139
71
  return undefined;
140
72
  return {
141
73
  state: row.state,
@@ -145,7 +77,8 @@ export class PostgresOAuthStore {
145
77
  ...(row.client_state !== null ? { clientState: row.client_state } : {}),
146
78
  resource: row.resource,
147
79
  ...(row.scope !== null ? { scope: row.scope } : {}),
148
- expiresAt: epochSeconds(row.expires_at),
80
+ upstreamProvider: row.upstream_provider,
81
+ expiresAt: postgresEpochSeconds(row.expires_at),
149
82
  };
150
83
  }
151
84
  async createAuthorizationCode(record) {
@@ -178,7 +111,7 @@ export class PostgresOAuthStore {
178
111
  async redeemAuthorizationCode(code) {
179
112
  const { rows } = await this.#pool.query('DELETE FROM oauth_authorization_codes WHERE code = $1 RETURNING *', [code]);
180
113
  const row = rows[0];
181
- if (!row || !live(row.expires_at))
114
+ if (!row || !postgresTimestampIsLive(row.expires_at))
182
115
  return undefined;
183
116
  return authCodeRowToRecord(row);
184
117
  }
@@ -218,7 +151,7 @@ export class PostgresOAuthStore {
218
151
  async consumeDeviceBrowserSession(state) {
219
152
  const { rows } = await this.#pool.query('DELETE FROM oauth_device_browser_sessions WHERE state = $1 RETURNING *', [state]);
220
153
  const row = rows[0];
221
- if (row === undefined || !live(row.expires_at))
154
+ if (row === undefined || !postgresTimestampIsLive(row.expires_at))
222
155
  return undefined;
223
156
  return deviceBrowserRowToRecord(row);
224
157
  }
@@ -250,7 +183,7 @@ export class PostgresOAuthStore {
250
183
  await client.query('BEGIN');
251
184
  const { rows } = await client.query('SELECT * FROM oauth_device_authorizations WHERE device_code = $1 FOR UPDATE', [input.deviceCode]);
252
185
  const row = rows[0];
253
- if (row === undefined || epochSeconds(row.expires_at) <= input.nowSeconds) {
186
+ if (row === undefined || postgresEpochSeconds(row.expires_at) <= input.nowSeconds) {
254
187
  if (row !== undefined) {
255
188
  await client.query('DELETE FROM oauth_device_authorizations WHERE device_code = $1', [
256
189
  input.deviceCode,
@@ -275,7 +208,7 @@ export class PostgresOAuthStore {
275
208
  ? { status: 'access_denied' }
276
209
  : { status: 'approved', record: deviceRowToRecord(row) };
277
210
  }
278
- if (epochSeconds(row.next_poll_at) > input.nowSeconds) {
211
+ if (postgresEpochSeconds(row.next_poll_at) > input.nowSeconds) {
279
212
  await client.query(`UPDATE oauth_device_authorizations
280
213
  SET next_poll_at = next_poll_at + (interval_seconds * interval '1 second')
281
214
  WHERE device_code = $1`, [input.deviceCode]);
@@ -321,10 +254,17 @@ export class PostgresOAuthStore {
321
254
  record.familyId ?? null,
322
255
  ]);
323
256
  }
257
+ async getRefreshToken(token) {
258
+ const { rows } = await this.#pool.query('SELECT * FROM oauth_refresh_tokens WHERE token = $1', [token]);
259
+ const row = rows[0];
260
+ if (!row || !postgresTimestampIsLive(row.expires_at))
261
+ return undefined;
262
+ return refreshRowToRecord(row);
263
+ }
324
264
  async consumeRefreshToken(token) {
325
265
  const { rows } = await this.#pool.query('DELETE FROM oauth_refresh_tokens WHERE token = $1 RETURNING *', [token]);
326
266
  const row = rows[0];
327
- if (!row || !live(row.expires_at))
267
+ if (!row || !postgresTimestampIsLive(row.expires_at))
328
268
  return undefined;
329
269
  return refreshRowToRecord(row);
330
270
  }
@@ -375,7 +315,16 @@ export class PostgresOAuthStore {
375
315
  const client = await this.#pool.connect();
376
316
  try {
377
317
  await client.query('BEGIN');
378
- // 1) Atomic claim: succeeds only for a live, not-yet-rotated token owned by this client.
318
+ if (this.#enforcePlatformPrincipalSuspension) {
319
+ const status = await lockAndAssertPlatformRefreshPrincipal(client, {
320
+ oldTokenHash,
321
+ clientId,
322
+ });
323
+ if (status !== 'continue') {
324
+ await client.query('COMMIT');
325
+ return { status };
326
+ }
327
+ }
379
328
  const claimed = await client.query(`UPDATE oauth_refresh_tokens
380
329
  SET rotated_at = to_timestamp($2), superseded_by = $3
381
330
  WHERE token = $1 AND client_id = $4 AND rotated_at IS NULL AND expires_at > to_timestamp($5)
@@ -394,12 +343,12 @@ export class PostgresOAuthStore {
394
343
  await client.query('COMMIT');
395
344
  return { status: 'unknown' };
396
345
  }
397
- if (nowSeconds - epochSeconds(row.rotated_at) <= graceSeconds) {
346
+ if (nowSeconds - postgresEpochSeconds(row.rotated_at) <= graceSeconds) {
398
347
  await this.#insertSuccessor(client, row, newTokenHash, newExpiresAt, clientId);
399
348
  await client.query('COMMIT');
400
349
  return { status: 'grace', identity: rowIdentity(row) };
401
350
  }
402
- if (nowSeconds - epochSeconds(row.rotated_at) <= recoverySeconds &&
351
+ if (nowSeconds - postgresEpochSeconds(row.rotated_at) <= recoverySeconds &&
403
352
  row.superseded_by !== null) {
404
353
  const successor = await client.query(`SELECT * FROM oauth_refresh_tokens
405
354
  WHERE token = $1 AND client_id = $2 AND rotated_at IS NULL AND expires_at > to_timestamp($3)
@@ -469,9 +418,9 @@ function refreshRowToRecord(row) {
469
418
  ...(row.identity_kind !== null ? { identityKind: row.identity_kind } : {}),
470
419
  ...(row.identity_provider !== null ? { identityProvider: row.identity_provider } : {}),
471
420
  ...(row.developer_grant_id !== null ? { developerGrantId: row.developer_grant_id } : {}),
472
- expiresAt: epochSeconds(row.expires_at),
421
+ expiresAt: postgresEpochSeconds(row.expires_at),
473
422
  ...(row.family_id !== null ? { familyId: row.family_id } : {}),
474
- ...(row.rotated_at !== null ? { rotatedAt: epochSeconds(row.rotated_at) } : {}),
423
+ ...(row.rotated_at !== null ? { rotatedAt: postgresEpochSeconds(row.rotated_at) } : {}),
475
424
  ...(row.superseded_by !== null ? { supersededBy: row.superseded_by } : {}),
476
425
  };
477
426
  }
@@ -509,13 +458,7 @@ function authCodeRowToRecord(row) {
509
458
  ...(row.identity_kind !== null ? { identityKind: row.identity_kind } : {}),
510
459
  ...(row.identity_provider !== null ? { identityProvider: row.identity_provider } : {}),
511
460
  ...(row.developer_grant_id !== null ? { developerGrantId: row.developer_grant_id } : {}),
512
- expiresAt: epochSeconds(row.expires_at),
461
+ expiresAt: postgresEpochSeconds(row.expires_at),
513
462
  };
514
463
  }
515
- function epochSeconds(date) {
516
- return Math.floor(new Date(date).getTime() / 1000);
517
- }
518
- function live(expiresAt) {
519
- return new Date(expiresAt).getTime() > Date.now();
520
- }
521
464
  //# sourceMappingURL=store-postgres.js.map