@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,734 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ import { createHash } from "node:crypto";
18
+ import { pluginRecordFactsReader } from "@aglyn/aglyn/plugin-manager/plugin-record-facts";
19
+ import { AI_CRM_ANSWER_RETENTION_DAYS, AI_CRM_ANSWERS_COLLECTION, AI_CRM_EMAIL_REQUEST_MAX_CHARS, AI_CRM_OUTPUT_IDS, AI_CRM_PLUGIN_ID, aiCrmAnswerExpiry, parseAiCrmRequest, readAiCrmProposal } from "../model/ai-crm.js";
20
+ import { AI_STEP_TIERS } from "../providers/catalog.js";
21
+ import { AI_ROUTING_TABLE, aiModelForStep } from "../providers/routing.js";
22
+ import { aiDoctrineScopeFor, aiDoctrineSystemBlocks, runValidatedGeneration } from "../runtime/ai-doctrine.js";
23
+ import { AI_CRM_EMAIL_TOOL, AI_CRM_EMAIL_TOOL_NAME, AI_CRM_MAPPING_TOOL, AI_CRM_MAPPING_TOOL_NAME, AI_CRM_RECORD_TOOL_NAME, aiCrmEmailMergeFields, aiCrmImportFields, aiCrmRecordCheckContext, aiCrmRecordTool, checkAiCrmEmail, checkAiCrmMapping, checkAiCrmRecord } from "../tools/ai-crm-tool.js";
24
+ import { AI_CRM_UNAVAILABLE_COPY, aiCrmAccessRefusal, aiCrmFactsResource } from "./ai-crm-access.js";
25
+ import { registerAiJobAdmission } from "./ai-job-admission.js";
26
+ import { aiJobStepBudget } from "./ai-job-budget.js";
27
+ import { aiGenerationSpent, aiUnspentOutcome } from "./ai-job-generation.js";
28
+ import { registerAiJobStep } from "./ai-jobs.js";
29
+ /**
30
+ * The `crm` step (AGL-2917): CRM by AI, as proposals.
31
+ *
32
+ * `inputs.task` says what the job is asked (`model/ai-crm.ts`):
33
+ *
34
+ * - `record` — one contact, company, deal or lead (`record`, `recordId`): a
35
+ * summary, the next step as a task, a deal's stage, a lead's standing;
36
+ * - `email` — a draft for the CRM composer, from what the member asked for
37
+ * (the brief) and the record's facts;
38
+ * - `mapping` — an import's columns (`collection`, `columns`) matched to the
39
+ * fields the CRM's import fills.
40
+ *
41
+ * ## The CRM decides what is read
42
+ *
43
+ * The step never reads a CRM document. It asks the CRM's readers on the core's
44
+ * record-facts seam for the job's creator, and the CRM applies its own rules —
45
+ * the member's reach and `data.manage`, the plan, the record's visibility on
46
+ * the site — and reports the facts it chooses to. The admission below asks the
47
+ * same reader before the job exists, beside what an in-process call skips of
48
+ * the plugin API dispatcher: the CRM switched on and released where the job
49
+ * runs. A mapping sends the file's headers and each column's shape, never a
50
+ * cell.
51
+ *
52
+ * ## It writes no CRM record
53
+ *
54
+ * The CRM's task form, stage route, composer and import drawer are the
55
+ * writes, and a member makes each one. No email is sent by a job.
56
+ *
57
+ * ## The answer is kept apart from the job
58
+ *
59
+ * Every member of a workspace may read its jobs, and not every member may
60
+ * read every record. So a job's output names only the question — which
61
+ * record, which import — and the answer is kept at
62
+ * `orgs/{orgId}/aiCrmAnswers/{jobId}`, which no client may read, for two
63
+ * weeks (`AI_CRM_ANSWER_RETENTION_DAYS`). The answer door
64
+ * (`server/ai-crm-answer.ts`) serves it to a member the CRM still lets read
65
+ * the record, asking the same reader again.
66
+ *
67
+ * ## A summary is asked once per timeline
68
+ *
69
+ * A record answer is keyed on the whole request — the record, the site, the
70
+ * model, the rules, the tool and the facts as the CRM reported them — and a
71
+ * later job whose key matches a kept answer reuses it and spends nothing.
72
+ * The facts change exactly when something the model was told changes, so an
73
+ * unchanged record is never asked twice while its answer is kept.
74
+ */ /**
75
+ * ASSUMED: the step's own round trips — the facts read (the record and its
76
+ * three windowed queries, in parallel), a record's reuse lookup, and the
77
+ * answer's write.
78
+ */ export const AI_CRM_FACTS_READS_MS = 1500;
79
+ /**
80
+ * The step's time (AGL-3035): one generation and its re-ask on the tier
81
+ * `job.crm` is served from, after the facts read, with no site inventory and
82
+ * so no lookup round. It fits an inline door's budget, so a member who asks on
83
+ * a record page is answered in the request.
84
+ */ export const AI_JOB_CRM_STEP_BUDGET = aiJobStepBudget({
85
+ tier: AI_STEP_TIERS['job.crm'],
86
+ maxTokens: AI_ROUTING_TABLE['job.crm'].maxTokens,
87
+ lookups: 0,
88
+ ownReadsMs: AI_CRM_FACTS_READS_MS
89
+ });
90
+ /** The least time one CRM step needs before it starts. */ export const AI_JOB_CRM_STEP_MINIMUM_MS = AI_JOB_CRM_STEP_BUDGET.minimumMs;
91
+ /** Kept answers to one request a reuse lookup reads. */ export const AI_CRM_REUSE_CANDIDATES = 20;
92
+ /** How long a record answer stays reusable, beside its facts being unchanged: as long as it is kept. */ export const AI_CRM_REUSE_WINDOW_MS = AI_CRM_ANSWER_RETENTION_DAYS * 24 * 60 * 60000;
93
+ export const AI_CRM_FACTS_FAILURE_COPY = 'The CRM record could not be read. Try again.';
94
+ export const AI_CRM_KEEP_FAILURE_COPY = 'The answer could not be kept. Try again.';
95
+ /** The generation kinds the step asks under, which the doctrine states only its field rules to. */ export const AI_CRM_GENERATION_KINDS = {
96
+ record: 'crm-record',
97
+ email: 'crm-email',
98
+ mapping: 'crm-mapping'
99
+ };
100
+ const OUTPUT_LABELS = {
101
+ record: 'CRM summary',
102
+ email: 'CRM email draft',
103
+ mapping: 'Import column matches'
104
+ };
105
+ /* ------------------------------------------------------------------------ *
106
+ * The rules
107
+ * ------------------------------------------------------------------------ */ const WRITE_ONLY_FROM_FACTS = 'Write only from the facts. Never invent an event, a date, an amount, a name or a promise the facts do not state, and write dates as the facts do.';
108
+ const NEXT_STEP_RULE = 'nextStep: the one task that should come next, or null when an open task already covers it or nothing is worth doing. Its title starts with a verb, and its reason names the fact behind it.';
109
+ const LANGUAGE_RULE = 'Write in the language of the facts’ notes and timeline.';
110
+ function rulesBlock(opening, toolName, rules) {
111
+ return [
112
+ {
113
+ text: `${opening}\n\n` + `Answer by calling ${toolName} exactly once. A reply in prose cannot be used.\n\n` + `Rules:\n${rules.map((rule)=>`- ${rule}`).join('\n')}`,
114
+ cacheBreakpoint: true
115
+ }
116
+ ];
117
+ }
118
+ /**
119
+ * The rules for a record of one kind. Each kind is sent the rules its tool can
120
+ * be refused for, and no others: on a model that caches no prompt this short,
121
+ * a rule a request cannot break is paid for on every request.
122
+ */ export function aiCrmRecordInstructions(kind) {
123
+ const opening = `You help a small business's team work its customer records. You are given one ${kind} a team member opened, as facts read from their CRM.`;
124
+ const rules = kind === 'lead' ? [
125
+ WRITE_ONLY_FROM_FACTS,
126
+ 'summary: two sentences at most: how the lead came in, what it did, and when it was last seen.',
127
+ 'standing: two sentences at most on why the lead stands where it does: its status, how it came in, and how often and how recently it was active. There is no lead score; never give one.',
128
+ LANGUAGE_RULE
129
+ ] : [
130
+ WRITE_ONLY_FROM_FACTS,
131
+ `summary: two sentences at most: when the ${kind} was last in touch and how, and what is still open.`,
132
+ NEXT_STEP_RULE,
133
+ ...kind === 'deal' ? [
134
+ 'stage: the open stage the deal should move to, by its id in the facts, only when the timeline shows the deal has moved there; otherwise null, and always null for a deal that is won or lost. Never propose winning or losing a deal.'
135
+ ] : [],
136
+ LANGUAGE_RULE
137
+ ];
138
+ return rulesBlock(opening, AI_CRM_RECORD_TOOL_NAME, rules);
139
+ }
140
+ export const AI_CRM_EMAIL_INSTRUCTIONS = rulesBlock('You draft a one-to-one email that a team member reviews, edits and sends themselves from a customer record in their CRM. Nothing is sent until they press Send.', AI_CRM_EMAIL_TOOL_NAME, [
141
+ 'Write what the team member asks for, from the record’s facts. Never invent a price, a date, an offer, a meeting time or a promise that neither states.',
142
+ 'body: plain text in short paragraphs separated by a blank line, with no markdown, no links and no signature block beyond the sign-off.',
143
+ 'Greet the person and sign off only with the merge fields the request lists, written exactly as listed. Use no other merge field.',
144
+ 'Never write an email address or a phone number.',
145
+ 'Write in the language of the team member’s request.'
146
+ ]);
147
+ export const AI_CRM_MAPPING_INSTRUCTIONS = rulesBlock('You match the columns of a spreadsheet a team member is importing into their CRM to the fields the import fills. You are given each column’s header and the shape of its values, never the values.', AI_CRM_MAPPING_TOOL_NAME, [
148
+ 'Match a column only to a field the request lists, both by their numbers, and only when the column’s header says it holds that field. Leave out a column no field fits.',
149
+ 'A field takes at most one column, and a column one field.',
150
+ 'A column’s shape must suit its field: an email field takes an email column; a phone field a phone or number column; a number, date or yes-no field a column of that shape. Only an email field takes an email column. An empty column takes any field its header names.'
151
+ ]);
152
+ /* ------------------------------------------------------------------------ *
153
+ * The facts, as the model reads them
154
+ * ------------------------------------------------------------------------ */ const text = (value)=>typeof value === 'string' ? value : '';
155
+ const list = (value)=>Array.isArray(value) ? value.filter((entry)=>Boolean(entry) && typeof entry === 'object') : [];
156
+ const words = (value)=>Array.isArray(value) ? value.map(text).filter(Boolean) : [];
157
+ function line(label, value) {
158
+ const shown = typeof value === 'number' ? String(value) : text(value);
159
+ return shown ? [
160
+ `${label}: ${shown}`
161
+ ] : [];
162
+ }
163
+ function timelineLines(value) {
164
+ const entries = list(value);
165
+ if (!entries.length) return [
166
+ 'Timeline: nothing logged or captured yet'
167
+ ];
168
+ return [
169
+ 'Timeline, newest first:',
170
+ ...entries.map((entry)=>{
171
+ const detail = [
172
+ text(entry['direction']),
173
+ text(entry['delivery']),
174
+ text(entry['outcome'])
175
+ ].filter(Boolean);
176
+ const subject = text(entry['subject']);
177
+ return `- ${text(entry['on'])} ${text(entry['kind'])}` + (detail.length ? ` (${detail.join(', ')})` : '') + (subject || entry['text'] ? ':' : '') + (subject ? ` "${subject}"` : '') + (text(entry['text']) ? ` ${text(entry['text'])}` : '');
178
+ })
179
+ ];
180
+ }
181
+ function taskLines(value) {
182
+ const tasks = list(value);
183
+ if (!tasks.length) return [
184
+ 'Open tasks: none'
185
+ ];
186
+ return [
187
+ 'Open tasks:',
188
+ ...tasks.map((task)=>`- ${text(task['title'])} (${[
189
+ text(task['kind']),
190
+ `${text(task['priority']) || 'normal'} priority`,
191
+ task['due'] ? `due ${text(task['due'])}` : 'no due date',
192
+ ...task['overdue'] === true ? [
193
+ 'overdue'
194
+ ] : []
195
+ ].join(', ')})`)
196
+ ];
197
+ }
198
+ function dealLines(value) {
199
+ const deals = list(value);
200
+ if (!deals.length) return [
201
+ 'Deals: none'
202
+ ];
203
+ return [
204
+ 'Deals:',
205
+ ...deals.map((deal)=>`- ${text(deal['title'])}: ${[
206
+ text(deal['stage']),
207
+ text(deal['status']),
208
+ text(deal['amount']),
209
+ deal['expectedClose'] ? `expected to close ${text(deal['expectedClose'])}` : ''
210
+ ].filter(Boolean).join(', ')}`)
211
+ ];
212
+ }
213
+ /**
214
+ * The facts as lines of text. Only the fields named here are written, whatever
215
+ * else a reader reports, so what reaches a prompt is decided in two places
216
+ * that both have to agree: the CRM's builders and this list.
217
+ */ export function aiCrmFactsLines(kind, facts) {
218
+ if (kind === 'contact') {
219
+ const orders = Number(facts['orders']) || 0;
220
+ return [
221
+ ...line('Contact', facts['name']),
222
+ ...line('Job title', facts['jobTitle']),
223
+ ...line('Company', facts['company']),
224
+ ...line('Lifecycle stage', facts['lifecycleStage']),
225
+ ...line('Tags', words(facts['tags']).join(', ')),
226
+ ...line('Came in through', words(facts['sources']).join(', ')),
227
+ ...orders ? [
228
+ `Orders: ${orders}${facts['lastPurchase'] ? `, the last on ${text(facts['lastPurchase'])}` : ''}`
229
+ ] : [],
230
+ ...line('In the CRM since', facts['since']),
231
+ ...line('Last opened or clicked an email', facts['lastEmailEngagement']),
232
+ ...line('Notes', facts['notes']),
233
+ ...timelineLines(facts['timeline']),
234
+ ...taskLines(facts['openTasks']),
235
+ ...dealLines(facts['deals'])
236
+ ];
237
+ }
238
+ if (kind === 'company') {
239
+ return [
240
+ ...line('Company', facts['name']),
241
+ ...line('Domain', facts['domain']),
242
+ ...line('Industry', facts['industry']),
243
+ ...line('Tags', words(facts['tags']).join(', ')),
244
+ ...line('People in the CRM', facts['people']),
245
+ ...line('In the CRM since', facts['since']),
246
+ ...line('Notes', facts['notes']),
247
+ ...timelineLines(facts['timeline']),
248
+ ...taskLines(facts['openTasks']),
249
+ ...dealLines(facts['deals'])
250
+ ];
251
+ }
252
+ if (kind === 'deal') {
253
+ const stages = list(facts['stages']);
254
+ const withWhom = [
255
+ text(facts['contact']),
256
+ text(facts['company'])
257
+ ].filter(Boolean).join(' at ');
258
+ return [
259
+ ...line('Deal', facts['title']),
260
+ ...line('Pipeline', facts['pipeline']),
261
+ ...line('Status', facts['status']),
262
+ ...line('Stage', facts['stage'] ? `${text(facts['stage'])} (id ${text(facts['stageId'])})` : ''),
263
+ ...line('Stages in order', stages.map((stage)=>`${text(stage['id'])} "${text(stage['name'])}" (${text(stage['kind'])})`).join('; ')),
264
+ ...line('In this stage since', facts['inStageSince']),
265
+ ...line('Amount', facts['amount']),
266
+ ...line('Expected to close', facts['expectedClose']),
267
+ ...line('Lost reason', facts['lostReason']),
268
+ ...line('With', withWhom),
269
+ ...line('Products on the deal', Number(facts['products']) || ''),
270
+ ...line('In the CRM since', facts['since']),
271
+ ...line('Notes', facts['notes']),
272
+ ...timelineLines(facts['timeline']),
273
+ ...taskLines(facts['openTasks'])
274
+ ];
275
+ }
276
+ return [
277
+ ...line('Lead', facts['name']),
278
+ ...line('Status', facts['status']),
279
+ ...line('Captured through', words(facts['sources']).join(', ')),
280
+ ...line('Captures', Number(facts['captures']) || ''),
281
+ ...line('First seen', facts['firstSeen']),
282
+ ...line('Last seen', facts['lastSeen']),
283
+ `Assigned to a teammate: ${facts['assigned'] === true ? 'yes' : 'no'}`,
284
+ `Converted to a contact: ${facts['converted'] === true ? 'yes' : 'no'}`,
285
+ ...line('Unqualified reason', facts['unqualifiedReason']),
286
+ ...line('Notes', facts['notes']),
287
+ ...timelineLines(facts['timeline'])
288
+ ];
289
+ }
290
+ /** The user turn for a record. */ export function aiCrmRecordPrompt(kind, facts) {
291
+ return [
292
+ `Record: ${kind}`,
293
+ ...aiCrmFactsLines(kind, facts)
294
+ ].join('\n');
295
+ }
296
+ /** The user turn for an email draft. */ export function aiCrmEmailPrompt(input) {
297
+ return [
298
+ `Record: ${input.kind}`,
299
+ `Merge fields: ${aiCrmEmailMergeFields(input.kind).map((key)=>`{{${key}}}`).join(', ')}`,
300
+ `The team member asks: ${input.request.replace(/\s+/g, ' ').trim().slice(0, AI_CRM_EMAIL_REQUEST_MAX_CHARS)}`,
301
+ '',
302
+ 'Facts:',
303
+ ...aiCrmFactsLines(input.kind, input.facts)
304
+ ].join('\n');
305
+ }
306
+ /** The user turn for an import's columns. */ export function aiCrmMappingPrompt(input) {
307
+ return [
308
+ `Import: ${input.collection}`,
309
+ 'Fields (number: label, type):',
310
+ ...input.fields.map((field, index)=>`- ${index}: ${field.label}, ${field.type}${field.required ? ', required' : ''}`),
311
+ 'Columns (number: header, shape):',
312
+ ...input.columns.map((column, index)=>`- ${index}: ${column.header || '(no header)'}, ${column.shape}`)
313
+ ].join('\n');
314
+ }
315
+ /* ------------------------------------------------------------------------ *
316
+ * A record answer, asked once per timeline
317
+ * ------------------------------------------------------------------------ */ /**
318
+ * A digest of the whole request a record answer is produced for. A hash of the
319
+ * request, never of the answer, and nothing of the facts is recoverable from
320
+ * it. The version tag strands every old key when what a key means changes.
321
+ */ export function aiCrmRecordKey(input) {
322
+ var _input_hostId;
323
+ const digest = createHash('sha256');
324
+ for (const part of [
325
+ 'crm-record.v1',
326
+ input.kind,
327
+ input.id,
328
+ (_input_hostId = input.hostId) != null ? _input_hostId : '',
329
+ input.model,
330
+ input.prompt,
331
+ ...input.system.map((block)=>block.text),
332
+ JSON.stringify(input.tool)
333
+ ]){
334
+ digest.update(`${part.length}:${part}\u0000`);
335
+ }
336
+ return digest.digest('hex');
337
+ }
338
+ const millis = (value)=>{
339
+ if (value instanceof Date) return value.getTime();
340
+ const toMillis = value == null ? void 0 : value.toMillis;
341
+ return typeof toMillis === 'function' ? toMillis.call(value) : null;
342
+ };
343
+ /**
344
+ * The finder the step uses in production: one equality on the request key
345
+ * inside the org's kept answers. Firestore's automatic single-field index
346
+ * answers it, so no composite index is deployed; the site and the window are
347
+ * applied in memory.
348
+ */ export const findAiCrmAnswersByKey = async (orgId, key, firestore)=>{
349
+ if (!firestore) return [];
350
+ const snapshot = await firestore.collection('orgs').doc(orgId).collection(AI_CRM_ANSWERS_COLLECTION).where('key', '==', key).limit(AI_CRM_REUSE_CANDIDATES).get();
351
+ return snapshot.docs.map((doc)=>{
352
+ var _doc_data, _data_hostId, _data_task, _data_key;
353
+ const data = (_doc_data = doc.data()) != null ? _doc_data : {};
354
+ return {
355
+ jobId: doc.id,
356
+ hostId: (_data_hostId = data.hostId) != null ? _data_hostId : null,
357
+ task: String((_data_task = data.task) != null ? _data_task : ''),
358
+ key: (_data_key = data.key) != null ? _data_key : null,
359
+ createdAtMs: millis(data.createdAt),
360
+ proposal: readAiCrmProposal(data.proposal)
361
+ };
362
+ });
363
+ };
364
+ /** The newest answer another job kept for the same request, inside the window. */ export function aiReusableCrmRecord(candidates, context) {
365
+ const floor = context.now.getTime() - AI_CRM_REUSE_WINDOW_MS;
366
+ let best = null;
367
+ for (const candidate of candidates){
368
+ var _candidate_createdAtMs;
369
+ var _candidate_proposal;
370
+ if (candidate.jobId === context.jobId || candidate.task !== 'record') continue;
371
+ if (candidate.hostId !== context.hostId || candidate.key !== context.key) continue;
372
+ if (((_candidate_proposal = candidate.proposal) == null ? void 0 : _candidate_proposal.kind) !== 'record') continue;
373
+ const at = (_candidate_createdAtMs = candidate.createdAtMs) != null ? _candidate_createdAtMs : 0;
374
+ if (at < floor) continue;
375
+ if (!best || at > best.at) best = {
376
+ jobId: candidate.jobId,
377
+ proposal: candidate.proposal,
378
+ at
379
+ };
380
+ }
381
+ return best ? {
382
+ jobId: best.jobId,
383
+ proposal: best.proposal
384
+ } : null;
385
+ }
386
+ /**
387
+ * Whether a `crm` job may start here for this member; `null` admits it: its
388
+ * inputs name a record or an import, and the CRM would let the member read it
389
+ * ({@link aiCrmAccessRefusal}). Asked at the create door before the job
390
+ * exists, so a refusal spends nothing. A door that names no member asks
391
+ * nothing of the reader.
392
+ */ export async function aiCrmAdmissionRefusal(context, deps = {}) {
393
+ var _context_hostId, _ref;
394
+ const request = parseAiCrmRequest(context.inputs);
395
+ if (typeof request === 'string') return {
396
+ status: 400,
397
+ error: request
398
+ };
399
+ return aiCrmAccessRefusal(_extends({
400
+ firestore: context.firestore,
401
+ orgId: context.orgId,
402
+ hostId: (_context_hostId = context.hostId) != null ? _context_hostId : null
403
+ }, aiCrmFactsResource(request), {
404
+ org: context.org,
405
+ uid: context.uid
406
+ }, deps.readerFor ? {
407
+ readerFor: deps.readerFor
408
+ } : {}, {
409
+ now: (_ref = deps.now == null ? void 0 : deps.now.call(deps)) != null ? _ref : new Date()
410
+ }));
411
+ }
412
+ export const aiCrmJobAdmission = (context)=>aiCrmAdmissionRefusal(context);
413
+ function modelOf(context) {
414
+ var _ref;
415
+ return (_ref = context.modelFor == null ? void 0 : context.modelFor.call(context, 'job.crm')) != null ? _ref : aiModelForStep('job.crm');
416
+ }
417
+ /**
418
+ * Keeps an answer at `orgs/{orgId}/aiCrmAnswers/{jobId}`, which no client may
419
+ * read, on its own clock.
420
+ */ async function keepAiCrmAnswer(context, answer) {
421
+ var _job_hostId;
422
+ const { job, now, firestore } = context;
423
+ const record = JSON.parse(JSON.stringify(_extends({
424
+ jobId: job.$id,
425
+ orgId: job.orgId,
426
+ hostId: (_job_hostId = job.hostId) != null ? _job_hostId : null,
427
+ createdBy: job.createdBy
428
+ }, answer)));
429
+ await firestore.collection('orgs').doc(job.orgId).collection(AI_CRM_ANSWERS_COLLECTION).doc(job.$id).set(_extends({}, record, {
430
+ createdAt: now,
431
+ expiresAt: aiCrmAnswerExpiry(now)
432
+ }));
433
+ }
434
+ export function createAiJobCrmStep(deps = {}) {
435
+ var _deps_readerFor;
436
+ const readerFor = (_deps_readerFor = deps.readerFor) != null ? _deps_readerFor : pluginRecordFactsReader;
437
+ const findAnswersByKey = deps.findAnswersByKey === undefined ? findAiCrmAnswersByKey : deps.findAnswersByKey;
438
+ return async (context)=>{
439
+ var _job_hostId;
440
+ const { job, now, signal, firestore } = context;
441
+ const model = modelOf(context);
442
+ const request = parseAiCrmRequest(job.inputs);
443
+ if (typeof request === 'string') return _extends({}, aiUnspentOutcome(model), {
444
+ failure: request
445
+ });
446
+ const { resource, id } = aiCrmFactsResource(request);
447
+ const found = readerFor(resource);
448
+ if (!found || found.pluginId !== AI_CRM_PLUGIN_ID) {
449
+ return _extends({}, aiUnspentOutcome(model), {
450
+ failure: AI_CRM_UNAVAILABLE_COPY
451
+ });
452
+ }
453
+ let facts;
454
+ try {
455
+ var _job_hostId1, _context_org;
456
+ const read = await found.reader.read({
457
+ orgId: job.orgId,
458
+ hostId: (_job_hostId1 = job.hostId) != null ? _job_hostId1 : null,
459
+ id,
460
+ // The job's creator: the CRM reads the record as the member who asked.
461
+ uid: job.createdBy,
462
+ org: (_context_org = context.org) != null ? _context_org : null,
463
+ now
464
+ });
465
+ if (read.ok === false) return _extends({}, aiUnspentOutcome(model), {
466
+ failure: read.error
467
+ });
468
+ facts = read.facts;
469
+ } catch (error) {
470
+ console.error('ai crm facts read failed', {
471
+ orgId: job.orgId,
472
+ jobId: job.$id,
473
+ resource,
474
+ error
475
+ });
476
+ return _extends({}, aiUnspentOutcome(model), {
477
+ failure: AI_CRM_FACTS_FAILURE_COPY
478
+ });
479
+ }
480
+ const maxTokens = AI_JOB_CRM_STEP_BUDGET.maxTokens(model);
481
+ const hostId = (_job_hostId = job.hostId) != null ? _job_hostId : null;
482
+ // Keeps the answer, then names it on the job. A keep that fails fails the
483
+ // step as spent: the tokens were used, and there is nothing to show.
484
+ const keep = async (spent, answer, output)=>{
485
+ try {
486
+ await keepAiCrmAnswer(context, answer);
487
+ } catch (error) {
488
+ console.error('ai crm answer keep failed', {
489
+ orgId: job.orgId,
490
+ jobId: job.$id,
491
+ error
492
+ });
493
+ return _extends({}, spent, {
494
+ outputs: [],
495
+ failure: AI_CRM_KEEP_FAILURE_COPY
496
+ });
497
+ }
498
+ return _extends({}, spent, {
499
+ outputs: [
500
+ {
501
+ resource: 'crm',
502
+ id: output.id,
503
+ hostId,
504
+ label: output.label,
505
+ proposal: _extends({}, output.ref)
506
+ }
507
+ ]
508
+ });
509
+ };
510
+ if (request.task === 'record') {
511
+ const { kind } = request.record;
512
+ if (facts['record'] !== kind) return _extends({}, aiUnspentOutcome(model), {
513
+ failure: AI_CRM_FACTS_FAILURE_COPY
514
+ });
515
+ const instructions = aiCrmRecordInstructions(kind);
516
+ const tool = aiCrmRecordTool(kind);
517
+ const prompt = aiCrmRecordPrompt(kind, facts);
518
+ const key = aiCrmRecordKey({
519
+ kind,
520
+ id,
521
+ hostId,
522
+ model,
523
+ prompt,
524
+ system: aiDoctrineSystemBlocks(undefined, {
525
+ instructions,
526
+ scope: aiDoctrineScopeFor(AI_CRM_GENERATION_KINDS.record)
527
+ }),
528
+ tool
529
+ });
530
+ const output = {
531
+ id: AI_CRM_OUTPUT_IDS.record(kind, id),
532
+ label: OUTPUT_LABELS.record,
533
+ ref: {
534
+ kind: 'record',
535
+ record: {
536
+ kind,
537
+ id
538
+ }
539
+ }
540
+ };
541
+ // Reuse before asking: an answer kept for the same key is the same
542
+ // request, so the member reads it again at no cost.
543
+ const reused = findAnswersByKey ? aiReusableCrmRecord(await findAnswersByKey(job.orgId, key, firestore).catch(()=>[]), {
544
+ jobId: job.$id,
545
+ hostId,
546
+ key,
547
+ now
548
+ }) : null;
549
+ if (reused) {
550
+ return keep(aiUnspentOutcome(model), {
551
+ task: 'record',
552
+ resource,
553
+ recordId: id,
554
+ key,
555
+ proposal: _extends({}, reused.proposal, {
556
+ reusedFrom: reused.jobId
557
+ })
558
+ }, output);
559
+ }
560
+ const generation = await runValidatedGeneration(AI_CRM_GENERATION_KINDS.record, _extends({
561
+ step: 'job.crm',
562
+ model,
563
+ instructions,
564
+ messages: [
565
+ {
566
+ role: 'user',
567
+ content: prompt
568
+ }
569
+ ],
570
+ tool,
571
+ maxTokens
572
+ }, signal ? {
573
+ signal
574
+ } : {}, {
575
+ check: (answer)=>checkAiCrmRecord(answer, aiCrmRecordCheckContext(kind, facts))
576
+ }));
577
+ const spent = aiGenerationSpent(generation);
578
+ if (generation.status === 'refused') return _extends({}, spent, {
579
+ refused: true
580
+ });
581
+ if (generation.status === 'needs_input') return _extends({}, spent, {
582
+ failure: generation.message
583
+ });
584
+ const proposal = {
585
+ kind: 'record',
586
+ record: {
587
+ kind,
588
+ id
589
+ },
590
+ summary: generation.value.summary,
591
+ nextStep: generation.value.nextStep,
592
+ stage: generation.value.stage,
593
+ standing: generation.value.standing,
594
+ asOf: now.toISOString().slice(0, 10)
595
+ };
596
+ return keep(spent, {
597
+ task: 'record',
598
+ resource,
599
+ recordId: id,
600
+ key,
601
+ proposal
602
+ }, output);
603
+ }
604
+ if (request.task === 'email') {
605
+ const { kind } = request.record;
606
+ if (facts['record'] !== kind) return _extends({}, aiUnspentOutcome(model), {
607
+ failure: AI_CRM_FACTS_FAILURE_COPY
608
+ });
609
+ const mergeFields = aiCrmEmailMergeFields(kind);
610
+ const generation = await runValidatedGeneration(AI_CRM_GENERATION_KINDS.email, _extends({
611
+ step: 'job.crm',
612
+ model,
613
+ instructions: AI_CRM_EMAIL_INSTRUCTIONS,
614
+ messages: [
615
+ {
616
+ role: 'user',
617
+ content: aiCrmEmailPrompt({
618
+ kind,
619
+ facts,
620
+ request: job.brief
621
+ })
622
+ }
623
+ ],
624
+ tool: AI_CRM_EMAIL_TOOL,
625
+ maxTokens
626
+ }, signal ? {
627
+ signal
628
+ } : {}, {
629
+ check: (answer)=>checkAiCrmEmail(answer, {
630
+ mergeFields
631
+ })
632
+ }));
633
+ const spent = aiGenerationSpent(generation);
634
+ if (generation.status === 'refused') return _extends({}, spent, {
635
+ refused: true
636
+ });
637
+ if (generation.status === 'needs_input') return _extends({}, spent, {
638
+ failure: generation.message
639
+ });
640
+ const proposal = {
641
+ kind: 'email',
642
+ record: {
643
+ kind,
644
+ id
645
+ },
646
+ subject: generation.value.subject,
647
+ body: generation.value.body
648
+ };
649
+ return keep(spent, {
650
+ task: 'email',
651
+ resource,
652
+ recordId: id,
653
+ key: null,
654
+ proposal
655
+ }, {
656
+ id: AI_CRM_OUTPUT_IDS.email(kind, id),
657
+ label: OUTPUT_LABELS.email,
658
+ ref: {
659
+ kind: 'email',
660
+ record: {
661
+ kind,
662
+ id
663
+ }
664
+ }
665
+ });
666
+ }
667
+ const fields = aiCrmImportFields(facts);
668
+ if (facts['record'] !== 'import' || !fields.length) {
669
+ return _extends({}, aiUnspentOutcome(model), {
670
+ failure: AI_CRM_FACTS_FAILURE_COPY
671
+ });
672
+ }
673
+ const generation = await runValidatedGeneration(AI_CRM_GENERATION_KINDS.mapping, _extends({
674
+ step: 'job.crm',
675
+ model,
676
+ instructions: AI_CRM_MAPPING_INSTRUCTIONS,
677
+ messages: [
678
+ {
679
+ role: 'user',
680
+ content: aiCrmMappingPrompt({
681
+ collection: request.collection,
682
+ fields,
683
+ columns: request.columns
684
+ })
685
+ }
686
+ ],
687
+ tool: AI_CRM_MAPPING_TOOL,
688
+ maxTokens
689
+ }, signal ? {
690
+ signal
691
+ } : {}, {
692
+ check: (answer)=>checkAiCrmMapping(answer, {
693
+ columns: request.columns,
694
+ fields
695
+ })
696
+ }));
697
+ const spent = aiGenerationSpent(generation);
698
+ if (generation.status === 'refused') return _extends({}, spent, {
699
+ refused: true
700
+ });
701
+ if (generation.status === 'needs_input') return _extends({}, spent, {
702
+ failure: generation.message
703
+ });
704
+ const proposal = {
705
+ kind: 'mapping',
706
+ collection: request.collection,
707
+ matches: generation.value,
708
+ columns: request.columns.length
709
+ };
710
+ return keep(spent, {
711
+ task: 'mapping',
712
+ resource,
713
+ recordId: request.collection,
714
+ key: null,
715
+ proposal
716
+ }, {
717
+ id: AI_CRM_OUTPUT_IDS.mapping(request.collection),
718
+ label: OUTPUT_LABELS.mapping,
719
+ ref: {
720
+ kind: 'mapping',
721
+ collection: request.collection
722
+ }
723
+ });
724
+ };
725
+ }
726
+ export const runAiJobCrmStep = createAiJobCrmStep();
727
+ /** Registers the CRM step and the check a `crm` job passes before it is created. */ export function registerAiCrmJob() {
728
+ registerAiJobStep('crm', runAiJobCrmStep, {
729
+ minimumMs: AI_JOB_CRM_STEP_MINIMUM_MS
730
+ });
731
+ registerAiJobAdmission('crm', aiCrmJobAdmission);
732
+ }
733
+
734
+ //# sourceMappingURL=ai-job-crm-step.js.map