@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,233 @@
1
+ import { createBillingUsageIdentityDeriver, } from './usage-identity.js';
2
+ const DEFAULT_MAX_WAIT_MS = 250;
3
+ // Production's smallest pool has five connections: reserve one for scheduler work and one generally.
4
+ const DEFAULT_MAX_CONCURRENT_WRITES = 3;
5
+ const DEFAULT_FAILURE_COOLDOWN_MS = 5_000;
6
+ const DEFAULT_SHUTDOWN_DRAIN_MS = 5_000;
7
+ /**
8
+ * Mirror the final hosted tool-dispatch boundary into v1 shadow and the prepared v2 validation epoch.
9
+ * Both sinks are observational: every local, timeout, saturation, or database outcome still allows the
10
+ * connector exactly as before.
11
+ */
12
+ export function createBillingMeterValidationMirror(options) {
13
+ const deriveIdentity = createBillingUsageIdentityDeriver(options.hmacKey);
14
+ const maxWaitMs = boundedInteger('billing validation mirror max wait', options.maxWaitMs ?? DEFAULT_MAX_WAIT_MS, 1, 5_000);
15
+ const maxConcurrentWrites = boundedInteger('billing validation mirror concurrency', options.maxConcurrentWrites ?? DEFAULT_MAX_CONCURRENT_WRITES, 1, 1_024);
16
+ const failureCooldownMs = boundedInteger('billing validation mirror failure cooldown', options.failureCooldownMs ?? DEFAULT_FAILURE_COOLDOWN_MS, 0, 60_000);
17
+ const shutdownDrainMs = boundedInteger('billing validation mirror shutdown drain', options.shutdownDrainMs ?? DEFAULT_SHUTDOWN_DRAIN_MS, 1, 30_000);
18
+ const counters = mutableCounters(options.writer.session);
19
+ const pendingValidations = new Set();
20
+ let circuitOpenUntil = 0;
21
+ let closing = false;
22
+ let validationFenced = false;
23
+ const snapshot = () => ({ ...counters });
24
+ const observe = async (context) => {
25
+ if (closing)
26
+ return;
27
+ if (context.signal.aborted)
28
+ return;
29
+ let identity;
30
+ try {
31
+ identity = deriveIdentity(context);
32
+ }
33
+ catch {
34
+ if (!validationFenced) {
35
+ mutate(counters, () => {
36
+ counters.observedCalls += 1;
37
+ counters.derivationFailures += 1;
38
+ });
39
+ }
40
+ warn(options.logger, context, 'identity_derivation_failed');
41
+ return;
42
+ }
43
+ const waits = [];
44
+ if (options.shadowSink !== undefined) {
45
+ waits.push(invokeShadow(options.shadowSink, context, identity).catch(() => {
46
+ warn(options.logger, context, 'shadow_sink_failed');
47
+ }));
48
+ }
49
+ if (validationFenced) {
50
+ await settleWithin(waits, maxWaitMs);
51
+ return;
52
+ }
53
+ mutate(counters, () => {
54
+ counters.observedCalls += 1;
55
+ });
56
+ let validation;
57
+ if (Date.now() < circuitOpenUntil) {
58
+ mutate(counters, () => {
59
+ counters.circuitOpenSkips += 1;
60
+ });
61
+ }
62
+ else if (counters.inFlightWrites >= maxConcurrentWrites) {
63
+ mutate(counters, () => {
64
+ counters.saturationSkips += 1;
65
+ });
66
+ warn(options.logger, context, 'bulkhead_saturated');
67
+ }
68
+ else {
69
+ mutate(counters, () => {
70
+ counters.attemptedWrites += 1;
71
+ counters.inFlightWrites += 1;
72
+ });
73
+ validation = startValidationWrite(options.writer, context, identity, (outcome) => {
74
+ mutate(counters, () => {
75
+ counters.inFlightWrites -= 1;
76
+ if (outcome === 'recorded')
77
+ counters.recordedWrites += 1;
78
+ else if (outcome === 'duplicate')
79
+ counters.duplicateWrites += 1;
80
+ else if (outcome === 'no_prepared_epoch')
81
+ counters.noEpochSkips += 1;
82
+ else if (outcome === 'identity_mismatch')
83
+ counters.epochIdentityFailures += 1;
84
+ else
85
+ counters.finalFailures += 1;
86
+ });
87
+ if (outcome === 'failed' || outcome === 'identity_mismatch') {
88
+ circuitOpenUntil = Date.now() + failureCooldownMs;
89
+ }
90
+ if (outcome === 'failed')
91
+ warn(options.logger, context, 'validation_write_failed');
92
+ });
93
+ trackPendingValidation(pendingValidations, validation.settled);
94
+ waits.push(validation.settled);
95
+ }
96
+ const completed = await settleWithin(waits, maxWaitMs);
97
+ if (!completed && validation !== undefined && !validation.isSettled()) {
98
+ mutate(counters, () => {
99
+ counters.timeoutUnknownOutcomes += 1;
100
+ });
101
+ circuitOpenUntil = Date.now() + failureCooldownMs;
102
+ warn(options.logger, context, 'validation_write_timed_out');
103
+ }
104
+ };
105
+ const reportHealth = async () => {
106
+ const directive = await options.writer.reportHealth(snapshot());
107
+ if (directive === undefined) {
108
+ // A previous arm may have committed even when its acknowledgement was lost. A later durable
109
+ // report with no arm directive is the writer's confirmation that validation may resume.
110
+ validationFenced = false;
111
+ return;
112
+ }
113
+ validationFenced = true;
114
+ const drained = await settleWithin([...pendingValidations], shutdownDrainMs);
115
+ if (!drained) {
116
+ throw new Error('billing meter epoch arm has unresolved validation writes');
117
+ }
118
+ if (options.writer.armEpoch === undefined) {
119
+ throw new Error('billing meter writer cannot arm a prepared epoch');
120
+ }
121
+ await options.writer.armEpoch(directive.armEpochId, snapshot());
122
+ validationFenced = false;
123
+ };
124
+ return {
125
+ observe,
126
+ snapshot,
127
+ reportHealth,
128
+ close: async () => {
129
+ closing = true;
130
+ validationFenced = true;
131
+ const drained = await settleWithin([...pendingValidations], shutdownDrainMs);
132
+ if (!drained) {
133
+ await settleWithin([
134
+ options.writer.reportHealth(snapshot()).then(() => undefined, () => undefined),
135
+ ], maxWaitMs);
136
+ throw new Error('billing meter shutdown has unresolved validation writes');
137
+ }
138
+ await options.writer.close(snapshot());
139
+ },
140
+ };
141
+ }
142
+ function trackPendingValidation(pending, operation) {
143
+ pending.add(operation);
144
+ void operation.finally(() => pending.delete(operation));
145
+ }
146
+ function startValidationWrite(writer, context, identity, onSettled) {
147
+ let done = false;
148
+ let operation;
149
+ try {
150
+ operation = writer.record({
151
+ classification: 'included',
152
+ org: context.org,
153
+ app: context.app,
154
+ environment: context.environment,
155
+ deploymentId: context.deploymentId,
156
+ identity,
157
+ });
158
+ }
159
+ catch {
160
+ operation = Promise.reject(new Error('billing validation writer failed synchronously'));
161
+ }
162
+ const settled = operation.then((result) => {
163
+ done = true;
164
+ onSettled(result.outcome);
165
+ }, () => {
166
+ done = true;
167
+ onSettled('failed');
168
+ });
169
+ return { settled, isSettled: () => done };
170
+ }
171
+ async function invokeShadow(sink, context, identity) {
172
+ await sink(context, identity);
173
+ }
174
+ async function settleWithin(waits, timeoutMs) {
175
+ if (waits.length === 0)
176
+ return true;
177
+ let timer;
178
+ try {
179
+ return await Promise.race([
180
+ Promise.allSettled(waits).then(() => true),
181
+ new Promise((resolve) => {
182
+ timer = setTimeout(() => resolve(false), timeoutMs);
183
+ }),
184
+ ]);
185
+ }
186
+ finally {
187
+ if (timer !== undefined)
188
+ clearTimeout(timer);
189
+ }
190
+ }
191
+ function mutableCounters(session) {
192
+ return {
193
+ ...session,
194
+ reportVersion: 0,
195
+ observedCalls: 0,
196
+ attemptedWrites: 0,
197
+ recordedWrites: 0,
198
+ duplicateWrites: 0,
199
+ finalFailures: 0,
200
+ noEpochSkips: 0,
201
+ circuitOpenSkips: 0,
202
+ saturationSkips: 0,
203
+ derivationFailures: 0,
204
+ epochIdentityFailures: 0,
205
+ timeoutUnknownOutcomes: 0,
206
+ inFlightWrites: 0,
207
+ };
208
+ }
209
+ function mutate(counters, operation) {
210
+ operation();
211
+ counters.reportVersion += 1;
212
+ }
213
+ function warn(logger, context, failure) {
214
+ try {
215
+ logger.warn('billing.meter.validation_mirror_failed', {
216
+ org: context.org,
217
+ app: context.app,
218
+ env: context.environment,
219
+ deploymentId: context.deploymentId,
220
+ failure,
221
+ });
222
+ }
223
+ catch {
224
+ // Validation diagnostics must never become an admission dependency.
225
+ }
226
+ }
227
+ function boundedInteger(name, value, minimum, maximum) {
228
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {
229
+ throw new Error(`${name} must be between ${minimum} and ${maximum}`);
230
+ }
231
+ return value;
232
+ }
233
+ //# sourceMappingURL=meter-live-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-live-validation.js","sourceRoot":"","sources":["../../src/billing/meter-live-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import type { BillingMeterReadinessCheckState } from './meter-readiness.js';
2
+ export declare const BILLING_METER_WRITER_HEARTBEAT_INTERVAL_MS = 30000;
3
+ export declare const BILLING_METER_WRITER_FRESHNESS_MS: number;
4
+ export declare const BILLING_METER_SCHEDULER_FRESHNESS_MS: number;
5
+ export interface BillingMeterHealthSignal {
6
+ readonly state: BillingMeterReadinessCheckState;
7
+ readonly checkedAt: string;
8
+ }
9
+ export interface BillingMeterPreparedEpochHealthIdentity {
10
+ readonly id: string;
11
+ readonly preparedAt: string;
12
+ readonly releaseSha: string;
13
+ readonly keyGeneration: string;
14
+ readonly retryIdentityVersion: number;
15
+ readonly writerContractVersion: number;
16
+ }
17
+ export interface BillingMeterLiveRuntimeExpectation {
18
+ readonly releaseSha: string;
19
+ readonly keyGeneration: string;
20
+ readonly retryIdentityVersion: number;
21
+ readonly writerContractVersion: number;
22
+ readonly schedulerContractVersion: number;
23
+ readonly writerFreshnessMs?: number;
24
+ readonly schedulerFreshnessMs?: number;
25
+ }
26
+ export interface BillingMeterHealthCounters {
27
+ readonly observedCalls: bigint;
28
+ readonly attemptedWrites: bigint;
29
+ readonly recordedWrites: bigint;
30
+ readonly duplicateWrites: bigint;
31
+ readonly finalFailures: bigint;
32
+ readonly noEpochSkips: bigint;
33
+ readonly circuitOpenSkips: bigint;
34
+ readonly saturationSkips: bigint;
35
+ readonly derivationFailures: bigint;
36
+ readonly epochIdentityFailures: bigint;
37
+ readonly timeoutUnknownOutcomes: bigint;
38
+ readonly inFlightWrites: bigint;
39
+ }
40
+ export interface BillingMeterWriterSessionHealthEvidence {
41
+ readonly sessionId: string;
42
+ readonly releaseSha: string;
43
+ readonly keyGeneration: string;
44
+ readonly retryIdentityVersion: number;
45
+ readonly writerContractVersion: number;
46
+ readonly lastHeartbeatAt: string;
47
+ readonly closedAt: string | null;
48
+ readonly cleanStop: boolean;
49
+ readonly baselineArmedAt: string | null;
50
+ readonly baselineReportVersion: bigint;
51
+ readonly reportVersion: bigint;
52
+ readonly baseline: BillingMeterHealthCounters;
53
+ readonly current: BillingMeterHealthCounters;
54
+ }
55
+ export interface BillingMeterSchedulerCompletedEvidence {
56
+ readonly status: 'succeeded' | 'failed' | 'backlogged';
57
+ readonly releaseSha: string;
58
+ readonly contractVersion: number;
59
+ readonly cpuAlwaysAllocated: boolean;
60
+ readonly startedAt: string;
61
+ readonly completedAt: string;
62
+ readonly windowsFailed: number;
63
+ readonly backlogDetected: boolean;
64
+ readonly maintenanceRunId: string | null;
65
+ }
66
+ export declare function emptyBillingMeterHealthCounters(): BillingMeterHealthCounters;
67
+ export declare function evaluateBillingMeterValidationMirror(input: {
68
+ readonly checkedAt: string;
69
+ readonly epoch: BillingMeterPreparedEpochHealthIdentity;
70
+ readonly expectation: BillingMeterLiveRuntimeExpectation;
71
+ readonly latestReceiptAt: string | null;
72
+ }): BillingMeterHealthSignal;
73
+ export declare function evaluateBillingMeterWriterHealth(input: {
74
+ readonly checkedAt: string;
75
+ readonly epoch: BillingMeterPreparedEpochHealthIdentity;
76
+ readonly expectation: BillingMeterLiveRuntimeExpectation;
77
+ readonly unbaselinedSessionCount: number;
78
+ readonly rollup: BillingMeterHealthCounters;
79
+ readonly uncleanRollupStops: bigint;
80
+ readonly sessions: readonly BillingMeterWriterSessionHealthEvidence[];
81
+ }): BillingMeterHealthSignal;
82
+ export declare function evaluateBillingMeterSchedulerHealth(input: {
83
+ readonly checkedAt: string;
84
+ readonly epoch: BillingMeterPreparedEpochHealthIdentity;
85
+ readonly expectation: BillingMeterLiveRuntimeExpectation;
86
+ readonly staleRunningCount: number;
87
+ readonly latestCompleted?: BillingMeterSchedulerCompletedEvidence;
88
+ }): BillingMeterHealthSignal;
89
+ //# sourceMappingURL=meter-readiness-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-readiness-health.d.ts","sourceRoot":"","sources":["../../src/billing/meter-readiness-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ export const BILLING_METER_WRITER_HEARTBEAT_INTERVAL_MS = 30_000;
2
+ export const BILLING_METER_WRITER_FRESHNESS_MS = 2 * 60_000;
3
+ export const BILLING_METER_SCHEDULER_FRESHNESS_MS = 15 * 60_000;
4
+ export function emptyBillingMeterHealthCounters() {
5
+ return {
6
+ observedCalls: 0n,
7
+ attemptedWrites: 0n,
8
+ recordedWrites: 0n,
9
+ duplicateWrites: 0n,
10
+ finalFailures: 0n,
11
+ noEpochSkips: 0n,
12
+ circuitOpenSkips: 0n,
13
+ saturationSkips: 0n,
14
+ derivationFailures: 0n,
15
+ epochIdentityFailures: 0n,
16
+ timeoutUnknownOutcomes: 0n,
17
+ inFlightWrites: 0n,
18
+ };
19
+ }
20
+ export function evaluateBillingMeterValidationMirror(input) {
21
+ const checkedAt = validInstant(input.checkedAt);
22
+ if (!identityMatches(input.epoch, input.expectation)) {
23
+ return { state: 'fail', checkedAt };
24
+ }
25
+ if (input.latestReceiptAt === null)
26
+ return { state: 'unknown', checkedAt };
27
+ const receiptAt = validInstant(input.latestReceiptAt);
28
+ if (Date.parse(receiptAt) < Date.parse(validInstant(input.epoch.preparedAt)) ||
29
+ Date.parse(receiptAt) > Date.parse(checkedAt)) {
30
+ return { state: 'fail', checkedAt: receiptAt };
31
+ }
32
+ return { state: 'pass', checkedAt: receiptAt };
33
+ }
34
+ export function evaluateBillingMeterWriterHealth(input) {
35
+ const checkedAt = validInstant(input.checkedAt);
36
+ if (!identityMatches(input.epoch, input.expectation) ||
37
+ !Number.isSafeInteger(input.unbaselinedSessionCount) ||
38
+ input.unbaselinedSessionCount > 0 ||
39
+ input.uncleanRollupStops > 0n) {
40
+ return { state: 'fail', checkedAt };
41
+ }
42
+ const freshnessMs = positiveDuration(input.expectation.writerFreshnessMs ?? BILLING_METER_WRITER_FRESHNESS_MS);
43
+ let aggregate = input.rollup;
44
+ let oldestHeartbeat = checkedAt;
45
+ let awaitingWriterArm = false;
46
+ for (const session of input.sessions) {
47
+ const heartbeatAt = validInstant(session.lastHeartbeatAt);
48
+ if (Date.parse(heartbeatAt) < Date.parse(oldestHeartbeat))
49
+ oldestHeartbeat = heartbeatAt;
50
+ if (!identityMatches(session, input.expectation)) {
51
+ return { state: 'fail', checkedAt: heartbeatAt };
52
+ }
53
+ if (session.baselineArmedAt === null) {
54
+ if (session.closedAt !== null) {
55
+ return { state: 'fail', checkedAt: validInstant(session.closedAt) };
56
+ }
57
+ awaitingWriterArm = true;
58
+ continue;
59
+ }
60
+ validInstant(session.baselineArmedAt);
61
+ if (session.closedAt === null) {
62
+ const age = Date.parse(checkedAt) - Date.parse(heartbeatAt);
63
+ if (age < 0 || age > freshnessMs)
64
+ return { state: 'fail', checkedAt: heartbeatAt };
65
+ }
66
+ else if (!session.cleanStop || session.current.inFlightWrites !== 0n) {
67
+ return { state: 'fail', checkedAt: validInstant(session.closedAt) };
68
+ }
69
+ if (session.reportVersion < session.baselineReportVersion) {
70
+ return { state: 'fail', checkedAt: heartbeatAt };
71
+ }
72
+ const delta = subtractCounters(session.current, session.baseline);
73
+ if (delta === undefined)
74
+ return { state: 'fail', checkedAt: heartbeatAt };
75
+ aggregate = addCounters(aggregate, delta);
76
+ }
77
+ if (awaitingWriterArm)
78
+ return { state: 'unknown', checkedAt: oldestHeartbeat };
79
+ if (!counterEquationsHold(aggregate) || hasPoisonedWriterEvidence(aggregate)) {
80
+ return { state: 'fail', checkedAt: oldestHeartbeat };
81
+ }
82
+ if (aggregate.inFlightWrites !== 0n) {
83
+ return { state: 'unknown', checkedAt: oldestHeartbeat };
84
+ }
85
+ if (aggregate.recordedWrites + aggregate.duplicateWrites === 0n) {
86
+ return { state: 'unknown', checkedAt: oldestHeartbeat };
87
+ }
88
+ return { state: 'pass', checkedAt: oldestHeartbeat };
89
+ }
90
+ export function evaluateBillingMeterSchedulerHealth(input) {
91
+ const checkedAt = validInstant(input.checkedAt);
92
+ if (!identityMatches(input.epoch, input.expectation) ||
93
+ !Number.isSafeInteger(input.staleRunningCount) ||
94
+ input.staleRunningCount < 0 ||
95
+ input.staleRunningCount > 0) {
96
+ return { state: 'fail', checkedAt };
97
+ }
98
+ const run = input.latestCompleted;
99
+ if (run === undefined)
100
+ return { state: 'unknown', checkedAt };
101
+ const completedAt = validInstant(run.completedAt);
102
+ const age = Date.parse(checkedAt) - Date.parse(completedAt);
103
+ const freshnessMs = positiveDuration(input.expectation.schedulerFreshnessMs ?? BILLING_METER_SCHEDULER_FRESHNESS_MS);
104
+ if (age < 0 ||
105
+ age > freshnessMs ||
106
+ Date.parse(completedAt) < Date.parse(input.epoch.preparedAt)) {
107
+ return { state: 'unknown', checkedAt: completedAt };
108
+ }
109
+ if (run.status !== 'succeeded' ||
110
+ run.releaseSha !== input.expectation.releaseSha ||
111
+ run.contractVersion !== input.expectation.schedulerContractVersion ||
112
+ !run.cpuAlwaysAllocated ||
113
+ run.windowsFailed !== 0 ||
114
+ run.backlogDetected ||
115
+ run.maintenanceRunId === null) {
116
+ return { state: 'fail', checkedAt: completedAt };
117
+ }
118
+ return { state: 'pass', checkedAt: completedAt };
119
+ }
120
+ const COUNTER_KEYS = [
121
+ 'observedCalls',
122
+ 'attemptedWrites',
123
+ 'recordedWrites',
124
+ 'duplicateWrites',
125
+ 'finalFailures',
126
+ 'noEpochSkips',
127
+ 'circuitOpenSkips',
128
+ 'saturationSkips',
129
+ 'derivationFailures',
130
+ 'epochIdentityFailures',
131
+ 'timeoutUnknownOutcomes',
132
+ 'inFlightWrites',
133
+ ];
134
+ function subtractCounters(current, baseline) {
135
+ const result = {};
136
+ for (const key of COUNTER_KEYS) {
137
+ const delta = current[key] - baseline[key];
138
+ if (delta < 0n)
139
+ return undefined;
140
+ result[key] = delta;
141
+ }
142
+ return result;
143
+ }
144
+ function addCounters(left, right) {
145
+ const result = {};
146
+ for (const key of COUNTER_KEYS)
147
+ result[key] = left[key] + right[key];
148
+ return result;
149
+ }
150
+ function counterEquationsHold(counters) {
151
+ return (counters.observedCalls ===
152
+ counters.attemptedWrites +
153
+ counters.circuitOpenSkips +
154
+ counters.saturationSkips +
155
+ counters.derivationFailures &&
156
+ counters.attemptedWrites ===
157
+ counters.recordedWrites +
158
+ counters.duplicateWrites +
159
+ counters.finalFailures +
160
+ counters.noEpochSkips +
161
+ counters.epochIdentityFailures +
162
+ counters.inFlightWrites);
163
+ }
164
+ function hasPoisonedWriterEvidence(counters) {
165
+ return (counters.finalFailures > 0n ||
166
+ counters.noEpochSkips > 0n ||
167
+ counters.circuitOpenSkips > 0n ||
168
+ counters.saturationSkips > 0n ||
169
+ counters.derivationFailures > 0n ||
170
+ counters.epochIdentityFailures > 0n ||
171
+ counters.timeoutUnknownOutcomes > 0n);
172
+ }
173
+ function identityMatches(identity, expectation) {
174
+ return (identity.releaseSha === expectation.releaseSha &&
175
+ identity.keyGeneration === expectation.keyGeneration &&
176
+ identity.retryIdentityVersion === expectation.retryIdentityVersion &&
177
+ identity.writerContractVersion === expectation.writerContractVersion);
178
+ }
179
+ function positiveDuration(value) {
180
+ if (!Number.isSafeInteger(value) || value < 1) {
181
+ throw new Error('billing meter health freshness must be a positive integer');
182
+ }
183
+ return value;
184
+ }
185
+ function validInstant(value) {
186
+ const instant = new Date(value);
187
+ if (!Number.isFinite(instant.getTime()))
188
+ throw new Error('billing meter health timestamp is invalid');
189
+ return instant.toISOString();
190
+ }
191
+ //# sourceMappingURL=meter-readiness-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-readiness-health.js","sourceRoot":"","sources":["../../src/billing/meter-readiness-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import { z } from 'zod';
2
+ export declare const BILLING_METER_READINESS_SCHEMA_VERSION: 1;
3
+ export declare const BILLING_METER_RECEIPT_RETENTION_DAYS: 7;
4
+ export declare const BILLING_METER_EXACT_KEY_TOMBSTONE_RETENTION_DAYS: 30;
5
+ export declare const BILLING_METER_AGGREGATE_RETENTION_MONTHS: 25;
6
+ export declare const BILLING_METER_PARTITION_HORIZON_MONTHS: 2;
7
+ export declare const BILLING_METER_EVIDENCE_FRESHNESS_MS: number;
8
+ export declare const BILLING_METER_RETRY_IDENTITY_VERSION: 1;
9
+ export declare const BILLING_METER_READINESS_CHECK_CODES: readonly ["durable_postgres", "billing_attribution_complete", "legacy_platform_quota_retired", "key_generation_consistent", "prepared_meter_epoch", "partition_horizon", "receipt_retention", "exact_key_tombstones", "aggregate_reconciliation", "validation_mirror", "writer_health", "scheduler_health"];
10
+ export declare const BILLING_METER_LATER_CUTOVER_GATES: readonly ["traffic_fleet_convergence_proof", "plan_volume_capacity_proof", "nonproduction_fail_closed_drill", "grant_expiry_contract", "authoritative_activation", "protected_production_approval"];
11
+ declare const BillingMeterReadinessCheckSchema: z.ZodObject<{
12
+ code: z.ZodEnum<{
13
+ durable_postgres: "durable_postgres";
14
+ billing_attribution_complete: "billing_attribution_complete";
15
+ legacy_platform_quota_retired: "legacy_platform_quota_retired";
16
+ key_generation_consistent: "key_generation_consistent";
17
+ prepared_meter_epoch: "prepared_meter_epoch";
18
+ partition_horizon: "partition_horizon";
19
+ receipt_retention: "receipt_retention";
20
+ exact_key_tombstones: "exact_key_tombstones";
21
+ aggregate_reconciliation: "aggregate_reconciliation";
22
+ validation_mirror: "validation_mirror";
23
+ writer_health: "writer_health";
24
+ scheduler_health: "scheduler_health";
25
+ }>;
26
+ state: z.ZodEnum<{
27
+ unknown: "unknown";
28
+ pass: "pass";
29
+ fail: "fail";
30
+ }>;
31
+ checkedAt: z.ZodOptional<z.ZodPipe<z.ZodISODateTime, z.ZodTransform<string, string>>>;
32
+ }, z.core.$strict>;
33
+ export declare const BillingMeterReadinessReportSchema: z.ZodObject<{
34
+ schemaVersion: z.ZodLiteral<1>;
35
+ checkedAt: z.ZodPipe<z.ZodISODateTime, z.ZodTransform<string, string>>;
36
+ technicalReadiness: z.ZodEnum<{
37
+ unavailable: "unavailable";
38
+ ready: "ready";
39
+ blocked: "blocked";
40
+ }>;
41
+ metering: z.ZodUnion<readonly [z.ZodObject<{
42
+ mode: z.ZodLiteral<"not_started">;
43
+ coverage: z.ZodNull;
44
+ }, z.core.$strict>, z.ZodObject<{
45
+ mode: z.ZodLiteral<"shadow">;
46
+ coverage: z.ZodLiteral<"partial">;
47
+ }, z.core.$strict>]>;
48
+ enforcement: z.ZodObject<{
49
+ state: z.ZodLiteral<"legacy_unchanged">;
50
+ }, z.core.$strict>;
51
+ activation: z.ZodObject<{
52
+ state: z.ZodLiteral<"not_available">;
53
+ }, z.core.$strict>;
54
+ checks: z.ZodArray<z.ZodObject<{
55
+ code: z.ZodEnum<{
56
+ durable_postgres: "durable_postgres";
57
+ billing_attribution_complete: "billing_attribution_complete";
58
+ legacy_platform_quota_retired: "legacy_platform_quota_retired";
59
+ key_generation_consistent: "key_generation_consistent";
60
+ prepared_meter_epoch: "prepared_meter_epoch";
61
+ partition_horizon: "partition_horizon";
62
+ receipt_retention: "receipt_retention";
63
+ exact_key_tombstones: "exact_key_tombstones";
64
+ aggregate_reconciliation: "aggregate_reconciliation";
65
+ validation_mirror: "validation_mirror";
66
+ writer_health: "writer_health";
67
+ scheduler_health: "scheduler_health";
68
+ }>;
69
+ state: z.ZodEnum<{
70
+ unknown: "unknown";
71
+ pass: "pass";
72
+ fail: "fail";
73
+ }>;
74
+ checkedAt: z.ZodOptional<z.ZodPipe<z.ZodISODateTime, z.ZodTransform<string, string>>>;
75
+ }, z.core.$strict>>;
76
+ laterCutoverGates: z.ZodTuple<[z.ZodLiteral<"traffic_fleet_convergence_proof">, z.ZodLiteral<"plan_volume_capacity_proof">, z.ZodLiteral<"nonproduction_fail_closed_drill">, z.ZodLiteral<"grant_expiry_contract">, z.ZodLiteral<"authoritative_activation">, z.ZodLiteral<"protected_production_approval">], null>;
77
+ }, z.core.$strict>;
78
+ export type BillingMeterReadinessCheckCode = (typeof BILLING_METER_READINESS_CHECK_CODES)[number];
79
+ export type BillingMeterReadinessCheckState = z.infer<typeof BillingMeterReadinessCheckSchema>['state'];
80
+ export type BillingMeterLaterCutoverGate = (typeof BILLING_METER_LATER_CUTOVER_GATES)[number];
81
+ export type BillingMeterReadinessCheck = z.infer<typeof BillingMeterReadinessCheckSchema>;
82
+ export type BillingMeterReadinessReport = z.infer<typeof BillingMeterReadinessReportSchema>;
83
+ export interface BillingMeterReadinessStore {
84
+ getMeterReadiness(): Promise<BillingMeterReadinessReport>;
85
+ }
86
+ type ReadinessCheckSignals = Readonly<Record<BillingMeterReadinessCheckCode, {
87
+ readonly state: BillingMeterReadinessCheckState;
88
+ readonly checkedAt?: string;
89
+ }>>;
90
+ export declare function buildBillingMeterReadinessReport(input: {
91
+ readonly checkedAt: string;
92
+ readonly metering: BillingMeterReadinessReport['metering'];
93
+ readonly checks: ReadinessCheckSignals;
94
+ }): BillingMeterReadinessReport;
95
+ export declare function unavailableBillingMeterReadinessReport(checkedAt: string): BillingMeterReadinessReport;
96
+ /** A one-way generation marker; the HMAC key itself is never persisted or returned. */
97
+ export declare function deriveBillingMeterKeyGeneration(hmacKey: string): string;
98
+ export {};
99
+ //# sourceMappingURL=meter-readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-readiness.d.ts","sourceRoot":"","sources":["../../src/billing/meter-readiness.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,sCAAsC,EAAG,CAAU,CAAC;AACjE,eAAO,MAAM,oCAAoC,EAAG,CAAU,CAAC;AAC/D,eAAO,MAAM,gDAAgD,EAAG,EAAW,CAAC;AAC5E,eAAO,MAAM,wCAAwC,EAAG,EAAW,CAAC;AACpE,eAAO,MAAM,sCAAsC,EAAG,CAAU,CAAC;AACjE,eAAO,MAAM,mCAAmC,QAAuB,CAAC;AACxE,eAAO,MAAM,oCAAoC,EAAG,CAAU,CAAC;AAE/D,eAAO,MAAM,mCAAmC,6SAatC,CAAC;AAEX,eAAO,MAAM,iCAAiC,qMAOpC,CAAC;AAKX,QAAA,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;kBAIpC,CAAC;AAgBH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8B1C,CAAC;AAEL,MAAM,MAAM,8BAA8B,GAAG,CAAC,OAAO,mCAAmC,CAAC,CAAC,MAAM,CAAC,CAAC;AAClG,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CACnD,OAAO,gCAAgC,CACxC,CAAC,OAAO,CAAC,CAAC;AACX,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,iCAAiC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9F,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAC1F,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAE5F,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,IAAI,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAC3D;AAED,KAAK,qBAAqB,GAAG,QAAQ,CACnC,MAAM,CACJ,8BAA8B,EAC9B;IAAE,QAAQ,CAAC,KAAK,EAAE,+BAA+B,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CACjF,CACF,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAC;IAC3D,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;CACxC,GAAG,2BAA2B,CAiC9B;AAED,wBAAgB,sCAAsC,CACpD,SAAS,EAAE,MAAM,GAChB,2BAA2B,CAY7B;AAED,uFAAuF;AACvF,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKvE"}