@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,361 @@
1
+ import { _ as _await_async_generator } from "@swc/helpers/_/_await_async_generator";
2
+ import { _ as _extends } from "@swc/helpers/_/_extends";
3
+ import { _ as _wrap_async_generator } from "@swc/helpers/_/_wrap_async_generator";
4
+ /**
5
+ * @license
6
+ * Copyright 2026 Aglyn LLC
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */ import { aiCatalogEntry, aiModelIdsForProvider, estimateAiBilledUsd } from "./catalog.js";
20
+ import { AiUpstreamError, aiMessageText, aiRawOutputOf, aiStoppedAtCeiling, aiTokenCount, aiToolInputOf } from "./contract.js";
21
+ /**
22
+ * The OpenAI-compatible adapter (AGL-2939): `POST {base}/chat/completions`
23
+ * against whatever endpoint `AI_OPENAI_COMPAT_BASE_URL` names — a vendor,
24
+ * a gateway, a self-hosted model server — with the key in
25
+ * `AI_OPENAI_COMPAT_API_KEY`. The second adapter behind the contract, and
26
+ * the proof that the runtime, the gate, the jobs and the meter never
27
+ * depended on the first vendor's wire shape.
28
+ *
29
+ * What the mapping gives up, stated rather than hidden: the endpoint has
30
+ * no explicit cache breakpoints, so the ordered system blocks become one
31
+ * system message in order (the runtime's prefix rule still holds, so the
32
+ * order is cache-friendly for an endpoint that caches prefixes on its own),
33
+ * and `cacheReadTokens` is whatever `prompt_tokens_details.cached_tokens`
34
+ * reports. A `content_filter` finish is the endpoint's decline and becomes
35
+ * an `AiRefusal`, the way a refusal stop does on the other adapter.
36
+ */ export const OPENAI_COMPATIBLE_PROVIDER_ID = 'openai-compatible';
37
+ export const OPENAI_COMPAT_BASE_URL_ENV = 'AI_OPENAI_COMPAT_BASE_URL';
38
+ export const OPENAI_COMPAT_API_KEY_ENV = 'AI_OPENAI_COMPAT_API_KEY';
39
+ /** The configured base, with any trailing slash and `/chat/completions` stripped. */ export function openAiCompatibleBaseUrl() {
40
+ var _process_env_OPENAI_COMPAT_BASE_URL_ENV;
41
+ const raw = (_process_env_OPENAI_COMPAT_BASE_URL_ENV = process.env[OPENAI_COMPAT_BASE_URL_ENV]) == null ? void 0 : _process_env_OPENAI_COMPAT_BASE_URL_ENV.trim();
42
+ if (!raw) return null;
43
+ return raw.replace(/\/+$/, '').replace(/\/chat\/completions$/, '');
44
+ }
45
+ /** The host the endpoint is reached at, for the subprocessor inventory. */ export function openAiCompatibleHost() {
46
+ const base = openAiCompatibleBaseUrl();
47
+ if (!base) return '';
48
+ try {
49
+ return new URL(base).host;
50
+ } catch (unused) {
51
+ return '';
52
+ }
53
+ }
54
+ /**
55
+ * What the strict function shape this adapter sends compiles: every property
56
+ * of every object listed in `required`, so no optional parameter at all — an
57
+ * optional field is a union with `null` instead. No other bound is stated:
58
+ * the endpoint is whatever `AI_OPENAI_COMPAT_BASE_URL` names, and no one
59
+ * count of tools or unions — nor any grammar size — holds for every endpoint
60
+ * that speaks the shape. A bound nothing here has watched an endpoint hold to
61
+ * would be a guess, and a guess in a guard is worse than a gap in one.
62
+ */ export const OPENAI_COMPATIBLE_TOOL_SCHEMA_LIMITS = {
63
+ optionalParameters: 0
64
+ };
65
+ export function openAiCompatibleFailureIsRetryable(status) {
66
+ return status === 429 || status === 503 || status === 529;
67
+ }
68
+ /** The endpoint's `usage` object, in the meter's shape. Missing fields read 0. */ export function openAiCompatibleUsageFrom(usage) {
69
+ var _record_prompt_tokens_details;
70
+ const record = usage != null ? usage : {};
71
+ const details = (_record_prompt_tokens_details = record['prompt_tokens_details']) != null ? _record_prompt_tokens_details : {};
72
+ const prompt = aiTokenCount(record['prompt_tokens']);
73
+ const cached = Math.min(aiTokenCount(details['cached_tokens']), prompt);
74
+ return {
75
+ // The endpoint counts cached tokens inside `prompt_tokens`; the meter
76
+ // prices them apart, so they are split out here.
77
+ inputTokens: prompt - cached,
78
+ outputTokens: aiTokenCount(record['completion_tokens']),
79
+ cacheReadTokens: cached,
80
+ cacheWriteTokens: 0
81
+ };
82
+ }
83
+ /** The chat-completions body. Exported so a spec can assert the wire shape. */ export function buildOpenAiCompatibleRequestBody(input) {
84
+ var _input_tools;
85
+ const system = input.system.map((block)=>block.text).join('\n\n');
86
+ const tools = (_input_tools = input.tools) == null ? void 0 : _input_tools.map((tool)=>({
87
+ type: 'function',
88
+ function: {
89
+ name: tool.name,
90
+ description: tool.description,
91
+ parameters: _extends({}, tool.inputSchema, {
92
+ additionalProperties: false
93
+ }),
94
+ strict: true
95
+ }
96
+ }));
97
+ return _extends({
98
+ model: input.model,
99
+ max_tokens: input.maxTokens
100
+ }, input.stream ? {
101
+ stream: true,
102
+ stream_options: {
103
+ include_usage: true
104
+ }
105
+ } : {}, {
106
+ messages: [
107
+ ...system ? [
108
+ {
109
+ role: 'system',
110
+ content: system
111
+ }
112
+ ] : [],
113
+ ...input.messages.map((message)=>({
114
+ role: message.role,
115
+ content: openAiCompatibleContentOf(message)
116
+ }))
117
+ ]
118
+ }, (tools == null ? void 0 : tools.length) ? {
119
+ tools,
120
+ tool_choice: 'auto'
121
+ } : {});
122
+ }
123
+ /**
124
+ * A turn's content in the chat-completions shape: a string for a turn with
125
+ * nothing but text, and content parts for a user turn with pictures, each
126
+ * picture an `image_url` carrying its bytes as a `data:` URL, so the endpoint
127
+ * fetches nothing (AGL-2916). An assistant turn is always a string: the
128
+ * runtime admits no picture there, and not every endpoint takes parts on it.
129
+ */ function openAiCompatibleContentOf(message) {
130
+ if (typeof message.content === 'string') return message.content;
131
+ if (message.role === 'assistant') return aiMessageText(message);
132
+ return message.content.map((part)=>part.type === 'image' ? {
133
+ type: 'image_url',
134
+ image_url: {
135
+ url: `data:${part.mediaType};base64,${part.data}`
136
+ }
137
+ } : {
138
+ type: 'text',
139
+ text: part.text
140
+ });
141
+ }
142
+ function requestIdOf(response) {
143
+ var _ref;
144
+ var _response_headers_get, _response_headers;
145
+ return (_ref = (_response_headers = response.headers) == null ? void 0 : (_response_headers_get = _response_headers.get) == null ? void 0 : _response_headers_get.call(_response_headers, 'x-request-id')) != null ? _ref : null;
146
+ }
147
+ async function send(input, stream) {
148
+ const base = openAiCompatibleBaseUrl();
149
+ if (!base) {
150
+ // Every door gates on the provider being configured before it gets
151
+ // here, so this is a wiring fault rather than a customer path.
152
+ throw new Error(`${OPENAI_COMPAT_BASE_URL_ENV} is not set`);
153
+ }
154
+ const body = buildOpenAiCompatibleRequestBody(_extends({}, input, {
155
+ stream
156
+ }));
157
+ const response = await fetch(`${base}/chat/completions`, _extends({
158
+ method: 'POST',
159
+ headers: {
160
+ Authorization: `Bearer ${input.apiKey}`,
161
+ 'Content-Type': 'application/json'
162
+ },
163
+ body: JSON.stringify(body)
164
+ }, input.signal ? {
165
+ signal: input.signal
166
+ } : {}));
167
+ if (!response.ok || stream && !response.body) {
168
+ var _ref;
169
+ const requestId = requestIdOf(response);
170
+ const payload = await response.json().catch(()=>null);
171
+ console.error('ai upstream error', {
172
+ provider: OPENAI_COMPATIBLE_PROVIDER_ID,
173
+ status: response.status,
174
+ requestId,
175
+ model: input.model,
176
+ error: (_ref = payload == null ? void 0 : payload.error) != null ? _ref : null
177
+ });
178
+ throw new AiUpstreamError(response.status, openAiCompatibleFailureIsRetryable(response.status), requestId);
179
+ }
180
+ return response;
181
+ }
182
+ /** `finish_reason` → the contract's stop reason; a filter is a refusal. */ function stopReasonOf(finish) {
183
+ if (typeof finish !== 'string' || !finish) return null;
184
+ if (finish === 'content_filter') return 'refusal';
185
+ if (finish === 'stop') return 'end_turn';
186
+ if (finish === 'length') return 'max_tokens';
187
+ if (finish === 'tool_calls') return 'tool_use';
188
+ return finish;
189
+ }
190
+ async function complete(input) {
191
+ var _ref;
192
+ var _payload_choices, _choice_message, _choice_message1;
193
+ const response = await send(input, false);
194
+ const payload = await response.json();
195
+ const choice = payload == null ? void 0 : (_payload_choices = payload.choices) == null ? void 0 : _payload_choices[0];
196
+ const text = typeof (choice == null ? void 0 : (_choice_message = choice.message) == null ? void 0 : _choice_message.content) === 'string' ? choice.message.content : '';
197
+ const toolUse = ((_ref = choice == null ? void 0 : (_choice_message1 = choice.message) == null ? void 0 : _choice_message1.tool_calls) != null ? _ref : []).map((call)=>{
198
+ var _ref;
199
+ var _call_function, _call_function1;
200
+ return {
201
+ name: String((_ref = call == null ? void 0 : (_call_function = call.function) == null ? void 0 : _call_function.name) != null ? _ref : ''),
202
+ input: aiToolInputOf(call == null ? void 0 : (_call_function1 = call.function) == null ? void 0 : _call_function1.arguments)
203
+ };
204
+ });
205
+ const usage = openAiCompatibleUsageFrom(payload == null ? void 0 : payload.usage);
206
+ const estCostUsd = estimateAiBilledUsd(usage, input.model);
207
+ const stopReason = stopReasonOf(choice == null ? void 0 : choice.finish_reason);
208
+ if (stopReason === 'refusal') {
209
+ return {
210
+ kind: 'refusal',
211
+ text,
212
+ usage,
213
+ estCostUsd,
214
+ stopReason
215
+ };
216
+ }
217
+ return _extends({
218
+ kind: 'completion',
219
+ text,
220
+ toolUse,
221
+ usage,
222
+ estCostUsd,
223
+ stopReason
224
+ }, aiStoppedAtCeiling(stopReason) ? {
225
+ rawOutput: aiRawOutputOf(choice == null ? void 0 : choice.message)
226
+ } : {});
227
+ }
228
+ async function stream(input) {
229
+ const response = await send(input, true);
230
+ return streamEvents(response.body, input.model, requestIdOf(response));
231
+ }
232
+ /**
233
+ * The endpoint's SSE stream as contract events: `choices[0].delta.content`
234
+ * is text; `delta.tool_calls[i].function.arguments` arrive in pieces and
235
+ * are parsed once at the end of the stream; the final chunk carries
236
+ * `usage` when `stream_options.include_usage` was sent, and `[DONE]` ends
237
+ * the body.
238
+ */ function streamEvents(body, model, requestId) {
239
+ return _wrap_async_generator(function*() {
240
+ const decoder = new TextDecoder();
241
+ const reader = body.getReader();
242
+ let usage = {
243
+ inputTokens: 0,
244
+ outputTokens: 0,
245
+ cacheReadTokens: 0,
246
+ cacheWriteTokens: 0
247
+ };
248
+ let stopReason = null;
249
+ const tools = new Map();
250
+ let buffer = '';
251
+ let drained = false;
252
+ try {
253
+ for(;;){
254
+ var _lines_pop;
255
+ const { done, value } = yield _await_async_generator(reader.read());
256
+ if (done) {
257
+ drained = true;
258
+ break;
259
+ }
260
+ buffer += decoder.decode(value, {
261
+ stream: true
262
+ });
263
+ const lines = buffer.split('\n');
264
+ buffer = (_lines_pop = lines.pop()) != null ? _lines_pop : '';
265
+ for (const line of lines){
266
+ var _ref;
267
+ var _event_choices;
268
+ if (!line.startsWith('data: ')) continue;
269
+ const data = line.slice('data: '.length).trim();
270
+ if (data === '[DONE]') continue;
271
+ let event;
272
+ try {
273
+ event = JSON.parse(data);
274
+ } catch (unused) {
275
+ continue;
276
+ }
277
+ if (event['error']) {
278
+ const error = event['error'];
279
+ console.error('ai upstream stream error', {
280
+ provider: OPENAI_COMPATIBLE_PROVIDER_ID,
281
+ requestId,
282
+ model,
283
+ error
284
+ });
285
+ yield {
286
+ type: 'error',
287
+ retryable: openAiCompatibleFailureIsRetryable(typeof error.code === 'number' ? error.code : null)
288
+ };
289
+ continue;
290
+ }
291
+ if (event['usage']) usage = openAiCompatibleUsageFrom(event['usage']);
292
+ const choice = (_event_choices = event['choices']) == null ? void 0 : _event_choices[0];
293
+ if (!choice) continue;
294
+ const delta = choice['delta'];
295
+ if (typeof (delta == null ? void 0 : delta.content) === 'string' && delta.content) {
296
+ yield {
297
+ type: 'delta',
298
+ text: delta.content
299
+ };
300
+ }
301
+ for (const call of (_ref = delta == null ? void 0 : delta.tool_calls) != null ? _ref : []){
302
+ var _call_index, _call_function, _tools_get;
303
+ const index = Number((_call_index = call['index']) != null ? _call_index : 0);
304
+ const fn = (_call_function = call['function']) != null ? _call_function : {};
305
+ const inFlight = (_tools_get = tools.get(index)) != null ? _tools_get : {
306
+ name: '',
307
+ json: ''
308
+ };
309
+ if (typeof fn.name === 'string' && fn.name) inFlight.name = fn.name;
310
+ if (typeof fn.arguments === 'string') inFlight.json += fn.arguments;
311
+ tools.set(index, inFlight);
312
+ }
313
+ const finish = stopReasonOf(choice['finish_reason']);
314
+ if (finish) stopReason = finish;
315
+ }
316
+ }
317
+ } finally{
318
+ if (!drained) yield _await_async_generator(reader.cancel().catch(()=>undefined));
319
+ reader.releaseLock();
320
+ }
321
+ const called = [
322
+ ...tools.entries()
323
+ ].sort((a, b)=>a[0] - b[0]).map(([, tool])=>tool);
324
+ for (const tool of called){
325
+ yield {
326
+ type: 'tool',
327
+ name: tool.name,
328
+ input: aiToolInputOf(tool.json)
329
+ };
330
+ }
331
+ yield _extends({
332
+ type: 'done',
333
+ usage,
334
+ estCostUsd: estimateAiBilledUsd(usage, model),
335
+ stopReason
336
+ }, aiStoppedAtCeiling(stopReason) ? {
337
+ rawOutput: aiRawOutputOf(called.map((tool)=>tool.json).join(''))
338
+ } : {});
339
+ })();
340
+ }
341
+ export const openAiCompatibleProvider = {
342
+ id: OPENAI_COMPATIBLE_PROVIDER_ID,
343
+ label: 'OpenAI-compatible endpoint',
344
+ apiKeyEnv: OPENAI_COMPAT_API_KEY_ENV,
345
+ // Ready only with both halves: a key with no endpoint has nowhere to go.
346
+ readApiKey: ()=>{
347
+ var _process_env_AI_OPENAI_COMPAT_API_KEY;
348
+ return openAiCompatibleBaseUrl() ? ((_process_env_AI_OPENAI_COMPAT_API_KEY = process.env.AI_OPENAI_COMPAT_API_KEY) == null ? void 0 : _process_env_AI_OPENAI_COMPAT_API_KEY.trim()) || undefined : undefined;
349
+ },
350
+ get endpointHost () {
351
+ return openAiCompatibleHost();
352
+ },
353
+ toolSchemaLimits: OPENAI_COMPATIBLE_TOOL_SCHEMA_LIMITS,
354
+ models () {
355
+ return aiModelIdsForProvider(OPENAI_COMPATIBLE_PROVIDER_ID).map((id)=>aiCatalogEntry(id)).filter((entry)=>Boolean(entry));
356
+ },
357
+ complete,
358
+ stream
359
+ };
360
+
361
+ //# sourceMappingURL=openai-compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/providers/openai-compatible.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 { aiCatalogEntry, aiModelIdsForProvider, estimateAiBilledUsd } from './catalog'\nimport {\n AiUpstreamError,\n aiMessageText,\n aiRawOutputOf,\n aiStoppedAtCeiling,\n aiTokenCount,\n aiToolInputOf,\n type AiMessage,\n type AiModelDescriptor,\n type AiProvider,\n type AiProviderRequest,\n type AiResult,\n type AiStreamEvent,\n type AiToolSchemaLimits,\n type AiToolUse,\n type AiUsage,\n} from './contract'\n\n/**\n * The OpenAI-compatible adapter (AGL-2939): `POST {base}/chat/completions`\n * against whatever endpoint `AI_OPENAI_COMPAT_BASE_URL` names — a vendor,\n * a gateway, a self-hosted model server — with the key in\n * `AI_OPENAI_COMPAT_API_KEY`. The second adapter behind the contract, and\n * the proof that the runtime, the gate, the jobs and the meter never\n * depended on the first vendor's wire shape.\n *\n * What the mapping gives up, stated rather than hidden: the endpoint has\n * no explicit cache breakpoints, so the ordered system blocks become one\n * system message in order (the runtime's prefix rule still holds, so the\n * order is cache-friendly for an endpoint that caches prefixes on its own),\n * and `cacheReadTokens` is whatever `prompt_tokens_details.cached_tokens`\n * reports. A `content_filter` finish is the endpoint's decline and becomes\n * an `AiRefusal`, the way a refusal stop does on the other adapter.\n */\n\nexport const OPENAI_COMPATIBLE_PROVIDER_ID = 'openai-compatible'\nexport const OPENAI_COMPAT_BASE_URL_ENV = 'AI_OPENAI_COMPAT_BASE_URL'\nexport const OPENAI_COMPAT_API_KEY_ENV = 'AI_OPENAI_COMPAT_API_KEY'\n\n/** The configured base, with any trailing slash and `/chat/completions` stripped. */\nexport function openAiCompatibleBaseUrl(): string | null {\n const raw = process.env[OPENAI_COMPAT_BASE_URL_ENV]?.trim()\n if (!raw) return null\n return raw.replace(/\\/+$/, '').replace(/\\/chat\\/completions$/, '')\n}\n\n/** The host the endpoint is reached at, for the subprocessor inventory. */\nexport function openAiCompatibleHost(): string {\n const base = openAiCompatibleBaseUrl()\n if (!base) return ''\n try {\n return new URL(base).host\n } catch {\n return ''\n }\n}\n\n/**\n * What the strict function shape this adapter sends compiles: every property\n * of every object listed in `required`, so no optional parameter at all — an\n * optional field is a union with `null` instead. No other bound is stated:\n * the endpoint is whatever `AI_OPENAI_COMPAT_BASE_URL` names, and no one\n * count of tools or unions — nor any grammar size — holds for every endpoint\n * that speaks the shape. A bound nothing here has watched an endpoint hold to\n * would be a guess, and a guess in a guard is worse than a gap in one.\n */\nexport const OPENAI_COMPATIBLE_TOOL_SCHEMA_LIMITS: AiToolSchemaLimits = {\n optionalParameters: 0,\n}\n\nexport function openAiCompatibleFailureIsRetryable(status: number | null): boolean {\n return status === 429 || status === 503 || status === 529\n}\n\n/** The endpoint's `usage` object, in the meter's shape. Missing fields read 0. */\nexport function openAiCompatibleUsageFrom(usage: unknown): AiUsage {\n const record = (usage ?? {}) as Record<string, unknown>\n const details = (record['prompt_tokens_details'] ?? {}) as Record<string, unknown>\n const prompt = aiTokenCount(record['prompt_tokens'])\n const cached = Math.min(aiTokenCount(details['cached_tokens']), prompt)\n return {\n // The endpoint counts cached tokens inside `prompt_tokens`; the meter\n // prices them apart, so they are split out here.\n inputTokens: prompt - cached,\n outputTokens: aiTokenCount(record['completion_tokens']),\n cacheReadTokens: cached,\n cacheWriteTokens: 0,\n }\n}\n\n/** The chat-completions body. Exported so a spec can assert the wire shape. */\nexport function buildOpenAiCompatibleRequestBody(\n input: Omit<AiProviderRequest, 'apiKey' | 'signal'> & { stream: boolean },\n): Record<string, unknown> {\n const system = input.system.map((block) => block.text).join('\\n\\n')\n const tools = input.tools?.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: { ...tool.inputSchema, additionalProperties: false },\n strict: true,\n },\n }))\n return {\n model: input.model,\n max_tokens: input.maxTokens,\n ...(input.stream ? { stream: true, stream_options: { include_usage: true } } : {}),\n messages: [\n ...(system ? [{ role: 'system', content: system }] : []),\n ...input.messages.map((message) => ({\n role: message.role,\n content: openAiCompatibleContentOf(message),\n })),\n ],\n ...(tools?.length ? { tools, tool_choice: 'auto' } : {}),\n }\n}\n\n/**\n * A turn's content in the chat-completions shape: a string for a turn with\n * nothing but text, and content parts for a user turn with pictures, each\n * picture an `image_url` carrying its bytes as a `data:` URL, so the endpoint\n * fetches nothing (AGL-2916). An assistant turn is always a string: the\n * runtime admits no picture there, and not every endpoint takes parts on it.\n */\nfunction openAiCompatibleContentOf(message: AiMessage): string | Array<Record<string, unknown>> {\n if (typeof message.content === 'string') return message.content\n if (message.role === 'assistant') return aiMessageText(message)\n return message.content.map((part) =>\n part.type === 'image'\n ? { type: 'image_url', image_url: { url: `data:${part.mediaType};base64,${part.data}` } }\n : { type: 'text', text: part.text },\n )\n}\n\nfunction requestIdOf(response: Response): string | null {\n return response.headers?.get?.('x-request-id') ?? null\n}\n\nasync function send(input: AiProviderRequest, stream: boolean): Promise<Response> {\n const base = openAiCompatibleBaseUrl()\n if (!base) {\n // Every door gates on the provider being configured before it gets\n // here, so this is a wiring fault rather than a customer path.\n throw new Error(`${OPENAI_COMPAT_BASE_URL_ENV} is not set`)\n }\n const body = buildOpenAiCompatibleRequestBody({ ...input, stream })\n const response = await fetch(`${base}/chat/completions`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${input.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n ...(input.signal ? { signal: input.signal } : {}),\n })\n if (!response.ok || (stream && !response.body)) {\n const requestId = requestIdOf(response)\n const payload = (await response.json().catch(() => null)) as {\n error?: { type?: string; message?: string; code?: string }\n } | null\n console.error('ai upstream error', {\n provider: OPENAI_COMPATIBLE_PROVIDER_ID,\n status: response.status,\n requestId,\n model: input.model,\n error: payload?.error ?? null,\n })\n throw new AiUpstreamError(\n response.status,\n openAiCompatibleFailureIsRetryable(response.status),\n requestId,\n )\n }\n return response\n}\n\n/** `finish_reason` → the contract's stop reason; a filter is a refusal. */\nfunction stopReasonOf(finish: unknown): string | null {\n if (typeof finish !== 'string' || !finish) return null\n if (finish === 'content_filter') return 'refusal'\n if (finish === 'stop') return 'end_turn'\n if (finish === 'length') return 'max_tokens'\n if (finish === 'tool_calls') return 'tool_use'\n return finish\n}\n\nasync function complete(input: AiProviderRequest): Promise<AiResult> {\n const response = await send(input, false)\n const payload = (await response.json()) as {\n choices?: Array<{\n message?: {\n content?: unknown\n tool_calls?: Array<{ function?: { name?: unknown; arguments?: unknown } }>\n }\n finish_reason?: unknown\n }>\n usage?: unknown\n }\n const choice = payload?.choices?.[0]\n const text = typeof choice?.message?.content === 'string' ? choice.message.content : ''\n const toolUse: AiToolUse[] = (choice?.message?.tool_calls ?? []).map((call) => ({\n name: String(call?.function?.name ?? ''),\n input: aiToolInputOf(call?.function?.arguments),\n }))\n const usage = openAiCompatibleUsageFrom(payload?.usage)\n const estCostUsd = estimateAiBilledUsd(usage, input.model)\n const stopReason = stopReasonOf(choice?.finish_reason)\n if (stopReason === 'refusal') {\n return { kind: 'refusal', text, usage, estCostUsd, stopReason }\n }\n return {\n kind: 'completion',\n text,\n toolUse,\n usage,\n estCostUsd,\n stopReason,\n // The message as the endpoint answered it, for a call its ceiling cut off\n // (AGL-3143). A tool call's `arguments` is raw JSON text here, and this\n // is the only place the bytes it was cut in survive the parse.\n ...(aiStoppedAtCeiling(stopReason) ? { rawOutput: aiRawOutputOf(choice?.message) } : {}),\n }\n}\n\nasync function stream(input: AiProviderRequest): Promise<AsyncIterable<AiStreamEvent>> {\n const response = await send(input, true)\n return streamEvents(\n response.body as ReadableStream<Uint8Array>,\n input.model,\n requestIdOf(response),\n )\n}\n\n/**\n * The endpoint's SSE stream as contract events: `choices[0].delta.content`\n * is text; `delta.tool_calls[i].function.arguments` arrive in pieces and\n * are parsed once at the end of the stream; the final chunk carries\n * `usage` when `stream_options.include_usage` was sent, and `[DONE]` ends\n * the body.\n */\nasync function* streamEvents(\n body: ReadableStream<Uint8Array>,\n model: string,\n requestId: string | null,\n): AsyncGenerator<AiStreamEvent> {\n const decoder = new TextDecoder()\n const reader = body.getReader()\n let usage: AiUsage = { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 }\n let stopReason: string | null = null\n const tools = new Map<number, { name: string; json: string }>()\n let buffer = ''\n let drained = false\n try {\n for (;;) {\n const { done, value } = await reader.read()\n if (done) {\n drained = true\n break\n }\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice('data: '.length).trim()\n if (data === '[DONE]') continue\n let event: Record<string, unknown>\n try {\n event = JSON.parse(data)\n } catch {\n continue\n }\n if (event['error']) {\n const error = event['error'] as { type?: string; message?: string; code?: unknown }\n console.error('ai upstream stream error', {\n provider: OPENAI_COMPATIBLE_PROVIDER_ID,\n requestId,\n model,\n error,\n })\n yield {\n type: 'error',\n retryable: openAiCompatibleFailureIsRetryable(\n typeof error.code === 'number' ? error.code : null,\n ),\n }\n continue\n }\n if (event['usage']) usage = openAiCompatibleUsageFrom(event['usage'])\n const choice = (event['choices'] as Array<Record<string, unknown>> | undefined)?.[0]\n if (!choice) continue\n const delta = choice['delta'] as\n | { content?: unknown; tool_calls?: Array<Record<string, unknown>> }\n | undefined\n if (typeof delta?.content === 'string' && delta.content) {\n yield { type: 'delta', text: delta.content }\n }\n for (const call of delta?.tool_calls ?? []) {\n const index = Number(call['index'] ?? 0)\n const fn = (call['function'] ?? {}) as { name?: unknown; arguments?: unknown }\n const inFlight = tools.get(index) ?? { name: '', json: '' }\n if (typeof fn.name === 'string' && fn.name) inFlight.name = fn.name\n if (typeof fn.arguments === 'string') inFlight.json += fn.arguments\n tools.set(index, inFlight)\n }\n const finish = stopReasonOf(choice['finish_reason'])\n if (finish) stopReason = finish\n }\n }\n } finally {\n if (!drained) await reader.cancel().catch(() => undefined)\n reader.releaseLock()\n }\n const called = [...tools.entries()].sort((a, b) => a[0] - b[0]).map(([, tool]) => tool)\n for (const tool of called) {\n yield { type: 'tool', name: tool.name, input: aiToolInputOf(tool.json) }\n }\n yield {\n type: 'done',\n usage,\n estCostUsd: estimateAiBilledUsd(usage, model),\n stopReason,\n // The `arguments` text the endpoint sent in fragments, for a stream its\n // ceiling cut off (AGL-3143): the `tool` events above carry only what\n // still parsed out of it, which for a cut call is a prefix or nothing.\n ...(aiStoppedAtCeiling(stopReason)\n ? { rawOutput: aiRawOutputOf(called.map((tool) => tool.json).join('')) }\n : {}),\n }\n}\n\nexport const openAiCompatibleProvider: AiProvider = {\n id: OPENAI_COMPATIBLE_PROVIDER_ID,\n label: 'OpenAI-compatible endpoint',\n apiKeyEnv: OPENAI_COMPAT_API_KEY_ENV,\n // Ready only with both halves: a key with no endpoint has nowhere to go.\n readApiKey: () =>\n openAiCompatibleBaseUrl() ? process.env.AI_OPENAI_COMPAT_API_KEY?.trim() || undefined : undefined,\n get endpointHost() {\n return openAiCompatibleHost()\n },\n toolSchemaLimits: OPENAI_COMPATIBLE_TOOL_SCHEMA_LIMITS,\n models(): readonly AiModelDescriptor[] {\n return aiModelIdsForProvider(OPENAI_COMPATIBLE_PROVIDER_ID)\n .map((id) => aiCatalogEntry(id))\n .filter((entry): entry is NonNullable<typeof entry> => Boolean(entry))\n },\n complete,\n stream,\n}\n"],"names":["aiCatalogEntry","aiModelIdsForProvider","estimateAiBilledUsd","AiUpstreamError","aiMessageText","aiRawOutputOf","aiStoppedAtCeiling","aiTokenCount","aiToolInputOf","OPENAI_COMPATIBLE_PROVIDER_ID","OPENAI_COMPAT_BASE_URL_ENV","OPENAI_COMPAT_API_KEY_ENV","openAiCompatibleBaseUrl","process","raw","env","trim","replace","openAiCompatibleHost","base","URL","host","OPENAI_COMPATIBLE_TOOL_SCHEMA_LIMITS","optionalParameters","openAiCompatibleFailureIsRetryable","status","openAiCompatibleUsageFrom","usage","record","details","prompt","cached","Math","min","inputTokens","outputTokens","cacheReadTokens","cacheWriteTokens","buildOpenAiCompatibleRequestBody","input","system","map","block","text","join","tools","tool","type","function","name","description","parameters","inputSchema","additionalProperties","strict","model","max_tokens","maxTokens","stream","stream_options","include_usage","messages","role","content","message","openAiCompatibleContentOf","length","tool_choice","part","image_url","url","mediaType","data","requestIdOf","response","headers","get","send","Error","body","fetch","method","Authorization","apiKey","JSON","stringify","signal","ok","requestId","payload","json","catch","console","error","provider","stopReasonOf","finish","complete","choice","choices","toolUse","tool_calls","call","String","arguments","estCostUsd","stopReason","finish_reason","kind","rawOutput","streamEvents","decoder","TextDecoder","reader","getReader","Map","buffer","drained","lines","done","value","read","decode","split","pop","line","event","startsWith","slice","parse","retryable","code","delta","index","Number","fn","inFlight","set","cancel","undefined","releaseLock","called","entries","sort","a","b","openAiCompatibleProvider","id","label","apiKeyEnv","readApiKey","AI_OPENAI_COMPAT_API_KEY","endpointHost","toolSchemaLimits","models","filter","entry","Boolean"],"mappings":"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"}
@@ -0,0 +1,49 @@
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 { AiProvider } from './contract';
18
+ /**
19
+ * The provider registry (AGL-2939), on the platform's typed service
20
+ * registry (AGL-2940). This plugin declares the contract and registers its
21
+ * own adapters; a marketplace plugin registers a provider against the same
22
+ * token and never imports this plugin's internals — the dependency runs
23
+ * from the adopter to the contract and nowhere else.
24
+ */
25
+ export declare const AI_PROVIDER_CONTRACT: import("@aglyn/aglyn/src").PluginServiceContract<AiProvider>;
26
+ /** Registers a provider. Owner defaults to this plugin; an adopter names itself. */
27
+ export declare function registerAiProvider(provider: AiProvider, options?: {
28
+ pluginId?: string;
29
+ priority?: number;
30
+ }): void;
31
+ /**
32
+ * The two first-party adapters, registered the first time anyone asks and
33
+ * nothing is there. A door called before the plugin's entry ran — a spec
34
+ * driving the handler directly, a job step on a fresh process — gets the
35
+ * same providers the entry would have registered; an adopter's provider
36
+ * registered earlier is not displaced.
37
+ */
38
+ export declare function ensureFirstPartyAiProviders(): void;
39
+ /** Every registered provider, highest priority first. */
40
+ export declare function listAiProviders(): AiProvider[];
41
+ /** One provider by id, or `undefined` when nothing registered it. */
42
+ export declare function aiProviderById(id: string): AiProvider | undefined;
43
+ /** The environment variable naming the platform's default provider. */
44
+ export declare const AI_PROVIDER_ENV = "AI_PROVIDER";
45
+ /**
46
+ * The platform default: `AI_PROVIDER` when set and registered, else the
47
+ * first registered provider. A deployment with none registered has no AI.
48
+ */
49
+ export declare function defaultAiProvider(): AiProvider | undefined;
@@ -0,0 +1,71 @@
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
+ */ // The service registry by its own module: this file is on the server entry,
17
+ // and the full `@aglyn/aglyn` barrel carries client-only contexts (AGL-405).
18
+ import { definePluginServiceContract, registerPluginService, resolvePluginServices } from "@aglyn/aglyn/plugin-manager/plugin-services";
19
+ import { AI_PLUGIN_ID } from "../constants.js";
20
+ import { anthropicProvider } from "./anthropic.js";
21
+ import { openAiCompatibleProvider } from "./openai-compatible.js";
22
+ /**
23
+ * The provider registry (AGL-2939), on the platform's typed service
24
+ * registry (AGL-2940). This plugin declares the contract and registers its
25
+ * own adapters; a marketplace plugin registers a provider against the same
26
+ * token and never imports this plugin's internals — the dependency runs
27
+ * from the adopter to the contract and nowhere else.
28
+ */ export const AI_PROVIDER_CONTRACT = definePluginServiceContract('ai.provider', {
29
+ multiple: true
30
+ });
31
+ /** Registers a provider. Owner defaults to this plugin; an adopter names itself. */ export function registerAiProvider(provider, options) {
32
+ var _ref;
33
+ registerPluginService(AI_PROVIDER_CONTRACT, provider, {
34
+ pluginId: (_ref = options == null ? void 0 : options.pluginId) != null ? _ref : AI_PLUGIN_ID,
35
+ priority: options == null ? void 0 : options.priority,
36
+ key: provider.id
37
+ });
38
+ }
39
+ /**
40
+ * The two first-party adapters, registered the first time anyone asks and
41
+ * nothing is there. A door called before the plugin's entry ran — a spec
42
+ * driving the handler directly, a job step on a fresh process — gets the
43
+ * same providers the entry would have registered; an adopter's provider
44
+ * registered earlier is not displaced.
45
+ */ export function ensureFirstPartyAiProviders() {
46
+ if (resolvePluginServices(AI_PROVIDER_CONTRACT).length) return;
47
+ registerAiProvider(anthropicProvider);
48
+ registerAiProvider(openAiCompatibleProvider);
49
+ }
50
+ /** Every registered provider, highest priority first. */ export function listAiProviders() {
51
+ ensureFirstPartyAiProviders();
52
+ return resolvePluginServices(AI_PROVIDER_CONTRACT).map((entry)=>entry.impl);
53
+ }
54
+ /** One provider by id, or `undefined` when nothing registered it. */ export function aiProviderById(id) {
55
+ return listAiProviders().find((provider)=>provider.id === id);
56
+ }
57
+ /** The environment variable naming the platform's default provider. */ export const AI_PROVIDER_ENV = 'AI_PROVIDER';
58
+ /**
59
+ * The platform default: `AI_PROVIDER` when set and registered, else the
60
+ * first registered provider. A deployment with none registered has no AI.
61
+ */ export function defaultAiProvider() {
62
+ var _process_env_AI_PROVIDER_ENV;
63
+ const wanted = (_process_env_AI_PROVIDER_ENV = process.env[AI_PROVIDER_ENV]) == null ? void 0 : _process_env_AI_PROVIDER_ENV.trim();
64
+ if (wanted) {
65
+ const named = aiProviderById(wanted);
66
+ if (named) return named;
67
+ }
68
+ return listAiProviders()[0];
69
+ }
70
+
71
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/providers/registry.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// The service registry by its own module: this file is on the server entry,\n// and the full `@aglyn/aglyn` barrel carries client-only contexts (AGL-405).\nimport {\n definePluginServiceContract,\n registerPluginService,\n resolvePluginServices,\n} from '@aglyn/aglyn/plugin-manager/plugin-services'\nimport { AI_PLUGIN_ID } from '../constants'\nimport { anthropicProvider } from './anthropic'\nimport type { AiProvider } from './contract'\nimport { openAiCompatibleProvider } from './openai-compatible'\n\n/**\n * The provider registry (AGL-2939), on the platform's typed service\n * registry (AGL-2940). This plugin declares the contract and registers its\n * own adapters; a marketplace plugin registers a provider against the same\n * token and never imports this plugin's internals — the dependency runs\n * from the adopter to the contract and nowhere else.\n */\nexport const AI_PROVIDER_CONTRACT = definePluginServiceContract<AiProvider>(\n 'ai.provider',\n { multiple: true },\n)\n\n/** Registers a provider. Owner defaults to this plugin; an adopter names itself. */\nexport function registerAiProvider(\n provider: AiProvider,\n options?: { pluginId?: string; priority?: number },\n): void {\n registerPluginService(AI_PROVIDER_CONTRACT, provider, {\n pluginId: options?.pluginId ?? AI_PLUGIN_ID,\n priority: options?.priority,\n key: provider.id,\n })\n}\n\n/**\n * The two first-party adapters, registered the first time anyone asks and\n * nothing is there. A door called before the plugin's entry ran — a spec\n * driving the handler directly, a job step on a fresh process — gets the\n * same providers the entry would have registered; an adopter's provider\n * registered earlier is not displaced.\n */\nexport function ensureFirstPartyAiProviders(): void {\n if (resolvePluginServices(AI_PROVIDER_CONTRACT).length) return\n registerAiProvider(anthropicProvider)\n registerAiProvider(openAiCompatibleProvider)\n}\n\n/** Every registered provider, highest priority first. */\nexport function listAiProviders(): AiProvider[] {\n ensureFirstPartyAiProviders()\n return resolvePluginServices(AI_PROVIDER_CONTRACT).map((entry) => entry.impl)\n}\n\n/** One provider by id, or `undefined` when nothing registered it. */\nexport function aiProviderById(id: string): AiProvider | undefined {\n return listAiProviders().find((provider) => provider.id === id)\n}\n\n/** The environment variable naming the platform's default provider. */\nexport const AI_PROVIDER_ENV = 'AI_PROVIDER'\n\n/**\n * The platform default: `AI_PROVIDER` when set and registered, else the\n * first registered provider. A deployment with none registered has no AI.\n */\nexport function defaultAiProvider(): AiProvider | undefined {\n const wanted = process.env[AI_PROVIDER_ENV]?.trim()\n if (wanted) {\n const named = aiProviderById(wanted)\n if (named) return named\n }\n return listAiProviders()[0]\n}\n"],"names":["definePluginServiceContract","registerPluginService","resolvePluginServices","AI_PLUGIN_ID","anthropicProvider","openAiCompatibleProvider","AI_PROVIDER_CONTRACT","multiple","registerAiProvider","provider","options","pluginId","priority","key","id","ensureFirstPartyAiProviders","length","listAiProviders","map","entry","impl","aiProviderById","find","AI_PROVIDER_ENV","defaultAiProvider","process","wanted","env","trim","named"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,4EAA4E;AAC5E,6EAA6E;AAC7E,SACEA,2BAA2B,EAC3BC,qBAAqB,EACrBC,qBAAqB,QAChB,8CAA6C;AACpD,SAASC,YAAY,QAAQ,kBAAc;AAC3C,SAASC,iBAAiB,QAAQ,iBAAa;AAE/C,SAASC,wBAAwB,QAAQ,yBAAqB;AAE9D;;;;;;CAMC,GACD,OAAO,MAAMC,uBAAuBN,4BAClC,eACA;IAAEO,UAAU;AAAK,GAClB;AAED,kFAAkF,GAClF,OAAO,SAASC,mBACdC,QAAoB,EACpBC,OAAkD;;IAElDT,sBAAsBK,sBAAsBG,UAAU;QACpDE,QAAQ,UAAED,2BAAAA,QAASC,QAAQ,mBAAIR;QAC/BS,QAAQ,EAAEF,2BAAAA,QAASE,QAAQ;QAC3BC,KAAKJ,SAASK,EAAE;IAClB;AACF;AAEA;;;;;;CAMC,GACD,OAAO,SAASC;IACd,IAAIb,sBAAsBI,sBAAsBU,MAAM,EAAE;IACxDR,mBAAmBJ;IACnBI,mBAAmBH;AACrB;AAEA,uDAAuD,GACvD,OAAO,SAASY;IACdF;IACA,OAAOb,sBAAsBI,sBAAsBY,GAAG,CAAC,CAACC,QAAUA,MAAMC,IAAI;AAC9E;AAEA,mEAAmE,GACnE,OAAO,SAASC,eAAeP,EAAU;IACvC,OAAOG,kBAAkBK,IAAI,CAAC,CAACb,WAAaA,SAASK,EAAE,KAAKA;AAC9D;AAEA,qEAAqE,GACrE,OAAO,MAAMS,kBAAkB,cAAa;AAE5C;;;CAGC,GACD,OAAO,SAASC;QACCC;IAAf,MAAMC,UAASD,+BAAAA,QAAQE,GAAG,CAACJ,gBAAgB,qBAA5BE,6BAA8BG,IAAI;IACjD,IAAIF,QAAQ;QACV,MAAMG,QAAQR,eAAeK;QAC7B,IAAIG,OAAO,OAAOA;IACpB;IACA,OAAOZ,iBAAiB,CAAC,EAAE;AAC7B"}
@@ -0,0 +1,98 @@
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 AiStepKind } from './catalog';
18
+ import type { AiEvalKind } from '../runtime/ai-eval';
19
+ import type { AiEffort, AiProvider, AiThinking } from './contract';
20
+ /**
21
+ * The routing table (AGL-2937, AGL-2939): step kind → provider and model,
22
+ * through the catalog and never a vendor literal.
23
+ *
24
+ * Precedence, dearest override first:
25
+ *
26
+ * 1. the org's `pluginSettings/ai` — a provider, and a model per step kind
27
+ * that must be one the provider serves;
28
+ * 2. the deployment's environment — `AI_PROVIDER` for the provider,
29
+ * `AI_DEFAULT_MODEL` for every step, and `ASSIST_MODEL` for the
30
+ * assistant alone (the incident-response override the chat door has
31
+ * always honored);
32
+ * 3. the catalog's tier for the step kind on the resolved provider.
33
+ */
34
+ /** The environment override for every step kind. */
35
+ export declare const AI_DEFAULT_MODEL_ENV = "AI_DEFAULT_MODEL";
36
+ /** The assistant's own override, honored before the general one. */
37
+ export declare const ASSIST_MODEL_ENV = "ASSIST_MODEL";
38
+ /** The org's resolved `pluginSettings/ai` values, as `getPluginConfig` merges them. */
39
+ export type AiPluginSettings = Record<string, unknown>;
40
+ export interface AiRoute {
41
+ provider: AiProvider;
42
+ model: string;
43
+ }
44
+ /** The provider a workspace runs on: its own choice when registered, else the platform's. */
45
+ export declare function resolveAiProvider(settings?: AiPluginSettings): AiProvider | undefined;
46
+ /**
47
+ * The model a step kind runs on for a workspace, on the resolved provider.
48
+ * A chosen model on another provider is not served — the provider decides
49
+ * what it can run — and falls back to the provider's default for the tier.
50
+ */
51
+ export declare function resolveAiRoute(kind: AiStepKind, settings?: AiPluginSettings): AiRoute | undefined;
52
+ /**
53
+ * What one step kind asks of its model, beside the tier it is served from
54
+ * (`AI_STEP_TIERS` in the catalog): whether it thinks and how hard, its
55
+ * answer ceiling, and the eval score that tier holds on the step's golden
56
+ * briefs (AGL-2937).
57
+ */
58
+ export interface AiRoutingRow {
59
+ /** `null` sends no setting: the model's own default, and all a fast-tier model accepts. */
60
+ thinking: AiThinking | null;
61
+ effort: AiEffort | null;
62
+ /** The answer ceiling, thinking included. */
63
+ maxTokens: number;
64
+ /** What the ceiling is sized from. */
65
+ maxTokensBasis: string;
66
+ eval: AiRoutingEval;
67
+ }
68
+ export interface AiRoutingEval {
69
+ /** The golden-brief kinds the step answers. */
70
+ kinds: readonly AiEvalKind[];
71
+ /** `answers` scores the step's answers; `plans` scores the plans those kinds' answers carry. */
72
+ scores: 'answers' | 'plans';
73
+ /** `authored` while the score is the hand-written references'; `recorded` once a live run records answers. */
74
+ source: 'authored' | 'recorded';
75
+ passRate: number;
76
+ /** The mean answer score; `null` for a plan score, which passes or fails. */
77
+ meanScore: number | null;
78
+ }
79
+ /**
80
+ * THE ROUTING TABLE (AGL-2937): what each step kind asks of the model, in one
81
+ * place, with the evidence beside it.
82
+ *
83
+ * A step runs on the smallest tier that holds its eval floor. A row moves to a
84
+ * cheaper tier, or a lower effort, only when a recorded eval
85
+ * (`npm run eval:ai-live`) holds the floor there; while a row's score is the
86
+ * authored references', it says so, and the row stays where production has
87
+ * run it. `runtime/ai-eval.spec.ts` recomputes every row's score from the
88
+ * harness, so a row cannot claim a score its briefs do not hold.
89
+ *
90
+ * A ceiling is sized from the p95 output the staff signals page reports for
91
+ * the kind once production has served it; until then `maxTokensBasis` names
92
+ * what it is sized from. The same spec holds every reference answer under its
93
+ * row's ceiling at three characters a token, a reading that errs high for a
94
+ * tokenizer that splits finer than four.
95
+ */
96
+ export declare const AI_ROUTING_TABLE: Readonly<Record<AiStepKind, AiRoutingRow>>;
97
+ /** The model id alone — what a door records on the meter and the job. */
98
+ export declare function aiModelForStep(kind: AiStepKind, settings?: AiPluginSettings): string;