@aglyn/plugins-ai 1.0.0-beta.143

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 (717) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +25 -0
  3. package/package.json +60 -0
  4. package/src/index.d.ts +21 -0
  5. package/src/index.js +22 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/activity/ai-activity-actions.d.ts +106 -0
  8. package/src/lib/activity/ai-activity-actions.js +209 -0
  9. package/src/lib/activity/ai-activity-actions.js.map +1 -0
  10. package/src/lib/activity/ai-activity.d.ts +219 -0
  11. package/src/lib/activity/ai-activity.js +251 -0
  12. package/src/lib/activity/ai-activity.js.map +1 -0
  13. package/src/lib/billing/ai-overage-charge.d.ts +102 -0
  14. package/src/lib/billing/ai-overage-charge.js +258 -0
  15. package/src/lib/billing/ai-overage-charge.js.map +1 -0
  16. package/src/lib/billing/ai-overage-close.d.ts +62 -0
  17. package/src/lib/billing/ai-overage-close.js +129 -0
  18. package/src/lib/billing/ai-overage-close.js.map +1 -0
  19. package/src/lib/billing/ai-overage-cutover.d.ts +63 -0
  20. package/src/lib/billing/ai-overage-cutover.js +114 -0
  21. package/src/lib/billing/ai-overage-cutover.js.map +1 -0
  22. package/src/lib/billing/ai-overage-events.d.ts +77 -0
  23. package/src/lib/billing/ai-overage-events.js +174 -0
  24. package/src/lib/billing/ai-overage-events.js.map +1 -0
  25. package/src/lib/billing/ai-overage-gate.d.ts +147 -0
  26. package/src/lib/billing/ai-overage-gate.js +177 -0
  27. package/src/lib/billing/ai-overage-gate.js.map +1 -0
  28. package/src/lib/billing/ai-overage-ledger.d.ts +135 -0
  29. package/src/lib/billing/ai-overage-ledger.js +278 -0
  30. package/src/lib/billing/ai-overage-ledger.js.map +1 -0
  31. package/src/lib/billing/ai-overage-standing-writes.d.ts +110 -0
  32. package/src/lib/billing/ai-overage-standing-writes.js +205 -0
  33. package/src/lib/billing/ai-overage-standing-writes.js.map +1 -0
  34. package/src/lib/billing/ai-overage-standing.d.ts +168 -0
  35. package/src/lib/billing/ai-overage-standing.js +215 -0
  36. package/src/lib/billing/ai-overage-standing.js.map +1 -0
  37. package/src/lib/billing/ai-overage-trigger.d.ts +30 -0
  38. package/src/lib/billing/ai-overage-trigger.js +76 -0
  39. package/src/lib/billing/ai-overage-trigger.js.map +1 -0
  40. package/src/lib/components/ai-allotment-editor.component.d.ts +40 -0
  41. package/src/lib/components/ai-allotment-editor.component.js +213 -0
  42. package/src/lib/components/ai-allotment-editor.component.js.map +1 -0
  43. package/src/lib/components/ai-assist-actions-context.d.ts +13 -0
  44. package/src/lib/components/ai-assist-actions-context.js +21 -0
  45. package/src/lib/components/ai-assist-actions-context.js.map +1 -0
  46. package/src/lib/components/ai-assist-provider.component.d.ts +51 -0
  47. package/src/lib/components/ai-assist-provider.component.js +519 -0
  48. package/src/lib/components/ai-assist-provider.component.js.map +1 -0
  49. package/src/lib/components/ai-brief-dialog.component.d.ts +56 -0
  50. package/src/lib/components/ai-brief-dialog.component.js +319 -0
  51. package/src/lib/components/ai-brief-dialog.component.js.map +1 -0
  52. package/src/lib/components/ai-collaborator-permissions-column.component.d.ts +32 -0
  53. package/src/lib/components/ai-collaborator-permissions-column.component.js +132 -0
  54. package/src/lib/components/ai-collaborator-permissions-column.component.js.map +1 -0
  55. package/src/lib/components/ai-credits-card.component.d.ts +34 -0
  56. package/src/lib/components/ai-credits-card.component.js +131 -0
  57. package/src/lib/components/ai-credits-card.component.js.map +1 -0
  58. package/src/lib/components/ai-credits-columns.component.d.ts +56 -0
  59. package/src/lib/components/ai-credits-columns.component.js +118 -0
  60. package/src/lib/components/ai-credits-columns.component.js.map +1 -0
  61. package/src/lib/components/ai-crm-email-draft.component.d.ts +17 -0
  62. package/src/lib/components/ai-crm-email-draft.component.js +159 -0
  63. package/src/lib/components/ai-crm-email-draft.component.js.map +1 -0
  64. package/src/lib/components/ai-crm-import-mapping.component.d.ts +20 -0
  65. package/src/lib/components/ai-crm-import-mapping.component.js +167 -0
  66. package/src/lib/components/ai-crm-import-mapping.component.js.map +1 -0
  67. package/src/lib/components/ai-crm-record-card.component.d.ts +27 -0
  68. package/src/lib/components/ai-crm-record-card.component.js +263 -0
  69. package/src/lib/components/ai-crm-record-card.component.js.map +1 -0
  70. package/src/lib/components/ai-describe-automation.component.d.ts +31 -0
  71. package/src/lib/components/ai-describe-automation.component.js +226 -0
  72. package/src/lib/components/ai-describe-automation.component.js.map +1 -0
  73. package/src/lib/components/ai-describe-button.component.d.ts +39 -0
  74. package/src/lib/components/ai-describe-button.component.js +87 -0
  75. package/src/lib/components/ai-describe-button.component.js.map +1 -0
  76. package/src/lib/components/ai-describe-page.component.d.ts +26 -0
  77. package/src/lib/components/ai-describe-page.component.js +18 -0
  78. package/src/lib/components/ai-describe-page.component.js.map +1 -0
  79. package/src/lib/components/ai-experiment-cards.component.d.ts +75 -0
  80. package/src/lib/components/ai-experiment-cards.component.js +573 -0
  81. package/src/lib/components/ai-experiment-cards.component.js.map +1 -0
  82. package/src/lib/components/ai-explain-automation.component.d.ts +31 -0
  83. package/src/lib/components/ai-explain-automation.component.js +265 -0
  84. package/src/lib/components/ai-explain-automation.component.js.map +1 -0
  85. package/src/lib/components/ai-insight-dialog.component.d.ts +37 -0
  86. package/src/lib/components/ai-insight-dialog.component.js +441 -0
  87. package/src/lib/components/ai-insight-dialog.component.js.map +1 -0
  88. package/src/lib/components/ai-job-plan.component.d.ts +46 -0
  89. package/src/lib/components/ai-job-plan.component.js +192 -0
  90. package/src/lib/components/ai-job-plan.component.js.map +1 -0
  91. package/src/lib/components/ai-model-selector.component.d.ts +21 -0
  92. package/src/lib/components/ai-model-selector.component.js +109 -0
  93. package/src/lib/components/ai-model-selector.component.js.map +1 -0
  94. package/src/lib/components/ai-page-brief-dialog.component.d.ts +29 -0
  95. package/src/lib/components/ai-page-brief-dialog.component.js +27 -0
  96. package/src/lib/components/ai-page-brief-dialog.component.js.map +1 -0
  97. package/src/lib/components/ai-permissions-on-host.component.d.ts +55 -0
  98. package/src/lib/components/ai-permissions-on-host.component.js +91 -0
  99. package/src/lib/components/ai-permissions-on-host.component.js.map +1 -0
  100. package/src/lib/components/ai-product-copy-card.component.d.ts +25 -0
  101. package/src/lib/components/ai-product-copy-card.component.js +328 -0
  102. package/src/lib/components/ai-product-copy-card.component.js.map +1 -0
  103. package/src/lib/components/ai-product-import-option.component.d.ts +14 -0
  104. package/src/lib/components/ai-product-import-option.component.js +58 -0
  105. package/src/lib/components/ai-product-import-option.component.js.map +1 -0
  106. package/src/lib/components/ai-products-hub-card.component.d.ts +15 -0
  107. package/src/lib/components/ai-products-hub-card.component.js +418 -0
  108. package/src/lib/components/ai-products-hub-card.component.js.map +1 -0
  109. package/src/lib/components/ai-products-proposals.component.d.ts +19 -0
  110. package/src/lib/components/ai-products-proposals.component.js +547 -0
  111. package/src/lib/components/ai-products-proposals.component.js.map +1 -0
  112. package/src/lib/components/ai-save-as-component.component.d.ts +38 -0
  113. package/src/lib/components/ai-save-as-component.component.js +231 -0
  114. package/src/lib/components/ai-save-as-component.component.js.map +1 -0
  115. package/src/lib/components/ai-seo-audit-card.component.d.ts +9 -0
  116. package/src/lib/components/ai-seo-audit-card.component.js +620 -0
  117. package/src/lib/components/ai-seo-audit-card.component.js.map +1 -0
  118. package/src/lib/components/ai-seo-fields-card.component.d.ts +10 -0
  119. package/src/lib/components/ai-seo-fields-card.component.js +453 -0
  120. package/src/lib/components/ai-seo-fields-card.component.js.map +1 -0
  121. package/src/lib/components/ai-site-batch-card.component.d.ts +32 -0
  122. package/src/lib/components/ai-site-batch-card.component.js +531 -0
  123. package/src/lib/components/ai-site-batch-card.component.js.map +1 -0
  124. package/src/lib/components/ai-site-seo-start-card.component.d.ts +26 -0
  125. package/src/lib/components/ai-site-seo-start-card.component.js +178 -0
  126. package/src/lib/components/ai-site-seo-start-card.component.js.map +1 -0
  127. package/src/lib/components/ai-site-start-card.component.d.ts +19 -0
  128. package/src/lib/components/ai-site-start-card.component.js +348 -0
  129. package/src/lib/components/ai-site-start-card.component.js.map +1 -0
  130. package/src/lib/components/ai-template-collection-field.component.d.ts +32 -0
  131. package/src/lib/components/ai-template-collection-field.component.js +63 -0
  132. package/src/lib/components/ai-template-collection-field.component.js.map +1 -0
  133. package/src/lib/components/ai-theme-proposal-card.component.d.ts +6 -0
  134. package/src/lib/components/ai-theme-proposal-card.component.js +619 -0
  135. package/src/lib/components/ai-theme-proposal-card.component.js.map +1 -0
  136. package/src/lib/components/ai-usage-strip.component.d.ts +27 -0
  137. package/src/lib/components/ai-usage-strip.component.js +145 -0
  138. package/src/lib/components/ai-usage-strip.component.js.map +1 -0
  139. package/src/lib/components/assist-edit-canvas.d.ts +169 -0
  140. package/src/lib/components/assist-edit-canvas.js +636 -0
  141. package/src/lib/components/assist-edit-canvas.js.map +1 -0
  142. package/src/lib/components/assist-edit-card.component.d.ts +16 -0
  143. package/src/lib/components/assist-edit-card.component.js +181 -0
  144. package/src/lib/components/assist-edit-card.component.js.map +1 -0
  145. package/src/lib/components/assist-jobs-drawer.component.d.ts +72 -0
  146. package/src/lib/components/assist-jobs-drawer.component.js +626 -0
  147. package/src/lib/components/assist-jobs-drawer.component.js.map +1 -0
  148. package/src/lib/components/assist-panel.component.d.ts +136 -0
  149. package/src/lib/components/assist-panel.component.js +1099 -0
  150. package/src/lib/components/assist-panel.component.js.map +1 -0
  151. package/src/lib/components/assist-signals-page.component.d.ts +3 -0
  152. package/src/lib/components/assist-signals-page.component.js +1017 -0
  153. package/src/lib/components/assist-signals-page.component.js.map +1 -0
  154. package/src/lib/components/besigner-ai-controls.component.d.ts +29 -0
  155. package/src/lib/components/besigner-ai-controls.component.js +81 -0
  156. package/src/lib/components/besigner-ai-controls.component.js.map +1 -0
  157. package/src/lib/components/billing-ai-allotments.component.d.ts +36 -0
  158. package/src/lib/components/billing-ai-allotments.component.js +486 -0
  159. package/src/lib/components/billing-ai-allotments.component.js.map +1 -0
  160. package/src/lib/components/billing-ai-top-users.component.d.ts +44 -0
  161. package/src/lib/components/billing-ai-top-users.component.js +304 -0
  162. package/src/lib/components/billing-ai-top-users.component.js.map +1 -0
  163. package/src/lib/components/billing-assist-overage-card.component.d.ts +69 -0
  164. package/src/lib/components/billing-assist-overage-card.component.js +437 -0
  165. package/src/lib/components/billing-assist-overage-card.component.js.map +1 -0
  166. package/src/lib/components/host-ai-allotments.component.d.ts +40 -0
  167. package/src/lib/components/host-ai-allotments.component.js +239 -0
  168. package/src/lib/components/host-ai-allotments.component.js.map +1 -0
  169. package/src/lib/components/member-ai-allotment-card.component.d.ts +28 -0
  170. package/src/lib/components/member-ai-allotment-card.component.js +172 -0
  171. package/src/lib/components/member-ai-allotment-card.component.js.map +1 -0
  172. package/src/lib/components/member-ai-usage-card.component.d.ts +28 -0
  173. package/src/lib/components/member-ai-usage-card.component.js +240 -0
  174. package/src/lib/components/member-ai-usage-card.component.js.map +1 -0
  175. package/src/lib/components/staff-org-ai-card.component.d.ts +17 -0
  176. package/src/lib/components/staff-org-ai-card.component.js +739 -0
  177. package/src/lib/components/staff-org-ai-card.component.js.map +1 -0
  178. package/src/lib/components/staff-org-usage-ai-columns.component.d.ts +41 -0
  179. package/src/lib/components/staff-org-usage-ai-columns.component.js +65 -0
  180. package/src/lib/components/staff-org-usage-ai-columns.component.js.map +1 -0
  181. package/src/lib/components/staff-orgs-ai-spend-column.component.d.ts +28 -0
  182. package/src/lib/components/staff-orgs-ai-spend-column.component.js +89 -0
  183. package/src/lib/components/staff-orgs-ai-spend-column.component.js.map +1 -0
  184. package/src/lib/components/staff-user-ai-usage-card.component.d.ts +27 -0
  185. package/src/lib/components/staff-user-ai-usage-card.component.js +183 -0
  186. package/src/lib/components/staff-user-ai-usage-card.component.js.map +1 -0
  187. package/src/lib/components/use-ai-allotments.d.ts +49 -0
  188. package/src/lib/components/use-ai-allotments.js +171 -0
  189. package/src/lib/components/use-ai-allotments.js.map +1 -0
  190. package/src/lib/components/use-ai-crm-answer.d.ts +50 -0
  191. package/src/lib/components/use-ai-crm-answer.js +220 -0
  192. package/src/lib/components/use-ai-crm-answer.js.map +1 -0
  193. package/src/lib/components/use-ai-job-run.d.ts +51 -0
  194. package/src/lib/components/use-ai-job-run.js +176 -0
  195. package/src/lib/components/use-ai-job-run.js.map +1 -0
  196. package/src/lib/components/use-ai-model-choice.d.ts +47 -0
  197. package/src/lib/components/use-ai-model-choice.js +150 -0
  198. package/src/lib/components/use-ai-model-choice.js.map +1 -0
  199. package/src/lib/components/use-ai-products-jobs.d.ts +36 -0
  200. package/src/lib/components/use-ai-products-jobs.js +190 -0
  201. package/src/lib/components/use-ai-products-jobs.js.map +1 -0
  202. package/src/lib/components/use-ai-usage-meter.d.ts +11 -0
  203. package/src/lib/components/use-ai-usage-meter.js +96 -0
  204. package/src/lib/components/use-ai-usage-meter.js.map +1 -0
  205. package/src/lib/components/use-org-ai-usage.d.ts +42 -0
  206. package/src/lib/components/use-org-ai-usage.js +181 -0
  207. package/src/lib/components/use-org-ai-usage.js.map +1 -0
  208. package/src/lib/components/use-staff-orgs-ai-spend.d.ts +18 -0
  209. package/src/lib/components/use-staff-orgs-ai-spend.js +127 -0
  210. package/src/lib/components/use-staff-orgs-ai-spend.js.map +1 -0
  211. package/src/lib/constants.d.ts +24 -0
  212. package/src/lib/constants.js +23 -0
  213. package/src/lib/constants.js.map +1 -0
  214. package/src/lib/declarations.d.ts +48 -0
  215. package/src/lib/declarations.js +129 -0
  216. package/src/lib/declarations.js.map +1 -0
  217. package/src/lib/declarations.server.d.ts +35 -0
  218. package/src/lib/declarations.server.js +138 -0
  219. package/src/lib/declarations.server.js.map +1 -0
  220. package/src/lib/insights/ai-figure-readers.d.ts +90 -0
  221. package/src/lib/insights/ai-figure-readers.js +863 -0
  222. package/src/lib/insights/ai-figure-readers.js.map +1 -0
  223. package/src/lib/insights/ai-insight-digest.d.ts +165 -0
  224. package/src/lib/insights/ai-insight-digest.js +363 -0
  225. package/src/lib/insights/ai-insight-digest.js.map +1 -0
  226. package/src/lib/insights/ai-insight-readers.d.ts +71 -0
  227. package/src/lib/insights/ai-insight-readers.js +141 -0
  228. package/src/lib/insights/ai-insight-readers.js.map +1 -0
  229. package/src/lib/jobs/ai-crm-access.d.ts +61 -0
  230. package/src/lib/jobs/ai-crm-access.js +94 -0
  231. package/src/lib/jobs/ai-crm-access.js.map +1 -0
  232. package/src/lib/jobs/ai-email-bindings.d.ts +97 -0
  233. package/src/lib/jobs/ai-email-bindings.js +147 -0
  234. package/src/lib/jobs/ai-email-bindings.js.map +1 -0
  235. package/src/lib/jobs/ai-job-admission.d.ts +82 -0
  236. package/src/lib/jobs/ai-job-admission.js +45 -0
  237. package/src/lib/jobs/ai-job-admission.js.map +1 -0
  238. package/src/lib/jobs/ai-job-budget.d.ts +167 -0
  239. package/src/lib/jobs/ai-job-budget.js +161 -0
  240. package/src/lib/jobs/ai-job-budget.js.map +1 -0
  241. package/src/lib/jobs/ai-job-campaign-step.d.ts +108 -0
  242. package/src/lib/jobs/ai-job-campaign-step.js +340 -0
  243. package/src/lib/jobs/ai-job-campaign-step.js.map +1 -0
  244. package/src/lib/jobs/ai-job-component-checks.d.ts +74 -0
  245. package/src/lib/jobs/ai-job-component-checks.js +442 -0
  246. package/src/lib/jobs/ai-job-component-checks.js.map +1 -0
  247. package/src/lib/jobs/ai-job-component-step.d.ts +75 -0
  248. package/src/lib/jobs/ai-job-component-step.js +262 -0
  249. package/src/lib/jobs/ai-job-component-step.js.map +1 -0
  250. package/src/lib/jobs/ai-job-crm-step.d.ts +192 -0
  251. package/src/lib/jobs/ai-job-crm-step.js +734 -0
  252. package/src/lib/jobs/ai-job-crm-step.js.map +1 -0
  253. package/src/lib/jobs/ai-job-draft-ids.d.ts +62 -0
  254. package/src/lib/jobs/ai-job-draft-ids.js +132 -0
  255. package/src/lib/jobs/ai-job-draft-ids.js.map +1 -0
  256. package/src/lib/jobs/ai-job-drafts.d.ts +304 -0
  257. package/src/lib/jobs/ai-job-drafts.js +557 -0
  258. package/src/lib/jobs/ai-job-drafts.js.map +1 -0
  259. package/src/lib/jobs/ai-job-email-step.d.ts +195 -0
  260. package/src/lib/jobs/ai-job-email-step.js +547 -0
  261. package/src/lib/jobs/ai-job-email-step.js.map +1 -0
  262. package/src/lib/jobs/ai-job-experiment-step.d.ts +105 -0
  263. package/src/lib/jobs/ai-job-experiment-step.js +445 -0
  264. package/src/lib/jobs/ai-job-experiment-step.js.map +1 -0
  265. package/src/lib/jobs/ai-job-form-step.d.ts +250 -0
  266. package/src/lib/jobs/ai-job-form-step.js +634 -0
  267. package/src/lib/jobs/ai-job-form-step.js.map +1 -0
  268. package/src/lib/jobs/ai-job-generation.d.ts +114 -0
  269. package/src/lib/jobs/ai-job-generation.js +384 -0
  270. package/src/lib/jobs/ai-job-generation.js.map +1 -0
  271. package/src/lib/jobs/ai-job-insight-budget.d.ts +41 -0
  272. package/src/lib/jobs/ai-job-insight-budget.js +46 -0
  273. package/src/lib/jobs/ai-job-insight-budget.js.map +1 -0
  274. package/src/lib/jobs/ai-job-insight-step.d.ts +58 -0
  275. package/src/lib/jobs/ai-job-insight-step.js +350 -0
  276. package/src/lib/jobs/ai-job-insight-step.js.map +1 -0
  277. package/src/lib/jobs/ai-job-layout-step.d.ts +103 -0
  278. package/src/lib/jobs/ai-job-layout-step.js +340 -0
  279. package/src/lib/jobs/ai-job-layout-step.js.map +1 -0
  280. package/src/lib/jobs/ai-job-page-budget.d.ts +57 -0
  281. package/src/lib/jobs/ai-job-page-budget.js +60 -0
  282. package/src/lib/jobs/ai-job-page-budget.js.map +1 -0
  283. package/src/lib/jobs/ai-job-page-sections.d.ts +150 -0
  284. package/src/lib/jobs/ai-job-page-sections.js +450 -0
  285. package/src/lib/jobs/ai-job-page-sections.js.map +1 -0
  286. package/src/lib/jobs/ai-job-page-step.d.ts +198 -0
  287. package/src/lib/jobs/ai-job-page-step.js +667 -0
  288. package/src/lib/jobs/ai-job-page-step.js.map +1 -0
  289. package/src/lib/jobs/ai-job-plan-conformance.d.ts +107 -0
  290. package/src/lib/jobs/ai-job-plan-conformance.js +164 -0
  291. package/src/lib/jobs/ai-job-plan-conformance.js.map +1 -0
  292. package/src/lib/jobs/ai-job-plan-step.d.ts +196 -0
  293. package/src/lib/jobs/ai-job-plan-step.js +458 -0
  294. package/src/lib/jobs/ai-job-plan-step.js.map +1 -0
  295. package/src/lib/jobs/ai-job-plugin-drafts.d.ts +76 -0
  296. package/src/lib/jobs/ai-job-plugin-drafts.js +91 -0
  297. package/src/lib/jobs/ai-job-plugin-drafts.js.map +1 -0
  298. package/src/lib/jobs/ai-job-products-step.d.ts +106 -0
  299. package/src/lib/jobs/ai-job-products-step.js +436 -0
  300. package/src/lib/jobs/ai-job-products-step.js.map +1 -0
  301. package/src/lib/jobs/ai-job-seo-budget.d.ts +52 -0
  302. package/src/lib/jobs/ai-job-seo-budget.js +63 -0
  303. package/src/lib/jobs/ai-job-seo-budget.js.map +1 -0
  304. package/src/lib/jobs/ai-job-seo-step.d.ts +145 -0
  305. package/src/lib/jobs/ai-job-seo-step.js +809 -0
  306. package/src/lib/jobs/ai-job-seo-step.js.map +1 -0
  307. package/src/lib/jobs/ai-job-site-step.d.ts +252 -0
  308. package/src/lib/jobs/ai-job-site-step.js +538 -0
  309. package/src/lib/jobs/ai-job-site-step.js.map +1 -0
  310. package/src/lib/jobs/ai-job-template-step.d.ts +105 -0
  311. package/src/lib/jobs/ai-job-template-step.js +391 -0
  312. package/src/lib/jobs/ai-job-template-step.js.map +1 -0
  313. package/src/lib/jobs/ai-job-text-step.d.ts +125 -0
  314. package/src/lib/jobs/ai-job-text-step.js +128 -0
  315. package/src/lib/jobs/ai-job-text-step.js.map +1 -0
  316. package/src/lib/jobs/ai-job-theme-budget.d.ts +38 -0
  317. package/src/lib/jobs/ai-job-theme-budget.js +43 -0
  318. package/src/lib/jobs/ai-job-theme-budget.js.map +1 -0
  319. package/src/lib/jobs/ai-job-theme-step.d.ts +115 -0
  320. package/src/lib/jobs/ai-job-theme-step.js +337 -0
  321. package/src/lib/jobs/ai-job-theme-step.js.map +1 -0
  322. package/src/lib/jobs/ai-job-workflow-step.d.ts +139 -0
  323. package/src/lib/jobs/ai-job-workflow-step.js +530 -0
  324. package/src/lib/jobs/ai-job-workflow-step.js.map +1 -0
  325. package/src/lib/jobs/ai-jobs-beat.d.ts +78 -0
  326. package/src/lib/jobs/ai-jobs-beat.js +93 -0
  327. package/src/lib/jobs/ai-jobs-beat.js.map +1 -0
  328. package/src/lib/jobs/ai-jobs-pause.d.ts +38 -0
  329. package/src/lib/jobs/ai-jobs-pause.js +45 -0
  330. package/src/lib/jobs/ai-jobs-pause.js.map +1 -0
  331. package/src/lib/jobs/ai-jobs.d.ts +558 -0
  332. package/src/lib/jobs/ai-jobs.js +1410 -0
  333. package/src/lib/jobs/ai-jobs.js.map +1 -0
  334. package/src/lib/jobs/ai-media-asset-server.d.ts +34 -0
  335. package/src/lib/jobs/ai-media-asset-server.js +34 -0
  336. package/src/lib/jobs/ai-media-asset-server.js.map +1 -0
  337. package/src/lib/jobs/ai-media-asset.d.ts +59 -0
  338. package/src/lib/jobs/ai-media-asset.js +86 -0
  339. package/src/lib/jobs/ai-media-asset.js.map +1 -0
  340. package/src/lib/jobs/ai-product-image.d.ts +78 -0
  341. package/src/lib/jobs/ai-product-image.js +113 -0
  342. package/src/lib/jobs/ai-product-image.js.map +1 -0
  343. package/src/lib/jobs/ai-theme-brand-inputs.d.ts +125 -0
  344. package/src/lib/jobs/ai-theme-brand-inputs.js +378 -0
  345. package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -0
  346. package/src/lib/jobs/ai-theme-brand-server.d.ts +33 -0
  347. package/src/lib/jobs/ai-theme-brand-server.js +33 -0
  348. package/src/lib/jobs/ai-theme-brand-server.js.map +1 -0
  349. package/src/lib/jobs/ai-workflow-records.d.ts +84 -0
  350. package/src/lib/jobs/ai-workflow-records.js +158 -0
  351. package/src/lib/jobs/ai-workflow-records.js.map +1 -0
  352. package/src/lib/jobs/fixtures/ai-free-page-built-recording.d.ts +31 -0
  353. package/src/lib/jobs/fixtures/ai-free-page-built-recording.js +367 -0
  354. package/src/lib/jobs/fixtures/ai-free-page-built-recording.js.map +1 -0
  355. package/src/lib/jobs/fixtures/ai-free-page-recording.d.ts +69 -0
  356. package/src/lib/jobs/fixtures/ai-free-page-recording.js +442 -0
  357. package/src/lib/jobs/fixtures/ai-free-page-recording.js.map +1 -0
  358. package/src/lib/jobs/fixtures/ai-page-briefs.d.ts +146 -0
  359. package/src/lib/jobs/fixtures/ai-page-briefs.js +1850 -0
  360. package/src/lib/jobs/fixtures/ai-page-briefs.js.map +1 -0
  361. package/src/lib/model/ai-allotments.d.ts +208 -0
  362. package/src/lib/model/ai-allotments.js +269 -0
  363. package/src/lib/model/ai-allotments.js.map +1 -0
  364. package/src/lib/model/ai-automation-draft.d.ts +74 -0
  365. package/src/lib/model/ai-automation-draft.js +310 -0
  366. package/src/lib/model/ai-automation-draft.js.map +1 -0
  367. package/src/lib/model/ai-automation-outline.d.ts +50 -0
  368. package/src/lib/model/ai-automation-outline.js +262 -0
  369. package/src/lib/model/ai-automation-outline.js.map +1 -0
  370. package/src/lib/model/ai-build-plan.d.ts +197 -0
  371. package/src/lib/model/ai-build-plan.js +438 -0
  372. package/src/lib/model/ai-build-plan.js.map +1 -0
  373. package/src/lib/model/ai-crm.d.ts +237 -0
  374. package/src/lib/model/ai-crm.js +225 -0
  375. package/src/lib/model/ai-crm.js.map +1 -0
  376. package/src/lib/model/ai-experiment-proposal.d.ts +68 -0
  377. package/src/lib/model/ai-experiment-proposal.js +146 -0
  378. package/src/lib/model/ai-experiment-proposal.js.map +1 -0
  379. package/src/lib/model/ai-experiment.d.ts +309 -0
  380. package/src/lib/model/ai-experiment.js +395 -0
  381. package/src/lib/model/ai-experiment.js.map +1 -0
  382. package/src/lib/model/ai-insight.d.ts +178 -0
  383. package/src/lib/model/ai-insight.js +201 -0
  384. package/src/lib/model/ai-insight.js.map +1 -0
  385. package/src/lib/model/ai-jobs.types.d.ts +412 -0
  386. package/src/lib/model/ai-jobs.types.js +42 -0
  387. package/src/lib/model/ai-jobs.types.js.map +1 -0
  388. package/src/lib/model/ai-page-job.d.ts +92 -0
  389. package/src/lib/model/ai-page-job.js +159 -0
  390. package/src/lib/model/ai-page-job.js.map +1 -0
  391. package/src/lib/model/ai-permissions.d.ts +49 -0
  392. package/src/lib/model/ai-permissions.js +97 -0
  393. package/src/lib/model/ai-permissions.js.map +1 -0
  394. package/src/lib/model/ai-plan-capabilities.d.ts +139 -0
  395. package/src/lib/model/ai-plan-capabilities.js +149 -0
  396. package/src/lib/model/ai-plan-capabilities.js.map +1 -0
  397. package/src/lib/model/ai-products.d.ts +251 -0
  398. package/src/lib/model/ai-products.js +253 -0
  399. package/src/lib/model/ai-products.js.map +1 -0
  400. package/src/lib/model/ai-seo.d.ts +208 -0
  401. package/src/lib/model/ai-seo.js +150 -0
  402. package/src/lib/model/ai-seo.js.map +1 -0
  403. package/src/lib/model/ai-site-inventory.d.ts +164 -0
  404. package/src/lib/model/ai-site-inventory.js +145 -0
  405. package/src/lib/model/ai-site-inventory.js.map +1 -0
  406. package/src/lib/model/ai-site-job.d.ts +247 -0
  407. package/src/lib/model/ai-site-job.js +314 -0
  408. package/src/lib/model/ai-site-job.js.map +1 -0
  409. package/src/lib/model/ai-site-start-seo.d.ts +103 -0
  410. package/src/lib/model/ai-site-start-seo.js +154 -0
  411. package/src/lib/model/ai-site-start-seo.js.map +1 -0
  412. package/src/lib/model/ai-site-start.d.ts +122 -0
  413. package/src/lib/model/ai-site-start.js +159 -0
  414. package/src/lib/model/ai-site-start.js.map +1 -0
  415. package/src/lib/model/ai-site-switch.d.ts +56 -0
  416. package/src/lib/model/ai-site-switch.js +73 -0
  417. package/src/lib/model/ai-site-switch.js.map +1 -0
  418. package/src/lib/model/ai-storefront-claims.d.ts +70 -0
  419. package/src/lib/model/ai-storefront-claims.js +130 -0
  420. package/src/lib/model/ai-storefront-claims.js.map +1 -0
  421. package/src/lib/model/ai-template-subjects.d.ts +82 -0
  422. package/src/lib/model/ai-template-subjects.js +136 -0
  423. package/src/lib/model/ai-template-subjects.js.map +1 -0
  424. package/src/lib/model/ai-theme-proposal.d.ts +210 -0
  425. package/src/lib/model/ai-theme-proposal.js +506 -0
  426. package/src/lib/model/ai-theme-proposal.js.map +1 -0
  427. package/src/lib/model/ai-tokens.d.ts +96 -0
  428. package/src/lib/model/ai-tokens.js +117 -0
  429. package/src/lib/model/ai-tokens.js.map +1 -0
  430. package/src/lib/model/ai-usage-by-user.d.ts +120 -0
  431. package/src/lib/model/ai-usage-by-user.js +139 -0
  432. package/src/lib/model/ai-usage-by-user.js.map +1 -0
  433. package/src/lib/model/ai-workflow-job.d.ts +111 -0
  434. package/src/lib/model/ai-workflow-job.js +183 -0
  435. package/src/lib/model/ai-workflow-job.js.map +1 -0
  436. package/src/lib/model/assist-edit.d.ts +261 -0
  437. package/src/lib/model/assist-edit.js +175 -0
  438. package/src/lib/model/assist-edit.js.map +1 -0
  439. package/src/lib/plugin-config.d.ts +33 -0
  440. package/src/lib/plugin-config.js +118 -0
  441. package/src/lib/plugin-config.js.map +1 -0
  442. package/src/lib/plugin.d.ts +30 -0
  443. package/src/lib/plugin.js +525 -0
  444. package/src/lib/plugin.js.map +1 -0
  445. package/src/lib/providers/anthropic.d.ts +84 -0
  446. package/src/lib/providers/anthropic.js +432 -0
  447. package/src/lib/providers/anthropic.js.map +1 -0
  448. package/src/lib/providers/catalog.d.ts +197 -0
  449. package/src/lib/providers/catalog.js +312 -0
  450. package/src/lib/providers/catalog.js.map +1 -0
  451. package/src/lib/providers/contract.d.ts +464 -0
  452. package/src/lib/providers/contract.js +274 -0
  453. package/src/lib/providers/contract.js.map +1 -0
  454. package/src/lib/providers/model-choice.d.ts +119 -0
  455. package/src/lib/providers/model-choice.js +416 -0
  456. package/src/lib/providers/model-choice.js.map +1 -0
  457. package/src/lib/providers/openai-compatible.d.ts +58 -0
  458. package/src/lib/providers/openai-compatible.js +361 -0
  459. package/src/lib/providers/openai-compatible.js.map +1 -0
  460. package/src/lib/providers/registry.d.ts +49 -0
  461. package/src/lib/providers/registry.js +71 -0
  462. package/src/lib/providers/registry.js.map +1 -0
  463. package/src/lib/providers/routing.d.ts +98 -0
  464. package/src/lib/providers/routing.js +450 -0
  465. package/src/lib/providers/routing.js.map +1 -0
  466. package/src/lib/runtime/ai-abuse-guards.d.ts +113 -0
  467. package/src/lib/runtime/ai-abuse-guards.js +148 -0
  468. package/src/lib/runtime/ai-abuse-guards.js.map +1 -0
  469. package/src/lib/runtime/ai-component-bindings.d.ts +67 -0
  470. package/src/lib/runtime/ai-component-bindings.js +106 -0
  471. package/src/lib/runtime/ai-component-bindings.js.map +1 -0
  472. package/src/lib/runtime/ai-device-audit.d.ts +109 -0
  473. package/src/lib/runtime/ai-device-audit.js +97 -0
  474. package/src/lib/runtime/ai-device-audit.js.map +1 -0
  475. package/src/lib/runtime/ai-doctrine-validators.d.ts +720 -0
  476. package/src/lib/runtime/ai-doctrine-validators.js +3133 -0
  477. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -0
  478. package/src/lib/runtime/ai-doctrine.d.ts +372 -0
  479. package/src/lib/runtime/ai-doctrine.js +944 -0
  480. package/src/lib/runtime/ai-doctrine.js.map +1 -0
  481. package/src/lib/runtime/ai-eval-live.d.ts +321 -0
  482. package/src/lib/runtime/ai-eval-live.js +1257 -0
  483. package/src/lib/runtime/ai-eval-live.js.map +1 -0
  484. package/src/lib/runtime/ai-eval-memory-firestore.d.ts +51 -0
  485. package/src/lib/runtime/ai-eval-memory-firestore.js +183 -0
  486. package/src/lib/runtime/ai-eval-memory-firestore.js.map +1 -0
  487. package/src/lib/runtime/ai-eval.d.ts +441 -0
  488. package/src/lib/runtime/ai-eval.js +1151 -0
  489. package/src/lib/runtime/ai-eval.js.map +1 -0
  490. package/src/lib/runtime/ai-gate.d.ts +130 -0
  491. package/src/lib/runtime/ai-gate.js +272 -0
  492. package/src/lib/runtime/ai-gate.js.map +1 -0
  493. package/src/lib/runtime/ai-generation-bounds.d.ts +24 -0
  494. package/src/lib/runtime/ai-generation-bounds.js +23 -0
  495. package/src/lib/runtime/ai-generation-bounds.js.map +1 -0
  496. package/src/lib/runtime/ai-insight-check.d.ts +76 -0
  497. package/src/lib/runtime/ai-insight-check.js +281 -0
  498. package/src/lib/runtime/ai-insight-check.js.map +1 -0
  499. package/src/lib/runtime/ai-node-tree.d.ts +181 -0
  500. package/src/lib/runtime/ai-node-tree.js +931 -0
  501. package/src/lib/runtime/ai-node-tree.js.map +1 -0
  502. package/src/lib/runtime/ai-page-links.d.ts +79 -0
  503. package/src/lib/runtime/ai-page-links.js +135 -0
  504. package/src/lib/runtime/ai-page-links.js.map +1 -0
  505. package/src/lib/runtime/ai-palette.d.ts +252 -0
  506. package/src/lib/runtime/ai-palette.generated.d.ts +34 -0
  507. package/src/lib/runtime/ai-palette.generated.js +5263 -0
  508. package/src/lib/runtime/ai-palette.generated.js.map +1 -0
  509. package/src/lib/runtime/ai-palette.js +187 -0
  510. package/src/lib/runtime/ai-palette.js.map +1 -0
  511. package/src/lib/runtime/ai-products-generation.d.ts +107 -0
  512. package/src/lib/runtime/ai-products-generation.js +250 -0
  513. package/src/lib/runtime/ai-products-generation.js.map +1 -0
  514. package/src/lib/runtime/ai-repeated-items.d.ts +95 -0
  515. package/src/lib/runtime/ai-repeated-items.js +397 -0
  516. package/src/lib/runtime/ai-repeated-items.js.map +1 -0
  517. package/src/lib/runtime/ai-runtime.d.ts +148 -0
  518. package/src/lib/runtime/ai-runtime.js +237 -0
  519. package/src/lib/runtime/ai-runtime.js.map +1 -0
  520. package/src/lib/runtime/ai-template-examples.d.ts +71 -0
  521. package/src/lib/runtime/ai-template-examples.js +135 -0
  522. package/src/lib/runtime/ai-template-examples.js.map +1 -0
  523. package/src/lib/runtime/assist-answer-cache.d.ts +80 -0
  524. package/src/lib/runtime/assist-answer-cache.js +184 -0
  525. package/src/lib/runtime/assist-answer-cache.js.map +1 -0
  526. package/src/lib/runtime/seo-audit.d.ts +93 -0
  527. package/src/lib/runtime/seo-audit.js +260 -0
  528. package/src/lib/runtime/seo-audit.js.map +1 -0
  529. package/src/lib/runtime/seo-content-fixes.d.ts +41 -0
  530. package/src/lib/runtime/seo-content-fixes.js +168 -0
  531. package/src/lib/runtime/seo-content-fixes.js.map +1 -0
  532. package/src/lib/runtime/seo-fields.d.ts +152 -0
  533. package/src/lib/runtime/seo-fields.js +215 -0
  534. package/src/lib/runtime/seo-fields.js.map +1 -0
  535. package/src/lib/runtime/seo-page-facts.d.ts +61 -0
  536. package/src/lib/runtime/seo-page-facts.js +150 -0
  537. package/src/lib/runtime/seo-page-facts.js.map +1 -0
  538. package/src/lib/runtime/site-inventory.d.ts +63 -0
  539. package/src/lib/runtime/site-inventory.js +230 -0
  540. package/src/lib/runtime/site-inventory.js.map +1 -0
  541. package/src/lib/server/ai-admin-org.d.ts +33 -0
  542. package/src/lib/server/ai-admin-org.js +381 -0
  543. package/src/lib/server/ai-admin-org.js.map +1 -0
  544. package/src/lib/server/ai-admin-orgs-spend.d.ts +40 -0
  545. package/src/lib/server/ai-admin-orgs-spend.js +129 -0
  546. package/src/lib/server/ai-admin-orgs-spend.js.map +1 -0
  547. package/src/lib/server/ai-admin-overage.d.ts +19 -0
  548. package/src/lib/server/ai-admin-overage.js +246 -0
  549. package/src/lib/server/ai-admin-overage.js.map +1 -0
  550. package/src/lib/server/ai-admin-signals.d.ts +34 -0
  551. package/src/lib/server/ai-admin-signals.js +330 -0
  552. package/src/lib/server/ai-admin-signals.js.map +1 -0
  553. package/src/lib/server/ai-admin-user.d.ts +27 -0
  554. package/src/lib/server/ai-admin-user.js +128 -0
  555. package/src/lib/server/ai-admin-user.js.map +1 -0
  556. package/src/lib/server/ai-allotments.d.ts +27 -0
  557. package/src/lib/server/ai-allotments.js +544 -0
  558. package/src/lib/server/ai-allotments.js.map +1 -0
  559. package/src/lib/server/ai-assist-prompts.d.ts +102 -0
  560. package/src/lib/server/ai-assist-prompts.js +207 -0
  561. package/src/lib/server/ai-assist-prompts.js.map +1 -0
  562. package/src/lib/server/ai-assist.d.ts +119 -0
  563. package/src/lib/server/ai-assist.js +517 -0
  564. package/src/lib/server/ai-assist.js.map +1 -0
  565. package/src/lib/server/ai-crm-answer.d.ts +30 -0
  566. package/src/lib/server/ai-crm-answer.js +98 -0
  567. package/src/lib/server/ai-crm-answer.js.map +1 -0
  568. package/src/lib/server/ai-generate-component.d.ts +111 -0
  569. package/src/lib/server/ai-generate-component.js +643 -0
  570. package/src/lib/server/ai-generate-component.js.map +1 -0
  571. package/src/lib/server/ai-host-permissions.d.ts +46 -0
  572. package/src/lib/server/ai-host-permissions.js +204 -0
  573. package/src/lib/server/ai-host-permissions.js.map +1 -0
  574. package/src/lib/server/ai-insight-answer.d.ts +30 -0
  575. package/src/lib/server/ai-insight-answer.js +83 -0
  576. package/src/lib/server/ai-insight-answer.js.map +1 -0
  577. package/src/lib/server/ai-insight-digest-route.d.ts +30 -0
  578. package/src/lib/server/ai-insight-digest-route.js +156 -0
  579. package/src/lib/server/ai-insight-digest-route.js.map +1 -0
  580. package/src/lib/server/ai-jobs-batch.d.ts +48 -0
  581. package/src/lib/server/ai-jobs-batch.js +306 -0
  582. package/src/lib/server/ai-jobs-batch.js.map +1 -0
  583. package/src/lib/server/ai-jobs-beat-route.d.ts +36 -0
  584. package/src/lib/server/ai-jobs-beat-route.js +86 -0
  585. package/src/lib/server/ai-jobs-beat-route.js.map +1 -0
  586. package/src/lib/server/ai-jobs-cancel.d.ts +30 -0
  587. package/src/lib/server/ai-jobs-cancel.js +74 -0
  588. package/src/lib/server/ai-jobs-cancel.js.map +1 -0
  589. package/src/lib/server/ai-jobs-events-route.d.ts +31 -0
  590. package/src/lib/server/ai-jobs-events-route.js +51 -0
  591. package/src/lib/server/ai-jobs-events-route.js.map +1 -0
  592. package/src/lib/server/ai-jobs-events.d.ts +55 -0
  593. package/src/lib/server/ai-jobs-events.js +144 -0
  594. package/src/lib/server/ai-jobs-events.js.map +1 -0
  595. package/src/lib/server/ai-jobs-gate.d.ts +47 -0
  596. package/src/lib/server/ai-jobs-gate.js +106 -0
  597. package/src/lib/server/ai-jobs-gate.js.map +1 -0
  598. package/src/lib/server/ai-jobs-resume.d.ts +23 -0
  599. package/src/lib/server/ai-jobs-resume.js +209 -0
  600. package/src/lib/server/ai-jobs-resume.js.map +1 -0
  601. package/src/lib/server/ai-jobs-route.d.ts +32 -0
  602. package/src/lib/server/ai-jobs-route.js +307 -0
  603. package/src/lib/server/ai-jobs-route.js.map +1 -0
  604. package/src/lib/server/ai-models.d.ts +18 -0
  605. package/src/lib/server/ai-models.js +134 -0
  606. package/src/lib/server/ai-models.js.map +1 -0
  607. package/src/lib/server/ai-seo-apply.d.ts +53 -0
  608. package/src/lib/server/ai-seo-apply.js +294 -0
  609. package/src/lib/server/ai-seo-apply.js.map +1 -0
  610. package/src/lib/server/ai-usage.d.ts +18 -0
  611. package/src/lib/server/ai-usage.js +220 -0
  612. package/src/lib/server/ai-usage.js.map +1 -0
  613. package/src/lib/server/assist-chat.d.ts +234 -0
  614. package/src/lib/server/assist-chat.js +1446 -0
  615. package/src/lib/server/assist-chat.js.map +1 -0
  616. package/src/lib/server/assist-edit-applied.d.ts +22 -0
  617. package/src/lib/server/assist-edit-applied.js +239 -0
  618. package/src/lib/server/assist-edit-applied.js.map +1 -0
  619. package/src/lib/server/assist-edit.d.ts +124 -0
  620. package/src/lib/server/assist-edit.js +1000 -0
  621. package/src/lib/server/assist-edit.js.map +1 -0
  622. package/src/lib/server/assist-feedback.d.ts +31 -0
  623. package/src/lib/server/assist-feedback.js +115 -0
  624. package/src/lib/server/assist-feedback.js.map +1 -0
  625. package/src/lib/server/assist-view-context.d.ts +343 -0
  626. package/src/lib/server/assist-view-context.js +690 -0
  627. package/src/lib/server/assist-view-context.js.map +1 -0
  628. package/src/lib/server/billing-credits.d.ts +59 -0
  629. package/src/lib/server/billing-credits.js +146 -0
  630. package/src/lib/server/billing-credits.js.map +1 -0
  631. package/src/lib/server/billing-overage.d.ts +19 -0
  632. package/src/lib/server/billing-overage.js +337 -0
  633. package/src/lib/server/billing-overage.js.map +1 -0
  634. package/src/lib/server.d.ts +32 -0
  635. package/src/lib/server.js +265 -0
  636. package/src/lib/server.js.map +1 -0
  637. package/src/lib/subprocessors.d.ts +18 -0
  638. package/src/lib/subprocessors.js +52 -0
  639. package/src/lib/subprocessors.js.map +1 -0
  640. package/src/lib/tools/ai-component-tool.d.ts +99 -0
  641. package/src/lib/tools/ai-component-tool.js +369 -0
  642. package/src/lib/tools/ai-component-tool.js.map +1 -0
  643. package/src/lib/tools/ai-crm-tool.d.ts +106 -0
  644. package/src/lib/tools/ai-crm-tool.js +488 -0
  645. package/src/lib/tools/ai-crm-tool.js.map +1 -0
  646. package/src/lib/tools/ai-duplicate-resource-tool.d.ts +71 -0
  647. package/src/lib/tools/ai-duplicate-resource-tool.js +164 -0
  648. package/src/lib/tools/ai-duplicate-resource-tool.js.map +1 -0
  649. package/src/lib/tools/ai-experiment-tool.d.ts +40 -0
  650. package/src/lib/tools/ai-experiment-tool.js +155 -0
  651. package/src/lib/tools/ai-experiment-tool.js.map +1 -0
  652. package/src/lib/tools/ai-insight-tool.d.ts +46 -0
  653. package/src/lib/tools/ai-insight-tool.js +200 -0
  654. package/src/lib/tools/ai-insight-tool.js.map +1 -0
  655. package/src/lib/tools/ai-inventory-lookup-tool.d.ts +86 -0
  656. package/src/lib/tools/ai-inventory-lookup-tool.js +164 -0
  657. package/src/lib/tools/ai-inventory-lookup-tool.js.map +1 -0
  658. package/src/lib/tools/ai-products-tool.d.ts +65 -0
  659. package/src/lib/tools/ai-products-tool.js +644 -0
  660. package/src/lib/tools/ai-products-tool.js.map +1 -0
  661. package/src/lib/tools/ai-seo-tool.d.ts +162 -0
  662. package/src/lib/tools/ai-seo-tool.js +546 -0
  663. package/src/lib/tools/ai-seo-tool.js.map +1 -0
  664. package/src/lib/tools/ai-theme-tool.d.ts +101 -0
  665. package/src/lib/tools/ai-theme-tool.js +562 -0
  666. package/src/lib/tools/ai-theme-tool.js.map +1 -0
  667. package/src/lib/tools/ai-workflow-tool.d.ts +166 -0
  668. package/src/lib/tools/ai-workflow-tool.js +860 -0
  669. package/src/lib/tools/ai-workflow-tool.js.map +1 -0
  670. package/src/lib/usage/ai-allotment-alerts.d.ts +72 -0
  671. package/src/lib/usage/ai-allotment-alerts.js +157 -0
  672. package/src/lib/usage/ai-allotment-alerts.js.map +1 -0
  673. package/src/lib/usage/ai-allotments.d.ts +125 -0
  674. package/src/lib/usage/ai-allotments.js +239 -0
  675. package/src/lib/usage/ai-allotments.js.map +1 -0
  676. package/src/lib/usage/ai-model-sample.d.ts +36 -0
  677. package/src/lib/usage/ai-model-sample.js +68 -0
  678. package/src/lib/usage/ai-model-sample.js.map +1 -0
  679. package/src/lib/usage/ai-usage-alerts.d.ts +55 -0
  680. package/src/lib/usage/ai-usage-alerts.js +114 -0
  681. package/src/lib/usage/ai-usage-alerts.js.map +1 -0
  682. package/src/lib/usage/ai-usage-by-user.d.ts +161 -0
  683. package/src/lib/usage/ai-usage-by-user.js +211 -0
  684. package/src/lib/usage/ai-usage-by-user.js.map +1 -0
  685. package/src/lib/usage/ai-usage-eraser.d.ts +29 -0
  686. package/src/lib/usage/ai-usage-eraser.js +40 -0
  687. package/src/lib/usage/ai-usage-eraser.js.map +1 -0
  688. package/src/lib/usage/ai-usage-meter.d.ts +39 -0
  689. package/src/lib/usage/ai-usage-meter.js +85 -0
  690. package/src/lib/usage/ai-usage-meter.js.map +1 -0
  691. package/src/lib/usage/ai-usage-wire.d.ts +184 -0
  692. package/src/lib/usage/ai-usage-wire.js +98 -0
  693. package/src/lib/usage/ai-usage-wire.js.map +1 -0
  694. package/src/lib/usage/assist-ceiling.d.ts +87 -0
  695. package/src/lib/usage/assist-ceiling.js +110 -0
  696. package/src/lib/usage/assist-ceiling.js.map +1 -0
  697. package/src/lib/usage/assist-free-taste.d.ts +225 -0
  698. package/src/lib/usage/assist-free-taste.js +308 -0
  699. package/src/lib/usage/assist-free-taste.js.map +1 -0
  700. package/src/lib/usage/assist-refusals.d.ts +69 -0
  701. package/src/lib/usage/assist-refusals.js +79 -0
  702. package/src/lib/usage/assist-refusals.js.map +1 -0
  703. package/src/lib/usage/assist-signal-mining.d.ts +375 -0
  704. package/src/lib/usage/assist-signal-mining.js +344 -0
  705. package/src/lib/usage/assist-signal-mining.js.map +1 -0
  706. package/src/lib/usage/assist-usage.d.ts +571 -0
  707. package/src/lib/usage/assist-usage.js +978 -0
  708. package/src/lib/usage/assist-usage.js.map +1 -0
  709. package/src/lib/usage/staff-org-ai.d.ts +242 -0
  710. package/src/lib/usage/staff-org-ai.js +173 -0
  711. package/src/lib/usage/staff-org-ai.js.map +1 -0
  712. package/src/lib/usage/staff-org-usage-ai.d.ts +83 -0
  713. package/src/lib/usage/staff-org-usage-ai.js +59 -0
  714. package/src/lib/usage/staff-org-usage-ai.js.map +1 -0
  715. package/src/lib/usage/staff-orgs-ai-spend.d.ts +83 -0
  716. package/src/lib/usage/staff-orgs-ai-spend.js +114 -0
  717. package/src/lib/usage/staff-orgs-ai-spend.js.map +1 -0
