@noodleseed/one 0.46.0 → 0.48.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 (334) hide show
  1. package/dist/commands/assistant-ops.d.ts.map +1 -1
  2. package/dist/commands/assistant-ops.js +65 -1
  3. package/dist/commands/assistant-ops.js.map +1 -1
  4. package/dist/commands/auth-ops.d.ts.map +1 -1
  5. package/dist/commands/auth-ops.js +28 -4
  6. package/dist/commands/auth-ops.js.map +1 -1
  7. package/dist/commands/billing-enforcement-ops.d.ts +2 -0
  8. package/dist/commands/billing-enforcement-ops.d.ts.map +1 -0
  9. package/dist/commands/billing-enforcement-ops.js +312 -0
  10. package/dist/commands/billing-enforcement-ops.js.map +1 -0
  11. package/dist/commands/billing-metering-ops.d.ts +2 -0
  12. package/dist/commands/billing-metering-ops.d.ts.map +1 -0
  13. package/dist/commands/billing-metering-ops.js +128 -0
  14. package/dist/commands/billing-metering-ops.js.map +1 -0
  15. package/dist/commands/billing-metering-validation-ops.d.ts +2 -0
  16. package/dist/commands/billing-metering-validation-ops.d.ts.map +1 -0
  17. package/dist/commands/billing-metering-validation-ops.js +186 -0
  18. package/dist/commands/billing-metering-validation-ops.js.map +1 -0
  19. package/dist/commands/billing-ops.d.ts.map +1 -1
  20. package/dist/commands/billing-ops.js +6 -0
  21. package/dist/commands/billing-ops.js.map +1 -1
  22. package/dist/commands/catalog-data-resources.d.ts.map +1 -1
  23. package/dist/commands/catalog-data-resources.js +25 -4
  24. package/dist/commands/catalog-data-resources.js.map +1 -1
  25. package/dist/commands/catalog-render.d.ts.map +1 -1
  26. package/dist/commands/catalog-render.js +7 -5
  27. package/dist/commands/catalog-render.js.map +1 -1
  28. package/dist/commands/deploy-ops.d.ts.map +1 -1
  29. package/dist/commands/deploy-ops.js +10 -1
  30. package/dist/commands/deploy-ops.js.map +1 -1
  31. package/dist/commands/deploy-output.d.ts.map +1 -1
  32. package/dist/commands/deploy-output.js +4 -0
  33. package/dist/commands/deploy-output.js.map +1 -1
  34. package/dist/commands/deploy-version-resolution.d.ts +1 -0
  35. package/dist/commands/deploy-version-resolution.d.ts.map +1 -1
  36. package/dist/commands/deploy-version-resolution.js +8 -0
  37. package/dist/commands/deploy-version-resolution.js.map +1 -1
  38. package/dist/commands/mcp-apps-chatgpt.d.ts +7 -0
  39. package/dist/commands/mcp-apps-chatgpt.d.ts.map +1 -0
  40. package/dist/commands/mcp-apps-chatgpt.js +143 -0
  41. package/dist/commands/mcp-apps-chatgpt.js.map +1 -0
  42. package/dist/commands/mcp-apps.d.ts.map +1 -1
  43. package/dist/commands/mcp-apps.js +2 -114
  44. package/dist/commands/mcp-apps.js.map +1 -1
  45. package/dist/deploy-payload-size.d.ts +3 -0
  46. package/dist/deploy-payload-size.d.ts.map +1 -0
  47. package/dist/deploy-payload-size.js +29 -0
  48. package/dist/deploy-payload-size.js.map +1 -0
  49. package/dist/deploy.d.ts.map +1 -1
  50. package/dist/deploy.js +19 -8
  51. package/dist/deploy.js.map +1 -1
  52. package/dist/sdk-version-skew.d.ts +3 -0
  53. package/dist/sdk-version-skew.d.ts.map +1 -0
  54. package/dist/sdk-version-skew.js +34 -0
  55. package/dist/sdk-version-skew.js.map +1 -0
  56. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +3 -3
  57. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  58. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +1 -1
  59. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js.map +1 -1
  60. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
  61. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js.map +1 -1
  62. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.d.ts.map +1 -1
  63. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +10 -2
  64. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js.map +1 -1
  65. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  66. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +5 -0
  67. package/node_modules/@noodle-borg/authoring/dist/server.d.ts.map +1 -1
  68. package/node_modules/@noodle-borg/authoring/dist/server.js +1 -0
  69. package/node_modules/@noodle-borg/authoring/dist/server.js.map +1 -1
  70. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +7 -1
  71. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts.map +1 -1
  72. package/node_modules/@noodle-borg/compiler/dist/artifact/types.js +4 -1
  73. package/node_modules/@noodle-borg/compiler/dist/artifact/types.js.map +1 -1
  74. package/node_modules/@noodle-borg/compiler/dist/compile.d.ts.map +1 -1
  75. package/node_modules/@noodle-borg/compiler/dist/compile.js +3 -0
  76. package/node_modules/@noodle-borg/compiler/dist/compile.js.map +1 -1
  77. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +12 -0
  78. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -1
  79. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +7 -0
  80. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -1
  81. package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts.map +1 -1
  82. package/node_modules/@noodle-borg/protocol/dist/mapping.js +40 -1
  83. package/node_modules/@noodle-borg/protocol/dist/mapping.js.map +1 -1
  84. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts.map +1 -1
  85. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js +109 -1
  86. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js.map +1 -1
  87. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.d.ts +10 -3
  88. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.d.ts.map +1 -1
  89. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.js +69 -5
  90. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.js.map +1 -1
  91. package/node_modules/@noodle-borg/protocol/dist/widget/action-wiring-bootstrap.d.ts +3 -0
  92. package/node_modules/@noodle-borg/protocol/dist/widget/action-wiring-bootstrap.d.ts.map +1 -0
  93. package/node_modules/@noodle-borg/protocol/dist/widget/action-wiring-bootstrap.js +17 -0
  94. package/node_modules/@noodle-borg/protocol/dist/widget/action-wiring-bootstrap.js.map +1 -0
  95. package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.d.ts.map +1 -1
  96. package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.js +8 -16
  97. package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.js.map +1 -1
  98. package/node_modules/@noodle-borg/protocol/dist/widget/interaction-bootstrap.d.ts +3 -0
  99. package/node_modules/@noodle-borg/protocol/dist/widget/interaction-bootstrap.d.ts.map +1 -0
  100. package/node_modules/@noodle-borg/protocol/dist/widget/interaction-bootstrap.js +177 -0
  101. package/node_modules/@noodle-borg/protocol/dist/widget/interaction-bootstrap.js.map +1 -0
  102. package/node_modules/@noodle-borg/service/dist/billing/enforcement-profile.d.ts +96 -0
  103. package/node_modules/@noodle-borg/service/dist/billing/enforcement-profile.d.ts.map +1 -0
  104. package/node_modules/@noodle-borg/service/dist/billing/enforcement-profile.js +198 -0
  105. package/node_modules/@noodle-borg/service/dist/billing/enforcement-profile.js.map +1 -0
  106. package/node_modules/@noodle-borg/service/dist/billing/integration.d.ts +25 -2
  107. package/node_modules/@noodle-borg/service/dist/billing/integration.d.ts.map +1 -1
  108. package/node_modules/@noodle-borg/service/dist/billing/integration.js +51 -5
  109. package/node_modules/@noodle-borg/service/dist/billing/integration.js.map +1 -1
  110. package/node_modules/@noodle-borg/service/dist/billing/meter-capacity.d.ts +77 -0
  111. package/node_modules/@noodle-borg/service/dist/billing/meter-capacity.d.ts.map +1 -0
  112. package/node_modules/@noodle-borg/service/dist/billing/meter-capacity.js +202 -0
  113. package/node_modules/@noodle-borg/service/dist/billing/meter-capacity.js.map +1 -0
  114. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation-contract.d.ts +8 -0
  115. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation-contract.d.ts.map +1 -0
  116. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation-contract.js +93 -0
  117. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation-contract.js.map +1 -0
  118. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation.d.ts +76 -0
  119. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation.d.ts.map +1 -0
  120. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation.js +233 -0
  121. package/node_modules/@noodle-borg/service/dist/billing/meter-live-validation.js.map +1 -0
  122. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness-health.d.ts +89 -0
  123. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness-health.d.ts.map +1 -0
  124. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness-health.js +191 -0
  125. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness-health.js.map +1 -0
  126. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness.d.ts +99 -0
  127. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness.d.ts.map +1 -0
  128. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness.js +136 -0
  129. package/node_modules/@noodle-borg/service/dist/billing/meter-readiness.js.map +1 -0
  130. package/node_modules/@noodle-borg/service/dist/billing/meter-runtime-config.d.ts +9 -0
  131. package/node_modules/@noodle-borg/service/dist/billing/meter-runtime-config.d.ts.map +1 -0
  132. package/node_modules/@noodle-borg/service/dist/billing/meter-runtime-config.js +24 -0
  133. package/node_modules/@noodle-borg/service/dist/billing/meter-runtime-config.js.map +1 -0
  134. package/node_modules/@noodle-borg/service/dist/billing/meter-validation-epoch.d.ts +75 -0
  135. package/node_modules/@noodle-borg/service/dist/billing/meter-validation-epoch.d.ts.map +1 -0
  136. package/node_modules/@noodle-borg/service/dist/billing/meter-validation-epoch.js +127 -0
  137. package/node_modules/@noodle-borg/service/dist/billing/meter-validation-epoch.js.map +1 -0
  138. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.d.ts +4 -0
  139. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.d.ts.map +1 -0
  140. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.js +107 -0
  141. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile-schema.js.map +1 -0
  142. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.d.ts +18 -0
  143. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.d.ts.map +1 -0
  144. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.js +341 -0
  145. package/node_modules/@noodle-borg/service/dist/billing/postgres-enforcement-profile.js.map +1 -0
  146. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-clock.d.ts +3 -0
  147. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-clock.d.ts.map +1 -0
  148. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-clock.js +9 -0
  149. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-clock.js.map +1 -0
  150. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epoch-fixtures.d.ts +13 -0
  151. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epoch-fixtures.d.ts.map +1 -0
  152. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epoch-fixtures.js +102 -0
  153. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epoch-fixtures.js.map +1 -0
  154. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.d.ts +41 -0
  155. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.d.ts.map +1 -0
  156. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.js +289 -0
  157. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-epochs.js.map +1 -0
  158. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-evidence-retention.d.ts +16 -0
  159. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-evidence-retention.d.ts.map +1 -0
  160. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-evidence-retention.js +126 -0
  161. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-evidence-retention.js.map +1 -0
  162. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.d.ts +33 -0
  163. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.d.ts.map +1 -0
  164. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.js +436 -0
  165. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-live-validation.js.map +1 -0
  166. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-maintenance.d.ts +26 -0
  167. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-maintenance.d.ts.map +1 -0
  168. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-maintenance.js +146 -0
  169. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-maintenance.js.map +1 -0
  170. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-partition.d.ts +8 -0
  171. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-partition.d.ts.map +1 -0
  172. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-partition.js +42 -0
  173. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-partition.js.map +1 -0
  174. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-prepare-preflight.d.ts +8 -0
  175. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-prepare-preflight.d.ts.map +1 -0
  176. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-prepare-preflight.js +44 -0
  177. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-prepare-preflight.js.map +1 -0
  178. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness-live.d.ts +13 -0
  179. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness-live.d.ts.map +1 -0
  180. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness-live.js +189 -0
  181. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness-live.js.map +1 -0
  182. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.d.ts +18 -0
  183. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.d.ts.map +1 -0
  184. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.js +342 -0
  185. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-readiness.js.map +1 -0
  186. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.d.ts +27 -0
  187. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.d.ts.map +1 -0
  188. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.js +304 -0
  189. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-reconciliation.js.map +1 -0
  190. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-retention.d.ts +22 -0
  191. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-retention.d.ts.map +1 -0
  192. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-retention.js +224 -0
  193. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-retention.js.map +1 -0
  194. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.d.ts +33 -0
  195. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.d.ts.map +1 -0
  196. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.js +173 -0
  197. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-runtime.js.map +1 -0
  198. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-schema.d.ts +7 -0
  199. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-schema.d.ts.map +1 -0
  200. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-schema.js +50 -0
  201. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-schema.js.map +1 -0
  202. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-store.d.ts +34 -0
  203. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-store.d.ts.map +1 -0
  204. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-store.js +157 -0
  205. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler-store.js.map +1 -0
  206. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler.d.ts +56 -0
  207. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler.d.ts.map +1 -0
  208. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler.js +264 -0
  209. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-scheduler.js.map +1 -0
  210. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.d.ts +6 -0
  211. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.d.ts.map +1 -0
  212. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.js +414 -0
  213. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-schema.js.map +1 -0
  214. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-validation.d.ts +43 -0
  215. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-validation.d.ts.map +1 -0
  216. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-validation.js +321 -0
  217. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-validation.js.map +1 -0
  218. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-lock.d.ts +10 -0
  219. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-lock.d.ts.map +1 -0
  220. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-lock.js +13 -0
  221. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-lock.js.map +1 -0
  222. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-schema.d.ts +6 -0
  223. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-schema.d.ts.map +1 -0
  224. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-schema.js +248 -0
  225. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-window-schema.js.map +1 -0
  226. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-compaction.d.ts +29 -0
  227. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-compaction.d.ts.map +1 -0
  228. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-compaction.js +240 -0
  229. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-compaction.js.map +1 -0
  230. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-health-schema.d.ts +4 -0
  231. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-health-schema.d.ts.map +1 -0
  232. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-health-schema.js +140 -0
  233. package/node_modules/@noodle-borg/service/dist/billing/postgres-meter-writer-health-schema.js.map +1 -0
  234. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.d.ts.map +1 -1
  235. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.js +4 -0
  236. package/node_modules/@noodle-borg/service/dist/billing/postgres-migration.js.map +1 -1
  237. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.d.ts.map +1 -1
  238. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.js +6 -0
  239. package/node_modules/@noodle-borg/service/dist/billing/postgres-schema.js.map +1 -1
  240. package/node_modules/@noodle-borg/service/dist/billing/postgres.d.ts.map +1 -1
  241. package/node_modules/@noodle-borg/service/dist/billing/postgres.js +3 -0
  242. package/node_modules/@noodle-borg/service/dist/billing/postgres.js.map +1 -1
  243. package/node_modules/@noodle-borg/service/dist/billing/service-meter-runtime.d.ts +7 -0
  244. package/node_modules/@noodle-borg/service/dist/billing/service-meter-runtime.d.ts.map +1 -0
  245. package/node_modules/@noodle-borg/service/dist/billing/service-meter-runtime.js +19 -0
  246. package/node_modules/@noodle-borg/service/dist/billing/service-meter-runtime.js.map +1 -0
  247. package/node_modules/@noodle-borg/service/dist/billing/shadow-meter.d.ts +9 -4
  248. package/node_modules/@noodle-borg/service/dist/billing/shadow-meter.d.ts.map +1 -1
  249. package/node_modules/@noodle-borg/service/dist/billing/shadow-meter.js +34 -95
  250. package/node_modules/@noodle-borg/service/dist/billing/shadow-meter.js.map +1 -1
  251. package/node_modules/@noodle-borg/service/dist/billing/usage-identity.d.ts +14 -0
  252. package/node_modules/@noodle-borg/service/dist/billing/usage-identity.d.ts.map +1 -0
  253. package/node_modules/@noodle-borg/service/dist/billing/usage-identity.js +87 -0
  254. package/node_modules/@noodle-borg/service/dist/billing/usage-identity.js.map +1 -0
  255. package/node_modules/@noodle-borg/service/dist/billing/usage-observer.d.ts +6 -0
  256. package/node_modules/@noodle-borg/service/dist/billing/usage-observer.d.ts.map +1 -0
  257. package/node_modules/@noodle-borg/service/dist/billing/usage-observer.js +26 -0
  258. package/node_modules/@noodle-borg/service/dist/billing/usage-observer.js.map +1 -0
  259. package/node_modules/@noodle-borg/service/dist/billing-public.d.ts +16 -0
  260. package/node_modules/@noodle-borg/service/dist/billing-public.d.ts.map +1 -0
  261. package/node_modules/@noodle-borg/service/dist/billing-public.js +15 -0
  262. package/node_modules/@noodle-borg/service/dist/billing-public.js.map +1 -0
  263. package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts +1 -0
  264. package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts.map +1 -1
  265. package/node_modules/@noodle-borg/service/dist/customer-verifier.js +15 -0
  266. package/node_modules/@noodle-borg/service/dist/customer-verifier.js.map +1 -1
  267. package/node_modules/@noodle-borg/service/dist/http-util.d.ts +13 -0
  268. package/node_modules/@noodle-borg/service/dist/http-util.d.ts.map +1 -1
  269. package/node_modules/@noodle-borg/service/dist/http-util.js +42 -2
  270. package/node_modules/@noodle-borg/service/dist/http-util.js.map +1 -1
  271. package/node_modules/@noodle-borg/service/dist/index.d.ts +2 -7
  272. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  273. package/node_modules/@noodle-borg/service/dist/index.js +1 -6
  274. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  275. package/node_modules/@noodle-borg/service/dist/main.js +3 -0
  276. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
  277. package/node_modules/@noodle-borg/service/dist/options.d.ts +18 -0
  278. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  279. package/node_modules/@noodle-borg/service/dist/persistence-options.d.ts +4 -0
  280. package/node_modules/@noodle-borg/service/dist/persistence-options.d.ts.map +1 -0
  281. package/node_modules/@noodle-borg/service/dist/persistence-options.js +22 -0
  282. package/node_modules/@noodle-borg/service/dist/persistence-options.js.map +1 -0
  283. package/node_modules/@noodle-borg/service/dist/routes/assistant-dispatch.d.ts.map +1 -1
  284. package/node_modules/@noodle-borg/service/dist/routes/assistant-dispatch.js +10 -1
  285. package/node_modules/@noodle-borg/service/dist/routes/assistant-dispatch.js.map +1 -1
  286. package/node_modules/@noodle-borg/service/dist/routes/assistant.d.ts +2 -0
  287. package/node_modules/@noodle-borg/service/dist/routes/assistant.d.ts.map +1 -1
  288. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +85 -0
  289. package/node_modules/@noodle-borg/service/dist/routes/assistant.js.map +1 -1
  290. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-cohort.d.ts +17 -0
  291. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-cohort.d.ts.map +1 -0
  292. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-cohort.js +145 -0
  293. package/node_modules/@noodle-borg/service/dist/routes/billing-enforcement-cohort.js.map +1 -0
  294. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-readiness.d.ts +15 -0
  295. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-readiness.d.ts.map +1 -0
  296. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-readiness.js +78 -0
  297. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-readiness.js.map +1 -0
  298. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-validation.d.ts +15 -0
  299. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-validation.d.ts.map +1 -0
  300. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-validation.js +108 -0
  301. package/node_modules/@noodle-borg/service/dist/routes/billing-meter-validation.js.map +1 -0
  302. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.d.ts +6 -0
  303. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.d.ts.map +1 -1
  304. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.js +99 -0
  305. package/node_modules/@noodle-borg/service/dist/routes/commercial-dispatch.js.map +1 -1
  306. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.d.ts +25 -0
  307. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.d.ts.map +1 -0
  308. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.js +35 -0
  309. package/node_modules/@noodle-borg/service/dist/routes/commercial-service-deps.js.map +1 -0
  310. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +3 -3
  311. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
  312. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts +93 -0
  313. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts.map +1 -0
  314. package/node_modules/@noodle-borg/service/dist/serve-options.js +2 -0
  315. package/node_modules/@noodle-borg/service/dist/serve-options.js.map +1 -0
  316. package/node_modules/@noodle-borg/service/dist/serve.d.ts +2 -92
  317. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  318. package/node_modules/@noodle-borg/service/dist/serve.js +64 -59
  319. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  320. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts +22 -0
  321. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts.map +1 -0
  322. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +51 -0
  323. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js.map +1 -0
  324. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  325. package/node_modules/@noodle-borg/service/dist/service.js +10 -21
  326. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  327. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.d.ts.map +1 -1
  328. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js +7 -1
  329. package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js.map +1 -1
  330. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.d.ts +6 -2
  331. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.d.ts.map +1 -1
  332. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.js +11 -1
  333. package/node_modules/@noodle-borg/service/dist/store/postgres-billing.js.map +1 -1
  334. package/package.json +1 -1
