@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,77 @@
1
+ export declare const BILLING_METER_CAPACITY_TARGET: {
2
+ readonly minimumThroughputPerSecond: 400;
3
+ readonly maximumP95Ms: 100;
4
+ readonly maximumP99Ms: 250;
5
+ };
6
+ export declare const BILLING_METER_PLAN_MONTHLY_CALLS: {
7
+ readonly pro: 10000000;
8
+ readonly scale: 100000000;
9
+ };
10
+ export type BillingMeterCapacityScenarioName = 'hot_account' | 'multi_account';
11
+ export interface BillingMeterCapacityScenarioResult {
12
+ readonly name: BillingMeterCapacityScenarioName;
13
+ readonly attempted: number;
14
+ readonly recorded: number;
15
+ readonly duplicates: number;
16
+ readonly durationMs: number;
17
+ readonly throughputPerSecond: number;
18
+ readonly p95Ms: number;
19
+ readonly p99Ms: number;
20
+ readonly consistent: boolean;
21
+ }
22
+ export interface BillingMeterCapacityEvaluation {
23
+ readonly passed: boolean;
24
+ readonly failures: readonly string[];
25
+ }
26
+ export interface BillingMeterRelationStorage {
27
+ readonly tableBytes: number;
28
+ readonly indexBytes: number;
29
+ }
30
+ export interface BillingMeterStorageSample {
31
+ readonly receipts: BillingMeterRelationStorage;
32
+ readonly exactKeyTombstones: BillingMeterRelationStorage;
33
+ readonly accountWindows: BillingMeterRelationStorage;
34
+ readonly orgWindows: BillingMeterRelationStorage;
35
+ readonly meterWindows: BillingMeterRelationStorage;
36
+ }
37
+ interface BillingMeterRelationStorageWithTotal extends BillingMeterRelationStorage {
38
+ readonly totalBytes: number;
39
+ }
40
+ export interface BillingMeterRetainedStorageProjection {
41
+ readonly plan: keyof typeof BILLING_METER_PLAN_MONTHLY_CALLS;
42
+ readonly monthlyCalls: number;
43
+ readonly peakRetainedReceiptRows: number;
44
+ readonly peakRetainedExactKeyTombstoneRows: number;
45
+ readonly receipts: BillingMeterRelationStorageWithTotal;
46
+ readonly exactKeyTombstones: BillingMeterRelationStorageWithTotal;
47
+ readonly combinedBytes: number;
48
+ }
49
+ export interface BillingMeterStorageEvidence {
50
+ readonly sampleRecordedEvents: number;
51
+ readonly measurementBasis: 'allocated_growth';
52
+ readonly receiptRetentionDays: number;
53
+ readonly exactKeyTombstoneRetentionDays: number;
54
+ readonly measuredBytesPerRecordedEvent: BillingMeterStorageSample & {
55
+ readonly allMeasuredRelations: BillingMeterRelationStorageWithTotal;
56
+ };
57
+ readonly projections: readonly BillingMeterRetainedStorageProjection[];
58
+ readonly topologyApproval: {
59
+ readonly state: 'manual_review_required';
60
+ readonly checkpointContention: 'one_row_per_epoch_window';
61
+ readonly reason: string;
62
+ };
63
+ }
64
+ /** Evaluate safe aggregate harness evidence; never lowers a failed target automatically. */
65
+ export declare function evaluateBillingMeterCapacity(results: readonly BillingMeterCapacityScenarioResult[]): BillingMeterCapacityEvaluation;
66
+ /** Round raw benchmark measurements only when constructing retained human-readable evidence. */
67
+ export declare function presentBillingMeterCapacityScenario(result: BillingMeterCapacityScenarioResult): BillingMeterCapacityScenarioResult;
68
+ /**
69
+ * Build conservative allocated-storage projections from safe aggregate relation sizes. The projection
70
+ * intentionally does not approve a database tier or topology: WAL, replicas, backups, vacuum headroom,
71
+ * burst shape, and operational contention require a human review of the measured environment.
72
+ */
73
+ export declare function buildBillingMeterStorageEvidence(sample: BillingMeterStorageSample, recordedEvents: number): BillingMeterStorageEvidence;
74
+ /** Nearest-rank percentile for positive, finite latency samples. */
75
+ export declare function billingMeterPercentile(samples: readonly number[], percentile: number): number;
76
+ export {};
77
+ //# sourceMappingURL=meter-capacity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-capacity.d.ts","sourceRoot":"","sources":["../../src/billing/meter-capacity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ import { BILLING_METER_EXACT_KEY_TOMBSTONE_RETENTION_DAYS, BILLING_METER_RECEIPT_RETENTION_DAYS, } from './meter-readiness.js';
2
+ export const BILLING_METER_CAPACITY_TARGET = {
3
+ minimumThroughputPerSecond: 400,
4
+ maximumP95Ms: 100,
5
+ maximumP99Ms: 250,
6
+ };
7
+ export const BILLING_METER_PLAN_MONTHLY_CALLS = {
8
+ pro: 10_000_000,
9
+ scale: 100_000_000,
10
+ };
11
+ const BILLING_METER_PEAK_RETAINED_COHORTS = {
12
+ receipts: 2,
13
+ exactKeyTombstones: 3,
14
+ };
15
+ const SCENARIOS = ['hot_account', 'multi_account'];
16
+ /** Evaluate safe aggregate harness evidence; never lowers a failed target automatically. */
17
+ export function evaluateBillingMeterCapacity(results) {
18
+ const failures = [];
19
+ for (const name of SCENARIOS) {
20
+ const matches = results.filter((result) => result.name === name);
21
+ if (matches.length === 0) {
22
+ failures.push(`${name}:missing`);
23
+ continue;
24
+ }
25
+ if (matches.length > 1) {
26
+ failures.push(`${name}:duplicate_result`);
27
+ continue;
28
+ }
29
+ const result = matches[0];
30
+ if (result === undefined)
31
+ continue;
32
+ validateScenario(result);
33
+ if (result.throughputPerSecond < BILLING_METER_CAPACITY_TARGET.minimumThroughputPerSecond) {
34
+ failures.push(`${name}:throughput_below_target`);
35
+ }
36
+ if (result.p95Ms > BILLING_METER_CAPACITY_TARGET.maximumP95Ms) {
37
+ failures.push(`${name}:p95_above_target`);
38
+ }
39
+ if (result.p99Ms > BILLING_METER_CAPACITY_TARGET.maximumP99Ms) {
40
+ failures.push(`${name}:p99_above_target`);
41
+ }
42
+ if (!result.consistent || result.recorded !== result.attempted || result.duplicates !== 0) {
43
+ failures.push(`${name}:counter_drift`);
44
+ }
45
+ }
46
+ return { passed: failures.length === 0, failures };
47
+ }
48
+ /** Round raw benchmark measurements only when constructing retained human-readable evidence. */
49
+ export function presentBillingMeterCapacityScenario(result) {
50
+ validateScenario(result);
51
+ return {
52
+ ...result,
53
+ durationMs: roundForPresentation(result.durationMs),
54
+ throughputPerSecond: roundForPresentation(result.throughputPerSecond),
55
+ p95Ms: roundForPresentation(result.p95Ms),
56
+ p99Ms: roundForPresentation(result.p99Ms),
57
+ };
58
+ }
59
+ /**
60
+ * Build conservative allocated-storage projections from safe aggregate relation sizes. The projection
61
+ * intentionally does not approve a database tier or topology: WAL, replicas, backups, vacuum headroom,
62
+ * burst shape, and operational contention require a human review of the measured environment.
63
+ */
64
+ export function buildBillingMeterStorageEvidence(sample, recordedEvents) {
65
+ if (!Number.isSafeInteger(recordedEvents) || recordedEvents <= 0) {
66
+ throw new Error('billing meter storage sample requires a positive safe integer event count');
67
+ }
68
+ const measured = {
69
+ receipts: bytesPerEvent(sample.receipts, recordedEvents),
70
+ exactKeyTombstones: bytesPerEvent(sample.exactKeyTombstones, recordedEvents),
71
+ accountWindows: bytesPerEvent(sample.accountWindows, recordedEvents),
72
+ orgWindows: bytesPerEvent(sample.orgWindows, recordedEvents),
73
+ meterWindows: bytesPerEvent(sample.meterWindows, recordedEvents),
74
+ };
75
+ const allMeasuredRelations = relationWithTotal(Object.values(measured).reduce((total, relation) => ({
76
+ tableBytes: total.tableBytes + relation.tableBytes,
77
+ indexBytes: total.indexBytes + relation.indexBytes,
78
+ }), { tableBytes: 0, indexBytes: 0 }));
79
+ const projections = Object.entries(BILLING_METER_PLAN_MONTHLY_CALLS).map(([plan, monthlyCalls]) => retainedStorageProjection(plan, monthlyCalls, measured));
80
+ return {
81
+ sampleRecordedEvents: recordedEvents,
82
+ measurementBasis: 'allocated_growth',
83
+ receiptRetentionDays: BILLING_METER_RECEIPT_RETENTION_DAYS,
84
+ exactKeyTombstoneRetentionDays: BILLING_METER_EXACT_KEY_TOMBSTONE_RETENTION_DAYS,
85
+ measuredBytesPerRecordedEvent: { ...measured, allMeasuredRelations },
86
+ projections,
87
+ topologyApproval: {
88
+ state: 'manual_review_required',
89
+ checkpointContention: 'one_row_per_epoch_window',
90
+ reason: 'Measured allocation projections exclude WAL, replicas, backups, vacuum headroom, and burst shape; every receipt also serializes one checkpoint update per epoch/window, so the 400/s hot-window gate is topology-critical.',
91
+ },
92
+ };
93
+ }
94
+ /** Nearest-rank percentile for positive, finite latency samples. */
95
+ export function billingMeterPercentile(samples, percentile) {
96
+ if (samples.length === 0)
97
+ throw new Error('billing meter percentile requires at least one latency');
98
+ if (!Number.isFinite(percentile) || percentile <= 0 || percentile > 1) {
99
+ throw new Error('billing meter percentile must be greater than zero and at most one');
100
+ }
101
+ const sorted = samples.map(validateLatency).sort((left, right) => left - right);
102
+ const index = Math.max(0, Math.ceil(percentile * sorted.length) - 1);
103
+ const value = sorted[index];
104
+ if (value === undefined)
105
+ throw new Error('billing meter percentile could not be calculated');
106
+ return value;
107
+ }
108
+ function validateScenario(result) {
109
+ for (const [name, value] of Object.entries({
110
+ attempted: result.attempted,
111
+ recorded: result.recorded,
112
+ duplicates: result.duplicates,
113
+ })) {
114
+ if (!Number.isSafeInteger(value) || value < 0) {
115
+ throw new Error(`billing meter capacity ${name} must be a non-negative safe integer`);
116
+ }
117
+ }
118
+ for (const [name, value] of Object.entries({
119
+ durationMs: result.durationMs,
120
+ throughputPerSecond: result.throughputPerSecond,
121
+ p95Ms: result.p95Ms,
122
+ p99Ms: result.p99Ms,
123
+ })) {
124
+ if (!Number.isFinite(value) || value < 0) {
125
+ throw new Error(`billing meter capacity ${name} must be non-negative and finite`);
126
+ }
127
+ }
128
+ }
129
+ function validateLatency(value) {
130
+ if (!Number.isFinite(value) || value < 0) {
131
+ throw new Error('billing meter latency must be non-negative and finite');
132
+ }
133
+ return value;
134
+ }
135
+ function roundForPresentation(value) {
136
+ return Math.round(value * 100) / 100;
137
+ }
138
+ function bytesPerEvent(relation, recordedEvents) {
139
+ const validated = validateRelationStorage(relation);
140
+ return relationWithTotal({
141
+ tableBytes: roundStorageBytesUp(validated.tableBytes / recordedEvents),
142
+ indexBytes: roundStorageBytesUp(validated.indexBytes / recordedEvents),
143
+ });
144
+ }
145
+ function retainedStorageProjection(plan, monthlyCalls, measured) {
146
+ const peakRetainedReceiptRows = monthlyCalls * BILLING_METER_PEAK_RETAINED_COHORTS.receipts;
147
+ const peakRetainedExactKeyTombstoneRows = monthlyCalls * BILLING_METER_PEAK_RETAINED_COHORTS.exactKeyTombstones;
148
+ const receipts = projectedRelation(measured.receipts, peakRetainedReceiptRows);
149
+ const exactKeyTombstones = projectedRelation(measured.exactKeyTombstones, peakRetainedExactKeyTombstoneRows);
150
+ const combinedBytes = receipts.totalBytes + exactKeyTombstones.totalBytes;
151
+ if (!Number.isSafeInteger(combinedBytes)) {
152
+ throw new Error('billing meter storage projection exceeds the safe integer range');
153
+ }
154
+ return {
155
+ plan,
156
+ monthlyCalls,
157
+ peakRetainedReceiptRows,
158
+ peakRetainedExactKeyTombstoneRows,
159
+ receipts,
160
+ exactKeyTombstones,
161
+ combinedBytes,
162
+ };
163
+ }
164
+ function projectedRelation(bytes, rows) {
165
+ return relationWithTotal({
166
+ tableBytes: safeProjectedBytes(bytes.tableBytes, rows),
167
+ indexBytes: safeProjectedBytes(bytes.indexBytes, rows),
168
+ });
169
+ }
170
+ function safeProjectedBytes(bytesPerRow, rows) {
171
+ const result = Math.ceil(bytesPerRow * rows);
172
+ if (!Number.isSafeInteger(result) || result < 0) {
173
+ throw new Error('billing meter storage projection exceeds the safe integer range');
174
+ }
175
+ return result;
176
+ }
177
+ function validateRelationStorage(relation) {
178
+ for (const value of [relation.tableBytes, relation.indexBytes]) {
179
+ if (!Number.isSafeInteger(value) || value < 0) {
180
+ throw new Error('billing meter relation bytes must be a non-negative safe integer');
181
+ }
182
+ }
183
+ return relation;
184
+ }
185
+ function relationWithTotal(relation) {
186
+ const totalBytes = roundStorageBytes(relation.tableBytes + relation.indexBytes);
187
+ if (!Number.isFinite(totalBytes) || totalBytes < 0) {
188
+ throw new Error('billing meter relation total bytes must be non-negative and finite');
189
+ }
190
+ return { ...relation, totalBytes };
191
+ }
192
+ function roundStorageBytesUp(value) {
193
+ if (Number.isSafeInteger(value))
194
+ return value;
195
+ return Math.ceil(value * 1_000_000) / 1_000_000;
196
+ }
197
+ function roundStorageBytes(value) {
198
+ if (Number.isSafeInteger(value))
199
+ return value;
200
+ return Math.round(value * 1_000_000) / 1_000_000;
201
+ }
202
+ //# sourceMappingURL=meter-capacity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-capacity.js","sourceRoot":"","sources":["../../src/billing/meter-capacity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { BillingMeterLiveValidationRecordInput, BillingMeterWriterHealthSnapshot, BillingMeterWriterSessionIdentity } from './meter-live-validation.js';
2
+ import type { BillingMeterValidationEpochPrepareBindings } from './postgres-meter-epochs.js';
3
+ import type { BillingMeterValidationRecordInput } from './postgres-meter-validation.js';
4
+ export declare function normalizeBillingMeterLiveValidationInput(input: BillingMeterLiveValidationRecordInput): Omit<BillingMeterValidationRecordInput, 'epochId'>;
5
+ export declare function normalizeBillingMeterWriterSessionIdentity(input: BillingMeterWriterSessionIdentity): BillingMeterWriterSessionIdentity;
6
+ export declare function normalizeBillingMeterValidationEpochBindings(input: BillingMeterValidationEpochPrepareBindings): BillingMeterValidationEpochPrepareBindings;
7
+ export declare function normalizeBillingMeterWriterHealthSnapshot(input: BillingMeterWriterHealthSnapshot, expected: BillingMeterWriterSessionIdentity): BillingMeterWriterHealthSnapshot;
8
+ //# sourceMappingURL=meter-live-validation-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-live-validation-contract.d.ts","sourceRoot":"","sources":["../../src/billing/meter-live-validation-contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qCAAqC,EACrC,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AAGxF,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,qCAAqC,GAC3C,IAAI,CAAC,iCAAiC,EAAE,SAAS,CAAC,CAwBpD;AAED,wBAAgB,0CAA0C,CACxD,KAAK,EAAE,iCAAiC,GACvC,iCAAiC,CAcnC;AAED,wBAAgB,4CAA4C,CAC1D,KAAK,EAAE,0CAA0C,GAChD,0CAA0C,CAa5C;AAED,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,gCAAgC,EACvC,QAAQ,EAAE,iCAAiC,GAC1C,gCAAgC,CAuClC"}
@@ -0,0 +1,93 @@
1
+ import { validateSlug } from '../store/validate.js';
2
+ import { validateScalarId } from './postgres-records.js';
3
+ export function normalizeBillingMeterLiveValidationInput(input) {
4
+ return {
5
+ classification: input.classification,
6
+ org: validateSlug('org', input.org),
7
+ app: validateSlug('app', input.app),
8
+ environment: validateSlug('env', input.environment),
9
+ deploymentId: validateScalarId('billing meter deployment id', input.deploymentId),
10
+ ...(input.identity.highConfidenceKeyHash === undefined
11
+ ? {}
12
+ : {
13
+ highConfidenceKeyHash: validateFingerprint('billing meter high-confidence key', input.identity.highConfidenceKeyHash),
14
+ }),
15
+ fallbackFingerprint: validateFingerprint('billing meter fallback fingerprint', input.identity.fallbackFingerprint),
16
+ semanticFingerprint: validateFingerprint('billing meter semantic fingerprint', input.identity.semanticFingerprint),
17
+ };
18
+ }
19
+ export function normalizeBillingMeterWriterSessionIdentity(input) {
20
+ return {
21
+ sessionId: validateScalarId('billing meter writer session id', input.sessionId),
22
+ releaseSha: validateReleaseSha(input.releaseSha),
23
+ keyGeneration: validateFingerprint('billing meter writer key generation', input.keyGeneration),
24
+ retryIdentityVersion: validatePositiveVersion('billing meter retry identity version', input.retryIdentityVersion),
25
+ writerContractVersion: validatePositiveVersion('billing meter writer contract version', input.writerContractVersion),
26
+ };
27
+ }
28
+ export function normalizeBillingMeterValidationEpochBindings(input) {
29
+ return {
30
+ keyGeneration: validateFingerprint('billing meter epoch key generation', input.keyGeneration),
31
+ releaseSha: validateReleaseSha(input.releaseSha),
32
+ retryIdentityVersion: validatePositiveVersion('billing meter epoch retry identity version', input.retryIdentityVersion),
33
+ writerContractVersion: validatePositiveVersion('billing meter epoch writer contract version', input.writerContractVersion),
34
+ };
35
+ }
36
+ export function normalizeBillingMeterWriterHealthSnapshot(input, expected) {
37
+ const identity = normalizeBillingMeterWriterSessionIdentity(input);
38
+ if (!sameIdentity(identity, expected)) {
39
+ throw new Error('billing meter writer health identity does not match its session');
40
+ }
41
+ const snapshot = { ...input, ...identity };
42
+ for (const [name, value] of Object.entries(snapshot)) {
43
+ if (name !== 'sessionId' &&
44
+ name !== 'releaseSha' &&
45
+ name !== 'keyGeneration' &&
46
+ name !== 'retryIdentityVersion' &&
47
+ name !== 'writerContractVersion' &&
48
+ (!Number.isSafeInteger(value) || value < 0)) {
49
+ throw new Error(`billing meter writer ${name} must be a non-negative safe integer`);
50
+ }
51
+ }
52
+ if (snapshot.observedCalls !==
53
+ snapshot.attemptedWrites +
54
+ snapshot.circuitOpenSkips +
55
+ snapshot.saturationSkips +
56
+ snapshot.derivationFailures) {
57
+ throw new Error('billing meter writer observed-call counters are inconsistent');
58
+ }
59
+ if (snapshot.attemptedWrites !==
60
+ snapshot.recordedWrites +
61
+ snapshot.duplicateWrites +
62
+ snapshot.finalFailures +
63
+ snapshot.noEpochSkips +
64
+ snapshot.epochIdentityFailures +
65
+ snapshot.inFlightWrites) {
66
+ throw new Error('billing meter writer attempted-write counters are inconsistent');
67
+ }
68
+ return snapshot;
69
+ }
70
+ function sameIdentity(left, right) {
71
+ return (left.sessionId === right.sessionId &&
72
+ left.releaseSha === right.releaseSha &&
73
+ left.keyGeneration === right.keyGeneration &&
74
+ left.retryIdentityVersion === right.retryIdentityVersion &&
75
+ left.writerContractVersion === right.writerContractVersion);
76
+ }
77
+ function validateFingerprint(name, value) {
78
+ if (!/^[0-9a-f]{64}$/.test(value))
79
+ throw new Error(`${name} must be a SHA-256 digest`);
80
+ return value;
81
+ }
82
+ function validateReleaseSha(value) {
83
+ if (!/^[0-9a-f]{40}$/.test(value)) {
84
+ throw new Error('billing meter writer release SHA must be a full 40-character commit digest');
85
+ }
86
+ return value;
87
+ }
88
+ function validatePositiveVersion(name, value) {
89
+ if (!Number.isSafeInteger(value) || value < 1)
90
+ throw new Error(`${name} must be positive`);
91
+ return value;
92
+ }
93
+ //# sourceMappingURL=meter-live-validation-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-live-validation-contract.js","sourceRoot":"","sources":["../../src/billing/meter-live-validation-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { HostedToolDispatchContext, Logger } from '@noodle-borg/transport-http';
2
+ import type { BillingMeterValidationClassification } from './postgres-meter-validation.js';
3
+ import { type BillingUsageDispatchIdentity } from './usage-identity.js';
4
+ import type { BillingUsageObserver } from './usage-observer.js';
5
+ export interface BillingMeterWriterSessionIdentity {
6
+ readonly sessionId: string;
7
+ readonly releaseSha: string;
8
+ readonly keyGeneration: string;
9
+ readonly retryIdentityVersion: number;
10
+ readonly writerContractVersion: number;
11
+ }
12
+ export interface BillingMeterWriterHealthSnapshot extends BillingMeterWriterSessionIdentity {
13
+ readonly reportVersion: number;
14
+ readonly observedCalls: number;
15
+ readonly attemptedWrites: number;
16
+ readonly recordedWrites: number;
17
+ readonly duplicateWrites: number;
18
+ readonly finalFailures: number;
19
+ readonly noEpochSkips: number;
20
+ readonly circuitOpenSkips: number;
21
+ readonly saturationSkips: number;
22
+ readonly derivationFailures: number;
23
+ readonly epochIdentityFailures: number;
24
+ /** Sticky uncertainty evidence. A later committed receipt does not decrement this counter. */
25
+ readonly timeoutUnknownOutcomes: number;
26
+ readonly inFlightWrites: number;
27
+ }
28
+ export interface BillingMeterLiveValidationRecordInput {
29
+ readonly classification: BillingMeterValidationClassification;
30
+ readonly org: string;
31
+ readonly app: string;
32
+ readonly environment: string;
33
+ readonly deploymentId: string;
34
+ readonly identity: BillingUsageDispatchIdentity;
35
+ }
36
+ export type BillingMeterLiveValidationRecordResult = {
37
+ readonly outcome: 'recorded' | 'duplicate';
38
+ } | {
39
+ readonly outcome: 'no_prepared_epoch' | 'identity_mismatch';
40
+ };
41
+ export interface BillingMeterLiveValidationWriter {
42
+ readonly session: BillingMeterWriterSessionIdentity;
43
+ record(input: BillingMeterLiveValidationRecordInput): Promise<BillingMeterLiveValidationRecordResult>;
44
+ /** Persist a monotonic absolute snapshot; an unarmed epoch requests an exact local fence. */
45
+ reportHealth(snapshot: BillingMeterWriterHealthSnapshot): Promise<undefined | {
46
+ readonly armEpochId: string;
47
+ }>;
48
+ /** Persist the exact drained snapshot as this writer's zero point for one prepared epoch. */
49
+ armEpoch?(epochId: string, snapshot: BillingMeterWriterHealthSnapshot): Promise<void>;
50
+ /** A clean close requires no in-flight write. */
51
+ close(snapshot: BillingMeterWriterHealthSnapshot): Promise<void>;
52
+ }
53
+ export type BillingMeterShadowSink = (context: HostedToolDispatchContext, identity: BillingUsageDispatchIdentity) => Promise<void>;
54
+ export interface BillingMeterValidationMirror {
55
+ readonly observe: BillingUsageObserver;
56
+ snapshot(): BillingMeterWriterHealthSnapshot;
57
+ reportHealth(): Promise<void>;
58
+ close(): Promise<void>;
59
+ }
60
+ export interface BillingMeterValidationMirrorOptions {
61
+ readonly hmacKey: string;
62
+ readonly shadowSink?: BillingMeterShadowSink;
63
+ readonly writer: BillingMeterLiveValidationWriter;
64
+ readonly maxWaitMs?: number;
65
+ readonly maxConcurrentWrites?: number;
66
+ readonly failureCooldownMs?: number;
67
+ readonly shutdownDrainMs?: number;
68
+ readonly logger: Logger;
69
+ }
70
+ /**
71
+ * Mirror the final hosted tool-dispatch boundary into v1 shadow and the prepared v2 validation epoch.
72
+ * Both sinks are observational: every local, timeout, saturation, or database outcome still allows the
73
+ * connector exactly as before.
74
+ */
75
+ export declare function createBillingMeterValidationMirror(options: BillingMeterValidationMirrorOptions): BillingMeterValidationMirror;
76
+ //# sourceMappingURL=meter-live-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-live-validation.d.ts","sourceRoot":"","sources":["../../src/billing/meter-live-validation.ts"],"names":[],"mappings":"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"}