@@ -0,0 +1,258 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ /**
18
+ * CHARGING AI OVERAGE AS IT ACCRUES (AGL-3011).
19
+ *
20
+ * Three entry points, all of them the same three steps — claim, charge,
21
+ * settle — differing only in what makes them run:
22
+ *
23
+ * - `maybeChargeAiOverage` runs after a metered turn's batch commits, and
24
+ * charges when unbilled overage has reached the threshold.
25
+ * - `closeOutAiOverage` runs after a month ends, and bills the remainder.
26
+ * - `reconcileAiOverageCharge` runs over a claim that never reported an
27
+ * outcome, and asks Stripe what actually happened.
28
+ *
29
+ * ## Nothing here runs before the cutover
30
+ *
31
+ * Every entry point asks `aiOverageBillsByInvoice` first. With
32
+ * `AI_OVERAGE_INVOICED_FROM` unset — how it ships — each one returns without
33
+ * reading a document, and AI overage keeps billing through the monthly meter
34
+ * exactly as it does today. There is no other switch and no partial state.
35
+ *
36
+ * ## A failed charge fails only its own invoice
37
+ *
38
+ * The invoice this creates is a one-off, not a subscription invoice. A
39
+ * declined card fails it and leaves the plan untouched; the subscription
40
+ * dunning that ends by CANCELING a subscription is not reachable from here.
41
+ * What the failure does do is pause accrual, which stops the balance growing
42
+ * while it is unpaid — and leaves the workspace's included credits working.
43
+ */ import { chargeOrgUsageInvoice, findOrgUsageInvoice } from "@aglyn/tenant-data-admin/server/usage-invoice";
44
+ import { AI_PLUGIN_ID } from "../constants.js";
45
+ import { aiOverageBillsByInvoice } from "./ai-overage-cutover.js";
46
+ import { AI_OVERAGE_CHARGES_SUBCOLLECTION, claimAiOverageCharge, settleAiOverageCharge } from "./ai-overage-ledger.js";
47
+ import { pauseAiOverage } from "./ai-overage-standing-writes.js";
48
+ /**
49
+ * The Stripe product the overage line is billed against.
50
+ *
51
+ * A product rather than a bare amount because the PRODUCT carries the tax
52
+ * code the account's automatic tax computes from. Created in test mode
53
+ * first and in live mode only with the owner's yes; until the variable is
54
+ * set, no charge is attempted and the reason says so rather than failing
55
+ * against Stripe.
56
+ */ export const AI_OVERAGE_PRODUCT_ENV = 'STRIPE_PRODUCT_AI_OVERAGE';
57
+ /** The metadata key the reconcile search matches a claim on. */ export const AI_OVERAGE_CHARGE_METADATA_KEY = 'chargeId';
58
+ const NOTHING = {
59
+ charged: false,
60
+ chargeId: null,
61
+ invoiceId: null,
62
+ skipped: null,
63
+ error: null
64
+ };
65
+ /**
66
+ * The line as the customer reads it on the invoice.
67
+ *
68
+ * Credits and retail dollars only. Provider cost never reaches a customer
69
+ * surface, and an invoice is the most customer-facing surface there is.
70
+ */ export function aiOverageInvoiceDescription(claim) {
71
+ const credits = claim.credits.toLocaleString('en-US');
72
+ const month = claim.month;
73
+ return claim.kind === 'closeout' ? `AI credits past your included band — ${month} close-out (${credits} credits)` : `AI credits past your included band — ${month} (${credits} credits)`;
74
+ }
75
+ async function chargeClaim(firestore, request, claim) {
76
+ var _process_env_AI_OVERAGE_PRODUCT_ENV;
77
+ const productId = String((_process_env_AI_OVERAGE_PRODUCT_ENV = process.env[AI_OVERAGE_PRODUCT_ENV]) != null ? _process_env_AI_OVERAGE_PRODUCT_ENV : '').trim();
78
+ if (!productId) {
79
+ // The claim is released rather than left open: with no product there is
80
+ // nothing to bill against, and an open claim would block every later
81
+ // charge behind a state that only configuration can change.
82
+ await settleAiOverageCharge(firestore, request.orgId, {
83
+ chargeId: claim.chargeId,
84
+ month: claim.month,
85
+ invoiceId: null,
86
+ status: 'failed'
87
+ });
88
+ return _extends({}, NOTHING, {
89
+ chargeId: claim.chargeId,
90
+ skipped: 'no-product'
91
+ });
92
+ }
93
+ const result = await chargeOrgUsageInvoice({
94
+ orgId: request.orgId,
95
+ stripeCustomerId: request.stripeCustomerId,
96
+ productId,
97
+ amountCents: Math.round(claim.amountUsd * 100),
98
+ currency: 'usd',
99
+ description: aiOverageInvoiceDescription(claim),
100
+ metadata: {
101
+ orgId: request.orgId,
102
+ pluginId: AI_PLUGIN_ID,
103
+ kind: 'ai-overage',
104
+ [AI_OVERAGE_CHARGE_METADATA_KEY]: claim.chargeId,
105
+ month: claim.month
106
+ },
107
+ // One key per attempt, derived from the claim — which is unique per
108
+ // workspace-month-sequence — so a retry of this attempt re-reads the
109
+ // objects the first one made instead of creating a second invoice.
110
+ idempotencyKey: `aiov-${request.orgId}-${claim.chargeId}`
111
+ });
112
+ // `failed` covers both shapes of a failure, and the difference between
113
+ // them is carried by `invoiceId`: an invoice that exists keeps its claim on
114
+ // the month's unbilled total, and one that never existed releases it. The
115
+ // ledger reads that distinction rather than a second status for it.
116
+ await settleAiOverageCharge(firestore, request.orgId, {
117
+ chargeId: claim.chargeId,
118
+ month: claim.month,
119
+ invoiceId: result.invoiceId,
120
+ status: result.ok ? 'paid' : 'failed',
121
+ // What Stripe took, not what we claimed (AGL-3023). The two agree on
122
+ // every ordinary charge; where they do not, crediting the claim would
123
+ // clear a balance nobody paid.
124
+ paidUsd: result.amountPaidCents / 100
125
+ });
126
+ if (!result.ok) {
127
+ var _request_now;
128
+ // `requires_action` reads like "not yet" and is in fact "no": nobody is
129
+ // at the keyboard for an off-session charge, so a 3-D Secure challenge
130
+ // is a charge that will not complete. It pauses accrual like a decline.
131
+ await pauseAiOverage(firestore, request.orgId, {
132
+ reason: 'charge_failed',
133
+ invoiceId: result.invoiceId,
134
+ now: (_request_now = request.now) != null ? _request_now : new Date()
135
+ });
136
+ }
137
+ return {
138
+ charged: result.ok,
139
+ chargeId: claim.chargeId,
140
+ invoiceId: result.invoiceId,
141
+ skipped: null,
142
+ error: result.error
143
+ };
144
+ }
145
+ async function runCharge(firestore, request, kind) {
146
+ if (!aiOverageBillsByInvoice(request.month)) {
147
+ return _extends({}, NOTHING, {
148
+ skipped: 'before-cutover'
149
+ });
150
+ }
151
+ if (!request.stripeCustomerId) {
152
+ return _extends({}, NOTHING, {
153
+ skipped: 'no-stripe-customer'
154
+ });
155
+ }
156
+ const claim = await claimAiOverageCharge(firestore, {
157
+ orgId: request.orgId,
158
+ org: request.org,
159
+ month: request.month,
160
+ kind,
161
+ now: request.now
162
+ });
163
+ if (!claim.claimed) return _extends({}, NOTHING, {
164
+ skipped: claim.refused
165
+ });
166
+ return chargeClaim(firestore, _extends({}, request, {
167
+ stripeCustomerId: request.stripeCustomerId
168
+ }), claim.claimed);
169
+ }
170
+ /**
171
+ * Charges the workspace when its unbilled overage has reached the threshold.
172
+ *
173
+ * Called from `after()` once a metered turn's batch has committed, never on
174
+ * the request's await path: the tokens are already spent, and making a
175
+ * customer wait on a Stripe round trip to be handed an answer they have
176
+ * already paid for is the wrong trade. A charge that does not happen because
177
+ * the process ended is picked up by the reconcile sweep or by the next turn.
178
+ */ export function maybeChargeAiOverage(firestore, request) {
179
+ return runCharge(firestore, request, 'threshold');
180
+ }
181
+ /**
182
+ * Bills the remainder of a month that has ended.
183
+ *
184
+ * The month's last charge, and the only one that bills below the threshold —
185
+ * there is nothing more to accrue, so anything Stripe will accept is worth
186
+ * settling. A remainder under Stripe's minimum is left unbilled rather than
187
+ * sent as an invoice that can never be paid.
188
+ */ export function closeOutAiOverage(firestore, request) {
189
+ return runCharge(firestore, request, 'closeout');
190
+ }
191
+ /**
192
+ * Asks Stripe what became of a claim that never reported an outcome.
193
+ *
194
+ * The case is a process that died between claiming and charging, or between
195
+ * charging and recording. The claim id is on the invoice's metadata, so the
196
+ * question "did this claim ever become an invoice" has an answer even though
197
+ * this process never saw one.
198
+ *
199
+ * Stripe's search index is eventually consistent, so "not found" means NOT
200
+ * FOUND YET. A claim is only released after a grace period long enough for
201
+ * the index to have caught up; releasing early would create a second invoice
202
+ * for dollars that are already billed.
203
+ */ export async function reconcileAiOverageCharge(firestore, request, options = {}) {
204
+ var _options_graceMs;
205
+ const graceMs = (_options_graceMs = options.graceMs) != null ? _options_graceMs : 15 * 60 * 1000;
206
+ const found = await findOrgUsageInvoice({
207
+ metadataKey: AI_OVERAGE_CHARGE_METADATA_KEY,
208
+ metadataValue: request.chargeId
209
+ });
210
+ if (found.invoiceId) {
211
+ await settleAiOverageCharge(firestore, request.orgId, {
212
+ chargeId: request.chargeId,
213
+ month: request.month,
214
+ invoiceId: found.invoiceId,
215
+ status: found.status === 'paid' ? 'paid' : found.status === 'void' ? 'void' : found.status === 'uncollectible' ? 'void' : 'open',
216
+ // The found invoice's own collected figure (AGL-3023), never the
217
+ // claim: a reconcile that credited what we meant to charge would clear
218
+ // a balance on the strength of an invoice it had just looked up.
219
+ paidUsd: found.amountPaidCents / 100
220
+ });
221
+ return {
222
+ resolved: true,
223
+ invoiceId: found.invoiceId,
224
+ released: false
225
+ };
226
+ }
227
+ if (found.error) return {
228
+ resolved: false,
229
+ invoiceId: null,
230
+ released: false
231
+ };
232
+ if (request.claimedAgeMs < graceMs) {
233
+ return {
234
+ resolved: false,
235
+ invoiceId: null,
236
+ released: false
237
+ };
238
+ }
239
+ // Old enough that the index would have it. No invoice was ever created, so
240
+ // the dollars the claim reserved go back to unbilled and a later charge
241
+ // bills them.
242
+ await settleAiOverageCharge(firestore, request.orgId, {
243
+ chargeId: request.chargeId,
244
+ month: request.month,
245
+ invoiceId: null,
246
+ status: 'failed'
247
+ });
248
+ return {
249
+ resolved: true,
250
+ invoiceId: null,
251
+ released: true
252
+ };
253
+ }
254
+ /** The path a claimed charge's audit row lives at, for the sweep's query. */ export function aiOverageChargesPath(orgId) {
255
+ return `orgs/${orgId}/${AI_OVERAGE_CHARGES_SUBCOLLECTION}`;
256
+ }
257
+
258
+ //# sourceMappingURL=ai-overage-charge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/billing/ai-overage-charge.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * CHARGING AI OVERAGE AS IT ACCRUES (AGL-3011).\n *\n * Three entry points, all of them the same three steps — claim, charge,\n * settle — differing only in what makes them run:\n *\n * - `maybeChargeAiOverage` runs after a metered turn's batch commits, and\n * charges when unbilled overage has reached the threshold.\n * - `closeOutAiOverage` runs after a month ends, and bills the remainder.\n * - `reconcileAiOverageCharge` runs over a claim that never reported an\n * outcome, and asks Stripe what actually happened.\n *\n * ## Nothing here runs before the cutover\n *\n * Every entry point asks `aiOverageBillsByInvoice` first. With\n * `AI_OVERAGE_INVOICED_FROM` unset — how it ships — each one returns without\n * reading a document, and AI overage keeps billing through the monthly meter\n * exactly as it does today. There is no other switch and no partial state.\n *\n * ## A failed charge fails only its own invoice\n *\n * The invoice this creates is a one-off, not a subscription invoice. A\n * declined card fails it and leaves the plan untouched; the subscription\n * dunning that ends by CANCELING a subscription is not reachable from here.\n * What the failure does do is pause accrual, which stops the balance growing\n * while it is unpaid — and leaves the workspace's included credits working.\n */\n\nimport {\n chargeOrgUsageInvoice,\n findOrgUsageInvoice,\n} from '@aglyn/tenant-data-admin/server/usage-invoice'\nimport { AI_PLUGIN_ID } from '../constants'\nimport { aiOverageBillsByInvoice } from './ai-overage-cutover'\nimport {\n AI_OVERAGE_CHARGES_SUBCOLLECTION,\n claimAiOverageCharge,\n settleAiOverageCharge,\n type AiOverageChargeKind,\n type AiOverageClaim,\n type AiOverageClaimRefusal,\n} from './ai-overage-ledger'\nimport { pauseAiOverage } from './ai-overage-standing-writes'\nimport type { AiOverageOrg } from './ai-overage-standing'\n\n/**\n * The Stripe product the overage line is billed against.\n *\n * A product rather than a bare amount because the PRODUCT carries the tax\n * code the account's automatic tax computes from. Created in test mode\n * first and in live mode only with the owner's yes; until the variable is\n * set, no charge is attempted and the reason says so rather than failing\n * against Stripe.\n */\nexport const AI_OVERAGE_PRODUCT_ENV = 'STRIPE_PRODUCT_AI_OVERAGE'\n\n/** The metadata key the reconcile search matches a claim on. */\nexport const AI_OVERAGE_CHARGE_METADATA_KEY = 'chargeId'\n\n/** What one attempt did, for logs, the sweep's report and specs. */\nexport interface AiOverageChargeOutcome {\n charged: boolean\n chargeId: string | null\n invoiceId: string | null\n /** Why nothing was charged, when nothing was. */\n skipped:\n | AiOverageClaimRefusal\n | 'before-cutover'\n | 'no-stripe-customer'\n | 'no-product'\n | null\n /** Stripe's message when a charge was attempted and failed. */\n error: string | null\n}\n\nconst NOTHING: AiOverageChargeOutcome = {\n charged: false,\n chargeId: null,\n invoiceId: null,\n skipped: null,\n error: null,\n}\n\n/** What the caller must hand over; nothing here reads the org document. */\nexport interface AiOverageChargeRequest {\n orgId: string\n org: AiOverageOrg\n month: string\n /** The workspace's Stripe customer, resolved by the caller from billing. */\n stripeCustomerId: string | null\n now?: Date\n}\n\n/**\n * The line as the customer reads it on the invoice.\n *\n * Credits and retail dollars only. Provider cost never reaches a customer\n * surface, and an invoice is the most customer-facing surface there is.\n */\nexport function aiOverageInvoiceDescription(claim: AiOverageClaim): string {\n const credits = claim.credits.toLocaleString('en-US')\n const month = claim.month\n return claim.kind === 'closeout'\n ? `AI credits past your included band — ${month} close-out (${credits} credits)`\n : `AI credits past your included band — ${month} (${credits} credits)`\n}\n\nasync function chargeClaim(\n firestore: FirebaseFirestore.Firestore,\n request: AiOverageChargeRequest & { stripeCustomerId: string },\n claim: AiOverageClaim,\n): Promise<AiOverageChargeOutcome> {\n const productId = String(process.env[AI_OVERAGE_PRODUCT_ENV] ?? '').trim()\n if (!productId) {\n // The claim is released rather than left open: with no product there is\n // nothing to bill against, and an open claim would block every later\n // charge behind a state that only configuration can change.\n await settleAiOverageCharge(firestore, request.orgId, {\n chargeId: claim.chargeId,\n month: claim.month,\n invoiceId: null,\n status: 'failed',\n })\n return { ...NOTHING, chargeId: claim.chargeId, skipped: 'no-product' }\n }\n const result = await chargeOrgUsageInvoice({\n orgId: request.orgId,\n stripeCustomerId: request.stripeCustomerId,\n productId,\n amountCents: Math.round(claim.amountUsd * 100),\n currency: 'usd',\n description: aiOverageInvoiceDescription(claim),\n metadata: {\n orgId: request.orgId,\n pluginId: AI_PLUGIN_ID,\n kind: 'ai-overage',\n [AI_OVERAGE_CHARGE_METADATA_KEY]: claim.chargeId,\n month: claim.month,\n },\n // One key per attempt, derived from the claim — which is unique per\n // workspace-month-sequence — so a retry of this attempt re-reads the\n // objects the first one made instead of creating a second invoice.\n idempotencyKey: `aiov-${request.orgId}-${claim.chargeId}`,\n })\n // `failed` covers both shapes of a failure, and the difference between\n // them is carried by `invoiceId`: an invoice that exists keeps its claim on\n // the month's unbilled total, and one that never existed releases it. The\n // ledger reads that distinction rather than a second status for it.\n await settleAiOverageCharge(firestore, request.orgId, {\n chargeId: claim.chargeId,\n month: claim.month,\n invoiceId: result.invoiceId,\n status: result.ok ? 'paid' : 'failed',\n // What Stripe took, not what we claimed (AGL-3023). The two agree on\n // every ordinary charge; where they do not, crediting the claim would\n // clear a balance nobody paid.\n paidUsd: result.amountPaidCents / 100,\n })\n if (!result.ok) {\n // `requires_action` reads like \"not yet\" and is in fact \"no\": nobody is\n // at the keyboard for an off-session charge, so a 3-D Secure challenge\n // is a charge that will not complete. It pauses accrual like a decline.\n await pauseAiOverage(firestore, request.orgId, {\n reason: 'charge_failed',\n invoiceId: result.invoiceId,\n now: request.now ?? new Date(),\n })\n }\n return {\n charged: result.ok,\n chargeId: claim.chargeId,\n invoiceId: result.invoiceId,\n skipped: null,\n error: result.error,\n }\n}\n\nasync function runCharge(\n firestore: FirebaseFirestore.Firestore,\n request: AiOverageChargeRequest,\n kind: AiOverageChargeKind,\n): Promise<AiOverageChargeOutcome> {\n if (!aiOverageBillsByInvoice(request.month)) {\n return { ...NOTHING, skipped: 'before-cutover' }\n }\n if (!request.stripeCustomerId) {\n return { ...NOTHING, skipped: 'no-stripe-customer' }\n }\n const claim = await claimAiOverageCharge(firestore, {\n orgId: request.orgId,\n org: request.org,\n month: request.month,\n kind,\n now: request.now,\n })\n if (!claim.claimed) return { ...NOTHING, skipped: claim.refused }\n return chargeClaim(\n firestore,\n { ...request, stripeCustomerId: request.stripeCustomerId },\n claim.claimed,\n )\n}\n\n/**\n * Charges the workspace when its unbilled overage has reached the threshold.\n *\n * Called from `after()` once a metered turn's batch has committed, never on\n * the request's await path: the tokens are already spent, and making a\n * customer wait on a Stripe round trip to be handed an answer they have\n * already paid for is the wrong trade. A charge that does not happen because\n * the process ended is picked up by the reconcile sweep or by the next turn.\n */\nexport function maybeChargeAiOverage(\n firestore: FirebaseFirestore.Firestore,\n request: AiOverageChargeRequest,\n): Promise<AiOverageChargeOutcome> {\n return runCharge(firestore, request, 'threshold')\n}\n\n/**\n * Bills the remainder of a month that has ended.\n *\n * The month's last charge, and the only one that bills below the threshold —\n * there is nothing more to accrue, so anything Stripe will accept is worth\n * settling. A remainder under Stripe's minimum is left unbilled rather than\n * sent as an invoice that can never be paid.\n */\nexport function closeOutAiOverage(\n firestore: FirebaseFirestore.Firestore,\n request: AiOverageChargeRequest,\n): Promise<AiOverageChargeOutcome> {\n return runCharge(firestore, request, 'closeout')\n}\n\n/**\n * Asks Stripe what became of a claim that never reported an outcome.\n *\n * The case is a process that died between claiming and charging, or between\n * charging and recording. The claim id is on the invoice's metadata, so the\n * question \"did this claim ever become an invoice\" has an answer even though\n * this process never saw one.\n *\n * Stripe's search index is eventually consistent, so \"not found\" means NOT\n * FOUND YET. A claim is only released after a grace period long enough for\n * the index to have caught up; releasing early would create a second invoice\n * for dollars that are already billed.\n */\nexport async function reconcileAiOverageCharge(\n firestore: FirebaseFirestore.Firestore,\n request: { orgId: string; month: string; chargeId: string; claimedAgeMs: number },\n options: { graceMs?: number } = {},\n): Promise<{ resolved: boolean; invoiceId: string | null; released: boolean }> {\n const graceMs = options.graceMs ?? 15 * 60 * 1000\n const found = await findOrgUsageInvoice({\n metadataKey: AI_OVERAGE_CHARGE_METADATA_KEY,\n metadataValue: request.chargeId,\n })\n if (found.invoiceId) {\n await settleAiOverageCharge(firestore, request.orgId, {\n chargeId: request.chargeId,\n month: request.month,\n invoiceId: found.invoiceId,\n status:\n found.status === 'paid'\n ? 'paid'\n : found.status === 'void'\n ? 'void'\n : found.status === 'uncollectible'\n ? 'void'\n : 'open',\n // The found invoice's own collected figure (AGL-3023), never the\n // claim: a reconcile that credited what we meant to charge would clear\n // a balance on the strength of an invoice it had just looked up.\n paidUsd: found.amountPaidCents / 100,\n })\n return { resolved: true, invoiceId: found.invoiceId, released: false }\n }\n if (found.error) return { resolved: false, invoiceId: null, released: false }\n if (request.claimedAgeMs < graceMs) {\n return { resolved: false, invoiceId: null, released: false }\n }\n // Old enough that the index would have it. No invoice was ever created, so\n // the dollars the claim reserved go back to unbilled and a later charge\n // bills them.\n await settleAiOverageCharge(firestore, request.orgId, {\n chargeId: request.chargeId,\n month: request.month,\n invoiceId: null,\n status: 'failed',\n })\n return { resolved: true, invoiceId: null, released: true }\n}\n\n/** The path a claimed charge's audit row lives at, for the sweep's query. */\nexport function aiOverageChargesPath(orgId: string): string {\n return `orgs/${orgId}/${AI_OVERAGE_CHARGES_SUBCOLLECTION}`\n}\n"],"names":["chargeOrgUsageInvoice","findOrgUsageInvoice","AI_PLUGIN_ID","aiOverageBillsByInvoice","AI_OVERAGE_CHARGES_SUBCOLLECTION","claimAiOverageCharge","settleAiOverageCharge","pauseAiOverage","AI_OVERAGE_PRODUCT_ENV","AI_OVERAGE_CHARGE_METADATA_KEY","NOTHING","charged","chargeId","invoiceId","skipped","error","aiOverageInvoiceDescription","claim","credits","toLocaleString","month","kind","chargeClaim","firestore","request","process","productId","String","env","trim","orgId","status","result","stripeCustomerId","amountCents","Math","round","amountUsd","currency","description","metadata","pluginId","idempotencyKey","ok","paidUsd","amountPaidCents","reason","now","Date","runCharge","org","claimed","refused","maybeChargeAiOverage","closeOutAiOverage","reconcileAiOverageCharge","options","graceMs","found","metadataKey","metadataValue","resolved","released","claimedAgeMs","aiOverageChargesPath"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * CLOSING A MONTH OF AI OVERAGE (AGL-3011).
19
+ *
20
+ * Charging as usage accrues always leaves a remainder: the part of a month
21
+ * that never reached the threshold before the month ended. This settles it,
22
+ * and does the two other things a month's end is the right moment for.
23
+ *
24
+ * Run from the platform's closed-month usage sweep through the metered-line
25
+ * seam — the one job that already knows every workspace, its month and its
26
+ * Stripe customer — rather than from a cron of its own. A second schedule
27
+ * for the same fact is a second schedule to keep in step, and the sweep that
28
+ * closes the month is by definition on time for this.
29
+ *
30
+ * ## Three things, in order
31
+ *
32
+ * 1. **Reconcile.** A claim that never reported an outcome is asked about in
33
+ * Stripe, and either recorded or released. It comes first because a stuck
34
+ * open charge blocks the close-out behind it.
35
+ * 2. **Close out.** Whatever is left unbilled is invoiced, however small —
36
+ * down to Stripe's minimum, below which it is carried rather than sent as
37
+ * an invoice nobody can pay.
38
+ * 3. **Correct the ladder.** A month that ended with an AI charge unpaid is
39
+ * taken back off the workspace's qualifying months. A month in which a
40
+ * workspace both paid an invoice and left an AI charge unpaid is not
41
+ * evidence of the thing the ladder measures.
42
+ *
43
+ * Idempotent, because the sweep calls it every day the month is closed: the
44
+ * reconcile is a no-op once the charge is settled, the close-out claims
45
+ * nothing once there is nothing unbilled, and the month is dropped from the
46
+ * ladder only while it is on it.
47
+ */
48
+ import type { PluginMeteredLineMonthContext } from '@aglyn/aglyn/plugin-manager/plugin-metered-lines';
49
+ /** What the close-out did, for the sweep's log and the specs. */
50
+ export interface AiOverageCloseResult {
51
+ reconciled: number;
52
+ closedOutUsd: number;
53
+ droppedFromLadder: boolean;
54
+ }
55
+ /**
56
+ * Settles one workspace's closed month.
57
+ *
58
+ * Errors are the caller's to isolate — the registry logs and continues — but
59
+ * each step is attempted independently so one workspace's failed Stripe call
60
+ * does not cost it the ladder correction it also needed.
61
+ */
62
+ export declare function closeAiOverageMonth(context: PluginMeteredLineMonthContext, now?: Date): Promise<AiOverageCloseResult>;
@@ -0,0 +1,129 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /**
17
+ * CLOSING A MONTH OF AI OVERAGE (AGL-3011).
18
+ *
19
+ * Charging as usage accrues always leaves a remainder: the part of a month
20
+ * that never reached the threshold before the month ended. This settles it,
21
+ * and does the two other things a month's end is the right moment for.
22
+ *
23
+ * Run from the platform's closed-month usage sweep through the metered-line
24
+ * seam — the one job that already knows every workspace, its month and its
25
+ * Stripe customer — rather than from a cron of its own. A second schedule
26
+ * for the same fact is a second schedule to keep in step, and the sweep that
27
+ * closes the month is by definition on time for this.
28
+ *
29
+ * ## Three things, in order
30
+ *
31
+ * 1. **Reconcile.** A claim that never reported an outcome is asked about in
32
+ * Stripe, and either recorded or released. It comes first because a stuck
33
+ * open charge blocks the close-out behind it.
34
+ * 2. **Close out.** Whatever is left unbilled is invoiced, however small —
35
+ * down to Stripe's minimum, below which it is carried rather than sent as
36
+ * an invoice nobody can pay.
37
+ * 3. **Correct the ladder.** A month that ended with an AI charge unpaid is
38
+ * taken back off the workspace's qualifying months. A month in which a
39
+ * workspace both paid an invoice and left an AI charge unpaid is not
40
+ * evidence of the thing the ladder measures.
41
+ *
42
+ * Idempotent, because the sweep calls it every day the month is closed: the
43
+ * reconcile is a no-op once the charge is settled, the close-out claims
44
+ * nothing once there is nothing unbilled, and the month is dropped from the
45
+ * ladder only while it is on it.
46
+ */ import { closeOutAiOverage, reconcileAiOverageCharge } from "./ai-overage-charge.js";
47
+ import { AI_OVERAGE_CHARGES_SUBCOLLECTION, readAiOverageMonthLedger } from "./ai-overage-ledger.js";
48
+ import { dropAiOverageQualifyingMonth } from "./ai-overage-standing-writes.js";
49
+ import { aiOverageFirestore } from "./ai-overage-trigger.js";
50
+ /** How many of a month's charge rows the close-out will look at. */ const CHARGE_SCAN = 100;
51
+ /**
52
+ * Settles one workspace's closed month.
53
+ *
54
+ * Errors are the caller's to isolate — the registry logs and continues — but
55
+ * each step is attempted independently so one workspace's failed Stripe call
56
+ * does not cost it the ladder correction it also needed.
57
+ */ export async function closeAiOverageMonth(context, now = new Date()) {
58
+ var _usageSnapshot_data;
59
+ const firestore = aiOverageFirestore();
60
+ const orgRef = firestore.collection('orgs').doc(context.orgId);
61
+ const usageSnapshot = await orgRef.collection('assistUsage').doc(context.month).get();
62
+ const ledger = readAiOverageMonthLedger(usageSnapshot.exists ? (_usageSnapshot_data = usageSnapshot.data()) != null ? _usageSnapshot_data : null : null);
63
+ const result = {
64
+ reconciled: 0,
65
+ closedOutUsd: 0,
66
+ droppedFromLadder: false
67
+ };
68
+ // A month that never sold any overage has nothing here at all, and asking
69
+ // Stripe about it would be a round trip per workspace per day.
70
+ if (!ledger.charges && !ledger.invoicedUsd && !ledger.open) {
71
+ return result;
72
+ }
73
+ // 1. An open claim that never reported. `since` is on the open slot, so
74
+ // its age is known without a second read.
75
+ if (ledger.open) {
76
+ var _ref;
77
+ const open = usageSnapshot.get('overageInvoiceOpen');
78
+ const since = Date.parse(String((_ref = open == null ? void 0 : open.since) != null ? _ref : ''));
79
+ const claimedAgeMs = Number.isFinite(since) ? Math.max(0, now.getTime() - since) : Number.MAX_SAFE_INTEGER;
80
+ const reconciled = await reconcileAiOverageCharge(firestore, {
81
+ orgId: context.orgId,
82
+ month: context.month,
83
+ chargeId: ledger.open.chargeId,
84
+ claimedAgeMs
85
+ });
86
+ if (reconciled.resolved) result.reconciled = 1;
87
+ }
88
+ // 2. The remainder.
89
+ const closed = await closeOutAiOverage(firestore, {
90
+ orgId: context.orgId,
91
+ org: context.org,
92
+ month: context.month,
93
+ stripeCustomerId: context.stripeCustomerId,
94
+ now
95
+ });
96
+ if (closed.charged) {
97
+ var _after_data;
98
+ const after = await orgRef.collection('assistUsage').doc(context.month).get();
99
+ result.closedOutUsd = readAiOverageMonthLedger((_after_data = after.data()) != null ? _after_data : null).invoicedUsd - ledger.invoicedUsd;
100
+ }
101
+ // 3. The ladder. Read AFTER the two steps above, so a charge they settled
102
+ // is not counted as unpaid.
103
+ if (await aiOverageMonthLeftUnpaid(orgRef, context.month)) {
104
+ await dropAiOverageQualifyingMonth(firestore, context.orgId, context.month);
105
+ result.droppedFromLadder = true;
106
+ }
107
+ return result;
108
+ }
109
+ /**
110
+ * Did this month end with an AI overage charge still unpaid?
111
+ *
112
+ * `failed` and `open` both count; `void` does not — an invoice written off
113
+ * is a decision that the money is not owed, not a debt the workspace left.
114
+ * A `claimed` row that survived the reconcile above counts too: something
115
+ * claimed the money and never billed it, which is exactly the state that
116
+ * should not raise a ceiling.
117
+ */ async function aiOverageMonthLeftUnpaid(orgRef, month) {
118
+ const charges = await orgRef.collection(AI_OVERAGE_CHARGES_SUBCOLLECTION).where('month', '==', month).limit(CHARGE_SCAN).get();
119
+ return charges.docs.some((doc)=>{
120
+ var _doc_get;
121
+ return [
122
+ 'claimed',
123
+ 'open',
124
+ 'failed'
125
+ ].includes(String((_doc_get = doc.get('status')) != null ? _doc_get : ''));
126
+ });
127
+ }
128
+
129
+ //# sourceMappingURL=ai-overage-close.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/billing/ai-overage-close.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * CLOSING A MONTH OF AI OVERAGE (AGL-3011).\n *\n * Charging as usage accrues always leaves a remainder: the part of a month\n * that never reached the threshold before the month ended. This settles it,\n * and does the two other things a month's end is the right moment for.\n *\n * Run from the platform's closed-month usage sweep through the metered-line\n * seam — the one job that already knows every workspace, its month and its\n * Stripe customer — rather than from a cron of its own. A second schedule\n * for the same fact is a second schedule to keep in step, and the sweep that\n * closes the month is by definition on time for this.\n *\n * ## Three things, in order\n *\n * 1. **Reconcile.** A claim that never reported an outcome is asked about in\n * Stripe, and either recorded or released. It comes first because a stuck\n * open charge blocks the close-out behind it.\n * 2. **Close out.** Whatever is left unbilled is invoiced, however small —\n * down to Stripe's minimum, below which it is carried rather than sent as\n * an invoice nobody can pay.\n * 3. **Correct the ladder.** A month that ended with an AI charge unpaid is\n * taken back off the workspace's qualifying months. A month in which a\n * workspace both paid an invoice and left an AI charge unpaid is not\n * evidence of the thing the ladder measures.\n *\n * Idempotent, because the sweep calls it every day the month is closed: the\n * reconcile is a no-op once the charge is settled, the close-out claims\n * nothing once there is nothing unbilled, and the month is dropped from the\n * ladder only while it is on it.\n */\n\nimport type { PluginMeteredLineMonthContext } from '@aglyn/aglyn/plugin-manager/plugin-metered-lines'\nimport {\n closeOutAiOverage,\n reconcileAiOverageCharge,\n} from './ai-overage-charge'\nimport {\n AI_OVERAGE_CHARGES_SUBCOLLECTION,\n readAiOverageMonthLedger,\n} from './ai-overage-ledger'\nimport { dropAiOverageQualifyingMonth } from './ai-overage-standing-writes'\nimport { aiOverageFirestore } from './ai-overage-trigger'\n\n/** How many of a month's charge rows the close-out will look at. */\nconst CHARGE_SCAN = 100\n\n/** What the close-out did, for the sweep's log and the specs. */\nexport interface AiOverageCloseResult {\n reconciled: number\n closedOutUsd: number\n droppedFromLadder: boolean\n}\n\n/**\n * Settles one workspace's closed month.\n *\n * Errors are the caller's to isolate — the registry logs and continues — but\n * each step is attempted independently so one workspace's failed Stripe call\n * does not cost it the ladder correction it also needed.\n */\nexport async function closeAiOverageMonth(\n context: PluginMeteredLineMonthContext,\n now = new Date(),\n): Promise<AiOverageCloseResult> {\n const firestore = aiOverageFirestore()\n const orgRef = firestore.collection('orgs').doc(context.orgId)\n const usageSnapshot = await orgRef\n .collection('assistUsage')\n .doc(context.month)\n .get()\n const ledger = readAiOverageMonthLedger(\n usageSnapshot.exists ? (usageSnapshot.data() ?? null) : null,\n )\n const result: AiOverageCloseResult = {\n reconciled: 0,\n closedOutUsd: 0,\n droppedFromLadder: false,\n }\n // A month that never sold any overage has nothing here at all, and asking\n // Stripe about it would be a round trip per workspace per day.\n if (!ledger.charges && !ledger.invoicedUsd && !ledger.open) {\n return result\n }\n\n // 1. An open claim that never reported. `since` is on the open slot, so\n // its age is known without a second read.\n if (ledger.open) {\n const open = usageSnapshot.get('overageInvoiceOpen') as\n | { since?: unknown }\n | null\n | undefined\n const since = Date.parse(String(open?.since ?? ''))\n const claimedAgeMs = Number.isFinite(since)\n ? Math.max(0, now.getTime() - since)\n : Number.MAX_SAFE_INTEGER\n const reconciled = await reconcileAiOverageCharge(firestore, {\n orgId: context.orgId,\n month: context.month,\n chargeId: ledger.open.chargeId,\n claimedAgeMs,\n })\n if (reconciled.resolved) result.reconciled = 1\n }\n\n // 2. The remainder.\n const closed = await closeOutAiOverage(firestore, {\n orgId: context.orgId,\n org: context.org as never,\n month: context.month,\n stripeCustomerId: context.stripeCustomerId,\n now,\n })\n if (closed.charged) {\n const after = await orgRef.collection('assistUsage').doc(context.month).get()\n result.closedOutUsd =\n readAiOverageMonthLedger(after.data() ?? null).invoicedUsd - ledger.invoicedUsd\n }\n\n // 3. The ladder. Read AFTER the two steps above, so a charge they settled\n // is not counted as unpaid.\n if (await aiOverageMonthLeftUnpaid(orgRef, context.month)) {\n await dropAiOverageQualifyingMonth(firestore, context.orgId, context.month)\n result.droppedFromLadder = true\n }\n return result\n}\n\n/**\n * Did this month end with an AI overage charge still unpaid?\n *\n * `failed` and `open` both count; `void` does not — an invoice written off\n * is a decision that the money is not owed, not a debt the workspace left.\n * A `claimed` row that survived the reconcile above counts too: something\n * claimed the money and never billed it, which is exactly the state that\n * should not raise a ceiling.\n */\nasync function aiOverageMonthLeftUnpaid(\n orgRef: FirebaseFirestore.DocumentReference,\n month: string,\n): Promise<boolean> {\n const charges = await orgRef\n .collection(AI_OVERAGE_CHARGES_SUBCOLLECTION)\n .where('month', '==', month)\n .limit(CHARGE_SCAN)\n .get()\n return charges.docs.some((doc) =>\n ['claimed', 'open', 'failed'].includes(String(doc.get('status') ?? '')),\n )\n}\n"],"names":["closeOutAiOverage","reconcileAiOverageCharge","AI_OVERAGE_CHARGES_SUBCOLLECTION","readAiOverageMonthLedger","dropAiOverageQualifyingMonth","aiOverageFirestore","CHARGE_SCAN","closeAiOverageMonth","context","now","Date","usageSnapshot","firestore","orgRef","collection","doc","orgId","month","get","ledger","exists","data","result","reconciled","closedOutUsd","droppedFromLadder","charges","invoicedUsd","open","since","parse","String","claimedAgeMs","Number","isFinite","Math","max","getTime","MAX_SAFE_INTEGER","chargeId","resolved","closed","org","stripeCustomerId","charged","after","aiOverageMonthLeftUnpaid","where","limit","docs","some","includes"],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Core's own name for the AI overage line in the monthly usage sweep. The
19
+ * sweep asks the registry by this id; the plugin answers.
20
+ */
21
+ export declare const AI_OVERAGE_METER_LINE_ID = "assist-overage";
22
+ /** The environment variable that starts mid-period charging. */
23
+ export declare const AI_OVERAGE_INVOICED_FROM_ENV = "AI_OVERAGE_INVOICED_FROM";
24
+ /**
25
+ * The configured cutover month, or `null` when there is none.
26
+ *
27
+ * Read on every call rather than cached, so setting the variable takes
28
+ * effect without a restart and a process that started before it was set is
29
+ * not stuck a month behind.
30
+ *
31
+ * An unparseable value is `null`, not an error: a typo must leave the
32
+ * platform billing through the channel that works, not stop billing.
33
+ */
34
+ export declare function aiOverageInvoicedFrom(): string | null;
35
+ /**
36
+ * Is AI overage billed by invoice — rather than through the monthly meter —
37
+ * for this month?
38
+ *
39
+ * `YYYY-MM` is zero-padded and fixed width, so it orders identically as a
40
+ * string and as a date; the format checks are what make that true rather
41
+ * than lucky.
42
+ */
43
+ export declare function aiOverageBillsByInvoice(month: string): boolean;
44
+ /**
45
+ * Are the overage guards live for this month?
46
+ *
47
+ * The same answer as `aiOverageBillsByInvoice`, given its own name because
48
+ * it is asked for a different reason and a reader of the gate should not
49
+ * have to work out why the gate consults a billing question. If the two ever
50
+ * need to differ, this is where that would be said — and it would need a
51
+ * paragraph explaining how a workspace refused for unpaid overage is
52
+ * supposed to pay it.
53
+ */
54
+ export declare function aiOverageGuardsApply(month: string): boolean;
55
+ /**
56
+ * Claims the meter line, so the monthly sweep leaves AI overage out of the
57
+ * figure it meters from the cutover month on.
58
+ *
59
+ * Registered from the plugin's server declarations, at boot, because the
60
+ * sweep is a core cron that never loads an AI door. Idempotent by the
61
+ * registry's own rule: the same plugin re-claiming replaces its claim.
62
+ */
63
+ export declare function registerAiOverageMeteredLine(): void;