@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,49 @@
1
+ import { authorizedFetch } from '@aglyn/shared-util-http/authorized-token';
2
+ import type { AiAllotmentMode } from '../model/ai-allotments';
3
+ import type { AiAllotmentsWire } from '../usage/ai-usage-wire';
4
+ /**
5
+ * The AI allotments a card shows, through `/api/ai/allotments` (AGL-2942).
6
+ *
7
+ * Loading, answered, refused or failed — four states, for the reason
8
+ * `use-org-ai-usage.ts` gives: the member page and the collaborators card are
9
+ * open to people who may not read billing, and for them a 403 is the
10
+ * ordinary answer, rendered as no card rather than a warning.
11
+ *
12
+ * One read per reader and question, shared by every mount that asks it — a
13
+ * collaborators column mounts once per ROW — and every read is taken again
14
+ * after a save, so the column, the site card and the Billing section agree
15
+ * the moment one of them writes.
16
+ */
17
+ export type AiAllotmentsStatus = 'loading' | 'ready' | 'refused' | 'error';
18
+ export interface AiAllotmentsState {
19
+ status: AiAllotmentsStatus;
20
+ data: AiAllotmentsWire | null;
21
+ reload: () => void;
22
+ }
23
+ /** Forget every shared read; specs start each case from nothing. */
24
+ export declare function resetAiAllotmentReadsForTests(): void;
25
+ /** Read every allotments question again — after a save. */
26
+ export declare function reloadAllAiAllotments(): void;
27
+ export declare function useAiAllotments(input: {
28
+ orgId?: string | null;
29
+ hostId?: string | null;
30
+ uid?: string | null;
31
+ enabled?: boolean;
32
+ }): AiAllotmentsState;
33
+ /** One allotment a save sets. */
34
+ export interface AiAllotmentSetInput {
35
+ subject: string;
36
+ credits: number | null;
37
+ mode: AiAllotmentMode;
38
+ models: string[] | null;
39
+ }
40
+ /** Set, remove, or set on every site — then every card reads again. */
41
+ export declare function saveAiAllotments(user: Parameters<typeof authorizedFetch>[0], body: {
42
+ orgId: string;
43
+ set?: AiAllotmentSetInput[];
44
+ remove?: string[];
45
+ everySite?: Omit<AiAllotmentSetInput, 'subject'> | null;
46
+ }): Promise<{
47
+ ok: boolean;
48
+ error: string | null;
49
+ }>;
@@ -0,0 +1,171 @@
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
+ */ 'use client';
17
+ import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
18
+ import { useUser } from "@aglyn/tenant-feature-instance";
19
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
20
+ const LOADING = {
21
+ status: 'loading',
22
+ data: null
23
+ };
24
+ const sharedReads = new Map();
25
+ /** Forget every shared read; specs start each case from nothing. */ export function resetAiAllotmentReadsForTests() {
26
+ sharedReads.clear();
27
+ }
28
+ function publish(entry, read) {
29
+ entry.read = read;
30
+ for (const listener of entry.listeners)listener(read);
31
+ }
32
+ async function readInto(entry) {
33
+ entry.generation += 1;
34
+ const generation = entry.generation;
35
+ publish(entry, {
36
+ status: 'loading',
37
+ data: entry.read.data
38
+ });
39
+ try {
40
+ const response = await authorizedFetch(entry.user, `/api/ai/allotments?${entry.query}`);
41
+ if (generation !== entry.generation) return;
42
+ if (response.status === 403 || response.status === 404) {
43
+ publish(entry, {
44
+ status: 'refused',
45
+ data: null
46
+ });
47
+ return;
48
+ }
49
+ const payload = await response.json().catch(()=>null);
50
+ if (generation !== entry.generation) return;
51
+ publish(entry, response.ok && payload ? {
52
+ status: 'ready',
53
+ data: payload
54
+ } : {
55
+ status: 'error',
56
+ data: null
57
+ });
58
+ } catch (unused) {
59
+ if (generation === entry.generation) publish(entry, {
60
+ status: 'error',
61
+ data: null
62
+ });
63
+ }
64
+ }
65
+ /** Read every allotments question again — after a save. */ export function reloadAllAiAllotments() {
66
+ for (const entry of sharedReads.values()){
67
+ if (entry.listeners.size) void readInto(entry);
68
+ }
69
+ }
70
+ export function useAiAllotments(input) {
71
+ var _ref, _input_orgId, _input_hostId, _input_uid;
72
+ const { data: user } = useUser();
73
+ const signedInUid = (_ref = user == null ? void 0 : user.uid) != null ? _ref : null;
74
+ const userRef = useRef(user);
75
+ userRef.current = user;
76
+ const orgId = (_input_orgId = input.orgId) != null ? _input_orgId : '';
77
+ const hostId = (_input_hostId = input.hostId) != null ? _input_hostId : '';
78
+ const subjectUid = (_input_uid = input.uid) != null ? _input_uid : '';
79
+ const enabled = input.enabled !== false && Boolean(orgId || hostId);
80
+ const key = signedInUid && enabled ? [
81
+ signedInUid,
82
+ orgId,
83
+ hostId,
84
+ subjectUid
85
+ ].join('\x00') : null;
86
+ const query = useMemo(()=>{
87
+ const params = new URLSearchParams();
88
+ if (orgId) params.set('orgId', orgId);
89
+ if (hostId) params.set('hostId', hostId);
90
+ if (subjectUid) params.set('uid', subjectUid);
91
+ return params.toString();
92
+ }, [
93
+ orgId,
94
+ hostId,
95
+ subjectUid
96
+ ]);
97
+ const [read, setRead] = useState(()=>{
98
+ var _ref;
99
+ var _sharedReads_get;
100
+ return (_ref = key ? (_sharedReads_get = sharedReads.get(key)) == null ? void 0 : _sharedReads_get.read : undefined) != null ? _ref : LOADING;
101
+ });
102
+ useEffect(()=>{
103
+ const signedIn = userRef.current;
104
+ if (!key || !signedIn) return undefined;
105
+ let entry = sharedReads.get(key);
106
+ if (!entry) {
107
+ entry = {
108
+ read: LOADING,
109
+ listeners: new Set(),
110
+ generation: 0,
111
+ query,
112
+ user: signedIn
113
+ };
114
+ sharedReads.set(key, entry);
115
+ }
116
+ const shared = entry;
117
+ shared.user = signedIn;
118
+ const first = shared.listeners.size === 0;
119
+ shared.listeners.add(setRead);
120
+ setRead(shared.read);
121
+ if (first) void readInto(shared);
122
+ return ()=>{
123
+ shared.listeners.delete(setRead);
124
+ };
125
+ }, [
126
+ key,
127
+ query
128
+ ]);
129
+ const reload = useCallback(()=>{
130
+ const entry = key ? sharedReads.get(key) : undefined;
131
+ if (entry) void readInto(entry);
132
+ }, [
133
+ key
134
+ ]);
135
+ return {
136
+ status: key ? read.status : 'loading',
137
+ data: key ? read.data : null,
138
+ reload
139
+ };
140
+ }
141
+ /** Set, remove, or set on every site — then every card reads again. */ export async function saveAiAllotments(user, body) {
142
+ try {
143
+ const response = await authorizedFetch(user, '/api/ai/allotments', {
144
+ method: 'POST',
145
+ headers: {
146
+ 'Content-Type': 'application/json'
147
+ },
148
+ body: JSON.stringify(body)
149
+ });
150
+ const payload = await response.json().catch(()=>null);
151
+ if (!response.ok) {
152
+ var _ref;
153
+ return {
154
+ ok: false,
155
+ error: (_ref = payload == null ? void 0 : payload.error) != null ? _ref : 'The allotment could not be saved — try again.'
156
+ };
157
+ }
158
+ reloadAllAiAllotments();
159
+ return {
160
+ ok: true,
161
+ error: null
162
+ };
163
+ } catch (unused) {
164
+ return {
165
+ ok: false,
166
+ error: 'The allotment could not be saved — check your connection and try again.'
167
+ };
168
+ }
169
+ }
170
+
171
+ //# sourceMappingURL=use-ai-allotments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/use-ai-allotments.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'use client'\n\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { AiAllotmentMode } from '../model/ai-allotments'\nimport type { AiAllotmentsWire } from '../usage/ai-usage-wire'\n\n/**\n * The AI allotments a card shows, through `/api/ai/allotments` (AGL-2942).\n *\n * Loading, answered, refused or failed — four states, for the reason\n * `use-org-ai-usage.ts` gives: the member page and the collaborators card are\n * open to people who may not read billing, and for them a 403 is the\n * ordinary answer, rendered as no card rather than a warning.\n *\n * One read per reader and question, shared by every mount that asks it — a\n * collaborators column mounts once per ROW — and every read is taken again\n * after a save, so the column, the site card and the Billing section agree\n * the moment one of them writes.\n */\n\nexport type AiAllotmentsStatus = 'loading' | 'ready' | 'refused' | 'error'\n\nexport interface AiAllotmentsState {\n status: AiAllotmentsStatus\n data: AiAllotmentsWire | null\n reload: () => void\n}\n\ninterface Read {\n status: AiAllotmentsStatus\n data: AiAllotmentsWire | null\n}\n\ninterface SharedRead {\n read: Read\n listeners: Set<(read: Read) => void>\n generation: number\n query: string\n user: Parameters<typeof authorizedFetch>[0]\n}\n\nconst LOADING: Read = { status: 'loading', data: null }\nconst sharedReads = new Map<string, SharedRead>()\n\n/** Forget every shared read; specs start each case from nothing. */\nexport function resetAiAllotmentReadsForTests(): void {\n sharedReads.clear()\n}\n\nfunction publish(entry: SharedRead, read: Read): void {\n entry.read = read\n for (const listener of entry.listeners) listener(read)\n}\n\nasync function readInto(entry: SharedRead): Promise<void> {\n entry.generation += 1\n const generation = entry.generation\n publish(entry, { status: 'loading', data: entry.read.data })\n try {\n const response = await authorizedFetch(entry.user, `/api/ai/allotments?${entry.query}`)\n if (generation !== entry.generation) return\n if (response.status === 403 || response.status === 404) {\n publish(entry, { status: 'refused', data: null })\n return\n }\n const payload = (await response.json().catch(() => null)) as AiAllotmentsWire | null\n if (generation !== entry.generation) return\n publish(\n entry,\n response.ok && payload ? { status: 'ready', data: payload } : { status: 'error', data: null },\n )\n } catch {\n if (generation === entry.generation) publish(entry, { status: 'error', data: null })\n }\n}\n\n/** Read every allotments question again — after a save. */\nexport function reloadAllAiAllotments(): void {\n for (const entry of sharedReads.values()) {\n if (entry.listeners.size) void readInto(entry)\n }\n}\n\nexport function useAiAllotments(input: {\n orgId?: string | null\n hostId?: string | null\n uid?: string | null\n enabled?: boolean\n}): AiAllotmentsState {\n const { data: user } = useUser()\n const signedInUid = user?.uid ?? null\n const userRef = useRef(user)\n userRef.current = user\n const orgId = input.orgId ?? ''\n const hostId = input.hostId ?? ''\n const subjectUid = input.uid ?? ''\n const enabled = input.enabled !== false && Boolean(orgId || hostId)\n const key =\n signedInUid && enabled ? [signedInUid, orgId, hostId, subjectUid].join('\\x00') : null\n const query = useMemo(() => {\n const params = new URLSearchParams()\n if (orgId) params.set('orgId', orgId)\n if (hostId) params.set('hostId', hostId)\n if (subjectUid) params.set('uid', subjectUid)\n return params.toString()\n }, [orgId, hostId, subjectUid])\n const [read, setRead] = useState<Read>(() => (key ? sharedReads.get(key)?.read : undefined) ?? LOADING)\n\n useEffect(() => {\n const signedIn = userRef.current\n if (!key || !signedIn) return undefined\n let entry = sharedReads.get(key)\n if (!entry) {\n entry = { read: LOADING, listeners: new Set(), generation: 0, query, user: signedIn }\n sharedReads.set(key, entry)\n }\n const shared = entry\n shared.user = signedIn\n const first = shared.listeners.size === 0\n shared.listeners.add(setRead)\n setRead(shared.read)\n if (first) void readInto(shared)\n return () => {\n shared.listeners.delete(setRead)\n }\n }, [key, query])\n\n const reload = useCallback(() => {\n const entry = key ? sharedReads.get(key) : undefined\n if (entry) void readInto(entry)\n }, [key])\n\n return { status: key ? read.status : 'loading', data: key ? read.data : null, reload }\n}\n\n/** One allotment a save sets. */\nexport interface AiAllotmentSetInput {\n subject: string\n credits: number | null\n mode: AiAllotmentMode\n models: string[] | null\n}\n\n/** Set, remove, or set on every site — then every card reads again. */\nexport async function saveAiAllotments(\n user: Parameters<typeof authorizedFetch>[0],\n body: {\n orgId: string\n set?: AiAllotmentSetInput[]\n remove?: string[]\n everySite?: Omit<AiAllotmentSetInput, 'subject'> | null\n },\n): Promise<{ ok: boolean; error: string | null }> {\n try {\n const response = await authorizedFetch(user, '/api/ai/allotments', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n const payload = (await response.json().catch(() => null)) as { error?: string } | null\n if (!response.ok) {\n return { ok: false, error: payload?.error ?? 'The allotment could not be saved — try again.' }\n }\n reloadAllAiAllotments()\n return { ok: true, error: null }\n } catch {\n return { ok: false, error: 'The allotment could not be saved — check your connection and try again.' }\n }\n}\n"],"names":["authorizedFetch","useUser","useCallback","useEffect","useMemo","useRef","useState","LOADING","status","data","sharedReads","Map","resetAiAllotmentReadsForTests","clear","publish","entry","read","listener","listeners","readInto","generation","response","user","query","payload","json","catch","ok","reloadAllAiAllotments","values","size","useAiAllotments","input","signedInUid","uid","userRef","current","orgId","hostId","subjectUid","enabled","Boolean","key","join","params","URLSearchParams","set","toString","setRead","get","undefined","signedIn","Set","shared","first","add","delete","reload","saveAiAllotments","body","method","headers","JSON","stringify","error"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { authorizedFetch } from '@aglyn/shared-util-http/authorized-token';
2
+ import { type AiCrmAnswerWanted, type AiCrmAnswerWire } from '../model/ai-crm';
3
+ import { type AiJobSummary } from '../model/ai-jobs.types';
4
+ /** How many recent jobs are read to find the last answer to a question. */
5
+ export declare const AI_CRM_RECENT_JOBS_READ = 20;
6
+ export declare const AI_CRM_LOAD_FAILED_COPY = "AI suggestions could not be loaded.";
7
+ export declare const AI_CRM_START_FAILED_COPY = "AI could not be started. Try again.";
8
+ export declare const AI_CRM_ANSWER_GONE_COPY = "This suggestion is no longer available. Ask again.";
9
+ export type AiCrmVerdict = 'checking' | 'ready' | 'hidden';
10
+ export interface AiCrmAnswerOptions {
11
+ orgId: string | undefined;
12
+ hostId: string | null;
13
+ /** The question a widget asks; `null` asks nothing and keeps the widget absent. */
14
+ wanted: AiCrmAnswerWanted | null;
15
+ /**
16
+ * Which earlier answer is shown when the widget mounts: the newest any
17
+ * member asked for (`any`, a record's summary), the newest this member did
18
+ * (`mine`), or none, for a question asked afresh each time.
19
+ */
20
+ recall: 'any' | 'mine' | 'none';
21
+ }
22
+ export interface AiCrmAnswerRun {
23
+ /** `hidden` when the jobs route says the feature is not this workspace's; the widget draws nothing. */
24
+ verdict: AiCrmVerdict;
25
+ job: AiJobSummary | null;
26
+ answer: AiCrmAnswerWire | null;
27
+ notice: string | null;
28
+ /** A request is on its way to the create door. */
29
+ busy: boolean;
30
+ /** The job asked is not settled yet. */
31
+ running: boolean;
32
+ /** Starts a `crm` job and settles it; the answer, or `null` when there is none to show. */
33
+ ask: (brief: string, inputs: Record<string, string>) => Promise<AiCrmAnswerWire | null>;
34
+ }
35
+ type User = Parameters<typeof authorizedFetch>[0];
36
+ /** A kept answer through its door; `null` when the door has none for this member. */
37
+ export declare function readAiCrmAnswer(user: User, jobId: string, orgId: string): Promise<AiCrmAnswerWire | null>;
38
+ /**
39
+ * One question to a `crm` job from a console widget (AGL-2917): whether the
40
+ * feature is this workspace's, the last answer to it, and asking again.
41
+ *
42
+ * The jobs route decides whether a widget is here at all, as every generative
43
+ * card's does: a 404 (the release flag) or a 403 (the plan) keeps it absent.
44
+ * A job names only its question, so an answer is read from the answer door,
45
+ * which serves it only to a member the CRM lets read the record. A job the
46
+ * create door left for the beat is followed through the events route until
47
+ * it settles.
48
+ */
49
+ export declare function useAiCrmAnswer(options: AiCrmAnswerOptions): AiCrmAnswerRun;
50
+ export {};
@@ -0,0 +1,220 @@
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
+ */ 'use client';
17
+ import { lockdownRefusalText, parseLockdownRefusal } from "@aglyn/aglyn";
18
+ import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
19
+ import { useUser } from "@aglyn/tenant-feature-instance";
20
+ import { useCallback, useEffect, useRef, useState } from "react";
21
+ import { aiCrmJobAnswers, readAiCrmProposal } from "../model/ai-crm.js";
22
+ import { AI_JOB_TERMINAL_STATUSES } from "../model/ai-jobs.types.js";
23
+ import { readEventFrames } from "./assist-jobs-drawer.component.js";
24
+ /** How many recent jobs are read to find the last answer to a question. */ export const AI_CRM_RECENT_JOBS_READ = 20;
25
+ export const AI_CRM_LOAD_FAILED_COPY = 'AI suggestions could not be loaded.';
26
+ export const AI_CRM_START_FAILED_COPY = 'AI could not be started. Try again.';
27
+ export const AI_CRM_ANSWER_GONE_COPY = 'This suggestion is no longer available. Ask again.';
28
+ const isTerminal = (job)=>AI_JOB_TERMINAL_STATUSES.includes(job.status);
29
+ /** A kept answer through its door; `null` when the door has none for this member. */ export async function readAiCrmAnswer(user, jobId, orgId) {
30
+ var _payload_answer_jobId, _payload_answer_createdBy;
31
+ var _payload_answer;
32
+ const response = await authorizedFetch(user, `/api/ai/crm/${encodeURIComponent(jobId)}?orgId=${encodeURIComponent(orgId)}`);
33
+ if (!response.ok) return null;
34
+ const payload = await response.json().catch(()=>null);
35
+ const proposal = readAiCrmProposal(payload == null ? void 0 : (_payload_answer = payload.answer) == null ? void 0 : _payload_answer['proposal']);
36
+ if (!(payload == null ? void 0 : payload.answer) || !proposal) return null;
37
+ return {
38
+ jobId: String((_payload_answer_jobId = payload.answer['jobId']) != null ? _payload_answer_jobId : jobId),
39
+ hostId: typeof payload.answer['hostId'] === 'string' ? payload.answer['hostId'] : null,
40
+ createdBy: String((_payload_answer_createdBy = payload.answer['createdBy']) != null ? _payload_answer_createdBy : ''),
41
+ proposal
42
+ };
43
+ }
44
+ /**
45
+ * One question to a `crm` job from a console widget (AGL-2917): whether the
46
+ * feature is this workspace's, the last answer to it, and asking again.
47
+ *
48
+ * The jobs route decides whether a widget is here at all, as every generative
49
+ * card's does: a 404 (the release flag) or a 403 (the plan) keeps it absent.
50
+ * A job names only its question, so an answer is read from the answer door,
51
+ * which serves it only to a member the CRM lets read the record. A job the
52
+ * create door left for the beat is followed through the events route until
53
+ * it settles.
54
+ */ export function useAiCrmAnswer(options) {
55
+ var _ref;
56
+ const { orgId, hostId, recall } = options;
57
+ const { data: user } = useUser();
58
+ // Held in a ref so the reads below key on WHO is signed in, never on the
59
+ // identity of the object that says so.
60
+ const userRef = useRef(user);
61
+ userRef.current = user;
62
+ const uid = (_ref = user == null ? void 0 : user.uid) != null ? _ref : null;
63
+ // By value, so a widget that builds its question each render asks once.
64
+ const wantedKey = options.wanted ? JSON.stringify(options.wanted) : null;
65
+ const [verdict, setVerdict] = useState('checking');
66
+ const [job, setJob] = useState(null);
67
+ const [answer, setAnswer] = useState(null);
68
+ const [notice, setNotice] = useState(null);
69
+ const [busy, setBusy] = useState(false);
70
+ const watchRef = useRef(null);
71
+ useEffect(()=>()=>{
72
+ var _watchRef_current;
73
+ return (_watchRef_current = watchRef.current) == null ? void 0 : _watchRef_current.abort();
74
+ }, []);
75
+ /** Follows a job until it settles, then reads its answer when it is done. */ const settle = useCallback(async (start, org)=>{
76
+ let current = start;
77
+ setJob(current);
78
+ if (!isTerminal(current)) {
79
+ var _watchRef_current;
80
+ (_watchRef_current = watchRef.current) == null ? void 0 : _watchRef_current.abort();
81
+ const controller = new AbortController();
82
+ watchRef.current = controller;
83
+ let again = true;
84
+ while(again && !controller.signal.aborted && !isTerminal(current)){
85
+ again = false;
86
+ try {
87
+ const response = await authorizedFetch(userRef.current, `/api/ai/jobs/${encodeURIComponent(current.id)}/events?orgId=${encodeURIComponent(org)}`, {
88
+ signal: controller.signal
89
+ });
90
+ if (!response.ok || !response.body) break;
91
+ await readEventFrames(response.body, (event)=>{
92
+ if (event['type'] === 'state') {
93
+ current = event['job'];
94
+ setJob(current);
95
+ } else if (event['type'] === 'reconnect') {
96
+ again = true;
97
+ }
98
+ });
99
+ } catch (unused) {
100
+ break;
101
+ }
102
+ }
103
+ }
104
+ if (current.status !== 'done') return null;
105
+ const kept = await readAiCrmAnswer(userRef.current, current.id, org).catch(()=>null);
106
+ setAnswer(kept);
107
+ if (!kept) setNotice(AI_CRM_ANSWER_GONE_COPY);
108
+ return kept;
109
+ }, []);
110
+ useEffect(()=>{
111
+ if (!orgId || !uid || !wantedKey) return;
112
+ let active = true;
113
+ setVerdict('checking');
114
+ setJob(null);
115
+ setAnswer(null);
116
+ setNotice(null);
117
+ void (async ()=>{
118
+ try {
119
+ var _ref;
120
+ const limit = recall === 'none' ? 1 : AI_CRM_RECENT_JOBS_READ;
121
+ const response = await authorizedFetch(userRef.current, `/api/ai/jobs?orgId=${encodeURIComponent(orgId)}&limit=${limit}`);
122
+ if (!active) return;
123
+ // The flag off (404) and the plan without generation (403): the
124
+ // feature is not this workspace's, so the widget is not here at all.
125
+ if (response.status === 404 || response.status === 403) {
126
+ setVerdict('hidden');
127
+ return;
128
+ }
129
+ const payload = await response.json().catch(()=>null);
130
+ if (!active) return;
131
+ if (!response.ok) {
132
+ var _ref1;
133
+ const locked = parseLockdownRefusal(response.status, payload);
134
+ setNotice(locked ? lockdownRefusalText(locked) : String((_ref1 = payload == null ? void 0 : payload.error) != null ? _ref1 : AI_CRM_LOAD_FAILED_COPY));
135
+ setVerdict('ready');
136
+ return;
137
+ }
138
+ setVerdict('ready');
139
+ if (recall === 'none') return;
140
+ const wanted = JSON.parse(wantedKey);
141
+ const found = ((_ref = payload == null ? void 0 : payload.jobs) != null ? _ref : []).find((entry)=>entry.hostId === hostId && (recall === 'any' || entry.createdBy === uid) && aiCrmJobAnswers(entry, wanted));
142
+ if (!found) return;
143
+ if (!isTerminal(found)) {
144
+ await settle(found, orgId);
145
+ return;
146
+ }
147
+ setJob(found);
148
+ if (found.status !== 'done') return;
149
+ const kept = await readAiCrmAnswer(userRef.current, found.id, orgId).catch(()=>null);
150
+ // An answer the door does not serve this member is simply not shown.
151
+ if (active) setAnswer(kept);
152
+ } catch (unused) {
153
+ if (!active) return;
154
+ setNotice(AI_CRM_LOAD_FAILED_COPY);
155
+ setVerdict('ready');
156
+ }
157
+ })();
158
+ return ()=>{
159
+ active = false;
160
+ };
161
+ }, [
162
+ orgId,
163
+ hostId,
164
+ uid,
165
+ wantedKey,
166
+ recall,
167
+ settle
168
+ ]);
169
+ const ask = useCallback(async (brief, inputs)=>{
170
+ if (!orgId) return null;
171
+ setBusy(true);
172
+ setNotice(null);
173
+ try {
174
+ const response = await authorizedFetch(userRef.current, '/api/ai/jobs', {
175
+ method: 'POST',
176
+ headers: {
177
+ 'Content-Type': 'application/json'
178
+ },
179
+ body: JSON.stringify({
180
+ orgId,
181
+ hostId,
182
+ kind: 'crm',
183
+ brief,
184
+ inputs
185
+ })
186
+ });
187
+ const payload = await response.json().catch(()=>null);
188
+ if (!response.ok) {
189
+ var _ref;
190
+ const locked = parseLockdownRefusal(response.status, payload);
191
+ setNotice(locked ? lockdownRefusalText(locked) : String((_ref = payload == null ? void 0 : payload.error) != null ? _ref : AI_CRM_START_FAILED_COPY));
192
+ return null;
193
+ }
194
+ const next = payload == null ? void 0 : payload.job;
195
+ if (!next) return null;
196
+ setAnswer(null);
197
+ return await settle(next, orgId);
198
+ } catch (unused) {
199
+ setNotice(AI_CRM_START_FAILED_COPY);
200
+ return null;
201
+ } finally{
202
+ setBusy(false);
203
+ }
204
+ }, [
205
+ orgId,
206
+ hostId,
207
+ settle
208
+ ]);
209
+ return {
210
+ verdict,
211
+ job,
212
+ answer,
213
+ notice,
214
+ busy,
215
+ running: Boolean(job && !isTerminal(job)),
216
+ ask
217
+ };
218
+ }
219
+
220
+ //# sourceMappingURL=use-ai-crm-answer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/use-ai-crm-answer.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'use client'\n\nimport { lockdownRefusalText, parseLockdownRefusal } from '@aglyn/aglyn'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport {\n aiCrmJobAnswers,\n readAiCrmProposal,\n type AiCrmAnswerWanted,\n type AiCrmAnswerWire,\n} from '../model/ai-crm'\nimport { AI_JOB_TERMINAL_STATUSES, type AiJobSummary } from '../model/ai-jobs.types'\nimport { readEventFrames } from './assist-jobs-drawer.component'\n\n/** How many recent jobs are read to find the last answer to a question. */\nexport const AI_CRM_RECENT_JOBS_READ = 20\n\nexport const AI_CRM_LOAD_FAILED_COPY = 'AI suggestions could not be loaded.'\nexport const AI_CRM_START_FAILED_COPY = 'AI could not be started. Try again.'\nexport const AI_CRM_ANSWER_GONE_COPY = 'This suggestion is no longer available. Ask again.'\n\nexport type AiCrmVerdict = 'checking' | 'ready' | 'hidden'\n\nexport interface AiCrmAnswerOptions {\n orgId: string | undefined\n hostId: string | null\n /** The question a widget asks; `null` asks nothing and keeps the widget absent. */\n wanted: AiCrmAnswerWanted | null\n /**\n * Which earlier answer is shown when the widget mounts: the newest any\n * member asked for (`any`, a record's summary), the newest this member did\n * (`mine`), or none, for a question asked afresh each time.\n */\n recall: 'any' | 'mine' | 'none'\n}\n\nexport interface AiCrmAnswerRun {\n /** `hidden` when the jobs route says the feature is not this workspace's; the widget draws nothing. */\n verdict: AiCrmVerdict\n job: AiJobSummary | null\n answer: AiCrmAnswerWire | null\n notice: string | null\n /** A request is on its way to the create door. */\n busy: boolean\n /** The job asked is not settled yet. */\n running: boolean\n /** Starts a `crm` job and settles it; the answer, or `null` when there is none to show. */\n ask: (brief: string, inputs: Record<string, string>) => Promise<AiCrmAnswerWire | null>\n}\n\ntype User = Parameters<typeof authorizedFetch>[0]\n\nconst isTerminal = (job: AiJobSummary) => AI_JOB_TERMINAL_STATUSES.includes(job.status)\n\n/** A kept answer through its door; `null` when the door has none for this member. */\nexport async function readAiCrmAnswer(user: User, jobId: string, orgId: string): Promise<AiCrmAnswerWire | null> {\n const response = await authorizedFetch(\n user,\n `/api/ai/crm/${encodeURIComponent(jobId)}?orgId=${encodeURIComponent(orgId)}`,\n )\n if (!response.ok) return null\n const payload = (await response.json().catch(() => null)) as { answer?: Record<string, unknown> } | null\n const proposal = readAiCrmProposal(payload?.answer?.['proposal'])\n if (!payload?.answer || !proposal) return null\n return {\n jobId: String(payload.answer['jobId'] ?? jobId),\n hostId: typeof payload.answer['hostId'] === 'string' ? payload.answer['hostId'] : null,\n createdBy: String(payload.answer['createdBy'] ?? ''),\n proposal,\n }\n}\n\n/**\n * One question to a `crm` job from a console widget (AGL-2917): whether the\n * feature is this workspace's, the last answer to it, and asking again.\n *\n * The jobs route decides whether a widget is here at all, as every generative\n * card's does: a 404 (the release flag) or a 403 (the plan) keeps it absent.\n * A job names only its question, so an answer is read from the answer door,\n * which serves it only to a member the CRM lets read the record. A job the\n * create door left for the beat is followed through the events route until\n * it settles.\n */\nexport function useAiCrmAnswer(options: AiCrmAnswerOptions): AiCrmAnswerRun {\n const { orgId, hostId, recall } = options\n const { data: user } = useUser()\n // Held in a ref so the reads below key on WHO is signed in, never on the\n // identity of the object that says so.\n const userRef = useRef(user)\n userRef.current = user\n const uid = user?.uid ?? null\n // By value, so a widget that builds its question each render asks once.\n const wantedKey = options.wanted ? JSON.stringify(options.wanted) : null\n\n const [verdict, setVerdict] = useState<AiCrmVerdict>('checking')\n const [job, setJob] = useState<AiJobSummary | null>(null)\n const [answer, setAnswer] = useState<AiCrmAnswerWire | null>(null)\n const [notice, setNotice] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const watchRef = useRef<AbortController | null>(null)\n\n useEffect(() => () => watchRef.current?.abort(), [])\n\n /** Follows a job until it settles, then reads its answer when it is done. */\n const settle = useCallback(async (start: AiJobSummary, org: string): Promise<AiCrmAnswerWire | null> => {\n let current = start\n setJob(current)\n if (!isTerminal(current)) {\n watchRef.current?.abort()\n const controller = new AbortController()\n watchRef.current = controller\n let again = true\n while (again && !controller.signal.aborted && !isTerminal(current)) {\n again = false\n try {\n const response = await authorizedFetch(\n userRef.current,\n `/api/ai/jobs/${encodeURIComponent(current.id)}/events?orgId=${encodeURIComponent(org)}`,\n { signal: controller.signal },\n )\n if (!response.ok || !response.body) break\n await readEventFrames(response.body, (event) => {\n if (event['type'] === 'state') {\n current = event['job'] as AiJobSummary\n setJob(current)\n } else if (event['type'] === 'reconnect') {\n again = true\n }\n })\n } catch {\n break\n }\n }\n }\n if (current.status !== 'done') return null\n const kept = await readAiCrmAnswer(userRef.current, current.id, org).catch(() => null)\n setAnswer(kept)\n if (!kept) setNotice(AI_CRM_ANSWER_GONE_COPY)\n return kept\n }, [])\n\n useEffect(() => {\n if (!orgId || !uid || !wantedKey) return\n let active = true\n setVerdict('checking')\n setJob(null)\n setAnswer(null)\n setNotice(null)\n void (async () => {\n try {\n const limit = recall === 'none' ? 1 : AI_CRM_RECENT_JOBS_READ\n const response = await authorizedFetch(\n userRef.current,\n `/api/ai/jobs?orgId=${encodeURIComponent(orgId)}&limit=${limit}`,\n )\n if (!active) return\n // The flag off (404) and the plan without generation (403): the\n // feature is not this workspace's, so the widget is not here at all.\n if (response.status === 404 || response.status === 403) {\n setVerdict('hidden')\n return\n }\n const payload = await response.json().catch(() => null)\n if (!active) return\n if (!response.ok) {\n const locked = parseLockdownRefusal(response.status, payload)\n setNotice(locked ? lockdownRefusalText(locked) : String(payload?.error ?? AI_CRM_LOAD_FAILED_COPY))\n setVerdict('ready')\n return\n }\n setVerdict('ready')\n if (recall === 'none') return\n const wanted = JSON.parse(wantedKey) as AiCrmAnswerWanted\n const found = ((payload?.jobs ?? []) as AiJobSummary[]).find(\n (entry) =>\n entry.hostId === hostId &&\n (recall === 'any' || entry.createdBy === uid) &&\n aiCrmJobAnswers(entry, wanted),\n )\n if (!found) return\n if (!isTerminal(found)) {\n await settle(found, orgId)\n return\n }\n setJob(found)\n if (found.status !== 'done') return\n const kept = await readAiCrmAnswer(userRef.current, found.id, orgId).catch(() => null)\n // An answer the door does not serve this member is simply not shown.\n if (active) setAnswer(kept)\n } catch {\n if (!active) return\n setNotice(AI_CRM_LOAD_FAILED_COPY)\n setVerdict('ready')\n }\n })()\n return () => {\n active = false\n }\n }, [orgId, hostId, uid, wantedKey, recall, settle])\n\n const ask = useCallback(\n async (brief: string, inputs: Record<string, string>): Promise<AiCrmAnswerWire | null> => {\n if (!orgId) return null\n setBusy(true)\n setNotice(null)\n try {\n const response = await authorizedFetch(userRef.current, '/api/ai/jobs', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ orgId, hostId, kind: 'crm', brief, inputs }),\n })\n const payload = await response.json().catch(() => null)\n if (!response.ok) {\n const locked = parseLockdownRefusal(response.status, payload)\n setNotice(locked ? lockdownRefusalText(locked) : String(payload?.error ?? AI_CRM_START_FAILED_COPY))\n return null\n }\n const next = payload?.job as AiJobSummary | undefined\n if (!next) return null\n setAnswer(null)\n return await settle(next, orgId)\n } catch {\n setNotice(AI_CRM_START_FAILED_COPY)\n return null\n } finally {\n setBusy(false)\n }\n },\n [orgId, hostId, settle],\n )\n\n return {\n verdict,\n job,\n answer,\n notice,\n busy,\n running: Boolean(job && !isTerminal(job)),\n ask,\n }\n}\n"],"names":["lockdownRefusalText","parseLockdownRefusal","authorizedFetch","useUser","useCallback","useEffect","useRef","useState","aiCrmJobAnswers","readAiCrmProposal","AI_JOB_TERMINAL_STATUSES","readEventFrames","AI_CRM_RECENT_JOBS_READ","AI_CRM_LOAD_FAILED_COPY","AI_CRM_START_FAILED_COPY","AI_CRM_ANSWER_GONE_COPY","isTerminal","job","includes","status","readAiCrmAnswer","user","jobId","orgId","payload","response","encodeURIComponent","ok","json","catch","proposal","answer","String","hostId","createdBy","useAiCrmAnswer","options","recall","data","userRef","current","uid","wantedKey","wanted","JSON","stringify","verdict","setVerdict","setJob","setAnswer","notice","setNotice","busy","setBusy","watchRef","abort","settle","start","org","controller","AbortController","again","signal","aborted","id","body","event","kept","active","limit","locked","error","parse","found","jobs","find","entry","ask","brief","inputs","method","headers","kind","next","running","Boolean"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { type MaybeTokenSource, type TokenSource } from '@aglyn/shared-util-http/authorized-token';
2
+ import { type AiJobKind, type AiJobSummary } from '../model/ai-jobs.types';
3
+ /**
4
+ * Starting one AI job from a console control, and following it until it
5
+ * settles (AGL-2919): the jobs route's create door, then its events door, the
6
+ * way the SEO card follows its jobs. A control that starts a job the beat
7
+ * runs shows its progress here and its result when it arrives; closing the
8
+ * control stops following, and the job carries on in AI jobs.
9
+ */
10
+ /** Whether the jobs route serves a workspace: still asking, yes, or no. */
11
+ export type AiJobsVerdict = 'checking' | 'ready' | 'hidden';
12
+ /** Forgets every answer, so the next control to mount asks the route again. */
13
+ export declare function forgetAiJobsVerdicts(): void;
14
+ /**
15
+ * Whether a control that starts a job should be drawn. The shell decided the
16
+ * plan and the member's permission before mounting it; the release flag is the
17
+ * route's to decide.
18
+ */
19
+ export declare function useAiJobsVerdict(user: (TokenSource & {
20
+ uid?: string | null;
21
+ }) | null | undefined, orgId: string | undefined): AiJobsVerdict;
22
+ /** What a control asks the create door for. */
23
+ export interface AiJobRequest {
24
+ orgId: string;
25
+ hostId: string;
26
+ kind: AiJobKind;
27
+ brief: string;
28
+ inputs: Record<string, string>;
29
+ }
30
+ /** Whether a job has stopped moving: finished, or waiting on something only a person can change. */
31
+ export declare function aiJobSettled(job: AiJobSummary | null): boolean;
32
+ /**
33
+ * Why a settled job has no result to show, in words a person can act on, or
34
+ * `null` for a job that finished.
35
+ */
36
+ export declare function aiJobProblem(job: AiJobSummary | null, failed: string): string | null;
37
+ export interface AiJobRun {
38
+ /** The job as it last arrived; `null` before one is started. */
39
+ job: AiJobSummary | null;
40
+ /** The create door is being asked. */
41
+ starting: boolean;
42
+ /** The job exists and has not settled. */
43
+ running: boolean;
44
+ /** Why the create door refused, or could not be reached. */
45
+ notice: string | null;
46
+ /** Starts the job, `true` once it exists, and follows it from there; `false` when the door refused. */
47
+ start: (request: AiJobRequest) => Promise<boolean>;
48
+ /** Stops following and forgets the job, for a control asked again. */
49
+ reset: () => void;
50
+ }
51
+ export declare function useAiJobRun(user: MaybeTokenSource, failed: string): AiJobRun;