@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,86 @@
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
+ */ // lockdown-423: exempt — server-internal cron (x-cron-secret) with no user
17
+ // caller and no org of its own; it asks the ai-generate switch, which
18
+ // composes the platform lock, before it claims a step.
19
+ import { writeCronBeat } from "@aglyn/aglyn/server";
20
+ import { firebaseAdmin, safeEqual } from "@aglyn/tenant-data-admin";
21
+ import { AI_JOBS_BEAT_CRON_ID, runAiJobsBeat } from "../jobs/ai-jobs-beat.js";
22
+ /**
23
+ * THE AI JOBS BEAT (AGL-3026): `POST /api/admin/ai-jobs-beat`.
24
+ *
25
+ * Cloud Scheduler calls it every minute through `consoleAiJobsBeat` in
26
+ * `cloud/functions`, carrying the console's `CRON_SECRET` as
27
+ * `x-cron-secret`: the same secret, headers and refusals as the console's
28
+ * other scheduled sweeps, so rotating the secret is still one act. It answers
29
+ * 405 to anything but a POST, 501 while the secret is unset, so an
30
+ * unconfigured deployment cannot be made to spend, and 401 for anything but
31
+ * the secret.
32
+ *
33
+ * The console app serves it from a route of its own at the same path, which
34
+ * gives a sweep the function time the slowest step needs; the plugin
35
+ * dispatcher's ceiling is a door's. See `AI_JOB_SWEEP_BUDGET_MS`.
36
+ *
37
+ * It answers 200 with what the beat did, a beat the switch held included:
38
+ * a lock is an operator's decision rather than a fault, and the caller logs
39
+ * every refusal it gets.
40
+ */ export async function POST(request) {
41
+ if (request.method !== 'POST') {
42
+ return Response.json({
43
+ error: 'Method not allowed'
44
+ }, {
45
+ status: 405
46
+ });
47
+ }
48
+ const secret = process.env.CRON_SECRET;
49
+ if (!secret) {
50
+ return Response.json({
51
+ error: 'The AI jobs beat is not configured (CRON_SECRET).'
52
+ }, {
53
+ status: 501
54
+ });
55
+ }
56
+ // Either spelling the console's scheduled routes accept (`cron-auth.ts`):
57
+ // the header an external scheduler sends, or a bearer.
58
+ if (!safeEqual(request.headers.get('x-cron-secret'), secret) && !safeEqual(request.headers.get('authorization'), `Bearer ${secret}`)) {
59
+ return Response.json({
60
+ error: 'Unauthenticated'
61
+ }, {
62
+ status: 401
63
+ });
64
+ }
65
+ // The mark `/api/health/crons` reads to notice this job going away
66
+ // (AGL-1955). Stamped on the invocation rather than on the work, and before
67
+ // the switch: a beat the switch holds is still a beat that fired, and an
68
+ // idle queue looks exactly like a dead schedule otherwise.
69
+ await writeCronBeat(firebaseAdmin.app().firestore(), AI_JOBS_BEAT_CRON_ID);
70
+ try {
71
+ return Response.json(await runAiJobsBeat(), {
72
+ status: 200
73
+ });
74
+ } catch (error) {
75
+ // A step's own failure is isolated inside the sweep; this is the queue
76
+ // read or the switch itself failing, and the next beat asks again.
77
+ console.error('ai jobs beat failed', error);
78
+ return Response.json({
79
+ error: 'The AI jobs beat failed'
80
+ }, {
81
+ status: 500
82
+ });
83
+ }
84
+ }
85
+
86
+ //# sourceMappingURL=ai-jobs-beat-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/server/ai-jobs-beat-route.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\n// lockdown-423: exempt — server-internal cron (x-cron-secret) with no user\n// caller and no org of its own; it asks the ai-generate switch, which\n// composes the platform lock, before it claims a step.\n\nimport { writeCronBeat } from '@aglyn/aglyn/server'\nimport { firebaseAdmin, safeEqual } from '@aglyn/tenant-data-admin'\nimport { AI_JOBS_BEAT_CRON_ID, runAiJobsBeat } from '../jobs/ai-jobs-beat'\n\n/**\n * THE AI JOBS BEAT (AGL-3026): `POST /api/admin/ai-jobs-beat`.\n *\n * Cloud Scheduler calls it every minute through `consoleAiJobsBeat` in\n * `cloud/functions`, carrying the console's `CRON_SECRET` as\n * `x-cron-secret`: the same secret, headers and refusals as the console's\n * other scheduled sweeps, so rotating the secret is still one act. It answers\n * 405 to anything but a POST, 501 while the secret is unset, so an\n * unconfigured deployment cannot be made to spend, and 401 for anything but\n * the secret.\n *\n * The console app serves it from a route of its own at the same path, which\n * gives a sweep the function time the slowest step needs; the plugin\n * dispatcher's ceiling is a door's. See `AI_JOB_SWEEP_BUDGET_MS`.\n *\n * It answers 200 with what the beat did, a beat the switch held included:\n * a lock is an operator's decision rather than a fault, and the caller logs\n * every refusal it gets.\n */\nexport async function POST(request: Request): Promise<Response> {\n if (request.method !== 'POST') {\n return Response.json({ error: 'Method not allowed' }, { status: 405 })\n }\n const secret = process.env.CRON_SECRET\n if (!secret) {\n return Response.json(\n { error: 'The AI jobs beat is not configured (CRON_SECRET).' },\n { status: 501 },\n )\n }\n // Either spelling the console's scheduled routes accept (`cron-auth.ts`):\n // the header an external scheduler sends, or a bearer.\n if (\n !safeEqual(request.headers.get('x-cron-secret'), secret) &&\n !safeEqual(request.headers.get('authorization'), `Bearer ${secret}`)\n ) {\n return Response.json({ error: 'Unauthenticated' }, { status: 401 })\n }\n // The mark `/api/health/crons` reads to notice this job going away\n // (AGL-1955). Stamped on the invocation rather than on the work, and before\n // the switch: a beat the switch holds is still a beat that fired, and an\n // idle queue looks exactly like a dead schedule otherwise.\n await writeCronBeat(firebaseAdmin.app().firestore(), AI_JOBS_BEAT_CRON_ID)\n try {\n return Response.json(await runAiJobsBeat(), { status: 200 })\n } catch (error) {\n // A step's own failure is isolated inside the sweep; this is the queue\n // read or the switch itself failing, and the next beat asks again.\n console.error('ai jobs beat failed', error)\n return Response.json({ error: 'The AI jobs beat failed' }, { status: 500 })\n }\n}\n"],"names":["writeCronBeat","firebaseAdmin","safeEqual","AI_JOBS_BEAT_CRON_ID","runAiJobsBeat","POST","request","method","Response","json","error","status","secret","process","env","CRON_SECRET","headers","get","app","firestore","console"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,2EAA2E;AAC3E,sEAAsE;AACtE,uDAAuD;AAEvD,SAASA,aAAa,QAAQ,sBAAqB;AACnD,SAASC,aAAa,EAAEC,SAAS,QAAQ,2BAA0B;AACnE,SAASC,oBAAoB,EAAEC,aAAa,QAAQ,0BAAsB;AAE1E;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,eAAeC,KAAKC,OAAgB;IACzC,IAAIA,QAAQC,MAAM,KAAK,QAAQ;QAC7B,OAAOC,SAASC,IAAI,CAAC;YAAEC,OAAO;QAAqB,GAAG;YAAEC,QAAQ;QAAI;IACtE;IACA,MAAMC,SAASC,QAAQC,GAAG,CAACC,WAAW;IACtC,IAAI,CAACH,QAAQ;QACX,OAAOJ,SAASC,IAAI,CAClB;YAAEC,OAAO;QAAoD,GAC7D;YAAEC,QAAQ;QAAI;IAElB;IACA,0EAA0E;IAC1E,uDAAuD;IACvD,IACE,CAACT,UAAUI,QAAQU,OAAO,CAACC,GAAG,CAAC,kBAAkBL,WACjD,CAACV,UAAUI,QAAQU,OAAO,CAACC,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAEL,QAAQ,GACnE;QACA,OAAOJ,SAASC,IAAI,CAAC;YAAEC,OAAO;QAAkB,GAAG;YAAEC,QAAQ;QAAI;IACnE;IACA,mEAAmE;IACnE,4EAA4E;IAC5E,yEAAyE;IACzE,2DAA2D;IAC3D,MAAMX,cAAcC,cAAciB,GAAG,GAAGC,SAAS,IAAIhB;IACrD,IAAI;QACF,OAAOK,SAASC,IAAI,CAAC,MAAML,iBAAiB;YAAEO,QAAQ;QAAI;IAC5D,EAAE,OAAOD,OAAO;QACd,uEAAuE;QACvE,mEAAmE;QACnEU,QAAQV,KAAK,CAAC,uBAAuBA;QACrC,OAAOF,SAASC,IAAI,CAAC;YAAEC,OAAO;QAA0B,GAAG;YAAEC,QAAQ;QAAI;IAC3E;AACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Cancel a job (AGL-2904). Idempotent: a job already terminal answers as
19
+ * it is, unchanged. A step in flight is not interrupted — the runner that
20
+ * holds its lease records what it cost and finds the job canceled when it
21
+ * goes to complete it — so a cancel is never a way to spend tokens the
22
+ * document does not show. Audited per cancel that changed something.
23
+ */
24
+ export declare function POST(request: Request, context: {
25
+ params: Promise<{
26
+ jobId: string;
27
+ }>;
28
+ }): Promise<Response>;
29
+ export declare const dynamic = "force-dynamic";
30
+ export declare const maxDuration = 60;
@@ -0,0 +1,74 @@
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
+ */ // lockdown-423: via libs/plugins/ai/src/lib/server/ai-jobs-gate.ts
17
+ import { aiJobSummary, cancelAiJob, getAiJob, writeAiJobAudit } from "../jobs/ai-jobs.js";
18
+ import { aiJobsGate } from "./ai-jobs-gate.js";
19
+ /**
20
+ * Cancel a job (AGL-2904). Idempotent: a job already terminal answers as
21
+ * it is, unchanged. A step in flight is not interrupted — the runner that
22
+ * holds its lease records what it cost and finds the job canceled when it
23
+ * goes to complete it — so a cancel is never a way to spend tokens the
24
+ * document does not show. Audited per cancel that changed something.
25
+ */ export async function POST(request, context) {
26
+ var _ref, _gate_decoded_email;
27
+ let payload;
28
+ try {
29
+ payload = await request.json();
30
+ } catch (unused) {
31
+ payload = null;
32
+ }
33
+ const gate = await aiJobsGate(request, String((_ref = payload == null ? void 0 : payload.orgId) != null ? _ref : ''));
34
+ if (gate instanceof Response) return gate;
35
+ const { jobId } = await context.params;
36
+ const existing = await getAiJob(gate.firestore, gate.orgId, jobId);
37
+ if (!existing) return Response.json({
38
+ error: 'Unknown job'
39
+ }, {
40
+ status: 404
41
+ });
42
+ const now = new Date();
43
+ // The machine writes the org feed's row with this actor when the cancel
44
+ // changed something; the staff audit row below is this route's own.
45
+ const { job, changed } = await cancelAiJob(gate.firestore, gate.orgId, jobId, now, {
46
+ uid: gate.uid,
47
+ email: (_gate_decoded_email = gate.decoded.email) != null ? _gate_decoded_email : null
48
+ });
49
+ if (changed) {
50
+ var _gate_decoded_email1;
51
+ await writeAiJobAudit(gate.firestore, {
52
+ action: 'ai.job.cancel',
53
+ actorUid: gate.uid,
54
+ actorEmail: (_gate_decoded_email1 = gate.decoded.email) != null ? _gate_decoded_email1 : null,
55
+ orgId: gate.orgId,
56
+ jobId,
57
+ after: {
58
+ status: 'canceled',
59
+ wasStatus: existing.status,
60
+ kind: existing.kind
61
+ }
62
+ });
63
+ }
64
+ return Response.json({
65
+ job: aiJobSummary(job, now),
66
+ changed
67
+ }, {
68
+ status: 200
69
+ });
70
+ }
71
+ export const dynamic = 'force-dynamic';
72
+ export const maxDuration = 60;
73
+
74
+ //# sourceMappingURL=ai-jobs-cancel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/server/ai-jobs-cancel.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\n// lockdown-423: via libs/plugins/ai/src/lib/server/ai-jobs-gate.ts\n\nimport {\n aiJobSummary,\n cancelAiJob,\n getAiJob,\n writeAiJobAudit,\n} from '../jobs/ai-jobs'\nimport { aiJobsGate } from './ai-jobs-gate'\n\n/**\n * Cancel a job (AGL-2904). Idempotent: a job already terminal answers as\n * it is, unchanged. A step in flight is not interrupted — the runner that\n * holds its lease records what it cost and finds the job canceled when it\n * goes to complete it — so a cancel is never a way to spend tokens the\n * document does not show. Audited per cancel that changed something.\n */\nexport async function POST(\n request: Request,\n context: { params: Promise<{ jobId: string }> },\n): Promise<Response> {\n let payload: Record<string, unknown> | null\n try {\n payload = (await request.json()) as Record<string, unknown>\n } catch {\n payload = null\n }\n const gate = await aiJobsGate(request, String(payload?.orgId ?? ''))\n if (gate instanceof Response) return gate\n const { jobId } = await context.params\n const existing = await getAiJob(gate.firestore, gate.orgId, jobId)\n if (!existing) return Response.json({ error: 'Unknown job' }, { status: 404 })\n const now = new Date()\n // The machine writes the org feed's row with this actor when the cancel\n // changed something; the staff audit row below is this route's own.\n const { job, changed } = await cancelAiJob(gate.firestore, gate.orgId, jobId, now, {\n uid: gate.uid,\n email: gate.decoded.email ?? null,\n })\n if (changed) {\n await writeAiJobAudit(gate.firestore, {\n action: 'ai.job.cancel',\n actorUid: gate.uid,\n actorEmail: gate.decoded.email ?? null,\n orgId: gate.orgId,\n jobId,\n after: { status: 'canceled', wasStatus: existing.status, kind: existing.kind },\n })\n }\n return Response.json({ job: aiJobSummary(job, now), changed }, { status: 200 })\n}\n\nexport const dynamic = 'force-dynamic'\nexport const maxDuration = 60\n"],"names":["aiJobSummary","cancelAiJob","getAiJob","writeAiJobAudit","aiJobsGate","POST","request","context","gate","payload","json","String","orgId","Response","jobId","params","existing","firestore","error","status","now","Date","job","changed","uid","email","decoded","action","actorUid","actorEmail","after","wasStatus","kind","dynamic","maxDuration"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,mEAAmE;AAEnE,SACEA,YAAY,EACZC,WAAW,EACXC,QAAQ,EACRC,eAAe,QACV,qBAAiB;AACxB,SAASC,UAAU,QAAQ,oBAAgB;AAE3C;;;;;;CAMC,GACD,OAAO,eAAeC,KACpBC,OAAgB,EAChBC,OAA+C;cAkBtCC;IAhBT,IAAIC;IACJ,IAAI;QACFA,UAAW,MAAMH,QAAQI,IAAI;IAC/B,EAAE,eAAM;QACND,UAAU;IACZ;IACA,MAAMD,OAAO,MAAMJ,WAAWE,SAASK,eAAOF,2BAAAA,QAASG,KAAK,mBAAI;IAChE,IAAIJ,gBAAgBK,UAAU,OAAOL;IACrC,MAAM,EAAEM,KAAK,EAAE,GAAG,MAAMP,QAAQQ,MAAM;IACtC,MAAMC,WAAW,MAAMd,SAASM,KAAKS,SAAS,EAAET,KAAKI,KAAK,EAAEE;IAC5D,IAAI,CAACE,UAAU,OAAOH,SAASH,IAAI,CAAC;QAAEQ,OAAO;IAAc,GAAG;QAAEC,QAAQ;IAAI;IAC5E,MAAMC,MAAM,IAAIC;IAChB,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,EAAEC,GAAG,EAAEC,OAAO,EAAE,GAAG,MAAMtB,YAAYO,KAAKS,SAAS,EAAET,KAAKI,KAAK,EAAEE,OAAOM,KAAK;QACjFI,KAAKhB,KAAKgB,GAAG;QACbC,KAAK,GAAEjB,sBAAAA,KAAKkB,OAAO,CAACD,KAAK,YAAlBjB,sBAAsB;IAC/B;IACA,IAAIe,SAAS;YAIGf;QAHd,MAAML,gBAAgBK,KAAKS,SAAS,EAAE;YACpCU,QAAQ;YACRC,UAAUpB,KAAKgB,GAAG;YAClBK,UAAU,GAAErB,uBAAAA,KAAKkB,OAAO,CAACD,KAAK,YAAlBjB,uBAAsB;YAClCI,OAAOJ,KAAKI,KAAK;YACjBE;YACAgB,OAAO;gBAAEX,QAAQ;gBAAYY,WAAWf,SAASG,MAAM;gBAAEa,MAAMhB,SAASgB,IAAI;YAAC;QAC/E;IACF;IACA,OAAOnB,SAASH,IAAI,CAAC;QAAEY,KAAKtB,aAAasB,KAAKF;QAAMG;IAAQ,GAAG;QAAEJ,QAAQ;IAAI;AAC/E;AAEA,OAAO,MAAMc,UAAU,gBAAe;AACtC,OAAO,MAAMC,cAAc,GAAE"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * One job's progress as server-sent events (AGL-2904): a `state` event
19
+ * now, a re-read every two seconds until the job is terminal, and a
20
+ * `reconnect` event at 55 s so no stream outlives the route's
21
+ * `maxDuration`. The read gate answers who may watch; the job id is only
22
+ * ever resolved under the org the request named, so a member of one
23
+ * workspace cannot watch another's job by guessing an id.
24
+ */
25
+ export declare function GET(request: Request, context: {
26
+ params: Promise<{
27
+ jobId: string;
28
+ }>;
29
+ }): Promise<Response>;
30
+ export declare const dynamic = "force-dynamic";
31
+ export declare const maxDuration = 60;
@@ -0,0 +1,51 @@
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
+ */ // lockdown-423: via libs/plugins/ai/src/lib/server/ai-jobs-gate.ts
17
+ import { aiJobSummary, getAiJob } from "../jobs/ai-jobs.js";
18
+ import { aiJobEventResponse, aiJobEventStream } from "./ai-jobs-events.js";
19
+ import { aiJobsGate } from "./ai-jobs-gate.js";
20
+ /**
21
+ * One job's progress as server-sent events (AGL-2904): a `state` event
22
+ * now, a re-read every two seconds until the job is terminal, and a
23
+ * `reconnect` event at 55 s so no stream outlives the route's
24
+ * `maxDuration`. The read gate answers who may watch; the job id is only
25
+ * ever resolved under the org the request named, so a member of one
26
+ * workspace cannot watch another's job by guessing an id.
27
+ */ export async function GET(request, context) {
28
+ var _url_searchParams_get;
29
+ const url = new URL(request.url);
30
+ const gate = await aiJobsGate(request, (_url_searchParams_get = url.searchParams.get('orgId')) != null ? _url_searchParams_get : '');
31
+ if (gate instanceof Response) return gate;
32
+ const { jobId } = await context.params;
33
+ const read = async ()=>{
34
+ const job = await getAiJob(gate.firestore, gate.orgId, jobId);
35
+ return job ? aiJobSummary(job) : null;
36
+ };
37
+ const initial = await read();
38
+ if (!initial) return Response.json({
39
+ error: 'Unknown job'
40
+ }, {
41
+ status: 404
42
+ });
43
+ return aiJobEventResponse(aiJobEventStream(initial, {
44
+ read,
45
+ signal: request.signal
46
+ }));
47
+ }
48
+ export const dynamic = 'force-dynamic';
49
+ export const maxDuration = 60;
50
+
51
+ //# sourceMappingURL=ai-jobs-events-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/server/ai-jobs-events-route.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\n// lockdown-423: via libs/plugins/ai/src/lib/server/ai-jobs-gate.ts\n\nimport {\n aiJobSummary,\n getAiJob,\n} from '../jobs/ai-jobs'\nimport { aiJobEventResponse, aiJobEventStream } from './ai-jobs-events'\nimport { aiJobsGate } from './ai-jobs-gate'\n\n/**\n * One job's progress as server-sent events (AGL-2904): a `state` event\n * now, a re-read every two seconds until the job is terminal, and a\n * `reconnect` event at 55 s so no stream outlives the route's\n * `maxDuration`. The read gate answers who may watch; the job id is only\n * ever resolved under the org the request named, so a member of one\n * workspace cannot watch another's job by guessing an id.\n */\nexport async function GET(\n request: Request,\n context: { params: Promise<{ jobId: string }> },\n): Promise<Response> {\n const url = new URL(request.url)\n const gate = await aiJobsGate(request, url.searchParams.get('orgId') ?? '')\n if (gate instanceof Response) return gate\n const { jobId } = await context.params\n const read = async () => {\n const job = await getAiJob(gate.firestore, gate.orgId, jobId)\n return job ? aiJobSummary(job) : null\n }\n const initial = await read()\n if (!initial) return Response.json({ error: 'Unknown job' }, { status: 404 })\n return aiJobEventResponse(\n aiJobEventStream(initial, { read, signal: request.signal }),\n )\n}\n\nexport const dynamic = 'force-dynamic'\nexport const maxDuration = 60\n"],"names":["aiJobSummary","getAiJob","aiJobEventResponse","aiJobEventStream","aiJobsGate","GET","request","context","url","URL","gate","searchParams","get","Response","jobId","params","read","job","firestore","orgId","initial","json","error","status","signal","dynamic","maxDuration"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,mEAAmE;AAEnE,SACEA,YAAY,EACZC,QAAQ,QACH,qBAAiB;AACxB,SAASC,kBAAkB,EAAEC,gBAAgB,QAAQ,sBAAkB;AACvE,SAASC,UAAU,QAAQ,oBAAgB;AAE3C;;;;;;;CAOC,GACD,OAAO,eAAeC,IACpBC,OAAgB,EAChBC,OAA+C;QAGRC;IADvC,MAAMA,MAAM,IAAIC,IAAIH,QAAQE,GAAG;IAC/B,MAAME,OAAO,MAAMN,WAAWE,UAASE,wBAAAA,IAAIG,YAAY,CAACC,GAAG,CAAC,oBAArBJ,wBAAiC;IACxE,IAAIE,gBAAgBG,UAAU,OAAOH;IACrC,MAAM,EAAEI,KAAK,EAAE,GAAG,MAAMP,QAAQQ,MAAM;IACtC,MAAMC,OAAO;QACX,MAAMC,MAAM,MAAMhB,SAASS,KAAKQ,SAAS,EAAER,KAAKS,KAAK,EAAEL;QACvD,OAAOG,MAAMjB,aAAaiB,OAAO;IACnC;IACA,MAAMG,UAAU,MAAMJ;IACtB,IAAI,CAACI,SAAS,OAAOP,SAASQ,IAAI,CAAC;QAAEC,OAAO;IAAc,GAAG;QAAEC,QAAQ;IAAI;IAC3E,OAAOrB,mBACLC,iBAAiBiB,SAAS;QAAEJ;QAAMQ,QAAQlB,QAAQkB,MAAM;IAAC;AAE7D;AAEA,OAAO,MAAMC,UAAU,gBAAe;AACtC,OAAO,MAAMC,cAAc,GAAE"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import type { AiJobSummary } from '../model/ai-jobs.types';
18
+ /**
19
+ * One job's progress as a server-sent event stream (AGL-2904).
20
+ *
21
+ * The console has no Firestore listener on `aiJobs` — the collection is
22
+ * client-readable, but the drawer reads through the route so the same
23
+ * membership, flag and entitlement rungs answer every read — so progress
24
+ * is a poll the SERVER runs on the client's behalf: one `state` event the
25
+ * moment the stream opens, then a re-read every `intervalMs` that emits
26
+ * only when the document moved, until the job is terminal or the stream
27
+ * has been open for `deadlineMs`. At the deadline a `reconnect` event
28
+ * tells the drawer to open a fresh stream, which keeps every stream inside
29
+ * the route's `maxDuration` rather than trusting the platform to cut it.
30
+ *
31
+ * The client hanging up ends the poll through `signal`, so a closed tab
32
+ * does not keep a function reading a document nobody is watching.
33
+ */
34
+ export declare const AI_JOB_EVENTS_INTERVAL_MS = 2000;
35
+ export declare const AI_JOB_EVENTS_DEADLINE_MS = 55000;
36
+ export type AiJobEvent = {
37
+ type: 'state';
38
+ job: AiJobSummary;
39
+ } | {
40
+ type: 'gone';
41
+ } | {
42
+ type: 'reconnect';
43
+ };
44
+ export interface AiJobEventStreamOptions {
45
+ /** The job as it is now, or `null` once it no longer exists. */
46
+ read: () => Promise<AiJobSummary | null>;
47
+ /** Ends the poll — the request's own signal in the route. */
48
+ signal?: AbortSignal;
49
+ now?: () => number;
50
+ sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
51
+ intervalMs?: number;
52
+ deadlineMs?: number;
53
+ }
54
+ export declare function aiJobEventStream(initial: AiJobSummary, options: AiJobEventStreamOptions): ReadableStream<Uint8Array>;
55
+ export declare function aiJobEventResponse(stream: ReadableStream<Uint8Array>): Response;
@@ -0,0 +1,144 @@
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
+ */ import { AI_JOB_TERMINAL_STATUSES } from "../model/ai-jobs.types.js";
17
+ /**
18
+ * One job's progress as a server-sent event stream (AGL-2904).
19
+ *
20
+ * The console has no Firestore listener on `aiJobs` — the collection is
21
+ * client-readable, but the drawer reads through the route so the same
22
+ * membership, flag and entitlement rungs answer every read — so progress
23
+ * is a poll the SERVER runs on the client's behalf: one `state` event the
24
+ * moment the stream opens, then a re-read every `intervalMs` that emits
25
+ * only when the document moved, until the job is terminal or the stream
26
+ * has been open for `deadlineMs`. At the deadline a `reconnect` event
27
+ * tells the drawer to open a fresh stream, which keeps every stream inside
28
+ * the route's `maxDuration` rather than trusting the platform to cut it.
29
+ *
30
+ * The client hanging up ends the poll through `signal`, so a closed tab
31
+ * does not keep a function reading a document nobody is watching.
32
+ */ export const AI_JOB_EVENTS_INTERVAL_MS = 2000;
33
+ export const AI_JOB_EVENTS_DEADLINE_MS = 55000;
34
+ function defaultSleep(ms, signal) {
35
+ return new Promise((resolve)=>{
36
+ if (signal == null ? void 0 : signal.aborted) {
37
+ resolve();
38
+ return;
39
+ }
40
+ const timer = setTimeout(()=>{
41
+ signal == null ? void 0 : signal.removeEventListener('abort', onAbort);
42
+ resolve();
43
+ }, ms);
44
+ function onAbort() {
45
+ clearTimeout(timer);
46
+ resolve();
47
+ }
48
+ signal == null ? void 0 : signal.addEventListener('abort', onAbort, {
49
+ once: true
50
+ });
51
+ });
52
+ }
53
+ /** Whether a re-read is worth an event: the status or the clock moved. */ function changed(previous, next) {
54
+ return previous.status !== next.status || previous.updatedAt !== next.updatedAt || previous.running !== next.running || previous.outputs.length !== next.outputs.length;
55
+ }
56
+ export function aiJobEventStream(initial, options) {
57
+ var _options_now, _options_sleep, _options_intervalMs, _options_deadlineMs;
58
+ const now = (_options_now = options.now) != null ? _options_now : Date.now;
59
+ const sleep = (_options_sleep = options.sleep) != null ? _options_sleep : defaultSleep;
60
+ const intervalMs = (_options_intervalMs = options.intervalMs) != null ? _options_intervalMs : AI_JOB_EVENTS_INTERVAL_MS;
61
+ const deadlineMs = (_options_deadlineMs = options.deadlineMs) != null ? _options_deadlineMs : AI_JOB_EVENTS_DEADLINE_MS;
62
+ const encoder = new TextEncoder();
63
+ let closed = false;
64
+ return new ReadableStream({
65
+ async start (controller) {
66
+ const emit = (event)=>{
67
+ if (closed) return;
68
+ controller.enqueue(encoder.encode(`data: ${JSON.stringify(event)}\n\n`));
69
+ };
70
+ const close = ()=>{
71
+ if (closed) return;
72
+ closed = true;
73
+ controller.close();
74
+ };
75
+ const openedAt = now();
76
+ let last = initial;
77
+ emit({
78
+ type: 'state',
79
+ job: initial
80
+ });
81
+ if (AI_JOB_TERMINAL_STATUSES.includes(initial.status)) {
82
+ close();
83
+ return;
84
+ }
85
+ for(;;){
86
+ var _options_signal;
87
+ await sleep(intervalMs, options.signal);
88
+ if (closed || ((_options_signal = options.signal) == null ? void 0 : _options_signal.aborted)) {
89
+ close();
90
+ return;
91
+ }
92
+ let next;
93
+ try {
94
+ next = await options.read();
95
+ } catch (error) {
96
+ // A transient read failure is not the job failing; the next
97
+ // interval asks again, and the deadline bounds how long for.
98
+ console.error('ai job events read failed', error);
99
+ next = last;
100
+ }
101
+ if (!next) {
102
+ emit({
103
+ type: 'gone'
104
+ });
105
+ close();
106
+ return;
107
+ }
108
+ if (changed(last, next)) {
109
+ emit({
110
+ type: 'state',
111
+ job: next
112
+ });
113
+ last = next;
114
+ }
115
+ if (AI_JOB_TERMINAL_STATUSES.includes(next.status)) {
116
+ close();
117
+ return;
118
+ }
119
+ if (now() - openedAt >= deadlineMs) {
120
+ emit({
121
+ type: 'reconnect'
122
+ });
123
+ close();
124
+ return;
125
+ }
126
+ }
127
+ },
128
+ cancel () {
129
+ closed = true;
130
+ }
131
+ });
132
+ }
133
+ export function aiJobEventResponse(stream) {
134
+ return new Response(stream, {
135
+ status: 200,
136
+ headers: {
137
+ 'Content-Type': 'text/event-stream',
138
+ 'Cache-Control': 'no-cache, no-transform',
139
+ Connection: 'keep-alive'
140
+ }
141
+ });
142
+ }
143
+
144
+ //# sourceMappingURL=ai-jobs-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/server/ai-jobs-events.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AI_JOB_TERMINAL_STATUSES } from '../model/ai-jobs.types'\nimport type { AiJobSummary } from '../model/ai-jobs.types'\n\n/**\n * One job's progress as a server-sent event stream (AGL-2904).\n *\n * The console has no Firestore listener on `aiJobs` — the collection is\n * client-readable, but the drawer reads through the route so the same\n * membership, flag and entitlement rungs answer every read — so progress\n * is a poll the SERVER runs on the client's behalf: one `state` event the\n * moment the stream opens, then a re-read every `intervalMs` that emits\n * only when the document moved, until the job is terminal or the stream\n * has been open for `deadlineMs`. At the deadline a `reconnect` event\n * tells the drawer to open a fresh stream, which keeps every stream inside\n * the route's `maxDuration` rather than trusting the platform to cut it.\n *\n * The client hanging up ends the poll through `signal`, so a closed tab\n * does not keep a function reading a document nobody is watching.\n */\nexport const AI_JOB_EVENTS_INTERVAL_MS = 2_000\nexport const AI_JOB_EVENTS_DEADLINE_MS = 55_000\n\nexport type AiJobEvent =\n | { type: 'state'; job: AiJobSummary }\n | { type: 'gone' }\n | { type: 'reconnect' }\n\nexport interface AiJobEventStreamOptions {\n /** The job as it is now, or `null` once it no longer exists. */\n read: () => Promise<AiJobSummary | null>\n /** Ends the poll — the request's own signal in the route. */\n signal?: AbortSignal\n now?: () => number\n sleep?: (ms: number, signal?: AbortSignal) => Promise<void>\n intervalMs?: number\n deadlineMs?: number\n}\n\nfunction defaultSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal?.aborted) {\n resolve()\n return\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n function onAbort() {\n clearTimeout(timer)\n resolve()\n }\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n\n/** Whether a re-read is worth an event: the status or the clock moved. */\nfunction changed(previous: AiJobSummary, next: AiJobSummary): boolean {\n return (\n previous.status !== next.status ||\n previous.updatedAt !== next.updatedAt ||\n previous.running !== next.running ||\n previous.outputs.length !== next.outputs.length\n )\n}\n\nexport function aiJobEventStream(\n initial: AiJobSummary,\n options: AiJobEventStreamOptions,\n): ReadableStream<Uint8Array> {\n const now = options.now ?? Date.now\n const sleep = options.sleep ?? defaultSleep\n const intervalMs = options.intervalMs ?? AI_JOB_EVENTS_INTERVAL_MS\n const deadlineMs = options.deadlineMs ?? AI_JOB_EVENTS_DEADLINE_MS\n const encoder = new TextEncoder()\n let closed = false\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const emit = (event: AiJobEvent) => {\n if (closed) return\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(event)}\\n\\n`))\n }\n const close = () => {\n if (closed) return\n closed = true\n controller.close()\n }\n const openedAt = now()\n let last = initial\n emit({ type: 'state', job: initial })\n if (AI_JOB_TERMINAL_STATUSES.includes(initial.status)) {\n close()\n return\n }\n for (;;) {\n await sleep(intervalMs, options.signal)\n if (closed || options.signal?.aborted) {\n close()\n return\n }\n let next: AiJobSummary | null\n try {\n next = await options.read()\n } catch (error) {\n // A transient read failure is not the job failing; the next\n // interval asks again, and the deadline bounds how long for.\n console.error('ai job events read failed', error)\n next = last\n }\n if (!next) {\n emit({ type: 'gone' })\n close()\n return\n }\n if (changed(last, next)) {\n emit({ type: 'state', job: next })\n last = next\n }\n if (AI_JOB_TERMINAL_STATUSES.includes(next.status)) {\n close()\n return\n }\n if (now() - openedAt >= deadlineMs) {\n emit({ type: 'reconnect' })\n close()\n return\n }\n }\n },\n cancel() {\n closed = true\n },\n })\n}\n\nexport function aiJobEventResponse(stream: ReadableStream<Uint8Array>): Response {\n return new Response(stream, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive',\n },\n })\n}\n"],"names":["AI_JOB_TERMINAL_STATUSES","AI_JOB_EVENTS_INTERVAL_MS","AI_JOB_EVENTS_DEADLINE_MS","defaultSleep","ms","signal","Promise","resolve","aborted","timer","setTimeout","removeEventListener","onAbort","clearTimeout","addEventListener","once","changed","previous","next","status","updatedAt","running","outputs","length","aiJobEventStream","initial","options","now","Date","sleep","intervalMs","deadlineMs","encoder","TextEncoder","closed","ReadableStream","start","controller","emit","event","enqueue","encode","JSON","stringify","close","openedAt","last","type","job","includes","read","error","console","cancel","aiJobEventResponse","stream","Response","headers","Connection"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,wBAAwB,QAAQ,4BAAwB;AAGjE;;;;;;;;;;;;;;;CAeC,GACD,OAAO,MAAMC,4BAA4B,KAAK;AAC9C,OAAO,MAAMC,4BAA4B,MAAM;AAkB/C,SAASC,aAAaC,EAAU,EAAEC,MAAoB;IACpD,OAAO,IAAIC,QAAQ,CAACC;QAClB,IAAIF,0BAAAA,OAAQG,OAAO,EAAE;YACnBD;YACA;QACF;QACA,MAAME,QAAQC,WAAW;YACvBL,0BAAAA,OAAQM,mBAAmB,CAAC,SAASC;YACrCL;QACF,GAAGH;QACH,SAASQ;YACPC,aAAaJ;YACbF;QACF;QACAF,0BAAAA,OAAQS,gBAAgB,CAAC,SAASF,SAAS;YAAEG,MAAM;QAAK;IAC1D;AACF;AAEA,wEAAwE,GACxE,SAASC,QAAQC,QAAsB,EAAEC,IAAkB;IACzD,OACED,SAASE,MAAM,KAAKD,KAAKC,MAAM,IAC/BF,SAASG,SAAS,KAAKF,KAAKE,SAAS,IACrCH,SAASI,OAAO,KAAKH,KAAKG,OAAO,IACjCJ,SAASK,OAAO,CAACC,MAAM,KAAKL,KAAKI,OAAO,CAACC,MAAM;AAEnD;AAEA,OAAO,SAASC,iBACdC,OAAqB,EACrBC,OAAgC;QAEpBA,cACEA,gBACKA,qBACAA;IAHnB,MAAMC,OAAMD,eAAAA,QAAQC,GAAG,YAAXD,eAAeE,KAAKD,GAAG;IACnC,MAAME,SAAQH,iBAAAA,QAAQG,KAAK,YAAbH,iBAAiBvB;IAC/B,MAAM2B,cAAaJ,sBAAAA,QAAQI,UAAU,YAAlBJ,sBAAsBzB;IACzC,MAAM8B,cAAaL,sBAAAA,QAAQK,UAAU,YAAlBL,sBAAsBxB;IACzC,MAAM8B,UAAU,IAAIC;IACpB,IAAIC,SAAS;IACb,OAAO,IAAIC,eAA2B;QACpC,MAAMC,OAAMC,UAAU;YACpB,MAAMC,OAAO,CAACC;gBACZ,IAAIL,QAAQ;gBACZG,WAAWG,OAAO,CAACR,QAAQS,MAAM,CAAC,CAAC,MAAM,EAAEC,KAAKC,SAAS,CAACJ,OAAO,IAAI,CAAC;YACxE;YACA,MAAMK,QAAQ;gBACZ,IAAIV,QAAQ;gBACZA,SAAS;gBACTG,WAAWO,KAAK;YAClB;YACA,MAAMC,WAAWlB;YACjB,IAAImB,OAAOrB;YACXa,KAAK;gBAAES,MAAM;gBAASC,KAAKvB;YAAQ;YACnC,IAAIzB,yBAAyBiD,QAAQ,CAACxB,QAAQN,MAAM,GAAG;gBACrDyB;gBACA;YACF;YACA,OAAS;oBAEOlB;gBADd,MAAMG,MAAMC,YAAYJ,QAAQrB,MAAM;gBACtC,IAAI6B,YAAUR,kBAAAA,QAAQrB,MAAM,qBAAdqB,gBAAgBlB,OAAO,GAAE;oBACrCoC;oBACA;gBACF;gBACA,IAAI1B;gBACJ,IAAI;oBACFA,OAAO,MAAMQ,QAAQwB,IAAI;gBAC3B,EAAE,OAAOC,OAAO;oBACd,4DAA4D;oBAC5D,6DAA6D;oBAC7DC,QAAQD,KAAK,CAAC,6BAA6BA;oBAC3CjC,OAAO4B;gBACT;gBACA,IAAI,CAAC5B,MAAM;oBACToB,KAAK;wBAAES,MAAM;oBAAO;oBACpBH;oBACA;gBACF;gBACA,IAAI5B,QAAQ8B,MAAM5B,OAAO;oBACvBoB,KAAK;wBAAES,MAAM;wBAASC,KAAK9B;oBAAK;oBAChC4B,OAAO5B;gBACT;gBACA,IAAIlB,yBAAyBiD,QAAQ,CAAC/B,KAAKC,MAAM,GAAG;oBAClDyB;oBACA;gBACF;gBACA,IAAIjB,QAAQkB,YAAYd,YAAY;oBAClCO,KAAK;wBAAES,MAAM;oBAAY;oBACzBH;oBACA;gBACF;YACF;QACF;QACAS;YACEnB,SAAS;QACX;IACF;AACF;AAEA,OAAO,SAASoB,mBAAmBC,MAAkC;IACnE,OAAO,IAAIC,SAASD,QAAQ;QAC1BpC,QAAQ;QACRsC,SAAS;YACP,gBAAgB;YAChB,iBAAiB;YACjBC,YAAY;QACd;IACF;AACF"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import type { DecodedIdToken } from 'firebase-admin/auth';
18
+ import type { AglynOrganization } from '@aglyn/aglyn/foundation/definitions/organization.types';
19
+ /**
20
+ * The gate the READ and CANCEL doors of AI jobs climb (AGL-2904).
21
+ *
22
+ * `aiGateLadder` is the ladder a door that SPENDS climbs: it is POST-only
23
+ * and ends by taking a reservation, because its whole purpose is to bound
24
+ * provider spend. Listing a workspace's jobs, watching one, or canceling
25
+ * one spends nothing and answers a GET, so those doors climb the same
26
+ * rungs up to the lockdown verdict and stop there — no rate window and no
27
+ * reservation. The rungs are in the ladder's order, for the ladder's
28
+ * reason: each one refused discloses nothing a lower rung would.
29
+ *
30
+ * 401 no bearer token, or a token the verifier refused
31
+ * 403 email unverified (an impersonation session is exempt)
32
+ * 400 the request did not NAME the org (AGL-1934)
33
+ * 403 the caller is not a member of that org
34
+ * 404 the release flag is off — a released-off feature does not exist;
35
+ * a verified staff claim previews through it
36
+ * 403 the org's plan lacks `aiGenerative`
37
+ * 423 lockdown: the scope verdict (platform/org/user)
38
+ */
39
+ export interface AiJobsGateContext {
40
+ uid: string;
41
+ decoded: DecodedIdToken;
42
+ staff: boolean;
43
+ orgId: string;
44
+ org: Partial<AglynOrganization>;
45
+ firestore: FirebaseFirestore.Firestore;
46
+ }
47
+ export declare function aiJobsGate(request: Request, rawOrgId: string): Promise<Response | AiJobsGateContext>;