@aglyn/plugins-ai 1.0.0-beta.143

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (717) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +25 -0
  3. package/package.json +60 -0
  4. package/src/index.d.ts +21 -0
  5. package/src/index.js +22 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/activity/ai-activity-actions.d.ts +106 -0
  8. package/src/lib/activity/ai-activity-actions.js +209 -0
  9. package/src/lib/activity/ai-activity-actions.js.map +1 -0
  10. package/src/lib/activity/ai-activity.d.ts +219 -0
  11. package/src/lib/activity/ai-activity.js +251 -0
  12. package/src/lib/activity/ai-activity.js.map +1 -0
  13. package/src/lib/billing/ai-overage-charge.d.ts +102 -0
  14. package/src/lib/billing/ai-overage-charge.js +258 -0
  15. package/src/lib/billing/ai-overage-charge.js.map +1 -0
  16. package/src/lib/billing/ai-overage-close.d.ts +62 -0
  17. package/src/lib/billing/ai-overage-close.js +129 -0
  18. package/src/lib/billing/ai-overage-close.js.map +1 -0
  19. package/src/lib/billing/ai-overage-cutover.d.ts +63 -0
  20. package/src/lib/billing/ai-overage-cutover.js +114 -0
  21. package/src/lib/billing/ai-overage-cutover.js.map +1 -0
  22. package/src/lib/billing/ai-overage-events.d.ts +77 -0
  23. package/src/lib/billing/ai-overage-events.js +174 -0
  24. package/src/lib/billing/ai-overage-events.js.map +1 -0
  25. package/src/lib/billing/ai-overage-gate.d.ts +147 -0
  26. package/src/lib/billing/ai-overage-gate.js +177 -0
  27. package/src/lib/billing/ai-overage-gate.js.map +1 -0
  28. package/src/lib/billing/ai-overage-ledger.d.ts +135 -0
  29. package/src/lib/billing/ai-overage-ledger.js +278 -0
  30. package/src/lib/billing/ai-overage-ledger.js.map +1 -0
  31. package/src/lib/billing/ai-overage-standing-writes.d.ts +110 -0
  32. package/src/lib/billing/ai-overage-standing-writes.js +205 -0
  33. package/src/lib/billing/ai-overage-standing-writes.js.map +1 -0
  34. package/src/lib/billing/ai-overage-standing.d.ts +168 -0
  35. package/src/lib/billing/ai-overage-standing.js +215 -0
  36. package/src/lib/billing/ai-overage-standing.js.map +1 -0
  37. package/src/lib/billing/ai-overage-trigger.d.ts +30 -0
  38. package/src/lib/billing/ai-overage-trigger.js +76 -0
  39. package/src/lib/billing/ai-overage-trigger.js.map +1 -0
  40. package/src/lib/components/ai-allotment-editor.component.d.ts +40 -0
  41. package/src/lib/components/ai-allotment-editor.component.js +213 -0
  42. package/src/lib/components/ai-allotment-editor.component.js.map +1 -0
  43. package/src/lib/components/ai-assist-actions-context.d.ts +13 -0
  44. package/src/lib/components/ai-assist-actions-context.js +21 -0
  45. package/src/lib/components/ai-assist-actions-context.js.map +1 -0
  46. package/src/lib/components/ai-assist-provider.component.d.ts +51 -0
  47. package/src/lib/components/ai-assist-provider.component.js +519 -0
  48. package/src/lib/components/ai-assist-provider.component.js.map +1 -0
  49. package/src/lib/components/ai-brief-dialog.component.d.ts +56 -0
  50. package/src/lib/components/ai-brief-dialog.component.js +319 -0
  51. package/src/lib/components/ai-brief-dialog.component.js.map +1 -0
  52. package/src/lib/components/ai-collaborator-permissions-column.component.d.ts +32 -0
  53. package/src/lib/components/ai-collaborator-permissions-column.component.js +132 -0
  54. package/src/lib/components/ai-collaborator-permissions-column.component.js.map +1 -0
  55. package/src/lib/components/ai-credits-card.component.d.ts +34 -0
  56. package/src/lib/components/ai-credits-card.component.js +131 -0
  57. package/src/lib/components/ai-credits-card.component.js.map +1 -0
  58. package/src/lib/components/ai-credits-columns.component.d.ts +56 -0
  59. package/src/lib/components/ai-credits-columns.component.js +118 -0
  60. package/src/lib/components/ai-credits-columns.component.js.map +1 -0
  61. package/src/lib/components/ai-crm-email-draft.component.d.ts +17 -0
  62. package/src/lib/components/ai-crm-email-draft.component.js +159 -0
  63. package/src/lib/components/ai-crm-email-draft.component.js.map +1 -0
  64. package/src/lib/components/ai-crm-import-mapping.component.d.ts +20 -0
  65. package/src/lib/components/ai-crm-import-mapping.component.js +167 -0
  66. package/src/lib/components/ai-crm-import-mapping.component.js.map +1 -0
  67. package/src/lib/components/ai-crm-record-card.component.d.ts +27 -0
  68. package/src/lib/components/ai-crm-record-card.component.js +263 -0
  69. package/src/lib/components/ai-crm-record-card.component.js.map +1 -0
  70. package/src/lib/components/ai-describe-automation.component.d.ts +31 -0
  71. package/src/lib/components/ai-describe-automation.component.js +226 -0
  72. package/src/lib/components/ai-describe-automation.component.js.map +1 -0
  73. package/src/lib/components/ai-describe-button.component.d.ts +39 -0
  74. package/src/lib/components/ai-describe-button.component.js +87 -0
  75. package/src/lib/components/ai-describe-button.component.js.map +1 -0
  76. package/src/lib/components/ai-describe-page.component.d.ts +26 -0
  77. package/src/lib/components/ai-describe-page.component.js +18 -0
  78. package/src/lib/components/ai-describe-page.component.js.map +1 -0
  79. package/src/lib/components/ai-experiment-cards.component.d.ts +75 -0
  80. package/src/lib/components/ai-experiment-cards.component.js +573 -0
  81. package/src/lib/components/ai-experiment-cards.component.js.map +1 -0
  82. package/src/lib/components/ai-explain-automation.component.d.ts +31 -0
  83. package/src/lib/components/ai-explain-automation.component.js +265 -0
  84. package/src/lib/components/ai-explain-automation.component.js.map +1 -0
  85. package/src/lib/components/ai-insight-dialog.component.d.ts +37 -0
  86. package/src/lib/components/ai-insight-dialog.component.js +441 -0
  87. package/src/lib/components/ai-insight-dialog.component.js.map +1 -0
  88. package/src/lib/components/ai-job-plan.component.d.ts +46 -0
  89. package/src/lib/components/ai-job-plan.component.js +192 -0
  90. package/src/lib/components/ai-job-plan.component.js.map +1 -0
  91. package/src/lib/components/ai-model-selector.component.d.ts +21 -0
  92. package/src/lib/components/ai-model-selector.component.js +109 -0
  93. package/src/lib/components/ai-model-selector.component.js.map +1 -0
  94. package/src/lib/components/ai-page-brief-dialog.component.d.ts +29 -0
  95. package/src/lib/components/ai-page-brief-dialog.component.js +27 -0
  96. package/src/lib/components/ai-page-brief-dialog.component.js.map +1 -0
  97. package/src/lib/components/ai-permissions-on-host.component.d.ts +55 -0
  98. package/src/lib/components/ai-permissions-on-host.component.js +91 -0
  99. package/src/lib/components/ai-permissions-on-host.component.js.map +1 -0
  100. package/src/lib/components/ai-product-copy-card.component.d.ts +25 -0
  101. package/src/lib/components/ai-product-copy-card.component.js +328 -0
  102. package/src/lib/components/ai-product-copy-card.component.js.map +1 -0
  103. package/src/lib/components/ai-product-import-option.component.d.ts +14 -0
  104. package/src/lib/components/ai-product-import-option.component.js +58 -0
  105. package/src/lib/components/ai-product-import-option.component.js.map +1 -0
  106. package/src/lib/components/ai-products-hub-card.component.d.ts +15 -0
  107. package/src/lib/components/ai-products-hub-card.component.js +418 -0
  108. package/src/lib/components/ai-products-hub-card.component.js.map +1 -0
  109. package/src/lib/components/ai-products-proposals.component.d.ts +19 -0
  110. package/src/lib/components/ai-products-proposals.component.js +547 -0
  111. package/src/lib/components/ai-products-proposals.component.js.map +1 -0
  112. package/src/lib/components/ai-save-as-component.component.d.ts +38 -0
  113. package/src/lib/components/ai-save-as-component.component.js +231 -0
  114. package/src/lib/components/ai-save-as-component.component.js.map +1 -0
  115. package/src/lib/components/ai-seo-audit-card.component.d.ts +9 -0
  116. package/src/lib/components/ai-seo-audit-card.component.js +620 -0
  117. package/src/lib/components/ai-seo-audit-card.component.js.map +1 -0
  118. package/src/lib/components/ai-seo-fields-card.component.d.ts +10 -0
  119. package/src/lib/components/ai-seo-fields-card.component.js +453 -0
  120. package/src/lib/components/ai-seo-fields-card.component.js.map +1 -0
  121. package/src/lib/components/ai-site-batch-card.component.d.ts +32 -0
  122. package/src/lib/components/ai-site-batch-card.component.js +531 -0
  123. package/src/lib/components/ai-site-batch-card.component.js.map +1 -0
  124. package/src/lib/components/ai-site-seo-start-card.component.d.ts +26 -0
  125. package/src/lib/components/ai-site-seo-start-card.component.js +178 -0
  126. package/src/lib/components/ai-site-seo-start-card.component.js.map +1 -0
  127. package/src/lib/components/ai-site-start-card.component.d.ts +19 -0
  128. package/src/lib/components/ai-site-start-card.component.js +348 -0
  129. package/src/lib/components/ai-site-start-card.component.js.map +1 -0
  130. package/src/lib/components/ai-template-collection-field.component.d.ts +32 -0
  131. package/src/lib/components/ai-template-collection-field.component.js +63 -0
  132. package/src/lib/components/ai-template-collection-field.component.js.map +1 -0
  133. package/src/lib/components/ai-theme-proposal-card.component.d.ts +6 -0
  134. package/src/lib/components/ai-theme-proposal-card.component.js +619 -0
  135. package/src/lib/components/ai-theme-proposal-card.component.js.map +1 -0
  136. package/src/lib/components/ai-usage-strip.component.d.ts +27 -0
  137. package/src/lib/components/ai-usage-strip.component.js +145 -0
  138. package/src/lib/components/ai-usage-strip.component.js.map +1 -0
  139. package/src/lib/components/assist-edit-canvas.d.ts +169 -0
  140. package/src/lib/components/assist-edit-canvas.js +636 -0
  141. package/src/lib/components/assist-edit-canvas.js.map +1 -0
  142. package/src/lib/components/assist-edit-card.component.d.ts +16 -0
  143. package/src/lib/components/assist-edit-card.component.js +181 -0
  144. package/src/lib/components/assist-edit-card.component.js.map +1 -0
  145. package/src/lib/components/assist-jobs-drawer.component.d.ts +72 -0
  146. package/src/lib/components/assist-jobs-drawer.component.js +626 -0
  147. package/src/lib/components/assist-jobs-drawer.component.js.map +1 -0
  148. package/src/lib/components/assist-panel.component.d.ts +136 -0
  149. package/src/lib/components/assist-panel.component.js +1099 -0
  150. package/src/lib/components/assist-panel.component.js.map +1 -0
  151. package/src/lib/components/assist-signals-page.component.d.ts +3 -0
  152. package/src/lib/components/assist-signals-page.component.js +1017 -0
  153. package/src/lib/components/assist-signals-page.component.js.map +1 -0
  154. package/src/lib/components/besigner-ai-controls.component.d.ts +29 -0
  155. package/src/lib/components/besigner-ai-controls.component.js +81 -0
  156. package/src/lib/components/besigner-ai-controls.component.js.map +1 -0
  157. package/src/lib/components/billing-ai-allotments.component.d.ts +36 -0
  158. package/src/lib/components/billing-ai-allotments.component.js +486 -0
  159. package/src/lib/components/billing-ai-allotments.component.js.map +1 -0
  160. package/src/lib/components/billing-ai-top-users.component.d.ts +44 -0
  161. package/src/lib/components/billing-ai-top-users.component.js +304 -0
  162. package/src/lib/components/billing-ai-top-users.component.js.map +1 -0
  163. package/src/lib/components/billing-assist-overage-card.component.d.ts +69 -0
  164. package/src/lib/components/billing-assist-overage-card.component.js +437 -0
  165. package/src/lib/components/billing-assist-overage-card.component.js.map +1 -0
  166. package/src/lib/components/host-ai-allotments.component.d.ts +40 -0
  167. package/src/lib/components/host-ai-allotments.component.js +239 -0
  168. package/src/lib/components/host-ai-allotments.component.js.map +1 -0
  169. package/src/lib/components/member-ai-allotment-card.component.d.ts +28 -0
  170. package/src/lib/components/member-ai-allotment-card.component.js +172 -0
  171. package/src/lib/components/member-ai-allotment-card.component.js.map +1 -0
  172. package/src/lib/components/member-ai-usage-card.component.d.ts +28 -0
  173. package/src/lib/components/member-ai-usage-card.component.js +240 -0
  174. package/src/lib/components/member-ai-usage-card.component.js.map +1 -0
  175. package/src/lib/components/staff-org-ai-card.component.d.ts +17 -0
  176. package/src/lib/components/staff-org-ai-card.component.js +739 -0
  177. package/src/lib/components/staff-org-ai-card.component.js.map +1 -0
  178. package/src/lib/components/staff-org-usage-ai-columns.component.d.ts +41 -0
  179. package/src/lib/components/staff-org-usage-ai-columns.component.js +65 -0
  180. package/src/lib/components/staff-org-usage-ai-columns.component.js.map +1 -0
  181. package/src/lib/components/staff-orgs-ai-spend-column.component.d.ts +28 -0
  182. package/src/lib/components/staff-orgs-ai-spend-column.component.js +89 -0
  183. package/src/lib/components/staff-orgs-ai-spend-column.component.js.map +1 -0
  184. package/src/lib/components/staff-user-ai-usage-card.component.d.ts +27 -0
  185. package/src/lib/components/staff-user-ai-usage-card.component.js +183 -0
  186. package/src/lib/components/staff-user-ai-usage-card.component.js.map +1 -0
  187. package/src/lib/components/use-ai-allotments.d.ts +49 -0
  188. package/src/lib/components/use-ai-allotments.js +171 -0
  189. package/src/lib/components/use-ai-allotments.js.map +1 -0
  190. package/src/lib/components/use-ai-crm-answer.d.ts +50 -0
  191. package/src/lib/components/use-ai-crm-answer.js +220 -0
  192. package/src/lib/components/use-ai-crm-answer.js.map +1 -0
  193. package/src/lib/components/use-ai-job-run.d.ts +51 -0
  194. package/src/lib/components/use-ai-job-run.js +176 -0
  195. package/src/lib/components/use-ai-job-run.js.map +1 -0
  196. package/src/lib/components/use-ai-model-choice.d.ts +47 -0
  197. package/src/lib/components/use-ai-model-choice.js +150 -0
  198. package/src/lib/components/use-ai-model-choice.js.map +1 -0
  199. package/src/lib/components/use-ai-products-jobs.d.ts +36 -0
  200. package/src/lib/components/use-ai-products-jobs.js +190 -0
  201. package/src/lib/components/use-ai-products-jobs.js.map +1 -0
  202. package/src/lib/components/use-ai-usage-meter.d.ts +11 -0
  203. package/src/lib/components/use-ai-usage-meter.js +96 -0
  204. package/src/lib/components/use-ai-usage-meter.js.map +1 -0
  205. package/src/lib/components/use-org-ai-usage.d.ts +42 -0
  206. package/src/lib/components/use-org-ai-usage.js +181 -0
  207. package/src/lib/components/use-org-ai-usage.js.map +1 -0
  208. package/src/lib/components/use-staff-orgs-ai-spend.d.ts +18 -0
  209. package/src/lib/components/use-staff-orgs-ai-spend.js +127 -0
  210. package/src/lib/components/use-staff-orgs-ai-spend.js.map +1 -0
  211. package/src/lib/constants.d.ts +24 -0
  212. package/src/lib/constants.js +23 -0
  213. package/src/lib/constants.js.map +1 -0
  214. package/src/lib/declarations.d.ts +48 -0
  215. package/src/lib/declarations.js +129 -0
  216. package/src/lib/declarations.js.map +1 -0
  217. package/src/lib/declarations.server.d.ts +35 -0
  218. package/src/lib/declarations.server.js +138 -0
  219. package/src/lib/declarations.server.js.map +1 -0
  220. package/src/lib/insights/ai-figure-readers.d.ts +90 -0
  221. package/src/lib/insights/ai-figure-readers.js +863 -0
  222. package/src/lib/insights/ai-figure-readers.js.map +1 -0
  223. package/src/lib/insights/ai-insight-digest.d.ts +165 -0
  224. package/src/lib/insights/ai-insight-digest.js +363 -0
  225. package/src/lib/insights/ai-insight-digest.js.map +1 -0
  226. package/src/lib/insights/ai-insight-readers.d.ts +71 -0
  227. package/src/lib/insights/ai-insight-readers.js +141 -0
  228. package/src/lib/insights/ai-insight-readers.js.map +1 -0
  229. package/src/lib/jobs/ai-crm-access.d.ts +61 -0
  230. package/src/lib/jobs/ai-crm-access.js +94 -0
  231. package/src/lib/jobs/ai-crm-access.js.map +1 -0
  232. package/src/lib/jobs/ai-email-bindings.d.ts +97 -0
  233. package/src/lib/jobs/ai-email-bindings.js +147 -0
  234. package/src/lib/jobs/ai-email-bindings.js.map +1 -0
  235. package/src/lib/jobs/ai-job-admission.d.ts +82 -0
  236. package/src/lib/jobs/ai-job-admission.js +45 -0
  237. package/src/lib/jobs/ai-job-admission.js.map +1 -0
  238. package/src/lib/jobs/ai-job-budget.d.ts +167 -0
  239. package/src/lib/jobs/ai-job-budget.js +161 -0
  240. package/src/lib/jobs/ai-job-budget.js.map +1 -0
  241. package/src/lib/jobs/ai-job-campaign-step.d.ts +108 -0
  242. package/src/lib/jobs/ai-job-campaign-step.js +340 -0
  243. package/src/lib/jobs/ai-job-campaign-step.js.map +1 -0
  244. package/src/lib/jobs/ai-job-component-checks.d.ts +74 -0
  245. package/src/lib/jobs/ai-job-component-checks.js +442 -0
  246. package/src/lib/jobs/ai-job-component-checks.js.map +1 -0
  247. package/src/lib/jobs/ai-job-component-step.d.ts +75 -0
  248. package/src/lib/jobs/ai-job-component-step.js +262 -0
  249. package/src/lib/jobs/ai-job-component-step.js.map +1 -0
  250. package/src/lib/jobs/ai-job-crm-step.d.ts +192 -0
  251. package/src/lib/jobs/ai-job-crm-step.js +734 -0
  252. package/src/lib/jobs/ai-job-crm-step.js.map +1 -0
  253. package/src/lib/jobs/ai-job-draft-ids.d.ts +62 -0
  254. package/src/lib/jobs/ai-job-draft-ids.js +132 -0
  255. package/src/lib/jobs/ai-job-draft-ids.js.map +1 -0
  256. package/src/lib/jobs/ai-job-drafts.d.ts +304 -0
  257. package/src/lib/jobs/ai-job-drafts.js +557 -0
  258. package/src/lib/jobs/ai-job-drafts.js.map +1 -0
  259. package/src/lib/jobs/ai-job-email-step.d.ts +195 -0
  260. package/src/lib/jobs/ai-job-email-step.js +547 -0
  261. package/src/lib/jobs/ai-job-email-step.js.map +1 -0
  262. package/src/lib/jobs/ai-job-experiment-step.d.ts +105 -0
  263. package/src/lib/jobs/ai-job-experiment-step.js +445 -0
  264. package/src/lib/jobs/ai-job-experiment-step.js.map +1 -0
  265. package/src/lib/jobs/ai-job-form-step.d.ts +250 -0
  266. package/src/lib/jobs/ai-job-form-step.js +634 -0
  267. package/src/lib/jobs/ai-job-form-step.js.map +1 -0
  268. package/src/lib/jobs/ai-job-generation.d.ts +114 -0
  269. package/src/lib/jobs/ai-job-generation.js +384 -0
  270. package/src/lib/jobs/ai-job-generation.js.map +1 -0
  271. package/src/lib/jobs/ai-job-insight-budget.d.ts +41 -0
  272. package/src/lib/jobs/ai-job-insight-budget.js +46 -0
  273. package/src/lib/jobs/ai-job-insight-budget.js.map +1 -0
  274. package/src/lib/jobs/ai-job-insight-step.d.ts +58 -0
  275. package/src/lib/jobs/ai-job-insight-step.js +350 -0
  276. package/src/lib/jobs/ai-job-insight-step.js.map +1 -0
  277. package/src/lib/jobs/ai-job-layout-step.d.ts +103 -0
  278. package/src/lib/jobs/ai-job-layout-step.js +340 -0
  279. package/src/lib/jobs/ai-job-layout-step.js.map +1 -0
  280. package/src/lib/jobs/ai-job-page-budget.d.ts +57 -0
  281. package/src/lib/jobs/ai-job-page-budget.js +60 -0
  282. package/src/lib/jobs/ai-job-page-budget.js.map +1 -0
  283. package/src/lib/jobs/ai-job-page-sections.d.ts +150 -0
  284. package/src/lib/jobs/ai-job-page-sections.js +450 -0
  285. package/src/lib/jobs/ai-job-page-sections.js.map +1 -0
  286. package/src/lib/jobs/ai-job-page-step.d.ts +198 -0
  287. package/src/lib/jobs/ai-job-page-step.js +667 -0
  288. package/src/lib/jobs/ai-job-page-step.js.map +1 -0
  289. package/src/lib/jobs/ai-job-plan-conformance.d.ts +107 -0
  290. package/src/lib/jobs/ai-job-plan-conformance.js +164 -0
  291. package/src/lib/jobs/ai-job-plan-conformance.js.map +1 -0
  292. package/src/lib/jobs/ai-job-plan-step.d.ts +196 -0
  293. package/src/lib/jobs/ai-job-plan-step.js +458 -0
  294. package/src/lib/jobs/ai-job-plan-step.js.map +1 -0
  295. package/src/lib/jobs/ai-job-plugin-drafts.d.ts +76 -0
  296. package/src/lib/jobs/ai-job-plugin-drafts.js +91 -0
  297. package/src/lib/jobs/ai-job-plugin-drafts.js.map +1 -0
  298. package/src/lib/jobs/ai-job-products-step.d.ts +106 -0
  299. package/src/lib/jobs/ai-job-products-step.js +436 -0
  300. package/src/lib/jobs/ai-job-products-step.js.map +1 -0
  301. package/src/lib/jobs/ai-job-seo-budget.d.ts +52 -0
  302. package/src/lib/jobs/ai-job-seo-budget.js +63 -0
  303. package/src/lib/jobs/ai-job-seo-budget.js.map +1 -0
  304. package/src/lib/jobs/ai-job-seo-step.d.ts +145 -0
  305. package/src/lib/jobs/ai-job-seo-step.js +809 -0
  306. package/src/lib/jobs/ai-job-seo-step.js.map +1 -0
  307. package/src/lib/jobs/ai-job-site-step.d.ts +252 -0
  308. package/src/lib/jobs/ai-job-site-step.js +538 -0
  309. package/src/lib/jobs/ai-job-site-step.js.map +1 -0
  310. package/src/lib/jobs/ai-job-template-step.d.ts +105 -0
  311. package/src/lib/jobs/ai-job-template-step.js +391 -0
  312. package/src/lib/jobs/ai-job-template-step.js.map +1 -0
  313. package/src/lib/jobs/ai-job-text-step.d.ts +125 -0
  314. package/src/lib/jobs/ai-job-text-step.js +128 -0
  315. package/src/lib/jobs/ai-job-text-step.js.map +1 -0
  316. package/src/lib/jobs/ai-job-theme-budget.d.ts +38 -0
  317. package/src/lib/jobs/ai-job-theme-budget.js +43 -0
  318. package/src/lib/jobs/ai-job-theme-budget.js.map +1 -0
  319. package/src/lib/jobs/ai-job-theme-step.d.ts +115 -0
  320. package/src/lib/jobs/ai-job-theme-step.js +337 -0
  321. package/src/lib/jobs/ai-job-theme-step.js.map +1 -0
  322. package/src/lib/jobs/ai-job-workflow-step.d.ts +139 -0
  323. package/src/lib/jobs/ai-job-workflow-step.js +530 -0
  324. package/src/lib/jobs/ai-job-workflow-step.js.map +1 -0
  325. package/src/lib/jobs/ai-jobs-beat.d.ts +78 -0
  326. package/src/lib/jobs/ai-jobs-beat.js +93 -0
  327. package/src/lib/jobs/ai-jobs-beat.js.map +1 -0
  328. package/src/lib/jobs/ai-jobs-pause.d.ts +38 -0
  329. package/src/lib/jobs/ai-jobs-pause.js +45 -0
  330. package/src/lib/jobs/ai-jobs-pause.js.map +1 -0
  331. package/src/lib/jobs/ai-jobs.d.ts +558 -0
  332. package/src/lib/jobs/ai-jobs.js +1410 -0
  333. package/src/lib/jobs/ai-jobs.js.map +1 -0
  334. package/src/lib/jobs/ai-media-asset-server.d.ts +34 -0
  335. package/src/lib/jobs/ai-media-asset-server.js +34 -0
  336. package/src/lib/jobs/ai-media-asset-server.js.map +1 -0
  337. package/src/lib/jobs/ai-media-asset.d.ts +59 -0
  338. package/src/lib/jobs/ai-media-asset.js +86 -0
  339. package/src/lib/jobs/ai-media-asset.js.map +1 -0
  340. package/src/lib/jobs/ai-product-image.d.ts +78 -0
  341. package/src/lib/jobs/ai-product-image.js +113 -0
  342. package/src/lib/jobs/ai-product-image.js.map +1 -0
  343. package/src/lib/jobs/ai-theme-brand-inputs.d.ts +125 -0
  344. package/src/lib/jobs/ai-theme-brand-inputs.js +378 -0
  345. package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -0
  346. package/src/lib/jobs/ai-theme-brand-server.d.ts +33 -0
  347. package/src/lib/jobs/ai-theme-brand-server.js +33 -0
  348. package/src/lib/jobs/ai-theme-brand-server.js.map +1 -0
  349. package/src/lib/jobs/ai-workflow-records.d.ts +84 -0
  350. package/src/lib/jobs/ai-workflow-records.js +158 -0
  351. package/src/lib/jobs/ai-workflow-records.js.map +1 -0
  352. package/src/lib/jobs/fixtures/ai-free-page-built-recording.d.ts +31 -0
  353. package/src/lib/jobs/fixtures/ai-free-page-built-recording.js +367 -0
  354. package/src/lib/jobs/fixtures/ai-free-page-built-recording.js.map +1 -0
  355. package/src/lib/jobs/fixtures/ai-free-page-recording.d.ts +69 -0
  356. package/src/lib/jobs/fixtures/ai-free-page-recording.js +442 -0
  357. package/src/lib/jobs/fixtures/ai-free-page-recording.js.map +1 -0
  358. package/src/lib/jobs/fixtures/ai-page-briefs.d.ts +146 -0
  359. package/src/lib/jobs/fixtures/ai-page-briefs.js +1850 -0
  360. package/src/lib/jobs/fixtures/ai-page-briefs.js.map +1 -0
  361. package/src/lib/model/ai-allotments.d.ts +208 -0
  362. package/src/lib/model/ai-allotments.js +269 -0
  363. package/src/lib/model/ai-allotments.js.map +1 -0
  364. package/src/lib/model/ai-automation-draft.d.ts +74 -0
  365. package/src/lib/model/ai-automation-draft.js +310 -0
  366. package/src/lib/model/ai-automation-draft.js.map +1 -0
  367. package/src/lib/model/ai-automation-outline.d.ts +50 -0
  368. package/src/lib/model/ai-automation-outline.js +262 -0
  369. package/src/lib/model/ai-automation-outline.js.map +1 -0
  370. package/src/lib/model/ai-build-plan.d.ts +197 -0
  371. package/src/lib/model/ai-build-plan.js +438 -0
  372. package/src/lib/model/ai-build-plan.js.map +1 -0
  373. package/src/lib/model/ai-crm.d.ts +237 -0
  374. package/src/lib/model/ai-crm.js +225 -0
  375. package/src/lib/model/ai-crm.js.map +1 -0
  376. package/src/lib/model/ai-experiment-proposal.d.ts +68 -0
  377. package/src/lib/model/ai-experiment-proposal.js +146 -0
  378. package/src/lib/model/ai-experiment-proposal.js.map +1 -0
  379. package/src/lib/model/ai-experiment.d.ts +309 -0
  380. package/src/lib/model/ai-experiment.js +395 -0
  381. package/src/lib/model/ai-experiment.js.map +1 -0
  382. package/src/lib/model/ai-insight.d.ts +178 -0
  383. package/src/lib/model/ai-insight.js +201 -0
  384. package/src/lib/model/ai-insight.js.map +1 -0
  385. package/src/lib/model/ai-jobs.types.d.ts +412 -0
  386. package/src/lib/model/ai-jobs.types.js +42 -0
  387. package/src/lib/model/ai-jobs.types.js.map +1 -0
  388. package/src/lib/model/ai-page-job.d.ts +92 -0
  389. package/src/lib/model/ai-page-job.js +159 -0
  390. package/src/lib/model/ai-page-job.js.map +1 -0
  391. package/src/lib/model/ai-permissions.d.ts +49 -0
  392. package/src/lib/model/ai-permissions.js +97 -0
  393. package/src/lib/model/ai-permissions.js.map +1 -0
  394. package/src/lib/model/ai-plan-capabilities.d.ts +139 -0
  395. package/src/lib/model/ai-plan-capabilities.js +149 -0
  396. package/src/lib/model/ai-plan-capabilities.js.map +1 -0
  397. package/src/lib/model/ai-products.d.ts +251 -0
  398. package/src/lib/model/ai-products.js +253 -0
  399. package/src/lib/model/ai-products.js.map +1 -0
  400. package/src/lib/model/ai-seo.d.ts +208 -0
  401. package/src/lib/model/ai-seo.js +150 -0
  402. package/src/lib/model/ai-seo.js.map +1 -0
  403. package/src/lib/model/ai-site-inventory.d.ts +164 -0
  404. package/src/lib/model/ai-site-inventory.js +145 -0
  405. package/src/lib/model/ai-site-inventory.js.map +1 -0
  406. package/src/lib/model/ai-site-job.d.ts +247 -0
  407. package/src/lib/model/ai-site-job.js +314 -0
  408. package/src/lib/model/ai-site-job.js.map +1 -0
  409. package/src/lib/model/ai-site-start-seo.d.ts +103 -0
  410. package/src/lib/model/ai-site-start-seo.js +154 -0
  411. package/src/lib/model/ai-site-start-seo.js.map +1 -0
  412. package/src/lib/model/ai-site-start.d.ts +122 -0
  413. package/src/lib/model/ai-site-start.js +159 -0
  414. package/src/lib/model/ai-site-start.js.map +1 -0
  415. package/src/lib/model/ai-site-switch.d.ts +56 -0
  416. package/src/lib/model/ai-site-switch.js +73 -0
  417. package/src/lib/model/ai-site-switch.js.map +1 -0
  418. package/src/lib/model/ai-storefront-claims.d.ts +70 -0
  419. package/src/lib/model/ai-storefront-claims.js +130 -0
  420. package/src/lib/model/ai-storefront-claims.js.map +1 -0
  421. package/src/lib/model/ai-template-subjects.d.ts +82 -0
  422. package/src/lib/model/ai-template-subjects.js +136 -0
  423. package/src/lib/model/ai-template-subjects.js.map +1 -0
  424. package/src/lib/model/ai-theme-proposal.d.ts +210 -0
  425. package/src/lib/model/ai-theme-proposal.js +506 -0
  426. package/src/lib/model/ai-theme-proposal.js.map +1 -0
  427. package/src/lib/model/ai-tokens.d.ts +96 -0
  428. package/src/lib/model/ai-tokens.js +117 -0
  429. package/src/lib/model/ai-tokens.js.map +1 -0
  430. package/src/lib/model/ai-usage-by-user.d.ts +120 -0
  431. package/src/lib/model/ai-usage-by-user.js +139 -0
  432. package/src/lib/model/ai-usage-by-user.js.map +1 -0
  433. package/src/lib/model/ai-workflow-job.d.ts +111 -0
  434. package/src/lib/model/ai-workflow-job.js +183 -0
  435. package/src/lib/model/ai-workflow-job.js.map +1 -0
  436. package/src/lib/model/assist-edit.d.ts +261 -0
  437. package/src/lib/model/assist-edit.js +175 -0
  438. package/src/lib/model/assist-edit.js.map +1 -0
  439. package/src/lib/plugin-config.d.ts +33 -0
  440. package/src/lib/plugin-config.js +118 -0
  441. package/src/lib/plugin-config.js.map +1 -0
  442. package/src/lib/plugin.d.ts +30 -0
  443. package/src/lib/plugin.js +525 -0
  444. package/src/lib/plugin.js.map +1 -0
  445. package/src/lib/providers/anthropic.d.ts +84 -0
  446. package/src/lib/providers/anthropic.js +432 -0
  447. package/src/lib/providers/anthropic.js.map +1 -0
  448. package/src/lib/providers/catalog.d.ts +197 -0
  449. package/src/lib/providers/catalog.js +312 -0
  450. package/src/lib/providers/catalog.js.map +1 -0
  451. package/src/lib/providers/contract.d.ts +464 -0
  452. package/src/lib/providers/contract.js +274 -0
  453. package/src/lib/providers/contract.js.map +1 -0
  454. package/src/lib/providers/model-choice.d.ts +119 -0
  455. package/src/lib/providers/model-choice.js +416 -0
  456. package/src/lib/providers/model-choice.js.map +1 -0
  457. package/src/lib/providers/openai-compatible.d.ts +58 -0
  458. package/src/lib/providers/openai-compatible.js +361 -0
  459. package/src/lib/providers/openai-compatible.js.map +1 -0
  460. package/src/lib/providers/registry.d.ts +49 -0
  461. package/src/lib/providers/registry.js +71 -0
  462. package/src/lib/providers/registry.js.map +1 -0
  463. package/src/lib/providers/routing.d.ts +98 -0
  464. package/src/lib/providers/routing.js +450 -0
  465. package/src/lib/providers/routing.js.map +1 -0
  466. package/src/lib/runtime/ai-abuse-guards.d.ts +113 -0
  467. package/src/lib/runtime/ai-abuse-guards.js +148 -0
  468. package/src/lib/runtime/ai-abuse-guards.js.map +1 -0
  469. package/src/lib/runtime/ai-component-bindings.d.ts +67 -0
  470. package/src/lib/runtime/ai-component-bindings.js +106 -0
  471. package/src/lib/runtime/ai-component-bindings.js.map +1 -0
  472. package/src/lib/runtime/ai-device-audit.d.ts +109 -0
  473. package/src/lib/runtime/ai-device-audit.js +97 -0
  474. package/src/lib/runtime/ai-device-audit.js.map +1 -0
  475. package/src/lib/runtime/ai-doctrine-validators.d.ts +720 -0
  476. package/src/lib/runtime/ai-doctrine-validators.js +3133 -0
  477. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -0
  478. package/src/lib/runtime/ai-doctrine.d.ts +372 -0
  479. package/src/lib/runtime/ai-doctrine.js +944 -0
  480. package/src/lib/runtime/ai-doctrine.js.map +1 -0
  481. package/src/lib/runtime/ai-eval-live.d.ts +321 -0
  482. package/src/lib/runtime/ai-eval-live.js +1257 -0
  483. package/src/lib/runtime/ai-eval-live.js.map +1 -0
  484. package/src/lib/runtime/ai-eval-memory-firestore.d.ts +51 -0
  485. package/src/lib/runtime/ai-eval-memory-firestore.js +183 -0
  486. package/src/lib/runtime/ai-eval-memory-firestore.js.map +1 -0
  487. package/src/lib/runtime/ai-eval.d.ts +441 -0
  488. package/src/lib/runtime/ai-eval.js +1151 -0
  489. package/src/lib/runtime/ai-eval.js.map +1 -0
  490. package/src/lib/runtime/ai-gate.d.ts +130 -0
  491. package/src/lib/runtime/ai-gate.js +272 -0
  492. package/src/lib/runtime/ai-gate.js.map +1 -0
  493. package/src/lib/runtime/ai-generation-bounds.d.ts +24 -0
  494. package/src/lib/runtime/ai-generation-bounds.js +23 -0
  495. package/src/lib/runtime/ai-generation-bounds.js.map +1 -0
  496. package/src/lib/runtime/ai-insight-check.d.ts +76 -0
  497. package/src/lib/runtime/ai-insight-check.js +281 -0
  498. package/src/lib/runtime/ai-insight-check.js.map +1 -0
  499. package/src/lib/runtime/ai-node-tree.d.ts +181 -0
  500. package/src/lib/runtime/ai-node-tree.js +931 -0
  501. package/src/lib/runtime/ai-node-tree.js.map +1 -0
  502. package/src/lib/runtime/ai-page-links.d.ts +79 -0
  503. package/src/lib/runtime/ai-page-links.js +135 -0
  504. package/src/lib/runtime/ai-page-links.js.map +1 -0
  505. package/src/lib/runtime/ai-palette.d.ts +252 -0
  506. package/src/lib/runtime/ai-palette.generated.d.ts +34 -0
  507. package/src/lib/runtime/ai-palette.generated.js +5263 -0
  508. package/src/lib/runtime/ai-palette.generated.js.map +1 -0
  509. package/src/lib/runtime/ai-palette.js +187 -0
  510. package/src/lib/runtime/ai-palette.js.map +1 -0
  511. package/src/lib/runtime/ai-products-generation.d.ts +107 -0
  512. package/src/lib/runtime/ai-products-generation.js +250 -0
  513. package/src/lib/runtime/ai-products-generation.js.map +1 -0
  514. package/src/lib/runtime/ai-repeated-items.d.ts +95 -0
  515. package/src/lib/runtime/ai-repeated-items.js +397 -0
  516. package/src/lib/runtime/ai-repeated-items.js.map +1 -0
  517. package/src/lib/runtime/ai-runtime.d.ts +148 -0
  518. package/src/lib/runtime/ai-runtime.js +237 -0
  519. package/src/lib/runtime/ai-runtime.js.map +1 -0
  520. package/src/lib/runtime/ai-template-examples.d.ts +71 -0
  521. package/src/lib/runtime/ai-template-examples.js +135 -0
  522. package/src/lib/runtime/ai-template-examples.js.map +1 -0
  523. package/src/lib/runtime/assist-answer-cache.d.ts +80 -0
  524. package/src/lib/runtime/assist-answer-cache.js +184 -0
  525. package/src/lib/runtime/assist-answer-cache.js.map +1 -0
  526. package/src/lib/runtime/seo-audit.d.ts +93 -0
  527. package/src/lib/runtime/seo-audit.js +260 -0
  528. package/src/lib/runtime/seo-audit.js.map +1 -0
  529. package/src/lib/runtime/seo-content-fixes.d.ts +41 -0
  530. package/src/lib/runtime/seo-content-fixes.js +168 -0
  531. package/src/lib/runtime/seo-content-fixes.js.map +1 -0
  532. package/src/lib/runtime/seo-fields.d.ts +152 -0
  533. package/src/lib/runtime/seo-fields.js +215 -0
  534. package/src/lib/runtime/seo-fields.js.map +1 -0
  535. package/src/lib/runtime/seo-page-facts.d.ts +61 -0
  536. package/src/lib/runtime/seo-page-facts.js +150 -0
  537. package/src/lib/runtime/seo-page-facts.js.map +1 -0
  538. package/src/lib/runtime/site-inventory.d.ts +63 -0
  539. package/src/lib/runtime/site-inventory.js +230 -0
  540. package/src/lib/runtime/site-inventory.js.map +1 -0
  541. package/src/lib/server/ai-admin-org.d.ts +33 -0
  542. package/src/lib/server/ai-admin-org.js +381 -0
  543. package/src/lib/server/ai-admin-org.js.map +1 -0
  544. package/src/lib/server/ai-admin-orgs-spend.d.ts +40 -0
  545. package/src/lib/server/ai-admin-orgs-spend.js +129 -0
  546. package/src/lib/server/ai-admin-orgs-spend.js.map +1 -0
  547. package/src/lib/server/ai-admin-overage.d.ts +19 -0
  548. package/src/lib/server/ai-admin-overage.js +246 -0
  549. package/src/lib/server/ai-admin-overage.js.map +1 -0
  550. package/src/lib/server/ai-admin-signals.d.ts +34 -0
  551. package/src/lib/server/ai-admin-signals.js +330 -0
  552. package/src/lib/server/ai-admin-signals.js.map +1 -0
  553. package/src/lib/server/ai-admin-user.d.ts +27 -0
  554. package/src/lib/server/ai-admin-user.js +128 -0
  555. package/src/lib/server/ai-admin-user.js.map +1 -0
  556. package/src/lib/server/ai-allotments.d.ts +27 -0
  557. package/src/lib/server/ai-allotments.js +544 -0
  558. package/src/lib/server/ai-allotments.js.map +1 -0
  559. package/src/lib/server/ai-assist-prompts.d.ts +102 -0
  560. package/src/lib/server/ai-assist-prompts.js +207 -0
  561. package/src/lib/server/ai-assist-prompts.js.map +1 -0
  562. package/src/lib/server/ai-assist.d.ts +119 -0
  563. package/src/lib/server/ai-assist.js +517 -0
  564. package/src/lib/server/ai-assist.js.map +1 -0
  565. package/src/lib/server/ai-crm-answer.d.ts +30 -0
  566. package/src/lib/server/ai-crm-answer.js +98 -0
  567. package/src/lib/server/ai-crm-answer.js.map +1 -0
  568. package/src/lib/server/ai-generate-component.d.ts +111 -0
  569. package/src/lib/server/ai-generate-component.js +643 -0
  570. package/src/lib/server/ai-generate-component.js.map +1 -0
  571. package/src/lib/server/ai-host-permissions.d.ts +46 -0
  572. package/src/lib/server/ai-host-permissions.js +204 -0
  573. package/src/lib/server/ai-host-permissions.js.map +1 -0
  574. package/src/lib/server/ai-insight-answer.d.ts +30 -0
  575. package/src/lib/server/ai-insight-answer.js +83 -0
  576. package/src/lib/server/ai-insight-answer.js.map +1 -0
  577. package/src/lib/server/ai-insight-digest-route.d.ts +30 -0
  578. package/src/lib/server/ai-insight-digest-route.js +156 -0
  579. package/src/lib/server/ai-insight-digest-route.js.map +1 -0
  580. package/src/lib/server/ai-jobs-batch.d.ts +48 -0
  581. package/src/lib/server/ai-jobs-batch.js +306 -0
  582. package/src/lib/server/ai-jobs-batch.js.map +1 -0
  583. package/src/lib/server/ai-jobs-beat-route.d.ts +36 -0
  584. package/src/lib/server/ai-jobs-beat-route.js +86 -0
  585. package/src/lib/server/ai-jobs-beat-route.js.map +1 -0
  586. package/src/lib/server/ai-jobs-cancel.d.ts +30 -0
  587. package/src/lib/server/ai-jobs-cancel.js +74 -0
  588. package/src/lib/server/ai-jobs-cancel.js.map +1 -0
  589. package/src/lib/server/ai-jobs-events-route.d.ts +31 -0
  590. package/src/lib/server/ai-jobs-events-route.js +51 -0
  591. package/src/lib/server/ai-jobs-events-route.js.map +1 -0
  592. package/src/lib/server/ai-jobs-events.d.ts +55 -0
  593. package/src/lib/server/ai-jobs-events.js +144 -0
  594. package/src/lib/server/ai-jobs-events.js.map +1 -0
  595. package/src/lib/server/ai-jobs-gate.d.ts +47 -0
  596. package/src/lib/server/ai-jobs-gate.js +106 -0
  597. package/src/lib/server/ai-jobs-gate.js.map +1 -0
  598. package/src/lib/server/ai-jobs-resume.d.ts +23 -0
  599. package/src/lib/server/ai-jobs-resume.js +209 -0
  600. package/src/lib/server/ai-jobs-resume.js.map +1 -0
  601. package/src/lib/server/ai-jobs-route.d.ts +32 -0
  602. package/src/lib/server/ai-jobs-route.js +307 -0
  603. package/src/lib/server/ai-jobs-route.js.map +1 -0
  604. package/src/lib/server/ai-models.d.ts +18 -0
  605. package/src/lib/server/ai-models.js +134 -0
  606. package/src/lib/server/ai-models.js.map +1 -0
  607. package/src/lib/server/ai-seo-apply.d.ts +53 -0
  608. package/src/lib/server/ai-seo-apply.js +294 -0
  609. package/src/lib/server/ai-seo-apply.js.map +1 -0
  610. package/src/lib/server/ai-usage.d.ts +18 -0
  611. package/src/lib/server/ai-usage.js +220 -0
  612. package/src/lib/server/ai-usage.js.map +1 -0
  613. package/src/lib/server/assist-chat.d.ts +234 -0
  614. package/src/lib/server/assist-chat.js +1446 -0
  615. package/src/lib/server/assist-chat.js.map +1 -0
  616. package/src/lib/server/assist-edit-applied.d.ts +22 -0
  617. package/src/lib/server/assist-edit-applied.js +239 -0
  618. package/src/lib/server/assist-edit-applied.js.map +1 -0
  619. package/src/lib/server/assist-edit.d.ts +124 -0
  620. package/src/lib/server/assist-edit.js +1000 -0
  621. package/src/lib/server/assist-edit.js.map +1 -0
  622. package/src/lib/server/assist-feedback.d.ts +31 -0
  623. package/src/lib/server/assist-feedback.js +115 -0
  624. package/src/lib/server/assist-feedback.js.map +1 -0
  625. package/src/lib/server/assist-view-context.d.ts +343 -0
  626. package/src/lib/server/assist-view-context.js +690 -0
  627. package/src/lib/server/assist-view-context.js.map +1 -0
  628. package/src/lib/server/billing-credits.d.ts +59 -0
  629. package/src/lib/server/billing-credits.js +146 -0
  630. package/src/lib/server/billing-credits.js.map +1 -0
  631. package/src/lib/server/billing-overage.d.ts +19 -0
  632. package/src/lib/server/billing-overage.js +337 -0
  633. package/src/lib/server/billing-overage.js.map +1 -0
  634. package/src/lib/server.d.ts +32 -0
  635. package/src/lib/server.js +265 -0
  636. package/src/lib/server.js.map +1 -0
  637. package/src/lib/subprocessors.d.ts +18 -0
  638. package/src/lib/subprocessors.js +52 -0
  639. package/src/lib/subprocessors.js.map +1 -0
  640. package/src/lib/tools/ai-component-tool.d.ts +99 -0
  641. package/src/lib/tools/ai-component-tool.js +369 -0
  642. package/src/lib/tools/ai-component-tool.js.map +1 -0
  643. package/src/lib/tools/ai-crm-tool.d.ts +106 -0
  644. package/src/lib/tools/ai-crm-tool.js +488 -0
  645. package/src/lib/tools/ai-crm-tool.js.map +1 -0
  646. package/src/lib/tools/ai-duplicate-resource-tool.d.ts +71 -0
  647. package/src/lib/tools/ai-duplicate-resource-tool.js +164 -0
  648. package/src/lib/tools/ai-duplicate-resource-tool.js.map +1 -0
  649. package/src/lib/tools/ai-experiment-tool.d.ts +40 -0
  650. package/src/lib/tools/ai-experiment-tool.js +155 -0
  651. package/src/lib/tools/ai-experiment-tool.js.map +1 -0
  652. package/src/lib/tools/ai-insight-tool.d.ts +46 -0
  653. package/src/lib/tools/ai-insight-tool.js +200 -0
  654. package/src/lib/tools/ai-insight-tool.js.map +1 -0
  655. package/src/lib/tools/ai-inventory-lookup-tool.d.ts +86 -0
  656. package/src/lib/tools/ai-inventory-lookup-tool.js +164 -0
  657. package/src/lib/tools/ai-inventory-lookup-tool.js.map +1 -0
  658. package/src/lib/tools/ai-products-tool.d.ts +65 -0
  659. package/src/lib/tools/ai-products-tool.js +644 -0
  660. package/src/lib/tools/ai-products-tool.js.map +1 -0
  661. package/src/lib/tools/ai-seo-tool.d.ts +162 -0
  662. package/src/lib/tools/ai-seo-tool.js +546 -0
  663. package/src/lib/tools/ai-seo-tool.js.map +1 -0
  664. package/src/lib/tools/ai-theme-tool.d.ts +101 -0
  665. package/src/lib/tools/ai-theme-tool.js +562 -0
  666. package/src/lib/tools/ai-theme-tool.js.map +1 -0
  667. package/src/lib/tools/ai-workflow-tool.d.ts +166 -0
  668. package/src/lib/tools/ai-workflow-tool.js +860 -0
  669. package/src/lib/tools/ai-workflow-tool.js.map +1 -0
  670. package/src/lib/usage/ai-allotment-alerts.d.ts +72 -0
  671. package/src/lib/usage/ai-allotment-alerts.js +157 -0
  672. package/src/lib/usage/ai-allotment-alerts.js.map +1 -0
  673. package/src/lib/usage/ai-allotments.d.ts +125 -0
  674. package/src/lib/usage/ai-allotments.js +239 -0
  675. package/src/lib/usage/ai-allotments.js.map +1 -0
  676. package/src/lib/usage/ai-model-sample.d.ts +36 -0
  677. package/src/lib/usage/ai-model-sample.js +68 -0
  678. package/src/lib/usage/ai-model-sample.js.map +1 -0
  679. package/src/lib/usage/ai-usage-alerts.d.ts +55 -0
  680. package/src/lib/usage/ai-usage-alerts.js +114 -0
  681. package/src/lib/usage/ai-usage-alerts.js.map +1 -0
  682. package/src/lib/usage/ai-usage-by-user.d.ts +161 -0
  683. package/src/lib/usage/ai-usage-by-user.js +211 -0
  684. package/src/lib/usage/ai-usage-by-user.js.map +1 -0
  685. package/src/lib/usage/ai-usage-eraser.d.ts +29 -0
  686. package/src/lib/usage/ai-usage-eraser.js +40 -0
  687. package/src/lib/usage/ai-usage-eraser.js.map +1 -0
  688. package/src/lib/usage/ai-usage-meter.d.ts +39 -0
  689. package/src/lib/usage/ai-usage-meter.js +85 -0
  690. package/src/lib/usage/ai-usage-meter.js.map +1 -0
  691. package/src/lib/usage/ai-usage-wire.d.ts +184 -0
  692. package/src/lib/usage/ai-usage-wire.js +98 -0
  693. package/src/lib/usage/ai-usage-wire.js.map +1 -0
  694. package/src/lib/usage/assist-ceiling.d.ts +87 -0
  695. package/src/lib/usage/assist-ceiling.js +110 -0
  696. package/src/lib/usage/assist-ceiling.js.map +1 -0
  697. package/src/lib/usage/assist-free-taste.d.ts +225 -0
  698. package/src/lib/usage/assist-free-taste.js +308 -0
  699. package/src/lib/usage/assist-free-taste.js.map +1 -0
  700. package/src/lib/usage/assist-refusals.d.ts +69 -0
  701. package/src/lib/usage/assist-refusals.js +79 -0
  702. package/src/lib/usage/assist-refusals.js.map +1 -0
  703. package/src/lib/usage/assist-signal-mining.d.ts +375 -0
  704. package/src/lib/usage/assist-signal-mining.js +344 -0
  705. package/src/lib/usage/assist-signal-mining.js.map +1 -0
  706. package/src/lib/usage/assist-usage.d.ts +571 -0
  707. package/src/lib/usage/assist-usage.js +978 -0
  708. package/src/lib/usage/assist-usage.js.map +1 -0
  709. package/src/lib/usage/staff-org-ai.d.ts +242 -0
  710. package/src/lib/usage/staff-org-ai.js +173 -0
  711. package/src/lib/usage/staff-org-ai.js.map +1 -0
  712. package/src/lib/usage/staff-org-usage-ai.d.ts +83 -0
  713. package/src/lib/usage/staff-org-usage-ai.js +59 -0
  714. package/src/lib/usage/staff-org-usage-ai.js.map +1 -0
  715. package/src/lib/usage/staff-orgs-ai-spend.d.ts +83 -0
  716. package/src/lib/usage/staff-orgs-ai-spend.js +114 -0
  717. package/src/lib/usage/staff-orgs-ai-spend.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/usage/staff-org-ai.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// Imported from BOTH graphs — the staff card (client) and the App Route that\n// serves it — so it may import neither entry barrel, for the reason\n// `margin-utilization.ts` states at its own head.\nimport type { AiJobStatus } from '../model/ai-jobs.types'\nimport type { AglynOrgBilling, OrgPlan } from '@aglyn/aglyn/foundation'\nimport {\n ASSIST_PROVIDER_COST_FIELD,\n assistBandRefuses,\n assistCreditsFromUsd,\n assistProviderCostUsd,\n assistMonthOverage,\n assistOverageCapReached,\n assistUsdFromCredits,\n resolveAssistCreditBudget,\n resolveAssistHardCap,\n resolveAssistOverageCapUsd,\n} from '@aglyn/aglyn/app-utils/assist-credits'\nimport {\n AI_ADDON_CREDITS_PER_MONTH,\n hasAiAddon,\n isUncappedPlanComp,\n PLAN_ENTITLEMENTS,\n resolveEffectivePlan,\n resolvePlanPricing,\n type DiscountMarginRating,\n} from '@aglyn/aglyn/app-utils/plan-entitlements'\nimport type { AssistRefusalCounts } from './assist-refusals'\nimport {\n AI_USAGE_MONTH_KINDS_FIELD,\n aiCacheHitRate,\n readAiKindMonths,\n type AiKindMonth,\n type AiTokenTotals,\n} from '../model/ai-tokens'\n\n/**\n * THE STAFF AI CARD'S FIGURES (AGL-2930), composed from the same helpers the\n * meter, the invoice and the customer's own billing page read.\n *\n * Nothing here runs a query and nothing here holds a rate of its own. The\n * pool is `resolveAssistCreditBudget`, the overage is `assistMonthOverage`,\n * the ceiling is `assistOverageCapReached` — the ONE derivation each of those\n * already is — so the card cannot show a staff member a different band,\n * rate or ceiling from the one the gate refused a customer at.\n */\n\n/** The four ways the reservation refuses, plus their sum. */\nexport type StaffOrgAiRefusals = AssistRefusalCounts\n\nexport interface StaffOrgAiAddon {\n /** Bought and on a subscription still paying for it — `hasAiAddon`. */\n on: boolean\n /** The add-on's list price on this plan, or null where the plan sells none. */\n priceUsd: number | null\n /** ISO instant the subscription item was created, when Stripe could say. */\n since: string | null\n /**\n * Where `since` came from, so an absent date is legible: `stripe` answered,\n * the org has no Stripe subscription to ask, or Stripe could not be asked\n * (no key on this deployment, or the lookup failed).\n */\n sinceSource: 'stripe' | 'no-subscription' | 'unavailable'\n}\n\nexport interface StaffOrgAiPool {\n /** The plan's own band, from the catalogue row. */\n planCredits: number\n /** A staff override of the band, or null when none is written. */\n overrideCredits: number | null\n /** The add-on's band, 0 without the add-on. */\n addonCredits: number\n /** The whole pool as the meter resolves it, or null where no band applies. */\n totalCredits: number | null\n /**\n * Whether an uncapped staff comp is why no band applies (AGL-3049) — a\n * boolean, so \"no band because uncapped\" crosses JSON as itself rather\n * than as the `null` an `Infinity` would become. Absent from a route older\n * than the flag.\n */\n uncapped?: boolean\n /** Credits drawn this month, rounded up from the measured spend. */\n usedCredits: number\n /**\n * What the month DREW, at the catalog's billed rates — the dollars\n * `usedCredits` is rounded up from, and the figure the overage line is\n * priced off. Not a cost (AGL-3015).\n */\n billedUsd: number\n /**\n * What the month COST US, at the provider's own rates: the one figure a\n * margin or a spend alert may be taken against.\n */\n providerUsd: number\n /** Left in the pool, clamped at zero, or null where no band applies. */\n remainingCredits: number | null\n /** Where `usedCredits` lands at month end at the pace so far. */\n projectedCredits: number\n /** `projectedCredits` back in dollars — billed, as the credits were. */\n projectedUsd: number\n /** Model turns and docs-deflected turns, off the month document. */\n messages: number\n deflected: number\n}\n\nexport interface StaffOrgAiOverage {\n overageCredits: number\n rateUsdPer1k: number | null\n accruedUsd: number\n /** Whether credits past the band are sold at all on this org. */\n sellsOverage: boolean\n /** The org's own band switch — `assistOverage.hardCap`. */\n hardCap: boolean\n /** The org's own dollar ceiling on overage — `assistOverage.capUsd`. */\n capUsd: number | null\n capReached: boolean\n /** Whether the band is a wall for any reason (the switch, or no rate). */\n bandRefuses: boolean\n}\n\nexport interface StaffOrgAiMargin {\n /** The add-on's list price when it is on, else 0. */\n addonRevenueUsd: number\n /**\n * The dollar value of the plan's own band — what the plan price sets aside\n * for assist. Each plan band is sized against the billed rate (a thousand\n * credits are a dollar), so this is the share of the subscription that was\n * sold as AI, and it belongs on the REVENUE side beside the add-on's price.\n */\n planAssistShareUsd: number\n /** Overage priced at the plan's rate, which the invoice will bill. */\n overageRevenueUsd: number\n /** The three above, summed. */\n revenueUsd: number\n /** What the month cost us: measured provider spend, never what it drew. */\n spendUsd: number\n /**\n * Spend past what the add-on and the plan's assist share bring in — the\n * condition the card renders red. Overage revenue is left OUT of the\n * comparison on purpose: it is billed at a margin, so an org deep in\n * overage is not the one losing money.\n */\n underwater: boolean\n /** The staff review threshold and the multiple of it the spend has reached. */\n thresholdUsd: number\n multiple: number\n /** The whole-org contribution margin, when a usage rollup exists. */\n contribution: {\n month: string | null\n marginPct: number | null\n rating: DiscountMarginRating | null\n }\n}\n\n/** The job model's own status set: the card renders every one by name. */\nexport type StaffOrgAiJobStatus = AiJobStatus\n\nexport interface StaffOrgAiJob {\n id: string\n kind: string\n status: StaffOrgAiJobStatus | string\n creditsReserved: number\n creditsSpent: number\n createdAt: string | null\n createdBy: string | null\n}\n\nexport interface StaffOrgAiJobs {\n counts: Record<StaffOrgAiJobStatus, number>\n recent: StaffOrgAiJob[]\n /** True when the scan stopped at its ceiling — the counts are a floor. */\n truncated: boolean\n}\n\n/** One row of the per-user rollup (AGL-2928), as the staff card lists it. */\nexport interface StaffOrgAiUser {\n uid: string\n /** The roster's name for them — display name, else email, else the uid. */\n name: string\n credits: number\n /** The measured provider spend behind `credits`; staff may see dollars. */\n estCostUsd: number\n /** Of the org's measured spend for the month, in `[0, 1]`. */\n share: number\n requests: number\n refusals: number\n byKind: Record<string, number>\n byHost: Record<string, number>\n}\n\n/** One kind of model request this month, as the card lists it (AGL-2937). */\nexport interface StaffOrgAiKindTokens extends AiKindMonth {\n /**\n * What one request of this kind COST US on average; `null` with none. The\n * provider figure, not what the kind drew — the reader is sizing a step\n * against a bill, and a marked-up model would otherwise make the step look\n * dearer to run than it is (AGL-3015).\n */\n costPerRequestUsd: number | null\n /** The share of this kind's prompt tokens the cache served — `aiCacheHitRate`. */\n cacheHitRate: number | null\n}\n\n/** The month's tokens (AGL-2937): its totals, its cache hit rate, and each kind. */\nexport interface StaffOrgAiTokens {\n /** The month document's own four totals. */\n total: AiTokenTotals\n cacheHitRate: number | null\n /** Dearest first; empty for a month written before kinds were kept. */\n kinds: StaffOrgAiKindTokens[]\n}\n\nexport interface StaffOrgAiResponse {\n month: string\n addon: StaffOrgAiAddon\n pool: StaffOrgAiPool\n overage: StaffOrgAiOverage\n refusals: StaffOrgAiRefusals\n /** Null when the jobs read failed — distinct from an org with no jobs. */\n jobs: StaffOrgAiJobs | null\n /** The dearest people this month; empty when nobody's month is written. */\n users: StaffOrgAiUser[]\n margin: StaffOrgAiMargin\n /** Tokens by kind (AGL-2937); absent from a route older than the card. */\n tokens?: StaffOrgAiTokens\n}\n\nconst finite = (value: unknown): number => {\n const parsed = Number(value ?? 0)\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0\n}\n\n/** The UTC day-of-month and month length `projectMonthEnd` scales by. */\nexport function monthProgress(now: Date): { elapsed: number; length: number } {\n const year = now.getUTCFullYear()\n const month = now.getUTCMonth()\n return {\n elapsed: now.getUTCDate(),\n length: new Date(Date.UTC(year, month + 1, 0)).getUTCDate(),\n }\n}\n\n/**\n * Where a month-to-date figure lands at month end at the pace so far.\n *\n * Linear, on whole UTC days, and deliberately no cleverer: the reader is\n * asking \"will this org clear its band\" and a straight line answers that\n * within the margin the question needs. Day one projects the first day's\n * spend across the month, which over-reads a burst — the direction a\n * monitoring figure should err in.\n */\nexport function projectMonthEnd(usedSoFar: number, now: Date): number {\n const { elapsed, length } = monthProgress(now)\n if (!(usedSoFar > 0) || elapsed <= 0) return 0\n return Math.ceil((usedSoFar / elapsed) * length)\n}\n\n/** The staff override of the assist band, or null when none is written. */\nfunction assistBandOverride(\n org: Partial<AglynOrgBilling> | null | undefined,\n): number | null {\n const raw = (org?.entitlements as Record<string, unknown> | undefined)?.[\n 'assistCreditsPerMonth'\n ]\n if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 0) return null\n return Math.floor(raw)\n}\n\nexport function composeStaffOrgAiPool(\n org: Partial<AglynOrgBilling> | null | undefined,\n monthDoc: Record<string, unknown> | null | undefined,\n now: Date,\n): StaffOrgAiPool {\n const plan = resolveEffectivePlan(org) as OrgPlan\n const addon = hasAiAddon(org)\n // Two questions, two figures (AGL-3015). What the workspace DREW is the\n // billed figure, because that is what its credits came out of and what its\n // band is measured in. What the month COST US is the provider figure, and\n // it is the only one a margin below may be taken against.\n const billedUsd = finite(monthDoc?.['estCostUsd'])\n const providerUsd = assistProviderCostUsd(\n billedUsd,\n monthDoc?.[ASSIST_PROVIDER_COST_FIELD],\n )\n const usedCredits = assistCreditsFromUsd(billedUsd)\n const totalCredits = resolveAssistCreditBudget(org)\n const projectedCredits = projectMonthEnd(usedCredits, now)\n return {\n planCredits: finite(PLAN_ENTITLEMENTS[plan]?.assistCreditsPerMonth),\n overrideCredits: assistBandOverride(org),\n addonCredits: addon ? AI_ADDON_CREDITS_PER_MONTH[plan] : 0,\n totalCredits,\n uncapped: isUncappedPlanComp(org),\n usedCredits,\n billedUsd,\n providerUsd,\n remainingCredits:\n totalCredits === null ? null : Math.max(0, totalCredits - usedCredits),\n projectedCredits,\n projectedUsd: assistUsdFromCredits(projectedCredits),\n messages: Math.floor(finite(monthDoc?.['messages'])),\n deflected: Math.floor(finite(monthDoc?.['deflected'])),\n }\n}\n\n/**\n * The month's tokens as the card reads them: the totals the month document\n * has always kept, and its `kinds` map (`model/ai-tokens.ts`) with the cost\n * per request and the cache hit rate worked out per kind.\n */\nexport function composeStaffOrgAiTokens(\n monthDoc: Record<string, unknown> | null | undefined,\n): StaffOrgAiTokens {\n const total: AiTokenTotals = {\n input: Math.floor(finite(monthDoc?.['inputTokens'])),\n cached: Math.floor(finite(monthDoc?.['cacheReadTokens'])),\n cacheWrite: Math.floor(finite(monthDoc?.['cacheWriteTokens'])),\n output: Math.floor(finite(monthDoc?.['outputTokens'])),\n }\n return {\n total,\n cacheHitRate: aiCacheHitRate(total),\n kinds: readAiKindMonths(monthDoc?.[AI_USAGE_MONTH_KINDS_FIELD]).map((row) => ({\n ...row,\n costPerRequestUsd:\n row.requests > 0\n ? Math.round((row.providerCostUsd / row.requests) * 1_000_000) / 1_000_000\n : null,\n cacheHitRate: aiCacheHitRate(row.tokens),\n })),\n }\n}\n\n/**\n * Takes the BILLED figure, never the provider one (AGL-3015): every line\n * here is what the customer owes — credits past the band, the rate they sell\n * at, the dollars accrued, whether the org's own cap is reached — and an\n * invoice priced off our cost would bill a different month than the meter\n * the customer reads.\n */\nexport function composeStaffOrgAiOverage(\n org: Partial<AglynOrgBilling> | null | undefined,\n billedUsd: number,\n): StaffOrgAiOverage {\n const overage = assistMonthOverage(org, billedUsd)\n return {\n overageCredits: overage.overageCredits,\n rateUsdPer1k: overage.overageRateUsd,\n accruedUsd: overage.overageMonthlyUsd,\n sellsOverage: overage.bandCredits !== null && overage.overageRateUsd !== null,\n hardCap: resolveAssistHardCap(org),\n capUsd: resolveAssistOverageCapUsd(org),\n capReached: assistOverageCapReached(org, billedUsd),\n bandRefuses: assistBandRefuses(org),\n }\n}\n\nexport function composeStaffOrgAiAddon(\n org: Partial<AglynOrgBilling> | null | undefined,\n since: Pick<StaffOrgAiAddon, 'since' | 'sinceSource'>,\n): StaffOrgAiAddon {\n return {\n on: hasAiAddon(org),\n // What this workspace would be charged — none for a staff comp, which\n // has no subscription to carry the item (AGL-3034).\n priceUsd: resolvePlanPricing(org).aiAddonMonthlyUsd ?? null,\n ...since,\n }\n}\n\nexport function composeStaffOrgAiMargin(input: {\n org: Partial<AglynOrgBilling> | null | undefined\n pool: StaffOrgAiPool\n overage: StaffOrgAiOverage\n addon: StaffOrgAiAddon\n thresholdUsd: number\n multiple: number\n contribution: StaffOrgAiMargin['contribution']\n}): StaffOrgAiMargin {\n const { pool, overage, addon } = input\n const addonRevenueUsd = addon.on ? finite(addon.priceUsd) : 0\n // The band the PLAN sells — the override, when one is written, is what the\n // customer was actually given, so it is the figure the price is carrying.\n const planAssistShareUsd = assistUsdFromCredits(\n pool.overrideCredits ?? pool.planCredits,\n )\n const overageRevenueUsd = overage.accruedUsd\n // THE ONE PLACE THE TWO RATES MEET (AGL-3015). Revenue is what the\n // customer pays — an add-on price, a band sized in credits, overage at the\n // retail rate — and spend is what the provider charges us. Taking both\n // sides off one figure was what made a fully-drawn band read as exactly\n // break-even no matter what the tokens actually cost.\n const revenueUsd =\n Math.round((addonRevenueUsd + planAssistShareUsd + overageRevenueUsd) * 100) /\n 100\n return {\n addonRevenueUsd,\n planAssistShareUsd,\n overageRevenueUsd,\n revenueUsd,\n spendUsd: pool.providerUsd,\n underwater: pool.providerUsd > addonRevenueUsd + planAssistShareUsd,\n thresholdUsd: input.thresholdUsd,\n multiple: input.multiple,\n contribution: input.contribution,\n }\n}\n\nexport const STAFF_ORG_AI_JOB_STATUSES: readonly StaffOrgAiJobStatus[] = [\n 'queued',\n 'running',\n 'needs_input',\n 'needs_review',\n 'done',\n 'failed',\n 'canceled',\n]\n\n/** Zero-filled counts, so the card renders every status by name. */\nexport function emptyJobCounts(): Record<StaffOrgAiJobStatus, number> {\n return Object.fromEntries(\n STAFF_ORG_AI_JOB_STATUSES.map((status) => [status, 0]),\n ) as Record<StaffOrgAiJobStatus, number>\n}\n"],"names":["ASSIST_PROVIDER_COST_FIELD","assistBandRefuses","assistCreditsFromUsd","assistProviderCostUsd","assistMonthOverage","assistOverageCapReached","assistUsdFromCredits","resolveAssistCreditBudget","resolveAssistHardCap","resolveAssistOverageCapUsd","AI_ADDON_CREDITS_PER_MONTH","hasAiAddon","isUncappedPlanComp","PLAN_ENTITLEMENTS","resolveEffectivePlan","resolvePlanPricing","AI_USAGE_MONTH_KINDS_FIELD","aiCacheHitRate","readAiKindMonths","finite","value","parsed","Number","isFinite","monthProgress","now","year","getUTCFullYear","month","getUTCMonth","elapsed","getUTCDate","length","Date","UTC","projectMonthEnd","usedSoFar","Math","ceil","assistBandOverride","org","raw","entitlements","floor","composeStaffOrgAiPool","monthDoc","plan","addon","billedUsd","providerUsd","usedCredits","totalCredits","projectedCredits","planCredits","assistCreditsPerMonth","overrideCredits","addonCredits","uncapped","remainingCredits","max","projectedUsd","messages","deflected","composeStaffOrgAiTokens","total","input","cached","cacheWrite","output","cacheHitRate","kinds","map","row","costPerRequestUsd","requests","round","providerCostUsd","tokens","composeStaffOrgAiOverage","overage","overageCredits","rateUsdPer1k","overageRateUsd","accruedUsd","overageMonthlyUsd","sellsOverage","bandCredits","hardCap","capUsd","capReached","bandRefuses","composeStaffOrgAiAddon","since","on","priceUsd","aiAddonMonthlyUsd","composeStaffOrgAiMargin","pool","addonRevenueUsd","planAssistShareUsd","overageRevenueUsd","revenueUsd","spendUsd","underwater","thresholdUsd","multiple","contribution","STAFF_ORG_AI_JOB_STATUSES","emptyJobCounts","Object","fromEntries","status"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,6EAA6E;AAC7E,oEAAoE;AACpE,kDAAkD;;AAGlD,SACEA,0BAA0B,EAC1BC,iBAAiB,EACjBC,oBAAoB,EACpBC,qBAAqB,EACrBC,kBAAkB,EAClBC,uBAAuB,EACvBC,oBAAoB,EACpBC,yBAAyB,EACzBC,oBAAoB,EACpBC,0BAA0B,QACrB,wCAAuC;AAC9C,SACEC,0BAA0B,EAC1BC,UAAU,EACVC,kBAAkB,EAClBC,iBAAiB,EACjBC,oBAAoB,EACpBC,kBAAkB,QAEb,2CAA0C;AAEjD,SACEC,0BAA0B,EAC1BC,cAAc,EACdC,gBAAgB,QAGX,wBAAoB;AAiM3B,MAAMC,SAAS,CAACC;IACd,MAAMC,SAASC,OAAOF,gBAAAA,QAAS;IAC/B,OAAOE,OAAOC,QAAQ,CAACF,WAAWA,SAAS,IAAIA,SAAS;AAC1D;AAEA,uEAAuE,GACvE,OAAO,SAASG,cAAcC,GAAS;IACrC,MAAMC,OAAOD,IAAIE,cAAc;IAC/B,MAAMC,QAAQH,IAAII,WAAW;IAC7B,OAAO;QACLC,SAASL,IAAIM,UAAU;QACvBC,QAAQ,IAAIC,KAAKA,KAAKC,GAAG,CAACR,MAAME,QAAQ,GAAG,IAAIG,UAAU;IAC3D;AACF;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASI,gBAAgBC,SAAiB,EAAEX,GAAS;IAC1D,MAAM,EAAEK,OAAO,EAAEE,MAAM,EAAE,GAAGR,cAAcC;IAC1C,IAAI,CAAEW,CAAAA,YAAY,CAAA,KAAMN,WAAW,GAAG,OAAO;IAC7C,OAAOO,KAAKC,IAAI,CAAC,AAACF,YAAYN,UAAWE;AAC3C;AAEA,yEAAyE,GACzE,SAASO,mBACPC,GAAgD;QAEnCA;IAAb,MAAMC,MAAOD,wBAAAA,oBAAAA,IAAKE,YAAY,qBAAlB,AAACF,iBAA2D,CACtE,wBACD;IACD,IAAI,OAAOC,QAAQ,YAAY,CAACnB,OAAOC,QAAQ,CAACkB,QAAQA,MAAM,GAAG,OAAO;IACxE,OAAOJ,KAAKM,KAAK,CAACF;AACpB;AAEA,OAAO,SAASG,sBACdJ,GAAgD,EAChDK,QAAoD,EACpDpB,GAAS;QAiBaZ;IAftB,MAAMiC,OAAOhC,qBAAqB0B;IAClC,MAAMO,QAAQpC,WAAW6B;IACzB,wEAAwE;IACxE,2EAA2E;IAC3E,0EAA0E;IAC1E,0DAA0D;IAC1D,MAAMQ,YAAY7B,OAAO0B,4BAAAA,QAAU,CAAC,aAAa;IACjD,MAAMI,cAAc9C,sBAClB6C,WACAH,4BAAAA,QAAU,CAAC7C,2BAA2B;IAExC,MAAMkD,cAAchD,qBAAqB8C;IACzC,MAAMG,eAAe5C,0BAA0BiC;IAC/C,MAAMY,mBAAmBjB,gBAAgBe,aAAazB;IACtD,OAAO;QACL4B,aAAalC,QAAON,0BAAAA,iBAAiB,CAACiC,KAAK,qBAAvBjC,wBAAyByC,qBAAqB;QAClEC,iBAAiBhB,mBAAmBC;QACpCgB,cAAcT,QAAQrC,0BAA0B,CAACoC,KAAK,GAAG;QACzDK;QACAM,UAAU7C,mBAAmB4B;QAC7BU;QACAF;QACAC;QACAS,kBACEP,iBAAiB,OAAO,OAAOd,KAAKsB,GAAG,CAAC,GAAGR,eAAeD;QAC5DE;QACAQ,cAActD,qBAAqB8C;QACnCS,UAAUxB,KAAKM,KAAK,CAACxB,OAAO0B,4BAAAA,QAAU,CAAC,WAAW;QAClDiB,WAAWzB,KAAKM,KAAK,CAACxB,OAAO0B,4BAAAA,QAAU,CAAC,YAAY;IACtD;AACF;AAEA;;;;CAIC,GACD,OAAO,SAASkB,wBACdlB,QAAoD;IAEpD,MAAMmB,QAAuB;QAC3BC,OAAO5B,KAAKM,KAAK,CAACxB,OAAO0B,4BAAAA,QAAU,CAAC,cAAc;QAClDqB,QAAQ7B,KAAKM,KAAK,CAACxB,OAAO0B,4BAAAA,QAAU,CAAC,kBAAkB;QACvDsB,YAAY9B,KAAKM,KAAK,CAACxB,OAAO0B,4BAAAA,QAAU,CAAC,mBAAmB;QAC5DuB,QAAQ/B,KAAKM,KAAK,CAACxB,OAAO0B,4BAAAA,QAAU,CAAC,eAAe;IACtD;IACA,OAAO;QACLmB;QACAK,cAAcpD,eAAe+C;QAC7BM,OAAOpD,iBAAiB2B,4BAAAA,QAAU,CAAC7B,2BAA2B,EAAEuD,GAAG,CAAC,CAACC,MAAS,aACzEA;gBACHC,mBACED,IAAIE,QAAQ,GAAG,IACXrC,KAAKsC,KAAK,CAAC,AAACH,IAAII,eAAe,GAAGJ,IAAIE,QAAQ,GAAI,WAAa,UAC/D;gBACNL,cAAcpD,eAAeuD,IAAIK,MAAM;;IAE3C;AACF;AAEA;;;;;;CAMC,GACD,OAAO,SAASC,yBACdtC,GAAgD,EAChDQ,SAAiB;IAEjB,MAAM+B,UAAU3E,mBAAmBoC,KAAKQ;IACxC,OAAO;QACLgC,gBAAgBD,QAAQC,cAAc;QACtCC,cAAcF,QAAQG,cAAc;QACpCC,YAAYJ,QAAQK,iBAAiB;QACrCC,cAAcN,QAAQO,WAAW,KAAK,QAAQP,QAAQG,cAAc,KAAK;QACzEK,SAAS/E,qBAAqBgC;QAC9BgD,QAAQ/E,2BAA2B+B;QACnCiD,YAAYpF,wBAAwBmC,KAAKQ;QACzC0C,aAAazF,kBAAkBuC;IACjC;AACF;AAEA,OAAO,SAASmD,uBACdnD,GAAgD,EAChDoD,KAAqD;QAMzC7E;IAJZ,OAAO;QACL8E,IAAIlF,WAAW6B;QACf,sEAAsE;QACtE,oDAAoD;QACpDsD,QAAQ,GAAE/E,wCAAAA,mBAAmByB,KAAKuD,iBAAiB,YAAzChF,wCAA6C;OACpD6E;AAEP;AAEA,OAAO,SAASI,wBAAwB/B,KAQvC;QAMGgC;IALF,MAAM,EAAEA,IAAI,EAAElB,OAAO,EAAEhC,KAAK,EAAE,GAAGkB;IACjC,MAAMiC,kBAAkBnD,MAAM8C,EAAE,GAAG1E,OAAO4B,MAAM+C,QAAQ,IAAI;IAC5D,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAMK,qBAAqB7F,sBACzB2F,wBAAAA,KAAK1C,eAAe,YAApB0C,wBAAwBA,KAAK5C,WAAW;IAE1C,MAAM+C,oBAAoBrB,QAAQI,UAAU;IAC5C,mEAAmE;IACnE,2EAA2E;IAC3E,uEAAuE;IACvE,wEAAwE;IACxE,sDAAsD;IACtD,MAAMkB,aACJhE,KAAKsC,KAAK,CAAC,AAACuB,CAAAA,kBAAkBC,qBAAqBC,iBAAgB,IAAK,OACxE;IACF,OAAO;QACLF;QACAC;QACAC;QACAC;QACAC,UAAUL,KAAKhD,WAAW;QAC1BsD,YAAYN,KAAKhD,WAAW,GAAGiD,kBAAkBC;QACjDK,cAAcvC,MAAMuC,YAAY;QAChCC,UAAUxC,MAAMwC,QAAQ;QACxBC,cAAczC,MAAMyC,YAAY;IAClC;AACF;AAEA,OAAO,MAAMC,4BAA4D;IACvE;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAA;AAED,kEAAkE,GAClE,OAAO,SAASC;IACd,OAAOC,OAAOC,WAAW,CACvBH,0BAA0BpC,GAAG,CAAC,CAACwC,SAAW;YAACA;YAAQ;SAAE;AAEzD"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import type { AglynOrgBilling } from '@aglyn/aglyn';
