@noodleseed/one 0.48.0 → 0.49.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/dist/cli.js +6 -6
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/archive-ops.js +1 -1
  4. package/dist/commands/archive-ops.js.map +1 -1
  5. package/dist/commands/auth-metadata-readiness.d.ts +8 -0
  6. package/dist/commands/auth-metadata-readiness.d.ts.map +1 -0
  7. package/dist/commands/auth-metadata-readiness.js +164 -0
  8. package/dist/commands/auth-metadata-readiness.js.map +1 -0
  9. package/dist/commands/auth-ops.d.ts +3 -0
  10. package/dist/commands/auth-ops.d.ts.map +1 -1
  11. package/dist/commands/auth-ops.js +37 -82
  12. package/dist/commands/auth-ops.js.map +1 -1
  13. package/dist/commands/author-loop.d.ts +7 -3
  14. package/dist/commands/author-loop.d.ts.map +1 -1
  15. package/dist/commands/author-loop.js +33 -62
  16. package/dist/commands/author-loop.js.map +1 -1
  17. package/dist/commands/billing-admission-output.d.ts +16 -0
  18. package/dist/commands/billing-admission-output.d.ts.map +1 -0
  19. package/dist/commands/billing-admission-output.js +40 -0
  20. package/dist/commands/billing-admission-output.js.map +1 -0
  21. package/dist/commands/billing-enforcement-activation-args.d.ts +40 -0
  22. package/dist/commands/billing-enforcement-activation-args.d.ts.map +1 -0
  23. package/dist/commands/billing-enforcement-activation-args.js +125 -0
  24. package/dist/commands/billing-enforcement-activation-args.js.map +1 -0
  25. package/dist/commands/billing-enforcement-activation-files.d.ts +11 -0
  26. package/dist/commands/billing-enforcement-activation-files.d.ts.map +1 -0
  27. package/dist/commands/billing-enforcement-activation-files.js +54 -0
  28. package/dist/commands/billing-enforcement-activation-files.js.map +1 -0
  29. package/dist/commands/billing-enforcement-activation-ops.d.ts +2 -0
  30. package/dist/commands/billing-enforcement-activation-ops.d.ts.map +1 -0
  31. package/dist/commands/billing-enforcement-activation-ops.js +283 -0
  32. package/dist/commands/billing-enforcement-activation-ops.js.map +1 -0
  33. package/dist/commands/billing-enforcement-ops.d.ts.map +1 -1
  34. package/dist/commands/billing-enforcement-ops.js +5 -1
  35. package/dist/commands/billing-enforcement-ops.js.map +1 -1
  36. package/dist/commands/billing-read-ops.d.ts.map +1 -1
  37. package/dist/commands/billing-read-ops.js +15 -3
  38. package/dist/commands/billing-read-ops.js.map +1 -1
  39. package/dist/commands/billing-read-view.d.ts +40 -1
  40. package/dist/commands/billing-read-view.d.ts.map +1 -1
  41. package/dist/commands/billing-read-view.js +50 -0
  42. package/dist/commands/billing-read-view.js.map +1 -1
  43. package/dist/commands/catalog-data-resources.d.ts.map +1 -1
  44. package/dist/commands/catalog-data-resources.js +4 -3
  45. package/dist/commands/catalog-data-resources.js.map +1 -1
  46. package/dist/commands/config-values.d.ts.map +1 -1
  47. package/dist/commands/config-values.js +18 -2
  48. package/dist/commands/config-values.js.map +1 -1
  49. package/dist/commands/deploy-ops.d.ts +1 -0
  50. package/dist/commands/deploy-ops.d.ts.map +1 -1
  51. package/dist/commands/deploy-ops.js +5 -0
  52. package/dist/commands/deploy-ops.js.map +1 -1
  53. package/dist/commands/deploy-status-ops.js +1 -1
  54. package/dist/commands/deploy-status-ops.js.map +1 -1
  55. package/dist/commands/devtools.d.ts +1 -1
  56. package/dist/commands/devtools.d.ts.map +1 -1
  57. package/dist/commands/devtools.js +23 -4
  58. package/dist/commands/devtools.js.map +1 -1
  59. package/dist/commands/local-readiness.d.ts +6 -0
  60. package/dist/commands/local-readiness.d.ts.map +1 -0
  61. package/dist/commands/local-readiness.js +48 -0
  62. package/dist/commands/local-readiness.js.map +1 -0
  63. package/dist/commands/shared.d.ts.map +1 -1
  64. package/dist/commands/shared.js +13 -0
  65. package/dist/commands/shared.js.map +1 -1
  66. package/dist/deploy.d.ts +1 -0
  67. package/dist/deploy.d.ts.map +1 -1
  68. package/dist/deploy.js +1 -0
  69. package/dist/deploy.js.map +1 -1
  70. package/dist/local-target.d.ts +16 -0
  71. package/dist/local-target.d.ts.map +1 -0
  72. package/dist/local-target.js +35 -0
  73. package/dist/local-target.js.map +1 -0
  74. package/node_modules/@noodle-borg/agent-kit/dist/skill-connect-refs.d.ts.map +1 -1
  75. package/node_modules/@noodle-borg/agent-kit/dist/skill-connect-refs.js +7 -8
  76. package/node_modules/@noodle-borg/agent-kit/dist/skill-connect-refs.js.map +1 -1
  77. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
  78. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js.map +1 -1
  79. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js +1 -1
  80. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js.map +1 -1
  81. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  82. package/node_modules/@noodle-borg/auth/dist/discovery.d.ts +11 -3
  83. package/node_modules/@noodle-borg/auth/dist/discovery.d.ts.map +1 -1
  84. package/node_modules/@noodle-borg/auth/dist/discovery.js +42 -7
  85. package/node_modules/@noodle-borg/auth/dist/discovery.js.map +1 -1
  86. package/node_modules/@noodle-borg/auth/dist/index.d.ts +1 -1
  87. package/node_modules/@noodle-borg/auth/dist/index.d.ts.map +1 -1
  88. package/node_modules/@noodle-borg/auth/dist/index.js +1 -1
  89. package/node_modules/@noodle-borg/auth/dist/index.js.map +1 -1
  90. package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts.map +1 -1
  91. package/node_modules/@noodle-borg/protocol/dist/mapping.js +2 -0
  92. package/node_modules/@noodle-borg/protocol/dist/mapping.js.map +1 -1
  93. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +3 -1
  94. package/node_modules/@noodle-borg/runtime/dist/result.d.ts.map +1 -1
  95. package/node_modules/@noodle-borg/runtime/dist/result.js.map +1 -1
  96. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.d.ts +10 -0
  97. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.d.ts.map +1 -1
  98. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.js +26 -1
  99. package/node_modules/@noodle-borg/runtime/dist/tool-dispatch.js.map +1 -1
  100. package/node_modules/@noodle-borg/service/dist/billing/authoritative-admission.d.ts +46 -0
  101. package/node_modules/@noodle-borg/service/dist/billing/authoritative-admission.d.ts.map +1 -0
  102. package/node_modules/@noodle-borg/service/dist/billing/authoritative-admission.js +111 -0
  103. package/node_modules/@noodle-borg/service/dist/billing/authoritative-admission.js.map +1 -0
  104. package/node_modules/@noodle-borg/service/dist/billing/commercial-enforcement-projection.d.ts +80 -0
  105. package/node_modules/@noodle-borg/service/dist/billing/commercial-enforcement-projection.d.ts.map +1 -0
  106. package/node_modules/@noodle-borg/service/dist/billing/commercial-enforcement-projection.js +2 -0
  107. package/node_modules/@noodle-borg/service/dist/billing/commercial-enforcement-projection.js.map +1 -0
  108. package/node_modules/@noodle-borg/service/dist/billing/commercial-entitlements.d.ts +18 -0
  109. package/node_modules/@noodle-borg/service/dist/billing/commercial-entitlements.d.ts.map +1 -0
  110. package/node_modules/@noodle-borg/service/dist/billing/commercial-entitlements.js +51 -0
  111. package/node_modules/@noodle-borg/service/dist/billing/commercial-entitlements.js.map +1 -0
  112. package/node_modules/@noodle-borg/service/dist/billing/enforcement-activation-support.d.ts +34 -0
  113. package/node_modules/@noodle-borg/service/dist/billing/enforcement-activation-support.d.ts.map +1 -0
  114. package/node_modules/@noodle-borg/service/dist/billing/enforcement-activation-support.js +125 -0
  115. package/node_modules/@noodle-borg/service/dist/billing/enforcement-activation-support.js.map +1 -0
  116. package/node_modules/@noodle-borg/service/dist/billing/enforcement-activation.d.ts +265 -0
  117. package/node_modules/@noodle-borg/service/dist/billing/enforcement-activation.d.ts.map +1 -0
  118. package/node_modules/@noodle-borg/service/dist/billing/enforcement-activation.js +340 -0
  119. package/node_modules/@noodle-borg/service/dist/billing/enforcement-activation.js.map +1 -0
  120. package/node_modules/@noodle-borg/service/dist/billing/enforcement-profile.d.ts +1 -1
  121. package/node_modules/@noodle-borg/service/dist/billing/integration.d.ts +15 -3
  122. package/node_modules/@noodle-borg/service/dist/billing/integration.d.ts.map +1 -1
  123. package/node_modules/@noodle-borg/service/dist/billing/integration.js +56 -3
  124. package/node_modules/@noodle-borg/service/dist/billing/integration.js.map +1 -1
  125. package/node_modules/@noodle-borg/service/dist/billing/postgres-authoritative-authority.d.ts +20 -0
  126. package/node_modules/@noodle-borg/service/dist/billing/postgres-authoritative-authority.d.ts.map +1 -0
  127. package/node_modules/@noodle-borg/service/dist/billing/postgres-authoritative-authority.js +121 -0
  128. package/node_modules/@noodle-borg/service/dist/billing/postgres-authoritative-authority.js.map +1 -0
  129. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-apps.d.ts +10 -0
  130. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-apps.d.ts.map +1 -0
  131. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-apps.js +33 -0
  132. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-apps.js.map +1 -0
  133. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-counters.d.ts +25 -0
  134. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-counters.d.ts.map +1 -0
  135. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-counters.js +248 -0
  136. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-counters.js.map +1 -0
  137. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-projection.d.ts +17 -0
  138. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-projection.d.ts.map +1 -0
  139. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-projection.js +278 -0
  140. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-projection.js.map +1 -0
  141. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-transaction.d.ts +7 -0
  142. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-transaction.d.ts.map +1 -0
  143. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-transaction.js +63 -0
  144. package/node_modules/@noodle-borg/service/dist/billing/postgres-commercial-enforcement-transaction.js.map +1 -0
  145. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-locks.d.ts +6 -0
  146. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-locks.d.ts.map +1 -0
  147. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-locks.js +89 -0
  148. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-locks.js.map +1 -0
  149. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-preflight.d.ts +13 -0
  150. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-preflight.d.ts.map +1 -0
  151. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-preflight.js +193 -0
  152. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-preflight.js.map +1 -0
  153. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-schema.d.ts +4 -0
  154. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-schema.d.ts.map +1 -0
  155. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-schema.js +119 -0
  156. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-schema.js.map +1 -0
  157. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-support.d.ts +65 -0
  158. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-support.d.ts.map +1 -0
  159. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-support.js +159 -0
  160. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation-support.js.map +1 -0
  161. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation.d.ts +31 -0
  162. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation.d.ts.map +1 -0
  163. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation.js +247 -0
  164. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-activation.js.map +1 -0
  165. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.d.ts.map +1 -1
  166. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.js +40 -0
  167. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.js.map +1 -1
  168. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.d.ts +1 -0
  169. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.d.ts.map +1 -1
  170. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.js +45 -22
  171. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.js.map +1 -1
  172. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-admission-ledger.d.ts +33 -0
  173. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-admission-ledger.d.ts.map +1 -0
  174. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-admission-ledger.js +158 -0
  175. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-admission-ledger.js.map +1 -0
  176. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-admission.d.ts +18 -0
  177. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-admission.d.ts.map +1 -0
  178. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-admission.js +326 -0
  179. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-admission.js.map +1 -0
  180. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.d.ts +2 -0
  181. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.d.ts.map +1 -1
  182. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.js +10 -5
  183. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.js.map +1 -1
  184. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.js +3 -3
  185. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.js.map +1 -1
  186. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.d.ts +3 -1
  187. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.d.ts.map +1 -1
  188. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.js +8 -2
  189. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.js.map +1 -1
  190. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.js +4 -4
  191. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.js.map +1 -1
  192. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.d.ts +2 -2
  193. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.d.ts.map +1 -1
  194. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.js.map +1 -1
  195. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-store.js +1 -1
  196. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.d.ts.map +1 -1
  197. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.js +27 -1
  198. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.js.map +1 -1
  199. package/node_modules/@noodle-borg/service/dist/billing/postgres-production-app-admission.d.ts +33 -0
  200. package/node_modules/@noodle-borg/service/dist/billing/postgres-production-app-admission.d.ts.map +1 -0
  201. package/node_modules/@noodle-borg/service/dist/billing/postgres-production-app-admission.js +272 -0
  202. package/node_modules/@noodle-borg/service/dist/billing/postgres-production-app-admission.js.map +1 -0
  203. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.d.ts.map +1 -1
  204. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.js +2 -0
  205. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.js.map +1 -1
  206. package/node_modules/@noodle-borg/service/dist/billing/read-contract.d.ts +174 -28
  207. package/node_modules/@noodle-borg/service/dist/billing/read-contract.d.ts.map +1 -1
  208. package/node_modules/@noodle-borg/service/dist/billing/read-contract.js +51 -6
  209. package/node_modules/@noodle-borg/service/dist/billing/read-contract.js.map +1 -1
  210. package/node_modules/@noodle-borg/service/dist/billing-public.d.ts +3 -0
  211. package/node_modules/@noodle-borg/service/dist/billing-public.d.ts.map +1 -1
  212. package/node_modules/@noodle-borg/service/dist/billing-public.js +3 -0
  213. package/node_modules/@noodle-borg/service/dist/billing-public.js.map +1 -1
  214. package/node_modules/@noodle-borg/service/dist/options.d.ts +14 -2
  215. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  216. package/node_modules/@noodle-borg/service/dist/persistence-options.d.ts.map +1 -1
  217. package/node_modules/@noodle-borg/service/dist/persistence-options.js +9 -0
  218. package/node_modules/@noodle-borg/service/dist/persistence-options.js.map +1 -1
  219. package/node_modules/@noodle-borg/service/dist/registry.d.ts +2 -0
  220. package/node_modules/@noodle-borg/service/dist/registry.d.ts.map +1 -1
  221. package/node_modules/@noodle-borg/service/dist/registry.js +10 -0
  222. package/node_modules/@noodle-borg/service/dist/registry.js.map +1 -1
  223. package/node_modules/@noodle-borg/service/dist/routes/archive.d.ts.map +1 -1
  224. package/node_modules/@noodle-borg/service/dist/routes/archive.js +18 -1
  225. package/node_modules/@noodle-borg/service/dist/routes/archive.js.map +1 -1
  226. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-activation.d.ts +15 -0
  227. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-activation.d.ts.map +1 -0
  228. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-activation.js +197 -0
  229. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-activation.js.map +1 -0
  230. package/node_modules/@noodle-borg/service/dist/routes/billing-production-app-response.d.ts +15 -0
  231. package/node_modules/@noodle-borg/service/dist/routes/billing-production-app-response.d.ts.map +1 -0
  232. package/node_modules/@noodle-borg/service/dist/routes/billing-production-app-response.js +33 -0
  233. package/node_modules/@noodle-borg/service/dist/routes/billing-production-app-response.js.map +1 -0
  234. package/node_modules/@noodle-borg/service/dist/routes/billing-read.d.ts +2 -0
  235. package/node_modules/@noodle-borg/service/dist/routes/billing-read.d.ts.map +1 -1
  236. package/node_modules/@noodle-borg/service/dist/routes/billing-read.js +203 -41
  237. package/node_modules/@noodle-borg/service/dist/routes/billing-read.js.map +1 -1
  238. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.d.ts +4 -0
  239. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.d.ts.map +1 -1
  240. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.js +25 -0
  241. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.js.map +1 -1
  242. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.d.ts +1 -0
  243. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.d.ts.map +1 -1
  244. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.js +9 -1
  245. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.js.map +1 -1
  246. package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts.map +1 -1
  247. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +19 -1
  248. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
  249. package/node_modules/@noodle-borg/service/dist/routes/rollback.d.ts.map +1 -1
  250. package/node_modules/@noodle-borg/service/dist/routes/rollback.js +19 -1
  251. package/node_modules/@noodle-borg/service/dist/routes/rollback.js.map +1 -1
  252. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  253. package/node_modules/@noodle-borg/service/dist/serve.js +41 -1
  254. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  255. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  256. package/node_modules/@noodle-borg/service/dist/service.js +6 -3
  257. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  258. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js +3 -3
  259. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js.map +1 -1
  260. package/node_modules/@noodle-borg/service/dist/store/postgres-apps.d.ts +5 -7
  261. package/node_modules/@noodle-borg/service/dist/store/postgres-apps.d.ts.map +1 -1
  262. package/node_modules/@noodle-borg/service/dist/store/postgres-apps.js +71 -0
  263. package/node_modules/@noodle-borg/service/dist/store/postgres-apps.js.map +1 -1
  264. package/node_modules/@noodle-borg/service/dist/store/postgres-github-runs.d.ts.map +1 -1
  265. package/node_modules/@noodle-borg/service/dist/store/postgres-github-runs.js +7 -0
  266. package/node_modules/@noodle-borg/service/dist/store/postgres-github-runs.js.map +1 -1
  267. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
  268. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +5 -0
  269. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
  270. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -1
  271. package/node_modules/@noodle-borg/service/dist/store/postgres.js +29 -34
  272. package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -1
  273. package/package.json +1 -1
