@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 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/billing/ai-overage-ledger.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 * THE OVERAGE CHARGE LEDGER (AGL-3011).\n *\n * Every dollar of AI overage a workspace is charged mid-period passes\n * through here twice: once as a CLAIM, taken in a transaction before any\n * money is asked for, and once as a SETTLEMENT, recorded after Stripe\n * answers. Nothing in this module talks to Stripe.\n *\n * ## Why claim first\n *\n * The figure that decides a charge — the month's overage — is a counter many\n * requests move. Two requests crossing the threshold a millisecond apart\n * both read \"$25 unbilled\" and would both charge for it. The claim closes\n * that: inside one transaction it moves `overageInvoicedUsd` forward by the\n * amount it is about to charge and records an open charge, so the second\n * request reads an already-claimed balance and stands down. The invoice is\n * created afterwards, outside the transaction, because a Stripe call inside\n * a Firestore transaction would be retried by the transaction.\n *\n * ## What a lost process costs\n *\n * A claim that never became an invoice leaves `overageInvoicedUsd` ahead of\n * what was billed, which UNDER-charges rather than over-charges, and leaves\n * an open charge that blocks the next one. Both are repaired by the\n * reconcile sweep, which asks Stripe whether the claim ever became an\n * invoice and either records it or releases the claim. Under-charging while\n * confused is the direction this must err in.\n *\n * ## The documents\n *\n * `orgs/{orgId}/assistUsage/{YYYY-MM}` — the month's rollup, which the\n * reservation already reads, gains four fields so the gate costs no extra\n * read: `overageInvoicedUsd`, `overagePaidUsd`, `overageCharges` and\n * `overageInvoiceOpen`.\n *\n * `orgs/{orgId}/aiOverageCharges/{chargeId}` — one row per charge, the\n * audit trail staff read and the reconcile sweep walks.\n *\n * Both are server-written: the rules allow the same readers as\n * `aiAllotments` and no writer at all.\n */\n\nimport { FieldValue } from 'firebase-admin/firestore'\nimport { assistMonthOverage } from '@aglyn/aglyn/app-utils/assist-credits'\nimport {\n AI_OVERAGE_MIN_CHARGE_USD,\n AI_OVERAGE_THRESHOLD_USD,\n aiOverageCardOnFile,\n readAiOverageStanding,\n type AiOverageOrg,\n} from './ai-overage-standing'\n\n/** The subcollection and document the standing lives at. */\nexport const AI_BILLING_SUBCOLLECTION = 'aiBilling'\nexport const AI_BILLING_STANDING_DOC = 'standing'\n/** The subcollection one row per charge lives in. */\nexport const AI_OVERAGE_CHARGES_SUBCOLLECTION = 'aiOverageCharges'\n\n/** Which sweep asked for the charge. */\nexport type AiOverageChargeKind = 'threshold' | 'closeout'\n\n/** Where a charge is in its life. */\nexport type AiOverageChargeStatus =\n | 'claimed'\n | 'open'\n | 'paid'\n | 'failed'\n | 'void'\n\n/** A claim taken, ready to be charged. */\nexport interface AiOverageClaim {\n chargeId: string\n orgId: string\n month: string\n seq: number\n kind: AiOverageChargeKind\n /** Floored to the cent — Stripe bills whole cents. */\n amountUsd: number\n /** The credits and rate the amount came from, for the audit row. */\n credits: number\n rateUsdPer1k: number | null\n}\n\n/** Why no claim was taken. Each one is a different thing to do about it. */\nexport type AiOverageClaimRefusal =\n | 'below-threshold'\n | 'charge-already-open'\n | 'no-card'\n | 'paused'\n | 'not-sold'\n\nexport type AiOverageClaimResult =\n | { claimed: AiOverageClaim; refused: null }\n | { claimed: null; refused: AiOverageClaimRefusal }\n\nfunction money(value: unknown): number {\n const number = Number(value)\n return Number.isFinite(number) && number > 0 ? number : 0\n}\n\n/** Down to the cent. Never up: a rounded-up cent is a cent never accrued. */\nexport function floorToCent(usd: number): number {\n return Math.floor(money(usd) * 100) / 100\n}\n\n/**\n * `{month}-{seq}` — readable, sortable, and unique per workspace-month.\n *\n * The id is also the Stripe idempotency key's payload and the metadata the\n * reconcile search matches on, so it must survive a URL and a Stripe search\n * query unescaped: digits, a hyphen, nothing else.\n */\nexport function aiOverageChargeId(month: string, seq: number): string {\n return `${month}-${String(Math.max(1, Math.floor(seq))).padStart(3, '0')}`\n}\n\n/**\n * Takes a claim on the workspace's unbilled overage, or explains why not.\n *\n * The four conditions are the design's, in one transaction with the reads\n * they are decided from:\n *\n * - enough unbilled overage (the threshold, or the minimum for a close-out);\n * - no charge already open — one at a time, so a failure has one owner;\n * - a card on file, since the bound assumes a payment method that settles\n * now rather than in days;\n * - not paused.\n *\n * The card condition abstains when the workspace's payment method has never\n * been observed, for the reason `AiOverageStanding.paymentMethodType` gives.\n * A charge attempted against a customer with no default simply fails, and\n * the failure pauses accrual like any other — the guard is an optimization\n * here, not the safety property.\n */\nexport async function claimAiOverageCharge(\n firestore: FirebaseFirestore.Firestore,\n request: {\n orgId: string\n org: AiOverageOrg\n month: string\n kind: AiOverageChargeKind\n now?: Date\n },\n): Promise<AiOverageClaimResult> {\n const now = request.now ?? new Date()\n const orgRef = firestore.collection('orgs').doc(request.orgId)\n const usageRef = orgRef.collection('assistUsage').doc(request.month)\n const standingRef = orgRef\n .collection(AI_BILLING_SUBCOLLECTION)\n .doc(AI_BILLING_STANDING_DOC)\n // A close-out settles a month that is over: there is nothing left to\n // accrue, so anything Stripe will accept is worth billing. A threshold\n // charge waits for the threshold, which is what keeps the invoice count\n // and its fees down.\n const floorUsd =\n request.kind === 'closeout' ? AI_OVERAGE_MIN_CHARGE_USD : AI_OVERAGE_THRESHOLD_USD\n\n return firestore.runTransaction(async (tx) => {\n const [usageSnapshot, standingSnapshot] = await Promise.all([\n tx.get(usageRef),\n tx.get(standingRef),\n ])\n const standing = readAiOverageStanding(\n standingSnapshot.exists ? (standingSnapshot.data() ?? null) : null,\n )\n if (aiOverageCardOnFile(standing) === false) {\n return { claimed: null, refused: 'no-card' as const }\n }\n if (standing.pause) return { claimed: null, refused: 'paused' as const }\n if (usageSnapshot.get('overageInvoiceOpen')) {\n return { claimed: null, refused: 'charge-already-open' as const }\n }\n const priced = assistMonthOverage(\n request.org,\n money(usageSnapshot.get('estCostUsd')),\n )\n // A plan that sells nothing past its band prices its overage to zero, so\n // this is structural rather than a check that could be forgotten — but\n // it is named, because \"we billed nothing\" and \"there is nothing to\n // bill\" are different answers to a staff question.\n if (priced.overageRateUsd === null) {\n return { claimed: null, refused: 'not-sold' as const }\n }\n const invoicedUsd = money(usageSnapshot.get('overageInvoicedUsd'))\n const unbilledUsd = floorToCent(priced.overageMonthlyUsd - invoicedUsd)\n if (!(unbilledUsd >= floorUsd)) {\n return { claimed: null, refused: 'below-threshold' as const }\n }\n const seq = Math.max(0, Math.floor(money(usageSnapshot.get('overageCharges')))) + 1\n const chargeId = aiOverageChargeId(request.month, seq)\n const claim: AiOverageClaim = {\n chargeId,\n orgId: request.orgId,\n month: request.month,\n seq,\n kind: request.kind,\n amountUsd: unbilledUsd,\n credits: priced.overageCredits,\n rateUsdPer1k: priced.overageRateUsd,\n }\n tx.set(\n usageRef,\n {\n month: request.month,\n overageInvoicedUsd: FieldValue.increment(unbilledUsd),\n overageCharges: FieldValue.increment(1),\n overageInvoiceOpen: {\n chargeId,\n invoiceId: null,\n amountUsd: unbilledUsd,\n since: now.toISOString(),\n },\n updatedAt: FieldValue.serverTimestamp(),\n },\n { merge: true },\n )\n tx.set(\n orgRef.collection(AI_OVERAGE_CHARGES_SUBCOLLECTION).doc(chargeId),\n {\n month: request.month,\n seq,\n kind: request.kind,\n amountUsd: unbilledUsd,\n credits: priced.overageCredits,\n rateUsdPer1k: priced.overageRateUsd,\n invoiceId: null,\n status: 'claimed' satisfies AiOverageChargeStatus,\n createdAt: FieldValue.serverTimestamp(),\n paidAt: null,\n failedAt: null,\n },\n { merge: true },\n )\n return { claimed: claim, refused: null }\n })\n}\n\n/** What Stripe said, as the ledger records it. */\nexport interface AiOverageSettlement {\n chargeId: string\n month: string\n /** `null` only when no invoice was ever created. */\n invoiceId: string | null\n status: AiOverageChargeStatus\n /**\n * What Stripe actually collected, in dollars (AGL-3023).\n *\n * The month's paid total moves by THIS and never by the claim. The two are\n * normally equal, and the case where they are not is the one that matters:\n * an invoice that finalized at zero or collected less than it billed would\n * otherwise clear a balance nobody paid, and the gate's unpaid bound would\n * be satisfied by our own bookkeeping instead of by money.\n *\n * Omitted on a settlement that is not a payment, where it is not read.\n */\n paidUsd?: number\n}\n\n/**\n * Records what became of a claimed charge.\n *\n * `paid` adds the amount to the month's `overagePaidUsd`, which is what the\n * gate's unpaid bound subtracts — so paying is what lets a workspace keep\n * going, and nothing else does.\n *\n * An invoice that exists but is not paid KEEPS its claim on\n * `overageInvoicedUsd`: it is a real bill, Stripe's retries may still settle\n * it, and re-billing the same dollars on a second invoice would charge the\n * customer twice for one month's usage. Only a claim that never became an\n * invoice at all releases what it claimed, so those dollars can be charged\n * by a later attempt.\n *\n * The open-charge slot is always cleared. Leaving it set on a failure would\n * block the close-out and every later charge behind an invoice that is\n * never going to move on its own.\n */\nexport async function settleAiOverageCharge(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n settlement: AiOverageSettlement,\n): Promise<void> {\n const orgRef = firestore.collection('orgs').doc(orgId)\n const usageRef = orgRef.collection('assistUsage').doc(settlement.month)\n const chargeRef = orgRef\n .collection(AI_OVERAGE_CHARGES_SUBCOLLECTION)\n .doc(settlement.chargeId)\n\n await firestore.runTransaction(async (tx) => {\n const [usageSnapshot, chargeSnapshot] = await Promise.all([\n tx.get(usageRef),\n tx.get(chargeRef),\n ])\n const amountUsd = money(chargeSnapshot.get('amountUsd'))\n // What the month's paid total moves by: what Stripe took. A settlement\n // that claims to be a payment and names no collected figure moves\n // nothing — silence is not evidence of money (AGL-3023).\n const paidUsd = money(settlement.paidUsd)\n const open = usageSnapshot.get('overageInvoiceOpen') as\n | { chargeId?: unknown }\n | null\n | undefined\n const ownsTheSlot = String(open?.chargeId ?? '') === settlement.chargeId\n // Already settled, or settled by another path (the webhook and the\n // synchronous answer both arrive). Recording the status again is\n // harmless; moving the money counters again is not.\n const alreadyPaid = chargeSnapshot.get('status') === 'paid'\n const releases = settlement.status === 'failed' && !settlement.invoiceId\n tx.set(\n chargeRef,\n {\n invoiceId: settlement.invoiceId,\n status: settlement.status,\n ...(settlement.status === 'paid' ? { paidUsd } : {}),\n ...(settlement.status === 'paid'\n ? { paidAt: FieldValue.serverTimestamp() }\n : {}),\n ...(settlement.status === 'failed'\n ? { failedAt: FieldValue.serverTimestamp() }\n : {}),\n },\n { merge: true },\n )\n tx.set(\n usageRef,\n {\n month: settlement.month,\n ...(settlement.status === 'paid' && !alreadyPaid && paidUsd > 0\n ? { overagePaidUsd: FieldValue.increment(paidUsd) }\n : {}),\n ...(releases\n ? {\n overageInvoicedUsd: FieldValue.increment(-amountUsd),\n overageCharges: FieldValue.increment(-1),\n }\n : {}),\n ...(ownsTheSlot ? { overageInvoiceOpen: null } : {}),\n updatedAt: FieldValue.serverTimestamp(),\n },\n { merge: true },\n )\n })\n}\n\n/** The month's charge counters, as the customer card and staff card read them. */\nexport interface AiOverageMonthLedger {\n invoicedUsd: number\n paidUsd: number\n charges: number\n open: { chargeId: string; invoiceId: string | null; amountUsd: number } | null\n}\n\n/** Reads the four fields off a month's rollup, defensively. */\nexport function readAiOverageMonthLedger(\n data: Record<string, unknown> | null | undefined,\n): AiOverageMonthLedger {\n const open = data?.['overageInvoiceOpen'] as Record<string, unknown> | null | undefined\n const chargeId = typeof open?.['chargeId'] === 'string' ? open['chargeId'] : ''\n return {\n invoicedUsd: money(data?.['overageInvoicedUsd']),\n paidUsd: money(data?.['overagePaidUsd']),\n charges: Math.max(0, Math.floor(money(data?.['overageCharges']))),\n open: chargeId\n ? {\n chargeId,\n invoiceId:\n typeof open?.['invoiceId'] === 'string' ? (open['invoiceId'] as string) : null,\n amountUsd: money(open?.['amountUsd']),\n }\n : null,\n }\n}\n"],"names":["FieldValue","assistMonthOverage","AI_OVERAGE_MIN_CHARGE_USD","AI_OVERAGE_THRESHOLD_USD","aiOverageCardOnFile","readAiOverageStanding","AI_BILLING_SUBCOLLECTION","AI_BILLING_STANDING_DOC","AI_OVERAGE_CHARGES_SUBCOLLECTION","money","value","number","Number","isFinite","floorToCent","usd","Math","floor","aiOverageChargeId","month","seq","String","max","padStart","claimAiOverageCharge","firestore","request","now","Date","orgRef","collection","doc","orgId","usageRef","standingRef","floorUsd","kind","runTransaction","tx","standingSnapshot","usageSnapshot","Promise","all","get","standing","exists","data","claimed","refused","pause","priced","org","overageRateUsd","invoicedUsd","unbilledUsd","overageMonthlyUsd","chargeId","claim","amountUsd","credits","overageCredits","rateUsdPer1k","set","overageInvoicedUsd","increment","overageCharges","overageInvoiceOpen","invoiceId","since","toISOString","updatedAt","serverTimestamp","merge","status","createdAt","paidAt","failedAt","settleAiOverageCharge","settlement","chargeRef","chargeSnapshot","paidUsd","open","ownsTheSlot","alreadyPaid","releases","overagePaidUsd","readAiOverageMonthLedger","charges"],"mappings":"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"}
@@ -0,0 +1,110 @@
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
+ import { type AiOveragePauseReason } from './ai-overage-standing';
18
+ /**
19
+ * Stops accrual.
20
+ *
21
+ * An existing pause is NOT overwritten: the first reason is the one that
22
+ * started it and the one the customer was told, and a `past_due` arriving
23
+ * behind a `charge_failed` would replace a sentence naming an invoice the
24
+ * customer can pay with one that names nothing. The exception is a dispute,
25
+ * which outranks everything because only staff may lift it.
26
+ */
27
+ export declare function pauseAiOverage(firestore: FirebaseFirestore.Firestore, orgId: string, pause: {
28
+ reason: AiOveragePauseReason;
29
+ invoiceId?: string | null;
30
+ now: Date;
31
+ }): Promise<void>;
32
+ /**
33
+ * Lifts a pause — but only the pause the caller is entitled to lift.
34
+ *
35
+ * Scoped two ways, and the scoping is the point. `invoiceId` lifts only a
36
+ * pause that names that invoice, so paying an AI charge clears the pause it
37
+ * caused and nothing else. `reason` lifts only a pause of that kind, so a
38
+ * paid renewal clears `past_due` and leaves a failed AI charge paused — the
39
+ * AI invoice is still open, and resuming accrual against it would let the
40
+ * balance grow while it is unpaid.
41
+ *
42
+ * Unscoped clears whatever is there, which is the staff path and the voided
43
+ * invoice's. A dispute pause is never lifted by a payment of any kind: it
44
+ * needs `force`, which only staff pass.
45
+ */
46
+ export declare function resumeAiOverage(firestore: FirebaseFirestore.Firestore, orgId: string, scope?: {
47
+ invoiceId?: string | null;
48
+ reason?: AiOveragePauseReason;
49
+ force?: boolean;
50
+ }): Promise<void>;
51
+ /**
52
+ * Records a paid invoice, which is what moves a workspace up the ladder.
53
+ *
54
+ * Two different things happen on a first payment and on a later one. The
55
+ * first sets `firstPaidMonth` — the baseline the ladder counts FROM, never a
56
+ * step on it, because every paid workspace pays one invoice the moment it
57
+ * subscribes and a ladder that counted it would start everyone a step up.
58
+ * Every later month with a real payment adds a step.
59
+ *
60
+ * `aiOverageQualifyingMonth` decides which is which, and refuses a payment
61
+ * that is not evidence: an invoice marked paid out of band is a staff
62
+ * action, and a zero payment is a credit.
63
+ */
64
+ export declare function recordAiOveragePaidInvoice(firestore: FirebaseFirestore.Firestore, orgId: string, payment: {
65
+ month: string;
66
+ amountPaidCents: number;
67
+ paidOutOfBand: boolean;
68
+ }): Promise<void>;
69
+ /**
70
+ * Takes a month back off the ladder.
71
+ *
72
+ * The close-out sweep calls this for a month that ended with an AI charge
73
+ * still unpaid. A month in which the workspace both paid an invoice and left
74
+ * an AI charge unpaid is not evidence of the thing the ladder measures, and
75
+ * leaving it counted would raise a ceiling on the strength of a payment that
76
+ * did not happen.
77
+ */
78
+ export declare function dropAiOverageQualifyingMonth(firestore: FirebaseFirestore.Firestore, orgId: string, month: string): Promise<void>;
79
+ /**
80
+ * A dispute: the ladder goes back to the bottom and accrual stops.
81
+ *
82
+ * Both, not either. The reset is about the future — a workspace that
83
+ * disputes has not earned a raised ceiling — and the pause is about now.
84
+ * Only staff can lift the pause, because a dispute is a judgement about the
85
+ * relationship and no automatic event should end it.
86
+ */
87
+ export declare function recordAiOverageDispute(firestore: FirebaseFirestore.Firestore, orgId: string, now: Date): Promise<void>;
88
+ /**
89
+ * Mirrors the workspace's default payment method type.
90
+ *
91
+ * `null` means the customer has no default, which is a real answer and is
92
+ * written. The value is never written as `undefined` — that state means
93
+ * "nobody has looked", and once anyone has, it is gone for good.
94
+ */
95
+ export declare function recordAiOveragePaymentMethod(firestore: FirebaseFirestore.Firestore, orgId: string, defaultType: string | null): Promise<void>;
96
+ /** Sets or clears the staff ceiling override. */
97
+ export declare function setAiOverageStaffOverride(firestore: FirebaseFirestore.Firestore, orgId: string, override: {
98
+ ceilingUsd: number;
99
+ reason: string;
100
+ setBy: string;
101
+ expiresAt: string | null;
102
+ } | null, now: Date): Promise<void>;
103
+ /**
104
+ * Puts the workspace back at the bottom of the ladder by hand.
105
+ *
106
+ * Staff-only, and separate from the dispute reset: this one does not pause,
107
+ * because staff resetting a step are correcting a standing, not responding
108
+ * to a chargeback.
109
+ */
110
+ export declare function resetAiOverageStep(firestore: FirebaseFirestore.Firestore, orgId: string): Promise<void>;
@@ -0,0 +1,205 @@
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
+ * WRITING A WORKSPACE'S OVERAGE STANDING (AGL-3011).
19
+ *
20
+ * Every writer of `orgs/{orgId}/aiBilling/standing` is here, and each one is
21
+ * a transaction over the document it changes — the ladder and the pause are
22
+ * read by the gate on every request past the band, so a read-modify-write
23
+ * that lost a concurrent event would lose a pause or a step.
24
+ *
25
+ * `ai-overage-standing.ts` holds the shape and the arithmetic; this holds the
26
+ * writes. Nothing here decides a policy: what qualifies a month and what a
27
+ * ceiling resolves to are answered there, once, for the gate and the staff
28
+ * card as well as for these.
29
+ */ import { FieldValue } from "firebase-admin/firestore";
30
+ import { AI_BILLING_STANDING_DOC, AI_BILLING_SUBCOLLECTION } from "./ai-overage-ledger.js";
31
+ import { AI_OVERAGE_QUALIFYING_MONTHS_KEPT, aiOverageQualifyingMonth, aiOverageStep, readAiOverageStanding } from "./ai-overage-standing.js";
32
+ function standingRef(firestore, orgId) {
33
+ return firestore.collection('orgs').doc(orgId).collection(AI_BILLING_SUBCOLLECTION).doc(AI_BILLING_STANDING_DOC);
34
+ }
35
+ /**
36
+ * Reads the standing, hands it to `change`, and writes back what comes out.
37
+ *
38
+ * `change` returning `null` writes nothing — which is how "this event does
39
+ * not move the standing" is said without a write that only restamps
40
+ * `updatedAt` and wakes every listener on the document.
41
+ */ async function updateStanding(firestore, orgId, change) {
42
+ const ref = standingRef(firestore, orgId);
43
+ await firestore.runTransaction(async (tx)=>{
44
+ var _snapshot_data;
45
+ const snapshot = await tx.get(ref);
46
+ const standing = readAiOverageStanding(snapshot.exists ? (_snapshot_data = snapshot.data()) != null ? _snapshot_data : null : null);
47
+ const write = change(standing);
48
+ if (!write) return;
49
+ tx.set(ref, _extends({}, write, {
50
+ updatedAt: FieldValue.serverTimestamp()
51
+ }), {
52
+ merge: true
53
+ });
54
+ });
55
+ }
56
+ /** The mirrored `step`, kept beside the months it is derived from. */ function withStep(months) {
57
+ const kept = months.slice(-AI_OVERAGE_QUALIFYING_MONTHS_KEPT);
58
+ return {
59
+ qualifyingMonths: kept,
60
+ step: aiOverageStep({
61
+ qualifyingMonths: kept
62
+ })
63
+ };
64
+ }
65
+ /**
66
+ * Stops accrual.
67
+ *
68
+ * An existing pause is NOT overwritten: the first reason is the one that
69
+ * started it and the one the customer was told, and a `past_due` arriving
70
+ * behind a `charge_failed` would replace a sentence naming an invoice the
71
+ * customer can pay with one that names nothing. The exception is a dispute,
72
+ * which outranks everything because only staff may lift it.
73
+ */ export async function pauseAiOverage(firestore, orgId, pause) {
74
+ await updateStanding(firestore, orgId, (standing)=>{
75
+ var _pause_invoiceId;
76
+ if (standing.pause && standing.pause.reason === 'dispute') return null;
77
+ if (standing.pause && pause.reason !== 'dispute') return null;
78
+ return {
79
+ pause: {
80
+ reason: pause.reason,
81
+ invoiceId: (_pause_invoiceId = pause.invoiceId) != null ? _pause_invoiceId : null,
82
+ since: pause.now.toISOString()
83
+ }
84
+ };
85
+ });
86
+ }
87
+ /**
88
+ * Lifts a pause — but only the pause the caller is entitled to lift.
89
+ *
90
+ * Scoped two ways, and the scoping is the point. `invoiceId` lifts only a
91
+ * pause that names that invoice, so paying an AI charge clears the pause it
92
+ * caused and nothing else. `reason` lifts only a pause of that kind, so a
93
+ * paid renewal clears `past_due` and leaves a failed AI charge paused — the
94
+ * AI invoice is still open, and resuming accrual against it would let the
95
+ * balance grow while it is unpaid.
96
+ *
97
+ * Unscoped clears whatever is there, which is the staff path and the voided
98
+ * invoice's. A dispute pause is never lifted by a payment of any kind: it
99
+ * needs `force`, which only staff pass.
100
+ */ export async function resumeAiOverage(firestore, orgId, scope = {}) {
101
+ await updateStanding(firestore, orgId, (standing)=>{
102
+ if (!standing.pause) return null;
103
+ if (standing.pause.reason === 'dispute' && !scope.force) return null;
104
+ if (scope.invoiceId && standing.pause.invoiceId !== scope.invoiceId) return null;
105
+ if (scope.reason && standing.pause.reason !== scope.reason) return null;
106
+ return {
107
+ pause: null
108
+ };
109
+ });
110
+ }
111
+ /**
112
+ * Records a paid invoice, which is what moves a workspace up the ladder.
113
+ *
114
+ * Two different things happen on a first payment and on a later one. The
115
+ * first sets `firstPaidMonth` — the baseline the ladder counts FROM, never a
116
+ * step on it, because every paid workspace pays one invoice the moment it
117
+ * subscribes and a ladder that counted it would start everyone a step up.
118
+ * Every later month with a real payment adds a step.
119
+ *
120
+ * `aiOverageQualifyingMonth` decides which is which, and refuses a payment
121
+ * that is not evidence: an invoice marked paid out of band is a staff
122
+ * action, and a zero payment is a credit.
123
+ */ export async function recordAiOveragePaidInvoice(firestore, orgId, payment) {
124
+ await updateStanding(firestore, orgId, (standing)=>{
125
+ if (payment.paidOutOfBand || !(payment.amountPaidCents > 0)) return null;
126
+ if (!standing.firstPaidMonth) return {
127
+ firstPaidMonth: payment.month
128
+ };
129
+ const month = aiOverageQualifyingMonth(standing, payment);
130
+ if (!month) return null;
131
+ if (standing.qualifyingMonths.includes(month)) return null;
132
+ return withStep([
133
+ ...standing.qualifyingMonths,
134
+ month
135
+ ].sort());
136
+ });
137
+ }
138
+ /**
139
+ * Takes a month back off the ladder.
140
+ *
141
+ * The close-out sweep calls this for a month that ended with an AI charge
142
+ * still unpaid. A month in which the workspace both paid an invoice and left
143
+ * an AI charge unpaid is not evidence of the thing the ladder measures, and
144
+ * leaving it counted would raise a ceiling on the strength of a payment that
145
+ * did not happen.
146
+ */ export async function dropAiOverageQualifyingMonth(firestore, orgId, month) {
147
+ await updateStanding(firestore, orgId, (standing)=>{
148
+ if (!standing.qualifyingMonths.includes(month)) return null;
149
+ return withStep(standing.qualifyingMonths.filter((kept)=>kept !== month));
150
+ });
151
+ }
152
+ /**
153
+ * A dispute: the ladder goes back to the bottom and accrual stops.
154
+ *
155
+ * Both, not either. The reset is about the future — a workspace that
156
+ * disputes has not earned a raised ceiling — and the pause is about now.
157
+ * Only staff can lift the pause, because a dispute is a judgement about the
158
+ * relationship and no automatic event should end it.
159
+ */ export async function recordAiOverageDispute(firestore, orgId, now) {
160
+ await updateStanding(firestore, orgId, ()=>_extends({}, withStep([]), {
161
+ firstPaidMonth: null,
162
+ lastDisputeAt: now.toISOString(),
163
+ pause: {
164
+ reason: 'dispute',
165
+ invoiceId: null,
166
+ since: now.toISOString()
167
+ }
168
+ }));
169
+ }
170
+ /**
171
+ * Mirrors the workspace's default payment method type.
172
+ *
173
+ * `null` means the customer has no default, which is a real answer and is
174
+ * written. The value is never written as `undefined` — that state means
175
+ * "nobody has looked", and once anyone has, it is gone for good.
176
+ */ export async function recordAiOveragePaymentMethod(firestore, orgId, defaultType) {
177
+ await updateStanding(firestore, orgId, (standing)=>{
178
+ if (standing.paymentMethodType === defaultType) return null;
179
+ return {
180
+ paymentMethodType: defaultType
181
+ };
182
+ });
183
+ }
184
+ /** Sets or clears the staff ceiling override. */ export async function setAiOverageStaffOverride(firestore, orgId, override, now) {
185
+ await updateStanding(firestore, orgId, ()=>({
186
+ staffOverride: override ? {
187
+ ceilingUsd: override.ceilingUsd,
188
+ reason: override.reason,
189
+ setBy: override.setBy,
190
+ setAt: now.toISOString(),
191
+ expiresAt: override.expiresAt
192
+ } : null
193
+ }));
194
+ }
195
+ /**
196
+ * Puts the workspace back at the bottom of the ladder by hand.
197
+ *
198
+ * Staff-only, and separate from the dispute reset: this one does not pause,
199
+ * because staff resetting a step are correcting a standing, not responding
200
+ * to a chargeback.
201
+ */ export async function resetAiOverageStep(firestore, orgId) {
202
+ await updateStanding(firestore, orgId, ()=>withStep([]));
203
+ }
204
+
205
+ //# sourceMappingURL=ai-overage-standing-writes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/billing/ai-overage-standing-writes.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 * WRITING A WORKSPACE'S OVERAGE STANDING (AGL-3011).\n *\n * Every writer of `orgs/{orgId}/aiBilling/standing` is here, and each one is\n * a transaction over the document it changes — the ladder and the pause are\n * read by the gate on every request past the band, so a read-modify-write\n * that lost a concurrent event would lose a pause or a step.\n *\n * `ai-overage-standing.ts` holds the shape and the arithmetic; this holds the\n * writes. Nothing here decides a policy: what qualifies a month and what a\n * ceiling resolves to are answered there, once, for the gate and the staff\n * card as well as for these.\n */\n\nimport { FieldValue } from 'firebase-admin/firestore'\nimport {\n AI_BILLING_STANDING_DOC,\n AI_BILLING_SUBCOLLECTION,\n} from './ai-overage-ledger'\nimport {\n AI_OVERAGE_QUALIFYING_MONTHS_KEPT,\n aiOverageQualifyingMonth,\n aiOverageStep,\n readAiOverageStanding,\n type AiOveragePauseReason,\n type AiOverageStanding,\n} from './ai-overage-standing'\n\nfunction standingRef(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n): FirebaseFirestore.DocumentReference {\n return firestore\n .collection('orgs')\n .doc(orgId)\n .collection(AI_BILLING_SUBCOLLECTION)\n .doc(AI_BILLING_STANDING_DOC)\n}\n\n/**\n * Reads the standing, hands it to `change`, and writes back what comes out.\n *\n * `change` returning `null` writes nothing — which is how \"this event does\n * not move the standing\" is said without a write that only restamps\n * `updatedAt` and wakes every listener on the document.\n */\nasync function updateStanding(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n change: (standing: AiOverageStanding) => Record<string, unknown> | null,\n): Promise<void> {\n const ref = standingRef(firestore, orgId)\n await firestore.runTransaction(async (tx) => {\n const snapshot = await tx.get(ref)\n const standing = readAiOverageStanding(\n snapshot.exists ? (snapshot.data() ?? null) : null,\n )\n const write = change(standing)\n if (!write) return\n tx.set(ref, { ...write, updatedAt: FieldValue.serverTimestamp() }, { merge: true })\n })\n}\n\n/** The mirrored `step`, kept beside the months it is derived from. */\nfunction withStep(\n months: string[],\n): { qualifyingMonths: string[]; step: number } {\n const kept = months.slice(-AI_OVERAGE_QUALIFYING_MONTHS_KEPT)\n return {\n qualifyingMonths: kept,\n step: aiOverageStep({ qualifyingMonths: kept } as AiOverageStanding),\n }\n}\n\n/**\n * Stops accrual.\n *\n * An existing pause is NOT overwritten: the first reason is the one that\n * started it and the one the customer was told, and a `past_due` arriving\n * behind a `charge_failed` would replace a sentence naming an invoice the\n * customer can pay with one that names nothing. The exception is a dispute,\n * which outranks everything because only staff may lift it.\n */\nexport async function pauseAiOverage(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n pause: { reason: AiOveragePauseReason; invoiceId?: string | null; now: Date },\n): Promise<void> {\n await updateStanding(firestore, orgId, (standing) => {\n if (standing.pause && standing.pause.reason === 'dispute') return null\n if (standing.pause && pause.reason !== 'dispute') return null\n return {\n pause: {\n reason: pause.reason,\n invoiceId: pause.invoiceId ?? null,\n since: pause.now.toISOString(),\n },\n }\n })\n}\n\n/**\n * Lifts a pause — but only the pause the caller is entitled to lift.\n *\n * Scoped two ways, and the scoping is the point. `invoiceId` lifts only a\n * pause that names that invoice, so paying an AI charge clears the pause it\n * caused and nothing else. `reason` lifts only a pause of that kind, so a\n * paid renewal clears `past_due` and leaves a failed AI charge paused — the\n * AI invoice is still open, and resuming accrual against it would let the\n * balance grow while it is unpaid.\n *\n * Unscoped clears whatever is there, which is the staff path and the voided\n * invoice's. A dispute pause is never lifted by a payment of any kind: it\n * needs `force`, which only staff pass.\n */\nexport async function resumeAiOverage(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n scope: {\n invoiceId?: string | null\n reason?: AiOveragePauseReason\n force?: boolean\n } = {},\n): Promise<void> {\n await updateStanding(firestore, orgId, (standing) => {\n if (!standing.pause) return null\n if (standing.pause.reason === 'dispute' && !scope.force) return null\n if (scope.invoiceId && standing.pause.invoiceId !== scope.invoiceId) return null\n if (scope.reason && standing.pause.reason !== scope.reason) return null\n return { pause: null }\n })\n}\n\n/**\n * Records a paid invoice, which is what moves a workspace up the ladder.\n *\n * Two different things happen on a first payment and on a later one. The\n * first sets `firstPaidMonth` — the baseline the ladder counts FROM, never a\n * step on it, because every paid workspace pays one invoice the moment it\n * subscribes and a ladder that counted it would start everyone a step up.\n * Every later month with a real payment adds a step.\n *\n * `aiOverageQualifyingMonth` decides which is which, and refuses a payment\n * that is not evidence: an invoice marked paid out of band is a staff\n * action, and a zero payment is a credit.\n */\nexport async function recordAiOveragePaidInvoice(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n payment: { month: string; amountPaidCents: number; paidOutOfBand: boolean },\n): Promise<void> {\n await updateStanding(firestore, orgId, (standing) => {\n if (payment.paidOutOfBand || !(payment.amountPaidCents > 0)) return null\n if (!standing.firstPaidMonth) return { firstPaidMonth: payment.month }\n const month = aiOverageQualifyingMonth(standing, payment)\n if (!month) return null\n if (standing.qualifyingMonths.includes(month)) return null\n return withStep([...standing.qualifyingMonths, month].sort())\n })\n}\n\n/**\n * Takes a month back off the ladder.\n *\n * The close-out sweep calls this for a month that ended with an AI charge\n * still unpaid. A month in which the workspace both paid an invoice and left\n * an AI charge unpaid is not evidence of the thing the ladder measures, and\n * leaving it counted would raise a ceiling on the strength of a payment that\n * did not happen.\n */\nexport async function dropAiOverageQualifyingMonth(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n month: string,\n): Promise<void> {\n await updateStanding(firestore, orgId, (standing) => {\n if (!standing.qualifyingMonths.includes(month)) return null\n return withStep(standing.qualifyingMonths.filter((kept) => kept !== month))\n })\n}\n\n/**\n * A dispute: the ladder goes back to the bottom and accrual stops.\n *\n * Both, not either. The reset is about the future — a workspace that\n * disputes has not earned a raised ceiling — and the pause is about now.\n * Only staff can lift the pause, because a dispute is a judgement about the\n * relationship and no automatic event should end it.\n */\nexport async function recordAiOverageDispute(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n now: Date,\n): Promise<void> {\n await updateStanding(firestore, orgId, () => ({\n ...withStep([]),\n firstPaidMonth: null,\n lastDisputeAt: now.toISOString(),\n pause: { reason: 'dispute' as const, invoiceId: null, since: now.toISOString() },\n }))\n}\n\n/**\n * Mirrors the workspace's default payment method type.\n *\n * `null` means the customer has no default, which is a real answer and is\n * written. The value is never written as `undefined` — that state means\n * \"nobody has looked\", and once anyone has, it is gone for good.\n */\nexport async function recordAiOveragePaymentMethod(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n defaultType: string | null,\n): Promise<void> {\n await updateStanding(firestore, orgId, (standing) => {\n if (standing.paymentMethodType === defaultType) return null\n return { paymentMethodType: defaultType }\n })\n}\n\n/** Sets or clears the staff ceiling override. */\nexport async function setAiOverageStaffOverride(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n override:\n | { ceilingUsd: number; reason: string; setBy: string; expiresAt: string | null }\n | null,\n now: Date,\n): Promise<void> {\n await updateStanding(firestore, orgId, () => ({\n staffOverride: override\n ? {\n ceilingUsd: override.ceilingUsd,\n reason: override.reason,\n setBy: override.setBy,\n setAt: now.toISOString(),\n expiresAt: override.expiresAt,\n }\n : null,\n }))\n}\n\n/**\n * Puts the workspace back at the bottom of the ladder by hand.\n *\n * Staff-only, and separate from the dispute reset: this one does not pause,\n * because staff resetting a step are correcting a standing, not responding\n * to a chargeback.\n */\nexport async function resetAiOverageStep(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n): Promise<void> {\n await updateStanding(firestore, orgId, () => withStep([]))\n}\n"],"names":["FieldValue","AI_BILLING_STANDING_DOC","AI_BILLING_SUBCOLLECTION","AI_OVERAGE_QUALIFYING_MONTHS_KEPT","aiOverageQualifyingMonth","aiOverageStep","readAiOverageStanding","standingRef","firestore","orgId","collection","doc","updateStanding","change","ref","runTransaction","tx","snapshot","get","standing","exists","data","write","set","updatedAt","serverTimestamp","merge","withStep","months","kept","slice","qualifyingMonths","step","pauseAiOverage","pause","reason","invoiceId","since","now","toISOString","resumeAiOverage","scope","force","recordAiOveragePaidInvoice","payment","paidOutOfBand","amountPaidCents","firstPaidMonth","month","includes","sort","dropAiOverageQualifyingMonth","filter","recordAiOverageDispute","lastDisputeAt","recordAiOveragePaymentMethod","defaultType","paymentMethodType","setAiOverageStaffOverride","override","staffOverride","ceilingUsd","setBy","setAt","expiresAt","resetAiOverageStep"],"mappings":"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"}
@@ -0,0 +1,168 @@
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
+ import type { AglynOrgBilling } from '@aglyn/aglyn/foundation/definitions/org-billing.types';
18
+ /** The billing fields of an org, as every resolver in this folder takes it. */
19
+ export type AiOverageOrg = Partial<AglynOrgBilling> | null | undefined;
20
+ /**
21
+ * The unbilled overage at which the card on file is charged.
22
+ *
23
+ * Fifty times Stripe's minimum charge, so no charge is refused for being too
24
+ * small; low enough that what is outstanding between charges stays near the
25
+ * bound below; high enough that per-invoice fees stay a few percent.
26
+ */
27
+ export declare const AI_OVERAGE_THRESHOLD_USD = 25;
28
+ /**
29
+ * The most overage a workspace may have accrued and not paid for.
30
+ *
31
+ * Twice the threshold, so one charge in flight plus one accruing is inside
32
+ * it, and a workspace doing ordinary work never meets it. Meeting it means
33
+ * the charges are not settling, and that is exactly when accrual must stop.
34
+ */
35
+ export declare const AI_OVERAGE_UNPAID_LIMIT_USD = 50;
36
+ /**
37
+ * The monthly ceiling, by step. It rises one step for each later calendar
38
+ * month in which the workspace paid an invoice with a real charge.
39
+ *
40
+ * Months, not invoices: every paid workspace pays an invoice the moment it
41
+ * subscribes, and threshold invoices can arrive several times a day, so
42
+ * counting invoices would reach the top step in an afternoon. Counting
43
+ * months takes at least two, which covers much of the window in which a
44
+ * stolen card is reported.
45
+ */
46
+ export declare const AI_OVERAGE_CEILING_LADDER_USD: readonly [50, 150, 500];
47
+ /** The top index of the ladder; `step` is clamped to it. */
48
+ export declare const AI_OVERAGE_MAX_STEP: number;
49
+ /**
50
+ * The smallest amount worth an invoice — Stripe's own minimum charge. A
51
+ * close-out remainder under it is carried, not billed: an invoice that
52
+ * cannot be paid is a document that dunning chases forever.
53
+ */
54
+ export declare const AI_OVERAGE_MIN_CHARGE_USD = 0.5;
55
+ /** Bounds on a ceiling staff may write by hand, the customer ceiling's. */
56
+ export declare const AI_OVERAGE_STAFF_CEILING_MIN_USD = 1;
57
+ export declare const AI_OVERAGE_STAFF_CEILING_MAX_USD = 100000;
58
+ /** Why overage is paused. Each one is payment trust dropping, differently. */
59
+ export type AiOveragePauseReason = 'charge_failed' | 'past_due' | 'dispute' | 'staff';
60
+ /** A staff ceiling that outranks the ladder. */
61
+ export interface AiOverageStaffOverride {
62
+ ceilingUsd: number;
63
+ reason: string;
64
+ setBy: string;
65
+ setAt: string | null;
66
+ /** ISO instant, or `null` to stand until staff clear it. */
67
+ expiresAt: string | null;
68
+ }
69
+ /** Accrual stopped, and why. */
70
+ export interface AiOveragePause {
71
+ reason: AiOveragePauseReason;
72
+ /** The invoice that failed, when a charge is what stopped it. */
73
+ invoiceId: string | null;
74
+ since: string | null;
75
+ }
76
+ /**
77
+ * `orgs/{orgId}/aiBilling/standing`, normalized.
78
+ *
79
+ * Written only by the server, read by the gate on every request past the
80
+ * band. The Firestore rules deny every client write and allow the same reads
81
+ * as `aiAllotments`.
82
+ */
83
+ export interface AiOverageStanding {
84
+ /**
85
+ * The workspace's default payment method type, `null` when it has none,
86
+ * and `undefined` when nobody has looked yet.
87
+ *
88
+ * THREE states, not two, and the third is the important one. A workspace
89
+ * that has been paying for a year has no standing document until something
90
+ * writes one, and reading that absence as "no card" would refuse a paying
91
+ * customer's work over a document we never wrote. So "never observed"
92
+ * declines to answer the card question and lets the other guards bind —
93
+ * the unpaid bound does not rest on the card check, which is why it can
94
+ * afford to abstain. A pre-cutover backfill is what turns `undefined` into
95
+ * a real answer for existing workspaces.
96
+ */
97
+ paymentMethodType: string | null | undefined;
98
+ /** The first month (`YYYY-MM`) an invoice of this workspace's was paid. */
99
+ firstPaidMonth: string | null;
100
+ /**
101
+ * Later months with a paid invoice, ascending, the most recent 12 kept. A
102
+ * month is dropped again if an AI charge of that month was still unpaid
103
+ * when the month ended.
104
+ */
105
+ qualifyingMonths: string[];
106
+ staffOverride: AiOverageStaffOverride | null;
107
+ pause: AiOveragePause | null;
108
+ lastDisputeAt: string | null;
109
+ }
110
+ /** The standing of a workspace nothing has written a document for. */
111
+ export declare const EMPTY_AI_OVERAGE_STANDING: AiOverageStanding;
112
+ /** How many qualifying months the document keeps. */
113
+ export declare const AI_OVERAGE_QUALIFYING_MONTHS_KEPT = 12;
114
+ /**
115
+ * Reads the stored document into the shape above, strictly.
116
+ *
117
+ * Strictly, because every field here decides whether a workspace may spend
118
+ * money: a string `"true"` that read as a boolean, or a `NaN` ceiling that
119
+ * every comparison passes, is a guard that is not there. Anything that does
120
+ * not narrow is the empty standing's value for that field — which is the
121
+ * conservative answer in each case except the card, where the deliberate
122
+ * answer is "nobody has looked".
123
+ */
124
+ export declare function readAiOverageStanding(data: Record<string, unknown> | null | undefined): AiOverageStanding;
125
+ /**
126
+ * The workspace's step on the ladder — one per qualifying month, clamped.
127
+ *
128
+ * Derived rather than stored, so a stored `step` cannot disagree with the
129
+ * months it was supposed to have been derived from. The document carries a
130
+ * mirrored copy for readers that want one figure, and this is what writes it.
131
+ */
132
+ export declare function aiOverageStep(standing: AiOverageStanding): number;
133
+ /** Is a staff override still standing at this instant? */
134
+ export declare function aiOverageOverrideApplies(override: AiOverageStaffOverride | null, now: Date): boolean;
135
+ /**
136
+ * Aglyn's own ceiling on this month's overage, in retail dollars.
137
+ *
138
+ * The staff override when one stands, and the ladder otherwise. This is the
139
+ * platform's limit; the customer's own `capUsd` is a separate figure and the
140
+ * lower of the two binds — see `aiOverageEffectiveCeilingUsd`.
141
+ */
142
+ export declare function aiOverageStandingCeilingUsd(standing: AiOverageStanding, now: Date): number;
143
+ /**
144
+ * The ceiling that actually binds: the lower of the workspace's own and
145
+ * Aglyn's. For display and for staff; the gate consults the two separately,
146
+ * because the customer's ceiling and the platform's need different words.
147
+ */
148
+ export declare function aiOverageEffectiveCeilingUsd(org: AiOverageOrg, standing: AiOverageStanding, now: Date): number;
149
+ /**
150
+ * Whether a card is the default payment method, as far as anyone has looked.
151
+ *
152
+ * `undefined` when nobody has, and callers must handle that third answer
153
+ * rather than coercing it — see `paymentMethodType`.
154
+ */
155
+ export declare function aiOverageCardOnFile(standing: AiOverageStanding): boolean | undefined;
156
+ /**
157
+ * The month a qualifying step is recorded under, from a paid invoice.
158
+ *
159
+ * `null` when the payment is not evidence that money moved or that time has
160
+ * passed: an invoice marked paid out of band is a staff action, a zero
161
+ * payment is a credit, and the first paid month is the baseline the ladder
162
+ * counts FROM rather than a step on it.
163
+ */
164
+ export declare function aiOverageQualifyingMonth(standing: AiOverageStanding, payment: {
165
+ month: string;
166
+ amountPaidCents: number;
167
+ paidOutOfBand: boolean;
168
+ }): string | null;