@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,45 @@
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 { AI_OFF_FOR_SITE_COPY, AI_OFF_FOR_SITE_STATUS, isAiOffForSite } from "../model/ai-site-switch.js";
17
+ const admissions = new Map();
18
+ /** Idempotent per kind; the last registration wins, and `null` unregisters. */ export function registerAiJobAdmission(kind, admission) {
19
+ if (admission) admissions.set(kind, admission);
20
+ else admissions.delete(kind);
21
+ }
22
+ /** The kind's registered admission, or `null` when it has none. */ export function aiJobAdmissionFor(kind) {
23
+ var _admissions_get;
24
+ return (_admissions_get = admissions.get(kind)) != null ? _admissions_get : null;
25
+ }
26
+ /** The kind's refusal, or `null` when it admits the job or has nothing to check. */ export async function aiJobAdmissionRefusal(kind, context) {
27
+ const admission = admissions.get(kind);
28
+ return admission ? admission(context) : null;
29
+ }
30
+ /**
31
+ * The refusal for a job on a site that switched AI off (AGL-3028), or `null`.
32
+ *
33
+ * Every kind meets it, and every door asks it BEFORE the kind's own check —
34
+ * the create door, each site of an agency batch, and a resume — so no job
35
+ * comes to exist, or runs another step, for a site that said no, and a
36
+ * switched-off site never pays for a kind's reads. A job with no site is
37
+ * workspace-level and always passes.
38
+ */ export async function aiJobSiteRefusal(context) {
39
+ return await isAiOffForSite(context.firestore, context.org, context.hostId) ? {
40
+ status: AI_OFF_FOR_SITE_STATUS,
41
+ error: AI_OFF_FOR_SITE_COPY
42
+ } : null;
43
+ }
44
+
45
+ //# sourceMappingURL=ai-job-admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/jobs/ai-job-admission.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { AiJobKind, AiJobPlan } from '../model/ai-jobs.types'\nimport {\n AI_OFF_FOR_SITE_COPY,\n AI_OFF_FOR_SITE_STATUS,\n isAiOffForSite,\n} from '../model/ai-site-switch'\n\n/**\n * What a job kind checks before a job of it runs (AGL-2909).\n *\n * The create door parses the body every kind shares — the org, the site, the\n * brief, scalar inputs — and nothing the machine knows says whether THIS kind\n * can finish: a layout needs a site to write to, a page template names the\n * collection it renders, and both write a document the site's plan counts.\n * A job that cannot finish should never start, because a planned kind spends\n * on its plan before it writes anything. So a kind registers one check, the\n * create door asks it after the gate ladder admitted the request and before\n * the job exists, and the resume door asks it again before a confirmed plan\n * runs, since an allowance free at creation may be used by now. Either way\n * a refusal hands the reservation back and spends nothing.\n *\n * The resume door also hands the check the plan being confirmed (AGL-2907),\n * so a kind that can build only some plans — a page job builds one screen\n * from what the site has — refuses the others when a member confirms them,\n * not a beat later from inside the step.\n *\n * The registry lives apart from the machine so the doors read it without the\n * generators, and a generator registers here beside its runner.\n */\n\nexport interface AiJobAdmissionContext {\n /** The Admin SDK handle the door runs on. */\n firestore: FirebaseFirestore.Firestore\n orgId: string\n hostId: string | null\n /** The job's kind-specific inputs, as the door parsed or the job stored them. */\n inputs: Readonly<Record<string, unknown>>\n /** The org document the gate ladder read; a check narrows it to the fields it reads. */\n org: object | null\n /**\n * The job's plan when the door is resuming a job that has one; absent at\n * creation, when no plan exists yet.\n */\n plan?: AiJobPlan | null\n /**\n * The member whose request spends: the creator at the create door, the\n * member confirming at the resume door. A kind whose draft another plugin\n * writes asks that plugin whether this member may create one.\n */\n uid?: string | null\n}\n\nexport interface AiJobAdmissionRefusal {\n status: 400 | 403 | 404\n /** Customer-safe: the door answers with it as it stands. */\n error: string\n}\n\nexport type AiJobAdmission = (\n context: AiJobAdmissionContext,\n) => Promise<AiJobAdmissionRefusal | null>\n\nconst admissions = new Map<AiJobKind, AiJobAdmission>()\n\n/** Idempotent per kind; the last registration wins, and `null` unregisters. */\nexport function registerAiJobAdmission(kind: AiJobKind, admission: AiJobAdmission | null): void {\n if (admission) admissions.set(kind, admission)\n else admissions.delete(kind)\n}\n\n/** The kind's registered admission, or `null` when it has none. */\nexport function aiJobAdmissionFor(kind: AiJobKind): AiJobAdmission | null {\n return admissions.get(kind) ?? null\n}\n\n/** The kind's refusal, or `null` when it admits the job or has nothing to check. */\nexport async function aiJobAdmissionRefusal(\n kind: AiJobKind,\n context: AiJobAdmissionContext,\n): Promise<AiJobAdmissionRefusal | null> {\n const admission = admissions.get(kind)\n return admission ? admission(context) : null\n}\n\n/**\n * The refusal for a job on a site that switched AI off (AGL-3028), or `null`.\n *\n * Every kind meets it, and every door asks it BEFORE the kind's own check —\n * the create door, each site of an agency batch, and a resume — so no job\n * comes to exist, or runs another step, for a site that said no, and a\n * switched-off site never pays for a kind's reads. A job with no site is\n * workspace-level and always passes.\n */\nexport async function aiJobSiteRefusal(\n context: Pick<AiJobAdmissionContext, 'firestore' | 'org' | 'hostId'>,\n): Promise<AiJobAdmissionRefusal | null> {\n return (await isAiOffForSite(context.firestore, context.org, context.hostId))\n ? { status: AI_OFF_FOR_SITE_STATUS, error: AI_OFF_FOR_SITE_COPY }\n : null\n}\n"],"names":["AI_OFF_FOR_SITE_COPY","AI_OFF_FOR_SITE_STATUS","isAiOffForSite","admissions","Map","registerAiJobAdmission","kind","admission","set","delete","aiJobAdmissionFor","get","aiJobAdmissionRefusal","context","aiJobSiteRefusal","firestore","org","hostId","status","error"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAGD,SACEA,oBAAoB,EACpBC,sBAAsB,EACtBC,cAAc,QACT,6BAAyB;AAyDhC,MAAMC,aAAa,IAAIC;AAEvB,6EAA6E,GAC7E,OAAO,SAASC,uBAAuBC,IAAe,EAAEC,SAAgC;IACtF,IAAIA,WAAWJ,WAAWK,GAAG,CAACF,MAAMC;SAC/BJ,WAAWM,MAAM,CAACH;AACzB;AAEA,iEAAiE,GACjE,OAAO,SAASI,kBAAkBJ,IAAe;QACxCH;IAAP,QAAOA,kBAAAA,WAAWQ,GAAG,CAACL,iBAAfH,kBAAwB;AACjC;AAEA,kFAAkF,GAClF,OAAO,eAAeS,sBACpBN,IAAe,EACfO,OAA8B;IAE9B,MAAMN,YAAYJ,WAAWQ,GAAG,CAACL;IACjC,OAAOC,YAAYA,UAAUM,WAAW;AAC1C;AAEA;;;;;;;;CAQC,GACD,OAAO,eAAeC,iBACpBD,OAAoE;IAEpE,OAAO,AAAC,MAAMX,eAAeW,QAAQE,SAAS,EAAEF,QAAQG,GAAG,EAAEH,QAAQI,MAAM,IACvE;QAAEC,QAAQjB;QAAwBkB,OAAOnB;IAAqB,IAC9D;AACN"}
@@ -0,0 +1,167 @@
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 AiCatalogEntry } from '../providers/catalog';
18
+ /**
19
+ * How long a generation takes, planned from what one answer costs in time
20
+ * (AGL-2907), so a step that generates can say how much time it needs before
21
+ * it starts.
22
+ *
23
+ * The job machine gives a step what is left of its caller's budget as an
24
+ * abort signal: the beat's sweep, or an inline door. A provider call that
25
+ * signal cuts off is still generated and billed upstream, while the meter
26
+ * records nothing. So a generation step registers the least time it needs
27
+ * (`registerAiJobStep(kind, runner, { minimumMs })`), and sizes its answer so
28
+ * its worst case — every model call it may make answered at its ceiling —
29
+ * fits inside that.
30
+ *
31
+ * ── Every model call, not only the answers (AGL-3036) ────────────────────
32
+ *
33
+ * A generation offered the site inventory may spend up to
34
+ * `AI_INVENTORY_LOOKUP_MAX_ROUNDS` model calls looking records up before it
35
+ * answers, each asked at the answer's ceiling. The doctrine's loop holds the
36
+ * whole generation — lookups, answer and re-ask — to one allowance of output,
37
+ * `AI_GENERATION_MAX_ATTEMPTS` times the ceiling, and asks each call for no
38
+ * more than is left of it. So the worst case is every call's wait for a first
39
+ * token, plus that allowance at the assumed rate, plus the step's own reads
40
+ * and writes: a lookup round adds a wait, and the output it spends is output
41
+ * no answer can.
42
+ *
43
+ * ── Declared assumptions, not measurements ───────────────────────────────
44
+ *
45
+ * No spec can time a provider, and no recorded run has measured one, so the
46
+ * two rates below are assumptions the budget is planned against, named as
47
+ * such here and in `docs/AI_JOBS.md`. They err slow: a real answer that
48
+ * outruns them only leaves time unused. A measured run replaces them.
49
+ */
50
+ /**
51
+ * ASSUMED: the slowest answer rate, in output tokens a second, that a step
52
+ * plans for on each catalog tier. An unknown model is planned at the slowest.
53
+ */
54
+ export declare const AI_JOB_ASSUMED_OUTPUT_TOKENS_PER_SECOND: Readonly<Record<AiCatalogEntry['tier'], number>>;
55
+ /**
56
+ * ASSUMED: how long a provider takes to start answering — reading a prompt
57
+ * whose static part is cached.
58
+ */
59
+ export declare const AI_JOB_ASSUMED_FIRST_TOKEN_MS = 3000;
60
+ /** The step's own reads and writes around its generation: the site read and the draft transaction. */
61
+ export declare const AI_JOB_STEP_OVERHEAD_MS = 3000;
62
+ /**
63
+ * How long an inline door — the console route that creates a job, and the one
64
+ * that resumes it — waits for the step it runs before handing the job to the
65
+ * beat. Inside the route's 60 s `maxDuration` with room for the ladder and the
66
+ * writes on either side; a step still running at the bound is aborted and
67
+ * re-queued, and the answer says `queued`. A step whose least time is more
68
+ * than this is never started there at all.
69
+ */
70
+ export declare const AI_JOB_INLINE_BUDGET_MS = 25000;
71
+ /**
72
+ * Wall clock one beat may spend running steps before it yields (AGL-3026).
73
+ *
74
+ * Bounded by the beat route's 300 s function ceiling, not by the beat's
75
+ * interval: what is left of it above this is the route's own work around the
76
+ * sweep — loading the plugin surfaces on a cold start, the lockdown read and
77
+ * the beat's mark, and the last step's record after its provider call. The
78
+ * slowest step is fitted to this budget (`AI_JOB_STEP_MAX_MINIMUM_MS`), never
79
+ * the budget to the step. The beat fires every minute whatever this is, and
80
+ * overlapping beats are kept apart by the lease.
81
+ */
82
+ export declare const AI_JOB_SWEEP_BUDGET_MS = 280000;
83
+ /**
84
+ * ASSUMED: what a sweep spends before it can start its first step — the two
85
+ * queue queries, on a function whose Firestore channel may still be cold.
86
+ */
87
+ export declare const AI_JOB_SWEEP_QUEUE_READ_MS = 4000;
88
+ /**
89
+ * The most time a step may register as its least (AGL-3036): what a beat can
90
+ * give the first step it starts. A step that needed more could never start,
91
+ * so a generation whose worst case at its routing ceiling needs more asks for
92
+ * less than that ceiling, as much as fits this.
93
+ */
94
+ export declare const AI_JOB_STEP_MAX_MINIMUM_MS: number;
95
+ /** The tier a model is planned at: its catalog tier, else the slowest. */
96
+ export declare function aiJobBudgetTier(model: string): AiCatalogEntry['tier'];
97
+ /** How long an answer of `tokens` output takes on a tier at the assumed rate. */
98
+ export declare function aiJobAssumedAnswerMs(tokens: number, tier: AiCatalogEntry['tier']): number;
99
+ /** The shape of one generation, as the worst case counts it. */
100
+ export interface AiGenerationShape {
101
+ /** Answers one generation may make: the first, and its re-ask. */
102
+ attempts?: number;
103
+ /**
104
+ * Inventory-lookup rounds it may spend before it answers (AGL-3036):
105
+ * `AI_INVENTORY_LOOKUP_MAX_ROUNDS` unless it says otherwise. A generation
106
+ * that carries no site inventory is offered no lookup and passes 0.
107
+ */
108
+ lookups?: number;
109
+ /** Time the step spends on reads of its own, beyond `AI_JOB_STEP_OVERHEAD_MS`. */
110
+ ownReadsMs?: number;
111
+ }
112
+ export interface AiGenerationTimeInput extends AiGenerationShape {
113
+ /** The model the step resolved: its tier decides the assumed rate. */
114
+ model: string;
115
+ }
116
+ /**
117
+ * The longest one generation can take at the assumed rates: every model call
118
+ * it may make — its lookup rounds, its answer and its re-ask — each waiting
119
+ * for its first token, and the allowance they share answered in full.
120
+ */
121
+ export declare function aiGenerationWorstCaseMs(input: AiGenerationTimeInput & {
122
+ maxTokens: number;
123
+ }): number;
124
+ /**
125
+ * The same worst case for any model of a tier: what a step registers as its
126
+ * least time from the tier its step kind is served from, before a job has
127
+ * resolved a model.
128
+ */
129
+ export declare function aiGenerationWorstCaseOnTierMs(input: AiGenerationShape & {
130
+ tier: AiCatalogEntry['tier'];
131
+ maxTokens: number;
132
+ }): number;
133
+ /**
134
+ * The largest answer ceiling whose worst case fits `budgetMs` on this model,
135
+ * and never more than `cap`. Zero when not even an empty answer fits.
136
+ */
137
+ export declare function aiGenerationMaxTokensWithin(input: AiGenerationTimeInput & {
138
+ budgetMs: number;
139
+ cap: number;
140
+ }): number;
141
+ /** A generation step's time budget: the least time it registers, and the ceiling it asks on each model. */
142
+ export interface AiJobStepBudget {
143
+ /**
144
+ * The step's worst case on the tier its step kind is served from, at the
145
+ * largest ceiling that tier may ask — never more than
146
+ * `AI_JOB_STEP_MAX_MINIMUM_MS`.
147
+ */
148
+ minimumMs: number;
149
+ /** The ceiling one answer asks on this model: the most whose worst case fits `minimumMs`. */
150
+ maxTokens(model: string): number;
151
+ }
152
+ /**
153
+ * The budget of a step that generates once a run (AGL-3035, AGL-3036), from
154
+ * the routing table's ceiling on the tier the step kind is served from.
155
+ *
156
+ * Where that worst case fits what a beat can give a step, it is the minimum,
157
+ * and the served tier asks the whole ceiling. Where it does not, the served
158
+ * tier asks the largest ceiling that fits, and the minimum is that ceiling's
159
+ * worst case. A slower tier asks less, so its worst case fits the same
160
+ * minimum; a faster one asks up to `cap` — the ceiling unless the step names a
161
+ * higher one — that the minimum still holds.
162
+ */
163
+ export declare function aiJobStepBudget(input: AiGenerationShape & {
164
+ tier: AiCatalogEntry['tier'];
165
+ maxTokens: number;
166
+ cap?: number;
167
+ }): AiJobStepBudget;
@@ -0,0 +1,161 @@
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 { aiCatalogEntry } from "../providers/catalog.js";
17
+ import { AI_GENERATION_MAX_ATTEMPTS } from "../runtime/ai-generation-bounds.js";
18
+ import { AI_INVENTORY_LOOKUP_MAX_ROUNDS } from "../tools/ai-inventory-lookup-tool.js";
19
+ /**
20
+ * How long a generation takes, planned from what one answer costs in time
21
+ * (AGL-2907), so a step that generates can say how much time it needs before
22
+ * it starts.
23
+ *
24
+ * The job machine gives a step what is left of its caller's budget as an
25
+ * abort signal: the beat's sweep, or an inline door. A provider call that
26
+ * signal cuts off is still generated and billed upstream, while the meter
27
+ * records nothing. So a generation step registers the least time it needs
28
+ * (`registerAiJobStep(kind, runner, { minimumMs })`), and sizes its answer so
29
+ * its worst case — every model call it may make answered at its ceiling —
30
+ * fits inside that.
31
+ *
32
+ * ── Every model call, not only the answers (AGL-3036) ────────────────────
33
+ *
34
+ * A generation offered the site inventory may spend up to
35
+ * `AI_INVENTORY_LOOKUP_MAX_ROUNDS` model calls looking records up before it
36
+ * answers, each asked at the answer's ceiling. The doctrine's loop holds the
37
+ * whole generation — lookups, answer and re-ask — to one allowance of output,
38
+ * `AI_GENERATION_MAX_ATTEMPTS` times the ceiling, and asks each call for no
39
+ * more than is left of it. So the worst case is every call's wait for a first
40
+ * token, plus that allowance at the assumed rate, plus the step's own reads
41
+ * and writes: a lookup round adds a wait, and the output it spends is output
42
+ * no answer can.
43
+ *
44
+ * ── Declared assumptions, not measurements ───────────────────────────────
45
+ *
46
+ * No spec can time a provider, and no recorded run has measured one, so the
47
+ * two rates below are assumptions the budget is planned against, named as
48
+ * such here and in `docs/AI_JOBS.md`. They err slow: a real answer that
49
+ * outruns them only leaves time unused. A measured run replaces them.
50
+ */ /**
51
+ * ASSUMED: the slowest answer rate, in output tokens a second, that a step
52
+ * plans for on each catalog tier. An unknown model is planned at the slowest.
53
+ */ export const AI_JOB_ASSUMED_OUTPUT_TOKENS_PER_SECOND = {
54
+ fast: 100,
55
+ balanced: 60,
56
+ deep: 40
57
+ };
58
+ /**
59
+ * ASSUMED: how long a provider takes to start answering — reading a prompt
60
+ * whose static part is cached.
61
+ */ export const AI_JOB_ASSUMED_FIRST_TOKEN_MS = 3000;
62
+ /** The step's own reads and writes around its generation: the site read and the draft transaction. */ export const AI_JOB_STEP_OVERHEAD_MS = 3000;
63
+ /**
64
+ * How long an inline door — the console route that creates a job, and the one
65
+ * that resumes it — waits for the step it runs before handing the job to the
66
+ * beat. Inside the route's 60 s `maxDuration` with room for the ladder and the
67
+ * writes on either side; a step still running at the bound is aborted and
68
+ * re-queued, and the answer says `queued`. A step whose least time is more
69
+ * than this is never started there at all.
70
+ */ export const AI_JOB_INLINE_BUDGET_MS = 25000;
71
+ /**
72
+ * Wall clock one beat may spend running steps before it yields (AGL-3026).
73
+ *
74
+ * Bounded by the beat route's 300 s function ceiling, not by the beat's
75
+ * interval: what is left of it above this is the route's own work around the
76
+ * sweep — loading the plugin surfaces on a cold start, the lockdown read and
77
+ * the beat's mark, and the last step's record after its provider call. The
78
+ * slowest step is fitted to this budget (`AI_JOB_STEP_MAX_MINIMUM_MS`), never
79
+ * the budget to the step. The beat fires every minute whatever this is, and
80
+ * overlapping beats are kept apart by the lease.
81
+ */ export const AI_JOB_SWEEP_BUDGET_MS = 280000;
82
+ /**
83
+ * ASSUMED: what a sweep spends before it can start its first step — the two
84
+ * queue queries, on a function whose Firestore channel may still be cold.
85
+ */ export const AI_JOB_SWEEP_QUEUE_READ_MS = 4000;
86
+ /**
87
+ * The most time a step may register as its least (AGL-3036): what a beat can
88
+ * give the first step it starts. A step that needed more could never start,
89
+ * so a generation whose worst case at its routing ceiling needs more asks for
90
+ * less than that ceiling, as much as fits this.
91
+ */ export const AI_JOB_STEP_MAX_MINIMUM_MS = AI_JOB_SWEEP_BUDGET_MS - AI_JOB_SWEEP_QUEUE_READ_MS;
92
+ /** The tier a model is planned at: its catalog tier, else the slowest. */ export function aiJobBudgetTier(model) {
93
+ var _ref;
94
+ var _aiCatalogEntry;
95
+ return (_ref = (_aiCatalogEntry = aiCatalogEntry(model)) == null ? void 0 : _aiCatalogEntry.tier) != null ? _ref : 'deep';
96
+ }
97
+ /** How long an answer of `tokens` output takes on a tier at the assumed rate. */ export function aiJobAssumedAnswerMs(tokens, tier) {
98
+ return Math.ceil(tokens * 1000 / AI_JOB_ASSUMED_OUTPUT_TOKENS_PER_SECOND[tier]);
99
+ }
100
+ function shapeOf(input) {
101
+ var _input_attempts, _input_lookups, _input_ownReadsMs;
102
+ return {
103
+ attempts: (_input_attempts = input.attempts) != null ? _input_attempts : AI_GENERATION_MAX_ATTEMPTS,
104
+ lookups: (_input_lookups = input.lookups) != null ? _input_lookups : AI_INVENTORY_LOOKUP_MAX_ROUNDS,
105
+ ownReadsMs: (_input_ownReadsMs = input.ownReadsMs) != null ? _input_ownReadsMs : 0
106
+ };
107
+ }
108
+ /** Everything a generation's worst case holds but its output: a first-token wait a call, and the step's own time. */ function fixedMs(shape) {
109
+ return (shape.attempts + shape.lookups) * AI_JOB_ASSUMED_FIRST_TOKEN_MS + AI_JOB_STEP_OVERHEAD_MS + shape.ownReadsMs;
110
+ }
111
+ function worstCaseMs(shape, tier, maxTokens) {
112
+ return fixedMs(shape) + shape.attempts * aiJobAssumedAnswerMs(maxTokens, tier);
113
+ }
114
+ function maxTokensWithin(shape, tier, budgetMs, cap) {
115
+ const perAnswerMs = Math.floor((budgetMs - fixedMs(shape)) / shape.attempts);
116
+ if (perAnswerMs <= 0) return 0;
117
+ return Math.min(cap, Math.floor(perAnswerMs * AI_JOB_ASSUMED_OUTPUT_TOKENS_PER_SECOND[tier] / 1000));
118
+ }
119
+ /**
120
+ * The longest one generation can take at the assumed rates: every model call
121
+ * it may make — its lookup rounds, its answer and its re-ask — each waiting
122
+ * for its first token, and the allowance they share answered in full.
123
+ */ export function aiGenerationWorstCaseMs(input) {
124
+ return worstCaseMs(shapeOf(input), aiJobBudgetTier(input.model), input.maxTokens);
125
+ }
126
+ /**
127
+ * The same worst case for any model of a tier: what a step registers as its
128
+ * least time from the tier its step kind is served from, before a job has
129
+ * resolved a model.
130
+ */ export function aiGenerationWorstCaseOnTierMs(input) {
131
+ return worstCaseMs(shapeOf(input), input.tier, input.maxTokens);
132
+ }
133
+ /**
134
+ * The largest answer ceiling whose worst case fits `budgetMs` on this model,
135
+ * and never more than `cap`. Zero when not even an empty answer fits.
136
+ */ export function aiGenerationMaxTokensWithin(input) {
137
+ return maxTokensWithin(shapeOf(input), aiJobBudgetTier(input.model), input.budgetMs, input.cap);
138
+ }
139
+ /**
140
+ * The budget of a step that generates once a run (AGL-3035, AGL-3036), from
141
+ * the routing table's ceiling on the tier the step kind is served from.
142
+ *
143
+ * Where that worst case fits what a beat can give a step, it is the minimum,
144
+ * and the served tier asks the whole ceiling. Where it does not, the served
145
+ * tier asks the largest ceiling that fits, and the minimum is that ceiling's
146
+ * worst case. A slower tier asks less, so its worst case fits the same
147
+ * minimum; a faster one asks up to `cap` — the ceiling unless the step names a
148
+ * higher one — that the minimum still holds.
149
+ */ export function aiJobStepBudget(input) {
150
+ var _input_cap;
151
+ const shape = shapeOf(input);
152
+ const cap = Math.max(input.maxTokens, (_input_cap = input.cap) != null ? _input_cap : input.maxTokens);
153
+ const served = Math.min(input.maxTokens, maxTokensWithin(shape, input.tier, AI_JOB_STEP_MAX_MINIMUM_MS, input.maxTokens));
154
+ const minimumMs = worstCaseMs(shape, input.tier, served);
155
+ return {
156
+ minimumMs,
157
+ maxTokens: (model)=>maxTokensWithin(shape, aiJobBudgetTier(model), minimumMs, cap)
158
+ };
159
+ }
160
+
161
+ //# sourceMappingURL=ai-job-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/jobs/ai-job-budget.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 { aiCatalogEntry, type AiCatalogEntry } from '../providers/catalog'\nimport { AI_GENERATION_MAX_ATTEMPTS } from '../runtime/ai-generation-bounds'\nimport { AI_INVENTORY_LOOKUP_MAX_ROUNDS } from '../tools/ai-inventory-lookup-tool'\n\n/**\n * How long a generation takes, planned from what one answer costs in time\n * (AGL-2907), so a step that generates can say how much time it needs before\n * it starts.\n *\n * The job machine gives a step what is left of its caller's budget as an\n * abort signal: the beat's sweep, or an inline door. A provider call that\n * signal cuts off is still generated and billed upstream, while the meter\n * records nothing. So a generation step registers the least time it needs\n * (`registerAiJobStep(kind, runner, { minimumMs })`), and sizes its answer so\n * its worst case — every model call it may make answered at its ceiling —\n * fits inside that.\n *\n * ── Every model call, not only the answers (AGL-3036) ────────────────────\n *\n * A generation offered the site inventory may spend up to\n * `AI_INVENTORY_LOOKUP_MAX_ROUNDS` model calls looking records up before it\n * answers, each asked at the answer's ceiling. The doctrine's loop holds the\n * whole generation — lookups, answer and re-ask — to one allowance of output,\n * `AI_GENERATION_MAX_ATTEMPTS` times the ceiling, and asks each call for no\n * more than is left of it. So the worst case is every call's wait for a first\n * token, plus that allowance at the assumed rate, plus the step's own reads\n * and writes: a lookup round adds a wait, and the output it spends is output\n * no answer can.\n *\n * ── Declared assumptions, not measurements ───────────────────────────────\n *\n * No spec can time a provider, and no recorded run has measured one, so the\n * two rates below are assumptions the budget is planned against, named as\n * such here and in `docs/AI_JOBS.md`. They err slow: a real answer that\n * outruns them only leaves time unused. A measured run replaces them.\n */\n\n/**\n * ASSUMED: the slowest answer rate, in output tokens a second, that a step\n * plans for on each catalog tier. An unknown model is planned at the slowest.\n */\nexport const AI_JOB_ASSUMED_OUTPUT_TOKENS_PER_SECOND: Readonly<\n Record<AiCatalogEntry['tier'], number>\n> = {\n fast: 100,\n balanced: 60,\n deep: 40,\n}\n\n/**\n * ASSUMED: how long a provider takes to start answering — reading a prompt\n * whose static part is cached.\n */\nexport const AI_JOB_ASSUMED_FIRST_TOKEN_MS = 3_000\n\n/** The step's own reads and writes around its generation: the site read and the draft transaction. */\nexport const AI_JOB_STEP_OVERHEAD_MS = 3_000\n\n/**\n * How long an inline door — the console route that creates a job, and the one\n * that resumes it — waits for the step it runs before handing the job to the\n * beat. Inside the route's 60 s `maxDuration` with room for the ladder and the\n * writes on either side; a step still running at the bound is aborted and\n * re-queued, and the answer says `queued`. A step whose least time is more\n * than this is never started there at all.\n */\nexport const AI_JOB_INLINE_BUDGET_MS = 25_000\n\n/**\n * Wall clock one beat may spend running steps before it yields (AGL-3026).\n *\n * Bounded by the beat route's 300 s function ceiling, not by the beat's\n * interval: what is left of it above this is the route's own work around the\n * sweep — loading the plugin surfaces on a cold start, the lockdown read and\n * the beat's mark, and the last step's record after its provider call. The\n * slowest step is fitted to this budget (`AI_JOB_STEP_MAX_MINIMUM_MS`), never\n * the budget to the step. The beat fires every minute whatever this is, and\n * overlapping beats are kept apart by the lease.\n */\nexport const AI_JOB_SWEEP_BUDGET_MS = 280_000\n\n/**\n * ASSUMED: what a sweep spends before it can start its first step — the two\n * queue queries, on a function whose Firestore channel may still be cold.\n */\nexport const AI_JOB_SWEEP_QUEUE_READ_MS = 4_000\n\n/**\n * The most time a step may register as its least (AGL-3036): what a beat can\n * give the first step it starts. A step that needed more could never start,\n * so a generation whose worst case at its routing ceiling needs more asks for\n * less than that ceiling, as much as fits this.\n */\nexport const AI_JOB_STEP_MAX_MINIMUM_MS = AI_JOB_SWEEP_BUDGET_MS - AI_JOB_SWEEP_QUEUE_READ_MS\n\n/** The tier a model is planned at: its catalog tier, else the slowest. */\nexport function aiJobBudgetTier(model: string): AiCatalogEntry['tier'] {\n return aiCatalogEntry(model)?.tier ?? 'deep'\n}\n\n/** How long an answer of `tokens` output takes on a tier at the assumed rate. */\nexport function aiJobAssumedAnswerMs(tokens: number, tier: AiCatalogEntry['tier']): number {\n return Math.ceil((tokens * 1_000) / AI_JOB_ASSUMED_OUTPUT_TOKENS_PER_SECOND[tier])\n}\n\n/** The shape of one generation, as the worst case counts it. */\nexport interface AiGenerationShape {\n /** Answers one generation may make: the first, and its re-ask. */\n attempts?: number\n /**\n * Inventory-lookup rounds it may spend before it answers (AGL-3036):\n * `AI_INVENTORY_LOOKUP_MAX_ROUNDS` unless it says otherwise. A generation\n * that carries no site inventory is offered no lookup and passes 0.\n */\n lookups?: number\n /** Time the step spends on reads of its own, beyond `AI_JOB_STEP_OVERHEAD_MS`. */\n ownReadsMs?: number\n}\n\nexport interface AiGenerationTimeInput extends AiGenerationShape {\n /** The model the step resolved: its tier decides the assumed rate. */\n model: string\n}\n\ninterface Shape {\n attempts: number\n lookups: number\n ownReadsMs: number\n}\n\nfunction shapeOf(input: AiGenerationShape): Shape {\n return {\n attempts: input.attempts ?? AI_GENERATION_MAX_ATTEMPTS,\n lookups: input.lookups ?? AI_INVENTORY_LOOKUP_MAX_ROUNDS,\n ownReadsMs: input.ownReadsMs ?? 0,\n }\n}\n\n/** Everything a generation's worst case holds but its output: a first-token wait a call, and the step's own time. */\nfunction fixedMs(shape: Shape): number {\n return (\n (shape.attempts + shape.lookups) * AI_JOB_ASSUMED_FIRST_TOKEN_MS +\n AI_JOB_STEP_OVERHEAD_MS +\n shape.ownReadsMs\n )\n}\n\nfunction worstCaseMs(shape: Shape, tier: AiCatalogEntry['tier'], maxTokens: number): number {\n return fixedMs(shape) + shape.attempts * aiJobAssumedAnswerMs(maxTokens, tier)\n}\n\nfunction maxTokensWithin(shape: Shape, tier: AiCatalogEntry['tier'], budgetMs: number, cap: number): number {\n const perAnswerMs = Math.floor((budgetMs - fixedMs(shape)) / shape.attempts)\n if (perAnswerMs <= 0) return 0\n return Math.min(cap, Math.floor((perAnswerMs * AI_JOB_ASSUMED_OUTPUT_TOKENS_PER_SECOND[tier]) / 1_000))\n}\n\n/**\n * The longest one generation can take at the assumed rates: every model call\n * it may make — its lookup rounds, its answer and its re-ask — each waiting\n * for its first token, and the allowance they share answered in full.\n */\nexport function aiGenerationWorstCaseMs(input: AiGenerationTimeInput & { maxTokens: number }): number {\n return worstCaseMs(shapeOf(input), aiJobBudgetTier(input.model), input.maxTokens)\n}\n\n/**\n * The same worst case for any model of a tier: what a step registers as its\n * least time from the tier its step kind is served from, before a job has\n * resolved a model.\n */\nexport function aiGenerationWorstCaseOnTierMs(\n input: AiGenerationShape & { tier: AiCatalogEntry['tier']; maxTokens: number },\n): number {\n return worstCaseMs(shapeOf(input), input.tier, input.maxTokens)\n}\n\n/**\n * The largest answer ceiling whose worst case fits `budgetMs` on this model,\n * and never more than `cap`. Zero when not even an empty answer fits.\n */\nexport function aiGenerationMaxTokensWithin(\n input: AiGenerationTimeInput & { budgetMs: number; cap: number },\n): number {\n return maxTokensWithin(shapeOf(input), aiJobBudgetTier(input.model), input.budgetMs, input.cap)\n}\n\n/** A generation step's time budget: the least time it registers, and the ceiling it asks on each model. */\nexport interface AiJobStepBudget {\n /**\n * The step's worst case on the tier its step kind is served from, at the\n * largest ceiling that tier may ask — never more than\n * `AI_JOB_STEP_MAX_MINIMUM_MS`.\n */\n minimumMs: number\n /** The ceiling one answer asks on this model: the most whose worst case fits `minimumMs`. */\n maxTokens(model: string): number\n}\n\n/**\n * The budget of a step that generates once a run (AGL-3035, AGL-3036), from\n * the routing table's ceiling on the tier the step kind is served from.\n *\n * Where that worst case fits what a beat can give a step, it is the minimum,\n * and the served tier asks the whole ceiling. Where it does not, the served\n * tier asks the largest ceiling that fits, and the minimum is that ceiling's\n * worst case. A slower tier asks less, so its worst case fits the same\n * minimum; a faster one asks up to `cap` — the ceiling unless the step names a\n * higher one — that the minimum still holds.\n */\nexport function aiJobStepBudget(\n input: AiGenerationShape & { tier: AiCatalogEntry['tier']; maxTokens: number; cap?: number },\n): AiJobStepBudget {\n const shape = shapeOf(input)\n const cap = Math.max(input.maxTokens, input.cap ?? input.maxTokens)\n const served = Math.min(\n input.maxTokens,\n maxTokensWithin(shape, input.tier, AI_JOB_STEP_MAX_MINIMUM_MS, input.maxTokens),\n )\n const minimumMs = worstCaseMs(shape, input.tier, served)\n return {\n minimumMs,\n maxTokens: (model) => maxTokensWithin(shape, aiJobBudgetTier(model), minimumMs, cap),\n }\n}\n"],"names":["aiCatalogEntry","AI_GENERATION_MAX_ATTEMPTS","AI_INVENTORY_LOOKUP_MAX_ROUNDS","AI_JOB_ASSUMED_OUTPUT_TOKENS_PER_SECOND","fast","balanced","deep","AI_JOB_ASSUMED_FIRST_TOKEN_MS","AI_JOB_STEP_OVERHEAD_MS","AI_JOB_INLINE_BUDGET_MS","AI_JOB_SWEEP_BUDGET_MS","AI_JOB_SWEEP_QUEUE_READ_MS","AI_JOB_STEP_MAX_MINIMUM_MS","aiJobBudgetTier","model","tier","aiJobAssumedAnswerMs","tokens","Math","ceil","shapeOf","input","attempts","lookups","ownReadsMs","fixedMs","shape","worstCaseMs","maxTokens","maxTokensWithin","budgetMs","cap","perAnswerMs","floor","min","aiGenerationWorstCaseMs","aiGenerationWorstCaseOnTierMs","aiGenerationMaxTokensWithin","aiJobStepBudget","max","served","minimumMs"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,cAAc,QAA6B,0BAAsB;AAC1E,SAASC,0BAA0B,QAAQ,qCAAiC;AAC5E,SAASC,8BAA8B,QAAQ,uCAAmC;AAElF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BC,GAED;;;CAGC,GACD,OAAO,MAAMC,0CAET;IACFC,MAAM;IACNC,UAAU;IACVC,MAAM;AACR,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMC,gCAAgC,KAAK;AAElD,oGAAoG,GACpG,OAAO,MAAMC,0BAA0B,KAAK;AAE5C;;;;;;;CAOC,GACD,OAAO,MAAMC,0BAA0B,MAAM;AAE7C;;;;;;;;;;CAUC,GACD,OAAO,MAAMC,yBAAyB,OAAO;AAE7C;;;CAGC,GACD,OAAO,MAAMC,6BAA6B,KAAK;AAE/C;;;;;CAKC,GACD,OAAO,MAAMC,6BAA6BF,yBAAyBC,2BAA0B;AAE7F,wEAAwE,GACxE,OAAO,SAASE,gBAAgBC,KAAa;;QACpCd;IAAP,gBAAOA,kBAAAA,eAAec,2BAAfd,gBAAuBe,IAAI,mBAAI;AACxC;AAEA,+EAA+E,GAC/E,OAAO,SAASC,qBAAqBC,MAAc,EAAEF,IAA4B;IAC/E,OAAOG,KAAKC,IAAI,CAAC,AAACF,SAAS,OAASd,uCAAuC,CAACY,KAAK;AACnF;AA2BA,SAASK,QAAQC,KAAwB;QAE3BA,iBACDA,gBACGA;IAHd,OAAO;QACLC,QAAQ,GAAED,kBAAAA,MAAMC,QAAQ,YAAdD,kBAAkBpB;QAC5BsB,OAAO,GAAEF,iBAAAA,MAAME,OAAO,YAAbF,iBAAiBnB;QAC1BsB,UAAU,GAAEH,oBAAAA,MAAMG,UAAU,YAAhBH,oBAAoB;IAClC;AACF;AAEA,mHAAmH,GACnH,SAASI,QAAQC,KAAY;IAC3B,OACE,AAACA,CAAAA,MAAMJ,QAAQ,GAAGI,MAAMH,OAAO,AAAD,IAAKhB,gCACnCC,0BACAkB,MAAMF,UAAU;AAEpB;AAEA,SAASG,YAAYD,KAAY,EAAEX,IAA4B,EAAEa,SAAiB;IAChF,OAAOH,QAAQC,SAASA,MAAMJ,QAAQ,GAAGN,qBAAqBY,WAAWb;AAC3E;AAEA,SAASc,gBAAgBH,KAAY,EAAEX,IAA4B,EAAEe,QAAgB,EAAEC,GAAW;IAChG,MAAMC,cAAcd,KAAKe,KAAK,CAAC,AAACH,CAAAA,WAAWL,QAAQC,MAAK,IAAKA,MAAMJ,QAAQ;IAC3E,IAAIU,eAAe,GAAG,OAAO;IAC7B,OAAOd,KAAKgB,GAAG,CAACH,KAAKb,KAAKe,KAAK,CAAC,AAACD,cAAc7B,uCAAuC,CAACY,KAAK,GAAI;AAClG;AAEA;;;;CAIC,GACD,OAAO,SAASoB,wBAAwBd,KAAoD;IAC1F,OAAOM,YAAYP,QAAQC,QAAQR,gBAAgBQ,MAAMP,KAAK,GAAGO,MAAMO,SAAS;AAClF;AAEA;;;;CAIC,GACD,OAAO,SAASQ,8BACdf,KAA8E;IAE9E,OAAOM,YAAYP,QAAQC,QAAQA,MAAMN,IAAI,EAAEM,MAAMO,SAAS;AAChE;AAEA;;;CAGC,GACD,OAAO,SAASS,4BACdhB,KAAgE;IAEhE,OAAOQ,gBAAgBT,QAAQC,QAAQR,gBAAgBQ,MAAMP,KAAK,GAAGO,MAAMS,QAAQ,EAAET,MAAMU,GAAG;AAChG;AAcA;;;;;;;;;;CAUC,GACD,OAAO,SAASO,gBACdjB,KAA4F;QAGtDA;IADtC,MAAMK,QAAQN,QAAQC;IACtB,MAAMU,MAAMb,KAAKqB,GAAG,CAAClB,MAAMO,SAAS,GAAEP,aAAAA,MAAMU,GAAG,YAATV,aAAaA,MAAMO,SAAS;IAClE,MAAMY,SAAStB,KAAKgB,GAAG,CACrBb,MAAMO,SAAS,EACfC,gBAAgBH,OAAOL,MAAMN,IAAI,EAAEH,4BAA4BS,MAAMO,SAAS;IAEhF,MAAMa,YAAYd,YAAYD,OAAOL,MAAMN,IAAI,EAAEyB;IACjD,OAAO;QACLC;QACAb,WAAW,CAACd,QAAUe,gBAAgBH,OAAOb,gBAAgBC,QAAQ2B,WAAWV;IAClF;AACF"}
@@ -0,0 +1,108 @@
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 { PluginDraftRecord } from '@aglyn/aglyn/plugin-manager/plugin-resource-drafts';
18
+ import type { AiJob, AiJobOutput } from '../model/ai-jobs.types';
19
+ import { readSiteInventory } from '../runtime/site-inventory';
20
+ import { type AiJobAdmission } from './ai-job-admission';
21
+ import { type AiEmailCopy } from './ai-job-email-step';
22
+ import { type AiPluginDraftWriterLookup } from './ai-job-plugin-drafts';
23
+ import type { AiJobStepRunner } from './ai-job-text-step';
24
+ /**
25
+ * The campaign step (AGL-2912): one brief becomes an email design AND the
26
+ * draft campaign that would send it.
27
+ *
28
+ * A campaign is an unplanned kind — there is one thing to build and a plan
29
+ * over it would be a plan of one — so the job runs this step alone, and the
30
+ * design it writes is the email step's, generated through `generateAiEmail`
31
+ * so both kinds obey the same doctrine and the same email rules.
32
+ *
33
+ * ## Nothing is sent, and nothing is aimed
34
+ *
35
+ * The campaign is written `draft`, with no audience, no schedule and no
36
+ * sender: a draft campaign is not a queued one, the scheduled processor
37
+ * queries `status == 'scheduled'`, and the send route is the only thing that
38
+ * mails a campaign. Choosing WHO receives it stays a person's decision, so
39
+ * the model is never shown the org's lists, its contacts or what past sends
40
+ * did. Code reads the list the brief names and the send time that list's own
41
+ * history suggests, AFTER the answer, and both reach the person as the
42
+ * output's `note` — never the prompt.
43
+ *
44
+ * ## Where campaign email begins
45
+ *
46
+ * A site whose plan sends no campaign email can still generate email designs;
47
+ * the campaign is the part that needs somewhere to send. So the step gates on
48
+ * the same entitlement the composer and the send route read, and stops the
49
+ * job for a person rather than failing it. The refusal names no plan, because
50
+ * the billing page is the one place that does.
51
+ *
52
+ * ## Run again and it finds its drafts
53
+ *
54
+ * Each write is keyed by the id the job recorded for its draft when it was
55
+ * created, so a run cut off between them finds what it wrote: two drafts are
56
+ * reported, a design alone is drafted into a campaign from the copy the
57
+ * design already stores, and neither spends.
58
+ */
59
+ /** The id the marketing plugin is registered under. */
60
+ export declare const AI_CAMPAIGN_PLUGIN_ID = "marketing";
61
+ /** The resource the marketing plugin writes a draft campaign under. */
62
+ export declare const AI_CAMPAIGN_RESOURCE = "campaign";
63
+ /** A campaign's name when neither the job nor its subject lines give one. */
64
+ export declare const AI_JOB_CAMPAIGN_DEFAULT_NAME = "New campaign";
65
+ /** A job's failure when the site has no campaign writer. */
66
+ export declare const AI_CAMPAIGN_UNAVAILABLE_COPY = "Campaigns are not available on this site.";
67
+ /** A job's failure when a campaign whose email was written could not be drafted. */
68
+ export declare const AI_CAMPAIGN_SAVE_FAILURE_COPY = "The email was written but the campaign could not be drafted. Try the job again.";
69
+ /**
70
+ * What a person is told when their plan sends no campaign email. It names the
71
+ * page that sells the answer rather than a plan, so the one place plan names
72
+ * are written stays the one place they are read.
73
+ */
74
+ export declare const AI_CAMPAIGN_PLAN_REFUSAL: string;
75
+ /** Whether this workspace may send campaign email at all: the composer's and the send route's check. */
76
+ export declare function aiCampaignPlanAllows(org: object | null): boolean;
77
+ /** The campaign as the job's output, carrying what the person still decides. */
78
+ export declare function aiCampaignOutput(record: PluginDraftRecord, place: {
79
+ hostId: string;
80
+ hostSubdomain: string | null;
81
+ }, note: string | null): AiJobOutput;
82
+ /** The subject lines and preheaders a written design already stores. */
83
+ export declare function aiCampaignCopyFromDesign(record: PluginDraftRecord): AiEmailCopy;
84
+ /** The campaign's content: the design it sends, and the copy the send fills its headers from. */
85
+ export declare function aiCampaignDraftContent(designId: string, copy: AiEmailCopy): Record<string, unknown>;
86
+ /** A campaign job's name: what the member asked for, else its strongest subject line. */
87
+ export declare function aiCampaignName(job: Pick<AiJob, 'inputs'>, copy: AiEmailCopy): string;
88
+ /**
89
+ * A campaign job is admitted for a site of its org with email and marketing
90
+ * on, room for a design and a campaign, and a plan that sends campaign email.
91
+ */
92
+ export declare const aiCampaignJobAdmission: AiJobAdmission;
93
+ export interface AiJobCampaignStepDeps {
94
+ /** The inventory reader; specs hand in a fake. */
95
+ readInventory?: typeof readSiteInventory;
96
+ /** How a resource's draft writer is found; the core's registry otherwise. */
97
+ writerFor?: AiPluginDraftWriterLookup;
98
+ }
99
+ export declare function createAiJobCampaignStep(deps?: AiJobCampaignStepDeps): AiJobStepRunner;
100
+ export declare const runAiJobCampaignStep: AiJobStepRunner;
101
+ /**
102
+ * The least time one campaign step needs before it starts (AGL-3035): the
103
+ * email generation it drafts the campaign's design with, on the campaign's own
104
+ * routing row. Writing the draft campaign asks no model.
105
+ */
106
+ export declare const AI_JOB_CAMPAIGN_STEP_MINIMUM_MS: number;
107
+ /** Registers the campaign step and the check a campaign job passes before it is created or resumed. */
108
+ export declare function registerAiCampaignJob(): void;