@@ -0,0 +1,436 @@
1
+ import { normalizeBillingMeterLiveValidationInput, normalizeBillingMeterValidationEpochBindings, normalizeBillingMeterWriterHealthSnapshot, normalizeBillingMeterWriterSessionIdentity, } from './meter-live-validation-contract.js';
2
+ import { readBillingMeterTransactionTime } from './postgres-meter-clock.js';
3
+ import { BILLING_METER_VALIDATION_EPOCH_LIFECYCLE_LOCK_KEY } from './postgres-meter-epochs.js';
4
+ import { recordBillingMeterValidationUsageTx } from './postgres-meter-validation.js';
5
+ import { validateScalarId } from './postgres-records.js';
6
+ import { DEFAULT_BILLING_USAGE_RETRY_WINDOW_MS, validateBillingUsageRetryWindowMs, } from './usage-store.js';
7
+ export const BILLING_METER_WRITER_SESSION_FRESHNESS_MS = 2 * 60_000;
8
+ const DEFAULT_LOCK_TIMEOUT_MS = 150;
9
+ const DEFAULT_STATEMENT_TIMEOUT_MS = 200;
10
+ const DEFAULT_CONNECTION_TIMEOUT_MS = 1_000;
11
+ /**
12
+ * Atomically register one service boot. A compatible already-prepared epoch receives an unarmed candidate
13
+ * baseline in this same lifecycle-locked transaction, including when the replica is otherwise idle.
14
+ */
15
+ export async function registerPostgresBillingMeterWriterSession(pool, identity, options = {}) {
16
+ const session = normalizeBillingMeterWriterSessionIdentity(identity);
17
+ const normalizedOptions = normalizeWriterOptions(options);
18
+ const client = await acquireWriterClient(pool, normalizedOptions.connectionTimeoutMs);
19
+ try {
20
+ await client.query('BEGIN');
21
+ await setTransactionTimeouts(client, normalizedOptions.lockTimeoutMs, normalizedOptions.statementTimeoutMs);
22
+ await lockLifecycle(client);
23
+ const now = await readBillingMeterTransactionTime(client);
24
+ const existing = await getWriterSessionForUpdate(client, session.sessionId);
25
+ if (existing === undefined) {
26
+ await client.query(`INSERT INTO billing_meter_writer_sessions
27
+ (session_id, schema_version, release_sha, key_generation, retry_identity_version,
28
+ writer_contract_version, started_at, last_heartbeat_at)
29
+ VALUES ($1, 1, $2, $3, $4, $5, $6, $6)`, [
30
+ session.sessionId,
31
+ session.releaseSha,
32
+ session.keyGeneration,
33
+ session.retryIdentityVersion,
34
+ session.writerContractVersion,
35
+ now,
36
+ ]);
37
+ }
38
+ else {
39
+ assertSessionIdentity(existing, session);
40
+ if (existing.closed_at !== null) {
41
+ throw new Error('billing meter writer session is already closed');
42
+ }
43
+ await client.query(`UPDATE billing_meter_writer_sessions
44
+ SET last_heartbeat_at = $2
45
+ WHERE session_id = $1`, [session.sessionId, now]);
46
+ }
47
+ const prepared = await selectPreparedEpoch(client);
48
+ if (prepared !== undefined && epochMatchesSession(prepared, session)) {
49
+ await attachWriterEpochBaseline(client, prepared.id, session.sessionId, now);
50
+ }
51
+ await client.query('COMMIT');
52
+ }
53
+ catch (error) {
54
+ await rollbackQuietly(client);
55
+ throw error;
56
+ }
57
+ finally {
58
+ client.release();
59
+ }
60
+ return new PostgresBillingMeterLiveValidationWriter(pool, session, normalizedOptions);
61
+ }
62
+ /**
63
+ * Lifecycle prepare preflight. It runs after the epoch row is inserted but before that transaction commits.
64
+ * Every currently fresh open session must match, and all receive unarmed candidate baselines before prepare
65
+ * can succeed. Each local mirror establishes its exact zero point in a later fenced arm transaction.
66
+ */
67
+ export const prepareBillingMeterWriterEpochBaselines = async (input) => {
68
+ const epochId = validateScalarId('billing meter epoch id', input.epochId);
69
+ const bindings = normalizeBillingMeterValidationEpochBindings(input.bindings);
70
+ const now = await readBillingMeterTransactionTime(input.client);
71
+ const freshAfter = new Date(Date.parse(now) - BILLING_METER_WRITER_SESSION_FRESHNESS_MS).toISOString();
72
+ const sessions = await input.client.query(`SELECT * FROM billing_meter_writer_sessions
73
+ WHERE closed_at IS NULL AND last_heartbeat_at >= $1
74
+ ORDER BY session_id
75
+ FOR UPDATE`, [freshAfter]);
76
+ if (sessions.rows.length === 0)
77
+ return false;
78
+ for (const session of sessions.rows) {
79
+ if (!sessionMatchesBindings(session, bindings))
80
+ return false;
81
+ if (session.in_flight_writes !== '0')
82
+ return false;
83
+ }
84
+ for (const session of sessions.rows) {
85
+ await attachWriterEpochBaseline(input.client, epochId, session.session_id, now);
86
+ }
87
+ return true;
88
+ };
89
+ export class PostgresBillingMeterLiveValidationWriter {
90
+ session;
91
+ #pool;
92
+ #retryWindowMs;
93
+ #connectionTimeoutMs;
94
+ #lockTimeoutMs;
95
+ #statementTimeoutMs;
96
+ constructor(pool, session, options = {}) {
97
+ this.#pool = pool;
98
+ this.session = normalizeBillingMeterWriterSessionIdentity(session);
99
+ const normalizedOptions = normalizeWriterOptions(options);
100
+ this.#retryWindowMs = normalizedOptions.retryWindowMs;
101
+ this.#connectionTimeoutMs = normalizedOptions.connectionTimeoutMs;
102
+ this.#lockTimeoutMs = normalizedOptions.lockTimeoutMs;
103
+ this.#statementTimeoutMs = normalizedOptions.statementTimeoutMs;
104
+ }
105
+ async record(input) {
106
+ const usage = normalizeBillingMeterLiveValidationInput(input);
107
+ const client = await acquireWriterClient(this.#pool, this.#connectionTimeoutMs);
108
+ try {
109
+ await client.query('BEGIN');
110
+ await setTransactionTimeouts(client, this.#lockTimeoutMs, this.#statementTimeoutMs);
111
+ await lockLifecycleShared(client);
112
+ const now = await readBillingMeterTransactionTime(client);
113
+ const session = await getWriterSessionForUpdate(client, this.session.sessionId);
114
+ if (session === undefined || session.closed_at !== null) {
115
+ throw new Error('billing meter writer session is unavailable');
116
+ }
117
+ assertSessionIdentity(session, this.session);
118
+ const epoch = await selectPreparedEpoch(client);
119
+ if (epoch === undefined) {
120
+ await touchWriterSession(client, this.session.sessionId, now);
121
+ await client.query('COMMIT');
122
+ return { outcome: 'no_prepared_epoch' };
123
+ }
124
+ if (!epochMatchesSession(epoch, this.session)) {
125
+ await touchWriterSession(client, this.session.sessionId, now);
126
+ await client.query('COMMIT');
127
+ return { outcome: 'identity_mismatch' };
128
+ }
129
+ await attachWriterEpochBaseline(client, epoch.id, this.session.sessionId, now);
130
+ if (!(await isWriterEpochArmed(client, epoch.id, this.session.sessionId))) {
131
+ await touchWriterSession(client, this.session.sessionId, now);
132
+ await client.query('COMMIT');
133
+ return { outcome: 'no_prepared_epoch' };
134
+ }
135
+ const result = await recordBillingMeterValidationUsageTx(client, { epochId: epoch.id, ...usage }, {
136
+ retryWindowMs: this.#retryWindowMs,
137
+ keyGeneration: this.session.keyGeneration,
138
+ releaseSha: this.session.releaseSha,
139
+ writerContractVersion: this.session.writerContractVersion,
140
+ writerSessionId: this.session.sessionId,
141
+ });
142
+ await touchWriterSession(client, this.session.sessionId, now);
143
+ await client.query('COMMIT');
144
+ return { outcome: result.outcome };
145
+ }
146
+ catch (error) {
147
+ await rollbackQuietly(client);
148
+ throw error;
149
+ }
150
+ finally {
151
+ client.release();
152
+ }
153
+ }
154
+ reportHealth(snapshot) {
155
+ return this.#persistHealth(snapshot, false);
156
+ }
157
+ async armEpoch(epochId, snapshot) {
158
+ const normalizedEpochId = validateScalarId('billing meter epoch id', epochId);
159
+ const normalized = normalizeBillingMeterWriterHealthSnapshot(snapshot, this.session);
160
+ if (normalized.inFlightWrites !== 0) {
161
+ throw new Error('billing meter writer cannot arm an epoch with in-flight writes');
162
+ }
163
+ const client = await acquireWriterClient(this.#pool, this.#connectionTimeoutMs);
164
+ try {
165
+ await client.query('BEGIN');
166
+ await setTransactionTimeouts(client, this.#lockTimeoutMs, this.#statementTimeoutMs);
167
+ await lockLifecycleShared(client);
168
+ const now = await readBillingMeterTransactionTime(client);
169
+ const current = await getWriterSessionForUpdate(client, this.session.sessionId);
170
+ if (current === undefined || current.closed_at !== null) {
171
+ throw new Error('billing meter writer session is unavailable');
172
+ }
173
+ assertSessionIdentity(current, this.session);
174
+ const epoch = await selectPreparedEpoch(client);
175
+ if (epoch === undefined ||
176
+ epoch.id !== normalizedEpochId ||
177
+ !epochMatchesSession(epoch, this.session)) {
178
+ throw new Error('billing meter prepared epoch changed before writer arm');
179
+ }
180
+ await mergeHealthSnapshot(client, normalized, now);
181
+ await armWriterEpochBaselineFromSession(client, epoch.id, this.session.sessionId, now);
182
+ await client.query('COMMIT');
183
+ }
184
+ catch (error) {
185
+ await rollbackQuietly(client);
186
+ throw error;
187
+ }
188
+ finally {
189
+ client.release();
190
+ }
191
+ }
192
+ close(snapshot) {
193
+ if (snapshot.inFlightWrites !== 0) {
194
+ return Promise.reject(new Error('billing meter writer cannot close with in-flight writes'));
195
+ }
196
+ return this.#persistHealth(snapshot, true).then(() => undefined);
197
+ }
198
+ async #persistHealth(snapshot, close) {
199
+ const normalized = normalizeBillingMeterWriterHealthSnapshot(snapshot, this.session);
200
+ const client = await acquireWriterClient(this.#pool, this.#connectionTimeoutMs);
201
+ try {
202
+ await client.query('BEGIN');
203
+ await setTransactionTimeouts(client, this.#lockTimeoutMs, this.#statementTimeoutMs);
204
+ await lockLifecycleShared(client);
205
+ const now = await readBillingMeterTransactionTime(client);
206
+ const current = await getWriterSessionForUpdate(client, this.session.sessionId);
207
+ if (current === undefined)
208
+ throw new Error('billing meter writer session is unavailable');
209
+ assertSessionIdentity(current, this.session);
210
+ if (current.closed_at !== null) {
211
+ if (close) {
212
+ await client.query('COMMIT');
213
+ return;
214
+ }
215
+ throw new Error('billing meter writer session is already closed');
216
+ }
217
+ await mergeHealthSnapshot(client, normalized, now);
218
+ if (close) {
219
+ const prepared = await selectPreparedEpoch(client);
220
+ if (prepared !== undefined && epochMatchesSession(prepared, this.session)) {
221
+ await armWriterEpochBaselineFromSession(client, prepared.id, this.session.sessionId, now);
222
+ }
223
+ await client.query(`UPDATE billing_meter_writer_sessions
224
+ SET closed_at = $2, clean_stop = true, in_flight_writes = 0
225
+ WHERE session_id = $1`, [this.session.sessionId, now]);
226
+ }
227
+ const armEpochId = close ? undefined : await pendingWriterArmEpoch(client, this.session);
228
+ await client.query('COMMIT');
229
+ return armEpochId === undefined ? undefined : { armEpochId };
230
+ }
231
+ catch (error) {
232
+ await rollbackQuietly(client);
233
+ throw error;
234
+ }
235
+ finally {
236
+ client.release();
237
+ }
238
+ }
239
+ }
240
+ async function armWriterEpochBaselineFromSession(client, epochId, sessionId, armedAt) {
241
+ await attachWriterEpochBaseline(client, epochId, sessionId, armedAt);
242
+ const existing = await getWriterEpochBaseline(client, epochId, sessionId);
243
+ if (existing === undefined)
244
+ throw new Error('billing meter writer epoch baseline is missing');
245
+ if (existing.armed_at !== null)
246
+ return;
247
+ const armed = await client.query(`UPDATE billing_meter_writer_epoch_baselines AS baseline
248
+ SET armed_at = $3,
249
+ report_version = session.report_version,
250
+ observed_calls = session.observed_calls,
251
+ attempted_writes = session.attempted_writes,
252
+ recorded_writes = session.recorded_writes,
253
+ duplicate_writes = session.duplicate_writes,
254
+ final_failures = session.final_failures,
255
+ no_epoch_skips = session.no_epoch_skips,
256
+ circuit_open_skips = session.circuit_open_skips,
257
+ saturation_skips = session.saturation_skips,
258
+ derivation_failures = session.derivation_failures,
259
+ epoch_identity_failures = session.epoch_identity_failures,
260
+ timeout_unknown_outcomes = session.timeout_unknown_outcomes,
261
+ in_flight_writes = session.in_flight_writes
262
+ FROM billing_meter_writer_sessions AS session
263
+ WHERE baseline.epoch_id = $1 AND baseline.session_id = $2
264
+ AND session.session_id = baseline.session_id
265
+ AND baseline.armed_at IS NULL
266
+ AND session.in_flight_writes = 0`, [epochId, sessionId, armedAt]);
267
+ if (armed.rowCount !== 1)
268
+ throw new Error('billing meter writer epoch arm was not persisted');
269
+ }
270
+ async function selectPreparedEpoch(client) {
271
+ const result = await client.query(`SELECT id, key_generation, release_sha, retry_identity_version, writer_contract_version
272
+ FROM billing_meter_epochs
273
+ WHERE state = 'prepared'
274
+ FOR SHARE`);
275
+ if (result.rows.length > 1)
276
+ throw new Error('billing meter has multiple prepared epochs');
277
+ return result.rows[0];
278
+ }
279
+ async function attachWriterEpochBaseline(client, epochId, sessionId, attachedAt) {
280
+ await client.query(`INSERT INTO billing_meter_writer_epoch_baselines
281
+ (epoch_id, session_id, attached_at, report_version, observed_calls, attempted_writes,
282
+ recorded_writes, duplicate_writes, final_failures, no_epoch_skips, circuit_open_skips,
283
+ saturation_skips, derivation_failures, epoch_identity_failures,
284
+ timeout_unknown_outcomes, in_flight_writes)
285
+ SELECT $1, session_id, $3, report_version, observed_calls, attempted_writes,
286
+ recorded_writes, duplicate_writes, final_failures, no_epoch_skips, circuit_open_skips,
287
+ saturation_skips, derivation_failures, epoch_identity_failures,
288
+ timeout_unknown_outcomes, in_flight_writes
289
+ FROM billing_meter_writer_sessions
290
+ WHERE session_id = $2 AND closed_at IS NULL
291
+ ON CONFLICT (epoch_id, session_id) DO NOTHING`, [epochId, sessionId, attachedAt]);
292
+ }
293
+ async function getWriterEpochBaseline(client, epochId, sessionId) {
294
+ const result = await client.query(`SELECT armed_at
295
+ FROM billing_meter_writer_epoch_baselines
296
+ WHERE epoch_id = $1 AND session_id = $2
297
+ FOR UPDATE`, [epochId, sessionId]);
298
+ return result.rows[0];
299
+ }
300
+ async function isWriterEpochArmed(client, epochId, sessionId) {
301
+ const result = await client.query(`SELECT armed_at IS NOT NULL AS armed
302
+ FROM billing_meter_writer_epoch_baselines
303
+ WHERE epoch_id = $1 AND session_id = $2`, [epochId, sessionId]);
304
+ return result.rows[0]?.armed === true;
305
+ }
306
+ async function pendingWriterArmEpoch(client, session) {
307
+ const epoch = await selectPreparedEpoch(client);
308
+ if (epoch === undefined || !epochMatchesSession(epoch, session))
309
+ return undefined;
310
+ await attachWriterEpochBaseline(client, epoch.id, session.sessionId, await readBillingMeterTransactionTime(client));
311
+ return (await isWriterEpochArmed(client, epoch.id, session.sessionId)) ? undefined : epoch.id;
312
+ }
313
+ async function touchWriterSession(client, sessionId, heartbeatAt) {
314
+ const result = await client.query(`UPDATE billing_meter_writer_sessions
315
+ SET last_heartbeat_at = $2
316
+ WHERE session_id = $1 AND closed_at IS NULL`, [sessionId, heartbeatAt]);
317
+ if (result.rowCount !== 1)
318
+ throw new Error('billing meter writer session is unavailable');
319
+ }
320
+ async function mergeHealthSnapshot(client, snapshot, heartbeatAt) {
321
+ const result = await client.query(`UPDATE billing_meter_writer_sessions
322
+ SET report_version = GREATEST(report_version, $2),
323
+ observed_calls = GREATEST(observed_calls, $3),
324
+ attempted_writes = GREATEST(attempted_writes, $4),
325
+ recorded_writes = GREATEST(recorded_writes, $5),
326
+ duplicate_writes = GREATEST(duplicate_writes, $6),
327
+ final_failures = GREATEST(final_failures, $7),
328
+ no_epoch_skips = GREATEST(no_epoch_skips, $8),
329
+ circuit_open_skips = GREATEST(circuit_open_skips, $9),
330
+ saturation_skips = GREATEST(saturation_skips, $10),
331
+ derivation_failures = GREATEST(derivation_failures, $11),
332
+ epoch_identity_failures = GREATEST(epoch_identity_failures, $12),
333
+ timeout_unknown_outcomes = GREATEST(timeout_unknown_outcomes, $13),
334
+ in_flight_writes = CASE WHEN $2 > report_version THEN $14 ELSE in_flight_writes END,
335
+ last_heartbeat_at = $15
336
+ WHERE session_id = $1 AND closed_at IS NULL`, [
337
+ snapshot.sessionId,
338
+ snapshot.reportVersion,
339
+ snapshot.observedCalls,
340
+ snapshot.attemptedWrites,
341
+ snapshot.recordedWrites,
342
+ snapshot.duplicateWrites,
343
+ snapshot.finalFailures,
344
+ snapshot.noEpochSkips,
345
+ snapshot.circuitOpenSkips,
346
+ snapshot.saturationSkips,
347
+ snapshot.derivationFailures,
348
+ snapshot.epochIdentityFailures,
349
+ snapshot.timeoutUnknownOutcomes,
350
+ snapshot.inFlightWrites,
351
+ heartbeatAt,
352
+ ]);
353
+ if (result.rowCount !== 1)
354
+ throw new Error('billing meter writer session is unavailable');
355
+ }
356
+ async function getWriterSessionForUpdate(client, sessionId) {
357
+ const result = await client.query('SELECT * FROM billing_meter_writer_sessions WHERE session_id = $1 FOR UPDATE', [sessionId]);
358
+ return result.rows[0];
359
+ }
360
+ function epochMatchesSession(epoch, session) {
361
+ return (epoch.key_generation === session.keyGeneration &&
362
+ epoch.release_sha === session.releaseSha &&
363
+ epoch.retry_identity_version === session.retryIdentityVersion &&
364
+ epoch.writer_contract_version === session.writerContractVersion);
365
+ }
366
+ function sessionMatchesBindings(session, bindings) {
367
+ return (session.key_generation === bindings.keyGeneration &&
368
+ session.release_sha === bindings.releaseSha &&
369
+ session.retry_identity_version === bindings.retryIdentityVersion &&
370
+ session.writer_contract_version === bindings.writerContractVersion);
371
+ }
372
+ function assertSessionIdentity(row, expected) {
373
+ if (!sessionMatchesBindings(row, expected)) {
374
+ throw new Error('billing meter writer session identity changed');
375
+ }
376
+ }
377
+ async function lockLifecycle(client) {
378
+ await client.query('SELECT pg_advisory_xact_lock(hashtextextended($1, 0))', [
379
+ BILLING_METER_VALIDATION_EPOCH_LIFECYCLE_LOCK_KEY,
380
+ ]);
381
+ }
382
+ async function lockLifecycleShared(client) {
383
+ await client.query('SELECT pg_advisory_xact_lock_shared(hashtextextended($1, 0))', [
384
+ BILLING_METER_VALIDATION_EPOCH_LIFECYCLE_LOCK_KEY,
385
+ ]);
386
+ }
387
+ async function setTransactionTimeouts(client, lockTimeoutMs, statementTimeoutMs) {
388
+ await client.query(`SELECT set_config('lock_timeout', $1, true), set_config('statement_timeout', $2, true)`, [`${lockTimeoutMs}ms`, `${statementTimeoutMs}ms`]);
389
+ }
390
+ function boundedTimeout(name, value) {
391
+ if (!Number.isSafeInteger(value) || value < 1 || value > 5_000) {
392
+ throw new Error(`${name} must be between 1 and 5000 milliseconds`);
393
+ }
394
+ return value;
395
+ }
396
+ function normalizeWriterOptions(options) {
397
+ return {
398
+ retryWindowMs: validateBillingUsageRetryWindowMs(options.retryWindowMs ?? DEFAULT_BILLING_USAGE_RETRY_WINDOW_MS),
399
+ connectionTimeoutMs: boundedTimeout('billing meter writer connection timeout', options.connectionTimeoutMs ?? DEFAULT_CONNECTION_TIMEOUT_MS),
400
+ lockTimeoutMs: boundedTimeout('billing meter writer lock timeout', options.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS),
401
+ statementTimeoutMs: boundedTimeout('billing meter writer statement timeout', options.statementTimeoutMs ?? DEFAULT_STATEMENT_TIMEOUT_MS),
402
+ };
403
+ }
404
+ async function rollbackQuietly(client) {
405
+ try {
406
+ await client.query('ROLLBACK');
407
+ }
408
+ catch {
409
+ // Preserve the original transaction failure.
410
+ }
411
+ }
412
+ async function acquireWriterClient(pool, timeoutMs) {
413
+ return new Promise((resolve, reject) => {
414
+ let settled = false;
415
+ const timer = setTimeout(() => {
416
+ settled = true;
417
+ reject(new Error('billing meter writer connection acquisition timed out'));
418
+ }, timeoutMs);
419
+ void pool.connect().then((client) => {
420
+ if (settled) {
421
+ client.release();
422
+ return;
423
+ }
424
+ settled = true;
425
+ clearTimeout(timer);
426
+ resolve(client);
427
+ }, (error) => {
428
+ if (settled)
429
+ return;
430
+ settled = true;
431
+ clearTimeout(timer);
432
+ reject(error);
433
+ });
434
+ });
435
+ }
436
+ //# sourceMappingURL=postgres-meter-live-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-live-validation.js","sourceRoot":"","sources":["../../src/billing/postgres-meter-live-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Pool, PoolClient } from 'pg';
2
+ import { type BillingMeterRetentionBatchLimits } from './postgres-meter-retention.js';
3
+ export { BILLING_METER_SCHEDULER_RUN_RETENTION_DAYS } from './postgres-meter-evidence-retention.js';
4
+ export { BillingMeterConnectionUnsafeError, type BillingMeterReconciliationResult, reconcileBillingMeterWindow, reconcileBillingMeterWindowOnClient, } from './postgres-meter-reconciliation.js';
5
+ export interface BillingMeterMaintenanceResult {
6
+ readonly runId: string;
7
+ readonly status: 'succeeded';
8
+ readonly completedAt: string;
9
+ readonly receiptPartitionsDropped: number;
10
+ readonly receiptsDeleted: number;
11
+ readonly tombstonesDeleted: number;
12
+ readonly accountWindowsDeleted: number;
13
+ readonly orgWindowsDeleted: number;
14
+ readonly meterWindowsDeleted: number;
15
+ readonly reconciliationRunsDeleted: number;
16
+ readonly schedulerRunsDeleted: number;
17
+ readonly maintenanceRunsDeleted: number;
18
+ readonly writerSessionsCompacted: number;
19
+ readonly writerBaselinesFolded: number;
20
+ readonly writerCleanSessionsCompacted: number;
21
+ readonly writerUncleanSessionsCompacted: number;
22
+ }
23
+ export declare function runBillingMeterMaintenance(pool: Pool): Promise<BillingMeterMaintenanceResult>;
24
+ /** Run one maintenance transaction on a caller-owned, dedicated PostgreSQL session. */
25
+ export declare function runBillingMeterMaintenanceOnClient(client: PoolClient, retentionLimits?: BillingMeterRetentionBatchLimits): Promise<BillingMeterMaintenanceResult>;
26
+ //# sourceMappingURL=postgres-meter-maintenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-maintenance.d.ts","sourceRoot":"","sources":["../../src/billing/postgres-meter-maintenance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAQ3C,OAAO,EACL,KAAK,gCAAgC,EAItC,MAAM,+BAA+B,CAAC;AAIvC,OAAO,EAAE,0CAA0C,EAAE,MAAM,wCAAwC,CAAC;AACpG,OAAO,EACL,iCAAiC,EACjC,KAAK,gCAAgC,EACrC,2BAA2B,EAC3B,mCAAmC,GACpC,MAAM,oCAAoC,CAAC;AAK5C,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,8BAA8B,EAAE,MAAM,CAAC;CACjD;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,6BAA6B,CAAC,CAOxC;AAED,uFAAuF;AACvF,wBAAsB,kCAAkC,CACtD,MAAM,EAAE,UAAU,EAClB,eAAe,GAAE,gCAA+E,GAC/F,OAAO,CAAC,6BAA6B,CAAC,CA4GxC"}
@@ -0,0 +1,146 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { BILLING_METER_PARTITION_HORIZON_MONTHS } from './meter-readiness.js';
3
+ import { readBillingMeterTransactionTime } from './postgres-meter-clock.js';
4
+ import { compactBillingMeterMaintenanceEvidence, compactBillingMeterOperationalEvidence, } from './postgres-meter-evidence-retention.js';
5
+ import { billingMeterPartitionHorizonExists } from './postgres-meter-partition.js';
6
+ import { DEFAULT_BILLING_METER_RETENTION_BATCH_LIMITS, retireExpiredBillingMeterReceipts, retireExpiredBillingMeterRows, } from './postgres-meter-retention.js';
7
+ import { ensureAuthoritativeMeterPartitions } from './postgres-meter-schema.js';
8
+ import { compactBillingMeterWriterSessionsOnClient } from './postgres-meter-writer-compaction.js';
9
+ export { BILLING_METER_SCHEDULER_RUN_RETENTION_DAYS } from './postgres-meter-evidence-retention.js';
10
+ export { BillingMeterConnectionUnsafeError, reconcileBillingMeterWindow, reconcileBillingMeterWindowOnClient, } from './postgres-meter-reconciliation.js';
11
+ const BILLING_METER_MAINTENANCE_LOCK_TIMEOUT = '5s';
12
+ const BILLING_METER_MAINTENANCE_STATEMENT_TIMEOUT = '30s';
13
+ export async function runBillingMeterMaintenance(pool) {
14
+ const client = await pool.connect();
15
+ try {
16
+ return await runBillingMeterMaintenanceOnClient(client);
17
+ }
18
+ finally {
19
+ client.release();
20
+ }
21
+ }
22
+ /** Run one maintenance transaction on a caller-owned, dedicated PostgreSQL session. */
23
+ export async function runBillingMeterMaintenanceOnClient(client, retentionLimits = DEFAULT_BILLING_METER_RETENTION_BATCH_LIMITS) {
24
+ await ensureBillingMeterMaintenancePartitionHorizon(client);
25
+ const runId = `bmmr_${randomUUID()}`;
26
+ let completedAt;
27
+ try {
28
+ await client.query('BEGIN');
29
+ await setBillingMeterMaintenanceTimeouts(client);
30
+ completedAt = await readBillingMeterTransactionTime(client);
31
+ const completedDate = new Date(completedAt);
32
+ const partitionHorizon = new Date(Date.UTC(completedDate.getUTCFullYear(), completedDate.getUTCMonth() + BILLING_METER_PARTITION_HORIZON_MONTHS + 1, 1)).toISOString();
33
+ await client.query(`INSERT INTO billing_meter_maintenance_runs
34
+ (run_id, status, started_at)
35
+ VALUES ($1, 'running', $2)`, [runId, completedAt]);
36
+ const expiredRows = await retireExpiredBillingMeterRows(client, completedAt, retentionLimits);
37
+ const writerCompaction = await compactBillingMeterWriterSessionsOnClient(client, {
38
+ decisionAt: completedAt,
39
+ });
40
+ const evidence = await compactBillingMeterOperationalEvidence(client, completedAt);
41
+ // Receipt partition drops are the only ACCESS EXCLUSIVE maintenance operation. Keep them at
42
+ // the commit edge so any old-partition lock is held only through the evidence update below.
43
+ const receiptRetirement = await retireExpiredBillingMeterReceipts(client, completedAt, retentionLimits);
44
+ const counts = [
45
+ receiptRetirement.receiptsDeleted,
46
+ expiredRows.tombstonesDeleted,
47
+ expiredRows.accountWindowsDeleted,
48
+ expiredRows.orgWindowsDeleted,
49
+ expiredRows.meterWindowsDeleted,
50
+ evidence.reconciliationRunsDeleted,
51
+ evidence.schedulerRunsDeleted,
52
+ evidence.maintenanceRunsDeleted,
53
+ writerCompaction.sessionsCompacted,
54
+ writerCompaction.baselinesFolded,
55
+ writerCompaction.cleanSessionsCompacted,
56
+ writerCompaction.uncleanSessionsCompacted,
57
+ ];
58
+ await client.query(`UPDATE billing_meter_maintenance_runs
59
+ SET status = 'succeeded', completed_at = $2, partition_horizon = $3,
60
+ receipt_partitions_dropped = $4,
61
+ receipts_deleted = $5, tombstones_deleted = $6,
62
+ account_windows_deleted = $7, org_windows_deleted = $8,
63
+ meter_windows_deleted = $9,
64
+ reconciliation_runs_deleted = $10, scheduler_runs_deleted = $11,
65
+ maintenance_runs_deleted = $12,
66
+ writer_sessions_compacted = $13, writer_baselines_folded = $14,
67
+ writer_clean_sessions_compacted = $15, writer_unclean_sessions_compacted = $16
68
+ WHERE run_id = $1`, [runId, completedAt, partitionHorizon, receiptRetirement.partitionsDropped, ...counts]);
69
+ await client.query('COMMIT');
70
+ return {
71
+ runId,
72
+ status: 'succeeded',
73
+ completedAt,
74
+ receiptPartitionsDropped: receiptRetirement.partitionsDropped,
75
+ receiptsDeleted: counts[0],
76
+ tombstonesDeleted: counts[1],
77
+ accountWindowsDeleted: counts[2],
78
+ orgWindowsDeleted: counts[3],
79
+ meterWindowsDeleted: counts[4],
80
+ reconciliationRunsDeleted: counts[5],
81
+ schedulerRunsDeleted: counts[6],
82
+ maintenanceRunsDeleted: counts[7],
83
+ writerSessionsCompacted: counts[8],
84
+ writerBaselinesFolded: counts[9],
85
+ writerCleanSessionsCompacted: counts[10],
86
+ writerUncleanSessionsCompacted: counts[11],
87
+ };
88
+ }
89
+ catch (error) {
90
+ await rollbackQuietly(client);
91
+ try {
92
+ if (completedAt === undefined)
93
+ throw new Error('billing meter database clock unavailable');
94
+ await client.query('BEGIN');
95
+ await setBillingMeterMaintenanceTimeouts(client);
96
+ await client.query(`INSERT INTO billing_meter_maintenance_runs
97
+ (run_id, status, started_at, completed_at)
98
+ VALUES ($1, 'failed', $2, $2)
99
+ ON CONFLICT (run_id) DO NOTHING`, [runId, completedAt]);
100
+ const maintenanceRunsDeleted = await compactBillingMeterMaintenanceEvidence(client, runId);
101
+ await client.query(`UPDATE billing_meter_maintenance_runs
102
+ SET maintenance_runs_deleted = $2
103
+ WHERE run_id = $1`, [runId, maintenanceRunsDeleted]);
104
+ await client.query('COMMIT');
105
+ }
106
+ catch {
107
+ await rollbackQuietly(client);
108
+ // The original maintenance failure remains authoritative.
109
+ }
110
+ throw error;
111
+ }
112
+ }
113
+ async function ensureBillingMeterMaintenancePartitionHorizon(client) {
114
+ const checkedAt = new Date(await readBillingMeterTransactionTime(client));
115
+ if (!Number.isFinite(checkedAt.getTime())) {
116
+ throw new Error('billing meter database clock unavailable');
117
+ }
118
+ if (await billingMeterPartitionHorizonExists(client, checkedAt))
119
+ return;
120
+ // Missing-partition DDL is isolated from the longer data-retention transaction. Existing
121
+ // horizons take the read-only path above and never reacquire the live parent's DDL lock.
122
+ await client.query('BEGIN');
123
+ try {
124
+ await setBillingMeterMaintenanceTimeouts(client);
125
+ await ensureAuthoritativeMeterPartitions(client);
126
+ await client.query('COMMIT');
127
+ }
128
+ catch (error) {
129
+ await rollbackQuietly(client);
130
+ throw error;
131
+ }
132
+ }
133
+ function setBillingMeterMaintenanceTimeouts(client) {
134
+ return client.query(`SELECT set_config('lock_timeout', $1, true),
135
+ set_config('statement_timeout', $2, true),
136
+ set_config('idle_in_transaction_session_timeout', $2, true)`, [BILLING_METER_MAINTENANCE_LOCK_TIMEOUT, BILLING_METER_MAINTENANCE_STATEMENT_TIMEOUT]);
137
+ }
138
+ async function rollbackQuietly(client) {
139
+ try {
140
+ await client.query('ROLLBACK');
141
+ }
142
+ catch {
143
+ // Preserve the original transaction failure.
144
+ }
145
+ }
146
+ //# sourceMappingURL=postgres-meter-maintenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-meter-maintenance.js","sourceRoot":"","sources":["../../src/billing/postgres-meter-maintenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,sCAAsC,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EACL,sCAAsC,EACtC,sCAAsC,GACvC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,kCAAkC,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAEL,4CAA4C,EAC5C,iCAAiC,EACjC,6BAA6B,GAC9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,kCAAkC,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,yCAAyC,EAAE,MAAM,uCAAuC,CAAC;AAElG,OAAO,EAAE,0CAA0C,EAAE,MAAM,wCAAwC,CAAC;AACpG,OAAO,EACL,iCAAiC,EAEjC,2BAA2B,EAC3B,mCAAmC,GACpC,MAAM,oCAAoC,CAAC;AAE5C,MAAM,sCAAsC,GAAG,IAAI,CAAC;AACpD,MAAM,2CAA2C,GAAG,KAAK,CAAC;AAqB1D,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAU;IAEV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,kCAAkC,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,MAAkB,EAClB,kBAAoD,4CAA4C;IAEhG,MAAM,6CAA6C,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,QAAQ,UAAU,EAAE,EAAE,CAAC;IACrC,IAAI,WAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,kCAAkC,CAAC,MAAM,CAAC,CAAC;QACjD,WAAW,GAAG,MAAM,+BAA+B,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAC/B,IAAI,CAAC,GAAG,CACN,aAAa,CAAC,cAAc,EAAE,EAC9B,aAAa,CAAC,WAAW,EAAE,GAAG,sCAAsC,GAAG,CAAC,EACxE,CAAC,CACF,CACF,CAAC,WAAW,EAAE,CAAC;QAChB,MAAM,MAAM,CAAC,KAAK,CAChB;;kCAE4B,EAC5B,CAAC,KAAK,EAAE,WAAW,CAAC,CACrB,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,6BAA6B,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QAC9F,MAAM,gBAAgB,GAAG,MAAM,yCAAyC,CAAC,MAAM,EAAE;YAC/E,UAAU,EAAE,WAAW;SACxB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,sCAAsC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnF,4FAA4F;QAC5F,4FAA4F;QAC5F,MAAM,iBAAiB,GAAG,MAAM,iCAAiC,CAC/D,MAAM,EACN,WAAW,EACX,eAAe,CAChB,CAAC;QACF,MAAM,MAAM,GAAG;YACb,iBAAiB,CAAC,eAAe;YACjC,WAAW,CAAC,iBAAiB;YAC7B,WAAW,CAAC,qBAAqB;YACjC,WAAW,CAAC,iBAAiB;YAC7B,WAAW,CAAC,mBAAmB;YAC/B,QAAQ,CAAC,yBAAyB;YAClC,QAAQ,CAAC,oBAAoB;YAC7B,QAAQ,CAAC,sBAAsB;YAC/B,gBAAgB,CAAC,iBAAiB;YAClC,gBAAgB,CAAC,eAAe;YAChC,gBAAgB,CAAC,sBAAsB;YACvC,gBAAgB,CAAC,wBAAwB;SACjC,CAAC;QACX,MAAM,MAAM,CAAC,KAAK,CAChB;;;;;;;;;;yBAUmB,EACnB,CAAC,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,GAAG,MAAM,CAAC,CACvF,CAAC;QACF,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO;YACL,KAAK;YACL,MAAM,EAAE,WAAW;YACnB,WAAW;YACX,wBAAwB,EAAE,iBAAiB,CAAC,iBAAiB;YAC7D,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1B,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5B,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;YAChC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5B,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9B,yBAAyB,EAAE,MAAM,CAAC,CAAC,CAAC;YACpC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/B,sBAAsB,EAAE,MAAM,CAAC,CAAC,CAAC;YACjC,uBAAuB,EAAE,MAAM,CAAC,CAAC,CAAC;YAClC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;YAChC,4BAA4B,EAAE,MAAM,CAAC,EAAE,CAAC;YACxC,8BAA8B,EAAE,MAAM,CAAC,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,WAAW,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC3F,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,kCAAkC,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,MAAM,CAAC,KAAK,CAChB;;;yCAGiC,EACjC,CAAC,KAAK,EAAE,WAAW,CAAC,CACrB,CAAC;YACF,MAAM,sBAAsB,GAAG,MAAM,sCAAsC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3F,MAAM,MAAM,CAAC,KAAK,CAChB;;2BAEmB,EACnB,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAChC,CAAC;YACF,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;YAC9B,0DAA0D;QAC5D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,6CAA6C,CAAC,MAAkB;IAC7E,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,+BAA+B,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,kCAAkC,CAAC,MAAM,EAAE,SAAS,CAAC;QAAE,OAAO;IAExE,yFAAyF;IACzF,yFAAyF;IACzF,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,kCAAkC,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,kCAAkC,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,kCAAkC,CAAC,MAAkB;IAC5D,OAAO,MAAM,CAAC,KAAK,CACjB;;wEAEoE,EACpE,CAAC,sCAAsC,EAAE,2CAA2C,CAAC,CACtF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAkB;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;AACH,CAAC"}