18
+ /**
19
+ * THE STAFF ORG USAGE TABLE'S AI FIGURES (AGL-2984).
20
+ *
21
+ * The staff org usage table — on the staff org page and in the Organizations
22
+ * list's Usage dialog — draws this plugin's three columns through its
23
+ * `staffOrgUsageColumn` zone, and the org page draws the credit pool line
24
+ * above it. These are the texts they draw, apart from React so each shape
25
+ * is pinned on its own.
26
+ */
27
+ /** The AI fields of one monthly rollup row, as the org usage route serves it. */
28
+ export interface StaffOrgUsageAiMonth {
29
+ /**
30
+ * Provider spend for the month in dollars (AGL-2280). Its own column rather
31
+ * than folded into the metering estimate: this is a real provider bill.
32
+ */
33
+ assistCostUsd?: number | null;
34
+ /**
35
+ * The credit view of the same spend (AGL-2930): what the month drew
36
+ * against the band, and the part past it that was billed. `null` on a
37
+ * rollup written before the credit meter existed — a `0` there would
38
+ * state, as measurement, that the org used no AI in a month nobody
39
+ * measured.
40
+ */
41
+ assistCredits?: number | null;
42
+ assistOverageUsd?: number | null;
43
+ }
44
+ /**
45
+ * The Assist column's text. Four decimals, not two: spend arrives in
46
+ * thousandths of a dollar per exchange, and `$0.00` for a month that really
47
+ * cost eight cents is a silence.
48
+ */
49
+ export declare function assistCostCell(value: number | null | undefined): string;
50
+ /** A recorded count, or the dash that says the rollup predates it. */
51
+ export declare function aiCreditsCell(value: number | null | undefined): string;
52
+ /** A billed dollar figure, or the dash that says the rollup predates it. */
53
+ export declare function aiOverageCell(value: number | null | undefined): string;
54
+ /**
55
+ * The org's AI credit pool (AGL-2899): whether the AI add-on is on, the
56
+ * credits the add-on contributes, and the whole band the Assist column is
57
+ * drawn against.
58
+ */
59
+ export interface StaffAssistPool {
60
+ aiAddon: boolean;
61
+ /** The add-on's band alone; 0 without the add-on. */
62
+ addonCredits: number;
63
+ /** Plan band plus add-on band, or null where the plan sells no band. */
64
+ creditsPerMonth: number | null;
65
+ /**
66
+ * Present, and true, only where an uncapped staff comp lifts the band
67
+ * (AGL-3049) — the other reason `creditsPerMonth` is null.
68
+ */
69
+ uncapped?: true;
70
+ }
71
+ /**
72
+ * The pool as the meter resolves it from the org document: the plan's band
73
+ * plus the add-on's, folded by `resolveOrgEntitlements`, with the add-on
74
+ * read off the EFFECTIVE plan through `hasAiAddon` — so a dead
75
+ * subscription's add-on reads as off here exactly as it does on the
76
+ * customer's own meter.
77
+ */
78
+ export declare function staffAssistPool(org: Partial<AglynOrgBilling> | null | undefined): StaffAssistPool;
79
+ /**
80
+ * The pool as one line: the reader of the Assist column needs to know what
81
+ * band the dollars are drawn against, and whether an add-on is part of it.
82
+ */
83
+ export declare function assistPoolSentence(pool: StaffAssistPool): string;
@@ -0,0 +1,59 @@
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
+ */ import { _ as _extends } from "@swc/helpers/_/_extends";
17
+ import { AI_ADDON_CREDITS_PER_MONTH, aiAddonName, hasAiAddon, isUncappedPlanComp, resolveEffectivePlan, resolveOrgEntitlements } from "@aglyn/aglyn/app-utils/plan-entitlements";
18
+ /**
19
+ * The Assist column's text. Four decimals, not two: spend arrives in
20
+ * thousandths of a dollar per exchange, and `$0.00` for a month that really
21
+ * cost eight cents is a silence.
22
+ */ export function assistCostCell(value) {
23
+ return `$${Number(value != null ? value : 0).toFixed(4)}`;
24
+ }
25
+ /** A recorded count, or the dash that says the rollup predates it. */ export function aiCreditsCell(value) {
26
+ return value == null ? '—' : Math.round(value).toLocaleString();
27
+ }
28
+ /** A billed dollar figure, or the dash that says the rollup predates it. */ export function aiOverageCell(value) {
29
+ return value == null ? '—' : `$${Number(value).toFixed(2)}`;
30
+ }
31
+ /**
32
+ * The pool as the meter resolves it from the org document: the plan's band
33
+ * plus the add-on's, folded by `resolveOrgEntitlements`, with the add-on
34
+ * read off the EFFECTIVE plan through `hasAiAddon` — so a dead
35
+ * subscription's add-on reads as off here exactly as it does on the
36
+ * customer's own meter.
37
+ */ export function staffAssistPool(org) {
38
+ const aiAddon = hasAiAddon(org);
39
+ const creditsPerMonth = resolveOrgEntitlements(org).assistCreditsPerMonth;
40
+ return _extends({
41
+ aiAddon,
42
+ addonCredits: aiAddon ? AI_ADDON_CREDITS_PER_MONTH[resolveEffectivePlan(org)] : 0,
43
+ // Finite only: an uncapped comp resolves the band `UNLIMITED`, which is
44
+ // no band to name a figure for.
45
+ creditsPerMonth: Number.isFinite(creditsPerMonth) && creditsPerMonth > 0 ? creditsPerMonth : null
46
+ }, isUncappedPlanComp(org) ? {
47
+ uncapped: true
48
+ } : {});
49
+ }
50
+ /**
51
+ * The pool as one line: the reader of the Assist column needs to know what
52
+ * band the dollars are drawn against, and whether an add-on is part of it.
53
+ */ export function assistPoolSentence(pool) {
54
+ const band = pool.creditsPerMonth !== null ? `${pool.creditsPerMonth.toLocaleString()} AI credits/mo` : pool.uncapped ? 'no AI credit band (uncapped staff comp)' : 'no AI credit band';
55
+ const name = aiAddonName();
56
+ return pool.aiAddon ? `${name} add-on on — ${band}, ${pool.addonCredits.toLocaleString()} ` + 'of them from the add-on.' : `${name} add-on off — ${band}.`;
57
+ }
58
+
59
+ //# sourceMappingURL=staff-org-usage-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/usage/staff-org-usage-ai.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\nimport type { AglynOrgBilling } from '@aglyn/aglyn'\nimport {\n AI_ADDON_CREDITS_PER_MONTH,\n aiAddonName,\n hasAiAddon,\n isUncappedPlanComp,\n resolveEffectivePlan,\n resolveOrgEntitlements,\n} from '@aglyn/aglyn/app-utils/plan-entitlements'\n\n/**\n * THE STAFF ORG USAGE TABLE'S AI FIGURES (AGL-2984).\n *\n * The staff org usage table — on the staff org page and in the Organizations\n * list's Usage dialog — draws this plugin's three columns through its\n * `staffOrgUsageColumn` zone, and the org page draws the credit pool line\n * above it. These are the texts they draw, apart from React so each shape\n * is pinned on its own.\n */\n\n/** The AI fields of one monthly rollup row, as the org usage route serves it. */\nexport interface StaffOrgUsageAiMonth {\n /**\n * Provider spend for the month in dollars (AGL-2280). Its own column rather\n * than folded into the metering estimate: this is a real provider bill.\n */\n assistCostUsd?: number | null\n /**\n * The credit view of the same spend (AGL-2930): what the month drew\n * against the band, and the part past it that was billed. `null` on a\n * rollup written before the credit meter existed — a `0` there would\n * state, as measurement, that the org used no AI in a month nobody\n * measured.\n */\n assistCredits?: number | null\n assistOverageUsd?: number | null\n}\n\n/**\n * The Assist column's text. Four decimals, not two: spend arrives in\n * thousandths of a dollar per exchange, and `$0.00` for a month that really\n * cost eight cents is a silence.\n */\nexport function assistCostCell(value: number | null | undefined): string {\n return `$${Number(value ?? 0).toFixed(4)}`\n}\n\n/** A recorded count, or the dash that says the rollup predates it. */\nexport function aiCreditsCell(value: number | null | undefined): string {\n return value == null ? '—' : Math.round(value).toLocaleString()\n}\n\n/** A billed dollar figure, or the dash that says the rollup predates it. */\nexport function aiOverageCell(value: number | null | undefined): string {\n return value == null ? '—' : `$${Number(value).toFixed(2)}`\n}\n\n/**\n * The org's AI credit pool (AGL-2899): whether the AI add-on is on, the\n * credits the add-on contributes, and the whole band the Assist column is\n * drawn against.\n */\nexport interface StaffAssistPool {\n aiAddon: boolean\n /** The add-on's band alone; 0 without the add-on. */\n addonCredits: number\n /** Plan band plus add-on band, or null where the plan sells no band. */\n creditsPerMonth: number | null\n /**\n * Present, and true, only where an uncapped staff comp lifts the band\n * (AGL-3049) — the other reason `creditsPerMonth` is null.\n */\n uncapped?: true\n}\n\n/**\n * The pool as the meter resolves it from the org document: the plan's band\n * plus the add-on's, folded by `resolveOrgEntitlements`, with the add-on\n * read off the EFFECTIVE plan through `hasAiAddon` — so a dead\n * subscription's add-on reads as off here exactly as it does on the\n * customer's own meter.\n */\nexport function staffAssistPool(\n org: Partial<AglynOrgBilling> | null | undefined,\n): StaffAssistPool {\n const aiAddon = hasAiAddon(org)\n const creditsPerMonth = resolveOrgEntitlements(org).assistCreditsPerMonth\n return {\n aiAddon,\n addonCredits: aiAddon\n ? AI_ADDON_CREDITS_PER_MONTH[resolveEffectivePlan(org)]\n : 0,\n // Finite only: an uncapped comp resolves the band `UNLIMITED`, which is\n // no band to name a figure for.\n creditsPerMonth:\n Number.isFinite(creditsPerMonth) && creditsPerMonth > 0\n ? creditsPerMonth\n : null,\n ...(isUncappedPlanComp(org) ? { uncapped: true as const } : {}),\n }\n}\n\n/**\n * The pool as one line: the reader of the Assist column needs to know what\n * band the dollars are drawn against, and whether an add-on is part of it.\n */\nexport function assistPoolSentence(pool: StaffAssistPool): string {\n const band =\n pool.creditsPerMonth !== null\n ? `${pool.creditsPerMonth.toLocaleString()} AI credits/mo`\n : pool.uncapped\n ? 'no AI credit band (uncapped staff comp)'\n : 'no AI credit band'\n const name = aiAddonName()\n return pool.aiAddon\n ? `${name} add-on on — ${band}, ${pool.addonCredits.toLocaleString()} ` +\n 'of them from the add-on.'\n : `${name} add-on off — ${band}.`\n}\n"],"names":["AI_ADDON_CREDITS_PER_MONTH","aiAddonName","hasAiAddon","isUncappedPlanComp","resolveEffectivePlan","resolveOrgEntitlements","assistCostCell","value","Number","toFixed","aiCreditsCell","Math","round","toLocaleString","aiOverageCell","staffAssistPool","org","aiAddon","creditsPerMonth","assistCreditsPerMonth","addonCredits","isFinite","uncapped","assistPoolSentence","pool","band","name"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC;AAGD,SACEA,0BAA0B,EAC1BC,WAAW,EACXC,UAAU,EACVC,kBAAkB,EAClBC,oBAAoB,EACpBC,sBAAsB,QACjB,2CAA0C;AA8BjD;;;;CAIC,GACD,OAAO,SAASC,eAAeC,KAAgC;IAC7D,OAAO,CAAC,CAAC,EAAEC,OAAOD,gBAAAA,QAAS,GAAGE,OAAO,CAAC,IAAI;AAC5C;AAEA,oEAAoE,GACpE,OAAO,SAASC,cAAcH,KAAgC;IAC5D,OAAOA,SAAS,OAAO,MAAMI,KAAKC,KAAK,CAACL,OAAOM,cAAc;AAC/D;AAEA,0EAA0E,GAC1E,OAAO,SAASC,cAAcP,KAAgC;IAC5D,OAAOA,SAAS,OAAO,MAAM,CAAC,CAAC,EAAEC,OAAOD,OAAOE,OAAO,CAAC,IAAI;AAC7D;AAoBA;;;;;;CAMC,GACD,OAAO,SAASM,gBACdC,GAAgD;IAEhD,MAAMC,UAAUf,WAAWc;IAC3B,MAAME,kBAAkBb,uBAAuBW,KAAKG,qBAAqB;IACzE,OAAO;QACLF;QACAG,cAAcH,UACVjB,0BAA0B,CAACI,qBAAqBY,KAAK,GACrD;QACJ,wEAAwE;QACxE,gCAAgC;QAChCE,iBACEV,OAAOa,QAAQ,CAACH,oBAAoBA,kBAAkB,IAClDA,kBACA;OACFf,mBAAmBa,OAAO;QAAEM,UAAU;IAAc,IAAI,CAAC;AAEjE;AAEA;;;CAGC,GACD,OAAO,SAASC,mBAAmBC,IAAqB;IACtD,MAAMC,OACJD,KAAKN,eAAe,KAAK,OACrB,GAAGM,KAAKN,eAAe,CAACL,cAAc,GAAG,cAAc,CAAC,GACxDW,KAAKF,QAAQ,GACX,4CACA;IACR,MAAMI,OAAOzB;IACb,OAAOuB,KAAKP,OAAO,GACf,GAAGS,KAAK,aAAa,EAAED,KAAK,EAAE,EAAED,KAAKJ,YAAY,CAACP,cAAc,GAAG,CAAC,CAAC,GACnE,6BACF,GAAGa,KAAK,cAAc,EAAED,KAAK,CAAC,CAAC;AACrC"}
@@ -0,0 +1,83 @@
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
+ * THE STAFF ORGANIZATIONS LIST'S AI SPEND COLUMN, AS DATA (AGL-2984).
19
+ *
20
+ * The list draws this plugin's column through its `staffOrgsListColumn`
21
+ * zone: one read of the page's orgs through `/api/ai/admin/orgs-spend`, a
22
+ * cell per row, and a header that sorts the page by the figures. The parts
23
+ * all three share live here — the wire, the number a sort compares, the text
24
+ * a cell shows, and the request's id list — free of React and of the Admin
25
+ * SDK, so the route, the hook and the specs read one definition.
26
+ */
27
+ /** The most org ids one request may name — past the list's largest page. */
28
+ export declare const STAFF_ORGS_AI_SPEND_MAX_IDS = 100;
29
+ /** What `/api/ai/admin/orgs-spend` answers. */
30
+ export interface StaffOrgsAiSpendWire {
31
+ /** The month the figures describe, `YYYY-MM` in UTC. */
32
+ month: string;
33
+ /**
34
+ * This month's provider spend in USD, by org id. `null` where the org has
35
+ * no usage document for the month or the read failed, never `0`: "spent
36
+ * nothing" and "not measured" stay distinct, and the column exists to find
37
+ * the org that IS spending.
38
+ */
39
+ spendUsd: Record<string, number | null>;
40
+ }
41
+ /**
42
+ * What a sort compares: a NUMBER, or `null` for an unmeasured org. The text
43
+ * a cell shows would sort `$10.0000` before `$9.0000`.
44
+ */
45
+ export declare function aiSpendSortValue(value: unknown): number | null;
46
+ /**
47
+ * What a cell shows: four decimals, because a month that really cost eight
48
+ * cents must not read as `$0.00`, and a dash for an unmeasured org — never
49
+ * `$0`.
50
+ */
51
+ export declare function aiSpendCell(value: unknown): string;
52
+ /** Dearest first; an unmeasured org last. */
53
+ export declare function byAiSpendDesc(a: unknown, b: unknown): number;
54
+ /** Cheapest first; an unmeasured org still last. */
55
+ export declare function byAiSpendAsc(a: unknown, b: unknown): number;
56
+ /**
57
+ * The list's rows in a direction by their org's spend — the comparator the
58
+ * column's header hands the list. A row whose org the answer does not name
59
+ * reads as unmeasured.
60
+ */
61
+ export declare function aiSpendRowComparator(spendUsd: Readonly<Record<string, number | null>>, direction: 'asc' | 'desc'): (a: {
62
+ $id?: unknown;
63
+ }, b: {
64
+ $id?: unknown;
65
+ }) => number;
66
+ /**
67
+ * The query string asking for a set of orgs. Each id is encoded on its own
68
+ * before the join, so an id holding the separator survives the split.
69
+ */
70
+ export declare function staffOrgsAiSpendQuery(orgIds: readonly string[]): string;
71
+ /** The org ids a request names, or why it names none a read should serve. */
72
+ export interface StaffOrgIdsAsk {
73
+ /** Distinct and in the order asked; empty when the ask is refused. */
74
+ orgIds: string[];
75
+ /** Why the ask is refused, or `null` when it is not. */
76
+ error: string | null;
77
+ }
78
+ /**
79
+ * The org ids a request names. An empty ask, more than
80
+ * {@link STAFF_ORGS_AI_SPEND_MAX_IDS} ids, and an id no org document could
81
+ * have are refused before any of them reaches a read.
82
+ */
83
+ export declare function parseStaffOrgIds(raw: unknown): StaffOrgIdsAsk;
@@ -0,0 +1,114 @@
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
+ * THE STAFF ORGANIZATIONS LIST'S AI SPEND COLUMN, AS DATA (AGL-2984).
18
+ *
19
+ * The list draws this plugin's column through its `staffOrgsListColumn`
20
+ * zone: one read of the page's orgs through `/api/ai/admin/orgs-spend`, a
21
+ * cell per row, and a header that sorts the page by the figures. The parts
22
+ * all three share live here — the wire, the number a sort compares, the text
23
+ * a cell shows, and the request's id list — free of React and of the Admin
24
+ * SDK, so the route, the hook and the specs read one definition.
25
+ */ /** The most org ids one request may name — past the list's largest page. */ export const STAFF_ORGS_AI_SPEND_MAX_IDS = 100;
26
+ /**
27
+ * What a sort compares: a NUMBER, or `null` for an unmeasured org. The text
28
+ * a cell shows would sort `$10.0000` before `$9.0000`.
29
+ */ export function aiSpendSortValue(value) {
30
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
31
+ }
32
+ /**
33
+ * What a cell shows: four decimals, because a month that really cost eight
34
+ * cents must not read as `$0.00`, and a dash for an unmeasured org — never
35
+ * `$0`.
36
+ */ export function aiSpendCell(value) {
37
+ const spend = aiSpendSortValue(value);
38
+ return spend === null ? '—' : `$${spend.toFixed(4)}`;
39
+ }
40
+ /**
41
+ * Two spends in a direction, with the unmeasured LAST in both: an org that
42
+ * has not touched AI this month belongs at the bottom of a column whose
43
+ * point is finding the one that has, whichever way it is read.
44
+ */ function compareAiSpend(a, b, direction) {
45
+ const left = aiSpendSortValue(a);
46
+ const right = aiSpendSortValue(b);
47
+ if (left === null && right === null) return 0;
48
+ if (left === null) return 1;
49
+ if (right === null) return -1;
50
+ return direction === 'desc' ? right - left : left - right;
51
+ }
52
+ /** Dearest first; an unmeasured org last. */ export function byAiSpendDesc(a, b) {
53
+ return compareAiSpend(a, b, 'desc');
54
+ }
55
+ /** Cheapest first; an unmeasured org still last. */ export function byAiSpendAsc(a, b) {
56
+ return compareAiSpend(a, b, 'asc');
57
+ }
58
+ /**
59
+ * The list's rows in a direction by their org's spend — the comparator the
60
+ * column's header hands the list. A row whose org the answer does not name
61
+ * reads as unmeasured.
62
+ */ export function aiSpendRowComparator(spendUsd, direction) {
63
+ const spendOf = (row)=>{
64
+ var _ref;
65
+ return spendUsd[String((_ref = row == null ? void 0 : row.$id) != null ? _ref : '')];
66
+ };
67
+ return (a, b)=>compareAiSpend(spendOf(a), spendOf(b), direction);
68
+ }
69
+ /** Between ids in the `orgIds` parameter. */ const ORG_ID_SEPARATOR = ',';
70
+ /**
71
+ * The query string asking for a set of orgs. Each id is encoded on its own
72
+ * before the join, so an id holding the separator survives the split.
73
+ */ export function staffOrgsAiSpendQuery(orgIds) {
74
+ return new URLSearchParams({
75
+ orgIds: orgIds.map((orgId)=>encodeURIComponent(orgId)).join(ORG_ID_SEPARATOR)
76
+ }).toString();
77
+ }
78
+ /** A document id Firestore accepts for an org. */ function isOrgDocumentId(id) {
79
+ return id.length > 0 && id.length <= 1500 && !id.includes('/') && id !== '.' && id !== '..' && !/^__.*__$/.test(id);
80
+ }
81
+ /**
82
+ * The org ids a request names. An empty ask, more than
83
+ * {@link STAFF_ORGS_AI_SPEND_MAX_IDS} ids, and an id no org document could
84
+ * have are refused before any of them reaches a read.
85
+ */ export function parseStaffOrgIds(raw) {
86
+ const refuse = (error)=>({
87
+ orgIds: [],
88
+ error
89
+ });
90
+ const orgIds = new Set();
91
+ for (const part of String(raw != null ? raw : '').split(ORG_ID_SEPARATOR)){
92
+ if (!part) continue;
93
+ let orgId;
94
+ try {
95
+ orgId = decodeURIComponent(part);
96
+ } catch (unused) {
97
+ return refuse('Invalid orgIds');
98
+ }
99
+ if (!isOrgDocumentId(orgId)) return refuse('Invalid orgIds');
100
+ orgIds.add(orgId);
101
+ if (orgIds.size > STAFF_ORGS_AI_SPEND_MAX_IDS) {
102
+ return refuse(`At most ${STAFF_ORGS_AI_SPEND_MAX_IDS} orgIds`);
103
+ }
104
+ }
105
+ if (orgIds.size === 0) return refuse('Missing orgIds');
106
+ return {
107
+ orgIds: [
108
+ ...orgIds
109
+ ],
110
+ error: null
111
+ };
112
+ }
113
+
114
+ //# sourceMappingURL=staff-orgs-ai-spend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/usage/staff-orgs-ai-spend.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * THE STAFF ORGANIZATIONS LIST'S AI SPEND COLUMN, AS DATA (AGL-2984).\n *\n * The list draws this plugin's column through its `staffOrgsListColumn`\n * zone: one read of the page's orgs through `/api/ai/admin/orgs-spend`, a\n * cell per row, and a header that sorts the page by the figures. The parts\n * all three share live here — the wire, the number a sort compares, the text\n * a cell shows, and the request's id list — free of React and of the Admin\n * SDK, so the route, the hook and the specs read one definition.\n */\n\n/** The most org ids one request may name — past the list's largest page. */\nexport const STAFF_ORGS_AI_SPEND_MAX_IDS = 100\n\n/** What `/api/ai/admin/orgs-spend` answers. */\nexport interface StaffOrgsAiSpendWire {\n /** The month the figures describe, `YYYY-MM` in UTC. */\n month: string\n /**\n * This month's provider spend in USD, by org id. `null` where the org has\n * no usage document for the month or the read failed, never `0`: \"spent\n * nothing\" and \"not measured\" stay distinct, and the column exists to find\n * the org that IS spending.\n */\n spendUsd: Record<string, number | null>\n}\n\n/**\n * What a sort compares: a NUMBER, or `null` for an unmeasured org. The text\n * a cell shows would sort `$10.0000` before `$9.0000`.\n */\nexport function aiSpendSortValue(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null\n}\n\n/**\n * What a cell shows: four decimals, because a month that really cost eight\n * cents must not read as `$0.00`, and a dash for an unmeasured org — never\n * `$0`.\n */\nexport function aiSpendCell(value: unknown): string {\n const spend = aiSpendSortValue(value)\n return spend === null ? '—' : `$${spend.toFixed(4)}`\n}\n\n/**\n * Two spends in a direction, with the unmeasured LAST in both: an org that\n * has not touched AI this month belongs at the bottom of a column whose\n * point is finding the one that has, whichever way it is read.\n */\nfunction compareAiSpend(\n a: unknown,\n b: unknown,\n direction: 'asc' | 'desc',\n): number {\n const left = aiSpendSortValue(a)\n const right = aiSpendSortValue(b)\n if (left === null && right === null) return 0\n if (left === null) return 1\n if (right === null) return -1\n return direction === 'desc' ? right - left : left - right\n}\n\n/** Dearest first; an unmeasured org last. */\nexport function byAiSpendDesc(a: unknown, b: unknown): number {\n return compareAiSpend(a, b, 'desc')\n}\n\n/** Cheapest first; an unmeasured org still last. */\nexport function byAiSpendAsc(a: unknown, b: unknown): number {\n return compareAiSpend(a, b, 'asc')\n}\n\n/**\n * The list's rows in a direction by their org's spend — the comparator the\n * column's header hands the list. A row whose org the answer does not name\n * reads as unmeasured.\n */\nexport function aiSpendRowComparator(\n spendUsd: Readonly<Record<string, number | null>>,\n direction: 'asc' | 'desc',\n): (a: { $id?: unknown }, b: { $id?: unknown }) => number {\n const spendOf = (row: { $id?: unknown }) => spendUsd[String(row?.$id ?? '')]\n return (a, b) => compareAiSpend(spendOf(a), spendOf(b), direction)\n}\n\n/** Between ids in the `orgIds` parameter. */\nconst ORG_ID_SEPARATOR = ','\n\n/**\n * The query string asking for a set of orgs. Each id is encoded on its own\n * before the join, so an id holding the separator survives the split.\n */\nexport function staffOrgsAiSpendQuery(orgIds: readonly string[]): string {\n return new URLSearchParams({\n orgIds: orgIds\n .map((orgId) => encodeURIComponent(orgId))\n .join(ORG_ID_SEPARATOR),\n }).toString()\n}\n\n/** A document id Firestore accepts for an org. */\nfunction isOrgDocumentId(id: string): boolean {\n return (\n id.length > 0 &&\n id.length <= 1500 &&\n !id.includes('/') &&\n id !== '.' &&\n id !== '..' &&\n !/^__.*__$/.test(id)\n )\n}\n\n/** The org ids a request names, or why it names none a read should serve. */\nexport interface StaffOrgIdsAsk {\n /** Distinct and in the order asked; empty when the ask is refused. */\n orgIds: string[]\n /** Why the ask is refused, or `null` when it is not. */\n error: string | null\n}\n\n/**\n * The org ids a request names. An empty ask, more than\n * {@link STAFF_ORGS_AI_SPEND_MAX_IDS} ids, and an id no org document could\n * have are refused before any of them reaches a read.\n */\nexport function parseStaffOrgIds(raw: unknown): StaffOrgIdsAsk {\n const refuse = (error: string): StaffOrgIdsAsk => ({ orgIds: [], error })\n const orgIds = new Set<string>()\n for (const part of String(raw ?? '').split(ORG_ID_SEPARATOR)) {\n if (!part) continue\n let orgId: string\n try {\n orgId = decodeURIComponent(part)\n } catch {\n return refuse('Invalid orgIds')\n }\n if (!isOrgDocumentId(orgId)) return refuse('Invalid orgIds')\n orgIds.add(orgId)\n if (orgIds.size > STAFF_ORGS_AI_SPEND_MAX_IDS) {\n return refuse(`At most ${STAFF_ORGS_AI_SPEND_MAX_IDS} orgIds`)\n }\n }\n if (orgIds.size === 0) return refuse('Missing orgIds')\n return { orgIds: [...orgIds], error: null }\n}\n"],"names":["STAFF_ORGS_AI_SPEND_MAX_IDS","aiSpendSortValue","value","Number","isFinite","aiSpendCell","spend","toFixed","compareAiSpend","a","b","direction","left","right","byAiSpendDesc","byAiSpendAsc","aiSpendRowComparator","spendUsd","spendOf","row","String","$id","ORG_ID_SEPARATOR","staffOrgsAiSpendQuery","orgIds","URLSearchParams","map","orgId","encodeURIComponent","join","toString","isOrgDocumentId","id","length","includes","test","parseStaffOrgIds","raw","refuse","error","Set","part","split","decodeURIComponent","add","size"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;CASC,GAED,0EAA0E,GAC1E,OAAO,MAAMA,8BAA8B,IAAG;AAe9C;;;CAGC,GACD,OAAO,SAASC,iBAAiBC,KAAc;IAC7C,OAAO,OAAOA,UAAU,YAAYC,OAAOC,QAAQ,CAACF,SAASA,QAAQ;AACvE;AAEA;;;;CAIC,GACD,OAAO,SAASG,YAAYH,KAAc;IACxC,MAAMI,QAAQL,iBAAiBC;IAC/B,OAAOI,UAAU,OAAO,MAAM,CAAC,CAAC,EAAEA,MAAMC,OAAO,CAAC,IAAI;AACtD;AAEA;;;;CAIC,GACD,SAASC,eACPC,CAAU,EACVC,CAAU,EACVC,SAAyB;IAEzB,MAAMC,OAAOX,iBAAiBQ;IAC9B,MAAMI,QAAQZ,iBAAiBS;IAC/B,IAAIE,SAAS,QAAQC,UAAU,MAAM,OAAO;IAC5C,IAAID,SAAS,MAAM,OAAO;IAC1B,IAAIC,UAAU,MAAM,OAAO,CAAC;IAC5B,OAAOF,cAAc,SAASE,QAAQD,OAAOA,OAAOC;AACtD;AAEA,2CAA2C,GAC3C,OAAO,SAASC,cAAcL,CAAU,EAAEC,CAAU;IAClD,OAAOF,eAAeC,GAAGC,GAAG;AAC9B;AAEA,kDAAkD,GAClD,OAAO,SAASK,aAAaN,CAAU,EAAEC,CAAU;IACjD,OAAOF,eAAeC,GAAGC,GAAG;AAC9B;AAEA;;;;CAIC,GACD,OAAO,SAASM,qBACdC,QAAiD,EACjDN,SAAyB;IAEzB,MAAMO,UAAU,CAACC;;eAA2BF,QAAQ,CAACG,eAAOD,uBAAAA,IAAKE,GAAG,mBAAI,IAAI;;IAC5E,OAAO,CAACZ,GAAGC,IAAMF,eAAeU,QAAQT,IAAIS,QAAQR,IAAIC;AAC1D;AAEA,2CAA2C,GAC3C,MAAMW,mBAAmB;AAEzB;;;CAGC,GACD,OAAO,SAASC,sBAAsBC,MAAyB;IAC7D,OAAO,IAAIC,gBAAgB;QACzBD,QAAQA,OACLE,GAAG,CAAC,CAACC,QAAUC,mBAAmBD,QAClCE,IAAI,CAACP;IACV,GAAGQ,QAAQ;AACb;AAEA,gDAAgD,GAChD,SAASC,gBAAgBC,EAAU;IACjC,OACEA,GAAGC,MAAM,GAAG,KACZD,GAAGC,MAAM,IAAI,QACb,CAACD,GAAGE,QAAQ,CAAC,QACbF,OAAO,OACPA,OAAO,QACP,CAAC,WAAWG,IAAI,CAACH;AAErB;AAUA;;;;CAIC,GACD,OAAO,SAASI,iBAAiBC,GAAY;IAC3C,MAAMC,SAAS,CAACC,QAAmC,CAAA;YAAEf,QAAQ,EAAE;YAAEe;QAAM,CAAA;IACvE,MAAMf,SAAS,IAAIgB;IACnB,KAAK,MAAMC,QAAQrB,OAAOiB,cAAAA,MAAO,IAAIK,KAAK,CAACpB,kBAAmB;QAC5D,IAAI,CAACmB,MAAM;QACX,IAAId;QACJ,IAAI;YACFA,QAAQgB,mBAAmBF;QAC7B,EAAE,eAAM;YACN,OAAOH,OAAO;QAChB;QACA,IAAI,CAACP,gBAAgBJ,QAAQ,OAAOW,OAAO;QAC3Cd,OAAOoB,GAAG,CAACjB;QACX,IAAIH,OAAOqB,IAAI,GAAG7C,6BAA6B;YAC7C,OAAOsC,OAAO,CAAC,QAAQ,EAAEtC,4BAA4B,OAAO,CAAC;QAC/D;IACF;IACA,IAAIwB,OAAOqB,IAAI,KAAK,GAAG,OAAOP,OAAO;IACrC,OAAO;QAAEd,QAAQ;eAAIA;SAAO;QAAEe,OAAO;IAAK;AAC5C"}