@aglyn/plugins-ai 1.0.0-beta.143

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (717) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +25 -0
  3. package/package.json +60 -0
  4. package/src/index.d.ts +21 -0
  5. package/src/index.js +22 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/activity/ai-activity-actions.d.ts +106 -0
  8. package/src/lib/activity/ai-activity-actions.js +209 -0
  9. package/src/lib/activity/ai-activity-actions.js.map +1 -0
  10. package/src/lib/activity/ai-activity.d.ts +219 -0
  11. package/src/lib/activity/ai-activity.js +251 -0
  12. package/src/lib/activity/ai-activity.js.map +1 -0
  13. package/src/lib/billing/ai-overage-charge.d.ts +102 -0
  14. package/src/lib/billing/ai-overage-charge.js +258 -0
  15. package/src/lib/billing/ai-overage-charge.js.map +1 -0
  16. package/src/lib/billing/ai-overage-close.d.ts +62 -0
  17. package/src/lib/billing/ai-overage-close.js +129 -0
  18. package/src/lib/billing/ai-overage-close.js.map +1 -0
  19. package/src/lib/billing/ai-overage-cutover.d.ts +63 -0
  20. package/src/lib/billing/ai-overage-cutover.js +114 -0
  21. package/src/lib/billing/ai-overage-cutover.js.map +1 -0
  22. package/src/lib/billing/ai-overage-events.d.ts +77 -0
  23. package/src/lib/billing/ai-overage-events.js +174 -0
  24. package/src/lib/billing/ai-overage-events.js.map +1 -0
  25. package/src/lib/billing/ai-overage-gate.d.ts +147 -0
  26. package/src/lib/billing/ai-overage-gate.js +177 -0
  27. package/src/lib/billing/ai-overage-gate.js.map +1 -0
  28. package/src/lib/billing/ai-overage-ledger.d.ts +135 -0
  29. package/src/lib/billing/ai-overage-ledger.js +278 -0
  30. package/src/lib/billing/ai-overage-ledger.js.map +1 -0
  31. package/src/lib/billing/ai-overage-standing-writes.d.ts +110 -0
  32. package/src/lib/billing/ai-overage-standing-writes.js +205 -0
  33. package/src/lib/billing/ai-overage-standing-writes.js.map +1 -0
  34. package/src/lib/billing/ai-overage-standing.d.ts +168 -0
  35. package/src/lib/billing/ai-overage-standing.js +215 -0
  36. package/src/lib/billing/ai-overage-standing.js.map +1 -0
  37. package/src/lib/billing/ai-overage-trigger.d.ts +30 -0
  38. package/src/lib/billing/ai-overage-trigger.js +76 -0
  39. package/src/lib/billing/ai-overage-trigger.js.map +1 -0
  40. package/src/lib/components/ai-allotment-editor.component.d.ts +40 -0
  41. package/src/lib/components/ai-allotment-editor.component.js +213 -0
  42. package/src/lib/components/ai-allotment-editor.component.js.map +1 -0
  43. package/src/lib/components/ai-assist-actions-context.d.ts +13 -0
  44. package/src/lib/components/ai-assist-actions-context.js +21 -0
  45. package/src/lib/components/ai-assist-actions-context.js.map +1 -0
  46. package/src/lib/components/ai-assist-provider.component.d.ts +51 -0
  47. package/src/lib/components/ai-assist-provider.component.js +519 -0
  48. package/src/lib/components/ai-assist-provider.component.js.map +1 -0
  49. package/src/lib/components/ai-brief-dialog.component.d.ts +56 -0
  50. package/src/lib/components/ai-brief-dialog.component.js +319 -0
  51. package/src/lib/components/ai-brief-dialog.component.js.map +1 -0
  52. package/src/lib/components/ai-collaborator-permissions-column.component.d.ts +32 -0
  53. package/src/lib/components/ai-collaborator-permissions-column.component.js +132 -0
  54. package/src/lib/components/ai-collaborator-permissions-column.component.js.map +1 -0
  55. package/src/lib/components/ai-credits-card.component.d.ts +34 -0
  56. package/src/lib/components/ai-credits-card.component.js +131 -0
  57. package/src/lib/components/ai-credits-card.component.js.map +1 -0
  58. package/src/lib/components/ai-credits-columns.component.d.ts +56 -0
  59. package/src/lib/components/ai-credits-columns.component.js +118 -0
  60. package/src/lib/components/ai-credits-columns.component.js.map +1 -0
  61. package/src/lib/components/ai-crm-email-draft.component.d.ts +17 -0
  62. package/src/lib/components/ai-crm-email-draft.component.js +159 -0
  63. package/src/lib/components/ai-crm-email-draft.component.js.map +1 -0
  64. package/src/lib/components/ai-crm-import-mapping.component.d.ts +20 -0
  65. package/src/lib/components/ai-crm-import-mapping.component.js +167 -0
  66. package/src/lib/components/ai-crm-import-mapping.component.js.map +1 -0
  67. package/src/lib/components/ai-crm-record-card.component.d.ts +27 -0
  68. package/src/lib/components/ai-crm-record-card.component.js +263 -0
  69. package/src/lib/components/ai-crm-record-card.component.js.map +1 -0
  70. package/src/lib/components/ai-describe-automation.component.d.ts +31 -0
  71. package/src/lib/components/ai-describe-automation.component.js +226 -0
  72. package/src/lib/components/ai-describe-automation.component.js.map +1 -0
  73. package/src/lib/components/ai-describe-button.component.d.ts +39 -0
  74. package/src/lib/components/ai-describe-button.component.js +87 -0
  75. package/src/lib/components/ai-describe-button.component.js.map +1 -0
  76. package/src/lib/components/ai-describe-page.component.d.ts +26 -0
  77. package/src/lib/components/ai-describe-page.component.js +18 -0
  78. package/src/lib/components/ai-describe-page.component.js.map +1 -0
  79. package/src/lib/components/ai-experiment-cards.component.d.ts +75 -0
  80. package/src/lib/components/ai-experiment-cards.component.js +573 -0
  81. package/src/lib/components/ai-experiment-cards.component.js.map +1 -0
  82. package/src/lib/components/ai-explain-automation.component.d.ts +31 -0
  83. package/src/lib/components/ai-explain-automation.component.js +265 -0
  84. package/src/lib/components/ai-explain-automation.component.js.map +1 -0
  85. package/src/lib/components/ai-insight-dialog.component.d.ts +37 -0
  86. package/src/lib/components/ai-insight-dialog.component.js +441 -0
  87. package/src/lib/components/ai-insight-dialog.component.js.map +1 -0
  88. package/src/lib/components/ai-job-plan.component.d.ts +46 -0
  89. package/src/lib/components/ai-job-plan.component.js +192 -0
  90. package/src/lib/components/ai-job-plan.component.js.map +1 -0
  91. package/src/lib/components/ai-model-selector.component.d.ts +21 -0
  92. package/src/lib/components/ai-model-selector.component.js +109 -0
  93. package/src/lib/components/ai-model-selector.component.js.map +1 -0
  94. package/src/lib/components/ai-page-brief-dialog.component.d.ts +29 -0
  95. package/src/lib/components/ai-page-brief-dialog.component.js +27 -0
  96. package/src/lib/components/ai-page-brief-dialog.component.js.map +1 -0
  97. package/src/lib/components/ai-permissions-on-host.component.d.ts +55 -0
  98. package/src/lib/components/ai-permissions-on-host.component.js +91 -0
  99. package/src/lib/components/ai-permissions-on-host.component.js.map +1 -0
  100. package/src/lib/components/ai-product-copy-card.component.d.ts +25 -0
  101. package/src/lib/components/ai-product-copy-card.component.js +328 -0
  102. package/src/lib/components/ai-product-copy-card.component.js.map +1 -0
  103. package/src/lib/components/ai-product-import-option.component.d.ts +14 -0
  104. package/src/lib/components/ai-product-import-option.component.js +58 -0
  105. package/src/lib/components/ai-product-import-option.component.js.map +1 -0
  106. package/src/lib/components/ai-products-hub-card.component.d.ts +15 -0
  107. package/src/lib/components/ai-products-hub-card.component.js +418 -0
  108. package/src/lib/components/ai-products-hub-card.component.js.map +1 -0
  109. package/src/lib/components/ai-products-proposals.component.d.ts +19 -0
  110. package/src/lib/components/ai-products-proposals.component.js +547 -0
  111. package/src/lib/components/ai-products-proposals.component.js.map +1 -0
  112. package/src/lib/components/ai-save-as-component.component.d.ts +38 -0
  113. package/src/lib/components/ai-save-as-component.component.js +231 -0
  114. package/src/lib/components/ai-save-as-component.component.js.map +1 -0
  115. package/src/lib/components/ai-seo-audit-card.component.d.ts +9 -0
  116. package/src/lib/components/ai-seo-audit-card.component.js +620 -0
  117. package/src/lib/components/ai-seo-audit-card.component.js.map +1 -0
  118. package/src/lib/components/ai-seo-fields-card.component.d.ts +10 -0
  119. package/src/lib/components/ai-seo-fields-card.component.js +453 -0
  120. package/src/lib/components/ai-seo-fields-card.component.js.map +1 -0
  121. package/src/lib/components/ai-site-batch-card.component.d.ts +32 -0
  122. package/src/lib/components/ai-site-batch-card.component.js +531 -0
  123. package/src/lib/components/ai-site-batch-card.component.js.map +1 -0
  124. package/src/lib/components/ai-site-seo-start-card.component.d.ts +26 -0
  125. package/src/lib/components/ai-site-seo-start-card.component.js +178 -0
  126. package/src/lib/components/ai-site-seo-start-card.component.js.map +1 -0
  127. package/src/lib/components/ai-site-start-card.component.d.ts +19 -0
  128. package/src/lib/components/ai-site-start-card.component.js +348 -0
  129. package/src/lib/components/ai-site-start-card.component.js.map +1 -0
  130. package/src/lib/components/ai-template-collection-field.component.d.ts +32 -0
  131. package/src/lib/components/ai-template-collection-field.component.js +63 -0
  132. package/src/lib/components/ai-template-collection-field.component.js.map +1 -0
  133. package/src/lib/components/ai-theme-proposal-card.component.d.ts +6 -0
  134. package/src/lib/components/ai-theme-proposal-card.component.js +619 -0
  135. package/src/lib/components/ai-theme-proposal-card.component.js.map +1 -0
  136. package/src/lib/components/ai-usage-strip.component.d.ts +27 -0
  137. package/src/lib/components/ai-usage-strip.component.js +145 -0
  138. package/src/lib/components/ai-usage-strip.component.js.map +1 -0
  139. package/src/lib/components/assist-edit-canvas.d.ts +169 -0
  140. package/src/lib/components/assist-edit-canvas.js +636 -0
  141. package/src/lib/components/assist-edit-canvas.js.map +1 -0
  142. package/src/lib/components/assist-edit-card.component.d.ts +16 -0
  143. package/src/lib/components/assist-edit-card.component.js +181 -0
  144. package/src/lib/components/assist-edit-card.component.js.map +1 -0
  145. package/src/lib/components/assist-jobs-drawer.component.d.ts +72 -0
  146. package/src/lib/components/assist-jobs-drawer.component.js +626 -0
  147. package/src/lib/components/assist-jobs-drawer.component.js.map +1 -0
  148. package/src/lib/components/assist-panel.component.d.ts +136 -0
  149. package/src/lib/components/assist-panel.component.js +1099 -0
  150. package/src/lib/components/assist-panel.component.js.map +1 -0
  151. package/src/lib/components/assist-signals-page.component.d.ts +3 -0
  152. package/src/lib/components/assist-signals-page.component.js +1017 -0
  153. package/src/lib/components/assist-signals-page.component.js.map +1 -0
  154. package/src/lib/components/besigner-ai-controls.component.d.ts +29 -0
  155. package/src/lib/components/besigner-ai-controls.component.js +81 -0
  156. package/src/lib/components/besigner-ai-controls.component.js.map +1 -0
  157. package/src/lib/components/billing-ai-allotments.component.d.ts +36 -0
  158. package/src/lib/components/billing-ai-allotments.component.js +486 -0
  159. package/src/lib/components/billing-ai-allotments.component.js.map +1 -0
  160. package/src/lib/components/billing-ai-top-users.component.d.ts +44 -0
  161. package/src/lib/components/billing-ai-top-users.component.js +304 -0
  162. package/src/lib/components/billing-ai-top-users.component.js.map +1 -0
  163. package/src/lib/components/billing-assist-overage-card.component.d.ts +69 -0
  164. package/src/lib/components/billing-assist-overage-card.component.js +437 -0
  165. package/src/lib/components/billing-assist-overage-card.component.js.map +1 -0
  166. package/src/lib/components/host-ai-allotments.component.d.ts +40 -0
  167. package/src/lib/components/host-ai-allotments.component.js +239 -0
  168. package/src/lib/components/host-ai-allotments.component.js.map +1 -0
  169. package/src/lib/components/member-ai-allotment-card.component.d.ts +28 -0
  170. package/src/lib/components/member-ai-allotment-card.component.js +172 -0
  171. package/src/lib/components/member-ai-allotment-card.component.js.map +1 -0
  172. package/src/lib/components/member-ai-usage-card.component.d.ts +28 -0
  173. package/src/lib/components/member-ai-usage-card.component.js +240 -0
  174. package/src/lib/components/member-ai-usage-card.component.js.map +1 -0
  175. package/src/lib/components/staff-org-ai-card.component.d.ts +17 -0
  176. package/src/lib/components/staff-org-ai-card.component.js +739 -0
  177. package/src/lib/components/staff-org-ai-card.component.js.map +1 -0
  178. package/src/lib/components/staff-org-usage-ai-columns.component.d.ts +41 -0
  179. package/src/lib/components/staff-org-usage-ai-columns.component.js +65 -0
  180. package/src/lib/components/staff-org-usage-ai-columns.component.js.map +1 -0
  181. package/src/lib/components/staff-orgs-ai-spend-column.component.d.ts +28 -0
  182. package/src/lib/components/staff-orgs-ai-spend-column.component.js +89 -0
  183. package/src/lib/components/staff-orgs-ai-spend-column.component.js.map +1 -0
  184. package/src/lib/components/staff-user-ai-usage-card.component.d.ts +27 -0
  185. package/src/lib/components/staff-user-ai-usage-card.component.js +183 -0
  186. package/src/lib/components/staff-user-ai-usage-card.component.js.map +1 -0
  187. package/src/lib/components/use-ai-allotments.d.ts +49 -0
  188. package/src/lib/components/use-ai-allotments.js +171 -0
  189. package/src/lib/components/use-ai-allotments.js.map +1 -0
  190. package/src/lib/components/use-ai-crm-answer.d.ts +50 -0
  191. package/src/lib/components/use-ai-crm-answer.js +220 -0
  192. package/src/lib/components/use-ai-crm-answer.js.map +1 -0
  193. package/src/lib/components/use-ai-job-run.d.ts +51 -0
  194. package/src/lib/components/use-ai-job-run.js +176 -0
  195. package/src/lib/components/use-ai-job-run.js.map +1 -0
  196. package/src/lib/components/use-ai-model-choice.d.ts +47 -0
  197. package/src/lib/components/use-ai-model-choice.js +150 -0
  198. package/src/lib/components/use-ai-model-choice.js.map +1 -0
  199. package/src/lib/components/use-ai-products-jobs.d.ts +36 -0
  200. package/src/lib/components/use-ai-products-jobs.js +190 -0
  201. package/src/lib/components/use-ai-products-jobs.js.map +1 -0
  202. package/src/lib/components/use-ai-usage-meter.d.ts +11 -0
  203. package/src/lib/components/use-ai-usage-meter.js +96 -0
  204. package/src/lib/components/use-ai-usage-meter.js.map +1 -0
  205. package/src/lib/components/use-org-ai-usage.d.ts +42 -0
  206. package/src/lib/components/use-org-ai-usage.js +181 -0
  207. package/src/lib/components/use-org-ai-usage.js.map +1 -0
  208. package/src/lib/components/use-staff-orgs-ai-spend.d.ts +18 -0
  209. package/src/lib/components/use-staff-orgs-ai-spend.js +127 -0
  210. package/src/lib/components/use-staff-orgs-ai-spend.js.map +1 -0
  211. package/src/lib/constants.d.ts +24 -0
  212. package/src/lib/constants.js +23 -0
  213. package/src/lib/constants.js.map +1 -0
  214. package/src/lib/declarations.d.ts +48 -0
  215. package/src/lib/declarations.js +129 -0
  216. package/src/lib/declarations.js.map +1 -0
  217. package/src/lib/declarations.server.d.ts +35 -0
  218. package/src/lib/declarations.server.js +138 -0
  219. package/src/lib/declarations.server.js.map +1 -0
  220. package/src/lib/insights/ai-figure-readers.d.ts +90 -0
  221. package/src/lib/insights/ai-figure-readers.js +863 -0
  222. package/src/lib/insights/ai-figure-readers.js.map +1 -0
  223. package/src/lib/insights/ai-insight-digest.d.ts +165 -0
  224. package/src/lib/insights/ai-insight-digest.js +363 -0
  225. package/src/lib/insights/ai-insight-digest.js.map +1 -0
  226. package/src/lib/insights/ai-insight-readers.d.ts +71 -0
  227. package/src/lib/insights/ai-insight-readers.js +141 -0
  228. package/src/lib/insights/ai-insight-readers.js.map +1 -0
  229. package/src/lib/jobs/ai-crm-access.d.ts +61 -0
  230. package/src/lib/jobs/ai-crm-access.js +94 -0
  231. package/src/lib/jobs/ai-crm-access.js.map +1 -0
  232. package/src/lib/jobs/ai-email-bindings.d.ts +97 -0
  233. package/src/lib/jobs/ai-email-bindings.js +147 -0
  234. package/src/lib/jobs/ai-email-bindings.js.map +1 -0
  235. package/src/lib/jobs/ai-job-admission.d.ts +82 -0
  236. package/src/lib/jobs/ai-job-admission.js +45 -0
  237. package/src/lib/jobs/ai-job-admission.js.map +1 -0
  238. package/src/lib/jobs/ai-job-budget.d.ts +167 -0
  239. package/src/lib/jobs/ai-job-budget.js +161 -0
  240. package/src/lib/jobs/ai-job-budget.js.map +1 -0
  241. package/src/lib/jobs/ai-job-campaign-step.d.ts +108 -0
  242. package/src/lib/jobs/ai-job-campaign-step.js +340 -0
  243. package/src/lib/jobs/ai-job-campaign-step.js.map +1 -0
  244. package/src/lib/jobs/ai-job-component-checks.d.ts +74 -0
  245. package/src/lib/jobs/ai-job-component-checks.js +442 -0
  246. package/src/lib/jobs/ai-job-component-checks.js.map +1 -0
  247. package/src/lib/jobs/ai-job-component-step.d.ts +75 -0
  248. package/src/lib/jobs/ai-job-component-step.js +262 -0
  249. package/src/lib/jobs/ai-job-component-step.js.map +1 -0
  250. package/src/lib/jobs/ai-job-crm-step.d.ts +192 -0
  251. package/src/lib/jobs/ai-job-crm-step.js +734 -0
  252. package/src/lib/jobs/ai-job-crm-step.js.map +1 -0
  253. package/src/lib/jobs/ai-job-draft-ids.d.ts +62 -0
  254. package/src/lib/jobs/ai-job-draft-ids.js +132 -0
  255. package/src/lib/jobs/ai-job-draft-ids.js.map +1 -0
  256. package/src/lib/jobs/ai-job-drafts.d.ts +304 -0
  257. package/src/lib/jobs/ai-job-drafts.js +557 -0
  258. package/src/lib/jobs/ai-job-drafts.js.map +1 -0
  259. package/src/lib/jobs/ai-job-email-step.d.ts +195 -0
  260. package/src/lib/jobs/ai-job-email-step.js +547 -0
  261. package/src/lib/jobs/ai-job-email-step.js.map +1 -0
  262. package/src/lib/jobs/ai-job-experiment-step.d.ts +105 -0
  263. package/src/lib/jobs/ai-job-experiment-step.js +445 -0
  264. package/src/lib/jobs/ai-job-experiment-step.js.map +1 -0
  265. package/src/lib/jobs/ai-job-form-step.d.ts +250 -0
  266. package/src/lib/jobs/ai-job-form-step.js +634 -0
  267. package/src/lib/jobs/ai-job-form-step.js.map +1 -0
  268. package/src/lib/jobs/ai-job-generation.d.ts +114 -0
  269. package/src/lib/jobs/ai-job-generation.js +384 -0
  270. package/src/lib/jobs/ai-job-generation.js.map +1 -0
  271. package/src/lib/jobs/ai-job-insight-budget.d.ts +41 -0
  272. package/src/lib/jobs/ai-job-insight-budget.js +46 -0
  273. package/src/lib/jobs/ai-job-insight-budget.js.map +1 -0
  274. package/src/lib/jobs/ai-job-insight-step.d.ts +58 -0
  275. package/src/lib/jobs/ai-job-insight-step.js +350 -0
  276. package/src/lib/jobs/ai-job-insight-step.js.map +1 -0
  277. package/src/lib/jobs/ai-job-layout-step.d.ts +103 -0
  278. package/src/lib/jobs/ai-job-layout-step.js +340 -0
  279. package/src/lib/jobs/ai-job-layout-step.js.map +1 -0
  280. package/src/lib/jobs/ai-job-page-budget.d.ts +57 -0
  281. package/src/lib/jobs/ai-job-page-budget.js +60 -0
  282. package/src/lib/jobs/ai-job-page-budget.js.map +1 -0
  283. package/src/lib/jobs/ai-job-page-sections.d.ts +150 -0
  284. package/src/lib/jobs/ai-job-page-sections.js +450 -0
  285. package/src/lib/jobs/ai-job-page-sections.js.map +1 -0
  286. package/src/lib/jobs/ai-job-page-step.d.ts +198 -0
  287. package/src/lib/jobs/ai-job-page-step.js +667 -0
  288. package/src/lib/jobs/ai-job-page-step.js.map +1 -0
  289. package/src/lib/jobs/ai-job-plan-conformance.d.ts +107 -0
  290. package/src/lib/jobs/ai-job-plan-conformance.js +164 -0
  291. package/src/lib/jobs/ai-job-plan-conformance.js.map +1 -0
  292. package/src/lib/jobs/ai-job-plan-step.d.ts +196 -0
  293. package/src/lib/jobs/ai-job-plan-step.js +458 -0
  294. package/src/lib/jobs/ai-job-plan-step.js.map +1 -0
  295. package/src/lib/jobs/ai-job-plugin-drafts.d.ts +76 -0
  296. package/src/lib/jobs/ai-job-plugin-drafts.js +91 -0
  297. package/src/lib/jobs/ai-job-plugin-drafts.js.map +1 -0
  298. package/src/lib/jobs/ai-job-products-step.d.ts +106 -0
  299. package/src/lib/jobs/ai-job-products-step.js +436 -0
  300. package/src/lib/jobs/ai-job-products-step.js.map +1 -0
  301. package/src/lib/jobs/ai-job-seo-budget.d.ts +52 -0
  302. package/src/lib/jobs/ai-job-seo-budget.js +63 -0
  303. package/src/lib/jobs/ai-job-seo-budget.js.map +1 -0
  304. package/src/lib/jobs/ai-job-seo-step.d.ts +145 -0
  305. package/src/lib/jobs/ai-job-seo-step.js +809 -0
  306. package/src/lib/jobs/ai-job-seo-step.js.map +1 -0
  307. package/src/lib/jobs/ai-job-site-step.d.ts +252 -0
  308. package/src/lib/jobs/ai-job-site-step.js +538 -0
  309. package/src/lib/jobs/ai-job-site-step.js.map +1 -0
  310. package/src/lib/jobs/ai-job-template-step.d.ts +105 -0
  311. package/src/lib/jobs/ai-job-template-step.js +391 -0
  312. package/src/lib/jobs/ai-job-template-step.js.map +1 -0
  313. package/src/lib/jobs/ai-job-text-step.d.ts +125 -0
  314. package/src/lib/jobs/ai-job-text-step.js +128 -0
  315. package/src/lib/jobs/ai-job-text-step.js.map +1 -0
  316. package/src/lib/jobs/ai-job-theme-budget.d.ts +38 -0
  317. package/src/lib/jobs/ai-job-theme-budget.js +43 -0
  318. package/src/lib/jobs/ai-job-theme-budget.js.map +1 -0
  319. package/src/lib/jobs/ai-job-theme-step.d.ts +115 -0
  320. package/src/lib/jobs/ai-job-theme-step.js +337 -0
  321. package/src/lib/jobs/ai-job-theme-step.js.map +1 -0
  322. package/src/lib/jobs/ai-job-workflow-step.d.ts +139 -0
  323. package/src/lib/jobs/ai-job-workflow-step.js +530 -0
  324. package/src/lib/jobs/ai-job-workflow-step.js.map +1 -0
  325. package/src/lib/jobs/ai-jobs-beat.d.ts +78 -0
  326. package/src/lib/jobs/ai-jobs-beat.js +93 -0
  327. package/src/lib/jobs/ai-jobs-beat.js.map +1 -0
  328. package/src/lib/jobs/ai-jobs-pause.d.ts +38 -0
  329. package/src/lib/jobs/ai-jobs-pause.js +45 -0
  330. package/src/lib/jobs/ai-jobs-pause.js.map +1 -0
  331. package/src/lib/jobs/ai-jobs.d.ts +558 -0
  332. package/src/lib/jobs/ai-jobs.js +1410 -0
  333. package/src/lib/jobs/ai-jobs.js.map +1 -0
  334. package/src/lib/jobs/ai-media-asset-server.d.ts +34 -0
  335. package/src/lib/jobs/ai-media-asset-server.js +34 -0
  336. package/src/lib/jobs/ai-media-asset-server.js.map +1 -0
  337. package/src/lib/jobs/ai-media-asset.d.ts +59 -0
  338. package/src/lib/jobs/ai-media-asset.js +86 -0
  339. package/src/lib/jobs/ai-media-asset.js.map +1 -0
  340. package/src/lib/jobs/ai-product-image.d.ts +78 -0
  341. package/src/lib/jobs/ai-product-image.js +113 -0
  342. package/src/lib/jobs/ai-product-image.js.map +1 -0
  343. package/src/lib/jobs/ai-theme-brand-inputs.d.ts +125 -0
  344. package/src/lib/jobs/ai-theme-brand-inputs.js +378 -0
  345. package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -0
  346. package/src/lib/jobs/ai-theme-brand-server.d.ts +33 -0
  347. package/src/lib/jobs/ai-theme-brand-server.js +33 -0
  348. package/src/lib/jobs/ai-theme-brand-server.js.map +1 -0
  349. package/src/lib/jobs/ai-workflow-records.d.ts +84 -0
  350. package/src/lib/jobs/ai-workflow-records.js +158 -0
  351. package/src/lib/jobs/ai-workflow-records.js.map +1 -0
  352. package/src/lib/jobs/fixtures/ai-free-page-built-recording.d.ts +31 -0
  353. package/src/lib/jobs/fixtures/ai-free-page-built-recording.js +367 -0
  354. package/src/lib/jobs/fixtures/ai-free-page-built-recording.js.map +1 -0
  355. package/src/lib/jobs/fixtures/ai-free-page-recording.d.ts +69 -0
  356. package/src/lib/jobs/fixtures/ai-free-page-recording.js +442 -0
  357. package/src/lib/jobs/fixtures/ai-free-page-recording.js.map +1 -0
  358. package/src/lib/jobs/fixtures/ai-page-briefs.d.ts +146 -0
  359. package/src/lib/jobs/fixtures/ai-page-briefs.js +1850 -0
  360. package/src/lib/jobs/fixtures/ai-page-briefs.js.map +1 -0
  361. package/src/lib/model/ai-allotments.d.ts +208 -0
  362. package/src/lib/model/ai-allotments.js +269 -0
  363. package/src/lib/model/ai-allotments.js.map +1 -0
  364. package/src/lib/model/ai-automation-draft.d.ts +74 -0
  365. package/src/lib/model/ai-automation-draft.js +310 -0
  366. package/src/lib/model/ai-automation-draft.js.map +1 -0
  367. package/src/lib/model/ai-automation-outline.d.ts +50 -0
  368. package/src/lib/model/ai-automation-outline.js +262 -0
  369. package/src/lib/model/ai-automation-outline.js.map +1 -0
  370. package/src/lib/model/ai-build-plan.d.ts +197 -0
  371. package/src/lib/model/ai-build-plan.js +438 -0
  372. package/src/lib/model/ai-build-plan.js.map +1 -0
  373. package/src/lib/model/ai-crm.d.ts +237 -0
  374. package/src/lib/model/ai-crm.js +225 -0
  375. package/src/lib/model/ai-crm.js.map +1 -0
  376. package/src/lib/model/ai-experiment-proposal.d.ts +68 -0
  377. package/src/lib/model/ai-experiment-proposal.js +146 -0
  378. package/src/lib/model/ai-experiment-proposal.js.map +1 -0
  379. package/src/lib/model/ai-experiment.d.ts +309 -0
  380. package/src/lib/model/ai-experiment.js +395 -0
  381. package/src/lib/model/ai-experiment.js.map +1 -0
  382. package/src/lib/model/ai-insight.d.ts +178 -0
  383. package/src/lib/model/ai-insight.js +201 -0
  384. package/src/lib/model/ai-insight.js.map +1 -0
  385. package/src/lib/model/ai-jobs.types.d.ts +412 -0
  386. package/src/lib/model/ai-jobs.types.js +42 -0
  387. package/src/lib/model/ai-jobs.types.js.map +1 -0
  388. package/src/lib/model/ai-page-job.d.ts +92 -0
  389. package/src/lib/model/ai-page-job.js +159 -0
  390. package/src/lib/model/ai-page-job.js.map +1 -0
  391. package/src/lib/model/ai-permissions.d.ts +49 -0
  392. package/src/lib/model/ai-permissions.js +97 -0
  393. package/src/lib/model/ai-permissions.js.map +1 -0
  394. package/src/lib/model/ai-plan-capabilities.d.ts +139 -0
  395. package/src/lib/model/ai-plan-capabilities.js +149 -0
  396. package/src/lib/model/ai-plan-capabilities.js.map +1 -0
  397. package/src/lib/model/ai-products.d.ts +251 -0
  398. package/src/lib/model/ai-products.js +253 -0
  399. package/src/lib/model/ai-products.js.map +1 -0
  400. package/src/lib/model/ai-seo.d.ts +208 -0
  401. package/src/lib/model/ai-seo.js +150 -0
  402. package/src/lib/model/ai-seo.js.map +1 -0
  403. package/src/lib/model/ai-site-inventory.d.ts +164 -0
  404. package/src/lib/model/ai-site-inventory.js +145 -0
  405. package/src/lib/model/ai-site-inventory.js.map +1 -0
  406. package/src/lib/model/ai-site-job.d.ts +247 -0
  407. package/src/lib/model/ai-site-job.js +314 -0
  408. package/src/lib/model/ai-site-job.js.map +1 -0
  409. package/src/lib/model/ai-site-start-seo.d.ts +103 -0
  410. package/src/lib/model/ai-site-start-seo.js +154 -0
  411. package/src/lib/model/ai-site-start-seo.js.map +1 -0
  412. package/src/lib/model/ai-site-start.d.ts +122 -0
  413. package/src/lib/model/ai-site-start.js +159 -0
  414. package/src/lib/model/ai-site-start.js.map +1 -0
  415. package/src/lib/model/ai-site-switch.d.ts +56 -0
  416. package/src/lib/model/ai-site-switch.js +73 -0
  417. package/src/lib/model/ai-site-switch.js.map +1 -0
  418. package/src/lib/model/ai-storefront-claims.d.ts +70 -0
  419. package/src/lib/model/ai-storefront-claims.js +130 -0
  420. package/src/lib/model/ai-storefront-claims.js.map +1 -0
  421. package/src/lib/model/ai-template-subjects.d.ts +82 -0
  422. package/src/lib/model/ai-template-subjects.js +136 -0
  423. package/src/lib/model/ai-template-subjects.js.map +1 -0
  424. package/src/lib/model/ai-theme-proposal.d.ts +210 -0
  425. package/src/lib/model/ai-theme-proposal.js +506 -0
  426. package/src/lib/model/ai-theme-proposal.js.map +1 -0
  427. package/src/lib/model/ai-tokens.d.ts +96 -0
  428. package/src/lib/model/ai-tokens.js +117 -0
  429. package/src/lib/model/ai-tokens.js.map +1 -0
  430. package/src/lib/model/ai-usage-by-user.d.ts +120 -0
  431. package/src/lib/model/ai-usage-by-user.js +139 -0
  432. package/src/lib/model/ai-usage-by-user.js.map +1 -0
  433. package/src/lib/model/ai-workflow-job.d.ts +111 -0
  434. package/src/lib/model/ai-workflow-job.js +183 -0
  435. package/src/lib/model/ai-workflow-job.js.map +1 -0
  436. package/src/lib/model/assist-edit.d.ts +261 -0
  437. package/src/lib/model/assist-edit.js +175 -0
  438. package/src/lib/model/assist-edit.js.map +1 -0
  439. package/src/lib/plugin-config.d.ts +33 -0
  440. package/src/lib/plugin-config.js +118 -0
  441. package/src/lib/plugin-config.js.map +1 -0
  442. package/src/lib/plugin.d.ts +30 -0
  443. package/src/lib/plugin.js +525 -0
  444. package/src/lib/plugin.js.map +1 -0
  445. package/src/lib/providers/anthropic.d.ts +84 -0
  446. package/src/lib/providers/anthropic.js +432 -0
  447. package/src/lib/providers/anthropic.js.map +1 -0
  448. package/src/lib/providers/catalog.d.ts +197 -0
  449. package/src/lib/providers/catalog.js +312 -0
  450. package/src/lib/providers/catalog.js.map +1 -0
  451. package/src/lib/providers/contract.d.ts +464 -0
  452. package/src/lib/providers/contract.js +274 -0
  453. package/src/lib/providers/contract.js.map +1 -0
  454. package/src/lib/providers/model-choice.d.ts +119 -0
  455. package/src/lib/providers/model-choice.js +416 -0
  456. package/src/lib/providers/model-choice.js.map +1 -0
  457. package/src/lib/providers/openai-compatible.d.ts +58 -0
  458. package/src/lib/providers/openai-compatible.js +361 -0
  459. package/src/lib/providers/openai-compatible.js.map +1 -0
  460. package/src/lib/providers/registry.d.ts +49 -0
  461. package/src/lib/providers/registry.js +71 -0
  462. package/src/lib/providers/registry.js.map +1 -0
  463. package/src/lib/providers/routing.d.ts +98 -0
  464. package/src/lib/providers/routing.js +450 -0
  465. package/src/lib/providers/routing.js.map +1 -0
  466. package/src/lib/runtime/ai-abuse-guards.d.ts +113 -0
  467. package/src/lib/runtime/ai-abuse-guards.js +148 -0
  468. package/src/lib/runtime/ai-abuse-guards.js.map +1 -0
  469. package/src/lib/runtime/ai-component-bindings.d.ts +67 -0
  470. package/src/lib/runtime/ai-component-bindings.js +106 -0
  471. package/src/lib/runtime/ai-component-bindings.js.map +1 -0
  472. package/src/lib/runtime/ai-device-audit.d.ts +109 -0
  473. package/src/lib/runtime/ai-device-audit.js +97 -0
  474. package/src/lib/runtime/ai-device-audit.js.map +1 -0
  475. package/src/lib/runtime/ai-doctrine-validators.d.ts +720 -0
  476. package/src/lib/runtime/ai-doctrine-validators.js +3133 -0
  477. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -0
  478. package/src/lib/runtime/ai-doctrine.d.ts +372 -0
  479. package/src/lib/runtime/ai-doctrine.js +944 -0
  480. package/src/lib/runtime/ai-doctrine.js.map +1 -0
  481. package/src/lib/runtime/ai-eval-live.d.ts +321 -0
  482. package/src/lib/runtime/ai-eval-live.js +1257 -0
  483. package/src/lib/runtime/ai-eval-live.js.map +1 -0
  484. package/src/lib/runtime/ai-eval-memory-firestore.d.ts +51 -0
  485. package/src/lib/runtime/ai-eval-memory-firestore.js +183 -0
  486. package/src/lib/runtime/ai-eval-memory-firestore.js.map +1 -0
  487. package/src/lib/runtime/ai-eval.d.ts +441 -0
  488. package/src/lib/runtime/ai-eval.js +1151 -0
  489. package/src/lib/runtime/ai-eval.js.map +1 -0
  490. package/src/lib/runtime/ai-gate.d.ts +130 -0
  491. package/src/lib/runtime/ai-gate.js +272 -0
  492. package/src/lib/runtime/ai-gate.js.map +1 -0
  493. package/src/lib/runtime/ai-generation-bounds.d.ts +24 -0
  494. package/src/lib/runtime/ai-generation-bounds.js +23 -0
  495. package/src/lib/runtime/ai-generation-bounds.js.map +1 -0
  496. package/src/lib/runtime/ai-insight-check.d.ts +76 -0
  497. package/src/lib/runtime/ai-insight-check.js +281 -0
  498. package/src/lib/runtime/ai-insight-check.js.map +1 -0
  499. package/src/lib/runtime/ai-node-tree.d.ts +181 -0
  500. package/src/lib/runtime/ai-node-tree.js +931 -0
  501. package/src/lib/runtime/ai-node-tree.js.map +1 -0
  502. package/src/lib/runtime/ai-page-links.d.ts +79 -0
  503. package/src/lib/runtime/ai-page-links.js +135 -0
  504. package/src/lib/runtime/ai-page-links.js.map +1 -0
  505. package/src/lib/runtime/ai-palette.d.ts +252 -0
  506. package/src/lib/runtime/ai-palette.generated.d.ts +34 -0
  507. package/src/lib/runtime/ai-palette.generated.js +5263 -0
  508. package/src/lib/runtime/ai-palette.generated.js.map +1 -0
  509. package/src/lib/runtime/ai-palette.js +187 -0
  510. package/src/lib/runtime/ai-palette.js.map +1 -0
  511. package/src/lib/runtime/ai-products-generation.d.ts +107 -0
  512. package/src/lib/runtime/ai-products-generation.js +250 -0
  513. package/src/lib/runtime/ai-products-generation.js.map +1 -0
  514. package/src/lib/runtime/ai-repeated-items.d.ts +95 -0
  515. package/src/lib/runtime/ai-repeated-items.js +397 -0
  516. package/src/lib/runtime/ai-repeated-items.js.map +1 -0
  517. package/src/lib/runtime/ai-runtime.d.ts +148 -0
  518. package/src/lib/runtime/ai-runtime.js +237 -0
  519. package/src/lib/runtime/ai-runtime.js.map +1 -0
  520. package/src/lib/runtime/ai-template-examples.d.ts +71 -0
  521. package/src/lib/runtime/ai-template-examples.js +135 -0
  522. package/src/lib/runtime/ai-template-examples.js.map +1 -0
  523. package/src/lib/runtime/assist-answer-cache.d.ts +80 -0
  524. package/src/lib/runtime/assist-answer-cache.js +184 -0
  525. package/src/lib/runtime/assist-answer-cache.js.map +1 -0
  526. package/src/lib/runtime/seo-audit.d.ts +93 -0
  527. package/src/lib/runtime/seo-audit.js +260 -0
  528. package/src/lib/runtime/seo-audit.js.map +1 -0
  529. package/src/lib/runtime/seo-content-fixes.d.ts +41 -0
  530. package/src/lib/runtime/seo-content-fixes.js +168 -0
  531. package/src/lib/runtime/seo-content-fixes.js.map +1 -0
  532. package/src/lib/runtime/seo-fields.d.ts +152 -0
  533. package/src/lib/runtime/seo-fields.js +215 -0
  534. package/src/lib/runtime/seo-fields.js.map +1 -0
  535. package/src/lib/runtime/seo-page-facts.d.ts +61 -0
  536. package/src/lib/runtime/seo-page-facts.js +150 -0
  537. package/src/lib/runtime/seo-page-facts.js.map +1 -0
  538. package/src/lib/runtime/site-inventory.d.ts +63 -0
  539. package/src/lib/runtime/site-inventory.js +230 -0
  540. package/src/lib/runtime/site-inventory.js.map +1 -0
  541. package/src/lib/server/ai-admin-org.d.ts +33 -0
  542. package/src/lib/server/ai-admin-org.js +381 -0
  543. package/src/lib/server/ai-admin-org.js.map +1 -0
  544. package/src/lib/server/ai-admin-orgs-spend.d.ts +40 -0
  545. package/src/lib/server/ai-admin-orgs-spend.js +129 -0
  546. package/src/lib/server/ai-admin-orgs-spend.js.map +1 -0
  547. package/src/lib/server/ai-admin-overage.d.ts +19 -0
  548. package/src/lib/server/ai-admin-overage.js +246 -0
  549. package/src/lib/server/ai-admin-overage.js.map +1 -0
  550. package/src/lib/server/ai-admin-signals.d.ts +34 -0
  551. package/src/lib/server/ai-admin-signals.js +330 -0
  552. package/src/lib/server/ai-admin-signals.js.map +1 -0
  553. package/src/lib/server/ai-admin-user.d.ts +27 -0
  554. package/src/lib/server/ai-admin-user.js +128 -0
  555. package/src/lib/server/ai-admin-user.js.map +1 -0
  556. package/src/lib/server/ai-allotments.d.ts +27 -0
  557. package/src/lib/server/ai-allotments.js +544 -0
  558. package/src/lib/server/ai-allotments.js.map +1 -0
  559. package/src/lib/server/ai-assist-prompts.d.ts +102 -0
  560. package/src/lib/server/ai-assist-prompts.js +207 -0
  561. package/src/lib/server/ai-assist-prompts.js.map +1 -0
  562. package/src/lib/server/ai-assist.d.ts +119 -0
  563. package/src/lib/server/ai-assist.js +517 -0
  564. package/src/lib/server/ai-assist.js.map +1 -0
  565. package/src/lib/server/ai-crm-answer.d.ts +30 -0
  566. package/src/lib/server/ai-crm-answer.js +98 -0
  567. package/src/lib/server/ai-crm-answer.js.map +1 -0
  568. package/src/lib/server/ai-generate-component.d.ts +111 -0
  569. package/src/lib/server/ai-generate-component.js +643 -0
  570. package/src/lib/server/ai-generate-component.js.map +1 -0
  571. package/src/lib/server/ai-host-permissions.d.ts +46 -0
  572. package/src/lib/server/ai-host-permissions.js +204 -0
  573. package/src/lib/server/ai-host-permissions.js.map +1 -0
  574. package/src/lib/server/ai-insight-answer.d.ts +30 -0
  575. package/src/lib/server/ai-insight-answer.js +83 -0
  576. package/src/lib/server/ai-insight-answer.js.map +1 -0
  577. package/src/lib/server/ai-insight-digest-route.d.ts +30 -0
  578. package/src/lib/server/ai-insight-digest-route.js +156 -0
  579. package/src/lib/server/ai-insight-digest-route.js.map +1 -0
  580. package/src/lib/server/ai-jobs-batch.d.ts +48 -0
  581. package/src/lib/server/ai-jobs-batch.js +306 -0
  582. package/src/lib/server/ai-jobs-batch.js.map +1 -0
  583. package/src/lib/server/ai-jobs-beat-route.d.ts +36 -0
  584. package/src/lib/server/ai-jobs-beat-route.js +86 -0
  585. package/src/lib/server/ai-jobs-beat-route.js.map +1 -0
  586. package/src/lib/server/ai-jobs-cancel.d.ts +30 -0
  587. package/src/lib/server/ai-jobs-cancel.js +74 -0
  588. package/src/lib/server/ai-jobs-cancel.js.map +1 -0
  589. package/src/lib/server/ai-jobs-events-route.d.ts +31 -0
  590. package/src/lib/server/ai-jobs-events-route.js +51 -0
  591. package/src/lib/server/ai-jobs-events-route.js.map +1 -0
  592. package/src/lib/server/ai-jobs-events.d.ts +55 -0
  593. package/src/lib/server/ai-jobs-events.js +144 -0
  594. package/src/lib/server/ai-jobs-events.js.map +1 -0
  595. package/src/lib/server/ai-jobs-gate.d.ts +47 -0
  596. package/src/lib/server/ai-jobs-gate.js +106 -0
  597. package/src/lib/server/ai-jobs-gate.js.map +1 -0
  598. package/src/lib/server/ai-jobs-resume.d.ts +23 -0
  599. package/src/lib/server/ai-jobs-resume.js +209 -0
  600. package/src/lib/server/ai-jobs-resume.js.map +1 -0
  601. package/src/lib/server/ai-jobs-route.d.ts +32 -0
  602. package/src/lib/server/ai-jobs-route.js +307 -0
  603. package/src/lib/server/ai-jobs-route.js.map +1 -0
  604. package/src/lib/server/ai-models.d.ts +18 -0
  605. package/src/lib/server/ai-models.js +134 -0
  606. package/src/lib/server/ai-models.js.map +1 -0
  607. package/src/lib/server/ai-seo-apply.d.ts +53 -0
  608. package/src/lib/server/ai-seo-apply.js +294 -0
  609. package/src/lib/server/ai-seo-apply.js.map +1 -0
  610. package/src/lib/server/ai-usage.d.ts +18 -0
  611. package/src/lib/server/ai-usage.js +220 -0
  612. package/src/lib/server/ai-usage.js.map +1 -0
  613. package/src/lib/server/assist-chat.d.ts +234 -0
  614. package/src/lib/server/assist-chat.js +1446 -0
  615. package/src/lib/server/assist-chat.js.map +1 -0
  616. package/src/lib/server/assist-edit-applied.d.ts +22 -0
  617. package/src/lib/server/assist-edit-applied.js +239 -0
  618. package/src/lib/server/assist-edit-applied.js.map +1 -0
  619. package/src/lib/server/assist-edit.d.ts +124 -0
  620. package/src/lib/server/assist-edit.js +1000 -0
  621. package/src/lib/server/assist-edit.js.map +1 -0
  622. package/src/lib/server/assist-feedback.d.ts +31 -0
  623. package/src/lib/server/assist-feedback.js +115 -0
  624. package/src/lib/server/assist-feedback.js.map +1 -0
  625. package/src/lib/server/assist-view-context.d.ts +343 -0
  626. package/src/lib/server/assist-view-context.js +690 -0
  627. package/src/lib/server/assist-view-context.js.map +1 -0
  628. package/src/lib/server/billing-credits.d.ts +59 -0
  629. package/src/lib/server/billing-credits.js +146 -0
  630. package/src/lib/server/billing-credits.js.map +1 -0
  631. package/src/lib/server/billing-overage.d.ts +19 -0
  632. package/src/lib/server/billing-overage.js +337 -0
  633. package/src/lib/server/billing-overage.js.map +1 -0
  634. package/src/lib/server.d.ts +32 -0
  635. package/src/lib/server.js +265 -0
  636. package/src/lib/server.js.map +1 -0
  637. package/src/lib/subprocessors.d.ts +18 -0
  638. package/src/lib/subprocessors.js +52 -0
  639. package/src/lib/subprocessors.js.map +1 -0
  640. package/src/lib/tools/ai-component-tool.d.ts +99 -0
  641. package/src/lib/tools/ai-component-tool.js +369 -0
  642. package/src/lib/tools/ai-component-tool.js.map +1 -0
  643. package/src/lib/tools/ai-crm-tool.d.ts +106 -0
  644. package/src/lib/tools/ai-crm-tool.js +488 -0
  645. package/src/lib/tools/ai-crm-tool.js.map +1 -0
  646. package/src/lib/tools/ai-duplicate-resource-tool.d.ts +71 -0
  647. package/src/lib/tools/ai-duplicate-resource-tool.js +164 -0
  648. package/src/lib/tools/ai-duplicate-resource-tool.js.map +1 -0
  649. package/src/lib/tools/ai-experiment-tool.d.ts +40 -0
  650. package/src/lib/tools/ai-experiment-tool.js +155 -0
  651. package/src/lib/tools/ai-experiment-tool.js.map +1 -0
  652. package/src/lib/tools/ai-insight-tool.d.ts +46 -0
  653. package/src/lib/tools/ai-insight-tool.js +200 -0
  654. package/src/lib/tools/ai-insight-tool.js.map +1 -0
  655. package/src/lib/tools/ai-inventory-lookup-tool.d.ts +86 -0
  656. package/src/lib/tools/ai-inventory-lookup-tool.js +164 -0
  657. package/src/lib/tools/ai-inventory-lookup-tool.js.map +1 -0
  658. package/src/lib/tools/ai-products-tool.d.ts +65 -0
  659. package/src/lib/tools/ai-products-tool.js +644 -0
  660. package/src/lib/tools/ai-products-tool.js.map +1 -0
  661. package/src/lib/tools/ai-seo-tool.d.ts +162 -0
  662. package/src/lib/tools/ai-seo-tool.js +546 -0
  663. package/src/lib/tools/ai-seo-tool.js.map +1 -0
  664. package/src/lib/tools/ai-theme-tool.d.ts +101 -0
  665. package/src/lib/tools/ai-theme-tool.js +562 -0
  666. package/src/lib/tools/ai-theme-tool.js.map +1 -0
  667. package/src/lib/tools/ai-workflow-tool.d.ts +166 -0
  668. package/src/lib/tools/ai-workflow-tool.js +860 -0
  669. package/src/lib/tools/ai-workflow-tool.js.map +1 -0
  670. package/src/lib/usage/ai-allotment-alerts.d.ts +72 -0
  671. package/src/lib/usage/ai-allotment-alerts.js +157 -0
  672. package/src/lib/usage/ai-allotment-alerts.js.map +1 -0
  673. package/src/lib/usage/ai-allotments.d.ts +125 -0
  674. package/src/lib/usage/ai-allotments.js +239 -0
  675. package/src/lib/usage/ai-allotments.js.map +1 -0
  676. package/src/lib/usage/ai-model-sample.d.ts +36 -0
  677. package/src/lib/usage/ai-model-sample.js +68 -0
  678. package/src/lib/usage/ai-model-sample.js.map +1 -0
  679. package/src/lib/usage/ai-usage-alerts.d.ts +55 -0
  680. package/src/lib/usage/ai-usage-alerts.js +114 -0
  681. package/src/lib/usage/ai-usage-alerts.js.map +1 -0
  682. package/src/lib/usage/ai-usage-by-user.d.ts +161 -0
  683. package/src/lib/usage/ai-usage-by-user.js +211 -0
  684. package/src/lib/usage/ai-usage-by-user.js.map +1 -0
  685. package/src/lib/usage/ai-usage-eraser.d.ts +29 -0
  686. package/src/lib/usage/ai-usage-eraser.js +40 -0
  687. package/src/lib/usage/ai-usage-eraser.js.map +1 -0
  688. package/src/lib/usage/ai-usage-meter.d.ts +39 -0
  689. package/src/lib/usage/ai-usage-meter.js +85 -0
  690. package/src/lib/usage/ai-usage-meter.js.map +1 -0
  691. package/src/lib/usage/ai-usage-wire.d.ts +184 -0
  692. package/src/lib/usage/ai-usage-wire.js +98 -0
  693. package/src/lib/usage/ai-usage-wire.js.map +1 -0
  694. package/src/lib/usage/assist-ceiling.d.ts +87 -0
  695. package/src/lib/usage/assist-ceiling.js +110 -0
  696. package/src/lib/usage/assist-ceiling.js.map +1 -0
  697. package/src/lib/usage/assist-free-taste.d.ts +225 -0
  698. package/src/lib/usage/assist-free-taste.js +308 -0
  699. package/src/lib/usage/assist-free-taste.js.map +1 -0
  700. package/src/lib/usage/assist-refusals.d.ts +69 -0
  701. package/src/lib/usage/assist-refusals.js +79 -0
  702. package/src/lib/usage/assist-refusals.js.map +1 -0
  703. package/src/lib/usage/assist-signal-mining.d.ts +375 -0
  704. package/src/lib/usage/assist-signal-mining.js +344 -0
  705. package/src/lib/usage/assist-signal-mining.js.map +1 -0
  706. package/src/lib/usage/assist-usage.d.ts +571 -0
  707. package/src/lib/usage/assist-usage.js +978 -0
  708. package/src/lib/usage/assist-usage.js.map +1 -0
  709. package/src/lib/usage/staff-org-ai.d.ts +242 -0
  710. package/src/lib/usage/staff-org-ai.js +173 -0
  711. package/src/lib/usage/staff-org-ai.js.map +1 -0
  712. package/src/lib/usage/staff-org-usage-ai.d.ts +83 -0
  713. package/src/lib/usage/staff-org-usage-ai.js +59 -0
  714. package/src/lib/usage/staff-org-usage-ai.js.map +1 -0
  715. package/src/lib/usage/staff-orgs-ai-spend.d.ts +83 -0
  716. package/src/lib/usage/staff-orgs-ai-spend.js +114 -0
  717. package/src/lib/usage/staff-orgs-ai-spend.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/insights/ai-figure-readers.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 { effectiveDatasetModel, type DatasetModel } from '@aglyn/aglyn/app-utils/dataset-models'\nimport { formPeriodKey, formStatsTotals, type FormStats } from '@aglyn/aglyn/app-utils/forms'\nimport { visibleToHost } from '@aglyn/aglyn/app-utils/scope-tokens'\nimport { hostRoleFor, isOrgWideMember, memberCanSee } from '@aglyn/aglyn/app-utils/organizations'\nimport type { AglynOrgMember } from '@aglyn/aglyn/foundation/definitions/organization.types'\nimport {\n PLUGIN_FIGURE_MAX_ROWS,\n pluginFigureChange,\n pluginFigureDay,\n pluginFigureWindows,\n registerPluginFigureReader,\n type PluginFigureReader,\n type PluginFigureRead,\n type PluginFigureRequest,\n type PluginFigureRow,\n type PluginFigureTable,\n} from '@aglyn/aglyn/plugin-manager/plugin-figures'\nimport { AI_PLUGIN_ID } from '../constants'\n\n/**\n * The figure readers this plugin registers for records the PLATFORM keeps\n * (AGL-2915): a site's page-view counters, its forms' counters and the\n * workspace's datasets. Every other reader an insight reads is registered by\n * the plugin that owns its records — commerce, bookings, marketing — on the\n * `plugin-figures` seam, and nothing here reads their documents.\n *\n * Each reader answers with one compact table of aggregates, read-only and\n * about nobody: counts, sums and rates, labeled by a page path, a form's name,\n * a referring site or a dataset's own field — never a visitor, a submission or\n * a record. A dataset breakdown refuses a field with more than\n * `AI_DATASET_MAX_GROUP_VALUES` different values — on a dataset of any size, a\n * name, an address or an order number — and folds every group of fewer than\n * `AI_DATASET_MIN_GROUP` records into one row, so each label it shows is a\n * value at least that many records share.\n *\n * The readers use the arithmetic their console cards use: the Traffic card's\n * windows and change (`pluginFigureWindows`, `pluginFigureChange`, which are\n * that card's split and delta), and the forms plugin's month counters through\n * `formStatsTotals`, the one function every forms surface windows by.\n */\n\ntype Firestore = FirebaseFirestore.Firestore\n\n/** How a reader reaches Firestore: resolved when it reads, never when it registers. */\nexport type AiFigureFirestore = () => Firestore\n\n/** The traffic windows: the Traffic card's own ranges. */\nexport const AI_TRAFFIC_WINDOWS: readonly number[] = [7, 14, 30, 90]\n\n/** A day-by-day table fits a table's row bound only over a short window. */\nexport const AI_TRAFFIC_DAILY_WINDOWS: readonly number[] = [7, 14]\n\n/** Pages a pages table lists; the rest are counted in `omitted`. */\nexport const AI_TRAFFIC_TOP_PAGES = 10\n\n/** Referring sites, and campaign sources and campaigns, a sources table lists. */\nexport const AI_TRAFFIC_TOP_REFERRERS = 8\nexport const AI_TRAFFIC_TOP_CAMPAIGNS = 5\n\n/** Forms a forms table reads. */\nexport const AI_FORMS_READ_LIMIT = 100\n\n/** Datasets a dataset summary reads. */\nexport const AI_DATASETS_READ_LIMIT = 50\n\n/** Records a dataset breakdown or field summary reads, in document order; the rest are named in a note. */\nexport const AI_DATASET_RECORDS_READ_LIMIT = 2_000\n\n/** The fewest records a breakdown shows a group of by its own label. */\nexport const AI_DATASET_MIN_GROUP = 3\n\n/**\n * The most different values a breakdown groups by: every state and territory,\n * a status, a category. A field with more tells records apart rather than\n * sorting them, so it is refused.\n */\nexport const AI_DATASET_MAX_GROUP_VALUES = 60\n\n/** The aggregates a breakdown computes. */\nexport const AI_DATASET_OPERATIONS = ['count', 'sum', 'average', 'min', 'max'] as const\nexport type AiDatasetOperation = (typeof AI_DATASET_OPERATIONS)[number]\n\nconst str = (value: unknown): string => (typeof value === 'string' ? value.trim() : '')\n\nconst num = (value: unknown): number => {\n const parsed = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(parsed) ? parsed : 0\n}\n\nconst round1 = (value: number): number => Math.round(value * 10) / 10\n\nconst share = (part: number, whole: number): number | null => (whole > 0 ? round1((part / whole) * 100) : null)\n\nfunction refused(status: 400 | 403 | 404, error: string): PluginFigureRead {\n return { ok: false, status, error }\n}\n\n/** A window's days as the table's period, oldest to newest. */\nfunction periodOf(request: PluginFigureRequest): PluginFigureTable['period'] {\n const { current } = pluginFigureWindows(request.now, request.days)\n return { from: current.from, to: current.to, days: request.days }\n}\n\n/** Every day id of the window and the one before it, newest first. */\nfunction dayIds(now: Date, days: number): { current: string[]; previous: string[] } {\n const { current, previous } = pluginFigureWindows(now, days)\n const walk = (startMs: number, endMs: number): string[] => {\n const ids: string[] = []\n for (let at = endMs - 86_400_000; at >= startMs; at -= 86_400_000) ids.push(pluginFigureDay(new Date(at)))\n return ids\n }\n return { current: walk(current.startMs, current.endMs), previous: walk(previous.startMs, previous.endMs) }\n}\n\n// ── Traffic ───────────────────────────────────────────────────────────────\n\ninterface TrafficDay {\n total: number\n visitors: number\n paths: Record<string, number>\n referrers: Record<string, number>\n utm: Record<string, Record<string, number>>\n}\n\nconst counts = (value: unknown): Record<string, number> => {\n const out: Record<string, number> = {}\n if (!value || typeof value !== 'object') return out\n for (const [key, count] of Object.entries(value as Record<string, unknown>)) {\n const n = num(count)\n if (n > 0) out[key] = n\n }\n return out\n}\n\nasync function readTrafficDays(\n firestore: Firestore,\n hostId: string,\n ids: readonly string[],\n): Promise<TrafficDay[]> {\n if (!ids.length) return []\n const collection = firestore.collection('hosts').doc(hostId).collection('analytics')\n const snapshots = await firestore.getAll(...ids.map((id) => collection.doc(id)))\n return snapshots.map((snapshot) => {\n const data = (snapshot.exists ? snapshot.data() : null) ?? {}\n const utm: Record<string, Record<string, number>> = {}\n for (const [param, values] of Object.entries((data['utm'] ?? {}) as Record<string, unknown>)) {\n utm[param] = counts(values)\n }\n return {\n total: num(data['total']),\n visitors: num(data['visitors']),\n paths: counts(data['paths']),\n referrers: counts(data['referrers']),\n utm,\n }\n })\n}\n\nfunction sumMaps(days: readonly TrafficDay[], pick: (day: TrafficDay) => Record<string, number>): Map<string, number> {\n const totals = new Map<string, number>()\n for (const day of days) {\n for (const [key, count] of Object.entries(pick(day))) totals.set(key, (totals.get(key) ?? 0) + count)\n }\n return totals\n}\n\nconst ranked = (totals: Map<string, number>): Array<[string, number]> =>\n [...totals.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n\nfunction siteReader(\n base: Omit<PluginFigureReader, 'read' | 'scope' | 'plugin'>,\n read: (firestore: Firestore, request: PluginFigureRequest & { hostId: string }) => Promise<PluginFigureRead>,\n firestore: AiFigureFirestore,\n plugin: string | null,\n): PluginFigureReader {\n return {\n ...base,\n scope: 'site',\n plugin,\n read: async (request) => {\n if (!request.hostId) return refused(400, 'Open a site to read its figures')\n if (!base.windows.includes(request.days)) return refused(400, 'That window is not one this reader covers')\n return read(firestore(), { ...request, hostId: request.hostId })\n },\n }\n}\n\nexport function trafficFigureReaders(firestore: AiFigureFirestore): PluginFigureReader[] {\n const source = { label: 'Analytics', path: 'analytics' }\n const visitorsNote =\n 'Visitors are counted once per browser tab per day, so one person on two days counts twice.'\n return [\n siteReader(\n {\n id: 'traffic.summary',\n label: 'Traffic',\n description:\n 'Page views, visitors and views a day on the site over the window, each beside the window before it and the change.',\n windows: AI_TRAFFIC_WINDOWS,\n },\n async (db, request) => {\n const ids = dayIds(request.now, request.days)\n const [current, previous] = await Promise.all([\n readTrafficDays(db, request.hostId, ids.current),\n readTrafficDays(db, request.hostId, ids.previous),\n ])\n const total = (days: TrafficDay[]) => days.reduce((sum, day) => sum + day.total, 0)\n const visitors = (days: TrafficDay[]) => days.reduce((sum, day) => sum + day.visitors, 0)\n const views = total(current)\n const viewsBefore = total(previous)\n const perDay = Math.round(views / request.days)\n const perDayBefore = Math.round(viewsBefore / request.days)\n const table: PluginFigureTable = {\n title: 'Traffic',\n source,\n period: periodOf(request),\n columns: [\n { key: 'figure', label: 'Figure', kind: 'text' },\n { key: 'current', label: 'This window', kind: 'count' },\n { key: 'previous', label: 'Window before', kind: 'count' },\n { key: 'change', label: 'Change', kind: 'change' },\n ],\n rows: [\n { figure: 'Page views', current: views, previous: viewsBefore, change: pluginFigureChange(views, viewsBefore) },\n {\n figure: 'Visitors',\n current: visitors(current),\n previous: visitors(previous),\n change: pluginFigureChange(visitors(current), visitors(previous)),\n },\n {\n figure: 'Page views a day',\n current: perDay,\n previous: perDayBefore,\n change: pluginFigureChange(perDay, perDayBefore),\n },\n ],\n omitted: 0,\n notes: [\n visitorsNote,\n ...(viewsBefore ? [] : ['The window before this one recorded no page views, so there is no change to compare.']),\n ],\n }\n return { ok: true, table }\n },\n firestore,\n null,\n ),\n siteReader(\n {\n id: 'traffic.pages',\n label: 'Top pages',\n description: `The site's ${AI_TRAFFIC_TOP_PAGES} most viewed pages over the window, with each page's share of all views and its change from the window before.`,\n windows: AI_TRAFFIC_WINDOWS,\n },\n async (db, request) => {\n const ids = dayIds(request.now, request.days)\n const [current, previous] = await Promise.all([\n readTrafficDays(db, request.hostId, ids.current),\n readTrafficDays(db, request.hostId, ids.previous),\n ])\n const now = ranked(sumMaps(current, (day) => day.paths))\n const before = sumMaps(previous, (day) => day.paths)\n const all = now.reduce((sum, [, count]) => sum + count, 0)\n const rows: PluginFigureRow[] = now.slice(0, AI_TRAFFIC_TOP_PAGES).map(([path, views]) => ({\n page: path,\n views,\n share: share(views, all),\n change: pluginFigureChange(views, before.get(path) ?? null),\n }))\n return {\n ok: true,\n table: {\n title: 'Top pages',\n source,\n period: periodOf(request),\n columns: [\n { key: 'page', label: 'Page', kind: 'text' },\n { key: 'views', label: 'Views', kind: 'count' },\n { key: 'share', label: 'Share of views', kind: 'percent' },\n { key: 'change', label: 'Change', kind: 'change' },\n ],\n rows,\n omitted: Math.max(0, now.length - rows.length),\n notes: [],\n },\n }\n },\n firestore,\n null,\n ),\n siteReader(\n {\n id: 'traffic.sources',\n label: 'Traffic sources',\n description:\n 'Where visits came from over the window: the referring sites, and the campaign sources and campaigns links were tagged with, with each one’s views.',\n windows: AI_TRAFFIC_WINDOWS,\n },\n async (db, request) => {\n const days = await readTrafficDays(db, request.hostId, dayIds(request.now, request.days).current)\n const all = days.reduce((sum, day) => sum + day.total, 0)\n const referrers = ranked(sumMaps(days, (day) => day.referrers))\n const sources = ranked(sumMaps(days, (day) => day.utm['source'] ?? {}))\n const campaigns = ranked(sumMaps(days, (day) => day.utm['campaign'] ?? {}))\n const rowsOf = (entries: Array<[string, number]>, limit: number, type: string) =>\n entries.slice(0, limit).map(([name, views]) => ({ source: name, type, views, share: share(views, all) }))\n const rows = [\n ...rowsOf(referrers, AI_TRAFFIC_TOP_REFERRERS, 'Referring site'),\n ...rowsOf(sources, AI_TRAFFIC_TOP_CAMPAIGNS, 'Campaign source'),\n ...rowsOf(campaigns, AI_TRAFFIC_TOP_CAMPAIGNS, 'Campaign'),\n ]\n return {\n ok: true,\n table: {\n title: 'Traffic sources',\n source,\n period: periodOf(request),\n columns: [\n { key: 'source', label: 'Source', kind: 'text' },\n { key: 'type', label: 'Kind', kind: 'text' },\n { key: 'views', label: 'Views', kind: 'count' },\n { key: 'share', label: 'Share of all views', kind: 'percent' },\n ],\n rows,\n omitted:\n Math.max(0, referrers.length - AI_TRAFFIC_TOP_REFERRERS) +\n Math.max(0, sources.length - AI_TRAFFIC_TOP_CAMPAIGNS) +\n Math.max(0, campaigns.length - AI_TRAFFIC_TOP_CAMPAIGNS),\n notes: ['A visit with no referring site, such as a typed address, is in no row.'],\n },\n }\n },\n firestore,\n null,\n ),\n siteReader(\n {\n id: 'traffic.daily',\n label: 'Traffic by day',\n description: 'Page views and visitors on each day of the window, oldest first, for spotting a day that stood out.',\n windows: AI_TRAFFIC_DAILY_WINDOWS,\n },\n async (db, request) => {\n const ids = [...dayIds(request.now, request.days).current].reverse()\n const days = await readTrafficDays(db, request.hostId, ids)\n return {\n ok: true,\n table: {\n title: 'Traffic by day',\n source,\n period: periodOf(request),\n columns: [\n { key: 'day', label: 'Day', kind: 'date' },\n { key: 'views', label: 'Page views', kind: 'count' },\n { key: 'visitors', label: 'Visitors', kind: 'count' },\n ],\n rows: days.map((day, index) => ({ day: ids[index], views: day.total, visitors: day.visitors })),\n omitted: 0,\n notes: [visitorsNote],\n },\n }\n },\n firestore,\n null,\n ),\n ]\n}\n\n// ── Forms ─────────────────────────────────────────────────────────────────\n\nexport function formsFigureReader(firestore: AiFigureFirestore): PluginFigureReader {\n return siteReader(\n {\n id: 'forms.performance',\n label: 'Forms',\n description:\n 'Each form’s views, submissions, the share of views that became a submission, and leads, over the calendar months the window falls in.',\n windows: AI_TRAFFIC_WINDOWS,\n },\n async (db, request) => {\n const { current } = pluginFigureWindows(request.now, request.days)\n const from = formPeriodKey(current.startMs)\n const to = formPeriodKey(current.endMs - 1)\n const snapshot = await db\n .collection('hosts')\n .doc(request.hostId)\n .collection('forms')\n .limit(AI_FORMS_READ_LIMIT)\n .get()\n const forms = snapshot.docs\n .map((doc) => ({ doc, data: (doc.data() ?? {}) as Record<string, unknown> }))\n .filter(({ data }) => !data['deletedAt'])\n .map(({ doc, data }) => {\n const totals = formStatsTotals(data['stats'] as FormStats | undefined, { from, to })\n return {\n form: str(data['displayName']) || doc.id,\n views: totals.views,\n submissions: totals.submissions,\n completion:\n totals.views && totals.submissions !== null ? share(totals.submissions, totals.views) : null,\n leads: totals.leads,\n }\n })\n .sort((a, b) => (b.submissions ?? -1) - (a.submissions ?? -1) || a.form.localeCompare(b.form))\n const monthStart = from ? `${from}-01` : current.from\n return {\n ok: true,\n table: {\n title: 'Forms',\n source: { label: 'Forms', path: 'forms' },\n period: {\n from: monthStart,\n to: current.to,\n days: Math.round((Date.parse(current.to) - Date.parse(monthStart)) / 86_400_000) + 1,\n },\n columns: [\n { key: 'form', label: 'Form', kind: 'text' },\n { key: 'views', label: 'Views', kind: 'count' },\n { key: 'submissions', label: 'Submissions', kind: 'count' },\n { key: 'completion', label: 'Views that became a submission', kind: 'percent' },\n { key: 'leads', label: 'Leads', kind: 'count' },\n ],\n rows: forms.slice(0, PLUGIN_FIGURE_MAX_ROWS),\n omitted: Math.max(0, forms.length - PLUGIN_FIGURE_MAX_ROWS),\n notes: [\n 'Form figures are kept by calendar month, so they cover whole months from the first day of the month the window starts in.',\n 'Views are counted in the visitor’s browser and submissions on the server, so a rate can pass 100%.',\n ],\n },\n }\n },\n firestore,\n 'forms',\n )\n}\n\n// ── Datasets ──────────────────────────────────────────────────────────────\n\ninterface VisibleDataset {\n id: string\n name: string\n model: DatasetModel\n}\n\n/**\n * The datasets a request may read: those the member who asked may see — and,\n * narrowed to a site, only those shared with it, which is the site Data page's\n * rule (AGL-2891). With no member, only datasets shared with every site.\n */\nasync function visibleDatasets(firestore: Firestore, request: PluginFigureRequest): Promise<VisibleDataset[]> {\n const orgRef = firestore.collection('orgs').doc(request.orgId)\n const [snapshot, memberSnapshot] = await Promise.all([\n orgRef.collection('datasets').limit(AI_DATASETS_READ_LIMIT).get(),\n request.uid ? orgRef.collection('members').doc(request.uid).get() : Promise.resolve(null),\n ])\n const member = memberSnapshot?.exists ? (memberSnapshot.data() as Partial<AglynOrgMember>) : null\n if (request.uid && !member) return []\n if (request.hostId && member && !isOrgWideMember(member) && hostRoleFor(member, request.hostId) === null) {\n return []\n }\n return snapshot.docs\n .map((doc) => ({ id: doc.id, data: (doc.data() ?? {}) as Record<string, unknown> }))\n .filter(({ data }) => {\n const visibleTo = data['visibleTo'] as string[] | undefined\n if (data['deletedAt']) return false\n if (request.hostId && !visibleToHost(visibleTo, request.hostId)) return false\n return member ? memberCanSee(member, visibleTo) : Boolean(visibleTo?.includes('org'))\n })\n .map(({ id, data }) => ({\n id,\n name: str(data['displayName']) || id,\n model: effectiveDatasetModel(data as { model?: DatasetModel; fields?: string[] }),\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\n/** A dataset a question may name, with its fields, as the read prompt lists it. */\nexport interface AiDatasetCatalogEntry {\n id: string\n name: string\n fields: Array<{ id: string; name: string; type: string }>\n}\n\n/** The datasets a request may read, with their fields: what the model picks a breakdown from. */\nexport async function aiDatasetCatalog(\n firestore: Firestore,\n request: Pick<PluginFigureRequest, 'orgId' | 'hostId' | 'uid'>,\n): Promise<AiDatasetCatalogEntry[]> {\n const datasets = await visibleDatasets(firestore, { ...request, days: 0, now: new Date(0), params: {} })\n return datasets.map((dataset) => ({\n id: dataset.id,\n name: dataset.name,\n fields: dataset.model.order.map((fieldId) => ({\n id: fieldId,\n name: str(dataset.model.fields[fieldId]?.name) || fieldId,\n type: String(dataset.model.fields[fieldId]?.type ?? 'text'),\n })),\n }))\n}\n\nasync function readRecords(\n firestore: Firestore,\n orgId: string,\n datasetId: string,\n): Promise<{ rows: Array<Record<string, unknown>>; total: number }> {\n const recordsRef = firestore.collection('orgs').doc(orgId).collection('datasets').doc(datasetId).collection('records')\n const [page, count] = await Promise.all([\n recordsRef.limit(AI_DATASET_RECORDS_READ_LIMIT).get(),\n recordsRef.count().get(),\n ])\n return {\n rows: page.docs.map((doc) => ((doc.data() ?? {})['values'] ?? {}) as Record<string, unknown>),\n total: num(count.data().count),\n }\n}\n\nconst NUMERIC_TYPES = new Set(['float', 'int32', 'int64'])\n\nfunction readNote(read: number, total: number): string[] {\n return total > read\n ? [`Read the first ${read.toLocaleString('en-US')} of ${total.toLocaleString('en-US')} records, so every figure covers only those.`]\n : []\n}\n\n/** A field a dataset table may be read by: the model's own id, or its name as the dataset page shows it. */\nfunction fieldOf(model: DatasetModel, raw: string): string | null {\n const wanted = raw.trim().toLowerCase()\n for (const id of model.order) {\n if (id.toLowerCase() === wanted || str(model.fields[id]?.name).toLowerCase() === wanted) return id\n }\n return null\n}\n\n/** A value as a breakdown groups it: text as written, a number or a yes/no as text; empty is its own group. */\nfunction groupLabel(value: unknown): string {\n if (value === null || value === undefined || value === '') return '(empty)'\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n if (typeof value === 'number' || typeof value === 'string') return String(value).trim() || '(empty)'\n return '(not a single value)'\n}\n\nexport function datasetFigureReaders(firestore: AiFigureFirestore): PluginFigureReader[] {\n const base = { scope: 'org' as const, plugin: 'data', feature: 'dataStore', windows: [] as number[] }\n // Datasets belong to the workspace, so a table links its Data page.\n const source = { label: 'Data', path: 'data' }\n return [\n {\n ...base,\n id: 'datasets.summary',\n label: 'Datasets',\n description:\n 'With no dataset named: each dataset’s records and fields. With one: each of its fields, how many records fill it, how many distinct values it holds and, for a number, its lowest, average and highest.',\n params: [{ name: 'dataset', description: 'A dataset’s id or name, to summarize its fields.', required: false }],\n read: async (request) => {\n const db = firestore()\n const datasets = await visibleDatasets(db, request)\n const named = request.params['dataset']\n if (!named) {\n const counted = await Promise.all(\n datasets.slice(0, PLUGIN_FIGURE_MAX_ROWS).map(async (dataset) => ({\n dataset: dataset.name,\n records: num(\n (\n await db\n .collection('orgs')\n .doc(request.orgId)\n .collection('datasets')\n .doc(dataset.id)\n .collection('records')\n .count()\n .get()\n ).data().count,\n ),\n fields: dataset.model.order.length,\n })),\n )\n return {\n ok: true,\n table: {\n title: 'Datasets',\n source,\n period: null,\n columns: [\n { key: 'dataset', label: 'Dataset', kind: 'text' },\n { key: 'records', label: 'Records', kind: 'count' },\n { key: 'fields', label: 'Fields', kind: 'count' },\n ],\n rows: counted,\n omitted: Math.max(0, datasets.length - counted.length),\n notes: [],\n },\n }\n }\n const dataset = datasets.find((entry) => entry.id === named || entry.name.toLowerCase() === named.toLowerCase())\n if (!dataset) return refused(404, 'That dataset is not one you can read here')\n const { rows: values, total } = await readRecords(db, request.orgId, dataset.id)\n const rows = dataset.model.order.slice(0, PLUGIN_FIGURE_MAX_ROWS).map((fieldId) => {\n const field = dataset.model.fields[fieldId]\n const filled = values.filter((entry) => entry[fieldId] !== null && entry[fieldId] !== undefined && entry[fieldId] !== '')\n const numbers = NUMERIC_TYPES.has(String(field?.type))\n ? filled.map((entry) => entry[fieldId]).filter((value): value is number => typeof value === 'number' && Number.isFinite(value))\n : []\n return {\n field: str(field?.name) || fieldId,\n type: String(field?.type ?? 'text'),\n filled: share(filled.length, values.length),\n distinct: new Set(filled.map((entry) => groupLabel(entry[fieldId]))).size,\n lowest: numbers.length ? Math.min(...numbers) : null,\n average: numbers.length ? Math.round((numbers.reduce((sum, value) => sum + value, 0) / numbers.length) * 100) / 100 : null,\n highest: numbers.length ? Math.max(...numbers) : null,\n }\n })\n return {\n ok: true,\n table: {\n title: `${dataset.name}: fields`,\n source,\n period: null,\n columns: [\n { key: 'field', label: 'Field', kind: 'text' },\n { key: 'type', label: 'Type', kind: 'text' },\n { key: 'filled', label: 'Records that fill it', kind: 'percent' },\n { key: 'distinct', label: 'Distinct values', kind: 'count' },\n { key: 'lowest', label: 'Lowest', kind: 'number' },\n { key: 'average', label: 'Average', kind: 'number' },\n { key: 'highest', label: 'Highest', kind: 'number' },\n ],\n rows,\n omitted: Math.max(0, dataset.model.order.length - rows.length),\n notes: readNote(values.length, total),\n },\n }\n },\n },\n {\n ...base,\n id: 'datasets.breakdown',\n label: 'Dataset breakdown',\n description:\n 'One dataset’s records grouped by the values of one field, with how many records each group holds and, for a number field, its sum, average, lowest or highest in each group.',\n params: [\n { name: 'dataset', description: 'The dataset’s id or name.', required: true },\n { name: 'group', description: 'The field to group records by, by id or name.', required: true },\n { name: 'measure', description: 'A number field to aggregate, by id or name; empty to count records.', required: false },\n { name: 'operation', description: `One of ${AI_DATASET_OPERATIONS.join(', ')}; count when empty.`, required: false },\n ],\n read: async (request) => {\n const db = firestore()\n const datasets = await visibleDatasets(db, request)\n const named = request.params['dataset'] ?? ''\n const dataset = datasets.find((entry) => entry.id === named || entry.name.toLowerCase() === named.toLowerCase())\n if (!dataset) return refused(404, 'That dataset is not one you can read here')\n const group = fieldOf(dataset.model, request.params['group'] ?? '')\n if (!group) return refused(400, 'That dataset has no field by that name to group by')\n const operation = (request.params['operation'] ?? 'count') as AiDatasetOperation\n if (!(AI_DATASET_OPERATIONS as readonly string[]).includes(operation)) {\n return refused(400, `The operation is one of ${AI_DATASET_OPERATIONS.join(', ')}`)\n }\n const measure = request.params['measure'] ? fieldOf(dataset.model, request.params['measure']) : null\n if (operation !== 'count' && (!measure || !NUMERIC_TYPES.has(String(dataset.model.fields[measure]?.type)))) {\n return refused(400, 'Only a number field can be summed, averaged or ranged')\n }\n const { rows: values, total } = await readRecords(db, request.orgId, dataset.id)\n const groups = new Map<string, number[]>()\n const sizes = new Map<string, number>()\n for (const entry of values) {\n const label = groupLabel(entry[group])\n sizes.set(label, (sizes.get(label) ?? 0) + 1)\n const value = measure ? entry[measure] : null\n if (typeof value === 'number' && Number.isFinite(value)) {\n groups.set(label, [...(groups.get(label) ?? []), value])\n }\n }\n if (sizes.size > AI_DATASET_MAX_GROUP_VALUES) {\n return refused(\n 400,\n `That field has more than ${AI_DATASET_MAX_GROUP_VALUES} different values, too many to group by. Group by a field many records share, such as a state, a status or a category`,\n )\n }\n // A group of fewer than AI_DATASET_MIN_GROUP records is folded into\n // one row: a group that small is a record, and its label could be a\n // person's name.\n const small = [...sizes.entries()].filter(([, size]) => size < AI_DATASET_MIN_GROUP)\n const aggregate = (numbers: number[]): number | null => {\n if (operation === 'count') return null\n if (!numbers.length) return null\n const sum = numbers.reduce((acc, value) => acc + value, 0)\n switch (operation) {\n case 'sum':\n return Math.round(sum * 100) / 100\n case 'average':\n return Math.round((sum / numbers.length) * 100) / 100\n case 'min':\n return Math.min(...numbers)\n default:\n return Math.max(...numbers)\n }\n }\n const row = (group: string, records: number, numbers: number[]): PluginFigureRow =>\n operation === 'count' ? { group, records } : { group, records, value: aggregate(numbers) }\n const rows: PluginFigureRow[] = [...sizes.entries()]\n .filter(([, size]) => size >= AI_DATASET_MIN_GROUP)\n .map(([label, size]) => row(label, size, groups.get(label) ?? []))\n if (small.length) {\n rows.push(\n row(\n `Other (${small.length} groups under ${AI_DATASET_MIN_GROUP} records)`,\n small.reduce((sum, [, size]) => sum + size, 0),\n small.flatMap(([label]) => groups.get(label) ?? []),\n ),\n )\n }\n rows.sort((a, b) => (num(b['value'] ?? b['records']) - num(a['value'] ?? a['records'])))\n const groupName = str(dataset.model.fields[group]?.name) || group\n const measureName = measure ? str(dataset.model.fields[measure]?.name) || measure : ''\n return {\n ok: true,\n table: {\n title: `${dataset.name} by ${groupName}`,\n source,\n period: null,\n columns: [\n { key: 'group', label: groupName, kind: 'text' },\n { key: 'records', label: 'Records', kind: 'count' },\n ...(operation === 'count'\n ? []\n : [{ key: 'value', label: `${operation[0].toUpperCase()}${operation.slice(1)} of ${measureName}`, kind: 'number' as const }]),\n ],\n rows: rows.slice(0, PLUGIN_FIGURE_MAX_ROWS),\n omitted: Math.max(0, rows.length - PLUGIN_FIGURE_MAX_ROWS),\n notes: [\n ...readNote(values.length, total),\n ...(small.length ? [`Groups of fewer than ${AI_DATASET_MIN_GROUP} records are counted together as Other.`] : []),\n ],\n },\n }\n },\n },\n ]\n}\n\n/** Every reader this plugin registers, for the platform's own records. */\nexport function aiFigureReaders(firestore: AiFigureFirestore): PluginFigureReader[] {\n return [...trafficFigureReaders(firestore), formsFigureReader(firestore), ...datasetFigureReaders(firestore)]\n}\n\n/**\n * Registers them from the console surface, the one surface that runs insight\n * jobs. By a call, never by an import (AGL-3025).\n */\nexport function registerAiFigureReaders(firestore: AiFigureFirestore): void {\n for (const reader of aiFigureReaders(firestore)) {\n registerPluginFigureReader(reader, { pluginId: AI_PLUGIN_ID })\n }\n}\n"],"names":["effectiveDatasetModel","formPeriodKey","formStatsTotals","visibleToHost","hostRoleFor","isOrgWideMember","memberCanSee","PLUGIN_FIGURE_MAX_ROWS","pluginFigureChange","pluginFigureDay","pluginFigureWindows","registerPluginFigureReader","AI_PLUGIN_ID","AI_TRAFFIC_WINDOWS","AI_TRAFFIC_DAILY_WINDOWS","AI_TRAFFIC_TOP_PAGES","AI_TRAFFIC_TOP_REFERRERS","AI_TRAFFIC_TOP_CAMPAIGNS","AI_FORMS_READ_LIMIT","AI_DATASETS_READ_LIMIT","AI_DATASET_RECORDS_READ_LIMIT","AI_DATASET_MIN_GROUP","AI_DATASET_MAX_GROUP_VALUES","AI_DATASET_OPERATIONS","str","value","trim","num","parsed","Number","isFinite","round1","Math","round","share","part","whole","refused","status","error","ok","periodOf","request","current","now","days","from","to","dayIds","previous","walk","startMs","endMs","ids","at","push","Date","counts","out","key","count","Object","entries","n","readTrafficDays","firestore","hostId","length","collection","doc","snapshots","getAll","map","id","snapshot","data","exists","utm","param","values","total","visitors","paths","referrers","sumMaps","pick","totals","Map","day","set","get","ranked","sort","a","b","localeCompare","siteReader","base","read","plugin","scope","windows","includes","trafficFigureReaders","source","label","path","visitorsNote","description","db","Promise","all","reduce","sum","views","viewsBefore","perDay","perDayBefore","table","title","period","columns","kind","rows","figure","change","omitted","notes","before","slice","page","max","sources","campaigns","rowsOf","limit","type","name","reverse","index","formsFigureReader","forms","docs","filter","form","submissions","completion","leads","monthStart","parse","visibleDatasets","orgRef","orgId","memberSnapshot","uid","resolve","member","visibleTo","Boolean","model","aiDatasetCatalog","datasets","params","dataset","fields","order","fieldId","String","readRecords","datasetId","recordsRef","NUMERIC_TYPES","Set","readNote","toLocaleString","fieldOf","raw","wanted","toLowerCase","groupLabel","undefined","datasetFigureReaders","feature","required","named","counted","records","find","entry","field","filled","numbers","has","distinct","size","lowest","min","average","highest","join","group","operation","measure","groups","sizes","small","aggregate","acc","row","flatMap","groupName","measureName","toUpperCase","aiFigureReaders","registerAiFigureReaders","reader","pluginId"],"mappings":"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"}