@@ -0,0 +1,278 @@
1
+ import { validateSlug } from '../store/validate.js';
2
+ import { BillingCommercialEntitlementError, parseBillingCommercialFreeV1Entitlements, } from './commercial-entitlements.js';
3
+ import { BILLING_AUTHORITATIVE_ADMISSION_CONTRACT_VERSION } from './enforcement-activation.js';
4
+ import { billingContentChecksum, validateBillingAccountId } from './model.js';
5
+ import { BillingAuthoritativeAuthorityInconsistentError, readBillingAuthoritativeAuthorityTx, } from './postgres-authoritative-authority.js';
6
+ import { readBillingCommercialProductionAppCountsTx } from './postgres-commercial-enforcement-apps.js';
7
+ import { BillingCommercialCounterProjectionError, readBillingCommercialCounterProjectionTx, } from './postgres-commercial-enforcement-counters.js';
8
+ import { withBillingCommercialEnforcementReadTx } from './postgres-commercial-enforcement-transaction.js';
9
+ import { readBillingMeterTransactionTime } from './postgres-meter-clock.js';
10
+ import { resolveUtcMonthlyUsageWindow } from './usage-window.js';
11
+ const DEFAULT_LOCK_TIMEOUT_MS = 1_000;
12
+ const DEFAULT_STATEMENT_TIMEOUT_MS = 2_000;
13
+ class ProjectionCorruptionError extends Error {
14
+ reason;
15
+ constructor(reason) {
16
+ super(`commercial enforcement projection is corrupt: ${reason}`);
17
+ this.name = 'ProjectionCorruptionError';
18
+ this.reason = reason;
19
+ }
20
+ }
21
+ /** Read-only projection over the same authority, snapshot, and pooled counters used by admission. */
22
+ export class PostgresBillingCommercialEnforcementProjectionStore {
23
+ #pool;
24
+ #keyGeneration;
25
+ #admissionContractVersion;
26
+ #lockTimeoutMs;
27
+ #statementTimeoutMs;
28
+ constructor(pool, options) {
29
+ this.#pool = pool;
30
+ this.#keyGeneration = validateFingerprint(options.keyGeneration);
31
+ this.#admissionContractVersion = validateAdmissionContractVersion(options.admissionContractVersion ?? BILLING_AUTHORITATIVE_ADMISSION_CONTRACT_VERSION);
32
+ this.#lockTimeoutMs = boundedTimeout('billing commercial projection lock timeout', options.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS);
33
+ this.#statementTimeoutMs = boundedTimeout('billing commercial projection statement timeout', options.statementTimeoutMs ?? DEFAULT_STATEMENT_TIMEOUT_MS);
34
+ }
35
+ async getCommercialEnforcementProjection(rawScope, expectedSnapshotBinding) {
36
+ const scope = normalizeScope(rawScope);
37
+ try {
38
+ return await withBillingCommercialEnforcementReadTx(this.#pool, {
39
+ lockTimeoutMs: this.#lockTimeoutMs,
40
+ statementTimeoutMs: this.#statementTimeoutMs,
41
+ }, async (client) => {
42
+ const authority = await readBillingAuthoritativeAuthorityTx(client, {
43
+ keyGeneration: this.#keyGeneration,
44
+ admissionContractVersion: this.#admissionContractVersion,
45
+ });
46
+ if (authority.state === 'unconfigured')
47
+ return { state: 'unconfigured', scope };
48
+ if (authority.state === 'inactive') {
49
+ return { state: 'inactive', reason: authority.reason, scope };
50
+ }
51
+ const recordedAt = await readBillingMeterTransactionTime(client);
52
+ const resolved = validateResolution(await readResolution(client, scope), expectedSnapshotBinding);
53
+ if (resolved.profileMode === 'legacy_internal_exempt') {
54
+ return { state: 'exempt', reason: 'legacy_internal_exempt', scope };
55
+ }
56
+ const window = resolveUtcMonthlyUsageWindow(resolved.monthlyUsageAnchor, recordedAt);
57
+ const countingSince = authority.activatedAt > window.start ? authority.activatedAt : window.start;
58
+ if (countingSince > recordedAt || countingSince >= window.end) {
59
+ throw new BillingAuthoritativeAuthorityInconsistentError();
60
+ }
61
+ const counters = await readBillingCommercialCounterProjectionTx(client, {
62
+ epochId: authority.epochId,
63
+ billingAccountId: resolved.billingAccountId,
64
+ org: scope.kind === 'organization' ? scope.org : null,
65
+ entitlements: resolved.entitlements,
66
+ recordedAt,
67
+ countingSince,
68
+ windowStart: window.start,
69
+ windowEnd: window.end,
70
+ });
71
+ const productionApps = await readBillingCommercialProductionAppCountsTx(client, {
72
+ billingAccountId: resolved.billingAccountId,
73
+ org: scope.kind === 'organization' ? scope.org : null,
74
+ });
75
+ const active = {
76
+ state: 'active',
77
+ meteringMode: 'authoritative',
78
+ scope,
79
+ };
80
+ return scope.kind === 'organization'
81
+ ? {
82
+ ...active,
83
+ scope,
84
+ usage: counters.organizationUsage ?? {
85
+ includedUsedCalls: 0,
86
+ overageUsedCalls: 0,
87
+ totalUsedCalls: 0,
88
+ countingSince,
89
+ windowStart: window.start,
90
+ windowEnd: window.end,
91
+ resetAt: window.end,
92
+ },
93
+ productionApps: {
94
+ active: productionApps.organizationActive ?? 0,
95
+ limit: resolved.entitlements.productionAppLimit,
96
+ },
97
+ }
98
+ : {
99
+ ...active,
100
+ scope,
101
+ usage: counters.accountUsage,
102
+ snapshotBinding: resolved.snapshotBinding,
103
+ productionApps: {
104
+ active: productionApps.accountActive,
105
+ limit: resolved.entitlements.productionAppLimit,
106
+ },
107
+ };
108
+ });
109
+ }
110
+ catch (error) {
111
+ return unavailableProjection(scope, unavailableReason(error));
112
+ }
113
+ }
114
+ }
115
+ async function readResolution(client, scope) {
116
+ const targetJoin = scope.kind === 'billing_account'
117
+ ? `FROM (VALUES ($1::text)) AS target(billing_account_id)
118
+ LEFT JOIN billing_accounts AS account ON account.id = target.billing_account_id`
119
+ : `FROM (VALUES ($1::text)) AS target(org_slug)
120
+ LEFT JOIN org_billing_links AS link ON link.org_slug = target.org_slug AND link.active
121
+ LEFT JOIN billing_accounts AS account ON account.id = link.billing_account_id`;
122
+ const value = scope.kind === 'billing_account' ? scope.billingAccountId : scope.org;
123
+ const { rows } = await client.query(`SELECT account.id AS account_id, account.state AS account_state,
124
+ account.created_at AS account_created_at,
125
+ profile.mode AS profile_mode, profile.source AS profile_source,
126
+ profile.cohort_seal_id AS profile_cohort_seal_id,
127
+ profile.effective_from AS profile_effective_from,
128
+ seal.id AS cohort_seal_id, seal.sealed_at AS cohort_sealed_at,
129
+ snapshot.id AS snapshot_id, snapshot.version AS snapshot_version,
130
+ snapshot.plan_version_id AS snapshot_plan_version_id,
131
+ snapshot.verification_status AS snapshot_verification_status,
132
+ snapshot.effective_from AS snapshot_effective_from,
133
+ snapshot.monthly_usage_anchor AS snapshot_monthly_usage_anchor,
134
+ snapshot.entitlements AS snapshot_entitlements,
135
+ snapshot.content_checksum AS snapshot_content_checksum
136
+ ${targetJoin}
137
+ LEFT JOIN billing_account_active_enforcement_profiles AS active_profile
138
+ ON active_profile.billing_account_id = account.id
139
+ LEFT JOIN billing_account_enforcement_profiles AS profile
140
+ ON profile.billing_account_id = active_profile.billing_account_id
141
+ AND profile.version = active_profile.profile_version
142
+ LEFT JOIN billing_account_active_snapshots AS active_snapshot
143
+ ON active_snapshot.billing_account_id = account.id
144
+ LEFT JOIN billing_entitlement_snapshots AS snapshot
145
+ ON snapshot.billing_account_id = active_snapshot.billing_account_id
146
+ AND snapshot.id = active_snapshot.snapshot_id
147
+ LEFT JOIN billing_enforcement_cohort_seals AS seal ON seal.singleton = true`, [value]);
148
+ const row = rows[0];
149
+ if (row === undefined)
150
+ throw corrupt('profile_inconsistent');
151
+ return row;
152
+ }
153
+ function validateResolution(row, expectedSnapshotBinding) {
154
+ const profileEffectiveFrom = projectionInstant(row.profile_effective_from, 'profile_inconsistent');
155
+ const cohortSealedAt = projectionInstant(row.cohort_sealed_at, 'profile_inconsistent');
156
+ const validLegacyProfile = row.profile_mode === 'legacy_internal_exempt' &&
157
+ row.profile_source === 'legacy_cohort_seal' &&
158
+ profileEffectiveFrom === cohortSealedAt;
159
+ const validEnforcedProfile = row.profile_mode === 'enforced' &&
160
+ row.profile_source === 'post_seal_account' &&
161
+ profileEffectiveFrom >= cohortSealedAt;
162
+ if (row.account_id === null ||
163
+ row.account_state !== 'active' ||
164
+ row.profile_cohort_seal_id === null ||
165
+ row.profile_cohort_seal_id !== row.cohort_seal_id ||
166
+ (!validLegacyProfile && !validEnforcedProfile)) {
167
+ throw corrupt('profile_inconsistent');
168
+ }
169
+ if (row.snapshot_id === null ||
170
+ row.snapshot_version === null ||
171
+ !Number.isSafeInteger(row.snapshot_version) ||
172
+ row.snapshot_version < 1 ||
173
+ row.snapshot_plan_version_id === null ||
174
+ row.snapshot_verification_status !== 'verified' ||
175
+ row.snapshot_effective_from === null ||
176
+ row.snapshot_monthly_usage_anchor === null ||
177
+ row.snapshot_content_checksum === null) {
178
+ throw corrupt('snapshot_inconsistent');
179
+ }
180
+ const effectiveFrom = projectionInstant(row.snapshot_effective_from, 'snapshot_inconsistent');
181
+ const monthlyUsageAnchor = projectionInstant(row.snapshot_monthly_usage_anchor, 'snapshot_inconsistent');
182
+ const expectedChecksum = billingContentChecksum({
183
+ billingAccountId: row.account_id,
184
+ version: row.snapshot_version,
185
+ planVersionId: row.snapshot_plan_version_id,
186
+ effectiveFrom,
187
+ monthlyUsageAnchor,
188
+ entitlements: row.snapshot_entitlements,
189
+ });
190
+ if (row.snapshot_content_checksum !== expectedChecksum)
191
+ throw corrupt('snapshot_inconsistent');
192
+ const billingAccountId = validateBillingAccountId(row.account_id);
193
+ if (row.profile_mode === 'legacy_internal_exempt') {
194
+ return { billingAccountId, profileMode: row.profile_mode };
195
+ }
196
+ const snapshotBinding = {
197
+ snapshotId: row.snapshot_id,
198
+ version: row.snapshot_version,
199
+ contentChecksum: row.snapshot_content_checksum,
200
+ };
201
+ if (expectedSnapshotBinding !== undefined &&
202
+ !sameSnapshotBinding(snapshotBinding, expectedSnapshotBinding)) {
203
+ throw corrupt('snapshot_inconsistent');
204
+ }
205
+ let entitlements;
206
+ try {
207
+ entitlements = parseBillingCommercialFreeV1Entitlements(row.snapshot_entitlements);
208
+ }
209
+ catch (error) {
210
+ if (error instanceof BillingCommercialEntitlementError) {
211
+ throw corrupt('snapshot_inconsistent');
212
+ }
213
+ throw error;
214
+ }
215
+ return {
216
+ billingAccountId,
217
+ profileMode: row.profile_mode,
218
+ entitlements,
219
+ monthlyUsageAnchor,
220
+ snapshotBinding,
221
+ };
222
+ }
223
+ function sameSnapshotBinding(current, expected) {
224
+ return (current.snapshotId === expected.snapshotId &&
225
+ current.version === expected.version &&
226
+ current.contentChecksum === expected.contentChecksum);
227
+ }
228
+ function normalizeScope(scope) {
229
+ return scope.kind === 'billing_account'
230
+ ? {
231
+ kind: 'billing_account',
232
+ billingAccountId: validateBillingAccountId(scope.billingAccountId),
233
+ }
234
+ : { kind: 'organization', org: validateSlug('org', scope.org) };
235
+ }
236
+ function unavailableProjection(scope, reason) {
237
+ return { state: 'unavailable', reason, scope };
238
+ }
239
+ function unavailableReason(error) {
240
+ if (error instanceof BillingAuthoritativeAuthorityInconsistentError) {
241
+ return 'authority_inconsistent';
242
+ }
243
+ if (error instanceof BillingCommercialCounterProjectionError)
244
+ return error.reason;
245
+ if (error instanceof ProjectionCorruptionError)
246
+ return error.reason;
247
+ return 'meter_unavailable';
248
+ }
249
+ function projectionInstant(value, reason) {
250
+ if (value === null)
251
+ throw corrupt(reason);
252
+ const date = value instanceof Date ? value : new Date(value);
253
+ if (!Number.isFinite(date.getTime()))
254
+ throw corrupt(reason);
255
+ return date.toISOString();
256
+ }
257
+ function validateFingerprint(value) {
258
+ if (!/^[0-9a-f]{64}$/.test(value)) {
259
+ throw new Error('billing commercial projection key generation must be a SHA-256 digest');
260
+ }
261
+ return value;
262
+ }
263
+ function validateAdmissionContractVersion(value) {
264
+ if (value !== BILLING_AUTHORITATIVE_ADMISSION_CONTRACT_VERSION) {
265
+ throw new Error('billing commercial projection admission contract version is unsupported');
266
+ }
267
+ return value;
268
+ }
269
+ function boundedTimeout(label, value) {
270
+ if (!Number.isSafeInteger(value) || value < 1 || value > 5_000) {
271
+ throw new Error(`${label} must be between 1 and 5000 milliseconds`);
272
+ }
273
+ return value;
274
+ }
275
+ function corrupt(reason) {
276
+ return new ProjectionCorruptionError(reason);
277
+ }
278
+ //# sourceMappingURL=postgres-commercial-enforcement-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-commercial-enforcement-projection.js","sourceRoot":"","sources":["../../src/billing/postgres-commercial-enforcement-projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Pool, PoolClient } from 'pg';
2
+ /** Acquire the session lifecycle lock before opening the repeatable-read projection snapshot. */
3
+ export declare function withBillingCommercialEnforcementReadTx<T>(pool: Pool, input: {
4
+ readonly lockTimeoutMs: number;
5
+ readonly statementTimeoutMs: number;
6
+ }, run: (client: PoolClient) => Promise<T>): Promise<T>;
7
+ //# sourceMappingURL=postgres-commercial-enforcement-transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-commercial-enforcement-transaction.d.ts","sourceRoot":"","sources":["../../src/billing/postgres-commercial-enforcement-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAG3C,iGAAiG;AACjG,wBAAsB,sCAAsC,CAAC,CAAC,EAC5D,IAAI,EAAE,IAAI,EACV,KAAK,EAAE;IAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,EAC9E,GAAG,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,CAAC,CAgDZ"}
@@ -0,0 +1,63 @@
1
+ import { BILLING_METER_EPOCH_LIFECYCLE_LOCK_KEY } from './postgres-meter-epochs.js';
2
+ /** Acquire the session lifecycle lock before opening the repeatable-read projection snapshot. */
3
+ export async function withBillingCommercialEnforcementReadTx(pool, input, run) {
4
+ const client = await pool.connect();
5
+ let lockAttempted = false;
6
+ let lockHeld = false;
7
+ let transactionOpen = false;
8
+ let clientReusable = true;
9
+ try {
10
+ await client.query(`SELECT set_config('lock_timeout', $1, false)`, [
11
+ `${input.lockTimeoutMs}ms`,
12
+ ]);
13
+ lockAttempted = true;
14
+ await client.query('SELECT pg_advisory_lock_shared(hashtextextended($1, 0))', [
15
+ BILLING_METER_EPOCH_LIFECYCLE_LOCK_KEY,
16
+ ]);
17
+ lockHeld = true;
18
+ await client.query('BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY');
19
+ transactionOpen = true;
20
+ await client.query(`SELECT set_config('lock_timeout', $1, true),
21
+ set_config('statement_timeout', $2, true)`, [`${input.lockTimeoutMs}ms`, `${input.statementTimeoutMs}ms`]);
22
+ const result = await run(client);
23
+ await client.query('COMMIT');
24
+ transactionOpen = false;
25
+ return result;
26
+ }
27
+ catch (error) {
28
+ if (transactionOpen) {
29
+ try {
30
+ await client.query('ROLLBACK');
31
+ transactionOpen = false;
32
+ }
33
+ catch {
34
+ clientReusable = false;
35
+ }
36
+ }
37
+ throw error;
38
+ }
39
+ finally {
40
+ if (lockAttempted) {
41
+ const unlocked = await unlockLifecycleShared(client);
42
+ if (unlocked === undefined || (lockHeld && !unlocked))
43
+ clientReusable = false;
44
+ }
45
+ try {
46
+ await client.query(`SELECT set_config('lock_timeout', '0', false)`);
47
+ }
48
+ catch {
49
+ clientReusable = false;
50
+ }
51
+ client.release(clientReusable ? undefined : true);
52
+ }
53
+ }
54
+ async function unlockLifecycleShared(client) {
55
+ try {
56
+ const { rows } = await client.query('SELECT pg_advisory_unlock_shared(hashtextextended($1, 0)) AS unlocked', [BILLING_METER_EPOCH_LIFECYCLE_LOCK_KEY]);
57
+ return rows[0]?.unlocked;
58
+ }
59
+ catch {
60
+ return undefined;
61
+ }
62
+ }
63
+ //# sourceMappingURL=postgres-commercial-enforcement-transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-commercial-enforcement-transaction.js","sourceRoot":"","sources":["../../src/billing/postgres-commercial-enforcement-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sCAAsC,EAAE,MAAM,4BAA4B,CAAC;AAEpF,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,sCAAsC,CAC1D,IAAU,EACV,KAA8E,EAC9E,GAAuC;IAEvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,cAAc,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE;YACjE,GAAG,KAAK,CAAC,aAAa,IAAI;SAC3B,CAAC,CAAC;QACH,aAAa,GAAG,IAAI,CAAC;QACrB,MAAM,MAAM,CAAC,KAAK,CAAC,yDAAyD,EAAE;YAC5E,sCAAsC;SACvC,CAAC,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACtE,eAAe,GAAG,IAAI,CAAC;QACvB,MAAM,MAAM,CAAC,KAAK,CAChB;wDACkD,EAClD,CAAC,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,GAAG,KAAK,CAAC,kBAAkB,IAAI,CAAC,CAC9D,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,eAAe,GAAG,KAAK,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC/B,eAAe,GAAG,KAAK,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC;gBAAE,cAAc,GAAG,KAAK,CAAC;QAChF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,GAAG,KAAK,CAAC;QACzB,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAAkB;IACrD,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CACjC,uEAAuE,EACvE,CAAC,sCAAsC,CAAC,CACzC,CAAC;QACF,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Pool, PoolClient } from 'pg';
2
+ export declare const BILLING_ENFORCEMENT_ACTIVATION_LOCK_TIMEOUT_MS = 5000;
3
+ export declare function validateActivationLockTimeout(value: number): number;
4
+ /** Acquire both cross-revision session locks before opening the fresh SERIALIZABLE snapshot. */
5
+ export declare function withBillingEnforcementActivationTransaction<T>(pool: Pool, lockTimeoutMs: number, run: (client: PoolClient) => Promise<T>): Promise<T>;
6
+ //# sourceMappingURL=postgres-enforcement-activation-locks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-enforcement-activation-locks.d.ts","sourceRoot":"","sources":["../../src/billing/postgres-enforcement-activation-locks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAK3C,eAAO,MAAM,8CAA8C,OAAQ,CAAC;AAEpE,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED,gGAAgG;AAChG,wBAAsB,2CAA2C,CAAC,CAAC,EACjE,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,CAAC,CAoDZ"}
@@ -0,0 +1,89 @@
1
+ import { translateTransactionError } from './postgres-enforcement-activation-support.js';
2
+ import { BILLING_METER_EPOCH_LIFECYCLE_LOCK_KEY } from './postgres-meter-epochs.js';
3
+ import { BILLING_METER_SCHEDULER_LOCK_KEY } from './postgres-meter-scheduler.js';
4
+ export const BILLING_ENFORCEMENT_ACTIVATION_LOCK_TIMEOUT_MS = 5_000;
5
+ export function validateActivationLockTimeout(value) {
6
+ if (!Number.isSafeInteger(value) || value < 1 || value > 60_000) {
7
+ throw new Error('billing enforcement activation lock timeout must be 1..60000ms');
8
+ }
9
+ return value;
10
+ }
11
+ /** Acquire both cross-revision session locks before opening the fresh SERIALIZABLE snapshot. */
12
+ export async function withBillingEnforcementActivationTransaction(pool, lockTimeoutMs, run) {
13
+ const client = await pool.connect();
14
+ let lifecycleHeld = false;
15
+ let schedulerHeld = false;
16
+ let transactionOpen = false;
17
+ let clientReusable = true;
18
+ try {
19
+ await client.query(`SELECT set_config('lock_timeout', $1, false)`, [`${lockTimeoutMs}ms`]);
20
+ await client.query('SELECT pg_advisory_lock(hashtextextended($1, 0))', [
21
+ BILLING_METER_EPOCH_LIFECYCLE_LOCK_KEY,
22
+ ]);
23
+ lifecycleHeld = true;
24
+ await client.query(`SELECT pg_advisory_lock(
25
+ hashtextextended(
26
+ $1 || ':' || 'billing_meter_scheduler_runs'::regclass::oid::text,
27
+ 0
28
+ )
29
+ )`, [BILLING_METER_SCHEDULER_LOCK_KEY]);
30
+ schedulerHeld = true;
31
+ await client.query('BEGIN ISOLATION LEVEL SERIALIZABLE');
32
+ transactionOpen = true;
33
+ const result = await run(client);
34
+ await client.query('COMMIT');
35
+ transactionOpen = false;
36
+ return result;
37
+ }
38
+ catch (error) {
39
+ if (transactionOpen) {
40
+ try {
41
+ await client.query('ROLLBACK');
42
+ transactionOpen = false;
43
+ }
44
+ catch {
45
+ clientReusable = false;
46
+ }
47
+ }
48
+ throw translateTransactionError(error);
49
+ }
50
+ finally {
51
+ if (schedulerHeld) {
52
+ clientReusable = (await unlockScheduler(client)) && clientReusable;
53
+ }
54
+ if (lifecycleHeld) {
55
+ clientReusable = (await unlockLifecycle(client)) && clientReusable;
56
+ }
57
+ try {
58
+ await client.query(`SELECT set_config('lock_timeout', '0', false)`);
59
+ }
60
+ catch {
61
+ clientReusable = false;
62
+ }
63
+ client.release(clientReusable ? undefined : true);
64
+ }
65
+ }
66
+ async function unlockScheduler(client) {
67
+ try {
68
+ const { rows } = await client.query(`SELECT pg_advisory_unlock(
69
+ hashtextextended(
70
+ $1 || ':' || 'billing_meter_scheduler_runs'::regclass::oid::text,
71
+ 0
72
+ )
73
+ ) AS unlocked`, [BILLING_METER_SCHEDULER_LOCK_KEY]);
74
+ return rows[0]?.unlocked === true;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ async function unlockLifecycle(client) {
81
+ try {
82
+ const { rows } = await client.query('SELECT pg_advisory_unlock(hashtextextended($1, 0)) AS unlocked', [BILLING_METER_EPOCH_LIFECYCLE_LOCK_KEY]);
83
+ return rows[0]?.unlocked === true;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ //# sourceMappingURL=postgres-enforcement-activation-locks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-enforcement-activation-locks.js","sourceRoot":"","sources":["../../src/billing/postgres-enforcement-activation-locks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { PoolClient } from 'pg';
2
+ import { type BillingEnforcementActivationPreflight, type BillingEnforcementActivationSignals } from './enforcement-activation.js';
3
+ import type { PostgresBillingMeterReadinessStore } from './postgres-meter-readiness.js';
4
+ export interface PostgresBillingEnforcementActivationPreflightOptions {
5
+ readonly serviceOrigin: string;
6
+ readonly currentReleaseSha: string;
7
+ readonly supportedAdmissionContractVersion?: number;
8
+ /** Must recompute on the supplied transaction; absence is an explicit unavailable blocker. */
9
+ readonly meterReadiness?: Pick<PostgresBillingMeterReadinessStore, 'readMeterReadinessTx'>;
10
+ }
11
+ export declare function createPostgresBillingEnforcementActivationPreflight(options: PostgresBillingEnforcementActivationPreflightOptions): BillingEnforcementActivationPreflight;
12
+ export declare function readPostgresBillingEnforcementActivationSignalsTx(client: PoolClient, checkedAt: string, options: PostgresBillingEnforcementActivationPreflightOptions): Promise<BillingEnforcementActivationSignals>;
13
+ //# sourceMappingURL=postgres-enforcement-activation-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-enforcement-activation-preflight.d.ts","sourceRoot":"","sources":["../../src/billing/postgres-enforcement-activation-preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,IAAI,CAAC;AAKrD,OAAO,EAEL,KAAK,qCAAqC,EAC1C,KAAK,mCAAmC,EAGzC,MAAM,6BAA6B,CAAC;AAUrC,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,+BAA+B,CAAC;AA8BxF,MAAM,WAAW,oDAAoD;IACnE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,MAAM,CAAC;IACpD,8FAA8F;IAC9F,QAAQ,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,kCAAkC,EAAE,sBAAsB,CAAC,CAAC;CAC5F;AASD,wBAAgB,mDAAmD,CACjE,OAAO,EAAE,oDAAoD,GAC5D,qCAAqC,CAcvC;AAED,wBAAsB,iDAAiD,CACrE,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,oDAAoD,GAC5D,OAAO,CAAC,mCAAmC,CAAC,CA0C9C"}