@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,809 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ import { hostCollectionKind } from "@aglyn/aglyn/app-utils/collection-kind";
18
+ import { hostPublicOrigin } from "@aglyn/aglyn/app-utils/host-naming";
19
+ import { buildLlmsTxt } from "@aglyn/aglyn/app-utils/llms-txt";
20
+ import { nodesReferenceScreen } from "@aglyn/aglyn/app-utils/screen-link-value";
21
+ import { screenRoutePathToUrl } from "@aglyn/aglyn/app-utils/screen-route";
22
+ import { isScreenIndexable, isSearchDiscouraged, statusPageScreenIds } from "@aglyn/aglyn/app-utils/search-indexing";
23
+ import { SCREEN_SEO_LISTING_FIELDS, isSeoListingFieldKey } from "@aglyn/aglyn/app-utils/seo-listing-fields";
24
+ import { decodeStoredNodes } from "@aglyn/aglyn/app-utils/stored-nodes";
25
+ import { getTemplateScreenIds } from "@aglyn/tenant-runtime/template-screens";
26
+ import { AI_SEO_FINDING_LABELS, AI_SEO_OUTPUT_IDS, aiSeoAuditView, aiSeoJobTarget } from "../model/ai-seo.js";
27
+ import { aiModelForStep } from "../providers/routing.js";
28
+ import { AI_SEO_AUDIT_MAX_PAGES, aiSeoAudit, aiSeoAuditBatches, aiSeoHeadingDemotions, aiSeoNormalizePath, parseAiSeoKeywordLines } from "../runtime/seo-audit.js";
29
+ import { runValidatedGeneration } from "../runtime/ai-doctrine.js";
30
+ import { AI_SEO_FIELDS_MAX_TOKENS, generateSeoFields } from "../runtime/seo-fields.js";
31
+ import { AI_SEO_PAGE_TEXT_MAX_CHARS, aiSeoPageFacts } from "../runtime/seo-page-facts.js";
32
+ import { AI_SEO_FIXES_TOOL_NAME, AI_SEO_SITE_TOOL_NAME, aiSeoFixImages, aiSeoFixesTool, aiSeoKeywordCoverage, aiSeoKeywordList, aiSeoSiteTool, checkAiSeoFixes, checkAiSeoSite } from "../tools/ai-seo-tool.js";
33
+ import { AI_SEO_FIXES_MAX_TOKENS, AI_SEO_SITE_MAX_TOKENS, aiSeoGenerationMaxTokens } from "./ai-job-seo-budget.js";
34
+ /**
35
+ * The `seo` step (AGL-2910): search listings and a site audit, as proposals.
36
+ *
37
+ * `inputs.target` says what the job is about:
38
+ *
39
+ * - `screen` — one page's listing, written from the version the person is
40
+ * looking at (`screenId`, `versionId`), for the page's SEO card;
41
+ * - `product` — one product's listing, from the name and description the
42
+ * product editor handed over (`name`, `text`), for the product editor;
43
+ * - `site` — the audit of every published page the sitemap lists, with a
44
+ * proposed fix per finding, structured data for the site's entity, and the
45
+ * agent guidance `/llms.txt` leads with.
46
+ *
47
+ * ## It writes nothing
48
+ *
49
+ * Like every runner, this reads, asks and returns. A listing is served
50
+ * straight from the screen document, the structured data and `/llms.txt`
51
+ * from the host document, and a page's content from its published version,
52
+ * so the values ride on the job's outputs and nothing else: a person puts
53
+ * them in the page's SEO card or the site SEO form and saves them there, and
54
+ * content fixes become a new version only through the apply door.
55
+ *
56
+ * ## An audit, a unit at a time
57
+ *
58
+ * The first pass reads the site — every published page's version and the
59
+ * shared layouts, for the links between them — scores it without a model,
60
+ * records the report, and runs the first unit of generated work. Each later
61
+ * pass runs one more unit: the site-wide proposal, then the page fixes in
62
+ * batches. Every pass is one reservation and one provider exchange, and it
63
+ * asks the machine to continue until nothing is left, so a large site is a
64
+ * few beats of work rather than one request that cannot finish.
65
+ */ export const AI_SEO_NO_SITE_COPY = 'This SEO job names a site this workspace does not have.';
66
+ export const AI_SEO_NO_PAGE_COPY = 'This page is no longer on the site.';
67
+ export const AI_SEO_NO_TARGET_COPY = 'This SEO job does not say what to write about.';
68
+ export const AI_SEO_NO_PRODUCT_COPY = 'Give the product a name before writing its listing.';
69
+ /** Shared layouts an audit reads for the links in a site's navigation. */ export const AI_SEO_LAYOUT_SCAN_LIMIT = 20;
70
+ /** How much of each page a batch of fixes carries. */ export const AI_SEO_BATCH_PAGE_TEXT_CHARS = 700;
71
+ /**
72
+ * Output budgets, declared with the step's time (`ai-job-seo-budget.ts`,
73
+ * AGL-3035). A batch's largest answer — every page with a title, description,
74
+ * heading and image descriptions at their limits — and the site proposal's are
75
+ * measured in `ai-job-seo-step.spec.ts`.
76
+ */ export { AI_SEO_FIXES_MAX_TOKENS, AI_SEO_SITE_MAX_TOKENS };
77
+ /** Documents read at once. */ const READ_CHUNK = 10;
78
+ /** Pages the site prompt and the llms.txt preview list. */ const SITE_PAGES_LISTED = 25;
79
+ /** The fields a product's listing holds. */ const PRODUCT_LISTING_FIELDS = [
80
+ 'title',
81
+ 'description'
82
+ ];
83
+ const ZERO_USAGE = {
84
+ inputTokens: 0,
85
+ outputTokens: 0,
86
+ cacheReadTokens: 0,
87
+ cacheWriteTokens: 0
88
+ };
89
+ const str = (value)=>typeof value === 'string' ? value.trim() : '';
90
+ const round6 = (value)=>Math.round(value * 1000000) / 1000000;
91
+ function modelOf(context) {
92
+ var _ref;
93
+ return (_ref = context.modelFor == null ? void 0 : context.modelFor.call(context, 'job.seo')) != null ? _ref : aiModelForStep('job.seo');
94
+ }
95
+ function spentNothing(model) {
96
+ return {
97
+ usage: ZERO_USAGE,
98
+ estCostUsd: 0,
99
+ model,
100
+ stopReason: null
101
+ };
102
+ }
103
+ function spentBy(generation) {
104
+ return {
105
+ usage: generation.usage,
106
+ estCostUsd: generation.estCostUsd,
107
+ model: generation.model,
108
+ stopReason: generation.stopReason
109
+ };
110
+ }
111
+ function addSpent(a, b) {
112
+ var _b_stopReason;
113
+ return {
114
+ usage: {
115
+ inputTokens: a.usage.inputTokens + b.usage.inputTokens,
116
+ outputTokens: a.usage.outputTokens + b.usage.outputTokens,
117
+ cacheReadTokens: a.usage.cacheReadTokens + b.usage.cacheReadTokens,
118
+ cacheWriteTokens: a.usage.cacheWriteTokens + b.usage.cacheWriteTokens
119
+ },
120
+ estCostUsd: round6(a.estCostUsd + b.estCostUsd),
121
+ model: b.model || a.model,
122
+ stopReason: (_b_stopReason = b.stopReason) != null ? _b_stopReason : a.stopReason
123
+ };
124
+ }
125
+ /** Through JSON, so no `undefined` reaches the job document's write. */ const plain = (value)=>JSON.parse(JSON.stringify(value));
126
+ /**
127
+ * The fields a listing job writes: the ones the editor named (`inputs.fields`,
128
+ * comma-separated) that the target's editor holds, or all of those.
129
+ */ export function aiSeoRequestedFields(raw, allowed) {
130
+ const named = String(raw != null ? raw : '').split(',').map((part)=>part.trim()).filter(isSeoListingFieldKey);
131
+ const wanted = new Set(named.length ? named : allowed);
132
+ return allowed.filter((key)=>wanted.has(key));
133
+ }
134
+ /** The site's name, as its visitors read it. */ function brandOf(host) {
135
+ var _host_seo;
136
+ return str((_host_seo = host.seo) == null ? void 0 : _host_seo.title) || str(host.displayName) || str(host.subdomain);
137
+ }
138
+ /** The site a job names, read and checked against the job's org. */ async function loadSite(firestore, job) {
139
+ if (!job.hostId) return {
140
+ failure: AI_SEO_NO_SITE_COPY
141
+ };
142
+ const snapshot = await firestore.collection('hosts').doc(job.hostId).get();
143
+ const host = snapshot.exists ? snapshot.data() : null;
144
+ // The route checks the caller's membership of the org the job is metered
145
+ // against, not that the site belongs to it. A site of another org is
146
+ // refused here, before anything about it reaches a prompt.
147
+ if (!host || host.orgId !== job.orgId) return {
148
+ failure: AI_SEO_NO_SITE_COPY
149
+ };
150
+ return {
151
+ host
152
+ };
153
+ }
154
+ /** A version's node map and root, or `null` when it cannot be read. */ async function readVersionNodes(hostRef, screenId, versionId) {
155
+ if (!versionId) return null;
156
+ const snapshot = await hostRef.collection('screens').doc(screenId).collection('versions').doc(versionId).get();
157
+ if (!snapshot.exists) return null;
158
+ const nodes = decodeStoredNodes(snapshot.get('nodes'));
159
+ if (!nodes) return null;
160
+ const rootId = snapshot.get('rootId');
161
+ return _extends({
162
+ nodes
163
+ }, typeof rootId === 'string' ? {
164
+ rootId
165
+ } : {});
166
+ }
167
+ /** Every other page's search title, for a proposal not to repeat. */ async function siteTitles(hostRef, except) {
168
+ const snapshot = await hostRef.collection('screens').select('seo', 'deletedAt').limit(1000).get();
169
+ return snapshot.docs.filter((doc)=>!except.has(doc.id) && !doc.get('deletedAt')).map((doc)=>{
170
+ var _doc_get;
171
+ return str((_doc_get = doc.get('seo')) == null ? void 0 : _doc_get.title);
172
+ }).filter(Boolean);
173
+ }
174
+ /* ------------------------------------------------------------------------ *
175
+ * One listing: a page or a product
176
+ * ------------------------------------------------------------------------ */ function listingOutcome(generation, job, subject, context) {
177
+ var _job_hostId;
178
+ var _context_facts_h1s_, _context_facts, _context_facts1;
179
+ const spent = spentBy(generation);
180
+ if (generation.status === 'refused') return _extends({
181
+ outputs: []
182
+ }, spent, {
183
+ refused: true
184
+ });
185
+ if (generation.status === 'needs_input') return _extends({
186
+ outputs: []
187
+ }, spent, {
188
+ failure: generation.message
189
+ });
190
+ const values = generation.value;
191
+ const notes = [];
192
+ if (context.fields.includes('imageAlt') && context.hasImage && !values.imageAlt) {
193
+ notes.push('No image description was proposed: nothing on the page says what the picture shows.');
194
+ }
195
+ const proposal = {
196
+ kind: 'fields',
197
+ subject,
198
+ values,
199
+ keywords: aiSeoKeywordCoverage(context.keywords, {
200
+ title: values.title,
201
+ description: values.description,
202
+ h1: (_context_facts = context.facts) == null ? void 0 : (_context_facts_h1s_ = _context_facts.h1s[0]) == null ? void 0 : _context_facts_h1s_.text,
203
+ body: (_context_facts1 = context.facts) == null ? void 0 : _context_facts1.text
204
+ }),
205
+ notes
206
+ };
207
+ const output = {
208
+ resource: 'seo',
209
+ id: AI_SEO_OUTPUT_IDS.fields(subject.kind, subject.id),
210
+ hostId: (_job_hostId = job.hostId) != null ? _job_hostId : null,
211
+ label: `SEO proposal · ${subject.name}`,
212
+ proposal: plain(proposal)
213
+ };
214
+ return _extends({
215
+ outputs: [
216
+ output
217
+ ]
218
+ }, spent);
219
+ }
220
+ async function runScreenListing(context, host) {
221
+ var _screen_seo;
222
+ var _job_inputs, _job_inputs1, _job_inputs2, _host_screens, _job_inputs3;
223
+ const { job, firestore, signal } = context;
224
+ const model = modelOf(context);
225
+ const hostRef = firestore.collection('hosts').doc(job.hostId);
226
+ const screenId = str((_job_inputs = job.inputs) == null ? void 0 : _job_inputs['screenId']);
227
+ const snapshot = screenId ? await hostRef.collection('screens').doc(screenId).get() : null;
228
+ const screen = (snapshot == null ? void 0 : snapshot.exists) ? snapshot.data() : null;
229
+ if (!screen || screen.deletedAt) {
230
+ return _extends({
231
+ outputs: []
232
+ }, spentNothing(model), {
233
+ failure: AI_SEO_NO_PAGE_COPY
234
+ });
235
+ }
236
+ const versionId = str((_job_inputs1 = job.inputs) == null ? void 0 : _job_inputs1['versionId']) || str(screen.versionId);
237
+ const version = await readVersionNodes(hostRef, screenId, versionId);
238
+ const facts = aiSeoPageFacts(version == null ? void 0 : version.nodes, {
239
+ rootId: version == null ? void 0 : version.rootId
240
+ });
241
+ const fields = aiSeoRequestedFields((_job_inputs2 = job.inputs) == null ? void 0 : _job_inputs2['fields'], SCREEN_SEO_LISTING_FIELDS);
242
+ const seo = (_screen_seo = screen.seo) != null ? _screen_seo : {};
243
+ const hasImage = Boolean(str(seo.image));
244
+ // The share image is often a picture the page shows too: its description
245
+ // and the text beside it there are what is known about it.
246
+ const onPage = hasImage ? facts.images.find((image)=>image.src === str(seo.image)) : undefined;
247
+ const route = (_host_screens = host.screens) == null ? void 0 : _host_screens[screenId];
248
+ const path = typeof route === 'string' ? screenRoutePathToUrl(route) : null;
249
+ const name = str(screen.displayName) || path || 'Untitled page';
250
+ const keywords = aiSeoKeywordList((_job_inputs3 = job.inputs) == null ? void 0 : _job_inputs3['keywords']);
251
+ const generation = await generateSeoFields(_extends({
252
+ subject: {
253
+ kind: 'screen',
254
+ name,
255
+ path
256
+ },
257
+ brand: brandOf(host),
258
+ text: facts.text || str(screen.description),
259
+ fields,
260
+ current: {
261
+ title: str(seo.title),
262
+ description: str(seo.description),
263
+ breadcrumb: str(seo.breadcrumb),
264
+ imageAlt: str(seo.imageAlt)
265
+ },
266
+ image: hasImage ? {
267
+ alt: str(seo.imageAlt) || (onPage == null ? void 0 : onPage.alt) || null,
268
+ context: (onPage == null ? void 0 : onPage.context) || null
269
+ } : null,
270
+ keywords,
271
+ otherTitles: await siteTitles(hostRef, new Set([
272
+ screenId
273
+ ])),
274
+ model,
275
+ maxTokens: aiSeoGenerationMaxTokens(model, AI_SEO_FIELDS_MAX_TOKENS)
276
+ }, signal ? {
277
+ signal
278
+ } : {}));
279
+ return listingOutcome(generation, job, {
280
+ kind: 'screen',
281
+ id: screenId,
282
+ name,
283
+ path
284
+ }, {
285
+ keywords,
286
+ facts,
287
+ fields,
288
+ hasImage
289
+ });
290
+ }
291
+ async function runProductListing(context, host) {
292
+ var _job_inputs, _job_inputs1, _job_inputs2, _job_inputs3, _job_inputs4, _job_inputs5, _job_inputs6;
293
+ const { job, signal } = context;
294
+ const model = modelOf(context);
295
+ const name = str((_job_inputs = job.inputs) == null ? void 0 : _job_inputs['name']).slice(0, 200);
296
+ if (!name) return _extends({
297
+ outputs: []
298
+ }, spentNothing(model), {
299
+ failure: AI_SEO_NO_PRODUCT_COPY
300
+ });
301
+ const fields = aiSeoRequestedFields((_job_inputs1 = job.inputs) == null ? void 0 : _job_inputs1['fields'], PRODUCT_LISTING_FIELDS);
302
+ const keywords = aiSeoKeywordList((_job_inputs2 = job.inputs) == null ? void 0 : _job_inputs2['keywords']);
303
+ const productId = str((_job_inputs3 = job.inputs) == null ? void 0 : _job_inputs3['productId']) || null;
304
+ const generation = await generateSeoFields(_extends({
305
+ subject: {
306
+ kind: 'product',
307
+ name
308
+ },
309
+ brand: brandOf(host),
310
+ // The product's own words, as its editor handed them over: the product
311
+ // document is the commerce plugin's, and this step never reads it.
312
+ text: str((_job_inputs4 = job.inputs) == null ? void 0 : _job_inputs4['text']).slice(0, AI_SEO_PAGE_TEXT_MAX_CHARS),
313
+ fields,
314
+ current: {
315
+ title: str((_job_inputs5 = job.inputs) == null ? void 0 : _job_inputs5['currentTitle']),
316
+ description: str((_job_inputs6 = job.inputs) == null ? void 0 : _job_inputs6['currentDescription'])
317
+ },
318
+ image: null,
319
+ keywords,
320
+ model,
321
+ maxTokens: aiSeoGenerationMaxTokens(model, AI_SEO_FIELDS_MAX_TOKENS)
322
+ }, signal ? {
323
+ signal
324
+ } : {}));
325
+ return listingOutcome(generation, job, {
326
+ kind: 'product',
327
+ id: productId,
328
+ name
329
+ }, {
330
+ keywords,
331
+ facts: null,
332
+ fields,
333
+ hasImage: false
334
+ });
335
+ }
336
+ /**
337
+ * Read the site the way its sitemap lists it: every screen the routing map
338
+ * publishes, less the template screens, the status pages and every screen
339
+ * that is not public — through the same shared predicates the tenant's
340
+ * `sitemap.xml` and `/llms.txt` apply, so the audit covers exactly the pages
341
+ * a crawler is handed. Then each page's published version, and the shared
342
+ * layouts, for the links that decide which pages nothing points to.
343
+ */ export async function scanAiSeoSite(firestore, hostId, host, rawKeywords) {
344
+ var _host_screens;
345
+ const hostRef = firestore.collection('hosts').doc(hostId);
346
+ const routing = (_host_screens = host.screens) != null ? _host_screens : {};
347
+ const [screenDocs, templateScreenIds, layoutDocs] = await Promise.all([
348
+ hostRef.collection('screens').select('visibility', 'seo', 'description', 'displayName', 'versionId', 'deletedAt').limit(1000).get(),
349
+ getTemplateScreenIds({
350
+ hostId
351
+ }),
352
+ hostRef.collection('layouts').select('versionId').limit(AI_SEO_LAYOUT_SCAN_LIMIT).get()
353
+ ]);
354
+ const screens = new Map(screenDocs.docs.map((doc)=>[
355
+ doc.id,
356
+ doc.data()
357
+ ]));
358
+ const excluded = new Set([
359
+ ...statusPageScreenIds(host),
360
+ ...templateScreenIds
361
+ ]);
362
+ const published = Object.entries(routing).filter(([screenId])=>!excluded.has(screenId)).filter(([screenId])=>{
363
+ const screen = screens.get(screenId);
364
+ return Boolean(screen) && !(screen == null ? void 0 : screen.deletedAt) && isScreenIndexable(screen);
365
+ }).map(([screenId, route])=>({
366
+ screenId,
367
+ path: screenRoutePathToUrl(String(route))
368
+ })).sort((a, b)=>a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
369
+ const audited = published.slice(0, AI_SEO_AUDIT_MAX_PAGES);
370
+ const versions = new Map();
371
+ for(let start = 0; start < audited.length; start += READ_CHUNK){
372
+ await Promise.all(audited.slice(start, start + READ_CHUNK).map(async ({ screenId })=>{
373
+ var _screens_get;
374
+ versions.set(screenId, await readVersionNodes(hostRef, screenId, str((_screens_get = screens.get(screenId)) == null ? void 0 : _screens_get.versionId)));
375
+ }));
376
+ }
377
+ const layoutNodes = [];
378
+ const layouts = layoutDocs.docs.filter((doc)=>str(doc.get('versionId')));
379
+ for(let start = 0; start < layouts.length; start += READ_CHUNK){
380
+ await Promise.all(layouts.slice(start, start + READ_CHUNK).map(async (doc)=>{
381
+ const snapshot = await doc.ref.collection('versions').doc(str(doc.get('versionId'))).get();
382
+ const nodes = snapshot.exists ? decodeStoredNodes(snapshot.get('nodes')) : null;
383
+ if (nodes) layoutNodes.push(nodes);
384
+ }));
385
+ }
386
+ const keywordsByPath = parseAiSeoKeywordLines(rawKeywords);
387
+ const auditedPaths = new Set(audited.map((page)=>aiSeoNormalizePath(page.path)));
388
+ const notes = Object.keys(keywordsByPath).filter((path)=>!auditedPaths.has(path)).map((path)=>`Keywords for ${path} were not used: no audited page is published at that address.`);
389
+ const pages = audited.map(({ screenId, path })=>{
390
+ var _screens_get, _versions_get, _screen_seo, _keywordsByPath_aiSeoNormalizePath, _ref;
391
+ const screen = (_screens_get = screens.get(screenId)) != null ? _screens_get : {};
392
+ const version = (_versions_get = versions.get(screenId)) != null ? _versions_get : null;
393
+ const linkedFrom = layoutNodes.some((nodes)=>nodesReferenceScreen(nodes, screenId)) || audited.some((other)=>{
394
+ var _ref;
395
+ var _versions_get;
396
+ return other.screenId !== screenId && nodesReferenceScreen((_ref = (_versions_get = versions.get(other.screenId)) == null ? void 0 : _versions_get.nodes) != null ? _ref : null, screenId);
397
+ });
398
+ return {
399
+ screenId,
400
+ path,
401
+ name: str(screen.displayName) || path,
402
+ versionId: str(screen.versionId) || null,
403
+ seo: (_screen_seo = screen.seo) != null ? _screen_seo : {},
404
+ description: str(screen.description),
405
+ facts: aiSeoPageFacts(version == null ? void 0 : version.nodes, {
406
+ rootId: version == null ? void 0 : version.rootId
407
+ }),
408
+ linkedFrom,
409
+ keywords: (_keywordsByPath_aiSeoNormalizePath = keywordsByPath[aiSeoNormalizePath(path)]) != null ? _keywordsByPath_aiSeoNormalizePath : [],
410
+ nodes: (_ref = version == null ? void 0 : version.nodes) != null ? _ref : null
411
+ };
412
+ });
413
+ return {
414
+ pages,
415
+ skipped: Math.max(0, published.length - audited.length),
416
+ notes
417
+ };
418
+ }
419
+ /** The units an audit owes after the outputs recorded so far, in the order they run. */ export function aiSeoPendingUnits(report, outputs) {
420
+ const done = new Set(outputs.map((output)=>output.id));
421
+ const units = [];
422
+ if (report.siteProposal && !done.has(AI_SEO_OUTPUT_IDS.site)) units.push({
423
+ kind: 'site'
424
+ });
425
+ const batches = aiSeoAuditBatches(report);
426
+ batches.forEach((screenIds, index)=>{
427
+ if (!done.has(AI_SEO_OUTPUT_IDS.fixes(index + 1))) {
428
+ units.push({
429
+ kind: 'batch',
430
+ batch: index + 1,
431
+ of: batches.length,
432
+ screenIds
433
+ });
434
+ }
435
+ });
436
+ return units;
437
+ }
438
+ /* ---- The site-wide proposal ---------------------------------------------- */ export const AI_SEO_SITE_INSTRUCTIONS = [
439
+ {
440
+ text: 'You propose two things for a website: the structured data that says who publishes it, and ' + 'the guidance an AI agent reads first in its /llms.txt.\n\n' + `Answer by calling ${AI_SEO_SITE_TOOL_NAME} exactly once. A reply in prose cannot be used.\n\n` + 'Rules:\n' + '- Fill only the fields you are told are empty; answer null for every other one.\n' + '- Use only what the pages you are given state. A contact email or telephone number goes in ' + 'only when a page shows it exactly; never compose one.\n' + '- The entity description says what the publisher is, in one plain sentence, not what one page ' + 'offers.\n' + '- The agent guidance is checkable and specific: the questions this site answers and which ' + 'pages answer them. No marketing language: an agent discounts a claim it cannot check.\n' + '- Keep every length the tool states, and write in the language of the pages.',
441
+ cacheBreakpoint: true
442
+ }
443
+ ];
444
+ /** The site SEO form fields blank on the site now. */ export function aiSeoBlankSiteFields(host) {
445
+ var _ref, _ref1;
446
+ var _host_seo, _host_seo1;
447
+ const entity = (_ref = (_host_seo = host.seo) == null ? void 0 : _host_seo.entity) != null ? _ref : {};
448
+ const agent = (_ref1 = (_host_seo1 = host.seo) == null ? void 0 : _host_seo1.agent) != null ? _ref1 : {};
449
+ const blank = new Set();
450
+ if (entity.type === undefined || entity.type === null || entity.type === '') blank.add('seo.entity.type');
451
+ if (!str(entity.name)) blank.add('seo.entity.name');
452
+ if (!str(entity.description)) blank.add('seo.entity.description');
453
+ if (!str(entity.email)) blank.add('seo.entity.email');
454
+ if (!str(entity.telephone)) blank.add('seo.entity.telephone');
455
+ if (!str(entity.contactType)) blank.add('seo.entity.contactType');
456
+ if (!str(agent.whenToUse)) blank.add('seo.agent.whenToUse');
457
+ if (!str(agent.howToUse)) blank.add('seo.agent.howToUse');
458
+ return blank;
459
+ }
460
+ /** The site's content collections, for the llms.txt preview. */ async function readContentCollections(hostRef) {
461
+ try {
462
+ const snapshot = await hostRef.collection('collections').select('slug', 'displayName', 'kind').limit(50).get();
463
+ return snapshot.docs.filter((doc)=>hostCollectionKind(doc.data()) === 'content' && str(doc.get('slug'))).map((doc)=>({
464
+ slug: str(doc.get('slug')),
465
+ name: str(doc.get('displayName')) || undefined
466
+ }));
467
+ } catch (unused) {
468
+ // A preview without the feeds is still a preview of the guidance.
469
+ return [];
470
+ }
471
+ }
472
+ /** `/llms.txt` as it reads with `values` saved over what the site stores now. */ export function aiSeoLlmsPreview(host, values, pages, collections) {
473
+ var _hostPublicOrigin, _values_seoagentwhenToUse, _values_seoagenthowToUse, _values_seoentityemail;
474
+ var _host_seo, _host_seo1, _host_seo_agent, _host_seo2, _host_seo_agent1, _host_seo3, _host_seo_entity, _host_seo4;
475
+ return buildLlmsTxt({
476
+ siteName: str((_host_seo = host.seo) == null ? void 0 : _host_seo.title) || str(host.displayName) || 'Site',
477
+ origin: (_hostPublicOrigin = hostPublicOrigin(host)) != null ? _hostPublicOrigin : '',
478
+ description: str((_host_seo1 = host.seo) == null ? void 0 : _host_seo1.description) || undefined,
479
+ agent: {
480
+ whenToUse: (_values_seoagentwhenToUse = values['seo.agent.whenToUse']) != null ? _values_seoagentwhenToUse : (_host_seo2 = host.seo) == null ? void 0 : (_host_seo_agent = _host_seo2.agent) == null ? void 0 : _host_seo_agent.whenToUse,
481
+ howToUse: (_values_seoagenthowToUse = values['seo.agent.howToUse']) != null ? _values_seoagenthowToUse : (_host_seo3 = host.seo) == null ? void 0 : (_host_seo_agent1 = _host_seo3.agent) == null ? void 0 : _host_seo_agent1.howToUse
482
+ },
483
+ pages,
484
+ collections,
485
+ hasSearch: true,
486
+ contactEmail: (_values_seoentityemail = values['seo.entity.email']) != null ? _values_seoentityemail : str((_host_seo4 = host.seo) == null ? void 0 : (_host_seo_entity = _host_seo4.entity) == null ? void 0 : _host_seo_entity.email) || undefined
487
+ });
488
+ }
489
+ async function proposeSite(context, host, scan) {
490
+ var _job_hostId;
491
+ var _host_seo;
492
+ const { job, firestore, signal } = context;
493
+ const model = modelOf(context);
494
+ const hostRef = firestore.collection('hosts').doc(job.hostId);
495
+ const blank = aiSeoBlankSiteFields(host);
496
+ const collections = await readContentCollections(hostRef);
497
+ const topLevel = scan.pages.filter((page)=>!page.path.replace(/^\//, '').includes('/')).slice(0, SITE_PAGES_LISTED).map((page)=>_extends({
498
+ path: page.path
499
+ }, page.name ? {
500
+ title: page.name
501
+ } : {}));
502
+ // The pages that say who publishes a site: the home page, and whatever is
503
+ // about the company or how to reach it.
504
+ const telling = scan.pages.filter((page)=>page.path === '/' || /about|contact|company|team|who/i.test(page.path)).slice(0, 4);
505
+ const prompt = [
506
+ `Site: ${brandOf(host) || 'untitled site'}`,
507
+ ((_host_seo = host.seo) == null ? void 0 : _host_seo.description) ? `Site description: ${str(host.seo.description)}` : '',
508
+ `Empty fields you may fill: ${[
509
+ ...blank
510
+ ].join(', ') || 'none'}`,
511
+ 'Pages:',
512
+ ...scan.pages.slice(0, SITE_PAGES_LISTED).map((page)=>`- ${page.path} — ${page.name}${str(page.seo.title) ? ` — ${str(page.seo.title)}` : ''}`),
513
+ collections.length ? `Content collections: ${collections.map((entry)=>entry.name || entry.slug).join(', ')}` : '',
514
+ ...telling.flatMap((page)=>[
515
+ '',
516
+ `Text of ${page.path}:`,
517
+ page.facts.text.slice(0, 1200) || '(no text)'
518
+ ])
519
+ ].filter((line)=>line !== '').join('\n');
520
+ const siteText = scan.pages.map((page)=>page.facts.text).join('\n');
521
+ const generation = await runValidatedGeneration('seo-site', _extends({
522
+ step: 'job.seo',
523
+ model,
524
+ instructions: AI_SEO_SITE_INSTRUCTIONS,
525
+ messages: [
526
+ {
527
+ role: 'user',
528
+ content: prompt
529
+ }
530
+ ],
531
+ tool: aiSeoSiteTool(),
532
+ maxTokens: aiSeoGenerationMaxTokens(model, AI_SEO_SITE_MAX_TOKENS)
533
+ }, signal ? {
534
+ signal
535
+ } : {}, {
536
+ check: (answer)=>checkAiSeoSite(answer, {
537
+ blank,
538
+ siteText
539
+ })
540
+ }));
541
+ const proposed = generation.status === 'ok' ? generation.value : {
542
+ values: {},
543
+ notes: []
544
+ };
545
+ const notes = generation.status === 'ok' ? proposed.notes : [
546
+ generation.status === 'refused' ? 'The AI declined to propose structured data for this site.' : generation.message
547
+ ];
548
+ const site = {
549
+ values: proposed.values,
550
+ llmsPreview: aiSeoLlmsPreview(host, proposed.values, topLevel, collections),
551
+ notes
552
+ };
553
+ return {
554
+ output: {
555
+ resource: 'seo',
556
+ id: AI_SEO_OUTPUT_IDS.site,
557
+ hostId: (_job_hostId = job.hostId) != null ? _job_hostId : null,
558
+ label: 'SEO audit · structured data and agent guidance',
559
+ proposal: plain({
560
+ kind: 'site',
561
+ site
562
+ })
563
+ },
564
+ spent: spentBy(generation)
565
+ };
566
+ }
567
+ /* ---- A batch of page fixes ------------------------------------------------ */ export const AI_SEO_FIXES_INSTRUCTIONS = [
568
+ {
569
+ text: 'You fix the search listings and headings of a website’s pages. For each page you are given ' + 'what an audit found, what the page shows now, and its text.\n\n' + `Answer by calling ${AI_SEO_FIXES_TOOL_NAME} exactly once, with one entry per page. A reply in ` + 'prose cannot be used.\n\n' + 'Rules:\n' + '- Fix only what the audit found. Answer null for a value it did not find a problem with.\n' + '- Write only from the page’s own text. Never invent a fact, a price, a name, a place or a claim.\n' + '- A title says what the page is, specifically. No two pages share a title, and none repeats a ' + 'title you are told another page uses.\n' + '- A description is one or two sentences telling a searcher what they will find.\n' + '- The main heading names what the page is about in a few plain words.\n' + '- An image description says what the picture most likely shows, from the text beside it. ' + 'Leave an image out when the text gives no idea.\n' + '- A target keyword goes in only where the page is about it and it reads naturally: at most ' + 'once in a title and once in a description. Never list keywords or repeat a word to rank.\n' + '- Keep every length the tool states, and write in the language of each page.',
570
+ cacheBreakpoint: true
571
+ }
572
+ ];
573
+ /** The fixes one page gets: the model's values, its content fixes, and the guidance no fix can give. */ export function aiSeoPageFixFor(page, answer) {
574
+ var _ref;
575
+ const values = {};
576
+ if (answer == null ? void 0 : answer.title) values.title = answer.title;
577
+ if (answer == null ? void 0 : answer.description) values.description = answer.description;
578
+ const content = [];
579
+ for (const alt of (_ref = answer == null ? void 0 : answer.imageAlts) != null ? _ref : [])content.push({
580
+ kind: 'image-alt',
581
+ nodeId: alt.nodeId,
582
+ alt: alt.alt
583
+ });
584
+ if (answer == null ? void 0 : answer.h1) {
585
+ const first = page.facts.h1s[0];
586
+ const promotable = page.facts.headings.find((heading)=>heading.editable && heading.nodeId);
587
+ if (page.codes.has('h1-thin') && (first == null ? void 0 : first.editable) && first.nodeId) {
588
+ content.push({
589
+ kind: 'h1-set',
590
+ nodeId: first.nodeId,
591
+ text: answer.h1
592
+ });
593
+ } else if (page.codes.has('h1-missing') && (promotable == null ? void 0 : promotable.nodeId)) {
594
+ content.push({
595
+ kind: 'h1-set',
596
+ nodeId: promotable.nodeId,
597
+ text: answer.h1
598
+ });
599
+ } else if (page.codes.has('h1-missing')) {
600
+ content.push({
601
+ kind: 'h1-insert',
602
+ text: answer.h1
603
+ });
604
+ }
605
+ }
606
+ if (page.codes.has('h1-multiple')) content.push(...aiSeoHeadingDemotions(page.facts));
607
+ const guidance = [];
608
+ if (page.codes.has('orphan')) {
609
+ guidance.push('Link to this page from your navigation or a related page. Where it belongs is yours to choose.');
610
+ }
611
+ return {
612
+ screenId: page.screenId,
613
+ values,
614
+ content,
615
+ guidance
616
+ };
617
+ }
618
+ /** The user turn for one batch: each page's findings, what it shows now, and its text. */ export function aiSeoFixesPrompt(pages, titlesElsewhere) {
619
+ const titles = titlesElsewhere.length ? `Titles other pages use:\n${titlesElsewhere.slice(0, 40).map((title)=>`- ${title}`).join('\n')}\n\n` : '';
620
+ const blocks = pages.map((page)=>{
621
+ var _page_seo, _page_seo1, _page_facts_h1s_;
622
+ const lines = [
623
+ `### Page ${page.screenId}: ${page.name} (${page.path})`,
624
+ `Found: ${[
625
+ ...page.codes
626
+ ].map((code)=>AI_SEO_FINDING_LABELS[code]).join('; ')}`,
627
+ `Title now: ${str((_page_seo = page.seo) == null ? void 0 : _page_seo.title) || '(none)'}`,
628
+ `Description now: ${str((_page_seo1 = page.seo) == null ? void 0 : _page_seo1.description) || '(none)'}`,
629
+ `Main heading now: ${((_page_facts_h1s_ = page.facts.h1s[0]) == null ? void 0 : _page_facts_h1s_.text) || '(none)'}`
630
+ ];
631
+ if (page.keywords.length) lines.push(`Target keywords: ${page.keywords.join(', ')}`);
632
+ const images = aiSeoFixImages(page);
633
+ if (images.length) {
634
+ lines.push('Images without a description:', ...images.map((image)=>`- ${image.nodeId}: beside "${image.context || 'no text'}"`));
635
+ }
636
+ lines.push('Text:', page.facts.text.slice(0, AI_SEO_BATCH_PAGE_TEXT_CHARS) || '(no text)');
637
+ return lines.join('\n');
638
+ });
639
+ return `${titles}${blocks.join('\n\n')}`;
640
+ }
641
+ async function proposeFixes(context, report, unit) {
642
+ var _job_hostId;
643
+ const { job, firestore, signal } = context;
644
+ const model = modelOf(context);
645
+ const hostRef = firestore.collection('hosts').doc(job.hostId);
646
+ const reports = new Map(report.pages.map((page)=>[
647
+ page.screenId,
648
+ page
649
+ ]));
650
+ // Read now, not as audited: a page edited since keeps its edits, and one
651
+ // deleted since is skipped.
652
+ const loaded = await Promise.all(unit.screenIds.map(async (screenId)=>{
653
+ var _screen_seo;
654
+ const pageReport = reports.get(screenId);
655
+ const snapshot = await hostRef.collection('screens').doc(screenId).get();
656
+ const screen = snapshot.exists ? snapshot.data() : null;
657
+ if (!pageReport || !screen || screen.deletedAt) return null;
658
+ const version = await readVersionNodes(hostRef, screenId, str(screen.versionId));
659
+ return {
660
+ screenId,
661
+ path: pageReport.path,
662
+ name: pageReport.name,
663
+ codes: new Set(pageReport.findings.map((entry)=>entry.code)),
664
+ keywords: pageReport.keywords.map((entry)=>entry.keyword),
665
+ seo: (_screen_seo = screen.seo) != null ? _screen_seo : {},
666
+ facts: aiSeoPageFacts(version == null ? void 0 : version.nodes, {
667
+ rootId: version == null ? void 0 : version.rootId
668
+ })
669
+ };
670
+ }));
671
+ const pages = loaded.filter((page)=>page !== null);
672
+ const titlesElsewhere = await siteTitles(hostRef, new Set(pages.map((page)=>page.screenId)));
673
+ let spent = spentNothing(model);
674
+ let answers = {};
675
+ const notes = [];
676
+ if (pages.length) {
677
+ const generation = await runValidatedGeneration('seo-fixes', _extends({
678
+ step: 'job.seo',
679
+ model,
680
+ instructions: AI_SEO_FIXES_INSTRUCTIONS,
681
+ messages: [
682
+ {
683
+ role: 'user',
684
+ content: aiSeoFixesPrompt(pages, titlesElsewhere)
685
+ }
686
+ ],
687
+ tool: aiSeoFixesTool(pages.map((page)=>page.screenId)),
688
+ // Lowered on a tier too slow to answer a whole batch and ask again
689
+ // inside the least time the step registers.
690
+ maxTokens: aiSeoGenerationMaxTokens(model, AI_SEO_FIXES_MAX_TOKENS)
691
+ }, signal ? {
692
+ signal
693
+ } : {}, {
694
+ check: (answer)=>checkAiSeoFixes(answer, pages, titlesElsewhere)
695
+ }));
696
+ spent = spentBy(generation);
697
+ if (generation.status === 'ok') {
698
+ answers = generation.value;
699
+ } else {
700
+ notes.push(generation.status === 'refused' ? 'The AI declined to propose fixes for these pages.' : generation.message);
701
+ }
702
+ }
703
+ const fixes = pages.map((page)=>{
704
+ var _answers_page_screenId;
705
+ return aiSeoPageFixFor(page, (_answers_page_screenId = answers[page.screenId]) != null ? _answers_page_screenId : null);
706
+ });
707
+ const skipped = unit.screenIds.length - pages.length;
708
+ if (skipped > 0) {
709
+ notes.push(`${skipped} ${skipped === 1 ? 'page was' : 'pages were'} deleted since the audit and left out.`);
710
+ }
711
+ return {
712
+ output: {
713
+ resource: 'seo',
714
+ id: AI_SEO_OUTPUT_IDS.fixes(unit.batch),
715
+ hostId: (_job_hostId = job.hostId) != null ? _job_hostId : null,
716
+ label: `SEO audit · fixes ${unit.batch} of ${unit.of}`,
717
+ proposal: plain({
718
+ kind: 'fixes',
719
+ batch: unit.batch,
720
+ fixes,
721
+ notes
722
+ })
723
+ },
724
+ spent
725
+ };
726
+ }
727
+ async function runSiteAuditPass(context, host) {
728
+ var _job_outputs, _job_outputs1;
729
+ var _job_inputs;
730
+ const { job, firestore } = context;
731
+ const model = modelOf(context);
732
+ const recorded = aiSeoAuditView((_job_outputs = job.outputs) != null ? _job_outputs : []);
733
+ const outputs = [];
734
+ let spent = spentNothing(model);
735
+ let report;
736
+ let scan = null;
737
+ if (recorded) {
738
+ report = recorded.report;
739
+ } else {
740
+ var _ref, _ref1, _job_hostId;
741
+ var _job_inputs1, _host_seo, _host_seo1;
742
+ scan = await scanAiSeoSite(firestore, job.hostId, host, (_job_inputs1 = job.inputs) == null ? void 0 : _job_inputs1['keywords']);
743
+ report = aiSeoAudit(scan.pages, {
744
+ discouraged: isSearchDiscouraged(host),
745
+ entity: (_ref = (_host_seo = host.seo) == null ? void 0 : _host_seo.entity) != null ? _ref : {},
746
+ agent: (_ref1 = (_host_seo1 = host.seo) == null ? void 0 : _host_seo1.agent) != null ? _ref1 : {}
747
+ }, {
748
+ skipped: scan.skipped
749
+ });
750
+ report.notes.push(...scan.notes);
751
+ const findings = report.pages.reduce((sum, page)=>sum + page.findings.length, report.site.length);
752
+ outputs.push({
753
+ resource: 'seo',
754
+ id: AI_SEO_OUTPUT_IDS.report,
755
+ hostId: (_job_hostId = job.hostId) != null ? _job_hostId : null,
756
+ label: `SEO audit · ${report.pages.length} ${report.pages.length === 1 ? 'page' : 'pages'} · ${findings} ${findings === 1 ? 'finding' : 'findings'}`,
757
+ proposal: plain(report)
758
+ });
759
+ }
760
+ const units = aiSeoPendingUnits(report, [
761
+ ...(_job_outputs1 = job.outputs) != null ? _job_outputs1 : [],
762
+ ...outputs
763
+ ]);
764
+ if (!units.length) return _extends({
765
+ outputs
766
+ }, spent);
767
+ const [unit] = units;
768
+ const result = unit.kind === 'site' ? await proposeSite(context, host, scan != null ? scan : await scanAiSeoSite(firestore, job.hostId, host, (_job_inputs = job.inputs) == null ? void 0 : _job_inputs['keywords'])) : await proposeFixes(context, report, unit);
769
+ outputs.push(result.output);
770
+ spent = addSpent(spent, result.spent);
771
+ return _extends({
772
+ outputs
773
+ }, spent, units.length > 1 ? {
774
+ continue: true
775
+ } : {});
776
+ }
777
+ export const runAiJobSeoStep = async (context)=>{
778
+ const { job, firestore } = context;
779
+ if (!firestore) {
780
+ // The machine always hands one in; a runner called without it is a
781
+ // wiring fault, not a customer path.
782
+ throw new Error('the SEO step reads the site it writes about and was given no Firestore');
783
+ }
784
+ const target = aiSeoJobTarget(job.inputs);
785
+ if (!target) return _extends({
786
+ outputs: []
787
+ }, spentNothing(modelOf(context)), {
788
+ failure: AI_SEO_NO_TARGET_COPY
789
+ });
790
+ const site = await loadSite(firestore, job);
791
+ if ('failure' in site) return _extends({
792
+ outputs: []
793
+ }, spentNothing(modelOf(context)), {
794
+ failure: site.failure
795
+ });
796
+ const withFirestore = _extends({}, context, {
797
+ firestore
798
+ });
799
+ switch(target){
800
+ case 'screen':
801
+ return runScreenListing(withFirestore, site.host);
802
+ case 'product':
803
+ return runProductListing(withFirestore, site.host);
804
+ case 'site':
805
+ return runSiteAuditPass(withFirestore, site.host);
806
+ }
807
+ };
808
+
809
+ //# sourceMappingURL=ai-job-seo-step.js.map