@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,269 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { ASSIST_HARD_CAP_CONTROL_LOCATION } from "@aglyn/aglyn/app-utils/assist-credits";
17
+ import { ORG_PERMISSIONS } from "@aglyn/aglyn/app-utils/org-permissions";
18
+ /**
19
+ * AI ALLOTMENTS (AGL-2942): the pure half.
20
+ *
21
+ * The workspace's AI pool is one band. An allotment is a manager's decision
22
+ * about how much of that band one SUBJECT may draw in a calendar month (UTC),
23
+ * so one client site, one contractor or one teammate cannot spend what the
24
+ * others were counting on:
25
+ *
26
+ * orgs/{orgId}/aiAllotments/{subject}
27
+ * { subject, scope, uid, hostId, credits, mode, models, setBy,
28
+ * updatedAt, alerted }
29
+ *
30
+ * where `subject` is one of
31
+ *
32
+ * member:{uid} a team member, across every site
33
+ * collab:{hostId}:{uid} a site collaborator, on that site
34
+ * host:{hostId} a whole site, across everyone who works on it
35
+ * org the org-wide model restriction (no credits)
36
+ *
37
+ * ## An allotment never grants
38
+ *
39
+ * The org band stays the outer wall: the reservation decides the workspace's
40
+ * own ceilings first and consults an allotment only once they admitted the
41
+ * request. So an allotment larger than the band is not an error and not a
42
+ * grant — it is a line the workspace reaches after the band.
43
+ *
44
+ * ## Hard and soft
45
+ *
46
+ * A HARD allotment refuses the request that finds the subject at or past it.
47
+ * A SOFT one admits it and tells the subject and the workspace's billing
48
+ * contacts at 80% and again at 100%. Both are measured against what the
49
+ * subject already drew this month, before the request — the same shape the
50
+ * band is measured in, so a request that starts under the line may finish
51
+ * past it, and the next one is the one refused.
52
+ *
53
+ * Everything here is dependency-light so the gate, the routes and the console
54
+ * cards read one definition of a subject, a standing and a refusal sentence.
55
+ */ /** `orgs/{orgId}/{this}/{subject}`. */ export const AI_ALLOTMENTS_COLLECTION = 'aiAllotments';
56
+ /** The subject id of the org-wide model restriction. */ export const AI_ALLOTMENT_ORG_SUBJECT = 'org';
57
+ /** The share of an allotment at which the strip warns and a soft one alerts. */ export const AI_ALLOTMENT_WARN_SHARE = 0.8;
58
+ /**
59
+ * The largest monthly allotment a write may carry. A bound on a typing
60
+ * mistake, not a product limit: a billion credits is a million dollars of
61
+ * provider spend, far past any band the platform sells.
62
+ */ export const AI_ALLOTMENT_MAX_CREDITS = 1000000000;
63
+ /** The most catalog ids one allowlist may name. */ export const AI_ALLOTMENT_MAX_MODELS = 20;
64
+ const ID_SEGMENT = /^[A-Za-z0-9_-]{1,128}$/;
65
+ /** The document id for a subject. Throws on a segment that is not an id. */ export function aiAllotmentSubjectId(input) {
66
+ const segment = (value)=>{
67
+ if (!ID_SEGMENT.test(value)) throw new Error(`not an id segment: ${value}`);
68
+ return value;
69
+ };
70
+ switch(input.scope){
71
+ case 'member':
72
+ return `member:${segment(input.uid)}`;
73
+ case 'collab':
74
+ return `collab:${segment(input.hostId)}:${segment(input.uid)}`;
75
+ case 'host':
76
+ return `host:${segment(input.hostId)}`;
77
+ default:
78
+ return AI_ALLOTMENT_ORG_SUBJECT;
79
+ }
80
+ }
81
+ /** A subject id read back, or `null` for anything that is not one. */ export function parseAiAllotmentSubject(value) {
82
+ if (typeof value !== 'string') return null;
83
+ if (value === AI_ALLOTMENT_ORG_SUBJECT) {
84
+ return {
85
+ id: value,
86
+ scope: 'org',
87
+ uid: null,
88
+ hostId: null
89
+ };
90
+ }
91
+ const parts = value.split(':');
92
+ if (parts.some((part)=>!ID_SEGMENT.test(part))) return null;
93
+ if (parts.length === 2 && parts[0] === 'member') {
94
+ return {
95
+ id: value,
96
+ scope: 'member',
97
+ uid: parts[1],
98
+ hostId: null
99
+ };
100
+ }
101
+ if (parts.length === 2 && parts[0] === 'host') {
102
+ return {
103
+ id: value,
104
+ scope: 'host',
105
+ uid: null,
106
+ hostId: parts[1]
107
+ };
108
+ }
109
+ if (parts.length === 3 && parts[0] === 'collab') {
110
+ return {
111
+ id: value,
112
+ scope: 'collab',
113
+ uid: parts[2],
114
+ hostId: parts[1]
115
+ };
116
+ }
117
+ return null;
118
+ }
119
+ /** A finite positive whole number of credits, else `null`. */ export function aiAllotmentCredits(value) {
120
+ const parsed = typeof value === 'number' ? value : Number.NaN;
121
+ if (!Number.isFinite(parsed) || parsed <= 0) return null;
122
+ return Math.min(AI_ALLOTMENT_MAX_CREDITS, Math.floor(parsed));
123
+ }
124
+ /** An allowlist read back: unique strings, bounded; empty reads as none. */ export function aiAllotmentModels(value) {
125
+ if (!Array.isArray(value)) return null;
126
+ const models = [
127
+ ...new Set(value.filter((entry)=>typeof entry === 'string').map((entry)=>entry.trim()).filter(Boolean))
128
+ ].slice(0, AI_ALLOTMENT_MAX_MODELS);
129
+ return models.length ? models : null;
130
+ }
131
+ /**
132
+ * A stored allotment as a complete record, or `null` when the id is not a
133
+ * subject. The scope, uid and site are read off the ID, never off the
134
+ * fields: the id is what the gate addresses, so it is the only claim about
135
+ * who the document is for that can be trusted.
136
+ *
137
+ * `mode` defaults to `hard`: a document whose mode was lost is a cap, which
138
+ * is the reading that cannot spend more than a manager set.
139
+ */ export function aiAllotmentFrom(raw, id) {
140
+ const subject = parseAiAllotmentSubject(id);
141
+ if (!subject || !raw) return null;
142
+ const alertedRaw = raw['alerted'];
143
+ const threshold = Number(alertedRaw == null ? void 0 : alertedRaw.threshold);
144
+ return {
145
+ subject: subject.id,
146
+ scope: subject.scope,
147
+ uid: subject.uid,
148
+ hostId: subject.hostId,
149
+ credits: subject.scope === 'org' ? null : aiAllotmentCredits(raw['credits']),
150
+ mode: raw['mode'] === 'soft' ? 'soft' : 'hard',
151
+ models: aiAllotmentModels(raw['models']),
152
+ setBy: typeof raw['setBy'] === 'string' ? raw['setBy'] : null,
153
+ alerted: typeof (alertedRaw == null ? void 0 : alertedRaw.month) === 'string' && (threshold === 80 || threshold === 100) ? {
154
+ month: alertedRaw.month,
155
+ threshold
156
+ } : null
157
+ };
158
+ }
159
+ /** `reached` at or past the allotment, `warn` from 80% of it. */ export function aiAllotmentState(used, credits) {
160
+ if (!(credits > 0)) return 'ok';
161
+ if (used >= credits) return 'reached';
162
+ if (used >= credits * AI_ALLOTMENT_WARN_SHARE) return 'warn';
163
+ return 'ok';
164
+ }
165
+ /** The threshold a standing sits at, for the alert pipeline. */ export function aiAllotmentThreshold(used, credits) {
166
+ const state = aiAllotmentState(used, credits);
167
+ return state === 'reached' ? 100 : state === 'warn' ? 80 : null;
168
+ }
169
+ /**
170
+ * Whether a standing admits a request.
171
+ *
172
+ * A soft allotment always does. A hard one admits while the subject is under
173
+ * it — and, for a caller that knows what the request will cost before it
174
+ * starts (a job's estimate), while the estimate still fits: a 100-credit job
175
+ * at 0 of 100 is admitted, one at 1 of 100 is not.
176
+ */ export function aiAllotmentAdmits(standing, estimateCredits = 0) {
177
+ if (standing.mode === 'soft') return true;
178
+ const estimate = Number.isFinite(estimateCredits) && estimateCredits > 0 ? estimateCredits : 0;
179
+ return estimate > 0 ? standing.used + estimate <= standing.credits : standing.used < standing.credits;
180
+ }
181
+ /**
182
+ * Which subject a refusal names when more than one allotment is spent: the
183
+ * narrowest first — the person on this site, then the person, then the site.
184
+ */ const SCOPE_ORDER = [
185
+ 'collab',
186
+ 'member',
187
+ 'host'
188
+ ];
189
+ const scopeRank = (scope)=>SCOPE_ORDER.indexOf(scope);
190
+ /** The verdict over every allotment that applies to one request. */ export function aiAllotmentVerdict(standings, estimateCredits = 0) {
191
+ var _ordered_find;
192
+ const ordered = [
193
+ ...standings
194
+ ].sort((a, b)=>scopeRank(a.scope) - scopeRank(b.scope));
195
+ const refusal = (_ordered_find = ordered.find((standing)=>!aiAllotmentAdmits(standing, estimateCredits))) != null ? _ordered_find : null;
196
+ let binding = null;
197
+ for (const standing of ordered){
198
+ if (!binding || standing.credits - standing.used < binding.credits - binding.used) {
199
+ binding = standing;
200
+ }
201
+ }
202
+ const alerts = ordered.flatMap((standing)=>{
203
+ if (standing.mode !== 'soft') return [];
204
+ const threshold = aiAllotmentThreshold(standing.used, standing.credits);
205
+ return threshold ? [
206
+ {
207
+ standing,
208
+ threshold
209
+ }
210
+ ] : [];
211
+ });
212
+ return {
213
+ refusal,
214
+ binding,
215
+ alerts
216
+ };
217
+ }
218
+ /**
219
+ * The allowlists that apply to a request, intersected — `null` when none of
220
+ * the allotments names one. An empty result is a real answer: two lists that
221
+ * share no model leave nothing to pick, and the model choice falls back to
222
+ * the routing table rather than turning AI off for a mistake in a list.
223
+ */ export function aiAllotmentModelsAllowed(allotments) {
224
+ const lists = allotments.map((allotment)=>allotment == null ? void 0 : allotment.models).filter((models)=>Array.isArray(models) && models.length > 0);
225
+ if (!lists.length) return null;
226
+ return lists.reduce((kept, list)=>kept.filter((id)=>list.includes(id)));
227
+ }
228
+ /** The catalog label for `billing.manage`, the word a sentence names it by. */ export function billingManageLabel() {
229
+ var _ref;
230
+ var _ORG_PERMISSIONS_find;
231
+ return (_ref = (_ORG_PERMISSIONS_find = ORG_PERMISSIONS.find((definition)=>definition.key === 'billing.manage')) == null ? void 0 : _ORG_PERMISSIONS_find.label) != null ? _ref : 'Manage billing';
232
+ }
233
+ /**
234
+ * The sentence a refused request is told, naming who can raise the
235
+ * allotment and where. No figures: the strip beside it carries those, and a
236
+ * refusal that quoted a count would be stale the moment someone raised it.
237
+ */ export function aiAllotmentRefusalText(scope) {
238
+ const managers = `an organization admin with the "${billingManageLabel()}" permission`;
239
+ switch(scope){
240
+ case 'collab':
241
+ return 'You have used your AI allotment on this site for this month. ' + `The site's admin, or ${managers}, can raise it on the site's Users card.`;
242
+ case 'host':
243
+ return 'This site has used its AI allotment for this month. ' + `Ask ${managers} to raise it under ${ASSIST_HARD_CAP_CONTROL_LOCATION}.`;
244
+ default:
245
+ return 'You have used your AI allotment for this month. ' + `Ask ${managers} to raise it under ${ASSIST_HARD_CAP_CONTROL_LOCATION}.`;
246
+ }
247
+ }
248
+ /**
249
+ * The words a soft allotment's alert carries, for BOTH channels — the
250
+ * console notification and the email — so the two cannot say different
251
+ * things about one crossing. `name` is the member's name or the site's.
252
+ */ export function aiAllotmentAlertCopy(input) {
253
+ const who = input.scope === 'host' ? `The ${input.name} site` : input.name;
254
+ const whose = input.scope === 'host' ? 'its' : 'their';
255
+ const where = input.scope === 'collab' ? ' on its site' : '';
256
+ const figures = `${input.used.toLocaleString('en-US')} of ` + `${input.credits.toLocaleString('en-US')} credits used this month.`;
257
+ if (input.threshold >= 100) {
258
+ return {
259
+ title: `${who} has used ${whose} whole AI allotment${where}`,
260
+ body: `${figures} The allotment is soft, so requests keep working and ` + 'draw on the workspace’s pool. Raise it or make it hard under ' + `${ASSIST_HARD_CAP_CONTROL_LOCATION}.`
261
+ };
262
+ }
263
+ return {
264
+ title: `${who} is past ${Math.round(AI_ALLOTMENT_WARN_SHARE * 100)}% of ${whose} AI allotment${where}`,
265
+ body: `${figures} The allotment is soft, so nothing stops at the line.`
266
+ };
267
+ }
268
+
269
+ //# sourceMappingURL=ai-allotments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/model/ai-allotments.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ASSIST_HARD_CAP_CONTROL_LOCATION,\n type AssistRefusedBy,\n} from '@aglyn/aglyn/app-utils/assist-credits'\nimport { ORG_PERMISSIONS } from '@aglyn/aglyn/app-utils/org-permissions'\n\n/**\n * AI ALLOTMENTS (AGL-2942): the pure half.\n *\n * The workspace's AI pool is one band. An allotment is a manager's decision\n * about how much of that band one SUBJECT may draw in a calendar month (UTC),\n * so one client site, one contractor or one teammate cannot spend what the\n * others were counting on:\n *\n * orgs/{orgId}/aiAllotments/{subject}\n * { subject, scope, uid, hostId, credits, mode, models, setBy,\n * updatedAt, alerted }\n *\n * where `subject` is one of\n *\n * member:{uid} a team member, across every site\n * collab:{hostId}:{uid} a site collaborator, on that site\n * host:{hostId} a whole site, across everyone who works on it\n * org the org-wide model restriction (no credits)\n *\n * ## An allotment never grants\n *\n * The org band stays the outer wall: the reservation decides the workspace's\n * own ceilings first and consults an allotment only once they admitted the\n * request. So an allotment larger than the band is not an error and not a\n * grant — it is a line the workspace reaches after the band.\n *\n * ## Hard and soft\n *\n * A HARD allotment refuses the request that finds the subject at or past it.\n * A SOFT one admits it and tells the subject and the workspace's billing\n * contacts at 80% and again at 100%. Both are measured against what the\n * subject already drew this month, before the request — the same shape the\n * band is measured in, so a request that starts under the line may finish\n * past it, and the next one is the one refused.\n *\n * Everything here is dependency-light so the gate, the routes and the console\n * cards read one definition of a subject, a standing and a refusal sentence.\n */\n\n/** `orgs/{orgId}/{this}/{subject}`. */\nexport const AI_ALLOTMENTS_COLLECTION = 'aiAllotments'\n\n/** The subject id of the org-wide model restriction. */\nexport const AI_ALLOTMENT_ORG_SUBJECT = 'org'\n\nexport type AiAllotmentMode = 'hard' | 'soft'\n\nexport type AiAllotmentScope = 'member' | 'collab' | 'host' | 'org'\n\n/** The scopes an allotment of CREDITS can have; `org` carries models only. */\nexport type AiCreditAllotmentScope = Exclude<AiAllotmentScope, 'org'>\n\n/**\n * Why a reservation refused: the meter's own ceilings, and an allotment.\n *\n * Widened here rather than in core's `AssistRefusedBy`, because an allotment\n * is the plugin's rung: core names the ceilings core's billing sells.\n */\nexport type AiRefusedBy = AssistRefusedBy | 'allotment'\n\n/** The two thresholds a soft allotment announces. */\nexport type AiAllotmentThreshold = 80 | 100\n\n/** The share of an allotment at which the strip warns and a soft one alerts. */\nexport const AI_ALLOTMENT_WARN_SHARE = 0.8\n\n/**\n * The largest monthly allotment a write may carry. A bound on a typing\n * mistake, not a product limit: a billion credits is a million dollars of\n * provider spend, far past any band the platform sells.\n */\nexport const AI_ALLOTMENT_MAX_CREDITS = 1_000_000_000\n\n/** The most catalog ids one allowlist may name. */\nexport const AI_ALLOTMENT_MAX_MODELS = 20\n\nconst ID_SEGMENT = /^[A-Za-z0-9_-]{1,128}$/\n\nexport interface AiAllotmentSubject {\n id: string\n scope: AiAllotmentScope\n uid: string | null\n hostId: string | null\n}\n\nexport type AiAllotmentSubjectInput =\n | { scope: 'member'; uid: string }\n | { scope: 'collab'; hostId: string; uid: string }\n | { scope: 'host'; hostId: string }\n | { scope: 'org' }\n\n/** The document id for a subject. Throws on a segment that is not an id. */\nexport function aiAllotmentSubjectId(input: AiAllotmentSubjectInput): string {\n const segment = (value: string): string => {\n if (!ID_SEGMENT.test(value)) throw new Error(`not an id segment: ${value}`)\n return value\n }\n switch (input.scope) {\n case 'member':\n return `member:${segment(input.uid)}`\n case 'collab':\n return `collab:${segment(input.hostId)}:${segment(input.uid)}`\n case 'host':\n return `host:${segment(input.hostId)}`\n default:\n return AI_ALLOTMENT_ORG_SUBJECT\n }\n}\n\n/** A subject id read back, or `null` for anything that is not one. */\nexport function parseAiAllotmentSubject(value: unknown): AiAllotmentSubject | null {\n if (typeof value !== 'string') return null\n if (value === AI_ALLOTMENT_ORG_SUBJECT) {\n return { id: value, scope: 'org', uid: null, hostId: null }\n }\n const parts = value.split(':')\n if (parts.some((part) => !ID_SEGMENT.test(part))) return null\n if (parts.length === 2 && parts[0] === 'member') {\n return { id: value, scope: 'member', uid: parts[1], hostId: null }\n }\n if (parts.length === 2 && parts[0] === 'host') {\n return { id: value, scope: 'host', uid: null, hostId: parts[1] }\n }\n if (parts.length === 3 && parts[0] === 'collab') {\n return { id: value, scope: 'collab', uid: parts[2], hostId: parts[1] }\n }\n return null\n}\n\n/** One allotment as every reader hands it on. */\nexport interface AiAllotment {\n subject: string\n scope: AiAllotmentScope\n uid: string | null\n hostId: string | null\n /**\n * Credits a month, or `null` for an allotment that bounds models alone —\n * and always `null` on the org-wide restriction.\n */\n credits: number | null\n mode: AiAllotmentMode\n /** Catalog ids the subject may run on, or `null` for no restriction. */\n models: string[] | null\n setBy: string | null\n /** The last threshold announced, and the month it was announced in. */\n alerted: { month: string; threshold: AiAllotmentThreshold } | null\n}\n\n/** A finite positive whole number of credits, else `null`. */\nexport function aiAllotmentCredits(value: unknown): number | null {\n const parsed = typeof value === 'number' ? value : Number.NaN\n if (!Number.isFinite(parsed) || parsed <= 0) return null\n return Math.min(AI_ALLOTMENT_MAX_CREDITS, Math.floor(parsed))\n}\n\n/** An allowlist read back: unique strings, bounded; empty reads as none. */\nexport function aiAllotmentModels(value: unknown): string[] | null {\n if (!Array.isArray(value)) return null\n const models = [\n ...new Set(\n value\n .filter((entry): entry is string => typeof entry === 'string')\n .map((entry) => entry.trim())\n .filter(Boolean),\n ),\n ].slice(0, AI_ALLOTMENT_MAX_MODELS)\n return models.length ? models : null\n}\n\n/**\n * A stored allotment as a complete record, or `null` when the id is not a\n * subject. The scope, uid and site are read off the ID, never off the\n * fields: the id is what the gate addresses, so it is the only claim about\n * who the document is for that can be trusted.\n *\n * `mode` defaults to `hard`: a document whose mode was lost is a cap, which\n * is the reading that cannot spend more than a manager set.\n */\nexport function aiAllotmentFrom(\n raw: Record<string, unknown> | null | undefined,\n id: string,\n): AiAllotment | null {\n const subject = parseAiAllotmentSubject(id)\n if (!subject || !raw) return null\n const alertedRaw = raw['alerted'] as { month?: unknown; threshold?: unknown } | null\n const threshold = Number(alertedRaw?.threshold)\n return {\n subject: subject.id,\n scope: subject.scope,\n uid: subject.uid,\n hostId: subject.hostId,\n credits: subject.scope === 'org' ? null : aiAllotmentCredits(raw['credits']),\n mode: raw['mode'] === 'soft' ? 'soft' : 'hard',\n models: aiAllotmentModels(raw['models']),\n setBy: typeof raw['setBy'] === 'string' ? (raw['setBy'] as string) : null,\n alerted:\n typeof alertedRaw?.month === 'string' && (threshold === 80 || threshold === 100)\n ? { month: alertedRaw.month, threshold }\n : null,\n }\n}\n\n/** One allotment of credits measured against what its subject drew. */\nexport interface AiAllotmentStanding {\n subject: string\n scope: AiCreditAllotmentScope\n uid: string | null\n hostId: string | null\n credits: number\n /** Credits drawn this month before the request being decided. */\n used: number\n mode: AiAllotmentMode\n}\n\nexport type AiAllotmentState = 'ok' | 'warn' | 'reached'\n\n/** `reached` at or past the allotment, `warn` from 80% of it. */\nexport function aiAllotmentState(used: number, credits: number): AiAllotmentState {\n if (!(credits > 0)) return 'ok'\n if (used >= credits) return 'reached'\n if (used >= credits * AI_ALLOTMENT_WARN_SHARE) return 'warn'\n return 'ok'\n}\n\n/** The threshold a standing sits at, for the alert pipeline. */\nexport function aiAllotmentThreshold(\n used: number,\n credits: number,\n): AiAllotmentThreshold | null {\n const state = aiAllotmentState(used, credits)\n return state === 'reached' ? 100 : state === 'warn' ? 80 : null\n}\n\n/**\n * Whether a standing admits a request.\n *\n * A soft allotment always does. A hard one admits while the subject is under\n * it — and, for a caller that knows what the request will cost before it\n * starts (a job's estimate), while the estimate still fits: a 100-credit job\n * at 0 of 100 is admitted, one at 1 of 100 is not.\n */\nexport function aiAllotmentAdmits(\n standing: Pick<AiAllotmentStanding, 'credits' | 'used' | 'mode'>,\n estimateCredits = 0,\n): boolean {\n if (standing.mode === 'soft') return true\n const estimate = Number.isFinite(estimateCredits) && estimateCredits > 0 ? estimateCredits : 0\n return estimate > 0\n ? standing.used + estimate <= standing.credits\n : standing.used < standing.credits\n}\n\n/**\n * Which subject a refusal names when more than one allotment is spent: the\n * narrowest first — the person on this site, then the person, then the site.\n */\nconst SCOPE_ORDER: readonly AiCreditAllotmentScope[] = ['collab', 'member', 'host']\n\nconst scopeRank = (scope: AiCreditAllotmentScope): number => SCOPE_ORDER.indexOf(scope)\n\nexport interface AiAllotmentVerdict {\n /** The hard allotment that refuses the request, or `null`. */\n refusal: AiAllotmentStanding | null\n /** The allotment with the least left, for the usage strip; `null` for none. */\n binding: AiAllotmentStanding | null\n /** Soft allotments at a threshold, for the alert pipeline. */\n alerts: Array<{ standing: AiAllotmentStanding; threshold: AiAllotmentThreshold }>\n}\n\n/** The verdict over every allotment that applies to one request. */\nexport function aiAllotmentVerdict(\n standings: readonly AiAllotmentStanding[],\n estimateCredits = 0,\n): AiAllotmentVerdict {\n const ordered = [...standings].sort((a, b) => scopeRank(a.scope) - scopeRank(b.scope))\n const refusal =\n ordered.find((standing) => !aiAllotmentAdmits(standing, estimateCredits)) ?? null\n let binding: AiAllotmentStanding | null = null\n for (const standing of ordered) {\n if (!binding || standing.credits - standing.used < binding.credits - binding.used) {\n binding = standing\n }\n }\n const alerts = ordered.flatMap((standing) => {\n if (standing.mode !== 'soft') return []\n const threshold = aiAllotmentThreshold(standing.used, standing.credits)\n return threshold ? [{ standing, threshold }] : []\n })\n return { refusal, binding, alerts }\n}\n\n/**\n * The allowlists that apply to a request, intersected — `null` when none of\n * the allotments names one. An empty result is a real answer: two lists that\n * share no model leave nothing to pick, and the model choice falls back to\n * the routing table rather than turning AI off for a mistake in a list.\n */\nexport function aiAllotmentModelsAllowed(\n allotments: ReadonlyArray<Pick<AiAllotment, 'models'> | null | undefined>,\n): string[] | null {\n const lists = allotments\n .map((allotment) => allotment?.models)\n .filter((models): models is string[] => Array.isArray(models) && models.length > 0)\n if (!lists.length) return null\n return lists.reduce((kept, list) => kept.filter((id) => list.includes(id)))\n}\n\n/** The catalog label for `billing.manage`, the word a sentence names it by. */\nexport function billingManageLabel(): string {\n return (\n ORG_PERMISSIONS.find((definition) => definition.key === 'billing.manage')?.label ??\n 'Manage billing'\n )\n}\n\n/**\n * The sentence a refused request is told, naming who can raise the\n * allotment and where. No figures: the strip beside it carries those, and a\n * refusal that quoted a count would be stale the moment someone raised it.\n */\nexport function aiAllotmentRefusalText(\n scope: AiCreditAllotmentScope | null | undefined,\n): string {\n const managers = `an organization admin with the \"${billingManageLabel()}\" permission`\n switch (scope) {\n case 'collab':\n return (\n 'You have used your AI allotment on this site for this month. ' +\n `The site's admin, or ${managers}, can raise it on the site's Users card.`\n )\n case 'host':\n return (\n 'This site has used its AI allotment for this month. ' +\n `Ask ${managers} to raise it under ${ASSIST_HARD_CAP_CONTROL_LOCATION}.`\n )\n default:\n return (\n 'You have used your AI allotment for this month. ' +\n `Ask ${managers} to raise it under ${ASSIST_HARD_CAP_CONTROL_LOCATION}.`\n )\n }\n}\n\n/**\n * The words a soft allotment's alert carries, for BOTH channels — the\n * console notification and the email — so the two cannot say different\n * things about one crossing. `name` is the member's name or the site's.\n */\nexport function aiAllotmentAlertCopy(input: {\n scope: AiCreditAllotmentScope\n threshold: AiAllotmentThreshold\n used: number\n credits: number\n name: string\n}): { title: string; body: string } {\n const who =\n input.scope === 'host' ? `The ${input.name} site` : input.name\n const whose = input.scope === 'host' ? 'its' : 'their'\n const where = input.scope === 'collab' ? ' on its site' : ''\n const figures =\n `${input.used.toLocaleString('en-US')} of ` +\n `${input.credits.toLocaleString('en-US')} credits used this month.`\n if (input.threshold >= 100) {\n return {\n title: `${who} has used ${whose} whole AI allotment${where}`,\n body:\n `${figures} The allotment is soft, so requests keep working and ` +\n 'draw on the workspace’s pool. Raise it or make it hard under ' +\n `${ASSIST_HARD_CAP_CONTROL_LOCATION}.`,\n }\n }\n return {\n title: `${who} is past ${Math.round(AI_ALLOTMENT_WARN_SHARE * 100)}% of ${whose} AI allotment${where}`,\n body: `${figures} The allotment is soft, so nothing stops at the line.`,\n }\n}\n"],"names":["ASSIST_HARD_CAP_CONTROL_LOCATION","ORG_PERMISSIONS","AI_ALLOTMENTS_COLLECTION","AI_ALLOTMENT_ORG_SUBJECT","AI_ALLOTMENT_WARN_SHARE","AI_ALLOTMENT_MAX_CREDITS","AI_ALLOTMENT_MAX_MODELS","ID_SEGMENT","aiAllotmentSubjectId","input","segment","value","test","Error","scope","uid","hostId","parseAiAllotmentSubject","id","parts","split","some","part","length","aiAllotmentCredits","parsed","Number","NaN","isFinite","Math","min","floor","aiAllotmentModels","Array","isArray","models","Set","filter","entry","map","trim","Boolean","slice","aiAllotmentFrom","raw","subject","alertedRaw","threshold","credits","mode","setBy","alerted","month","aiAllotmentState","used","aiAllotmentThreshold","state","aiAllotmentAdmits","standing","estimateCredits","estimate","SCOPE_ORDER","scopeRank","indexOf","aiAllotmentVerdict","standings","ordered","sort","a","b","refusal","find","binding","alerts","flatMap","aiAllotmentModelsAllowed","allotments","lists","allotment","reduce","kept","list","includes","billingManageLabel","definition","key","label","aiAllotmentRefusalText","managers","aiAllotmentAlertCopy","who","name","whose","where","figures","toLocaleString","title","body","round"],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import type { HostAction } from '@aglyn/aglyn/app-utils/actions';
18
+ import { type AutomationPlaceholder } from '@aglyn/aglyn/app-utils/automation-placeholders';
19
+ import type { AiAutomationAnswer } from '../tools/ai-workflow-tool';
20
+ /**
21
+ * An answer made into the automation the workflows plugin stores (AGL-2919).
22
+ *
23
+ * The answer names each record in WORDS. Here, in code and after the answer,
24
+ * each is looked up among the site's own records: a list, a campaign, a
25
+ * workflow, a webhook, a dataset, a form or a deal stage the words name
26
+ * without doubt becomes that record's id; words that name none, or name more
27
+ * than one, become a placeholder — the words in square brackets where the
28
+ * record belongs — for the person to pick in the Actions editor. Nothing is
29
+ * guessed, and the model never saw the records it was matched against beyond
30
+ * what the site inventory already sends.
31
+ */
32
+ /** One record a description may name. */
33
+ export interface AiAutomationNamedRecord {
34
+ id: string;
35
+ name: string;
36
+ }
37
+ /** A form, with the fields its submissions carry. */
38
+ export interface AiAutomationForm extends AiAutomationNamedRecord {
39
+ fields: string[];
40
+ }
41
+ /** The site's records an automation's words are looked up among. */
42
+ export interface AiAutomationRecords {
43
+ forms: AiAutomationForm[];
44
+ datasets: AiAutomationNamedRecord[];
45
+ lists: AiAutomationNamedRecord[];
46
+ campaigns: AiAutomationNamedRecord[];
47
+ workflows: AiAutomationNamedRecord[];
48
+ webhooks: AiAutomationNamedRecord[];
49
+ /** Every stage of every pipeline the site may see. */
50
+ stages: AiAutomationNamedRecord[];
51
+ }
52
+ export declare function emptyAiAutomationRecords(): AiAutomationRecords;
53
+ /**
54
+ * The one record `words` name, or `null`: its id written whole; else the one
55
+ * record whose name is the same words; else the one record whose name holds
56
+ * every word, or whose every word the words hold. Two records that fit
57
+ * equally well name neither — a placeholder is better than a coin toss.
58
+ */
59
+ export declare function aiMatchNamedRecord<T extends AiAutomationNamedRecord>(words: string, records: readonly T[], noun: string): T | null;
60
+ /** The name an automation is drafted under when the answer gave none. */
61
+ export declare const AI_AUTOMATION_DEFAULT_NAME = "New automation";
62
+ export interface AiAutomationDraft {
63
+ /** The automation as the workflows plugin stores it: OFF. */
64
+ action: HostAction;
65
+ /** What a person still has to supply before switching it on. */
66
+ placeholders: AutomationPlaceholder[];
67
+ }
68
+ /** An answer as the automation to store, with every record it names looked up. */
69
+ export declare function aiAutomationDraft(answer: AiAutomationAnswer, records: AiAutomationRecords): AiAutomationDraft;
70
+ /**
71
+ * What a drafted automation's output tells a person: that it is off, what to
72
+ * fill in before switching it on, and what the answer said needs deciding.
73
+ */
74
+ export declare function aiAutomationDraftNote(draft: AiAutomationDraft, notes: readonly string[]): string;