@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,215 @@
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
+ * A WORKSPACE'S OVERAGE STANDING (AGL-3011) — the pure half.
18
+ *
19
+ * AI credits past a plan's included band are sold on every paid plan. What
20
+ * bounds them is not one number but four facts about the workspace, and this
21
+ * module is the one derivation of all four: whether a card can be charged,
22
+ * whether accrual is paused, how much overage this month may reach, and how
23
+ * much may be outstanding at once.
24
+ *
25
+ * Nothing here reads Firestore, calls Stripe or knows what a month cost.
26
+ * `ai-overage-ledger.ts` holds the documents and `ai-overage-charge.ts` the
27
+ * charging; the gate and the staff card both resolve their figures here, so
28
+ * the ceiling a customer is refused at is the ceiling the card displays.
29
+ *
30
+ * ## The bound, stated once
31
+ *
32
+ * A workspace may leave at most `AI_OVERAGE_UNPAID_LIMIT_USD` of overage
33
+ * unpaid. That is enforced by REFUSING, not by charging — the gate compares
34
+ * what a month accrued against what it paid, inside the reservation
35
+ * transaction, every request. So the bound holds when a charge is late, when
36
+ * Stripe is down, and when the charge path never ran at all. Charging at
37
+ * `AI_OVERAGE_THRESHOLD_USD` exists to keep a workspace working, by settling
38
+ * the balance before it reaches the bound; it is not what makes the bound
39
+ * true.
40
+ */ import { resolveAssistOverageCapUsd } from "@aglyn/aglyn/app-utils/assist-credits";
41
+ /**
42
+ * The unbilled overage at which the card on file is charged.
43
+ *
44
+ * Fifty times Stripe's minimum charge, so no charge is refused for being too
45
+ * small; low enough that what is outstanding between charges stays near the
46
+ * bound below; high enough that per-invoice fees stay a few percent.
47
+ */ export const AI_OVERAGE_THRESHOLD_USD = 25;
48
+ /**
49
+ * The most overage a workspace may have accrued and not paid for.
50
+ *
51
+ * Twice the threshold, so one charge in flight plus one accruing is inside
52
+ * it, and a workspace doing ordinary work never meets it. Meeting it means
53
+ * the charges are not settling, and that is exactly when accrual must stop.
54
+ */ export const AI_OVERAGE_UNPAID_LIMIT_USD = 50;
55
+ /**
56
+ * The monthly ceiling, by step. It rises one step for each later calendar
57
+ * month in which the workspace paid an invoice with a real charge.
58
+ *
59
+ * Months, not invoices: every paid workspace pays an invoice the moment it
60
+ * subscribes, and threshold invoices can arrive several times a day, so
61
+ * counting invoices would reach the top step in an afternoon. Counting
62
+ * months takes at least two, which covers much of the window in which a
63
+ * stolen card is reported.
64
+ */ export const AI_OVERAGE_CEILING_LADDER_USD = [
65
+ 50,
66
+ 150,
67
+ 500
68
+ ];
69
+ /** The top index of the ladder; `step` is clamped to it. */ export const AI_OVERAGE_MAX_STEP = AI_OVERAGE_CEILING_LADDER_USD.length - 1;
70
+ /**
71
+ * The smallest amount worth an invoice — Stripe's own minimum charge. A
72
+ * close-out remainder under it is carried, not billed: an invoice that
73
+ * cannot be paid is a document that dunning chases forever.
74
+ */ export const AI_OVERAGE_MIN_CHARGE_USD = 0.5;
75
+ /** Bounds on a ceiling staff may write by hand, the customer ceiling's. */ export const AI_OVERAGE_STAFF_CEILING_MIN_USD = 1;
76
+ export const AI_OVERAGE_STAFF_CEILING_MAX_USD = 100000;
77
+ /** The standing of a workspace nothing has written a document for. */ export const EMPTY_AI_OVERAGE_STANDING = {
78
+ paymentMethodType: undefined,
79
+ firstPaidMonth: null,
80
+ qualifyingMonths: [],
81
+ staffOverride: null,
82
+ pause: null,
83
+ lastDisputeAt: null
84
+ };
85
+ /** How many qualifying months the document keeps. */ export const AI_OVERAGE_QUALIFYING_MONTHS_KEPT = 12;
86
+ const MONTH = /^\d{4}-\d{2}$/;
87
+ function readString(value) {
88
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
89
+ }
90
+ function readInstant(value) {
91
+ if (typeof value === 'string' && value.trim()) return value.trim();
92
+ // A Firestore Timestamp, as the Admin SDK hands one back.
93
+ const toDate = value == null ? void 0 : value.toDate;
94
+ if (typeof toDate === 'function') {
95
+ const date = toDate.call(value);
96
+ return date instanceof Date && !Number.isNaN(date.getTime()) ? date.toISOString() : null;
97
+ }
98
+ if (value instanceof Date && !Number.isNaN(value.getTime())) {
99
+ return value.toISOString();
100
+ }
101
+ return null;
102
+ }
103
+ const PAUSE_REASONS = [
104
+ 'charge_failed',
105
+ 'past_due',
106
+ 'dispute',
107
+ 'staff'
108
+ ];
109
+ /**
110
+ * Reads the stored document into the shape above, strictly.
111
+ *
112
+ * Strictly, because every field here decides whether a workspace may spend
113
+ * money: a string `"true"` that read as a boolean, or a `NaN` ceiling that
114
+ * every comparison passes, is a guard that is not there. Anything that does
115
+ * not narrow is the empty standing's value for that field — which is the
116
+ * conservative answer in each case except the card, where the deliberate
117
+ * answer is "nobody has looked".
118
+ */ export function readAiOverageStanding(data) {
119
+ var _readString, _readString1;
120
+ if (!data || typeof data !== 'object') return EMPTY_AI_OVERAGE_STANDING;
121
+ const rawType = data['paymentMethodType'];
122
+ const paymentMethodType = rawType === undefined ? undefined : typeof rawType === 'string' && rawType.trim() ? rawType.trim() : null;
123
+ const firstPaidMonth = readString(data['firstPaidMonth']);
124
+ const months = Array.isArray(data['qualifyingMonths']) ? data['qualifyingMonths'].filter((month)=>typeof month === 'string' && MONTH.test(month)).filter((month, index, all)=>all.indexOf(month) === index).sort() : [];
125
+ const override = data['staffOverride'];
126
+ const ceilingUsd = Number(override == null ? void 0 : override['ceilingUsd']);
127
+ const staffOverride = override && Number.isFinite(ceilingUsd) && ceilingUsd > 0 ? {
128
+ ceilingUsd,
129
+ reason: (_readString = readString(override['reason'])) != null ? _readString : '',
130
+ setBy: (_readString1 = readString(override['setBy'])) != null ? _readString1 : '',
131
+ setAt: readInstant(override['setAt']),
132
+ expiresAt: readInstant(override['expiresAt'])
133
+ } : null;
134
+ const rawPause = data['pause'];
135
+ const pauseReason = readString(rawPause == null ? void 0 : rawPause['reason']);
136
+ const pause = rawPause && pauseReason && PAUSE_REASONS.includes(pauseReason) ? {
137
+ reason: pauseReason,
138
+ invoiceId: readString(rawPause['invoiceId']),
139
+ since: readInstant(rawPause['since'])
140
+ } : null;
141
+ return {
142
+ paymentMethodType,
143
+ firstPaidMonth: firstPaidMonth && MONTH.test(firstPaidMonth) ? firstPaidMonth : null,
144
+ qualifyingMonths: months,
145
+ staffOverride,
146
+ pause,
147
+ lastDisputeAt: readInstant(data['lastDisputeAt'])
148
+ };
149
+ }
150
+ /**
151
+ * The workspace's step on the ladder — one per qualifying month, clamped.
152
+ *
153
+ * Derived rather than stored, so a stored `step` cannot disagree with the
154
+ * months it was supposed to have been derived from. The document carries a
155
+ * mirrored copy for readers that want one figure, and this is what writes it.
156
+ */ export function aiOverageStep(standing) {
157
+ return Math.min(AI_OVERAGE_MAX_STEP, standing.qualifyingMonths.length);
158
+ }
159
+ /** Is a staff override still standing at this instant? */ export function aiOverageOverrideApplies(override, now) {
160
+ if (!override) return false;
161
+ if (!override.expiresAt) return true;
162
+ const expires = Date.parse(override.expiresAt);
163
+ // An unparseable expiry expires the override rather than extending it: a
164
+ // ceiling that was meant to end and cannot say when must not outlive its
165
+ // reason because a timestamp did not read back.
166
+ if (!Number.isFinite(expires)) return false;
167
+ return now.getTime() < expires;
168
+ }
169
+ /**
170
+ * Aglyn's own ceiling on this month's overage, in retail dollars.
171
+ *
172
+ * The staff override when one stands, and the ladder otherwise. This is the
173
+ * platform's limit; the customer's own `capUsd` is a separate figure and the
174
+ * lower of the two binds — see `aiOverageEffectiveCeilingUsd`.
175
+ */ export function aiOverageStandingCeilingUsd(standing, now) {
176
+ if (aiOverageOverrideApplies(standing.staffOverride, now)) {
177
+ return standing.staffOverride.ceilingUsd;
178
+ }
179
+ return AI_OVERAGE_CEILING_LADDER_USD[aiOverageStep(standing)];
180
+ }
181
+ /**
182
+ * The ceiling that actually binds: the lower of the workspace's own and
183
+ * Aglyn's. For display and for staff; the gate consults the two separately,
184
+ * because the customer's ceiling and the platform's need different words.
185
+ */ export function aiOverageEffectiveCeilingUsd(org, standing, now) {
186
+ const own = resolveAssistOverageCapUsd(org);
187
+ const ours = aiOverageStandingCeilingUsd(standing, now);
188
+ return own === null ? ours : Math.min(own, ours);
189
+ }
190
+ /**
191
+ * Whether a card is the default payment method, as far as anyone has looked.
192
+ *
193
+ * `undefined` when nobody has, and callers must handle that third answer
194
+ * rather than coercing it — see `paymentMethodType`.
195
+ */ export function aiOverageCardOnFile(standing) {
196
+ if (standing.paymentMethodType === undefined) return undefined;
197
+ return standing.paymentMethodType === 'card';
198
+ }
199
+ /**
200
+ * The month a qualifying step is recorded under, from a paid invoice.
201
+ *
202
+ * `null` when the payment is not evidence that money moved or that time has
203
+ * passed: an invoice marked paid out of band is a staff action, a zero
204
+ * payment is a credit, and the first paid month is the baseline the ladder
205
+ * counts FROM rather than a step on it.
206
+ */ export function aiOverageQualifyingMonth(standing, payment) {
207
+ if (!MONTH.test(payment.month)) return null;
208
+ if (payment.paidOutOfBand) return null;
209
+ if (!(payment.amountPaidCents > 0)) return null;
210
+ if (!standing.firstPaidMonth) return null;
211
+ if (!(payment.month > standing.firstPaidMonth)) return null;
212
+ return payment.month;
213
+ }
214
+
215
+ //# sourceMappingURL=ai-overage-standing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/billing/ai-overage-standing.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 * A WORKSPACE'S OVERAGE STANDING (AGL-3011) — the pure half.\n *\n * AI credits past a plan's included band are sold on every paid plan. What\n * bounds them is not one number but four facts about the workspace, and this\n * module is the one derivation of all four: whether a card can be charged,\n * whether accrual is paused, how much overage this month may reach, and how\n * much may be outstanding at once.\n *\n * Nothing here reads Firestore, calls Stripe or knows what a month cost.\n * `ai-overage-ledger.ts` holds the documents and `ai-overage-charge.ts` the\n * charging; the gate and the staff card both resolve their figures here, so\n * the ceiling a customer is refused at is the ceiling the card displays.\n *\n * ## The bound, stated once\n *\n * A workspace may leave at most `AI_OVERAGE_UNPAID_LIMIT_USD` of overage\n * unpaid. That is enforced by REFUSING, not by charging — the gate compares\n * what a month accrued against what it paid, inside the reservation\n * transaction, every request. So the bound holds when a charge is late, when\n * Stripe is down, and when the charge path never ran at all. Charging at\n * `AI_OVERAGE_THRESHOLD_USD` exists to keep a workspace working, by settling\n * the balance before it reaches the bound; it is not what makes the bound\n * true.\n */\n\nimport { resolveAssistOverageCapUsd } from '@aglyn/aglyn/app-utils/assist-credits'\nimport type { AglynOrgBilling } from '@aglyn/aglyn/foundation/definitions/org-billing.types'\n\n/** The billing fields of an org, as every resolver in this folder takes it. */\nexport type AiOverageOrg = Partial<AglynOrgBilling> | null | undefined\n\n/**\n * The unbilled overage at which the card on file is charged.\n *\n * Fifty times Stripe's minimum charge, so no charge is refused for being too\n * small; low enough that what is outstanding between charges stays near the\n * bound below; high enough that per-invoice fees stay a few percent.\n */\nexport const AI_OVERAGE_THRESHOLD_USD = 25\n\n/**\n * The most overage a workspace may have accrued and not paid for.\n *\n * Twice the threshold, so one charge in flight plus one accruing is inside\n * it, and a workspace doing ordinary work never meets it. Meeting it means\n * the charges are not settling, and that is exactly when accrual must stop.\n */\nexport const AI_OVERAGE_UNPAID_LIMIT_USD = 50\n\n/**\n * The monthly ceiling, by step. It rises one step for each later calendar\n * month in which the workspace paid an invoice with a real charge.\n *\n * Months, not invoices: every paid workspace pays an invoice the moment it\n * subscribes, and threshold invoices can arrive several times a day, so\n * counting invoices would reach the top step in an afternoon. Counting\n * months takes at least two, which covers much of the window in which a\n * stolen card is reported.\n */\nexport const AI_OVERAGE_CEILING_LADDER_USD = [50, 150, 500] as const\n\n/** The top index of the ladder; `step` is clamped to it. */\nexport const AI_OVERAGE_MAX_STEP = AI_OVERAGE_CEILING_LADDER_USD.length - 1\n\n/**\n * The smallest amount worth an invoice — Stripe's own minimum charge. A\n * close-out remainder under it is carried, not billed: an invoice that\n * cannot be paid is a document that dunning chases forever.\n */\nexport const AI_OVERAGE_MIN_CHARGE_USD = 0.5\n\n/** Bounds on a ceiling staff may write by hand, the customer ceiling's. */\nexport const AI_OVERAGE_STAFF_CEILING_MIN_USD = 1\nexport const AI_OVERAGE_STAFF_CEILING_MAX_USD = 100_000\n\n/** Why overage is paused. Each one is payment trust dropping, differently. */\nexport type AiOveragePauseReason =\n | 'charge_failed'\n | 'past_due'\n | 'dispute'\n | 'staff'\n\n/** A staff ceiling that outranks the ladder. */\nexport interface AiOverageStaffOverride {\n ceilingUsd: number\n reason: string\n setBy: string\n setAt: string | null\n /** ISO instant, or `null` to stand until staff clear it. */\n expiresAt: string | null\n}\n\n/** Accrual stopped, and why. */\nexport interface AiOveragePause {\n reason: AiOveragePauseReason\n /** The invoice that failed, when a charge is what stopped it. */\n invoiceId: string | null\n since: string | null\n}\n\n/**\n * `orgs/{orgId}/aiBilling/standing`, normalized.\n *\n * Written only by the server, read by the gate on every request past the\n * band. The Firestore rules deny every client write and allow the same reads\n * as `aiAllotments`.\n */\nexport interface AiOverageStanding {\n /**\n * The workspace's default payment method type, `null` when it has none,\n * and `undefined` when nobody has looked yet.\n *\n * THREE states, not two, and the third is the important one. A workspace\n * that has been paying for a year has no standing document until something\n * writes one, and reading that absence as \"no card\" would refuse a paying\n * customer's work over a document we never wrote. So \"never observed\"\n * declines to answer the card question and lets the other guards bind —\n * the unpaid bound does not rest on the card check, which is why it can\n * afford to abstain. A pre-cutover backfill is what turns `undefined` into\n * a real answer for existing workspaces.\n */\n paymentMethodType: string | null | undefined\n /** The first month (`YYYY-MM`) an invoice of this workspace's was paid. */\n firstPaidMonth: string | null\n /**\n * Later months with a paid invoice, ascending, the most recent 12 kept. A\n * month is dropped again if an AI charge of that month was still unpaid\n * when the month ended.\n */\n qualifyingMonths: string[]\n staffOverride: AiOverageStaffOverride | null\n pause: AiOveragePause | null\n lastDisputeAt: string | null\n}\n\n/** The standing of a workspace nothing has written a document for. */\nexport const EMPTY_AI_OVERAGE_STANDING: AiOverageStanding = {\n paymentMethodType: undefined,\n firstPaidMonth: null,\n qualifyingMonths: [],\n staffOverride: null,\n pause: null,\n lastDisputeAt: null,\n}\n\n/** How many qualifying months the document keeps. */\nexport const AI_OVERAGE_QUALIFYING_MONTHS_KEPT = 12\n\nconst MONTH = /^\\d{4}-\\d{2}$/\n\nfunction readString(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value.trim() : null\n}\n\nfunction readInstant(value: unknown): string | null {\n if (typeof value === 'string' && value.trim()) return value.trim()\n // A Firestore Timestamp, as the Admin SDK hands one back.\n const toDate = (value as { toDate?: () => Date } | null)?.toDate\n if (typeof toDate === 'function') {\n const date = toDate.call(value)\n return date instanceof Date && !Number.isNaN(date.getTime())\n ? date.toISOString()\n : null\n }\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return value.toISOString()\n }\n return null\n}\n\nconst PAUSE_REASONS: readonly AiOveragePauseReason[] = [\n 'charge_failed',\n 'past_due',\n 'dispute',\n 'staff',\n]\n\n/**\n * Reads the stored document into the shape above, strictly.\n *\n * Strictly, because every field here decides whether a workspace may spend\n * money: a string `\"true\"` that read as a boolean, or a `NaN` ceiling that\n * every comparison passes, is a guard that is not there. Anything that does\n * not narrow is the empty standing's value for that field — which is the\n * conservative answer in each case except the card, where the deliberate\n * answer is \"nobody has looked\".\n */\nexport function readAiOverageStanding(\n data: Record<string, unknown> | null | undefined,\n): AiOverageStanding {\n if (!data || typeof data !== 'object') return EMPTY_AI_OVERAGE_STANDING\n const rawType = data['paymentMethodType']\n const paymentMethodType =\n rawType === undefined\n ? undefined\n : typeof rawType === 'string' && rawType.trim()\n ? rawType.trim()\n : null\n const firstPaidMonth = readString(data['firstPaidMonth'])\n const months = Array.isArray(data['qualifyingMonths'])\n ? (data['qualifyingMonths'] as unknown[])\n .filter((month): month is string => typeof month === 'string' && MONTH.test(month))\n .filter((month, index, all) => all.indexOf(month) === index)\n .sort()\n : []\n const override = data['staffOverride'] as Record<string, unknown> | null | undefined\n const ceilingUsd = Number(override?.['ceilingUsd'])\n const staffOverride: AiOverageStaffOverride | null =\n override && Number.isFinite(ceilingUsd) && ceilingUsd > 0\n ? {\n ceilingUsd,\n reason: readString(override['reason']) ?? '',\n setBy: readString(override['setBy']) ?? '',\n setAt: readInstant(override['setAt']),\n expiresAt: readInstant(override['expiresAt']),\n }\n : null\n const rawPause = data['pause'] as Record<string, unknown> | null | undefined\n const pauseReason = readString(rawPause?.['reason']) as AiOveragePauseReason | null\n const pause: AiOveragePause | null =\n rawPause && pauseReason && PAUSE_REASONS.includes(pauseReason)\n ? {\n reason: pauseReason,\n invoiceId: readString(rawPause['invoiceId']),\n since: readInstant(rawPause['since']),\n }\n : null\n return {\n paymentMethodType,\n firstPaidMonth: firstPaidMonth && MONTH.test(firstPaidMonth) ? firstPaidMonth : null,\n qualifyingMonths: months,\n staffOverride,\n pause,\n lastDisputeAt: readInstant(data['lastDisputeAt']),\n }\n}\n\n/**\n * The workspace's step on the ladder — one per qualifying month, clamped.\n *\n * Derived rather than stored, so a stored `step` cannot disagree with the\n * months it was supposed to have been derived from. The document carries a\n * mirrored copy for readers that want one figure, and this is what writes it.\n */\nexport function aiOverageStep(standing: AiOverageStanding): number {\n return Math.min(AI_OVERAGE_MAX_STEP, standing.qualifyingMonths.length)\n}\n\n/** Is a staff override still standing at this instant? */\nexport function aiOverageOverrideApplies(\n override: AiOverageStaffOverride | null,\n now: Date,\n): boolean {\n if (!override) return false\n if (!override.expiresAt) return true\n const expires = Date.parse(override.expiresAt)\n // An unparseable expiry expires the override rather than extending it: a\n // ceiling that was meant to end and cannot say when must not outlive its\n // reason because a timestamp did not read back.\n if (!Number.isFinite(expires)) return false\n return now.getTime() < expires\n}\n\n/**\n * Aglyn's own ceiling on this month's overage, in retail dollars.\n *\n * The staff override when one stands, and the ladder otherwise. This is the\n * platform's limit; the customer's own `capUsd` is a separate figure and the\n * lower of the two binds — see `aiOverageEffectiveCeilingUsd`.\n */\nexport function aiOverageStandingCeilingUsd(\n standing: AiOverageStanding,\n now: Date,\n): number {\n if (aiOverageOverrideApplies(standing.staffOverride, now)) {\n return standing.staffOverride!.ceilingUsd\n }\n return AI_OVERAGE_CEILING_LADDER_USD[aiOverageStep(standing)]\n}\n\n/**\n * The ceiling that actually binds: the lower of the workspace's own and\n * Aglyn's. For display and for staff; the gate consults the two separately,\n * because the customer's ceiling and the platform's need different words.\n */\nexport function aiOverageEffectiveCeilingUsd(\n org: AiOverageOrg,\n standing: AiOverageStanding,\n now: Date,\n): number {\n const own = resolveAssistOverageCapUsd(org)\n const ours = aiOverageStandingCeilingUsd(standing, now)\n return own === null ? ours : Math.min(own, ours)\n}\n\n/**\n * Whether a card is the default payment method, as far as anyone has looked.\n *\n * `undefined` when nobody has, and callers must handle that third answer\n * rather than coercing it — see `paymentMethodType`.\n */\nexport function aiOverageCardOnFile(\n standing: AiOverageStanding,\n): boolean | undefined {\n if (standing.paymentMethodType === undefined) return undefined\n return standing.paymentMethodType === 'card'\n}\n\n/**\n * The month a qualifying step is recorded under, from a paid invoice.\n *\n * `null` when the payment is not evidence that money moved or that time has\n * passed: an invoice marked paid out of band is a staff action, a zero\n * payment is a credit, and the first paid month is the baseline the ladder\n * counts FROM rather than a step on it.\n */\nexport function aiOverageQualifyingMonth(\n standing: AiOverageStanding,\n payment: { month: string; amountPaidCents: number; paidOutOfBand: boolean },\n): string | null {\n if (!MONTH.test(payment.month)) return null\n if (payment.paidOutOfBand) return null\n if (!(payment.amountPaidCents > 0)) return null\n if (!standing.firstPaidMonth) return null\n if (!(payment.month > standing.firstPaidMonth)) return null\n return payment.month\n}\n"],"names":["resolveAssistOverageCapUsd","AI_OVERAGE_THRESHOLD_USD","AI_OVERAGE_UNPAID_LIMIT_USD","AI_OVERAGE_CEILING_LADDER_USD","AI_OVERAGE_MAX_STEP","length","AI_OVERAGE_MIN_CHARGE_USD","AI_OVERAGE_STAFF_CEILING_MIN_USD","AI_OVERAGE_STAFF_CEILING_MAX_USD","EMPTY_AI_OVERAGE_STANDING","paymentMethodType","undefined","firstPaidMonth","qualifyingMonths","staffOverride","pause","lastDisputeAt","AI_OVERAGE_QUALIFYING_MONTHS_KEPT","MONTH","readString","value","trim","readInstant","toDate","date","call","Date","Number","isNaN","getTime","toISOString","PAUSE_REASONS","readAiOverageStanding","data","rawType","months","Array","isArray","filter","month","test","index","all","indexOf","sort","override","ceilingUsd","isFinite","reason","setBy","setAt","expiresAt","rawPause","pauseReason","includes","invoiceId","since","aiOverageStep","standing","Math","min","aiOverageOverrideApplies","now","expires","parse","aiOverageStandingCeilingUsd","aiOverageEffectiveCeilingUsd","org","own","ours","aiOverageCardOnFile","aiOverageQualifyingMonth","payment","paidOutOfBand","amountPaidCents"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;CAwBC,GAED,SAASA,0BAA0B,QAAQ,wCAAuC;AAMlF;;;;;;CAMC,GACD,OAAO,MAAMC,2BAA2B,GAAE;AAE1C;;;;;;CAMC,GACD,OAAO,MAAMC,8BAA8B,GAAE;AAE7C;;;;;;;;;CASC,GACD,OAAO,MAAMC,gCAAgC;IAAC;IAAI;IAAK;CAAI,CAAS;AAEpE,0DAA0D,GAC1D,OAAO,MAAMC,sBAAsBD,8BAA8BE,MAAM,GAAG,EAAC;AAE3E;;;;CAIC,GACD,OAAO,MAAMC,4BAA4B,IAAG;AAE5C,yEAAyE,GACzE,OAAO,MAAMC,mCAAmC,EAAC;AACjD,OAAO,MAAMC,mCAAmC,OAAO;AA8DvD,oEAAoE,GACpE,OAAO,MAAMC,4BAA+C;IAC1DC,mBAAmBC;IACnBC,gBAAgB;IAChBC,kBAAkB,EAAE;IACpBC,eAAe;IACfC,OAAO;IACPC,eAAe;AACjB,EAAC;AAED,mDAAmD,GACnD,OAAO,MAAMC,oCAAoC,GAAE;AAEnD,MAAMC,QAAQ;AAEd,SAASC,WAAWC,KAAc;IAChC,OAAO,OAAOA,UAAU,YAAYA,MAAMC,IAAI,KAAKD,MAAMC,IAAI,KAAK;AACpE;AAEA,SAASC,YAAYF,KAAc;IACjC,IAAI,OAAOA,UAAU,YAAYA,MAAMC,IAAI,IAAI,OAAOD,MAAMC,IAAI;IAChE,0DAA0D;IAC1D,MAAME,SAAUH,yBAAD,AAACA,MAA0CG,MAAM;IAChE,IAAI,OAAOA,WAAW,YAAY;QAChC,MAAMC,OAAOD,OAAOE,IAAI,CAACL;QACzB,OAAOI,gBAAgBE,QAAQ,CAACC,OAAOC,KAAK,CAACJ,KAAKK,OAAO,MACrDL,KAAKM,WAAW,KAChB;IACN;IACA,IAAIV,iBAAiBM,QAAQ,CAACC,OAAOC,KAAK,CAACR,MAAMS,OAAO,KAAK;QAC3D,OAAOT,MAAMU,WAAW;IAC1B;IACA,OAAO;AACT;AAEA,MAAMC,gBAAiD;IACrD;IACA;IACA;IACA;CACD;AAED;;;;;;;;;CASC,GACD,OAAO,SAASC,sBACdC,IAAgD;QAuBhCd,aACDA;IAtBf,IAAI,CAACc,QAAQ,OAAOA,SAAS,UAAU,OAAOxB;IAC9C,MAAMyB,UAAUD,IAAI,CAAC,oBAAoB;IACzC,MAAMvB,oBACJwB,YAAYvB,YACRA,YACA,OAAOuB,YAAY,YAAYA,QAAQb,IAAI,KACzCa,QAAQb,IAAI,KACZ;IACR,MAAMT,iBAAiBO,WAAWc,IAAI,CAAC,iBAAiB;IACxD,MAAME,SAASC,MAAMC,OAAO,CAACJ,IAAI,CAAC,mBAAmB,IACjD,AAACA,IAAI,CAAC,mBAAmB,CACtBK,MAAM,CAAC,CAACC,QAA2B,OAAOA,UAAU,YAAYrB,MAAMsB,IAAI,CAACD,QAC3ED,MAAM,CAAC,CAACC,OAAOE,OAAOC,MAAQA,IAAIC,OAAO,CAACJ,WAAWE,OACrDG,IAAI,KACP,EAAE;IACN,MAAMC,WAAWZ,IAAI,CAAC,gBAAgB;IACtC,MAAMa,aAAanB,OAAOkB,4BAAAA,QAAU,CAAC,aAAa;IAClD,MAAM/B,gBACJ+B,YAAYlB,OAAOoB,QAAQ,CAACD,eAAeA,aAAa,IACpD;QACEA;QACAE,MAAM,GAAE7B,cAAAA,WAAW0B,QAAQ,CAAC,SAAS,aAA7B1B,cAAkC;QAC1C8B,KAAK,GAAE9B,eAAAA,WAAW0B,QAAQ,CAAC,QAAQ,aAA5B1B,eAAiC;QACxC+B,OAAO5B,YAAYuB,QAAQ,CAAC,QAAQ;QACpCM,WAAW7B,YAAYuB,QAAQ,CAAC,YAAY;IAC9C,IACA;IACN,MAAMO,WAAWnB,IAAI,CAAC,QAAQ;IAC9B,MAAMoB,cAAclC,WAAWiC,4BAAAA,QAAU,CAAC,SAAS;IACnD,MAAMrC,QACJqC,YAAYC,eAAetB,cAAcuB,QAAQ,CAACD,eAC9C;QACEL,QAAQK;QACRE,WAAWpC,WAAWiC,QAAQ,CAAC,YAAY;QAC3CI,OAAOlC,YAAY8B,QAAQ,CAAC,QAAQ;IACtC,IACA;IACN,OAAO;QACL1C;QACAE,gBAAgBA,kBAAkBM,MAAMsB,IAAI,CAAC5B,kBAAkBA,iBAAiB;QAChFC,kBAAkBsB;QAClBrB;QACAC;QACAC,eAAeM,YAAYW,IAAI,CAAC,gBAAgB;IAClD;AACF;AAEA;;;;;;CAMC,GACD,OAAO,SAASwB,cAAcC,QAA2B;IACvD,OAAOC,KAAKC,GAAG,CAACxD,qBAAqBsD,SAAS7C,gBAAgB,CAACR,MAAM;AACvE;AAEA,wDAAwD,GACxD,OAAO,SAASwD,yBACdhB,QAAuC,EACvCiB,GAAS;IAET,IAAI,CAACjB,UAAU,OAAO;IACtB,IAAI,CAACA,SAASM,SAAS,EAAE,OAAO;IAChC,MAAMY,UAAUrC,KAAKsC,KAAK,CAACnB,SAASM,SAAS;IAC7C,yEAAyE;IACzE,yEAAyE;IACzE,gDAAgD;IAChD,IAAI,CAACxB,OAAOoB,QAAQ,CAACgB,UAAU,OAAO;IACtC,OAAOD,IAAIjC,OAAO,KAAKkC;AACzB;AAEA;;;;;;CAMC,GACD,OAAO,SAASE,4BACdP,QAA2B,EAC3BI,GAAS;IAET,IAAID,yBAAyBH,SAAS5C,aAAa,EAAEgD,MAAM;QACzD,OAAOJ,SAAS5C,aAAa,CAAEgC,UAAU;IAC3C;IACA,OAAO3C,6BAA6B,CAACsD,cAAcC,UAAU;AAC/D;AAEA;;;;CAIC,GACD,OAAO,SAASQ,6BACdC,GAAiB,EACjBT,QAA2B,EAC3BI,GAAS;IAET,MAAMM,MAAMpE,2BAA2BmE;IACvC,MAAME,OAAOJ,4BAA4BP,UAAUI;IACnD,OAAOM,QAAQ,OAAOC,OAAOV,KAAKC,GAAG,CAACQ,KAAKC;AAC7C;AAEA;;;;;CAKC,GACD,OAAO,SAASC,oBACdZ,QAA2B;IAE3B,IAAIA,SAAShD,iBAAiB,KAAKC,WAAW,OAAOA;IACrD,OAAO+C,SAAShD,iBAAiB,KAAK;AACxC;AAEA;;;;;;;CAOC,GACD,OAAO,SAAS6D,yBACdb,QAA2B,EAC3Bc,OAA2E;IAE3E,IAAI,CAACtD,MAAMsB,IAAI,CAACgC,QAAQjC,KAAK,GAAG,OAAO;IACvC,IAAIiC,QAAQC,aAAa,EAAE,OAAO;IAClC,IAAI,CAAED,CAAAA,QAAQE,eAAe,GAAG,CAAA,GAAI,OAAO;IAC3C,IAAI,CAAChB,SAAS9C,cAAc,EAAE,OAAO;IACrC,IAAI,CAAE4D,CAAAA,QAAQjC,KAAK,GAAGmB,SAAS9C,cAAc,AAAD,GAAI,OAAO;IACvD,OAAO4D,QAAQjC,KAAK;AACtB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Charges the workspace's accrued overage if it has reached the threshold.
19
+ *
20
+ * Returns quietly on every "nothing to do" — before the cutover, no org
21
+ * document, no Stripe customer — because this is called after every metered
22
+ * turn and a thrown error on the ordinary path would fill the logs with the
23
+ * ordinary path.
24
+ */
25
+ export declare function chargeAccruedAiOverage(firestore: FirebaseFirestore.Firestore, orgId: string, month: string, now?: Date): Promise<void>;
26
+ /**
27
+ * The same, for a caller that has no Firestore handle of its own — the
28
+ * close-out sweep and the staff route, which run outside a metered turn.
29
+ */
30
+ export declare function aiOverageFirestore(): FirebaseFirestore.Firestore;
@@ -0,0 +1,76 @@
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
+ * WHAT A METERED TURN OWES THE CHARGE PATH (AGL-3011).
18
+ *
19
+ * The meter's two writers call this once their batch has committed. It reads
20
+ * what the charge needs — the org's plan and its Stripe customer — and hands
21
+ * it to `maybeChargeAiOverage`.
22
+ *
23
+ * ## Why the reads live here and not in the meter
24
+ *
25
+ * `assist-usage.ts` deliberately keeps the admin lib's `firebase-admin`
26
+ * module out of its import graph, so that every unit test touching a counter
27
+ * does not drag a cert credential, RTDB and AppCheck along with it. This
28
+ * module is loaded through a dynamic import from there, exactly as the
29
+ * allotment alerts are, so the meter's graph is unchanged and the cost of
30
+ * these reads is paid only on a turn that could produce a charge.
31
+ *
32
+ * ## Why the reads are affordable
33
+ *
34
+ * Nothing here runs before the cutover month — the caller checks that first,
35
+ * and so does `maybeChargeAiOverage`. Once charging is on, two reads on a
36
+ * metered turn sit beside a model call that costs orders of magnitude more.
37
+ *
38
+ * ## Why losing this is survivable
39
+ *
40
+ * It runs off the request's await path, so a killed process can drop it. The
41
+ * money is still bounded: the gate refuses at the unpaid limit whether or
42
+ * not a charge ever ran, the next turn tries again, and the reconcile sweep
43
+ * finishes anything left half-done.
44
+ */ import { firebaseAdmin, readOrgBilling } from "@aglyn/tenant-data-admin";
45
+ import { maybeChargeAiOverage } from "./ai-overage-charge.js";
46
+ import { aiOverageBillsByInvoice } from "./ai-overage-cutover.js";
47
+ /**
48
+ * Charges the workspace's accrued overage if it has reached the threshold.
49
+ *
50
+ * Returns quietly on every "nothing to do" — before the cutover, no org
51
+ * document, no Stripe customer — because this is called after every metered
52
+ * turn and a thrown error on the ordinary path would fill the logs with the
53
+ * ordinary path.
54
+ */ export async function chargeAccruedAiOverage(firestore, orgId, month, now = new Date()) {
55
+ var _ref, _orgSnapshot_data;
56
+ if (!aiOverageBillsByInvoice(month)) return;
57
+ const orgSnapshot = await firestore.collection('orgs').doc(orgId).get();
58
+ if (!orgSnapshot.exists) return;
59
+ const billing = await readOrgBilling(orgId);
60
+ const stripeCustomerId = String((_ref = billing == null ? void 0 : billing.stripeCustomerId) != null ? _ref : '') || null;
61
+ await maybeChargeAiOverage(firestore, {
62
+ orgId,
63
+ org: (_orgSnapshot_data = orgSnapshot.data()) != null ? _orgSnapshot_data : {},
64
+ month,
65
+ stripeCustomerId,
66
+ now
67
+ });
68
+ }
69
+ /**
70
+ * The same, for a caller that has no Firestore handle of its own — the
71
+ * close-out sweep and the staff route, which run outside a metered turn.
72
+ */ export function aiOverageFirestore() {
73
+ return firebaseAdmin.app().firestore();
74
+ }
75
+
76
+ //# sourceMappingURL=ai-overage-trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/billing/ai-overage-trigger.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 * WHAT A METERED TURN OWES THE CHARGE PATH (AGL-3011).\n *\n * The meter's two writers call this once their batch has committed. It reads\n * what the charge needs — the org's plan and its Stripe customer — and hands\n * it to `maybeChargeAiOverage`.\n *\n * ## Why the reads live here and not in the meter\n *\n * `assist-usage.ts` deliberately keeps the admin lib's `firebase-admin`\n * module out of its import graph, so that every unit test touching a counter\n * does not drag a cert credential, RTDB and AppCheck along with it. This\n * module is loaded through a dynamic import from there, exactly as the\n * allotment alerts are, so the meter's graph is unchanged and the cost of\n * these reads is paid only on a turn that could produce a charge.\n *\n * ## Why the reads are affordable\n *\n * Nothing here runs before the cutover month — the caller checks that first,\n * and so does `maybeChargeAiOverage`. Once charging is on, two reads on a\n * metered turn sit beside a model call that costs orders of magnitude more.\n *\n * ## Why losing this is survivable\n *\n * It runs off the request's await path, so a killed process can drop it. The\n * money is still bounded: the gate refuses at the unpaid limit whether or\n * not a charge ever ran, the next turn tries again, and the reconcile sweep\n * finishes anything left half-done.\n */\n\nimport { firebaseAdmin, readOrgBilling } from '@aglyn/tenant-data-admin'\nimport { maybeChargeAiOverage } from './ai-overage-charge'\nimport { aiOverageBillsByInvoice } from './ai-overage-cutover'\n\n/**\n * Charges the workspace's accrued overage if it has reached the threshold.\n *\n * Returns quietly on every \"nothing to do\" — before the cutover, no org\n * document, no Stripe customer — because this is called after every metered\n * turn and a thrown error on the ordinary path would fill the logs with the\n * ordinary path.\n */\nexport async function chargeAccruedAiOverage(\n firestore: FirebaseFirestore.Firestore,\n orgId: string,\n month: string,\n now = new Date(),\n): Promise<void> {\n if (!aiOverageBillsByInvoice(month)) return\n const orgSnapshot = await firestore.collection('orgs').doc(orgId).get()\n if (!orgSnapshot.exists) return\n const billing = await readOrgBilling(orgId)\n const stripeCustomerId = String(billing?.stripeCustomerId ?? '') || null\n await maybeChargeAiOverage(firestore, {\n orgId,\n org: (orgSnapshot.data() ?? {}) as never,\n month,\n stripeCustomerId,\n now,\n })\n}\n\n/**\n * The same, for a caller that has no Firestore handle of its own — the\n * close-out sweep and the staff route, which run outside a metered turn.\n */\nexport function aiOverageFirestore(): FirebaseFirestore.Firestore {\n return firebaseAdmin.app().firestore()\n}\n"],"names":["firebaseAdmin","readOrgBilling","maybeChargeAiOverage","aiOverageBillsByInvoice","chargeAccruedAiOverage","firestore","orgId","month","now","Date","orgSnapshot","collection","doc","get","exists","billing","stripeCustomerId","String","org","data","aiOverageFirestore","app"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BC,GAED,SAASA,aAAa,EAAEC,cAAc,QAAQ,2BAA0B;AACxE,SAASC,oBAAoB,QAAQ,yBAAqB;AAC1D,SAASC,uBAAuB,QAAQ,0BAAsB;AAE9D;;;;;;;CAOC,GACD,OAAO,eAAeC,uBACpBC,SAAsC,EACtCC,KAAa,EACbC,KAAa,EACbC,MAAM,IAAIC,MAAM;cASRC;IAPR,IAAI,CAACP,wBAAwBI,QAAQ;IACrC,MAAMG,cAAc,MAAML,UAAUM,UAAU,CAAC,QAAQC,GAAG,CAACN,OAAOO,GAAG;IACrE,IAAI,CAACH,YAAYI,MAAM,EAAE;IACzB,MAAMC,UAAU,MAAMd,eAAeK;IACrC,MAAMU,mBAAmBC,eAAOF,2BAAAA,QAASC,gBAAgB,mBAAI,OAAO;IACpE,MAAMd,qBAAqBG,WAAW;QACpCC;QACAY,GAAG,GAAGR,oBAAAA,YAAYS,IAAI,cAAhBT,oBAAsB,CAAC;QAC7BH;QACAS;QACAR;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,SAASY;IACd,OAAOpB,cAAcqB,GAAG,GAAGhB,SAAS;AACtC"}
@@ -0,0 +1,40 @@
1
+ import { type AiAllotmentMode } from '../model/ai-allotments';
2
+ export interface AiAllotmentValue {
3
+ credits: number | null;
4
+ mode: AiAllotmentMode;
5
+ models: string[] | null;
6
+ }
7
+ export interface AiAllotmentEditorProps {
8
+ open: boolean;
9
+ title: string;
10
+ /** One sentence under the title: whose allotment, and what it bounds. */
11
+ description?: string;
12
+ /** The allotment as it stands, or `null` for a new one. */
13
+ initial: AiAllotmentValue | null;
14
+ /** The models an allowlist may name, from the allotments route. */
15
+ models: ReadonlyArray<{
16
+ id: string;
17
+ label: string;
18
+ }>;
19
+ /** The org-wide restriction: models only, no credits and no mode. */
20
+ modelsOnly?: boolean;
21
+ /** The workspace's pool, for the note that an allotment never grants past it. */
22
+ poolLimit?: number | null;
23
+ busy?: boolean;
24
+ error?: string | null;
25
+ onClose: () => void;
26
+ onSave: (value: AiAllotmentValue) => void;
27
+ /** Offered when the allotment exists. */
28
+ onRemove?: () => void;
29
+ }
30
+ /**
31
+ * THE ALLOTMENT EDITOR (AGL-2942): credits a month, hard or soft, and an
32
+ * optional model allowlist — one dialog for a member, a collaborator, a
33
+ * site, a bulk selection and the org-wide restriction, so the four places a
34
+ * manager sets an allotment ask the same questions in the same words.
35
+ */
36
+ export declare function AiAllotmentEditor(props: AiAllotmentEditorProps): import("react").JSX.Element;
37
+ export declare namespace AiAllotmentEditor {
38
+ var displayName: string;
39
+ }
40
+ export default AiAllotmentEditor;
@@ -0,0 +1,213 @@
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
+ */ 'use client';
17
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
18
+ import { Alert, Button, Checkbox, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, FormControlLabel, FormGroup, FormHelperText, FormLabel, Radio, RadioGroup, Stack, TextField, Typography } from "@mui/material";
19
+ import { useEffect, useState } from "react";
20
+ import { AI_ALLOTMENT_MAX_CREDITS } from "../model/ai-allotments.js";
21
+ /**
22
+ * THE ALLOTMENT EDITOR (AGL-2942): credits a month, hard or soft, and an
23
+ * optional model allowlist — one dialog for a member, a collaborator, a
24
+ * site, a bulk selection and the org-wide restriction, so the four places a
25
+ * manager sets an allotment ask the same questions in the same words.
26
+ */ export function AiAllotmentEditor(props) {
27
+ var _ref, _ref1, _ref2;
28
+ const { open, initial, models, modelsOnly, poolLimit, busy, error } = props;
29
+ const [credits, setCredits] = useState('');
30
+ const [mode, setMode] = useState('hard');
31
+ const [allowed, setAllowed] = useState([]);
32
+ const [invalid, setInvalid] = useState(null);
33
+ // Reset from the allotment each time the dialog opens, keyed on the open
34
+ // flag and the values rather than on the object's identity.
35
+ const initialCredits = (_ref = initial == null ? void 0 : initial.credits) != null ? _ref : null;
36
+ const initialMode = (_ref1 = initial == null ? void 0 : initial.mode) != null ? _ref1 : 'hard';
37
+ const initialModels = ((_ref2 = initial == null ? void 0 : initial.models) != null ? _ref2 : []).join('\n');
38
+ useEffect(()=>{
39
+ if (!open) return;
40
+ setCredits(initialCredits === null ? '' : String(initialCredits));
41
+ setMode(initialMode);
42
+ setAllowed(initialModels ? initialModels.split('\n') : []);
43
+ setInvalid(null);
44
+ }, [
45
+ open,
46
+ initialCredits,
47
+ initialMode,
48
+ initialModels
49
+ ]);
50
+ const parsedCredits = credits.trim() === '' ? null : Number(credits);
51
+ const save = ()=>{
52
+ if (!modelsOnly) {
53
+ if (parsedCredits !== null && (!Number.isInteger(parsedCredits) || parsedCredits < 1 || parsedCredits > AI_ALLOTMENT_MAX_CREDITS)) {
54
+ setInvalid('Enter a whole number of credits, 1 or more.');
55
+ return;
56
+ }
57
+ if (parsedCredits === null && !allowed.length) {
58
+ setInvalid('Set credits, choose models, or remove the allotment.');
59
+ return;
60
+ }
61
+ }
62
+ setInvalid(null);
63
+ props.onSave({
64
+ credits: modelsOnly ? null : parsedCredits,
65
+ mode,
66
+ models: allowed.length ? allowed : null
67
+ });
68
+ };
69
+ const toggle = (id)=>setAllowed((current)=>current.includes(id) ? current.filter((entry)=>entry !== id) : [
70
+ ...current,
71
+ id
72
+ ]);
73
+ return /*#__PURE__*/ _jsxs(Dialog, {
74
+ open: open,
75
+ onClose: busy ? undefined : props.onClose,
76
+ maxWidth: "xs",
77
+ fullWidth: true,
78
+ children: [
79
+ /*#__PURE__*/ _jsx(DialogTitle, {
80
+ children: props.title
81
+ }),
82
+ /*#__PURE__*/ _jsxs(DialogContent, {
83
+ sx: {
84
+ display: 'flex',
85
+ flexDirection: 'column',
86
+ gap: 2,
87
+ pt: 1
88
+ },
89
+ children: [
90
+ props.description ? /*#__PURE__*/ _jsx(Typography, {
91
+ variant: "body2",
92
+ color: "text.secondary",
93
+ children: props.description
94
+ }) : null,
95
+ modelsOnly ? null : /*#__PURE__*/ _jsxs(_Fragment, {
96
+ children: [
97
+ /*#__PURE__*/ _jsx(TextField, {
98
+ label: "Credits a month",
99
+ type: "number",
100
+ size: "small",
101
+ value: credits,
102
+ onChange: (event)=>setCredits(event.target.value),
103
+ disabled: busy,
104
+ slotProps: {
105
+ htmlInput: {
106
+ min: 1,
107
+ step: 100
108
+ }
109
+ },
110
+ helperText: poolLimit && parsedCredits && parsedCredits > poolLimit ? `Larger than the workspace's ${poolLimit.toLocaleString()} credits — the workspace's pool still stops first.` : 'Counted from the first of the month (UTC). Leave empty to limit models only.'
111
+ }),
112
+ /*#__PURE__*/ _jsxs("div", {
113
+ children: [
114
+ /*#__PURE__*/ _jsx(FormLabel, {
115
+ id: "ai-allotment-mode",
116
+ children: 'At the allotment'
117
+ }),
118
+ /*#__PURE__*/ _jsxs(RadioGroup, {
119
+ "aria-labelledby": "ai-allotment-mode",
120
+ value: mode,
121
+ onChange: (event)=>setMode(event.target.value),
122
+ children: [
123
+ /*#__PURE__*/ _jsx(FormControlLabel, {
124
+ value: "hard",
125
+ control: /*#__PURE__*/ _jsx(Radio, {
126
+ size: "small"
127
+ }),
128
+ disabled: busy,
129
+ label: "Stop AI requests (hard)"
130
+ }),
131
+ /*#__PURE__*/ _jsx(FormControlLabel, {
132
+ value: "soft",
133
+ control: /*#__PURE__*/ _jsx(Radio, {
134
+ size: "small"
135
+ }),
136
+ disabled: busy,
137
+ label: "Keep going and alert at 80% and 100% (soft)"
138
+ })
139
+ ]
140
+ })
141
+ ]
142
+ })
143
+ ]
144
+ }),
145
+ models.length ? /*#__PURE__*/ _jsxs("div", {
146
+ children: [
147
+ /*#__PURE__*/ _jsx(FormLabel, {
148
+ component: "legend",
149
+ children: modelsOnly ? 'Models the organization may use' : 'Limit to these models (optional)'
150
+ }),
151
+ /*#__PURE__*/ _jsx(FormGroup, {
152
+ children: models.map((model)=>/*#__PURE__*/ _jsx(FormControlLabel, {
153
+ control: /*#__PURE__*/ _jsx(Checkbox, {
154
+ size: "small",
155
+ checked: allowed.includes(model.id),
156
+ onChange: ()=>toggle(model.id),
157
+ disabled: busy
158
+ }),
159
+ label: model.label
160
+ }, model.id))
161
+ }),
162
+ /*#__PURE__*/ _jsx(FormHelperText, {
163
+ children: modelsOnly ? 'None checked means no restriction. Auto keeps choosing among the checked models.' : 'None checked means every model the plan offers. Auto keeps choosing among the checked models.'
164
+ })
165
+ ]
166
+ }) : null,
167
+ invalid || error ? /*#__PURE__*/ _jsx(Alert, {
168
+ severity: "error",
169
+ children: invalid != null ? invalid : error
170
+ }) : null
171
+ ]
172
+ }),
173
+ /*#__PURE__*/ _jsxs(DialogActions, {
174
+ children: [
175
+ props.onRemove ? /*#__PURE__*/ _jsx(Button, {
176
+ color: "error",
177
+ disabled: busy,
178
+ onClick: props.onRemove,
179
+ sx: {
180
+ mr: 'auto'
181
+ },
182
+ children: modelsOnly ? 'Clear restriction' : 'Remove allotment'
183
+ }) : null,
184
+ /*#__PURE__*/ _jsx(Button, {
185
+ disabled: busy,
186
+ onClick: props.onClose,
187
+ children: 'Cancel'
188
+ }),
189
+ /*#__PURE__*/ _jsx(Stack, {
190
+ direction: "row",
191
+ spacing: 1,
192
+ sx: {
193
+ alignItems: 'center'
194
+ },
195
+ children: /*#__PURE__*/ _jsx(Button, {
196
+ variant: "contained",
197
+ disabled: busy,
198
+ onClick: save,
199
+ startIcon: busy ? /*#__PURE__*/ _jsx(CircularProgress, {
200
+ size: 16
201
+ }) : undefined,
202
+ children: busy ? 'Saving…' : 'Save'
203
+ })
204
+ })
205
+ ]
206
+ })
207
+ ]
208
+ });
209
+ }
210
+ AiAllotmentEditor.displayName = 'AiAllotmentEditor';
211
+ export default AiAllotmentEditor;
212
+
213
+ //# sourceMappingURL=ai-allotment-editor.component.js.map