@@ -0,0 +1,165 @@
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 ReleaseFlagValue } from '@aglyn/aglyn/app-utils/release-flags';
18
+ import type { AglynOrgMember } from '@aglyn/aglyn/foundation/definitions/organization.types';
19
+ /**
20
+ * THE WEEKLY INSIGHTS (AGL-2915): `POST /api/admin/ai-insights-digest`, twice
21
+ * a day on the console's scheduler.
22
+ *
23
+ * ## Who asked for it
24
+ *
25
+ * A person turns weekly insights on for a workspace beside the answers
26
+ * themselves (`users/{uid}.insightDigests.{orgId}`), and off there or in
27
+ * Notifications. It is opt-in, because each digest is a generation the
28
+ * workspace pays for. At the sweep, every rung is asked again rather than
29
+ * trusted from the switch: the workspace's plan includes `aiGenerative`,
30
+ * `release_ai_generative` is on for it, its AI is not paused, the site has AI
31
+ * on, and the person still holds `ai.generate` on the site.
32
+ *
33
+ * ## Monday: one job per site
34
+ *
35
+ * On a Monday run, for each workspace with someone who asked, the sites those
36
+ * people reach — the busiest `AI_INSIGHT_DIGEST_MAX_SITES` by yesterday's page
37
+ * views — each get one `insight` job with the `digest` surface, created by the
38
+ * first of them who may generate there. The job runs on the AI jobs beat like
39
+ * any other: it reserves, meters and records its credits, and a workspace at
40
+ * its band — a Free one that has used its credits — has its job parked by the
41
+ * reservation like any other. `orgs/{orgId}/aiInsightDigests/{week}` records
42
+ * the jobs; `aiInsightDigestQueue/{week}` lists the workspaces still owed a
43
+ * delivery, so a run that delivers reads one document rather than every
44
+ * workspace.
45
+ *
46
+ * ## Every run: deliver what is written
47
+ *
48
+ * A digest whose job is done and kept at least one insight is delivered once:
49
+ * a `content.insightsDigest` notification (unless the person muted the
50
+ * category) and an email through the platform's own sending path, to each
51
+ * person who asked for the workspace's insights and reaches the site. A job
52
+ * that failed, kept nothing, or parked for credits is SKIPPED SILENTLY: a
53
+ * parked job is canceled rather than left to spend later, and nobody is told,
54
+ * because nobody asked about that week in particular. A job still running
55
+ * past `AI_INSIGHT_DIGEST_DEADLINE_MS` is canceled and skipped the same way.
56
+ *
57
+ * The email says only what the answer says: the insights, each traced to the
58
+ * figures it cites, and a link to the site's Analytics page. It is sent by the
59
+ * platform to a person who asked for it, never to a contact.
60
+ */
61
+ type Firestore = FirebaseFirestore.Firestore;
62
+ export declare const AI_INSIGHTS_DIGEST_CRON_ID = "ai-insights-digest";
63
+ export declare const AI_INSIGHTS_DIGEST_PATH = "admin/ai-insights-digest";
64
+ /** Orgs one call reads; a chunk that times out never advances the cursor, so the safe size is one that finishes. */
65
+ export declare const AI_INSIGHT_DIGEST_ORG_CHUNK = 25;
66
+ /** Sites one workspace's digest covers a week. */
67
+ export declare const AI_INSIGHT_DIGEST_MAX_SITES = 5;
68
+ /** Sites a workspace's sweep reads before it ranks them. */
69
+ export declare const AI_INSIGHT_DIGEST_HOST_READ_LIMIT = 50;
70
+ /** Workspaces one run delivers to, per week. */
71
+ export declare const AI_INSIGHT_DIGEST_DELIVER_LIMIT = 100;
72
+ /** How long a digest's job may take before its week is given up. */
73
+ export declare const AI_INSIGHT_DIGEST_DEADLINE_MS: number;
74
+ /**
75
+ * The time one call works before it stops and leaves the rest to the next:
76
+ * inside the plugin dispatcher's 60 s function ceiling, with room for the
77
+ * reads before the first check and the reply after the last. A call killed
78
+ * mid-send could send one person a site's digest twice, because a send is
79
+ * stamped after it goes.
80
+ */
81
+ export declare const AI_INSIGHT_DIGEST_RUN_BUDGET_MS = 45000;
82
+ export declare const AI_INSIGHT_DIGEST_MARKERS = "aiInsightDigests";
83
+ export declare const AI_INSIGHT_DIGEST_QUEUE = "aiInsightDigestQueue";
84
+ export type AiInsightDigestSiteState = 'pending' | 'delivered' | 'skipped';
85
+ export interface AiInsightDigestSite {
86
+ jobId: string;
87
+ name: string;
88
+ state: AiInsightDigestSiteState;
89
+ /**
90
+ * The people already sent this site's digest, so a run the send rate
91
+ * stopped never sends one twice. Dropped when the site settles, so a
92
+ * settled marker names no person.
93
+ */
94
+ sent?: Record<string, boolean>;
95
+ }
96
+ export interface AiInsightDigestMarker {
97
+ week: string;
98
+ createdAtMs: number;
99
+ sites: Record<string, AiInsightDigestSite>;
100
+ }
101
+ /** What a send answered: whether it went, and whether the platform's send rate refused it for now. */
102
+ export interface AiInsightDigestSendResult {
103
+ sent: boolean;
104
+ rateLimited: boolean;
105
+ }
106
+ /** Everything the sweep reaches beyond Firestore, so a spec can hold each one. */
107
+ export interface AiInsightDigestDeps {
108
+ firestore: Firestore;
109
+ now: Date;
110
+ flagValue: ReleaseFlagValue;
111
+ listMembers: (orgId: string) => Promise<AglynOrgMember[]>;
112
+ mayGenerate: (orgId: string, hostId: string, member: AglynOrgMember) => Promise<boolean>;
113
+ paused: (orgId: string) => Promise<boolean>;
114
+ notify: (uid: string, payload: {
115
+ title: string;
116
+ body: string;
117
+ link: string;
118
+ orgId: string;
119
+ hostId: string;
120
+ }) => Promise<void>;
121
+ send: (email: {
122
+ to: string;
123
+ subject: string;
124
+ text: string;
125
+ fromName: string;
126
+ }) => Promise<AiInsightDigestSendResult>;
127
+ /** The console's absolute origin for an email link, or `''` when none is configured. */
128
+ consoleOrigin: string;
129
+ /** The call's working time; `AI_INSIGHT_DIGEST_RUN_BUDGET_MS` unless a spec holds it. */
130
+ budgetMs?: number;
131
+ }
132
+ export interface AiInsightDigestReport {
133
+ week: string;
134
+ swept: number;
135
+ created: number;
136
+ delivered: number;
137
+ skipped: number;
138
+ /** The send rate refused or the call's time ran out; the run stops, and the next one delivers the rest. */
139
+ deferred: boolean;
140
+ nextCursor: string | null;
141
+ done: boolean;
142
+ }
143
+ /** The week a Monday digest covers: the week the run falls in. */
144
+ export declare function aiInsightDigestWeek(now: Date): string;
145
+ /** A digest email's words: the insights, the site's Analytics page, and where to turn it off. */
146
+ export declare function aiInsightDigestEmailText(input: {
147
+ siteName: string;
148
+ productName: string;
149
+ insights: ReadonlyArray<{
150
+ text: string;
151
+ }>;
152
+ /** Absolute links, or `null` where no console origin is configured to build one from. */
153
+ analyticsUrl: string | null;
154
+ settingsUrl: string | null;
155
+ }): string;
156
+ /**
157
+ * One call of the sweep: delivery for this week and the last on the first
158
+ * call, then — on a Monday — one chunk of workspaces' creation, resumed by
159
+ * `cursor`. The response shape is the console crons' (`nextCursor`, `done`),
160
+ * so the scheduler's loop carries a platform of any size across calls.
161
+ */
162
+ export declare function runAiInsightDigestSweep(deps: AiInsightDigestDeps, options: {
163
+ cursor: string | null;
164
+ }): Promise<AiInsightDigestReport>;
165
+ export {};