@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,237 @@
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 { ConsoleImportColumn, ConsoleImportColumnShape } from '@aglyn/aglyn/plugin-manager/record-zone-props';
18
+ import type { AiJobSummary } from './ai-jobs.types';
19
+ /**
20
+ * CRM by AI (AGL-2917): what a `crm` job is asked, and the proposals it
21
+ * answers with, in the shape the job step keeps and the console widgets read.
22
+ * Pure data and readers, with no server import.
23
+ *
24
+ * ## Three questions, all proposals
25
+ *
26
+ * - `record` — a contact, company, deal or lead: a short summary of where the
27
+ * relationship stands, the next step as a task (never for a lead, which no
28
+ * task can link to), a stage for a deal, and a lead's standing. The member
29
+ * saves the task in the CRM's task form and confirms a stage move there.
30
+ * - `email` — a subject and a plain-text message for the CRM composer, greeted
31
+ * and signed with merge fields. The member edits it and presses Send; a job
32
+ * never sends anything.
33
+ * - `mapping` — which of a file's columns fill which fields of an import. The
34
+ * import drawer shows it in its own table and preview before anything is
35
+ * imported.
36
+ *
37
+ * ## What the model is given
38
+ *
39
+ * The CRM decides it: the facts its readers report on the core's record-facts
40
+ * seam, never a document the AI plugin read itself. For an import, the
41
+ * columns' headers and shapes — never a cell of the file.
42
+ *
43
+ * ## Where an answer is kept
44
+ *
45
+ * Not on the job: every member of a workspace may read its jobs, and a
46
+ * summary of a contact is the contact's to show. The job's output names the
47
+ * question ({@link AiCrmOutputRef}); the answer is kept apart, and the answer
48
+ * door serves it only to a member the CRM still lets read the record.
49
+ */
50
+ /** The plugin that owns every record a `crm` job reads, as `plugins.config.json` names it. */
51
+ export declare const AI_CRM_PLUGIN_ID = "crm";
52
+ /** What the site's plugin list calls it, for the sentence a person reads. */
53
+ export declare const AI_CRM_PLUGIN_LABEL = "CRM";
54
+ export type AiCrmTask = 'record' | 'email' | 'mapping';
55
+ export declare const AI_CRM_TASKS: readonly AiCrmTask[];
56
+ export type AiCrmRecordKind = 'contact' | 'company' | 'deal' | 'lead';
57
+ export declare const AI_CRM_RECORD_KINDS: readonly AiCrmRecordKind[];
58
+ /** The records an email is written from: a person, a deal (its person) or a lead. */
59
+ export declare const AI_CRM_EMAIL_RECORD_KINDS: readonly AiCrmRecordKind[];
60
+ export type AiCrmImportCollection = 'contacts' | 'companies' | 'deals' | 'leads';
61
+ export declare const AI_CRM_IMPORT_COLLECTIONS: readonly AiCrmImportCollection[];
62
+ /** The resource names the CRM's readers are registered under on the record-facts seam. */
63
+ export declare const AI_CRM_FACTS_RESOURCES: Readonly<Record<AiCrmRecordKind, string>>;
64
+ /** The import catalogs' resource name; the collection is the record id. */
65
+ export declare const AI_CRM_IMPORT_FACTS_RESOURCE = "crm.import";
66
+ export declare const AI_CRM_COLUMN_SHAPES: readonly ConsoleImportColumnShape[];
67
+ /** The most columns one mapping request sends. */
68
+ export declare const AI_CRM_MAX_COLUMNS = 60;
69
+ /** How much of a column header is sent. */
70
+ export declare const AI_CRM_HEADER_MAX_CHARS = 60;
71
+ /** How much of the member's request an email draft carries. */
72
+ export declare const AI_CRM_EMAIL_REQUEST_MAX_CHARS = 600;
73
+ /** Lengths the CRM tools hold an answer to. */
74
+ export declare const AI_CRM_LIMITS: {
75
+ readonly summary: 320;
76
+ readonly standing: 280;
77
+ readonly taskTitle: 80;
78
+ readonly reason: 160;
79
+ readonly subject: 100;
80
+ readonly body: 1200;
81
+ /** The latest a proposed next step may be due, in days from today. */
82
+ readonly dueInDays: 30;
83
+ };
84
+ /** A task the job proposes as the record's next step. */
85
+ export interface AiCrmNextStep {
86
+ title: string;
87
+ kind: 'call' | 'email' | 'meeting' | 'todo';
88
+ priority: 'low' | 'normal' | 'high';
89
+ dueInDays: number;
90
+ /** Why, pointing at the fact behind it. */
91
+ reason: string;
92
+ }
93
+ /** A stage the job proposes a deal move to. */
94
+ export interface AiCrmStageMove {
95
+ stageId: string;
96
+ stageName: string;
97
+ reason: string;
98
+ }
99
+ export interface AiCrmRecordProposal {
100
+ kind: 'record';
101
+ record: {
102
+ kind: AiCrmRecordKind;
103
+ id: string;
104
+ };
105
+ summary: string;
106
+ nextStep: AiCrmNextStep | null;
107
+ stage: AiCrmStageMove | null;
108
+ /** Why a lead stands where it does; `null` for any other record. */
109
+ standing: string | null;
110
+ /** The UTC day the facts were read. */
111
+ asOf: string;
112
+ /** The job the answer was reused from, when it was not asked for again. */
113
+ reusedFrom?: string;
114
+ }
115
+ export interface AiCrmEmailProposal {
116
+ kind: 'email';
117
+ record: {
118
+ kind: AiCrmRecordKind;
119
+ id: string;
120
+ };
121
+ subject: string;
122
+ body: string;
123
+ }
124
+ /** One column the job matched to a field. */
125
+ export interface AiCrmColumnMatch {
126
+ column: number;
127
+ header: string;
128
+ field: string;
129
+ label: string;
130
+ }
131
+ export interface AiCrmMappingProposal {
132
+ kind: 'mapping';
133
+ collection: AiCrmImportCollection;
134
+ matches: AiCrmColumnMatch[];
135
+ /** How many columns the request sent. */
136
+ columns: number;
137
+ }
138
+ export type AiCrmProposal = AiCrmRecordProposal | AiCrmEmailProposal | AiCrmMappingProposal;
139
+ /** The output ids a `crm` job writes: one per question. */
140
+ export declare const AI_CRM_OUTPUT_IDS: {
141
+ readonly record: (kind: AiCrmRecordKind, id: string) => string;
142
+ readonly email: (kind: AiCrmRecordKind, id: string) => string;
143
+ readonly mapping: (collection: AiCrmImportCollection) => string;
144
+ };
145
+ /** What a `crm` job's inputs say it is asked, read and bounded. */
146
+ export type AiCrmRequest = {
147
+ task: 'record';
148
+ record: {
149
+ kind: AiCrmRecordKind;
150
+ id: string;
151
+ };
152
+ } | {
153
+ task: 'email';
154
+ record: {
155
+ kind: AiCrmRecordKind;
156
+ id: string;
157
+ };
158
+ } | {
159
+ task: 'mapping';
160
+ collection: AiCrmImportCollection;
161
+ columns: ConsoleImportColumn[];
162
+ };
163
+ /** The columns a mapping request sends, as the job's inputs carry them (a JSON string). */
164
+ export declare function aiCrmColumnsInput(columns: readonly ConsoleImportColumn[]): string;
165
+ /** What a `crm` job is asked, or the sentence naming what its inputs lack. */
166
+ export declare function parseAiCrmRequest(inputs: Readonly<Record<string, unknown>> | null | undefined): AiCrmRequest | string;
167
+ /** A stored proposal read back, or `null` when it is not one a `crm` job writes. */
168
+ export declare function readAiCrmProposal(raw: unknown): AiCrmProposal | null;
169
+ /**
170
+ * What a `crm` job's output says about its answer (AGL-2917): which question,
171
+ * about which record or import. The answer itself is not on the job — every
172
+ * member of a workspace may read a job, and not every member may read the
173
+ * record — so it is kept in {@link AI_CRM_ANSWERS_COLLECTION} and read through
174
+ * the answer door, which asks the CRM again whether this member may read it.
175
+ */
176
+ export type AiCrmOutputRef = {
177
+ kind: 'record' | 'email';
178
+ record: {
179
+ kind: AiCrmRecordKind;
180
+ id: string;
181
+ };
182
+ } | {
183
+ kind: 'mapping';
184
+ collection: AiCrmImportCollection;
185
+ };
186
+ /** An output's reference read back, or `null` when it is not one a `crm` job writes. */
187
+ export declare function readAiCrmOutputRef(raw: unknown): AiCrmOutputRef | null;
188
+ /** What a widget looks for among a workspace's jobs: one question about one record, or one import. */
189
+ export type AiCrmAnswerWanted = {
190
+ kind: 'record' | 'email';
191
+ record: {
192
+ kind: string;
193
+ id: string;
194
+ };
195
+ } | {
196
+ kind: 'mapping';
197
+ collection: string;
198
+ };
199
+ /** Whether a job answered the question a widget asks. */
200
+ export declare function aiCrmJobAnswers(job: Pick<AiJobSummary, 'kind' | 'outputs'> | null | undefined, wanted: AiCrmAnswerWanted): boolean;
201
+ /** The org collection a `crm` job's answer is kept in, which no client may read. */
202
+ export declare const AI_CRM_ANSWERS_COLLECTION = "aiCrmAnswers";
203
+ /**
204
+ * How long an answer is kept: two weeks, far shorter than the job's own clock.
205
+ * An answer is written from a person's record, and erasing a person from a
206
+ * workspace does not sweep this collection, so the copy has to be gone on its
207
+ * own well inside the month an erasure request is answered in. The answer
208
+ * door stops serving it at once, because the CRM no longer finds the record.
209
+ */
210
+ export declare const AI_CRM_ANSWER_RETENTION_DAYS = 14;
211
+ /** When an answer written at `now` expires: a `Date`, which a TTL policy keys on. */
212
+ export declare function aiCrmAnswerExpiry(now?: Date): Date;
213
+ /** An answer as it is kept at `orgs/{orgId}/aiCrmAnswers/{jobId}`. */
214
+ export interface AiCrmAnswerRecord {
215
+ jobId: string;
216
+ orgId: string;
217
+ /** The site the record was read on, or `null` at the organization level. */
218
+ hostId: string | null;
219
+ /** The member who asked. */
220
+ createdBy: string;
221
+ task: AiCrmTask;
222
+ /** The record an answer is about, by the resource its facts were read from; `null` for a mapping. */
223
+ resource: string;
224
+ recordId: string;
225
+ proposal: AiCrmProposal;
226
+ /** A record answer's request key, which a later job reuses it by; `null` for any other. */
227
+ key: string | null;
228
+ createdAt: unknown;
229
+ expiresAt?: unknown;
230
+ }
231
+ /** What the answer door serves. */
232
+ export interface AiCrmAnswerWire {
233
+ jobId: string;
234
+ hostId: string | null;
235
+ createdBy: string;
236
+ proposal: AiCrmProposal;
237
+ }
@@ -0,0 +1,225 @@
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
+ * CRM by AI (AGL-2917): what a `crm` job is asked, and the proposals it
18
+ * answers with, in the shape the job step keeps and the console widgets read.
19
+ * Pure data and readers, with no server import.
20
+ *
21
+ * ## Three questions, all proposals
22
+ *
23
+ * - `record` — a contact, company, deal or lead: a short summary of where the
24
+ * relationship stands, the next step as a task (never for a lead, which no
25
+ * task can link to), a stage for a deal, and a lead's standing. The member
26
+ * saves the task in the CRM's task form and confirms a stage move there.
27
+ * - `email` — a subject and a plain-text message for the CRM composer, greeted
28
+ * and signed with merge fields. The member edits it and presses Send; a job
29
+ * never sends anything.
30
+ * - `mapping` — which of a file's columns fill which fields of an import. The
31
+ * import drawer shows it in its own table and preview before anything is
32
+ * imported.
33
+ *
34
+ * ## What the model is given
35
+ *
36
+ * The CRM decides it: the facts its readers report on the core's record-facts
37
+ * seam, never a document the AI plugin read itself. For an import, the
38
+ * columns' headers and shapes — never a cell of the file.
39
+ *
40
+ * ## Where an answer is kept
41
+ *
42
+ * Not on the job: every member of a workspace may read its jobs, and a
43
+ * summary of a contact is the contact's to show. The job's output names the
44
+ * question ({@link AiCrmOutputRef}); the answer is kept apart, and the answer
45
+ * door serves it only to a member the CRM still lets read the record.
46
+ */ /** The plugin that owns every record a `crm` job reads, as `plugins.config.json` names it. */ export const AI_CRM_PLUGIN_ID = 'crm';
47
+ /** What the site's plugin list calls it, for the sentence a person reads. */ export const AI_CRM_PLUGIN_LABEL = 'CRM';
48
+ export const AI_CRM_TASKS = [
49
+ 'record',
50
+ 'email',
51
+ 'mapping'
52
+ ];
53
+ export const AI_CRM_RECORD_KINDS = [
54
+ 'contact',
55
+ 'company',
56
+ 'deal',
57
+ 'lead'
58
+ ];
59
+ /** The records an email is written from: a person, a deal (its person) or a lead. */ export const AI_CRM_EMAIL_RECORD_KINDS = [
60
+ 'contact',
61
+ 'deal',
62
+ 'lead'
63
+ ];
64
+ export const AI_CRM_IMPORT_COLLECTIONS = [
65
+ 'contacts',
66
+ 'companies',
67
+ 'deals',
68
+ 'leads'
69
+ ];
70
+ /** The resource names the CRM's readers are registered under on the record-facts seam. */ export const AI_CRM_FACTS_RESOURCES = {
71
+ contact: 'crm.contact',
72
+ company: 'crm.company',
73
+ deal: 'crm.deal',
74
+ lead: 'crm.lead'
75
+ };
76
+ /** The import catalogs' resource name; the collection is the record id. */ export const AI_CRM_IMPORT_FACTS_RESOURCE = 'crm.import';
77
+ export const AI_CRM_COLUMN_SHAPES = [
78
+ 'empty',
79
+ 'email',
80
+ 'phone',
81
+ 'number',
82
+ 'date',
83
+ 'yes-no',
84
+ 'url',
85
+ 'text'
86
+ ];
87
+ /** The most columns one mapping request sends. */ export const AI_CRM_MAX_COLUMNS = 60;
88
+ /** How much of a column header is sent. */ export const AI_CRM_HEADER_MAX_CHARS = 60;
89
+ /** How much of the member's request an email draft carries. */ export const AI_CRM_EMAIL_REQUEST_MAX_CHARS = 600;
90
+ /** Lengths the CRM tools hold an answer to. */ export const AI_CRM_LIMITS = {
91
+ summary: 320,
92
+ standing: 280,
93
+ taskTitle: 80,
94
+ reason: 160,
95
+ subject: 100,
96
+ body: 1200,
97
+ /** The latest a proposed next step may be due, in days from today. */ dueInDays: 30
98
+ };
99
+ /** The output ids a `crm` job writes: one per question. */ export const AI_CRM_OUTPUT_IDS = {
100
+ record: (kind, id)=>`record:${kind}:${id}`,
101
+ email: (kind, id)=>`email:${kind}:${id}`,
102
+ mapping: (collection)=>`mapping:${collection}`
103
+ };
104
+ const RECORD_ID = /^[A-Za-z0-9_.:@+-]{1,128}$/;
105
+ const oneOf = (list, value)=>typeof value === 'string' && list.includes(value);
106
+ /** The columns a mapping request sends, as the job's inputs carry them (a JSON string). */ export function aiCrmColumnsInput(columns) {
107
+ return JSON.stringify(columns.slice(0, AI_CRM_MAX_COLUMNS).map((column)=>{
108
+ var _column_header;
109
+ return {
110
+ header: String((_column_header = column.header) != null ? _column_header : '').replace(/\s+/g, ' ').trim().slice(0, AI_CRM_HEADER_MAX_CHARS),
111
+ shape: column.shape
112
+ };
113
+ }));
114
+ }
115
+ function readColumns(raw) {
116
+ if (typeof raw !== 'string') return null;
117
+ let parsed;
118
+ try {
119
+ parsed = JSON.parse(raw);
120
+ } catch (unused) {
121
+ return null;
122
+ }
123
+ if (!Array.isArray(parsed) || !parsed.length || parsed.length > AI_CRM_MAX_COLUMNS) return null;
124
+ const columns = [];
125
+ for (const entry of parsed){
126
+ const column = entry;
127
+ if (!column || typeof column['header'] !== 'string' || !oneOf(AI_CRM_COLUMN_SHAPES, column['shape'])) return null;
128
+ columns.push({
129
+ header: column['header'].replace(/\s+/g, ' ').trim().slice(0, AI_CRM_HEADER_MAX_CHARS),
130
+ shape: column['shape']
131
+ });
132
+ }
133
+ return columns;
134
+ }
135
+ /** What a `crm` job is asked, or the sentence naming what its inputs lack. */ export function parseAiCrmRequest(inputs) {
136
+ const task = inputs == null ? void 0 : inputs['task'];
137
+ if (task === 'record' || task === 'email') {
138
+ var _ref;
139
+ const kind = inputs == null ? void 0 : inputs['record'];
140
+ const id = String((_ref = inputs == null ? void 0 : inputs['recordId']) != null ? _ref : '').trim();
141
+ const kinds = task === 'email' ? AI_CRM_EMAIL_RECORD_KINDS : AI_CRM_RECORD_KINDS;
142
+ if (!oneOf(kinds, kind) || !RECORD_ID.test(id)) return 'Open the CRM record this is about first';
143
+ return {
144
+ task,
145
+ record: {
146
+ kind,
147
+ id
148
+ }
149
+ };
150
+ }
151
+ if (task === 'mapping') {
152
+ const collection = inputs == null ? void 0 : inputs['collection'];
153
+ if (!oneOf(AI_CRM_IMPORT_COLLECTIONS, collection)) return 'Open the import this is for first';
154
+ const columns = readColumns(inputs == null ? void 0 : inputs['columns']);
155
+ if (!columns) return `Choose a file with between 1 and ${AI_CRM_MAX_COLUMNS} columns first`;
156
+ return {
157
+ task,
158
+ collection,
159
+ columns
160
+ };
161
+ }
162
+ return 'This CRM request does not say what it is for';
163
+ }
164
+ const isRecord = (value)=>typeof value === 'object' && value !== null && !Array.isArray(value);
165
+ /** A stored proposal read back, or `null` when it is not one a `crm` job writes. */ export function readAiCrmProposal(raw) {
166
+ if (!isRecord(raw)) return null;
167
+ if (raw['kind'] === 'record' || raw['kind'] === 'email') {
168
+ const record = raw['record'];
169
+ if (!isRecord(record) || !oneOf(AI_CRM_RECORD_KINDS, record['kind']) || typeof record['id'] !== 'string') {
170
+ return null;
171
+ }
172
+ if (raw['kind'] === 'email') {
173
+ return typeof raw['subject'] === 'string' && typeof raw['body'] === 'string' ? raw : null;
174
+ }
175
+ return typeof raw['summary'] === 'string' ? raw : null;
176
+ }
177
+ if (raw['kind'] === 'mapping') {
178
+ return oneOf(AI_CRM_IMPORT_COLLECTIONS, raw['collection']) && Array.isArray(raw['matches']) ? raw : null;
179
+ }
180
+ return null;
181
+ }
182
+ /** An output's reference read back, or `null` when it is not one a `crm` job writes. */ export function readAiCrmOutputRef(raw) {
183
+ if (!isRecord(raw)) return null;
184
+ if (raw['kind'] === 'record' || raw['kind'] === 'email') {
185
+ const record = raw['record'];
186
+ return isRecord(record) && oneOf(AI_CRM_RECORD_KINDS, record['kind']) && typeof record['id'] === 'string' ? {
187
+ kind: raw['kind'],
188
+ record: {
189
+ kind: record['kind'],
190
+ id: record['id']
191
+ }
192
+ } : null;
193
+ }
194
+ if (raw['kind'] === 'mapping') {
195
+ return oneOf(AI_CRM_IMPORT_COLLECTIONS, raw['collection']) ? {
196
+ kind: 'mapping',
197
+ collection: raw['collection']
198
+ } : null;
199
+ }
200
+ return null;
201
+ }
202
+ /** Whether a job answered the question a widget asks. */ export function aiCrmJobAnswers(job, wanted) {
203
+ var _job_outputs;
204
+ if ((job == null ? void 0 : job.kind) !== 'crm') return false;
205
+ return ((_job_outputs = job.outputs) != null ? _job_outputs : []).some((output)=>{
206
+ if (output.resource !== 'crm') return false;
207
+ const ref = readAiCrmOutputRef(output.proposal);
208
+ if (!ref || ref.kind !== wanted.kind) return false;
209
+ if (ref.kind === 'mapping') return wanted.kind === 'mapping' && ref.collection === wanted.collection;
210
+ return wanted.kind !== 'mapping' && ref.record.kind === wanted.record.kind && ref.record.id === wanted.record.id;
211
+ });
212
+ }
213
+ /** The org collection a `crm` job's answer is kept in, which no client may read. */ export const AI_CRM_ANSWERS_COLLECTION = 'aiCrmAnswers';
214
+ /**
215
+ * How long an answer is kept: two weeks, far shorter than the job's own clock.
216
+ * An answer is written from a person's record, and erasing a person from a
217
+ * workspace does not sweep this collection, so the copy has to be gone on its
218
+ * own well inside the month an erasure request is answered in. The answer
219
+ * door stops serving it at once, because the CRM no longer finds the record.
220
+ */ export const AI_CRM_ANSWER_RETENTION_DAYS = 14;
221
+ /** When an answer written at `now` expires: a `Date`, which a TTL policy keys on. */ export function aiCrmAnswerExpiry(now = new Date()) {
222
+ return new Date(now.getTime() + AI_CRM_ANSWER_RETENTION_DAYS * 86400000);
223
+ }
224
+
225
+ //# sourceMappingURL=ai-crm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/model/ai-crm.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 {\n ConsoleImportColumn,\n ConsoleImportColumnShape,\n} from '@aglyn/aglyn/plugin-manager/record-zone-props'\nimport type { AiJobOutput, AiJobSummary } from './ai-jobs.types'\n\n/**\n * CRM by AI (AGL-2917): what a `crm` job is asked, and the proposals it\n * answers with, in the shape the job step keeps and the console widgets read.\n * Pure data and readers, with no server import.\n *\n * ## Three questions, all proposals\n *\n * - `record` — a contact, company, deal or lead: a short summary of where the\n * relationship stands, the next step as a task (never for a lead, which no\n * task can link to), a stage for a deal, and a lead's standing. The member\n * saves the task in the CRM's task form and confirms a stage move there.\n * - `email` — a subject and a plain-text message for the CRM composer, greeted\n * and signed with merge fields. The member edits it and presses Send; a job\n * never sends anything.\n * - `mapping` — which of a file's columns fill which fields of an import. The\n * import drawer shows it in its own table and preview before anything is\n * imported.\n *\n * ## What the model is given\n *\n * The CRM decides it: the facts its readers report on the core's record-facts\n * seam, never a document the AI plugin read itself. For an import, the\n * columns' headers and shapes — never a cell of the file.\n *\n * ## Where an answer is kept\n *\n * Not on the job: every member of a workspace may read its jobs, and a\n * summary of a contact is the contact's to show. The job's output names the\n * question ({@link AiCrmOutputRef}); the answer is kept apart, and the answer\n * door serves it only to a member the CRM still lets read the record.\n */\n\n/** The plugin that owns every record a `crm` job reads, as `plugins.config.json` names it. */\nexport const AI_CRM_PLUGIN_ID = 'crm'\n\n/** What the site's plugin list calls it, for the sentence a person reads. */\nexport const AI_CRM_PLUGIN_LABEL = 'CRM'\n\nexport type AiCrmTask = 'record' | 'email' | 'mapping'\n\nexport const AI_CRM_TASKS: readonly AiCrmTask[] = ['record', 'email', 'mapping']\n\nexport type AiCrmRecordKind = 'contact' | 'company' | 'deal' | 'lead'\n\nexport const AI_CRM_RECORD_KINDS: readonly AiCrmRecordKind[] = ['contact', 'company', 'deal', 'lead']\n\n/** The records an email is written from: a person, a deal (its person) or a lead. */\nexport const AI_CRM_EMAIL_RECORD_KINDS: readonly AiCrmRecordKind[] = ['contact', 'deal', 'lead']\n\nexport type AiCrmImportCollection = 'contacts' | 'companies' | 'deals' | 'leads'\n\nexport const AI_CRM_IMPORT_COLLECTIONS: readonly AiCrmImportCollection[] = [\n 'contacts',\n 'companies',\n 'deals',\n 'leads',\n]\n\n/** The resource names the CRM's readers are registered under on the record-facts seam. */\nexport const AI_CRM_FACTS_RESOURCES: Readonly<Record<AiCrmRecordKind, string>> = {\n contact: 'crm.contact',\n company: 'crm.company',\n deal: 'crm.deal',\n lead: 'crm.lead',\n}\n\n/** The import catalogs' resource name; the collection is the record id. */\nexport const AI_CRM_IMPORT_FACTS_RESOURCE = 'crm.import'\n\nexport const AI_CRM_COLUMN_SHAPES: readonly ConsoleImportColumnShape[] = [\n 'empty',\n 'email',\n 'phone',\n 'number',\n 'date',\n 'yes-no',\n 'url',\n 'text',\n]\n\n/** The most columns one mapping request sends. */\nexport const AI_CRM_MAX_COLUMNS = 60\n\n/** How much of a column header is sent. */\nexport const AI_CRM_HEADER_MAX_CHARS = 60\n\n/** How much of the member's request an email draft carries. */\nexport const AI_CRM_EMAIL_REQUEST_MAX_CHARS = 600\n\n/** Lengths the CRM tools hold an answer to. */\nexport const AI_CRM_LIMITS = {\n summary: 320,\n standing: 280,\n taskTitle: 80,\n reason: 160,\n subject: 100,\n body: 1_200,\n /** The latest a proposed next step may be due, in days from today. */\n dueInDays: 30,\n} as const\n\n/** A task the job proposes as the record's next step. */\nexport interface AiCrmNextStep {\n title: string\n kind: 'call' | 'email' | 'meeting' | 'todo'\n priority: 'low' | 'normal' | 'high'\n dueInDays: number\n /** Why, pointing at the fact behind it. */\n reason: string\n}\n\n/** A stage the job proposes a deal move to. */\nexport interface AiCrmStageMove {\n stageId: string\n stageName: string\n reason: string\n}\n\nexport interface AiCrmRecordProposal {\n kind: 'record'\n record: { kind: AiCrmRecordKind; id: string }\n summary: string\n nextStep: AiCrmNextStep | null\n stage: AiCrmStageMove | null\n /** Why a lead stands where it does; `null` for any other record. */\n standing: string | null\n /** The UTC day the facts were read. */\n asOf: string\n /** The job the answer was reused from, when it was not asked for again. */\n reusedFrom?: string\n}\n\nexport interface AiCrmEmailProposal {\n kind: 'email'\n record: { kind: AiCrmRecordKind; id: string }\n subject: string\n body: string\n}\n\n/** One column the job matched to a field. */\nexport interface AiCrmColumnMatch {\n column: number\n header: string\n field: string\n label: string\n}\n\nexport interface AiCrmMappingProposal {\n kind: 'mapping'\n collection: AiCrmImportCollection\n matches: AiCrmColumnMatch[]\n /** How many columns the request sent. */\n columns: number\n}\n\nexport type AiCrmProposal = AiCrmRecordProposal | AiCrmEmailProposal | AiCrmMappingProposal\n\n/** The output ids a `crm` job writes: one per question. */\nexport const AI_CRM_OUTPUT_IDS = {\n record: (kind: AiCrmRecordKind, id: string) => `record:${kind}:${id}`,\n email: (kind: AiCrmRecordKind, id: string) => `email:${kind}:${id}`,\n mapping: (collection: AiCrmImportCollection) => `mapping:${collection}`,\n} as const\n\n/** What a `crm` job's inputs say it is asked, read and bounded. */\nexport type AiCrmRequest =\n | { task: 'record'; record: { kind: AiCrmRecordKind; id: string } }\n | { task: 'email'; record: { kind: AiCrmRecordKind; id: string } }\n | { task: 'mapping'; collection: AiCrmImportCollection; columns: ConsoleImportColumn[] }\n\nconst RECORD_ID = /^[A-Za-z0-9_.:@+-]{1,128}$/\n\nconst oneOf = <T extends string>(list: readonly T[], value: unknown): value is T =>\n typeof value === 'string' && (list as readonly string[]).includes(value)\n\n/** The columns a mapping request sends, as the job's inputs carry them (a JSON string). */\nexport function aiCrmColumnsInput(columns: readonly ConsoleImportColumn[]): string {\n return JSON.stringify(\n columns.slice(0, AI_CRM_MAX_COLUMNS).map((column) => ({\n header: String(column.header ?? '').replace(/\\s+/g, ' ').trim().slice(0, AI_CRM_HEADER_MAX_CHARS),\n shape: column.shape,\n })),\n )\n}\n\nfunction readColumns(raw: unknown): ConsoleImportColumn[] | null {\n if (typeof raw !== 'string') return null\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return null\n }\n if (!Array.isArray(parsed) || !parsed.length || parsed.length > AI_CRM_MAX_COLUMNS) return null\n const columns: ConsoleImportColumn[] = []\n for (const entry of parsed) {\n const column = entry as Record<string, unknown> | null\n if (!column || typeof column['header'] !== 'string' || !oneOf(AI_CRM_COLUMN_SHAPES, column['shape'])) return null\n columns.push({\n header: column['header'].replace(/\\s+/g, ' ').trim().slice(0, AI_CRM_HEADER_MAX_CHARS),\n shape: column['shape'],\n })\n }\n return columns\n}\n\n/** What a `crm` job is asked, or the sentence naming what its inputs lack. */\nexport function parseAiCrmRequest(inputs: Readonly<Record<string, unknown>> | null | undefined): AiCrmRequest | string {\n const task = inputs?.['task']\n if (task === 'record' || task === 'email') {\n const kind = inputs?.['record']\n const id = String(inputs?.['recordId'] ?? '').trim()\n const kinds = task === 'email' ? AI_CRM_EMAIL_RECORD_KINDS : AI_CRM_RECORD_KINDS\n if (!oneOf(kinds, kind) || !RECORD_ID.test(id)) return 'Open the CRM record this is about first'\n return { task, record: { kind, id } }\n }\n if (task === 'mapping') {\n const collection = inputs?.['collection']\n if (!oneOf(AI_CRM_IMPORT_COLLECTIONS, collection)) return 'Open the import this is for first'\n const columns = readColumns(inputs?.['columns'])\n if (!columns) return `Choose a file with between 1 and ${AI_CRM_MAX_COLUMNS} columns first`\n return { task, collection, columns }\n }\n return 'This CRM request does not say what it is for'\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/** A stored proposal read back, or `null` when it is not one a `crm` job writes. */\nexport function readAiCrmProposal(raw: unknown): AiCrmProposal | null {\n if (!isRecord(raw)) return null\n if (raw['kind'] === 'record' || raw['kind'] === 'email') {\n const record = raw['record']\n if (!isRecord(record) || !oneOf(AI_CRM_RECORD_KINDS, record['kind']) || typeof record['id'] !== 'string') {\n return null\n }\n if (raw['kind'] === 'email') {\n return typeof raw['subject'] === 'string' && typeof raw['body'] === 'string'\n ? (raw as unknown as AiCrmEmailProposal)\n : null\n }\n return typeof raw['summary'] === 'string' ? (raw as unknown as AiCrmRecordProposal) : null\n }\n if (raw['kind'] === 'mapping') {\n return oneOf(AI_CRM_IMPORT_COLLECTIONS, raw['collection']) && Array.isArray(raw['matches'])\n ? (raw as unknown as AiCrmMappingProposal)\n : null\n }\n return null\n}\n\n/**\n * What a `crm` job's output says about its answer (AGL-2917): which question,\n * about which record or import. The answer itself is not on the job — every\n * member of a workspace may read a job, and not every member may read the\n * record — so it is kept in {@link AI_CRM_ANSWERS_COLLECTION} and read through\n * the answer door, which asks the CRM again whether this member may read it.\n */\nexport type AiCrmOutputRef =\n | { kind: 'record' | 'email'; record: { kind: AiCrmRecordKind; id: string } }\n | { kind: 'mapping'; collection: AiCrmImportCollection }\n\n/** An output's reference read back, or `null` when it is not one a `crm` job writes. */\nexport function readAiCrmOutputRef(raw: unknown): AiCrmOutputRef | null {\n if (!isRecord(raw)) return null\n if (raw['kind'] === 'record' || raw['kind'] === 'email') {\n const record = raw['record']\n return isRecord(record) && oneOf(AI_CRM_RECORD_KINDS, record['kind']) && typeof record['id'] === 'string'\n ? { kind: raw['kind'], record: { kind: record['kind'], id: record['id'] } }\n : null\n }\n if (raw['kind'] === 'mapping') {\n return oneOf(AI_CRM_IMPORT_COLLECTIONS, raw['collection']) ? { kind: 'mapping', collection: raw['collection'] } : null\n }\n return null\n}\n\n/** What a widget looks for among a workspace's jobs: one question about one record, or one import. */\nexport type AiCrmAnswerWanted =\n | { kind: 'record' | 'email'; record: { kind: string; id: string } }\n | { kind: 'mapping'; collection: string }\n\n/** Whether a job answered the question a widget asks. */\nexport function aiCrmJobAnswers(job: Pick<AiJobSummary, 'kind' | 'outputs'> | null | undefined, wanted: AiCrmAnswerWanted): boolean {\n if (job?.kind !== 'crm') return false\n return (job.outputs ?? []).some((output: AiJobOutput) => {\n if (output.resource !== 'crm') return false\n const ref = readAiCrmOutputRef(output.proposal)\n if (!ref || ref.kind !== wanted.kind) return false\n if (ref.kind === 'mapping') return wanted.kind === 'mapping' && ref.collection === wanted.collection\n return wanted.kind !== 'mapping' && ref.record.kind === wanted.record.kind && ref.record.id === wanted.record.id\n })\n}\n\n/** The org collection a `crm` job's answer is kept in, which no client may read. */\nexport const AI_CRM_ANSWERS_COLLECTION = 'aiCrmAnswers'\n\n/**\n * How long an answer is kept: two weeks, far shorter than the job's own clock.\n * An answer is written from a person's record, and erasing a person from a\n * workspace does not sweep this collection, so the copy has to be gone on its\n * own well inside the month an erasure request is answered in. The answer\n * door stops serving it at once, because the CRM no longer finds the record.\n */\nexport const AI_CRM_ANSWER_RETENTION_DAYS = 14\n\n/** When an answer written at `now` expires: a `Date`, which a TTL policy keys on. */\nexport function aiCrmAnswerExpiry(now = new Date()): Date {\n return new Date(now.getTime() + AI_CRM_ANSWER_RETENTION_DAYS * 86_400_000)\n}\n\n/** An answer as it is kept at `orgs/{orgId}/aiCrmAnswers/{jobId}`. */\nexport interface AiCrmAnswerRecord {\n jobId: string\n orgId: string\n /** The site the record was read on, or `null` at the organization level. */\n hostId: string | null\n /** The member who asked. */\n createdBy: string\n task: AiCrmTask\n /** The record an answer is about, by the resource its facts were read from; `null` for a mapping. */\n resource: string\n recordId: string\n proposal: AiCrmProposal\n /** A record answer's request key, which a later job reuses it by; `null` for any other. */\n key: string | null\n createdAt: unknown\n expiresAt?: unknown\n}\n\n/** What the answer door serves. */\nexport interface AiCrmAnswerWire {\n jobId: string\n hostId: string | null\n createdBy: string\n proposal: AiCrmProposal\n}\n"],"names":["AI_CRM_PLUGIN_ID","AI_CRM_PLUGIN_LABEL","AI_CRM_TASKS","AI_CRM_RECORD_KINDS","AI_CRM_EMAIL_RECORD_KINDS","AI_CRM_IMPORT_COLLECTIONS","AI_CRM_FACTS_RESOURCES","contact","company","deal","lead","AI_CRM_IMPORT_FACTS_RESOURCE","AI_CRM_COLUMN_SHAPES","AI_CRM_MAX_COLUMNS","AI_CRM_HEADER_MAX_CHARS","AI_CRM_EMAIL_REQUEST_MAX_CHARS","AI_CRM_LIMITS","summary","standing","taskTitle","reason","subject","body","dueInDays","AI_CRM_OUTPUT_IDS","record","kind","id","email","mapping","collection","RECORD_ID","oneOf","list","value","includes","aiCrmColumnsInput","columns","JSON","stringify","slice","map","column","header","String","replace","trim","shape","readColumns","raw","parsed","parse","Array","isArray","length","entry","push","parseAiCrmRequest","inputs","task","kinds","test","isRecord","readAiCrmProposal","readAiCrmOutputRef","aiCrmJobAnswers","job","wanted","outputs","some","output","resource","ref","proposal","AI_CRM_ANSWERS_COLLECTION","AI_CRM_ANSWER_RETENTION_DAYS","aiCrmAnswerExpiry","now","Date","getTime"],"mappings":"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"}
@@ -0,0 +1,68 @@
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 AiExperimentArm, type AiExperimentTarget, type AiExperimentVariantProposal, type AiExperimentVerdict } from './ai-experiment';
18
+ /** An explanation as a console surface reads it back. */
19
+ export interface AiExperimentExplanationProposal {
20
+ verdict: AiExperimentVerdict;
21
+ test: string;
22
+ headline: string;
23
+ points: string[];
24
+ /** The arm the FIGURES named, and only ever on a verdict that names one. */
25
+ winnerId: string | null;
26
+ next: string;
27
+ /** The confidence one comparison had to clear, as a percentage. */
28
+ threshold: number;
29
+ arms: AiExperimentArm[];
30
+ }
31
+ /** A variants answer as a console surface reads it back. */
32
+ export interface AiExperimentVariantsProposalView {
33
+ target: AiExperimentTarget;
34
+ goal: string;
35
+ variants: AiExperimentVariantProposal[];
36
+ }
37
+ /**
38
+ * How a verdict is drawn.
39
+ *
40
+ * `namesAnArm` is the one a surface must ask before it marks a row, a chip or
41
+ * a heading: on `too-early`, `inconclusive` and `unreadable` there is no arm
42
+ * to mark, and marking the one with the best rate anyway is the claim the
43
+ * step refused to let the model make.
44
+ *
45
+ * `tone` is a MUI severity/color word rather than a color: `success` only
46
+ * where the figures decided something, and the neutral `default` everywhere
47
+ * else — an undecided result drawn in a color that reads as good or as bad
48
+ * says something the figures did not.
49
+ */
50
+ export interface AiExperimentVerdictDisplay {
51
+ namesAnArm: boolean;
52
+ tone: 'success' | 'default';
53
+ /** The verdict in a reader's words, short enough for a chip. */
54
+ status: string;
55
+ /** What the result does not settle, or empty where it settles something. */
56
+ caveat: string;
57
+ }
58
+ /** How a verdict is drawn; an unknown verdict is drawn as the most careful one. */
59
+ export declare function aiExperimentVerdictDisplay(verdict: AiExperimentVerdict | string): AiExperimentVerdictDisplay;
60
+ /**
61
+ * Whether a surface may mark this arm. The verdict decides first, so an arm
62
+ * cannot be marked on a result that named none, whatever `winnerId` holds.
63
+ */
64
+ export declare function aiExperimentArmIsNamed(explanation: Pick<AiExperimentExplanationProposal, 'verdict' | 'winnerId'>, armId: string): boolean;
65
+ /** An explanation output's proposal, or `null` when it is not one. */
66
+ export declare function readAiExperimentExplanation(value: unknown): AiExperimentExplanationProposal | null;
67
+ /** A variants output's proposal, or `null` when it is not one. */
68
+ export declare function readAiExperimentVariants(value: unknown): AiExperimentVariantsProposalView | null;