@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/components/staff-org-ai-card.component.tsx"],"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'use client'\n\nimport { aiAddonName } from '@aglyn/aglyn'\nimport { buildRoute, Route } from '@aglyn/aglyn/app-utils/console-routes'\nimport { pluginDocsHelp } from '@aglyn/aglyn/app-utils/docs-help'\nimport { mdiOpenInNew } from '@aglyn/shared-data-mdi'\nimport { AppLink, CardDisplay } from '@aglyn/shared-ui-jsx'\nimport {\n ListRowActions,\n ListTable,\n listActionsColumn,\n} from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport { TABLE_ROW_HEIGHT } from '@aglyn/shared-ui-jsx/const/table-pagination'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport {\n Alert,\n Chip,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { useRouter } from 'next/navigation'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type {\n StaffOrgAiJob,\n StaffOrgAiJobs,\n StaffOrgAiMargin,\n StaffOrgAiOverage,\n StaffOrgAiPool,\n StaffOrgAiRefusals,\n StaffOrgAiResponse,\n StaffOrgAiTokens,\n StaffOrgAiUser,\n} from '../usage/staff-org-ai'\n\n/**\n * THE STAFF AI CARD (AGL-2930): everything about one org's AI usage on the\n * page staff already open to look at that org.\n *\n * Read through `/api/ai/admin/org`, one request on mount. Every figure on it\n * is the route's, and every figure the route serves is composed from the\n * same helpers the meter refuses with — see `usage/staff-org-ai.ts`. This\n * file only lays them out.\n *\n * ## What each section is for\n *\n * - **Add-on** — is the org paying for AI, at what, since when.\n * - **Credit pool** — the band as three NAMED parts, because \"why does\n * this org have 13,000 credits\" has three answers (the plan, an override,\n * the add-on) and a single total cannot say which.\n * - **Overage** — what is past the band, what it is sold at, and the two\n * controls the org itself holds over it.\n * - **Refusals** — how often, and why, the gate said no this month.\n * - **Jobs** and **Top users** — the generative and per-person halves,\n * each of which says plainly when its rollup has nothing yet.\n * - **Tokens** — what each kind of request costs per request, what it\n * sends and generates, and how much of its prompt the cache served.\n * - **Margin** — spend against what AI brings in, red when it is over.\n * - **Actions** — where the override editor and the AI pause live.\n */\n\nconst credits = (value: number | null | undefined): string =>\n value == null ? '—' : Math.round(value).toLocaleString()\n\n/**\n * Four decimals under a dollar, two above (the assist-signals page's rule):\n * a month that really cost eight cents must not read as `$0.00`.\n */\nconst usd = (value: number | null | undefined): string => {\n if (value == null) return '—'\n const amount = Number(value) || 0\n return `$${amount.toFixed(Math.abs(amount) < 1 ? 4 : 2)}`\n}\n\nconst when = (iso: string | null): string =>\n iso ? new Date(iso).toLocaleDateString() : '—'\n\n/** The pool as one sentence naming every part that is non-zero. */\nexport function poolPartsSentence(pool: StaffOrgAiPool): string {\n const parts: string[] = []\n if (pool.overrideCredits !== null) {\n parts.push(`${credits(pool.overrideCredits)} staff override`)\n } else {\n parts.push(`${credits(pool.planCredits)} plan band`)\n }\n if (pool.addonCredits > 0) {\n parts.push(`${credits(pool.addonCredits)} ${aiAddonName()} add-on`)\n }\n return parts.join(' + ')\n}\n\n/**\n * The overage's state as one line: sold, walled, or capped — or, for an\n * uncapped staff comp (AGL-3049), nothing to sell past at all.\n */\nexport function overageStateSentence(\n overage: StaffOrgAiOverage,\n uncapped = false,\n): string {\n if (uncapped) {\n return 'Nothing is sold past a band: an uncapped staff comp has none, and bills nothing.'\n }\n if (overage.hardCap) return 'Stopped at the band — the org’s band switch is on.'\n if (!overage.sellsOverage) return 'Not sold past the band on this plan.'\n const rate =\n overage.rateUsdPer1k === null ? '' : ` at ${usd(overage.rateUsdPer1k)} per 1,000`\n if (overage.capUsd !== null) {\n return overage.capReached\n ? `Stopped — the org’s ${usd(overage.capUsd)} overage ceiling is reached.`\n : `Sold${rate}, up to the org’s ${usd(overage.capUsd)} ceiling.`\n }\n return `Sold${rate}, no ceiling set.`\n}\n\n/** Whether the margin section renders red. */\nexport function marginTone(margin: StaffOrgAiMargin): 'error' | 'warning' | 'success' {\n if (margin.underwater) return 'error'\n if (margin.multiple >= 1) return 'warning'\n return 'success'\n}\n\nfunction RefusalsRow({ refusals }: { refusals: StaffOrgAiRefusals }) {\n const labels: Record<keyof Omit<StaffOrgAiRefusals, 'total'>, string> = {\n band: 'band',\n cap: 'ceiling',\n messages: 'messages',\n budget: 'operator backstop',\n // A hard allotment a manager set on a member, a collaborator or a site\n // (AGL-2942).\n allotment: 'allotments',\n // The Free taste's rungs (AGL-2925): only a Free workspace collects these.\n account: 'free account',\n requests: 'free requests/day',\n refusals: 'free refusals/day',\n platform: 'platform ceiling',\n }\n return (\n <Stack direction=\"row\" spacing={1} useFlexGap sx={{ flexWrap: 'wrap' }}>\n {(Object.keys(labels) as Array<keyof typeof labels>).map((reason) => {\n // A reason the answering server does not yet count reads as zero,\n // so a console newer than its route draws the row rather than\n // failing the card.\n const count = Number(refusals[reason] ?? 0)\n return (\n <Chip\n key={reason}\n size=\"small\"\n variant={count > 0 ? 'filled' : 'outlined'}\n color={count > 0 ? 'warning' : 'default'}\n label={`${labels[reason]} ${count.toLocaleString()}`}\n />\n )\n })}\n </Stack>\n )\n}\n\nfunction JobsSection({ jobs }: { jobs: StaffOrgAiJobs | null }) {\n if (jobs === null) {\n return (\n <Alert severity=\"warning\">\n {'Could not read the generation jobs — a failed read, not an idle org.'}\n </Alert>\n )\n }\n const total = Object.values(jobs.counts).reduce((sum, n) => sum + n, 0)\n if (total === 0) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No generation jobs yet.'}\n </Typography>\n )\n }\n return (\n <Stack spacing={1}>\n <Stack direction=\"row\" spacing={1} useFlexGap sx={{ flexWrap: 'wrap' }}>\n {(['queued', 'running', 'needs_input', 'needs_review', 'failed'] as const).map((status) => (\n <Chip\n key={status}\n size=\"small\"\n color={\n status === 'failed' && jobs.counts[status] > 0\n ? 'error'\n : (status === 'needs_input' || status === 'needs_review') &&\n jobs.counts[status] > 0\n ? 'warning'\n : 'default'\n }\n label={`${status.replace('_', ' ')} ${jobs.counts[status]}`}\n />\n ))}\n <Chip size=\"small\" variant=\"outlined\" label={`done ${jobs.counts.done}`} />\n </Stack>\n {jobs.truncated ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Counted from the newest jobs only — these counts are a floor.'}\n </Typography>\n ) : null}\n {/* A record list: the grid scrolls its own columns, so a job id and a\n starter's uid never push the card's content past its edge. */}\n <ListTable\n rows={jobs.recent}\n columns={JOB_COLUMNS}\n getRowId={(job: StaffOrgAiJob) => job.id}\n rowHeight={TABLE_ROW_HEIGHT}\n noRowsLabel=\"No recent jobs\"\n />\n </Stack>\n )\n}\n\n/**\n * The recent jobs, one column per fact. Who started a job is a column of\n * its own rather than a link tucked beside the date, so it sorts and filters\n * like the rest; the credits sort by what was SPENT, which is the figure the\n * pool was charged.\n */\nconst JOB_COLUMNS: GridColDef<StaffOrgAiJob>[] = [\n {\n field: 'id',\n headerName: 'Job',\n flex: 1,\n minWidth: 200,\n renderCell: ({ row }) => (\n <Typography variant=\"body2\" noWrap title={row.id} sx={{ fontFamily: 'monospace' }}>\n {row.id}\n </Typography>\n ),\n },\n {\n field: 'kind',\n headerName: 'Kind',\n width: 120,\n valueFormatter: (value: string) => value || '—',\n },\n {\n field: 'status',\n headerName: 'Status',\n width: 130,\n valueFormatter: (value: string) => String(value ?? '').replace('_', ' '),\n },\n {\n field: 'creditsSpent',\n headerName: 'Credits',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 140,\n valueFormatter: (value: number, row) =>\n `${credits(value)} / ${credits(row.creditsReserved)}`,\n },\n {\n field: 'createdAt',\n headerName: 'Started',\n width: 120,\n valueFormatter: (value: string | null) => when(value),\n },\n {\n field: 'createdBy',\n headerName: 'Started by',\n flex: 1,\n minWidth: 240,\n renderCell: ({ row }) =>\n row.createdBy ? (\n <AppLink\n href={buildRoute(Route.ADMIN_USER_DETAIL, { uid: row.createdBy })}\n variant=\"body2\"\n underline=\"hover\"\n noWrap\n sx={{ fontFamily: 'monospace' }}\n >\n {row.createdBy}\n </AppLink>\n ) : (\n '—'\n ),\n },\n]\n\nconst tokenCount = (value: number): string => Math.round(value).toLocaleString()\n\nconst rate = (value: number | null): string =>\n value == null ? '—' : `${Math.round(value * 100)}%`\n\n/** The month's tokens, and what each kind of request spends of them (AGL-2937). */\nfunction TokensSection({ tokens }: { tokens: StaffOrgAiTokens }) {\n const { total } = tokens\n return (\n <Stack spacing={1}>\n <Stack direction=\"row\" spacing={1} useFlexGap sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography variant=\"body2\">\n {`${tokenCount(total.input)} sent · ${tokenCount(total.cached)} read from cache · ${tokenCount(total.cacheWrite)} written to cache · ${tokenCount(total.output)} generated`}\n </Typography>\n <Chip\n size=\"small\"\n color={tokens.cacheHitRate != null && tokens.cacheHitRate >= 0.5 ? 'success' : 'default'}\n label={`cache hit rate ${rate(tokens.cacheHitRate)}`}\n />\n </Stack>\n {tokens.kinds.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No model requests recorded by kind this month.'}\n </Typography>\n ) : (\n <ScrollTable size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{'Kind'}</TableCell>\n <TableCell align=\"right\">{'Requests'}</TableCell>\n <TableCell align=\"right\">{'Per request'}</TableCell>\n <TableCell align=\"right\">{'Sent'}</TableCell>\n <TableCell align=\"right\">{'From cache'}</TableCell>\n <TableCell align=\"right\">{'Generated'}</TableCell>\n <TableCell align=\"right\">{'Cache hit'}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {tokens.kinds.map((row) => (\n <TableRow key={row.kind}>\n <TableCell>{row.kind}</TableCell>\n <TableCell align=\"right\">{row.requests.toLocaleString()}</TableCell>\n <TableCell align=\"right\">{usd(row.costPerRequestUsd)}</TableCell>\n <TableCell align=\"right\">{tokenCount(row.tokens.input)}</TableCell>\n <TableCell align=\"right\">{tokenCount(row.tokens.cached)}</TableCell>\n <TableCell align=\"right\">{tokenCount(row.tokens.output)}</TableCell>\n <TableCell align=\"right\">{rate(row.cacheHitRate)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </ScrollTable>\n )}\n </Stack>\n )\n}\n\n/**\n * The month's top spenders, one row per person. The row opens the account;\n * the uid rides beneath the roster's name because two people can share one.\n */\nfunction TopUsersSection({ users }: { users: StaffOrgAiUser[] }) {\n const router = useRouter()\n const columns = useMemo<GridColDef<StaffOrgAiUser>[]>(\n () => [\n {\n field: 'name',\n headerName: 'Person',\n flex: 1,\n minWidth: 220,\n renderCell: ({ row }) => (\n <Stack sx={{ minWidth: 0 }}>\n <Typography variant=\"body2\" noWrap title={row.name}>\n {row.name}\n </Typography>\n {row.name !== row.uid ? (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n noWrap\n sx={{ fontFamily: 'monospace' }}\n >\n {row.uid}\n </Typography>\n ) : null}\n </Stack>\n ),\n },\n {\n field: 'credits',\n headerName: 'Credits',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 110,\n valueFormatter: (value: number) => credits(value),\n },\n {\n field: 'share',\n headerName: 'Share',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 90,\n valueFormatter: (value: number) => `${Math.round(value * 100)}%`,\n },\n {\n field: 'estCostUsd',\n headerName: 'Provider $',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 120,\n valueFormatter: (value: number) => usd(value),\n },\n {\n field: 'requests',\n headerName: 'Requests',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 110,\n valueFormatter: (value: number) => value.toLocaleString(),\n },\n {\n field: 'refusals',\n headerName: 'Refusals',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 110,\n valueFormatter: (value: number) => value.toLocaleString(),\n },\n listActionsColumn((row: StaffOrgAiUser) => (\n <ListRowActions\n label={row.name}\n quick={{\n icon: mdiOpenInNew.path,\n label: 'View account',\n to: buildRoute(Route.ADMIN_USER_DETAIL, { uid: row.uid }),\n }}\n items={[]}\n />\n )),\n ],\n [],\n )\n return (\n <ListTable\n rows={users}\n columns={columns}\n getRowId={(row: StaffOrgAiUser) => row.uid}\n rowHeight={TABLE_ROW_HEIGHT}\n onOpen={(uid) => router.push(buildRoute(Route.ADMIN_USER_DETAIL, { uid }))}\n />\n )\n}\n\nconst StaffOrgAiCard = ({ orgId }: { orgId: string }) => {\n const { data: user } = useUser()\n // Keyed on who is signed in, not on the user object's identity.\n const signedInUid = user?.uid ?? null\n const userRef = useRef(user)\n userRef.current = user\n const [data, setData] = useState<StaffOrgAiResponse | null>(null)\n const [ready, setReady] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n // Mounted only for a confirmed staff reader — the `staffOrg` zone sits\n // inside the page's `StaffOnly`, which renders nothing while the claim\n // loads — because the route records an access row on every successful\n // open, and an open the page did not mean to make would be an access\n // nobody made.\n const user = userRef.current\n if (!orgId || !signedInUid || !user) return undefined\n let active = true\n setReady(false)\n setError(null)\n void (async () => {\n try {\n const response = await authorizedFetch(\n user,\n `/api/ai/admin/org?orgId=${encodeURIComponent(orgId)}`,\n )\n const payload = await response.json().catch(() => null)\n if (!active) return\n if (!response.ok) {\n setError(payload?.error ?? 'AI lookup failed')\n setData(null)\n } else {\n setData(payload as StaffOrgAiResponse)\n }\n } catch {\n if (active) {\n setError('AI lookup failed')\n setData(null)\n }\n } finally {\n if (active) setReady(true)\n }\n })()\n return () => {\n active = false\n }\n }, [orgId, signedInUid])\n\n const name = aiAddonName()\n return (\n <CardDisplay\n header={name}\n help={pluginDocsHelp('aiMonitoring', {\n anchor: '#the-ai-card',\n excerpt:\n 'The add-on, the credit pool and its parts, this month’s overage and refusals, generation jobs, tokens and the cache hit rate by kind, the people spending the most, and the margin — for this organization.',\n })}\n contentGutterX\n contentGutterY\n >\n {!ready ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Loading…'}\n </Typography>\n ) : error || !data ? (\n <Alert severity=\"warning\">\n {`Could not read this organization’s AI usage — ${error ?? 'a failed read'}, not zero usage.`}\n </Alert>\n ) : (\n <Stack spacing={2}>\n {/* Add-on */}\n <Stack spacing={0.5}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n {'Add-on'}\n </Typography>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Chip\n size=\"small\"\n color={data.addon.on ? 'primary' : 'default'}\n label={data.addon.on ? `${name} on` : `${name} off`}\n />\n {data.addon.priceUsd !== null ? (\n <Typography variant=\"body2\">\n {`${usd(data.addon.priceUsd)}/mo on this plan`}\n </Typography>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Not sold on this plan'}\n </Typography>\n )}\n {data.addon.on ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {data.addon.since\n ? `since ${when(data.addon.since)}`\n : data.addon.sinceSource === 'unavailable'\n ? 'since — (Stripe not reachable)'\n : 'since — (no subscription item)'}\n </Typography>\n ) : null}\n </Stack>\n </Stack>\n\n {/* Credit pool */}\n <Stack spacing={0.5}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n {`Credit pool · ${data.month}`}\n </Typography>\n {data.pool.totalCredits === null && data.pool.uncapped ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Uncapped staff comp — no AI credit band. Bounded only by the message cap and an operator’s explicit spend ceiling.'}\n </Typography>\n ) : data.pool.totalCredits === null ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No AI credit band on this plan — bounded by the message cap and the operator backstop.'}\n </Typography>\n ) : (\n <Typography variant=\"body2\">\n {`${credits(data.pool.totalCredits)} credits = ${poolPartsSentence(data.pool)}`}\n </Typography>\n )}\n <Typography variant=\"body2\">\n {`Used ${credits(data.pool.usedCredits)} credits (${usd(data.pool.providerUsd)} provider spend)`}\n {data.pool.remainingCredits !== null\n ? ` · ${credits(data.pool.remainingCredits)} remaining`\n : ''}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`Projected month-end at this pace: ${credits(data.pool.projectedCredits)} credits (${usd(data.pool.projectedUsd)}) · ${data.pool.messages.toLocaleString()} model turns, ${data.pool.deflected.toLocaleString()} answered from the docs`}\n </Typography>\n </Stack>\n\n {/* Overage */}\n <Stack spacing={0.5}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n {'Overage'}\n </Typography>\n <Typography variant=\"body2\">\n {`${credits(data.overage.overageCredits)} credits over the band · ${usd(data.overage.accruedUsd)} accrued`}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {overageStateSentence(data.overage, data.pool.uncapped === true)}\n </Typography>\n </Stack>\n\n {/* Refusals */}\n <Stack spacing={0.5}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n {`Refusals this month · ${data.refusals.total.toLocaleString()}`}\n </Typography>\n <RefusalsRow refusals={data.refusals} />\n </Stack>\n\n {/* Jobs */}\n <Stack spacing={0.5}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n {'Generation jobs'}\n </Typography>\n <JobsSection jobs={data.jobs} />\n </Stack>\n\n {/* Tokens — absent from a route older than the card */}\n {data.tokens ? (\n <Stack spacing={0.5}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n {`Tokens · ${data.month}`}\n </Typography>\n <TokensSection tokens={data.tokens} />\n </Stack>\n ) : null}\n\n {/* Top users */}\n <Stack spacing={0.5}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n {'Top users this month'}\n </Typography>\n {data.users.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No AI usage attributed to a person this month.'}\n </Typography>\n ) : (\n <TopUsersSection users={data.users} />\n )}\n </Stack>\n\n {/* Margin */}\n <Stack spacing={0.5}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n {'Margin'}\n </Typography>\n <Alert severity={marginTone(data.margin)}>\n {`Spend ${usd(data.margin.spendUsd)} against ${usd(data.margin.revenueUsd)} in — ` +\n `${usd(data.margin.addonRevenueUsd)} add-on, ${usd(data.margin.planAssistShareUsd)} plan assist share, ` +\n `${usd(data.margin.overageRevenueUsd)} overage.`}\n {data.margin.underwater\n ? ' Spend exceeds the add-on plus the plan’s assist share.'\n : ''}\n {data.margin.multiple >= 1\n ? ` ${data.margin.multiple}× the ${usd(data.margin.thresholdUsd)} staff review threshold.`\n : ''}\n </Alert>\n {data.margin.contribution.marginPct !== null ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`Whole-org contribution margin ${Math.round(data.margin.contribution.marginPct * 100)}% on the ${data.margin.contribution.month} rollup with this month’s AI spend.`}\n </Typography>\n ) : null}\n </Stack>\n\n {/* Actions */}\n <Stack spacing={0.5}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n {'Actions'}\n </Typography>\n <Typography variant=\"body2\">\n {'Credit override and feature toggles: '}\n <AppLink href={buildRoute(Route.ADMIN_ORGS)} underline=\"hover\">\n {'the entitlement override editor'}\n </AppLink>\n {' (also under Staff actions above). Pause AI for this org: '}\n <AppLink href={buildRoute(Route.ADMIN_LOCKDOWN)} underline=\"hover\">\n {'Lockdown'}\n </AppLink>\n {', feature keys ai-assist and ai-generate scoped to the org.'}\n </Typography>\n </Stack>\n </Stack>\n )}\n </CardDisplay>\n )\n}\nStaffOrgAiCard.displayName = 'StaffOrgAiCard'\n\nexport default StaffOrgAiCard\n"],"names":["aiAddonName","buildRoute","Route","pluginDocsHelp","mdiOpenInNew","AppLink","CardDisplay","ListRowActions","ListTable","listActionsColumn","ScrollTable","TABLE_ROW_HEIGHT","useUser","authorizedFetch","Alert","Chip","Stack","TableBody","TableCell","TableHead","TableRow","Typography","useRouter","useEffect","useMemo","useRef","useState","credits","value","Math","round","toLocaleString","usd","amount","Number","toFixed","abs","when","iso","Date","toLocaleDateString","poolPartsSentence","pool","parts","overrideCredits","push","planCredits","addonCredits","join","overageStateSentence","overage","uncapped","hardCap","sellsOverage","rate","rateUsdPer1k","capUsd","capReached","marginTone","margin","underwater","multiple","RefusalsRow","refusals","labels","band","cap","messages","budget","allotment","account","requests","platform","direction","spacing","useFlexGap","sx","flexWrap","Object","keys","map","reason","count","size","variant","color","label","JobsSection","jobs","severity","total","values","counts","reduce","sum","n","status","replace","done","truncated","rows","recent","columns","JOB_COLUMNS","getRowId","job","id","rowHeight","noRowsLabel","field","headerName","flex","minWidth","renderCell","row","noWrap","title","fontFamily","width","valueFormatter","String","type","align","headerAlign","creditsReserved","createdBy","href","ADMIN_USER_DETAIL","uid","underline","tokenCount","TokensSection","tokens","alignItems","input","cached","cacheWrite","output","cacheHitRate","kinds","length","kind","costPerRequestUsd","TopUsersSection","users","router","name","quick","icon","path","to","items","onOpen","StaffOrgAiCard","orgId","data","user","signedInUid","userRef","current","setData","ready","setReady","error","setError","undefined","active","response","encodeURIComponent","payload","json","catch","ok","header","help","anchor","excerpt","contentGutterX","contentGutterY","addon","on","priceUsd","since","sinceSource","month","totalCredits","usedCredits","providerUsd","remainingCredits","projectedCredits","projectedUsd","deflected","overageCredits","accruedUsd","spendUsd","revenueUsd","addonRevenueUsd","planAssistShareUsd","overageRevenueUsd","thresholdUsd","contribution","marginPct","ADMIN_ORGS","ADMIN_LOCKDOWN","displayName"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { AglynOrgBilling } from '@aglyn/aglyn';
2
+ import { type StaffOrgUsageAiMonth } from '../usage/staff-org-usage-ai';
3
+ /**
4
+ * THE STAFF ORG USAGE TABLE'S AI COLUMNS (AGL-2984): Assist spend, AI
5
+ * credits used and AI overage billed, one cell per monthly rollup through
6
+ * the `staffOrgUsageColumn` zone, and the credit pool line the org page
7
+ * draws above the table. Each cell reads only the month row the table hands
8
+ * it.
9
+ */
10
+ export declare function StaffOrgUsageAssistCell(props: {
11
+ month?: StaffOrgUsageAiMonth;
12
+ }): import("react").JSX.Element;
13
+ export declare namespace StaffOrgUsageAssistCell {
14
+ var displayName: string;
15
+ }
16
+ /** The credits the month drew, or a dash for a rollup older than the meter. */
17
+ export declare function StaffOrgUsageAiCreditsCell(props: {
18
+ month?: StaffOrgUsageAiMonth;
19
+ }): import("react").JSX.Element;
20
+ export declare namespace StaffOrgUsageAiCreditsCell {
21
+ var displayName: string;
22
+ }
23
+ /** The overage the month billed, or a dash for a rollup older than the meter. */
24
+ export declare function StaffOrgUsageAiOverageCell(props: {
25
+ month?: StaffOrgUsageAiMonth;
26
+ }): import("react").JSX.Element;
27
+ export declare namespace StaffOrgUsageAiOverageCell {
28
+ var displayName: string;
29
+ }
30
+ /**
31
+ * The org's AI credit pool as one line above the table, so whoever reads the
32
+ * Assist column knows what band its dollars are drawn against. Drawn only
33
+ * where the surface holds the org document: without one, a line claiming
34
+ * "add-on off" would be a claim nobody checked.
35
+ */
36
+ export declare function StaffOrgUsageAiPool(props: {
37
+ org?: Partial<AglynOrgBilling> | null;
38
+ }): import("react").JSX.Element;
39
+ export declare namespace StaffOrgUsageAiPool {
40
+ var displayName: string;
41
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
18
+ import { Typography } from "@mui/material";
19
+ import { aiCreditsCell, aiOverageCell, assistCostCell, assistPoolSentence, staffAssistPool } from "../usage/staff-org-usage-ai.js";
20
+ /**
21
+ * THE STAFF ORG USAGE TABLE'S AI COLUMNS (AGL-2984): Assist spend, AI
22
+ * credits used and AI overage billed, one cell per monthly rollup through
23
+ * the `staffOrgUsageColumn` zone, and the credit pool line the org page
24
+ * draws above the table. Each cell reads only the month row the table hands
25
+ * it.
26
+ */ export function StaffOrgUsageAssistCell(props) {
27
+ return /*#__PURE__*/ _jsx(_Fragment, {
28
+ children: props.month ? assistCostCell(props.month.assistCostUsd) : '—'
29
+ });
30
+ }
31
+ StaffOrgUsageAssistCell.displayName = 'StaffOrgUsageAssistCell';
32
+ /** The credits the month drew, or a dash for a rollup older than the meter. */ export function StaffOrgUsageAiCreditsCell(props) {
33
+ var _props_month;
34
+ return /*#__PURE__*/ _jsx(_Fragment, {
35
+ children: aiCreditsCell((_props_month = props.month) == null ? void 0 : _props_month.assistCredits)
36
+ });
37
+ }
38
+ StaffOrgUsageAiCreditsCell.displayName = 'StaffOrgUsageAiCreditsCell';
39
+ /** The overage the month billed, or a dash for a rollup older than the meter. */ export function StaffOrgUsageAiOverageCell(props) {
40
+ var _props_month;
41
+ return /*#__PURE__*/ _jsx(_Fragment, {
42
+ children: aiOverageCell((_props_month = props.month) == null ? void 0 : _props_month.assistOverageUsd)
43
+ });
44
+ }
45
+ StaffOrgUsageAiOverageCell.displayName = 'StaffOrgUsageAiOverageCell';
46
+ /**
47
+ * The org's AI credit pool as one line above the table, so whoever reads the
48
+ * Assist column knows what band its dollars are drawn against. Drawn only
49
+ * where the surface holds the org document: without one, a line claiming
50
+ * "add-on off" would be a claim nobody checked.
51
+ */ export function StaffOrgUsageAiPool(props) {
52
+ if (!props.org) return null;
53
+ return /*#__PURE__*/ _jsx(Typography, {
54
+ variant: "caption",
55
+ color: "text.secondary",
56
+ component: "div",
57
+ sx: {
58
+ mb: 1
59
+ },
60
+ children: assistPoolSentence(staffAssistPool(props.org))
61
+ });
62
+ }
63
+ StaffOrgUsageAiPool.displayName = 'StaffOrgUsageAiPool';
64
+
65
+ //# sourceMappingURL=staff-org-usage-ai-columns.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/staff-org-usage-ai-columns.component.tsx"],"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'use client'\n\nimport type { AglynOrgBilling } from '@aglyn/aglyn'\nimport { Typography } from '@mui/material'\nimport {\n aiCreditsCell,\n aiOverageCell,\n assistCostCell,\n assistPoolSentence,\n staffAssistPool,\n type StaffOrgUsageAiMonth,\n} from '../usage/staff-org-usage-ai'\n\n/**\n * THE STAFF ORG USAGE TABLE'S AI COLUMNS (AGL-2984): Assist spend, AI\n * credits used and AI overage billed, one cell per monthly rollup through\n * the `staffOrgUsageColumn` zone, and the credit pool line the org page\n * draws above the table. Each cell reads only the month row the table hands\n * it.\n */\nexport function StaffOrgUsageAssistCell(props: {\n month?: StaffOrgUsageAiMonth\n}) {\n return <>{props.month ? assistCostCell(props.month.assistCostUsd) : '—'}</>\n}\nStaffOrgUsageAssistCell.displayName = 'StaffOrgUsageAssistCell'\n\n/** The credits the month drew, or a dash for a rollup older than the meter. */\nexport function StaffOrgUsageAiCreditsCell(props: {\n month?: StaffOrgUsageAiMonth\n}) {\n return <>{aiCreditsCell(props.month?.assistCredits)}</>\n}\nStaffOrgUsageAiCreditsCell.displayName = 'StaffOrgUsageAiCreditsCell'\n\n/** The overage the month billed, or a dash for a rollup older than the meter. */\nexport function StaffOrgUsageAiOverageCell(props: {\n month?: StaffOrgUsageAiMonth\n}) {\n return <>{aiOverageCell(props.month?.assistOverageUsd)}</>\n}\nStaffOrgUsageAiOverageCell.displayName = 'StaffOrgUsageAiOverageCell'\n\n/**\n * The org's AI credit pool as one line above the table, so whoever reads the\n * Assist column knows what band its dollars are drawn against. Drawn only\n * where the surface holds the org document: without one, a line claiming\n * \"add-on off\" would be a claim nobody checked.\n */\nexport function StaffOrgUsageAiPool(props: {\n org?: Partial<AglynOrgBilling> | null\n}) {\n if (!props.org) return null\n return (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n component=\"div\"\n sx={{ mb: 1 }}\n >\n {assistPoolSentence(staffAssistPool(props.org))}\n </Typography>\n )\n}\nStaffOrgUsageAiPool.displayName = 'StaffOrgUsageAiPool'\n"],"names":["Typography","aiCreditsCell","aiOverageCell","assistCostCell","assistPoolSentence","staffAssistPool","StaffOrgUsageAssistCell","props","month","assistCostUsd","displayName","StaffOrgUsageAiCreditsCell","assistCredits","StaffOrgUsageAiOverageCell","assistOverageUsd","StaffOrgUsageAiPool","org","variant","color","component","sx","mb"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;AAGA,SAASA,UAAU,QAAQ,gBAAe;AAC1C,SACEC,aAAa,EACbC,aAAa,EACbC,cAAc,EACdC,kBAAkB,EAClBC,eAAe,QAEV,iCAA6B;AAEpC;;;;;;CAMC,GACD,OAAO,SAASC,wBAAwBC,KAEvC;IACC,qBAAO;kBAAGA,MAAMC,KAAK,GAAGL,eAAeI,MAAMC,KAAK,CAACC,aAAa,IAAI;;AACtE;AACAH,wBAAwBI,WAAW,GAAG;AAEtC,6EAA6E,GAC7E,OAAO,SAASC,2BAA2BJ,KAE1C;QACyBA;IAAxB,qBAAO;kBAAGN,eAAcM,eAAAA,MAAMC,KAAK,qBAAXD,aAAaK,aAAa;;AACpD;AACAD,2BAA2BD,WAAW,GAAG;AAEzC,+EAA+E,GAC/E,OAAO,SAASG,2BAA2BN,KAE1C;QACyBA;IAAxB,qBAAO;kBAAGL,eAAcK,eAAAA,MAAMC,KAAK,qBAAXD,aAAaO,gBAAgB;;AACvD;AACAD,2BAA2BH,WAAW,GAAG;AAEzC;;;;;CAKC,GACD,OAAO,SAASK,oBAAoBR,KAEnC;IACC,IAAI,CAACA,MAAMS,GAAG,EAAE,OAAO;IACvB,qBACE,KAAChB;QACCiB,SAAQ;QACRC,OAAM;QACNC,WAAU;QACVC,IAAI;YAAEC,IAAI;QAAE;kBAEXjB,mBAAmBC,gBAAgBE,MAAMS,GAAG;;AAGnD;AACAD,oBAAoBL,WAAW,GAAG"}
@@ -0,0 +1,28 @@
1
+ import type { ConsoleWidgetColumnHeaderProps } from '@aglyn/aglyn';
2
+ /**
3
+ * THE STAFF ORGANIZATIONS LIST'S AI SPEND COLUMN (AGL-2984): each org's live
4
+ * provider spend this month, through the `staffOrgsListColumn` zone. The
5
+ * header and every cell on the page share one read of the page's orgs.
6
+ *
7
+ * The header sorts the page by the figures: dearest first, then cheapest
8
+ * first, then back to the list's own order. An unmeasured org sorts last in
9
+ * both directions — the column is for finding the org that is spending.
10
+ */
11
+ export declare function StaffOrgsAiSpendHeader(props: {
12
+ orgIds?: readonly string[];
13
+ } & Partial<ConsoleWidgetColumnHeaderProps>): import("react").JSX.Element;
14
+ export declare namespace StaffOrgsAiSpendHeader {
15
+ var displayName: string;
16
+ }
17
+ /**
18
+ * One org's spend this month: `$` and four decimals, or a dash for an org
19
+ * with nothing recorded — and a dash, not a figure, until the page's read
20
+ * has answered.
21
+ */
22
+ export declare function StaffOrgsAiSpendCell(props: {
23
+ orgId?: string;
24
+ orgIds?: readonly string[];
25
+ }): import("react").JSX.Element;
26
+ export declare namespace StaffOrgsAiSpendCell {
27
+ var displayName: string;
28
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { jsx as _jsx } from "react/jsx-runtime";
18
+ import { TableSortLabel, Tooltip, Typography } from "@mui/material";
19
+ import { useEffect, useMemo, useRef, useState } from "react";
20
+ import { aiUsageMonthLabel } from "../usage/ai-usage-wire.js";
21
+ import { aiSpendCell, aiSpendRowComparator } from "../usage/staff-orgs-ai-spend.js";
22
+ import { useStaffOrgsAiSpend } from "./use-staff-orgs-ai-spend.js";
23
+ /**
24
+ * THE STAFF ORGANIZATIONS LIST'S AI SPEND COLUMN (AGL-2984): each org's live
25
+ * provider spend this month, through the `staffOrgsListColumn` zone. The
26
+ * header and every cell on the page share one read of the page's orgs.
27
+ *
28
+ * The header sorts the page by the figures: dearest first, then cheapest
29
+ * first, then back to the list's own order. An unmeasured org sorts last in
30
+ * both directions — the column is for finding the org that is spending.
31
+ */ export function StaffOrgsAiSpendHeader(props) {
32
+ const { orgIds, onSort, sorted } = props;
33
+ const spend = useStaffOrgsAiSpend(orgIds);
34
+ const [direction, setDirection] = useState(null);
35
+ const onSortRef = useRef(onSort);
36
+ onSortRef.current = onSort;
37
+ const compare = useMemo(()=>direction && spend.status === 'ready' ? aiSpendRowComparator(spend.spendUsd, direction) : null, [
38
+ direction,
39
+ spend.status,
40
+ spend.spendUsd
41
+ ]);
42
+ const compareRef = useRef(compare);
43
+ compareRef.current = compare;
44
+ // Keyed on the comparator, which changes only with the direction or the
45
+ // page's answer, so handing it over cannot re-run on every render.
46
+ useEffect(()=>{
47
+ onSortRef.current == null ? void 0 : onSortRef.current.call(onSortRef, compare);
48
+ }, [
49
+ compare
50
+ ]);
51
+ // Another column taking the sort puts this one back to unsorted; a
52
+ // comparator withdrawn while the page re-reads keeps its direction.
53
+ useEffect(()=>{
54
+ if (sorted === false && compareRef.current) setDirection(null);
55
+ }, [
56
+ sorted
57
+ ]);
58
+ return /*#__PURE__*/ _jsx(Tooltip, {
59
+ title: `Live AI provider spend in ${spend.month ? aiUsageMonthLabel(spend.month) : 'the current month'}. Organizations with nothing recorded this month sort last.`,
60
+ children: /*#__PURE__*/ _jsx(TableSortLabel, {
61
+ active: direction !== null,
62
+ direction: direction != null ? direction : 'desc',
63
+ disabled: spend.status !== 'ready',
64
+ onClick: ()=>setDirection((current)=>current === 'desc' ? 'asc' : current === 'asc' ? null : 'desc'),
65
+ children: 'AI spend (month)'
66
+ })
67
+ });
68
+ }
69
+ StaffOrgsAiSpendHeader.displayName = 'StaffOrgsAiSpendHeader';
70
+ /**
71
+ * One org's spend this month: `$` and four decimals, or a dash for an org
72
+ * with nothing recorded — and a dash, not a figure, until the page's read
73
+ * has answered.
74
+ */ export function StaffOrgsAiSpendCell(props) {
75
+ const { orgId, orgIds } = props;
76
+ const spend = useStaffOrgsAiSpend(orgIds != null ? orgIds : orgId ? [
77
+ orgId
78
+ ] : null);
79
+ return /*#__PURE__*/ _jsx(Typography, {
80
+ variant: "body2",
81
+ sx: {
82
+ fontFamily: 'monospace'
83
+ },
84
+ children: spend.status === 'ready' && orgId ? aiSpendCell(spend.spendUsd[orgId]) : '—'
85
+ });
86
+ }
87
+ StaffOrgsAiSpendCell.displayName = 'StaffOrgsAiSpendCell';
88
+
89
+ //# sourceMappingURL=staff-orgs-ai-spend-column.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/staff-orgs-ai-spend-column.component.tsx"],"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'use client'\n\nimport type { ConsoleWidgetColumnHeaderProps } from '@aglyn/aglyn'\nimport { TableSortLabel, Tooltip, Typography } from '@mui/material'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { aiUsageMonthLabel } from '../usage/ai-usage-wire'\nimport {\n aiSpendCell,\n aiSpendRowComparator,\n} from '../usage/staff-orgs-ai-spend'\nimport { useStaffOrgsAiSpend } from './use-staff-orgs-ai-spend'\n\n/**\n * THE STAFF ORGANIZATIONS LIST'S AI SPEND COLUMN (AGL-2984): each org's live\n * provider spend this month, through the `staffOrgsListColumn` zone. The\n * header and every cell on the page share one read of the page's orgs.\n *\n * The header sorts the page by the figures: dearest first, then cheapest\n * first, then back to the list's own order. An unmeasured org sorts last in\n * both directions — the column is for finding the org that is spending.\n */\nexport function StaffOrgsAiSpendHeader(\n props: { orgIds?: readonly string[] } & Partial<ConsoleWidgetColumnHeaderProps>,\n) {\n const { orgIds, onSort, sorted } = props\n const spend = useStaffOrgsAiSpend(orgIds)\n const [direction, setDirection] = useState<'desc' | 'asc' | null>(null)\n const onSortRef = useRef(onSort)\n onSortRef.current = onSort\n const compare = useMemo(\n () =>\n direction && spend.status === 'ready'\n ? aiSpendRowComparator(spend.spendUsd, direction)\n : null,\n [direction, spend.status, spend.spendUsd],\n )\n const compareRef = useRef(compare)\n compareRef.current = compare\n // Keyed on the comparator, which changes only with the direction or the\n // page's answer, so handing it over cannot re-run on every render.\n useEffect(() => {\n onSortRef.current?.(compare as never)\n }, [compare])\n // Another column taking the sort puts this one back to unsorted; a\n // comparator withdrawn while the page re-reads keeps its direction.\n useEffect(() => {\n if (sorted === false && compareRef.current) setDirection(null)\n }, [sorted])\n return (\n <Tooltip\n title={`Live AI provider spend in ${\n spend.month ? aiUsageMonthLabel(spend.month) : 'the current month'\n }. Organizations with nothing recorded this month sort last.`}\n >\n <TableSortLabel\n active={direction !== null}\n direction={direction ?? 'desc'}\n disabled={spend.status !== 'ready'}\n onClick={() =>\n setDirection((current) =>\n current === 'desc' ? 'asc' : current === 'asc' ? null : 'desc',\n )\n }\n >\n {'AI spend (month)'}\n </TableSortLabel>\n </Tooltip>\n )\n}\nStaffOrgsAiSpendHeader.displayName = 'StaffOrgsAiSpendHeader'\n\n/**\n * One org's spend this month: `$` and four decimals, or a dash for an org\n * with nothing recorded — and a dash, not a figure, until the page's read\n * has answered.\n */\nexport function StaffOrgsAiSpendCell(props: {\n orgId?: string\n orgIds?: readonly string[]\n}) {\n const { orgId, orgIds } = props\n const spend = useStaffOrgsAiSpend(orgIds ?? (orgId ? [orgId] : null))\n return (\n <Typography variant=\"body2\" sx={{ fontFamily: 'monospace' }}>\n {spend.status === 'ready' && orgId\n ? aiSpendCell(spend.spendUsd[orgId])\n : '—'}\n </Typography>\n )\n}\nStaffOrgsAiSpendCell.displayName = 'StaffOrgsAiSpendCell'\n"],"names":["TableSortLabel","Tooltip","Typography","useEffect","useMemo","useRef","useState","aiUsageMonthLabel","aiSpendCell","aiSpendRowComparator","useStaffOrgsAiSpend","StaffOrgsAiSpendHeader","props","orgIds","onSort","sorted","spend","direction","setDirection","onSortRef","current","compare","status","spendUsd","compareRef","title","month","active","disabled","onClick","displayName","StaffOrgsAiSpendCell","orgId","variant","sx","fontFamily"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;AAGA,SAASA,cAAc,EAAEC,OAAO,EAAEC,UAAU,QAAQ,gBAAe;AACnE,SAASC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAC5D,SAASC,iBAAiB,QAAQ,4BAAwB;AAC1D,SACEC,WAAW,EACXC,oBAAoB,QACf,kCAA8B;AACrC,SAASC,mBAAmB,QAAQ,+BAA2B;AAE/D;;;;;;;;CAQC,GACD,OAAO,SAASC,uBACdC,KAA+E;IAE/E,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGH;IACnC,MAAMI,QAAQN,oBAAoBG;IAClC,MAAM,CAACI,WAAWC,aAAa,GAAGZ,SAAgC;IAClE,MAAMa,YAAYd,OAAOS;IACzBK,UAAUC,OAAO,GAAGN;IACpB,MAAMO,UAAUjB,QACd,IACEa,aAAaD,MAAMM,MAAM,KAAK,UAC1Bb,qBAAqBO,MAAMO,QAAQ,EAAEN,aACrC,MACN;QAACA;QAAWD,MAAMM,MAAM;QAAEN,MAAMO,QAAQ;KAAC;IAE3C,MAAMC,aAAanB,OAAOgB;IAC1BG,WAAWJ,OAAO,GAAGC;IACrB,wEAAwE;IACxE,mEAAmE;IACnElB,UAAU;QACRgB,UAAUC,OAAO,oBAAjBD,UAAUC,OAAO,MAAjBD,WAAoBE;IACtB,GAAG;QAACA;KAAQ;IACZ,mEAAmE;IACnE,oEAAoE;IACpElB,UAAU;QACR,IAAIY,WAAW,SAASS,WAAWJ,OAAO,EAAEF,aAAa;IAC3D,GAAG;QAACH;KAAO;IACX,qBACE,KAACd;QACCwB,OAAO,CAAC,0BAA0B,EAChCT,MAAMU,KAAK,GAAGnB,kBAAkBS,MAAMU,KAAK,IAAI,oBAChD,2DAA2D,CAAC;kBAE7D,cAAA,KAAC1B;YACC2B,QAAQV,cAAc;YACtBA,SAAS,EAAEA,oBAAAA,YAAa;YACxBW,UAAUZ,MAAMM,MAAM,KAAK;YAC3BO,SAAS,IACPX,aAAa,CAACE,UACZA,YAAY,SAAS,QAAQA,YAAY,QAAQ,OAAO;sBAI3D;;;AAIT;AACAT,uBAAuBmB,WAAW,GAAG;AAErC;;;;CAIC,GACD,OAAO,SAASC,qBAAqBnB,KAGpC;IACC,MAAM,EAAEoB,KAAK,EAAEnB,MAAM,EAAE,GAAGD;IAC1B,MAAMI,QAAQN,oBAAoBG,iBAAAA,SAAWmB,QAAQ;QAACA;KAAM,GAAG;IAC/D,qBACE,KAAC9B;QAAW+B,SAAQ;QAAQC,IAAI;YAAEC,YAAY;QAAY;kBACvDnB,MAAMM,MAAM,KAAK,WAAWU,QACzBxB,YAAYQ,MAAMO,QAAQ,CAACS,MAAM,IACjC;;AAGV;AACAD,qBAAqBD,WAAW,GAAG"}
@@ -0,0 +1,27 @@
1
+ /** One row, as `/api/ai/admin/user` answers it. */
2
+ export interface StaffUserAiUsageRow {
3
+ orgId: string;
4
+ orgName: string | null;
5
+ slug: string | null;
6
+ month: string;
7
+ credits: number;
8
+ requests: number;
9
+ refusals: number;
10
+ }
11
+ /**
12
+ * ONE ACCOUNT'S AI USAGE ACROSS ORGANIZATIONS (AGL-2928), on the staff user
13
+ * page: workspace, month, credits — every month kept, newest first.
14
+ *
15
+ * Read on mount, and it mounts only for a confirmed staff reader: the
16
+ * `staffUser` zone sits inside the page's `StaffOnly`, which renders nothing
17
+ * while the claim is still loading. The route records an access row about
18
+ * this person on every open, so an open the page did not mean to make would
19
+ * be an access nobody made.
20
+ */
21
+ declare const StaffUserAiUsageCard: {
22
+ ({ uid }: {
23
+ uid: string;
24
+ }): import("react").JSX.Element;
25
+ displayName: string;
26
+ };
27
+ export default StaffUserAiUsageCard;
@@ -0,0 +1,183 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { jsx as _jsx } from "react/jsx-runtime";
18
+ import { aiAddonName } from "@aglyn/aglyn";
19
+ import { buildRoute, Route } from "@aglyn/aglyn/app-utils/console-routes";
20
+ import { pluginDocsHelp } from "@aglyn/aglyn/app-utils/docs-help";
21
+ import { mdiOpenInNew } from "@aglyn/shared-data-mdi";
22
+ import { CardDisplay } from "@aglyn/shared-ui-jsx";
23
+ import { ListRowActions, ListTable, listActionsColumn } from "@aglyn/shared-ui-jsx/components/list-table.component";
24
+ import { TABLE_ROW_HEIGHT } from "@aglyn/shared-ui-jsx/const/table-pagination";
25
+ import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
26
+ import { useUser } from "@aglyn/tenant-feature-instance";
27
+ import { Alert, Typography } from "@mui/material";
28
+ import { useRouter } from "next/navigation";
29
+ import { useEffect, useRef, useState } from "react";
30
+ import { aiUsageMonthLabel } from "../usage/ai-usage-wire.js";
31
+ const orgHref = (orgId)=>buildRoute(Route.ADMIN_ORG_DETAIL, {
32
+ orgId
33
+ });
34
+ /** A row's id: one workspace's one month. */ const rowId = (row)=>`${row.orgId}:${row.month}`;
35
+ /**
36
+ * One row per workspace per month kept. The row opens the workspace; the
37
+ * month sorts by its key, which orders chronologically.
38
+ */ const COLUMNS = [
39
+ {
40
+ field: 'orgName',
41
+ headerName: 'Organization',
42
+ flex: 1,
43
+ minWidth: 200,
44
+ valueGetter: (_value, row)=>{
45
+ var _row_orgName;
46
+ return (_row_orgName = row.orgName) != null ? _row_orgName : row.orgId;
47
+ }
48
+ },
49
+ {
50
+ field: 'month',
51
+ headerName: 'Month',
52
+ width: 140,
53
+ valueFormatter: (value)=>aiUsageMonthLabel(value)
54
+ },
55
+ {
56
+ field: 'credits',
57
+ headerName: 'Credits',
58
+ type: 'number',
59
+ align: 'right',
60
+ headerAlign: 'right',
61
+ width: 110,
62
+ valueFormatter: (value)=>value.toLocaleString()
63
+ },
64
+ {
65
+ field: 'requests',
66
+ headerName: 'Requests',
67
+ type: 'number',
68
+ align: 'right',
69
+ headerAlign: 'right',
70
+ width: 110,
71
+ valueFormatter: (value)=>value.toLocaleString()
72
+ },
73
+ {
74
+ field: 'refusals',
75
+ headerName: 'Refusals',
76
+ type: 'number',
77
+ align: 'right',
78
+ headerAlign: 'right',
79
+ width: 110,
80
+ valueFormatter: (value)=>value.toLocaleString()
81
+ },
82
+ listActionsColumn((row)=>{
83
+ var _row_orgName;
84
+ return /*#__PURE__*/ _jsx(ListRowActions, {
85
+ label: (_row_orgName = row.orgName) != null ? _row_orgName : row.orgId,
86
+ quick: {
87
+ icon: mdiOpenInNew.path,
88
+ label: 'View organization',
89
+ to: orgHref(row.orgId)
90
+ },
91
+ items: []
92
+ });
93
+ })
94
+ ];
95
+ /**
96
+ * ONE ACCOUNT'S AI USAGE ACROSS ORGANIZATIONS (AGL-2928), on the staff user
97
+ * page: workspace, month, credits — every month kept, newest first.
98
+ *
99
+ * Read on mount, and it mounts only for a confirmed staff reader: the
100
+ * `staffUser` zone sits inside the page's `StaffOnly`, which renders nothing
101
+ * while the claim is still loading. The route records an access row about
102
+ * this person on every open, so an open the page did not mean to make would
103
+ * be an access nobody made.
104
+ */ const StaffUserAiUsageCard = ({ uid })=>{
105
+ var _ref;
106
+ const { data: user } = useUser();
107
+ // Keyed on who is signed in, not on the user object's identity (AGL-2928).
108
+ const signedInUid = (_ref = user == null ? void 0 : user.uid) != null ? _ref : null;
109
+ const userRef = useRef(user);
110
+ userRef.current = user;
111
+ const [rows, setRows] = useState(null);
112
+ const [error, setError] = useState(null);
113
+ const [ready, setReady] = useState(false);
114
+ const router = useRouter();
115
+ useEffect(()=>{
116
+ const user = userRef.current;
117
+ if (!uid || !signedInUid || !user) return undefined;
118
+ let active = true;
119
+ setReady(false);
120
+ setError(null);
121
+ void (async ()=>{
122
+ try {
123
+ const response = await authorizedFetch(user, `/api/ai/admin/user?uid=${encodeURIComponent(uid)}`);
124
+ const payload = await response.json().catch(()=>null);
125
+ if (!active) return;
126
+ if (!response.ok) {
127
+ var _ref;
128
+ setError((_ref = payload == null ? void 0 : payload.error) != null ? _ref : 'AI usage lookup failed');
129
+ setRows(null);
130
+ } else {
131
+ var _ref1;
132
+ setRows((_ref1 = payload == null ? void 0 : payload.rows) != null ? _ref1 : []);
133
+ }
134
+ } catch (unused) {
135
+ if (active) {
136
+ setError('AI usage lookup failed');
137
+ setRows(null);
138
+ }
139
+ } finally{
140
+ if (active) setReady(true);
141
+ }
142
+ })();
143
+ return ()=>{
144
+ active = false;
145
+ };
146
+ }, [
147
+ uid,
148
+ signedInUid
149
+ ]);
150
+ return /*#__PURE__*/ _jsx(CardDisplay, {
151
+ header: `${aiAddonName()} usage across organizations`,
152
+ help: pluginDocsHelp('aiMonitoring', {
153
+ anchor: '#one-account',
154
+ excerpt: 'This account’s AI credits in every workspace it belongs to, month by month. Opening it is recorded as a staff access about this person.'
155
+ }),
156
+ contentGutterX: true,
157
+ contentGutterY: true,
158
+ children: !ready ? /*#__PURE__*/ _jsx(Typography, {
159
+ variant: "body2",
160
+ color: "text.secondary",
161
+ children: 'Loading…'
162
+ }) : error || !rows ? /*#__PURE__*/ _jsx(Alert, {
163
+ severity: "warning",
164
+ children: `Could not read this account’s AI usage — ${error != null ? error : 'a failed read'}, not zero usage.`
165
+ }) : rows.length === 0 ? /*#__PURE__*/ _jsx(Typography, {
166
+ variant: "body2",
167
+ color: "text.secondary",
168
+ children: 'No AI usage attributed to this account in any workspace it belongs to.'
169
+ }) : // Every month kept is in hand, so the grid pages, sorts and searches
170
+ // the one read itself.
171
+ /*#__PURE__*/ _jsx(ListTable, {
172
+ rows: rows,
173
+ columns: COLUMNS,
174
+ getRowId: rowId,
175
+ rowHeight: TABLE_ROW_HEIGHT,
176
+ onOpen: (_id, row)=>router.push(orgHref(row.orgId))
177
+ })
178
+ });
179
+ };
180
+ StaffUserAiUsageCard.displayName = 'StaffUserAiUsageCard';
181
+ export default StaffUserAiUsageCard;
182
+
183
+ //# sourceMappingURL=staff-user-ai-usage-card.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/staff-user-ai-usage-card.component.tsx"],"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'use client'\n\nimport { aiAddonName } from '@aglyn/aglyn'\nimport { buildRoute, Route } from '@aglyn/aglyn/app-utils/console-routes'\nimport { pluginDocsHelp } from '@aglyn/aglyn/app-utils/docs-help'\nimport { mdiOpenInNew } from '@aglyn/shared-data-mdi'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport {\n ListRowActions,\n ListTable,\n listActionsColumn,\n} from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { TABLE_ROW_HEIGHT } from '@aglyn/shared-ui-jsx/const/table-pagination'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { Alert, Typography } from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { useRouter } from 'next/navigation'\nimport { useEffect, useRef, useState } from 'react'\nimport { aiUsageMonthLabel } from '../usage/ai-usage-wire'\n\n/** One row, as `/api/ai/admin/user` answers it. */\nexport interface StaffUserAiUsageRow {\n orgId: string\n orgName: string | null\n slug: string | null\n month: string\n credits: number\n requests: number\n refusals: number\n}\n\nconst orgHref = (orgId: string) => buildRoute(Route.ADMIN_ORG_DETAIL, { orgId })\n\n/** A row's id: one workspace's one month. */\nconst rowId = (row: StaffUserAiUsageRow) => `${row.orgId}:${row.month}`\n\n/**\n * One row per workspace per month kept. The row opens the workspace; the\n * month sorts by its key, which orders chronologically.\n */\nconst COLUMNS: GridColDef<StaffUserAiUsageRow>[] = [\n {\n field: 'orgName',\n headerName: 'Organization',\n flex: 1,\n minWidth: 200,\n valueGetter: (_value, row) => row.orgName ?? row.orgId,\n },\n {\n field: 'month',\n headerName: 'Month',\n width: 140,\n valueFormatter: (value: string) => aiUsageMonthLabel(value),\n },\n {\n field: 'credits',\n headerName: 'Credits',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 110,\n valueFormatter: (value: number) => value.toLocaleString(),\n },\n {\n field: 'requests',\n headerName: 'Requests',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 110,\n valueFormatter: (value: number) => value.toLocaleString(),\n },\n {\n field: 'refusals',\n headerName: 'Refusals',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 110,\n valueFormatter: (value: number) => value.toLocaleString(),\n },\n listActionsColumn((row: StaffUserAiUsageRow) => (\n <ListRowActions\n label={row.orgName ?? row.orgId}\n quick={{ icon: mdiOpenInNew.path, label: 'View organization', to: orgHref(row.orgId) }}\n items={[]}\n />\n )),\n]\n\n/**\n * ONE ACCOUNT'S AI USAGE ACROSS ORGANIZATIONS (AGL-2928), on the staff user\n * page: workspace, month, credits — every month kept, newest first.\n *\n * Read on mount, and it mounts only for a confirmed staff reader: the\n * `staffUser` zone sits inside the page's `StaffOnly`, which renders nothing\n * while the claim is still loading. The route records an access row about\n * this person on every open, so an open the page did not mean to make would\n * be an access nobody made.\n */\nconst StaffUserAiUsageCard = ({ uid }: { uid: string }) => {\n const { data: user } = useUser()\n // Keyed on who is signed in, not on the user object's identity (AGL-2928).\n const signedInUid = user?.uid ?? null\n const userRef = useRef(user)\n userRef.current = user\n const [rows, setRows] = useState<StaffUserAiUsageRow[] | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [ready, setReady] = useState(false)\n const router = useRouter()\n\n useEffect(() => {\n const user = userRef.current\n if (!uid || !signedInUid || !user) return undefined\n let active = true\n setReady(false)\n setError(null)\n void (async () => {\n try {\n const response = await authorizedFetch(\n user,\n `/api/ai/admin/user?uid=${encodeURIComponent(uid)}`,\n )\n const payload = await response.json().catch(() => null)\n if (!active) return\n if (!response.ok) {\n setError(payload?.error ?? 'AI usage lookup failed')\n setRows(null)\n } else {\n setRows((payload?.rows ?? []) as StaffUserAiUsageRow[])\n }\n } catch {\n if (active) {\n setError('AI usage lookup failed')\n setRows(null)\n }\n } finally {\n if (active) setReady(true)\n }\n })()\n return () => {\n active = false\n }\n }, [uid, signedInUid])\n\n return (\n <CardDisplay\n header={`${aiAddonName()} usage across organizations`}\n help={pluginDocsHelp('aiMonitoring', {\n anchor: '#one-account',\n excerpt:\n 'This account’s AI credits in every workspace it belongs to, month by month. Opening it is recorded as a staff access about this person.',\n })}\n contentGutterX\n contentGutterY\n >\n {!ready ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Loading…'}\n </Typography>\n ) : error || !rows ? (\n <Alert severity=\"warning\">\n {`Could not read this account’s AI usage — ${error ?? 'a failed read'}, not zero usage.`}\n </Alert>\n ) : rows.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No AI usage attributed to this account in any workspace it belongs to.'}\n </Typography>\n ) : (\n // Every month kept is in hand, so the grid pages, sorts and searches\n // the one read itself.\n <ListTable\n rows={rows}\n columns={COLUMNS}\n getRowId={rowId}\n rowHeight={TABLE_ROW_HEIGHT}\n onOpen={(_id, row: StaffUserAiUsageRow) => router.push(orgHref(row.orgId))}\n />\n )}\n </CardDisplay>\n )\n}\nStaffUserAiUsageCard.displayName = 'StaffUserAiUsageCard'\n\nexport default StaffUserAiUsageCard\n"],"names":["aiAddonName","buildRoute","Route","pluginDocsHelp","mdiOpenInNew","CardDisplay","ListRowActions","ListTable","listActionsColumn","TABLE_ROW_HEIGHT","authorizedFetch","useUser","Alert","Typography","useRouter","useEffect","useRef","useState","aiUsageMonthLabel","orgHref","orgId","ADMIN_ORG_DETAIL","rowId","row","month","COLUMNS","field","headerName","flex","minWidth","valueGetter","_value","orgName","width","valueFormatter","value","type","align","headerAlign","toLocaleString","label","quick","icon","path","to","items","StaffUserAiUsageCard","uid","data","user","signedInUid","userRef","current","rows","setRows","error","setError","ready","setReady","router","undefined","active","response","encodeURIComponent","payload","json","catch","ok","header","help","anchor","excerpt","contentGutterX","contentGutterY","variant","color","severity","length","columns","getRowId","rowHeight","onOpen","_id","push","displayName"],"mappings":"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"}