@noodleseed/one 0.46.0 → 0.47.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 (309) hide show
  1. package/dist/commands/auth-ops.d.ts.map +1 -1
  2. package/dist/commands/auth-ops.js +28 -4
  3. package/dist/commands/auth-ops.js.map +1 -1
  4. package/dist/commands/billing-enforcement-ops.d.ts +2 -0
  5. package/dist/commands/billing-enforcement-ops.d.ts.map +1 -0
  6. package/dist/commands/billing-enforcement-ops.js +312 -0
  7. package/dist/commands/billing-enforcement-ops.js.map +1 -0
  8. package/dist/commands/billing-metering-ops.d.ts +2 -0
  9. package/dist/commands/billing-metering-ops.d.ts.map +1 -0
  10. package/dist/commands/billing-metering-ops.js +128 -0
  11. package/dist/commands/billing-metering-ops.js.map +1 -0
  12. package/dist/commands/billing-metering-validation-ops.d.ts +2 -0
  13. package/dist/commands/billing-metering-validation-ops.d.ts.map +1 -0
  14. package/dist/commands/billing-metering-validation-ops.js +186 -0
  15. package/dist/commands/billing-metering-validation-ops.js.map +1 -0
  16. package/dist/commands/billing-ops.d.ts.map +1 -1
  17. package/dist/commands/billing-ops.js +6 -0
  18. package/dist/commands/billing-ops.js.map +1 -1
  19. package/dist/commands/catalog-data-resources.d.ts.map +1 -1
  20. package/dist/commands/catalog-data-resources.js +14 -3
  21. package/dist/commands/catalog-data-resources.js.map +1 -1
  22. package/dist/commands/catalog-render.d.ts.map +1 -1
  23. package/dist/commands/catalog-render.js +7 -5
  24. package/dist/commands/catalog-render.js.map +1 -1
  25. package/dist/commands/deploy-ops.d.ts.map +1 -1
  26. package/dist/commands/deploy-ops.js +10 -1
  27. package/dist/commands/deploy-ops.js.map +1 -1
  28. package/dist/commands/deploy-output.d.ts.map +1 -1
  29. package/dist/commands/deploy-output.js +4 -0
  30. package/dist/commands/deploy-output.js.map +1 -1
  31. package/dist/commands/deploy-version-resolution.d.ts +1 -0
  32. package/dist/commands/deploy-version-resolution.d.ts.map +1 -1
  33. package/dist/commands/deploy-version-resolution.js +8 -0
  34. package/dist/commands/deploy-version-resolution.js.map +1 -1
  35. package/dist/commands/mcp-apps-chatgpt.d.ts +7 -0
  36. package/dist/commands/mcp-apps-chatgpt.d.ts.map +1 -0
  37. package/dist/commands/mcp-apps-chatgpt.js +143 -0
  38. package/dist/commands/mcp-apps-chatgpt.js.map +1 -0
  39. package/dist/commands/mcp-apps.d.ts.map +1 -1
  40. package/dist/commands/mcp-apps.js +2 -114
  41. package/dist/commands/mcp-apps.js.map +1 -1
  42. package/dist/deploy-payload-size.d.ts +3 -0
  43. package/dist/deploy-payload-size.d.ts.map +1 -0
  44. package/dist/deploy-payload-size.js +29 -0
  45. package/dist/deploy-payload-size.js.map +1 -0
  46. package/dist/deploy.d.ts.map +1 -1
  47. package/dist/deploy.js +16 -8
  48. package/dist/deploy.js.map +1 -1
  49. package/dist/sdk-version-skew.d.ts +3 -0
  50. package/dist/sdk-version-skew.d.ts.map +1 -0
  51. package/dist/sdk-version-skew.js +34 -0
  52. package/dist/sdk-version-skew.js.map +1 -0
  53. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +2 -2
  54. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  55. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +1 -1
  56. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js.map +1 -1
  57. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
  58. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js.map +1 -1
  59. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +2 -2
  60. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js.map +1 -1
  61. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  62. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +5 -0
  63. package/node_modules/@noodle-borg/authoring/dist/server.d.ts.map +1 -1
  64. package/node_modules/@noodle-borg/authoring/dist/server.js +1 -0
  65. package/node_modules/@noodle-borg/authoring/dist/server.js.map +1 -1
  66. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +7 -1
  67. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts.map +1 -1
  68. package/node_modules/@noodle-borg/compiler/dist/artifact/types.js +4 -1
  69. package/node_modules/@noodle-borg/compiler/dist/artifact/types.js.map +1 -1
  70. package/node_modules/@noodle-borg/compiler/dist/compile.d.ts.map +1 -1
  71. package/node_modules/@noodle-borg/compiler/dist/compile.js +3 -0
  72. package/node_modules/@noodle-borg/compiler/dist/compile.js.map +1 -1
  73. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +12 -0
  74. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -1
  75. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +7 -0
  76. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -1
  77. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js +18 -0
  78. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js.map +1 -1
  79. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.d.ts +3 -0
  80. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.d.ts.map +1 -1
  81. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.js +12 -3
  82. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.js.map +1 -1
  83. package/node_modules/@noodle-borg/service/dist/billing/enforcement-profile.d.ts +96 -0
  84. package/node_modules/@noodle-borg/service/dist/billing/enforcement-profile.d.ts.map +1 -0
  85. package/node_modules/@noodle-borg/service/dist/billing/enforcement-profile.js +198 -0
  86. package/node_modules/@noodle-borg/service/dist/billing/enforcement-profile.js.map +1 -0
  87. package/node_modules/@noodle-borg/service/dist/billing/integration.d.ts +25 -2
  88. package/node_modules/@noodle-borg/service/dist/billing/integration.d.ts.map +1 -1
  89. package/node_modules/@noodle-borg/service/dist/billing/integration.js +51 -5
  90. package/node_modules/@noodle-borg/service/dist/billing/integration.js.map +1 -1
  91. package/node_modules/@noodle-borg/service/dist/billing/meter-capacity.d.ts +77 -0
  92. package/node_modules/@noodle-borg/service/dist/billing/meter-capacity.d.ts.map +1 -0
  93. package/node_modules/@noodle-borg/service/dist/billing/meter-capacity.js +202 -0
  94. package/node_modules/@noodle-borg/service/dist/billing/meter-capacity.js.map +1 -0
  95. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation-contract.d.ts +8 -0
  96. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation-contract.d.ts.map +1 -0
  97. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation-contract.js +93 -0
  98. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation-contract.js.map +1 -0
  99. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation.d.ts +76 -0
  100. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation.d.ts.map +1 -0
  101. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation.js +233 -0
  102. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation.js.map +1 -0
  103. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness-health.d.ts +89 -0
  104. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness-health.d.ts.map +1 -0
  105. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness-health.js +191 -0
  106. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness-health.js.map +1 -0
  107. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness.d.ts +99 -0
  108. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness.d.ts.map +1 -0
  109. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness.js +136 -0
  110. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness.js.map +1 -0
  111. package/node_modules/@noodle-borg/service/dist/billing/meter-runtime-config.d.ts +9 -0
  112. package/node_modules/@noodle-borg/service/dist/billing/meter-runtime-config.d.ts.map +1 -0
  113. package/node_modules/@noodle-borg/service/dist/billing/meter-runtime-config.js +24 -0
  114. package/node_modules/@noodle-borg/service/dist/billing/meter-runtime-config.js.map +1 -0
  115. package/node_modules/@noodle-borg/service/dist/billing/meter-validation-epoch.d.ts +75 -0
  116. package/node_modules/@noodle-borg/service/dist/billing/meter-validation-epoch.d.ts.map +1 -0
  117. package/node_modules/@noodle-borg/service/dist/billing/meter-validation-epoch.js +127 -0
  118. package/node_modules/@noodle-borg/service/dist/billing/meter-validation-epoch.js.map +1 -0
  119. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.d.ts +4 -0
  120. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.d.ts.map +1 -0
  121. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.js +107 -0
  122. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.js.map +1 -0
  123. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.d.ts +18 -0
  124. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.d.ts.map +1 -0
  125. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.js +341 -0
  126. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.js.map +1 -0
  127. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-clock.d.ts +3 -0
  128. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-clock.d.ts.map +1 -0
  129. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-clock.js +9 -0
  130. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-clock.js.map +1 -0
  131. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epoch-fixtures.d.ts +13 -0
  132. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epoch-fixtures.d.ts.map +1 -0
  133. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epoch-fixtures.js +102 -0
  134. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epoch-fixtures.js.map +1 -0
  135. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.d.ts +41 -0
  136. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.d.ts.map +1 -0
  137. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.js +289 -0
  138. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.js.map +1 -0
  139. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-evidence-retention.d.ts +16 -0
  140. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-evidence-retention.d.ts.map +1 -0
  141. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-evidence-retention.js +126 -0
  142. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-evidence-retention.js.map +1 -0
  143. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.d.ts +33 -0
  144. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.d.ts.map +1 -0
  145. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.js +436 -0
  146. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.js.map +1 -0
  147. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-maintenance.d.ts +26 -0
  148. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-maintenance.d.ts.map +1 -0
  149. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-maintenance.js +146 -0
  150. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-maintenance.js.map +1 -0
  151. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-partition.d.ts +8 -0
  152. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-partition.d.ts.map +1 -0
  153. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-partition.js +42 -0
  154. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-partition.js.map +1 -0
  155. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-prepare-preflight.d.ts +8 -0
  156. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-prepare-preflight.d.ts.map +1 -0
  157. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-prepare-preflight.js +44 -0
  158. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-prepare-preflight.js.map +1 -0
  159. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness-live.d.ts +13 -0
  160. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness-live.d.ts.map +1 -0
  161. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness-live.js +189 -0
  162. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness-live.js.map +1 -0
  163. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.d.ts +18 -0
  164. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.d.ts.map +1 -0
  165. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.js +342 -0
  166. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.js.map +1 -0
  167. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.d.ts +27 -0
  168. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.d.ts.map +1 -0
  169. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.js +304 -0
  170. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.js.map +1 -0
  171. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-retention.d.ts +22 -0
  172. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-retention.d.ts.map +1 -0
  173. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-retention.js +224 -0
  174. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-retention.js.map +1 -0
  175. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.d.ts +33 -0
  176. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.d.ts.map +1 -0
  177. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.js +173 -0
  178. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.js.map +1 -0
  179. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-schema.d.ts +7 -0
  180. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-schema.d.ts.map +1 -0
  181. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-schema.js +50 -0
  182. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-schema.js.map +1 -0
  183. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-store.d.ts +34 -0
  184. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-store.d.ts.map +1 -0
  185. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-store.js +157 -0
  186. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-store.js.map +1 -0
  187. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler.d.ts +56 -0
  188. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler.d.ts.map +1 -0
  189. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler.js +264 -0
  190. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler.js.map +1 -0
  191. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.d.ts +6 -0
  192. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.d.ts.map +1 -0
  193. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.js +414 -0
  194. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.js.map +1 -0
  195. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-validation.d.ts +43 -0
  196. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-validation.d.ts.map +1 -0
  197. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-validation.js +321 -0
  198. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-validation.js.map +1 -0
  199. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-lock.d.ts +10 -0
  200. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-lock.d.ts.map +1 -0
  201. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-lock.js +13 -0
  202. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-lock.js.map +1 -0
  203. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-schema.d.ts +6 -0
  204. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-schema.d.ts.map +1 -0
  205. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-schema.js +248 -0
  206. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-schema.js.map +1 -0
  207. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-compaction.d.ts +29 -0
  208. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-compaction.d.ts.map +1 -0
  209. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-compaction.js +240 -0
  210. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-compaction.js.map +1 -0
  211. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-health-schema.d.ts +4 -0
  212. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-health-schema.d.ts.map +1 -0
  213. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-health-schema.js +140 -0
  214. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-health-schema.js.map +1 -0
  215. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.d.ts.map +1 -1
  216. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.js +4 -0
  217. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.js.map +1 -1
  218. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.d.ts.map +1 -1
  219. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.js +6 -0
  220. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.js.map +1 -1
  221. package/node_modules/@noodle-borg/service/dist/billing/postgres.d.ts.map +1 -1
  222. package/node_modules/@noodle-borg/service/dist/billing/postgres.js +3 -0
  223. package/node_modules/@noodle-borg/service/dist/billing/postgres.js.map +1 -1
  224. package/node_modules/@noodle-borg/service/dist/billing/service-meter-runtime.d.ts +7 -0
  225. package/node_modules/@noodle-borg/service/dist/billing/service-meter-runtime.d.ts.map +1 -0
  226. package/node_modules/@noodle-borg/service/dist/billing/service-meter-runtime.js +19 -0
  227. package/node_modules/@noodle-borg/service/dist/billing/service-meter-runtime.js.map +1 -0
  228. package/node_modules/@noodle-borg/service/dist/billing/shadow-meter.d.ts +9 -4
  229. package/node_modules/@noodle-borg/service/dist/billing/shadow-meter.d.ts.map +1 -1
  230. package/node_modules/@noodle-borg/service/dist/billing/shadow-meter.js +34 -95
  231. package/node_modules/@noodle-borg/service/dist/billing/shadow-meter.js.map +1 -1
  232. package/node_modules/@noodle-borg/service/dist/billing/usage-identity.d.ts +14 -0
  233. package/node_modules/@noodle-borg/service/dist/billing/usage-identity.d.ts.map +1 -0
  234. package/node_modules/@noodle-borg/service/dist/billing/usage-identity.js +87 -0
  235. package/node_modules/@noodle-borg/service/dist/billing/usage-identity.js.map +1 -0
  236. package/node_modules/@noodle-borg/service/dist/billing/usage-observer.d.ts +6 -0
  237. package/node_modules/@noodle-borg/service/dist/billing/usage-observer.d.ts.map +1 -0
  238. package/node_modules/@noodle-borg/service/dist/billing/usage-observer.js +26 -0
  239. package/node_modules/@noodle-borg/service/dist/billing/usage-observer.js.map +1 -0
  240. package/node_modules/@noodle-borg/service/dist/billing-public.d.ts +16 -0
  241. package/node_modules/@noodle-borg/service/dist/billing-public.d.ts.map +1 -0
  242. package/node_modules/@noodle-borg/service/dist/billing-public.js +15 -0
  243. package/node_modules/@noodle-borg/service/dist/billing-public.js.map +1 -0
  244. package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts +1 -0
  245. package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts.map +1 -1
  246. package/node_modules/@noodle-borg/service/dist/customer-verifier.js +15 -0
  247. package/node_modules/@noodle-borg/service/dist/customer-verifier.js.map +1 -1
  248. package/node_modules/@noodle-borg/service/dist/http-util.d.ts +2 -0
  249. package/node_modules/@noodle-borg/service/dist/http-util.d.ts.map +1 -1
  250. package/node_modules/@noodle-borg/service/dist/http-util.js +1 -1
  251. package/node_modules/@noodle-borg/service/dist/http-util.js.map +1 -1
  252. package/node_modules/@noodle-borg/service/dist/index.d.ts +2 -7
  253. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  254. package/node_modules/@noodle-borg/service/dist/index.js +1 -6
  255. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  256. package/node_modules/@noodle-borg/service/dist/main.js +3 -0
  257. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
  258. package/node_modules/@noodle-borg/service/dist/options.d.ts +18 -0
  259. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  260. package/node_modules/@noodle-borg/service/dist/persistence-options.d.ts +4 -0
  261. package/node_modules/@noodle-borg/service/dist/persistence-options.d.ts.map +1 -0
  262. package/node_modules/@noodle-borg/service/dist/persistence-options.js +22 -0
  263. package/node_modules/@noodle-borg/service/dist/persistence-options.js.map +1 -0
  264. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-cohort.d.ts +17 -0
  265. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-cohort.d.ts.map +1 -0
  266. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-cohort.js +145 -0
  267. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-cohort.js.map +1 -0
  268. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-readiness.d.ts +15 -0
  269. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-readiness.d.ts.map +1 -0
  270. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-readiness.js +78 -0
  271. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-readiness.js.map +1 -0
  272. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-validation.d.ts +15 -0
  273. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-validation.d.ts.map +1 -0
  274. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-validation.js +108 -0
  275. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-validation.js.map +1 -0
  276. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.d.ts +6 -0
  277. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.d.ts.map +1 -1
  278. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.js +99 -0
  279. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.js.map +1 -1
  280. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.d.ts +25 -0
  281. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.d.ts.map +1 -0
  282. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.js +35 -0
  283. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.js.map +1 -0
  284. package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts.map +1 -1
  285. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +3 -1
  286. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
  287. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts +93 -0
  288. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts.map +1 -0
  289. package/node_modules/@noodle-borg/service/dist/serve-options.js +2 -0
  290. package/node_modules/@noodle-borg/service/dist/serve-options.js.map +1 -0
  291. package/node_modules/@noodle-borg/service/dist/serve.d.ts +2 -92
  292. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  293. package/node_modules/@noodle-borg/service/dist/serve.js +64 -59
  294. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  295. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts +22 -0
  296. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts.map +1 -0
  297. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +51 -0
  298. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js.map +1 -0
  299. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  300. package/node_modules/@noodle-borg/service/dist/service.js +10 -21
  301. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  302. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.d.ts.map +1 -1
  303. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js +7 -1
  304. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js.map +1 -1
  305. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.d.ts +6 -2
  306. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.d.ts.map +1 -1
  307. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.js +11 -1
  308. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.js.map +1 -1
  309. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ import type { Pool, PoolClient } from 'pg';
2
+ export interface BillingMeterPartitionRange {
3
+ readonly start: string;
4
+ readonly end: string;
5
+ }
6
+ export declare function billingMeterPartitionHorizonExists(database: Pool | PoolClient, checkedAt: Date): Promise<boolean>;
7
+ export declare function parseBillingMeterPartitionRange(bound: string): BillingMeterPartitionRange | undefined;
8
+ //# sourceMappingURL=postgres-meter-partition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-partition.d.ts","sourceRoot":"","sources":["../../src/billing/postgres-meter-partition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAI3C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,kCAAkC,CACtD,QAAQ,EAAE,IAAI,GAAG,UAAU,EAC3B,SAAS,EAAE,IAAI,GACd,OAAO,CAAC,OAAO,CAAC,CA6BlB;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GACZ,0BAA0B,GAAG,SAAS,CAMxC"}
@@ -0,0 +1,42 @@
1
+ import { BILLING_METER_PARTITION_HORIZON_MONTHS } from './meter-readiness.js';
2
+ import { billingMeterPartitionName } from './postgres-meter-schema.js';
3
+ export async function billingMeterPartitionHorizonExists(database, checkedAt) {
4
+ const expected = Array.from({ length: BILLING_METER_PARTITION_HORIZON_MONTHS + 1 }, (_, offset) => {
5
+ const start = new Date(Date.UTC(checkedAt.getUTCFullYear(), checkedAt.getUTCMonth() + offset, 1));
6
+ const end = new Date(Date.UTC(checkedAt.getUTCFullYear(), checkedAt.getUTCMonth() + offset + 1, 1));
7
+ return { name: billingMeterPartitionName(start), start, end };
8
+ });
9
+ const result = await database.query(`SELECT child.relname AS name,
10
+ pg_get_expr(child.relpartbound, child.oid) AS bound
11
+ FROM pg_inherits
12
+ JOIN pg_class AS parent ON parent.oid = pg_inherits.inhparent
13
+ JOIN pg_class AS child ON child.oid = pg_inherits.inhrelid
14
+ WHERE parent.oid = 'billing_meter_usage_events'::regclass
15
+ AND child.relname = ANY($1::text[])
16
+ ORDER BY child.relname`, [expected.map(({ name }) => name)]);
17
+ if (result.rows.length !== expected.length)
18
+ return false;
19
+ const actual = new Map(result.rows.map((row) => [row.name, row.bound]));
20
+ return expected.every(({ name, start, end }) => partitionBoundMatches(actual.get(name), start, end));
21
+ }
22
+ export function parseBillingMeterPartitionRange(bound) {
23
+ const match = /^FOR VALUES FROM \('([^']+)'\) TO \('([^']+)'\)$/.exec(bound);
24
+ if (match === null)
25
+ return undefined;
26
+ const start = normalizeBound(match[1]);
27
+ const end = normalizeBound(match[2]);
28
+ return start === undefined || end === undefined ? undefined : { start, end };
29
+ }
30
+ function normalizeBound(value) {
31
+ if (value === undefined)
32
+ return undefined;
33
+ const parsed = new Date(value);
34
+ return Number.isFinite(parsed.getTime()) ? parsed.toISOString() : undefined;
35
+ }
36
+ function partitionBoundMatches(bound, start, end) {
37
+ if (bound === undefined)
38
+ return false;
39
+ const range = parseBillingMeterPartitionRange(bound);
40
+ return range?.start === start.toISOString() && range.end === end.toISOString();
41
+ }
42
+ //# sourceMappingURL=postgres-meter-partition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-partition.js","sourceRoot":"","sources":["../../src/billing/postgres-meter-partition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { PoolClient } from 'pg';
2
+ /**
3
+ * Checks the immutable storage prerequisites inside the same transaction that
4
+ * prepares a validation epoch. A false result aborts preparation cleanly;
5
+ * database errors are deliberately allowed to roll the transaction back.
6
+ */
7
+ export declare function checkBillingMeterValidationFoundationPreflight(client: PoolClient): Promise<boolean>;
8
+ //# sourceMappingURL=postgres-meter-prepare-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-prepare-preflight.d.ts","sourceRoot":"","sources":["../../src/billing/postgres-meter-prepare-preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAerC;;;;GAIG;AACH,wBAAsB,8CAA8C,CAClE,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,OAAO,CAAC,CAqClB"}
@@ -0,0 +1,44 @@
1
+ import { BILLING_METER_AGGREGATE_RETENTION_MONTHS, BILLING_METER_EXACT_KEY_TOMBSTONE_RETENTION_DAYS, BILLING_METER_RECEIPT_RETENTION_DAYS, } from './meter-readiness.js';
2
+ import { readBillingMeterTransactionTime } from './postgres-meter-clock.js';
3
+ import { billingMeterPartitionHorizonExists } from './postgres-meter-partition.js';
4
+ /**
5
+ * Checks the immutable storage prerequisites inside the same transaction that
6
+ * prepares a validation epoch. A false result aborts preparation cleanly;
7
+ * database errors are deliberately allowed to roll the transaction back.
8
+ */
9
+ export async function checkBillingMeterValidationFoundationPreflight(client) {
10
+ const checkedAt = await readBillingMeterTransactionTime(client);
11
+ const retention = await client.query(`
12
+ SELECT receipt_retention_days, tombstone_retention_days, aggregate_retention_months
13
+ FROM billing_meter_retention_policy
14
+ WHERE singleton = true
15
+ `);
16
+ const policy = retention.rows[0];
17
+ if (retention.rows.length !== 1 ||
18
+ policy?.receipt_retention_days !== BILLING_METER_RECEIPT_RETENTION_DAYS ||
19
+ policy.tombstone_retention_days !== BILLING_METER_EXACT_KEY_TOMBSTONE_RETENTION_DAYS ||
20
+ policy.aggregate_retention_months !== BILLING_METER_AGGREGATE_RETENTION_MONTHS) {
21
+ return false;
22
+ }
23
+ const attribution = await client.query(`
24
+ SELECT count(*)::text AS incomplete
25
+ FROM orgs AS org
26
+ WHERE org.slug <> 'local'
27
+ AND NOT EXISTS (
28
+ SELECT 1
29
+ FROM org_billing_links AS link
30
+ JOIN billing_account_active_snapshots AS active
31
+ ON active.billing_account_id = link.billing_account_id
32
+ JOIN billing_entitlement_snapshots AS snapshot
33
+ ON snapshot.billing_account_id = active.billing_account_id
34
+ AND snapshot.id = active.snapshot_id
35
+ WHERE link.org_slug = org.slug
36
+ AND link.active
37
+ AND snapshot.verification_status = 'verified'
38
+ )
39
+ `);
40
+ if (attribution.rows[0]?.incomplete !== '0')
41
+ return false;
42
+ return billingMeterPartitionHorizonExists(client, new Date(checkedAt));
43
+ }
44
+ //# sourceMappingURL=postgres-meter-prepare-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-prepare-preflight.js","sourceRoot":"","sources":["../../src/billing/postgres-meter-prepare-preflight.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wCAAwC,EACxC,gDAAgD,EAChD,oCAAoC,GACrC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,kCAAkC,EAAE,MAAM,+BAA+B,CAAC;AAQnF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,8CAA8C,CAClE,MAAkB;IAElB,MAAM,SAAS,GAAG,MAAM,+BAA+B,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAqB;;;;GAIxD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,IACE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAC3B,MAAM,EAAE,sBAAsB,KAAK,oCAAoC;QACvE,MAAM,CAAC,wBAAwB,KAAK,gDAAgD;QACpF,MAAM,CAAC,0BAA0B,KAAK,wCAAwC,EAC9E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CAAkC;;;;;;;;;;;;;;;;GAgBvE,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAE1D,OAAO,kCAAkC,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Pool, PoolClient } from 'pg';
2
+ import { type BillingMeterHealthSignal, type BillingMeterLiveRuntimeExpectation, type BillingMeterPreparedEpochHealthIdentity } from './meter-readiness-health.js';
3
+ export interface BillingMeterLiveReadinessSignals {
4
+ readonly validationMirror: BillingMeterHealthSignal;
5
+ readonly writerHealth: BillingMeterHealthSignal;
6
+ readonly schedulerHealth: BillingMeterHealthSignal;
7
+ }
8
+ export declare function readBillingMeterLiveReadinessSignals(database: Pool | PoolClient, input: {
9
+ readonly checkedAt: string;
10
+ readonly epoch: BillingMeterPreparedEpochHealthIdentity;
11
+ readonly expectation: BillingMeterLiveRuntimeExpectation;
12
+ }): Promise<BillingMeterLiveReadinessSignals>;
13
+ //# sourceMappingURL=postgres-meter-readiness-live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-readiness-live.d.ts","sourceRoot":"","sources":["../../src/billing/postgres-meter-readiness-live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EACvC,KAAK,uCAAuC,EAO7C,MAAM,6BAA6B,CAAC;AAGrC,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;IACpD,QAAQ,CAAC,YAAY,EAAE,wBAAwB,CAAC;IAChD,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;CACpD;AAcD,wBAAsB,oCAAoC,CACxD,QAAQ,EAAE,IAAI,GAAG,UAAU,EAC3B,KAAK,EAAE;IACL,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,uCAAuC,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,kCAAkC,CAAC;CAC1D,GACA,OAAO,CAAC,gCAAgC,CAAC,CA8G3C"}
@@ -0,0 +1,189 @@
1
+ import { emptyBillingMeterHealthCounters, evaluateBillingMeterSchedulerHealth, evaluateBillingMeterValidationMirror, evaluateBillingMeterWriterHealth, } from './meter-readiness-health.js';
2
+ import { BILLING_METER_SCHEDULER_CYCLE_TIMEOUT_MS } from './postgres-meter-scheduler.js';
3
+ export async function readBillingMeterLiveReadinessSignals(database, input) {
4
+ const receipt = await database.query(`SELECT max(last_writer_observed_at) AS latest_receipt_at
5
+ FROM billing_meter_windows
6
+ WHERE epoch_id = $1 AND writer_observed_calls > 0`, [input.epoch.id]);
7
+ const sessions = await database.query(`SELECT
8
+ session.session_id, session.release_sha, session.key_generation,
9
+ session.retry_identity_version, session.writer_contract_version,
10
+ session.last_heartbeat_at, session.closed_at, session.clean_stop,
11
+ baseline.report_version AS baseline_report_version,
12
+ baseline.armed_at AS baseline_armed_at,
13
+ session.report_version,
14
+ baseline.observed_calls AS baseline_observed_calls,
15
+ baseline.attempted_writes AS baseline_attempted_writes,
16
+ baseline.recorded_writes AS baseline_recorded_writes,
17
+ baseline.duplicate_writes AS baseline_duplicate_writes,
18
+ baseline.final_failures AS baseline_final_failures,
19
+ baseline.no_epoch_skips AS baseline_no_epoch_skips,
20
+ baseline.circuit_open_skips AS baseline_circuit_open_skips,
21
+ baseline.saturation_skips AS baseline_saturation_skips,
22
+ baseline.derivation_failures AS baseline_derivation_failures,
23
+ baseline.epoch_identity_failures AS baseline_epoch_identity_failures,
24
+ baseline.timeout_unknown_outcomes AS baseline_timeout_unknown_outcomes,
25
+ baseline.in_flight_writes AS baseline_in_flight_writes,
26
+ session.observed_calls, session.attempted_writes, session.recorded_writes,
27
+ session.duplicate_writes, session.final_failures, session.no_epoch_skips,
28
+ session.circuit_open_skips, session.saturation_skips, session.derivation_failures,
29
+ session.epoch_identity_failures, session.timeout_unknown_outcomes,
30
+ session.in_flight_writes
31
+ FROM billing_meter_writer_epoch_baselines AS baseline
32
+ JOIN billing_meter_writer_sessions AS session ON session.session_id = baseline.session_id
33
+ WHERE baseline.epoch_id = $1
34
+ ORDER BY session.session_id`, [input.epoch.id]);
35
+ const unbaselined = await database.query(`SELECT count(*)::text AS count
36
+ FROM billing_meter_writer_sessions AS session
37
+ WHERE (
38
+ session.started_at >= $2 OR
39
+ session.last_heartbeat_at >= $2 OR
40
+ session.closed_at >= $2
41
+ )
42
+ AND NOT EXISTS (
43
+ SELECT 1
44
+ FROM billing_meter_writer_epoch_baselines AS baseline
45
+ WHERE baseline.epoch_id = $1 AND baseline.session_id = session.session_id
46
+ )`, [input.epoch.id, input.epoch.preparedAt]);
47
+ const rollup = await database.query(`SELECT unclean_stop_count,
48
+ observed_calls_delta AS observed_calls,
49
+ attempted_writes_delta AS attempted_writes,
50
+ recorded_writes_delta AS recorded_writes,
51
+ duplicate_writes_delta AS duplicate_writes,
52
+ final_failures_delta AS final_failures,
53
+ no_epoch_skips_delta AS no_epoch_skips,
54
+ circuit_open_skips_delta AS circuit_open_skips,
55
+ saturation_skips_delta AS saturation_skips,
56
+ derivation_failures_delta AS derivation_failures,
57
+ epoch_identity_failures_delta AS epoch_identity_failures,
58
+ timeout_unknown_outcomes_delta AS timeout_unknown_outcomes,
59
+ in_flight_writes
60
+ FROM billing_meter_writer_epoch_rollups
61
+ WHERE epoch_id = $1`, [input.epoch.id]);
62
+ const staleRunning = await database.query(`SELECT count(*)::text AS count
63
+ FROM billing_meter_scheduler_runs
64
+ WHERE status = 'running'
65
+ AND started_at <= $1::timestamptz - ($2::bigint * interval '1 millisecond')`, [input.checkedAt, BILLING_METER_SCHEDULER_CYCLE_TIMEOUT_MS]);
66
+ const scheduler = await database.query(`
67
+ SELECT status, release_sha, contract_version, cpu_always_allocated, started_at,
68
+ completed_at, windows_failed, backlog_detected, maintenance_run_id
69
+ FROM billing_meter_scheduler_runs
70
+ WHERE completed_at IS NOT NULL
71
+ ORDER BY completed_at DESC, run_sequence DESC
72
+ LIMIT 1
73
+ `);
74
+ const latestReceiptAt = optionalInstant(receipt.rows[0]?.latest_receipt_at ?? null);
75
+ const writerSessions = sessions.rows.map(parseWriterSession);
76
+ const compacted = rollup.rows[0];
77
+ const latestScheduler = parseScheduler(scheduler.rows[0]);
78
+ return {
79
+ validationMirror: evaluateBillingMeterValidationMirror({
80
+ ...input,
81
+ latestReceiptAt,
82
+ }),
83
+ writerHealth: evaluateBillingMeterWriterHealth({
84
+ ...input,
85
+ unbaselinedSessionCount: safeCount(unbaselined.rows[0]?.count),
86
+ rollup: compacted === undefined ? emptyBillingMeterHealthCounters() : parseCounters(compacted, ''),
87
+ uncleanRollupStops: compacted === undefined ? 0n : bigintValue(compacted.unclean_stop_count),
88
+ sessions: writerSessions,
89
+ }),
90
+ schedulerHealth: evaluateBillingMeterSchedulerHealth({
91
+ ...input,
92
+ staleRunningCount: safeCount(staleRunning.rows[0]?.count),
93
+ ...(latestScheduler === undefined ? {} : { latestCompleted: latestScheduler }),
94
+ }),
95
+ };
96
+ }
97
+ function parseWriterSession(row) {
98
+ return {
99
+ sessionId: stringValue(row.session_id),
100
+ releaseSha: stringValue(row.release_sha),
101
+ keyGeneration: stringValue(row.key_generation),
102
+ retryIdentityVersion: safeNumber(row.retry_identity_version),
103
+ writerContractVersion: safeNumber(row.writer_contract_version),
104
+ lastHeartbeatAt: requiredInstant(row.last_heartbeat_at),
105
+ closedAt: optionalInstant(row.closed_at),
106
+ cleanStop: booleanValue(row.clean_stop),
107
+ baselineArmedAt: optionalInstant(row.baseline_armed_at),
108
+ baselineReportVersion: bigintValue(row.baseline_report_version),
109
+ reportVersion: bigintValue(row.report_version),
110
+ baseline: parseCounters(row, 'baseline_'),
111
+ current: parseCounters(row, ''),
112
+ };
113
+ }
114
+ function parseCounters(row, prefix) {
115
+ return {
116
+ observedCalls: bigintValue(row[`${prefix}observed_calls`]),
117
+ attemptedWrites: bigintValue(row[`${prefix}attempted_writes`]),
118
+ recordedWrites: bigintValue(row[`${prefix}recorded_writes`]),
119
+ duplicateWrites: bigintValue(row[`${prefix}duplicate_writes`]),
120
+ finalFailures: bigintValue(row[`${prefix}final_failures`]),
121
+ noEpochSkips: bigintValue(row[`${prefix}no_epoch_skips`]),
122
+ circuitOpenSkips: bigintValue(row[`${prefix}circuit_open_skips`]),
123
+ saturationSkips: bigintValue(row[`${prefix}saturation_skips`]),
124
+ derivationFailures: bigintValue(row[`${prefix}derivation_failures`]),
125
+ epochIdentityFailures: bigintValue(row[`${prefix}epoch_identity_failures`]),
126
+ timeoutUnknownOutcomes: bigintValue(row[`${prefix}timeout_unknown_outcomes`]),
127
+ inFlightWrites: bigintValue(row[`${prefix}in_flight_writes`]),
128
+ };
129
+ }
130
+ function parseScheduler(row) {
131
+ if (row === undefined)
132
+ return undefined;
133
+ return {
134
+ status: row.status,
135
+ releaseSha: row.release_sha,
136
+ contractVersion: safeNumber(row.contract_version),
137
+ cpuAlwaysAllocated: row.cpu_always_allocated,
138
+ startedAt: requiredInstant(row.started_at),
139
+ completedAt: requiredInstant(row.completed_at),
140
+ windowsFailed: safeNumber(row.windows_failed),
141
+ backlogDetected: row.backlog_detected,
142
+ maintenanceRunId: row.maintenance_run_id,
143
+ };
144
+ }
145
+ function safeCount(value) {
146
+ const count = Number(value);
147
+ if (!Number.isSafeInteger(count) || count < 0) {
148
+ throw new Error('billing meter health count is invalid');
149
+ }
150
+ return count;
151
+ }
152
+ function safeNumber(value) {
153
+ return safeCount(value);
154
+ }
155
+ function bigintValue(value) {
156
+ if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'bigint') {
157
+ throw new Error('billing meter health counter is invalid');
158
+ }
159
+ const count = BigInt(value);
160
+ if (count < 0n)
161
+ throw new Error('billing meter health counter is invalid');
162
+ return count;
163
+ }
164
+ function stringValue(value) {
165
+ if (typeof value !== 'string' || value.length === 0) {
166
+ throw new Error('billing meter health identity is invalid');
167
+ }
168
+ return value;
169
+ }
170
+ function booleanValue(value) {
171
+ if (typeof value !== 'boolean')
172
+ throw new Error('billing meter health boolean is invalid');
173
+ return value;
174
+ }
175
+ function requiredInstant(value) {
176
+ const instant = optionalInstant(value);
177
+ if (instant === null)
178
+ throw new Error('billing meter health timestamp is invalid');
179
+ return instant;
180
+ }
181
+ function optionalInstant(value) {
182
+ if (value === null || value === undefined)
183
+ return null;
184
+ const date = value instanceof Date ? value : new Date(stringValue(value));
185
+ if (!Number.isFinite(date.getTime()))
186
+ throw new Error('billing meter health timestamp is invalid');
187
+ return date.toISOString();
188
+ }
189
+ //# sourceMappingURL=postgres-meter-readiness-live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-readiness-live.js","sourceRoot":"","sources":["../../src/billing/postgres-meter-readiness-live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Pool } from 'pg';
2
+ import { type BillingMeterReadinessReport, type BillingMeterReadinessStore } from './meter-readiness.js';
3
+ import type { BillingMeterLiveRuntimeExpectation } from './meter-readiness-health.js';
4
+ export { type BillingMeterMaintenanceResult, runBillingMeterMaintenance, } from './postgres-meter-maintenance.js';
5
+ export { type BillingMeterReconciliationResult, reconcileBillingMeterWindow, } from './postgres-meter-reconciliation.js';
6
+ export interface PostgresBillingMeterReadinessStoreOptions {
7
+ /** One-way marker returned by deriveBillingMeterKeyGeneration; never the raw HMAC key. */
8
+ readonly keyGeneration?: string;
9
+ readonly evidenceFreshnessMs?: number;
10
+ /** Present only when the fail-open live validation mirror and scheduler are intentionally enabled. */
11
+ readonly validationRuntime?: BillingMeterLiveRuntimeExpectation;
12
+ }
13
+ export declare class PostgresBillingMeterReadinessStore implements BillingMeterReadinessStore {
14
+ #private;
15
+ constructor(pool: Pool, options?: PostgresBillingMeterReadinessStoreOptions);
16
+ getMeterReadiness(): Promise<BillingMeterReadinessReport>;
17
+ }
18
+ //# sourceMappingURL=postgres-meter-readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-readiness.d.ts","sourceRoot":"","sources":["../../src/billing/postgres-meter-readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,IAAI,CAAC;AAC3C,OAAO,EAQL,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAGhC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,kCAAkC,EAEnC,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EACL,KAAK,6BAA6B,EAClC,0BAA0B,GAC3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,gCAAgC,EACrC,2BAA2B,GAC5B,MAAM,oCAAoC,CAAC;AAE5C,MAAM,WAAW,yCAAyC;IACxD,0FAA0F;IAC1F,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,sGAAsG;IACtG,QAAQ,CAAC,iBAAiB,CAAC,EAAE,kCAAkC,CAAC;CACjE;AA4CD,qBAAa,kCAAmC,YAAW,0BAA0B;;gBAMvE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,yCAA8C;IAUzE,iBAAiB,IAAI,OAAO,CAAC,2BAA2B,CAAC;CAoPhE"}