@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.
- package/LICENSE +201 -0
- package/README.md +25 -0
- package/package.json +60 -0
- package/src/index.d.ts +21 -0
- package/src/index.js +22 -0
- package/src/index.js.map +1 -0
- package/src/lib/activity/ai-activity-actions.d.ts +106 -0
- package/src/lib/activity/ai-activity-actions.js +209 -0
- package/src/lib/activity/ai-activity-actions.js.map +1 -0
- package/src/lib/activity/ai-activity.d.ts +219 -0
- package/src/lib/activity/ai-activity.js +251 -0
- package/src/lib/activity/ai-activity.js.map +1 -0
- package/src/lib/billing/ai-overage-charge.d.ts +102 -0
- package/src/lib/billing/ai-overage-charge.js +258 -0
- package/src/lib/billing/ai-overage-charge.js.map +1 -0
- package/src/lib/billing/ai-overage-close.d.ts +62 -0
- package/src/lib/billing/ai-overage-close.js +129 -0
- package/src/lib/billing/ai-overage-close.js.map +1 -0
- package/src/lib/billing/ai-overage-cutover.d.ts +63 -0
- package/src/lib/billing/ai-overage-cutover.js +114 -0
- package/src/lib/billing/ai-overage-cutover.js.map +1 -0
- package/src/lib/billing/ai-overage-events.d.ts +77 -0
- package/src/lib/billing/ai-overage-events.js +174 -0
- package/src/lib/billing/ai-overage-events.js.map +1 -0
- package/src/lib/billing/ai-overage-gate.d.ts +147 -0
- package/src/lib/billing/ai-overage-gate.js +177 -0
- package/src/lib/billing/ai-overage-gate.js.map +1 -0
- package/src/lib/billing/ai-overage-ledger.d.ts +135 -0
- package/src/lib/billing/ai-overage-ledger.js +278 -0
- package/src/lib/billing/ai-overage-ledger.js.map +1 -0
- package/src/lib/billing/ai-overage-standing-writes.d.ts +110 -0
- package/src/lib/billing/ai-overage-standing-writes.js +205 -0
- package/src/lib/billing/ai-overage-standing-writes.js.map +1 -0
- package/src/lib/billing/ai-overage-standing.d.ts +168 -0
- package/src/lib/billing/ai-overage-standing.js +215 -0
- package/src/lib/billing/ai-overage-standing.js.map +1 -0
- package/src/lib/billing/ai-overage-trigger.d.ts +30 -0
- package/src/lib/billing/ai-overage-trigger.js +76 -0
- package/src/lib/billing/ai-overage-trigger.js.map +1 -0
- package/src/lib/components/ai-allotment-editor.component.d.ts +40 -0
- package/src/lib/components/ai-allotment-editor.component.js +213 -0
- package/src/lib/components/ai-allotment-editor.component.js.map +1 -0
- package/src/lib/components/ai-assist-actions-context.d.ts +13 -0
- package/src/lib/components/ai-assist-actions-context.js +21 -0
- package/src/lib/components/ai-assist-actions-context.js.map +1 -0
- package/src/lib/components/ai-assist-provider.component.d.ts +51 -0
- package/src/lib/components/ai-assist-provider.component.js +519 -0
- package/src/lib/components/ai-assist-provider.component.js.map +1 -0
- package/src/lib/components/ai-brief-dialog.component.d.ts +56 -0
- package/src/lib/components/ai-brief-dialog.component.js +319 -0
- package/src/lib/components/ai-brief-dialog.component.js.map +1 -0
- package/src/lib/components/ai-collaborator-permissions-column.component.d.ts +32 -0
- package/src/lib/components/ai-collaborator-permissions-column.component.js +132 -0
- package/src/lib/components/ai-collaborator-permissions-column.component.js.map +1 -0
- package/src/lib/components/ai-credits-card.component.d.ts +34 -0
- package/src/lib/components/ai-credits-card.component.js +131 -0
- package/src/lib/components/ai-credits-card.component.js.map +1 -0
- package/src/lib/components/ai-credits-columns.component.d.ts +56 -0
- package/src/lib/components/ai-credits-columns.component.js +118 -0
- package/src/lib/components/ai-credits-columns.component.js.map +1 -0
- package/src/lib/components/ai-crm-email-draft.component.d.ts +17 -0
- package/src/lib/components/ai-crm-email-draft.component.js +159 -0
- package/src/lib/components/ai-crm-email-draft.component.js.map +1 -0
- package/src/lib/components/ai-crm-import-mapping.component.d.ts +20 -0
- package/src/lib/components/ai-crm-import-mapping.component.js +167 -0
- package/src/lib/components/ai-crm-import-mapping.component.js.map +1 -0
- package/src/lib/components/ai-crm-record-card.component.d.ts +27 -0
- package/src/lib/components/ai-crm-record-card.component.js +263 -0
- package/src/lib/components/ai-crm-record-card.component.js.map +1 -0
- package/src/lib/components/ai-describe-automation.component.d.ts +31 -0
- package/src/lib/components/ai-describe-automation.component.js +226 -0
- package/src/lib/components/ai-describe-automation.component.js.map +1 -0
- package/src/lib/components/ai-describe-button.component.d.ts +39 -0
- package/src/lib/components/ai-describe-button.component.js +87 -0
- package/src/lib/components/ai-describe-button.component.js.map +1 -0
- package/src/lib/components/ai-describe-page.component.d.ts +26 -0
- package/src/lib/components/ai-describe-page.component.js +18 -0
- package/src/lib/components/ai-describe-page.component.js.map +1 -0
- package/src/lib/components/ai-experiment-cards.component.d.ts +75 -0
- package/src/lib/components/ai-experiment-cards.component.js +573 -0
- package/src/lib/components/ai-experiment-cards.component.js.map +1 -0
- package/src/lib/components/ai-explain-automation.component.d.ts +31 -0
- package/src/lib/components/ai-explain-automation.component.js +265 -0
- package/src/lib/components/ai-explain-automation.component.js.map +1 -0
- package/src/lib/components/ai-insight-dialog.component.d.ts +37 -0
- package/src/lib/components/ai-insight-dialog.component.js +441 -0
- package/src/lib/components/ai-insight-dialog.component.js.map +1 -0
- package/src/lib/components/ai-job-plan.component.d.ts +46 -0
- package/src/lib/components/ai-job-plan.component.js +192 -0
- package/src/lib/components/ai-job-plan.component.js.map +1 -0
- package/src/lib/components/ai-model-selector.component.d.ts +21 -0
- package/src/lib/components/ai-model-selector.component.js +109 -0
- package/src/lib/components/ai-model-selector.component.js.map +1 -0
- package/src/lib/components/ai-page-brief-dialog.component.d.ts +29 -0
- package/src/lib/components/ai-page-brief-dialog.component.js +27 -0
- package/src/lib/components/ai-page-brief-dialog.component.js.map +1 -0
- package/src/lib/components/ai-permissions-on-host.component.d.ts +55 -0
- package/src/lib/components/ai-permissions-on-host.component.js +91 -0
- package/src/lib/components/ai-permissions-on-host.component.js.map +1 -0
- package/src/lib/components/ai-product-copy-card.component.d.ts +25 -0
- package/src/lib/components/ai-product-copy-card.component.js +328 -0
- package/src/lib/components/ai-product-copy-card.component.js.map +1 -0
- package/src/lib/components/ai-product-import-option.component.d.ts +14 -0
- package/src/lib/components/ai-product-import-option.component.js +58 -0
- package/src/lib/components/ai-product-import-option.component.js.map +1 -0
- package/src/lib/components/ai-products-hub-card.component.d.ts +15 -0
- package/src/lib/components/ai-products-hub-card.component.js +418 -0
- package/src/lib/components/ai-products-hub-card.component.js.map +1 -0
- package/src/lib/components/ai-products-proposals.component.d.ts +19 -0
- package/src/lib/components/ai-products-proposals.component.js +547 -0
- package/src/lib/components/ai-products-proposals.component.js.map +1 -0
- package/src/lib/components/ai-save-as-component.component.d.ts +38 -0
- package/src/lib/components/ai-save-as-component.component.js +231 -0
- package/src/lib/components/ai-save-as-component.component.js.map +1 -0
- package/src/lib/components/ai-seo-audit-card.component.d.ts +9 -0
- package/src/lib/components/ai-seo-audit-card.component.js +620 -0
- package/src/lib/components/ai-seo-audit-card.component.js.map +1 -0
- package/src/lib/components/ai-seo-fields-card.component.d.ts +10 -0
- package/src/lib/components/ai-seo-fields-card.component.js +453 -0
- package/src/lib/components/ai-seo-fields-card.component.js.map +1 -0
- package/src/lib/components/ai-site-batch-card.component.d.ts +32 -0
- package/src/lib/components/ai-site-batch-card.component.js +531 -0
- package/src/lib/components/ai-site-batch-card.component.js.map +1 -0
- package/src/lib/components/ai-site-seo-start-card.component.d.ts +26 -0
- package/src/lib/components/ai-site-seo-start-card.component.js +178 -0
- package/src/lib/components/ai-site-seo-start-card.component.js.map +1 -0
- package/src/lib/components/ai-site-start-card.component.d.ts +19 -0
- package/src/lib/components/ai-site-start-card.component.js +348 -0
- package/src/lib/components/ai-site-start-card.component.js.map +1 -0
- package/src/lib/components/ai-template-collection-field.component.d.ts +32 -0
- package/src/lib/components/ai-template-collection-field.component.js +63 -0
- package/src/lib/components/ai-template-collection-field.component.js.map +1 -0
- package/src/lib/components/ai-theme-proposal-card.component.d.ts +6 -0
- package/src/lib/components/ai-theme-proposal-card.component.js +619 -0
- package/src/lib/components/ai-theme-proposal-card.component.js.map +1 -0
- package/src/lib/components/ai-usage-strip.component.d.ts +27 -0
- package/src/lib/components/ai-usage-strip.component.js +145 -0
- package/src/lib/components/ai-usage-strip.component.js.map +1 -0
- package/src/lib/components/assist-edit-canvas.d.ts +169 -0
- package/src/lib/components/assist-edit-canvas.js +636 -0
- package/src/lib/components/assist-edit-canvas.js.map +1 -0
- package/src/lib/components/assist-edit-card.component.d.ts +16 -0
- package/src/lib/components/assist-edit-card.component.js +181 -0
- package/src/lib/components/assist-edit-card.component.js.map +1 -0
- package/src/lib/components/assist-jobs-drawer.component.d.ts +72 -0
- package/src/lib/components/assist-jobs-drawer.component.js +626 -0
- package/src/lib/components/assist-jobs-drawer.component.js.map +1 -0
- package/src/lib/components/assist-panel.component.d.ts +136 -0
- package/src/lib/components/assist-panel.component.js +1099 -0
- package/src/lib/components/assist-panel.component.js.map +1 -0
- package/src/lib/components/assist-signals-page.component.d.ts +3 -0
- package/src/lib/components/assist-signals-page.component.js +1017 -0
- package/src/lib/components/assist-signals-page.component.js.map +1 -0
- package/src/lib/components/besigner-ai-controls.component.d.ts +29 -0
- package/src/lib/components/besigner-ai-controls.component.js +81 -0
- package/src/lib/components/besigner-ai-controls.component.js.map +1 -0
- package/src/lib/components/billing-ai-allotments.component.d.ts +36 -0
- package/src/lib/components/billing-ai-allotments.component.js +486 -0
- package/src/lib/components/billing-ai-allotments.component.js.map +1 -0
- package/src/lib/components/billing-ai-top-users.component.d.ts +44 -0
- package/src/lib/components/billing-ai-top-users.component.js +304 -0
- package/src/lib/components/billing-ai-top-users.component.js.map +1 -0
- package/src/lib/components/billing-assist-overage-card.component.d.ts +69 -0
- package/src/lib/components/billing-assist-overage-card.component.js +437 -0
- package/src/lib/components/billing-assist-overage-card.component.js.map +1 -0
- package/src/lib/components/host-ai-allotments.component.d.ts +40 -0
- package/src/lib/components/host-ai-allotments.component.js +239 -0
- package/src/lib/components/host-ai-allotments.component.js.map +1 -0
- package/src/lib/components/member-ai-allotment-card.component.d.ts +28 -0
- package/src/lib/components/member-ai-allotment-card.component.js +172 -0
- package/src/lib/components/member-ai-allotment-card.component.js.map +1 -0
- package/src/lib/components/member-ai-usage-card.component.d.ts +28 -0
- package/src/lib/components/member-ai-usage-card.component.js +240 -0
- package/src/lib/components/member-ai-usage-card.component.js.map +1 -0
- package/src/lib/components/staff-org-ai-card.component.d.ts +17 -0
- package/src/lib/components/staff-org-ai-card.component.js +739 -0
- package/src/lib/components/staff-org-ai-card.component.js.map +1 -0
- package/src/lib/components/staff-org-usage-ai-columns.component.d.ts +41 -0
- package/src/lib/components/staff-org-usage-ai-columns.component.js +65 -0
- package/src/lib/components/staff-org-usage-ai-columns.component.js.map +1 -0
- package/src/lib/components/staff-orgs-ai-spend-column.component.d.ts +28 -0
- package/src/lib/components/staff-orgs-ai-spend-column.component.js +89 -0
- package/src/lib/components/staff-orgs-ai-spend-column.component.js.map +1 -0
- package/src/lib/components/staff-user-ai-usage-card.component.d.ts +27 -0
- package/src/lib/components/staff-user-ai-usage-card.component.js +183 -0
- package/src/lib/components/staff-user-ai-usage-card.component.js.map +1 -0
- package/src/lib/components/use-ai-allotments.d.ts +49 -0
- package/src/lib/components/use-ai-allotments.js +171 -0
- package/src/lib/components/use-ai-allotments.js.map +1 -0
- package/src/lib/components/use-ai-crm-answer.d.ts +50 -0
- package/src/lib/components/use-ai-crm-answer.js +220 -0
- package/src/lib/components/use-ai-crm-answer.js.map +1 -0
- package/src/lib/components/use-ai-job-run.d.ts +51 -0
- package/src/lib/components/use-ai-job-run.js +176 -0
- package/src/lib/components/use-ai-job-run.js.map +1 -0
- package/src/lib/components/use-ai-model-choice.d.ts +47 -0
- package/src/lib/components/use-ai-model-choice.js +150 -0
- package/src/lib/components/use-ai-model-choice.js.map +1 -0
- package/src/lib/components/use-ai-products-jobs.d.ts +36 -0
- package/src/lib/components/use-ai-products-jobs.js +190 -0
- package/src/lib/components/use-ai-products-jobs.js.map +1 -0
- package/src/lib/components/use-ai-usage-meter.d.ts +11 -0
- package/src/lib/components/use-ai-usage-meter.js +96 -0
- package/src/lib/components/use-ai-usage-meter.js.map +1 -0
- package/src/lib/components/use-org-ai-usage.d.ts +42 -0
- package/src/lib/components/use-org-ai-usage.js +181 -0
- package/src/lib/components/use-org-ai-usage.js.map +1 -0
- package/src/lib/components/use-staff-orgs-ai-spend.d.ts +18 -0
- package/src/lib/components/use-staff-orgs-ai-spend.js +127 -0
- package/src/lib/components/use-staff-orgs-ai-spend.js.map +1 -0
- package/src/lib/constants.d.ts +24 -0
- package/src/lib/constants.js +23 -0
- package/src/lib/constants.js.map +1 -0
- package/src/lib/declarations.d.ts +48 -0
- package/src/lib/declarations.js +129 -0
- package/src/lib/declarations.js.map +1 -0
- package/src/lib/declarations.server.d.ts +35 -0
- package/src/lib/declarations.server.js +138 -0
- package/src/lib/declarations.server.js.map +1 -0
- package/src/lib/insights/ai-figure-readers.d.ts +90 -0
- package/src/lib/insights/ai-figure-readers.js +863 -0
- package/src/lib/insights/ai-figure-readers.js.map +1 -0
- package/src/lib/insights/ai-insight-digest.d.ts +165 -0
- package/src/lib/insights/ai-insight-digest.js +363 -0
- package/src/lib/insights/ai-insight-digest.js.map +1 -0
- package/src/lib/insights/ai-insight-readers.d.ts +71 -0
- package/src/lib/insights/ai-insight-readers.js +141 -0
- package/src/lib/insights/ai-insight-readers.js.map +1 -0
- package/src/lib/jobs/ai-crm-access.d.ts +61 -0
- package/src/lib/jobs/ai-crm-access.js +94 -0
- package/src/lib/jobs/ai-crm-access.js.map +1 -0
- package/src/lib/jobs/ai-email-bindings.d.ts +97 -0
- package/src/lib/jobs/ai-email-bindings.js +147 -0
- package/src/lib/jobs/ai-email-bindings.js.map +1 -0
- package/src/lib/jobs/ai-job-admission.d.ts +82 -0
- package/src/lib/jobs/ai-job-admission.js +45 -0
- package/src/lib/jobs/ai-job-admission.js.map +1 -0
- package/src/lib/jobs/ai-job-budget.d.ts +167 -0
- package/src/lib/jobs/ai-job-budget.js +161 -0
- package/src/lib/jobs/ai-job-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-campaign-step.d.ts +108 -0
- package/src/lib/jobs/ai-job-campaign-step.js +340 -0
- package/src/lib/jobs/ai-job-campaign-step.js.map +1 -0
- package/src/lib/jobs/ai-job-component-checks.d.ts +74 -0
- package/src/lib/jobs/ai-job-component-checks.js +442 -0
- package/src/lib/jobs/ai-job-component-checks.js.map +1 -0
- package/src/lib/jobs/ai-job-component-step.d.ts +75 -0
- package/src/lib/jobs/ai-job-component-step.js +262 -0
- package/src/lib/jobs/ai-job-component-step.js.map +1 -0
- package/src/lib/jobs/ai-job-crm-step.d.ts +192 -0
- package/src/lib/jobs/ai-job-crm-step.js +734 -0
- package/src/lib/jobs/ai-job-crm-step.js.map +1 -0
- package/src/lib/jobs/ai-job-draft-ids.d.ts +62 -0
- package/src/lib/jobs/ai-job-draft-ids.js +132 -0
- package/src/lib/jobs/ai-job-draft-ids.js.map +1 -0
- package/src/lib/jobs/ai-job-drafts.d.ts +304 -0
- package/src/lib/jobs/ai-job-drafts.js +557 -0
- package/src/lib/jobs/ai-job-drafts.js.map +1 -0
- package/src/lib/jobs/ai-job-email-step.d.ts +195 -0
- package/src/lib/jobs/ai-job-email-step.js +547 -0
- package/src/lib/jobs/ai-job-email-step.js.map +1 -0
- package/src/lib/jobs/ai-job-experiment-step.d.ts +105 -0
- package/src/lib/jobs/ai-job-experiment-step.js +445 -0
- package/src/lib/jobs/ai-job-experiment-step.js.map +1 -0
- package/src/lib/jobs/ai-job-form-step.d.ts +250 -0
- package/src/lib/jobs/ai-job-form-step.js +634 -0
- package/src/lib/jobs/ai-job-form-step.js.map +1 -0
- package/src/lib/jobs/ai-job-generation.d.ts +114 -0
- package/src/lib/jobs/ai-job-generation.js +384 -0
- package/src/lib/jobs/ai-job-generation.js.map +1 -0
- package/src/lib/jobs/ai-job-insight-budget.d.ts +41 -0
- package/src/lib/jobs/ai-job-insight-budget.js +46 -0
- package/src/lib/jobs/ai-job-insight-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-insight-step.d.ts +58 -0
- package/src/lib/jobs/ai-job-insight-step.js +350 -0
- package/src/lib/jobs/ai-job-insight-step.js.map +1 -0
- package/src/lib/jobs/ai-job-layout-step.d.ts +103 -0
- package/src/lib/jobs/ai-job-layout-step.js +340 -0
- package/src/lib/jobs/ai-job-layout-step.js.map +1 -0
- package/src/lib/jobs/ai-job-page-budget.d.ts +57 -0
- package/src/lib/jobs/ai-job-page-budget.js +60 -0
- package/src/lib/jobs/ai-job-page-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-page-sections.d.ts +150 -0
- package/src/lib/jobs/ai-job-page-sections.js +450 -0
- package/src/lib/jobs/ai-job-page-sections.js.map +1 -0
- package/src/lib/jobs/ai-job-page-step.d.ts +198 -0
- package/src/lib/jobs/ai-job-page-step.js +667 -0
- package/src/lib/jobs/ai-job-page-step.js.map +1 -0
- package/src/lib/jobs/ai-job-plan-conformance.d.ts +107 -0
- package/src/lib/jobs/ai-job-plan-conformance.js +164 -0
- package/src/lib/jobs/ai-job-plan-conformance.js.map +1 -0
- package/src/lib/jobs/ai-job-plan-step.d.ts +196 -0
- package/src/lib/jobs/ai-job-plan-step.js +458 -0
- package/src/lib/jobs/ai-job-plan-step.js.map +1 -0
- package/src/lib/jobs/ai-job-plugin-drafts.d.ts +76 -0
- package/src/lib/jobs/ai-job-plugin-drafts.js +91 -0
- package/src/lib/jobs/ai-job-plugin-drafts.js.map +1 -0
- package/src/lib/jobs/ai-job-products-step.d.ts +106 -0
- package/src/lib/jobs/ai-job-products-step.js +436 -0
- package/src/lib/jobs/ai-job-products-step.js.map +1 -0
- package/src/lib/jobs/ai-job-seo-budget.d.ts +52 -0
- package/src/lib/jobs/ai-job-seo-budget.js +63 -0
- package/src/lib/jobs/ai-job-seo-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-seo-step.d.ts +145 -0
- package/src/lib/jobs/ai-job-seo-step.js +809 -0
- package/src/lib/jobs/ai-job-seo-step.js.map +1 -0
- package/src/lib/jobs/ai-job-site-step.d.ts +252 -0
- package/src/lib/jobs/ai-job-site-step.js +538 -0
- package/src/lib/jobs/ai-job-site-step.js.map +1 -0
- package/src/lib/jobs/ai-job-template-step.d.ts +105 -0
- package/src/lib/jobs/ai-job-template-step.js +391 -0
- package/src/lib/jobs/ai-job-template-step.js.map +1 -0
- package/src/lib/jobs/ai-job-text-step.d.ts +125 -0
- package/src/lib/jobs/ai-job-text-step.js +128 -0
- package/src/lib/jobs/ai-job-text-step.js.map +1 -0
- package/src/lib/jobs/ai-job-theme-budget.d.ts +38 -0
- package/src/lib/jobs/ai-job-theme-budget.js +43 -0
- package/src/lib/jobs/ai-job-theme-budget.js.map +1 -0
- package/src/lib/jobs/ai-job-theme-step.d.ts +115 -0
- package/src/lib/jobs/ai-job-theme-step.js +337 -0
- package/src/lib/jobs/ai-job-theme-step.js.map +1 -0
- package/src/lib/jobs/ai-job-workflow-step.d.ts +139 -0
- package/src/lib/jobs/ai-job-workflow-step.js +530 -0
- package/src/lib/jobs/ai-job-workflow-step.js.map +1 -0
- package/src/lib/jobs/ai-jobs-beat.d.ts +78 -0
- package/src/lib/jobs/ai-jobs-beat.js +93 -0
- package/src/lib/jobs/ai-jobs-beat.js.map +1 -0
- package/src/lib/jobs/ai-jobs-pause.d.ts +38 -0
- package/src/lib/jobs/ai-jobs-pause.js +45 -0
- package/src/lib/jobs/ai-jobs-pause.js.map +1 -0
- package/src/lib/jobs/ai-jobs.d.ts +558 -0
- package/src/lib/jobs/ai-jobs.js +1410 -0
- package/src/lib/jobs/ai-jobs.js.map +1 -0
- package/src/lib/jobs/ai-media-asset-server.d.ts +34 -0
- package/src/lib/jobs/ai-media-asset-server.js +34 -0
- package/src/lib/jobs/ai-media-asset-server.js.map +1 -0
- package/src/lib/jobs/ai-media-asset.d.ts +59 -0
- package/src/lib/jobs/ai-media-asset.js +86 -0
- package/src/lib/jobs/ai-media-asset.js.map +1 -0
- package/src/lib/jobs/ai-product-image.d.ts +78 -0
- package/src/lib/jobs/ai-product-image.js +113 -0
- package/src/lib/jobs/ai-product-image.js.map +1 -0
- package/src/lib/jobs/ai-theme-brand-inputs.d.ts +125 -0
- package/src/lib/jobs/ai-theme-brand-inputs.js +378 -0
- package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -0
- package/src/lib/jobs/ai-theme-brand-server.d.ts +33 -0
- package/src/lib/jobs/ai-theme-brand-server.js +33 -0
- package/src/lib/jobs/ai-theme-brand-server.js.map +1 -0
- package/src/lib/jobs/ai-workflow-records.d.ts +84 -0
- package/src/lib/jobs/ai-workflow-records.js +158 -0
- package/src/lib/jobs/ai-workflow-records.js.map +1 -0
- package/src/lib/jobs/fixtures/ai-free-page-built-recording.d.ts +31 -0
- package/src/lib/jobs/fixtures/ai-free-page-built-recording.js +367 -0
- package/src/lib/jobs/fixtures/ai-free-page-built-recording.js.map +1 -0
- package/src/lib/jobs/fixtures/ai-free-page-recording.d.ts +69 -0
- package/src/lib/jobs/fixtures/ai-free-page-recording.js +442 -0
- package/src/lib/jobs/fixtures/ai-free-page-recording.js.map +1 -0
- package/src/lib/jobs/fixtures/ai-page-briefs.d.ts +146 -0
- package/src/lib/jobs/fixtures/ai-page-briefs.js +1850 -0
- package/src/lib/jobs/fixtures/ai-page-briefs.js.map +1 -0
- package/src/lib/model/ai-allotments.d.ts +208 -0
- package/src/lib/model/ai-allotments.js +269 -0
- package/src/lib/model/ai-allotments.js.map +1 -0
- package/src/lib/model/ai-automation-draft.d.ts +74 -0
- package/src/lib/model/ai-automation-draft.js +310 -0
- package/src/lib/model/ai-automation-draft.js.map +1 -0
- package/src/lib/model/ai-automation-outline.d.ts +50 -0
- package/src/lib/model/ai-automation-outline.js +262 -0
- package/src/lib/model/ai-automation-outline.js.map +1 -0
- package/src/lib/model/ai-build-plan.d.ts +197 -0
- package/src/lib/model/ai-build-plan.js +438 -0
- package/src/lib/model/ai-build-plan.js.map +1 -0
- package/src/lib/model/ai-crm.d.ts +237 -0
- package/src/lib/model/ai-crm.js +225 -0
- package/src/lib/model/ai-crm.js.map +1 -0
- package/src/lib/model/ai-experiment-proposal.d.ts +68 -0
- package/src/lib/model/ai-experiment-proposal.js +146 -0
- package/src/lib/model/ai-experiment-proposal.js.map +1 -0
- package/src/lib/model/ai-experiment.d.ts +309 -0
- package/src/lib/model/ai-experiment.js +395 -0
- package/src/lib/model/ai-experiment.js.map +1 -0
- package/src/lib/model/ai-insight.d.ts +178 -0
- package/src/lib/model/ai-insight.js +201 -0
- package/src/lib/model/ai-insight.js.map +1 -0
- package/src/lib/model/ai-jobs.types.d.ts +412 -0
- package/src/lib/model/ai-jobs.types.js +42 -0
- package/src/lib/model/ai-jobs.types.js.map +1 -0
- package/src/lib/model/ai-page-job.d.ts +92 -0
- package/src/lib/model/ai-page-job.js +159 -0
- package/src/lib/model/ai-page-job.js.map +1 -0
- package/src/lib/model/ai-permissions.d.ts +49 -0
- package/src/lib/model/ai-permissions.js +97 -0
- package/src/lib/model/ai-permissions.js.map +1 -0
- package/src/lib/model/ai-plan-capabilities.d.ts +139 -0
- package/src/lib/model/ai-plan-capabilities.js +149 -0
- package/src/lib/model/ai-plan-capabilities.js.map +1 -0
- package/src/lib/model/ai-products.d.ts +251 -0
- package/src/lib/model/ai-products.js +253 -0
- package/src/lib/model/ai-products.js.map +1 -0
- package/src/lib/model/ai-seo.d.ts +208 -0
- package/src/lib/model/ai-seo.js +150 -0
- package/src/lib/model/ai-seo.js.map +1 -0
- package/src/lib/model/ai-site-inventory.d.ts +164 -0
- package/src/lib/model/ai-site-inventory.js +145 -0
- package/src/lib/model/ai-site-inventory.js.map +1 -0
- package/src/lib/model/ai-site-job.d.ts +247 -0
- package/src/lib/model/ai-site-job.js +314 -0
- package/src/lib/model/ai-site-job.js.map +1 -0
- package/src/lib/model/ai-site-start-seo.d.ts +103 -0
- package/src/lib/model/ai-site-start-seo.js +154 -0
- package/src/lib/model/ai-site-start-seo.js.map +1 -0
- package/src/lib/model/ai-site-start.d.ts +122 -0
- package/src/lib/model/ai-site-start.js +159 -0
- package/src/lib/model/ai-site-start.js.map +1 -0
- package/src/lib/model/ai-site-switch.d.ts +56 -0
- package/src/lib/model/ai-site-switch.js +73 -0
- package/src/lib/model/ai-site-switch.js.map +1 -0
- package/src/lib/model/ai-storefront-claims.d.ts +70 -0
- package/src/lib/model/ai-storefront-claims.js +130 -0
- package/src/lib/model/ai-storefront-claims.js.map +1 -0
- package/src/lib/model/ai-template-subjects.d.ts +82 -0
- package/src/lib/model/ai-template-subjects.js +136 -0
- package/src/lib/model/ai-template-subjects.js.map +1 -0
- package/src/lib/model/ai-theme-proposal.d.ts +210 -0
- package/src/lib/model/ai-theme-proposal.js +506 -0
- package/src/lib/model/ai-theme-proposal.js.map +1 -0
- package/src/lib/model/ai-tokens.d.ts +96 -0
- package/src/lib/model/ai-tokens.js +117 -0
- package/src/lib/model/ai-tokens.js.map +1 -0
- package/src/lib/model/ai-usage-by-user.d.ts +120 -0
- package/src/lib/model/ai-usage-by-user.js +139 -0
- package/src/lib/model/ai-usage-by-user.js.map +1 -0
- package/src/lib/model/ai-workflow-job.d.ts +111 -0
- package/src/lib/model/ai-workflow-job.js +183 -0
- package/src/lib/model/ai-workflow-job.js.map +1 -0
- package/src/lib/model/assist-edit.d.ts +261 -0
- package/src/lib/model/assist-edit.js +175 -0
- package/src/lib/model/assist-edit.js.map +1 -0
- package/src/lib/plugin-config.d.ts +33 -0
- package/src/lib/plugin-config.js +118 -0
- package/src/lib/plugin-config.js.map +1 -0
- package/src/lib/plugin.d.ts +30 -0
- package/src/lib/plugin.js +525 -0
- package/src/lib/plugin.js.map +1 -0
- package/src/lib/providers/anthropic.d.ts +84 -0
- package/src/lib/providers/anthropic.js +432 -0
- package/src/lib/providers/anthropic.js.map +1 -0
- package/src/lib/providers/catalog.d.ts +197 -0
- package/src/lib/providers/catalog.js +312 -0
- package/src/lib/providers/catalog.js.map +1 -0
- package/src/lib/providers/contract.d.ts +464 -0
- package/src/lib/providers/contract.js +274 -0
- package/src/lib/providers/contract.js.map +1 -0
- package/src/lib/providers/model-choice.d.ts +119 -0
- package/src/lib/providers/model-choice.js +416 -0
- package/src/lib/providers/model-choice.js.map +1 -0
- package/src/lib/providers/openai-compatible.d.ts +58 -0
- package/src/lib/providers/openai-compatible.js +361 -0
- package/src/lib/providers/openai-compatible.js.map +1 -0
- package/src/lib/providers/registry.d.ts +49 -0
- package/src/lib/providers/registry.js +71 -0
- package/src/lib/providers/registry.js.map +1 -0
- package/src/lib/providers/routing.d.ts +98 -0
- package/src/lib/providers/routing.js +450 -0
- package/src/lib/providers/routing.js.map +1 -0
- package/src/lib/runtime/ai-abuse-guards.d.ts +113 -0
- package/src/lib/runtime/ai-abuse-guards.js +148 -0
- package/src/lib/runtime/ai-abuse-guards.js.map +1 -0
- package/src/lib/runtime/ai-component-bindings.d.ts +67 -0
- package/src/lib/runtime/ai-component-bindings.js +106 -0
- package/src/lib/runtime/ai-component-bindings.js.map +1 -0
- package/src/lib/runtime/ai-device-audit.d.ts +109 -0
- package/src/lib/runtime/ai-device-audit.js +97 -0
- package/src/lib/runtime/ai-device-audit.js.map +1 -0
- package/src/lib/runtime/ai-doctrine-validators.d.ts +720 -0
- package/src/lib/runtime/ai-doctrine-validators.js +3133 -0
- package/src/lib/runtime/ai-doctrine-validators.js.map +1 -0
- package/src/lib/runtime/ai-doctrine.d.ts +372 -0
- package/src/lib/runtime/ai-doctrine.js +944 -0
- package/src/lib/runtime/ai-doctrine.js.map +1 -0
- package/src/lib/runtime/ai-eval-live.d.ts +321 -0
- package/src/lib/runtime/ai-eval-live.js +1257 -0
- package/src/lib/runtime/ai-eval-live.js.map +1 -0
- package/src/lib/runtime/ai-eval-memory-firestore.d.ts +51 -0
- package/src/lib/runtime/ai-eval-memory-firestore.js +183 -0
- package/src/lib/runtime/ai-eval-memory-firestore.js.map +1 -0
- package/src/lib/runtime/ai-eval.d.ts +441 -0
- package/src/lib/runtime/ai-eval.js +1151 -0
- package/src/lib/runtime/ai-eval.js.map +1 -0
- package/src/lib/runtime/ai-gate.d.ts +130 -0
- package/src/lib/runtime/ai-gate.js +272 -0
- package/src/lib/runtime/ai-gate.js.map +1 -0
- package/src/lib/runtime/ai-generation-bounds.d.ts +24 -0
- package/src/lib/runtime/ai-generation-bounds.js +23 -0
- package/src/lib/runtime/ai-generation-bounds.js.map +1 -0
- package/src/lib/runtime/ai-insight-check.d.ts +76 -0
- package/src/lib/runtime/ai-insight-check.js +281 -0
- package/src/lib/runtime/ai-insight-check.js.map +1 -0
- package/src/lib/runtime/ai-node-tree.d.ts +181 -0
- package/src/lib/runtime/ai-node-tree.js +931 -0
- package/src/lib/runtime/ai-node-tree.js.map +1 -0
- package/src/lib/runtime/ai-page-links.d.ts +79 -0
- package/src/lib/runtime/ai-page-links.js +135 -0
- package/src/lib/runtime/ai-page-links.js.map +1 -0
- package/src/lib/runtime/ai-palette.d.ts +252 -0
- package/src/lib/runtime/ai-palette.generated.d.ts +34 -0
- package/src/lib/runtime/ai-palette.generated.js +5263 -0
- package/src/lib/runtime/ai-palette.generated.js.map +1 -0
- package/src/lib/runtime/ai-palette.js +187 -0
- package/src/lib/runtime/ai-palette.js.map +1 -0
- package/src/lib/runtime/ai-products-generation.d.ts +107 -0
- package/src/lib/runtime/ai-products-generation.js +250 -0
- package/src/lib/runtime/ai-products-generation.js.map +1 -0
- package/src/lib/runtime/ai-repeated-items.d.ts +95 -0
- package/src/lib/runtime/ai-repeated-items.js +397 -0
- package/src/lib/runtime/ai-repeated-items.js.map +1 -0
- package/src/lib/runtime/ai-runtime.d.ts +148 -0
- package/src/lib/runtime/ai-runtime.js +237 -0
- package/src/lib/runtime/ai-runtime.js.map +1 -0
- package/src/lib/runtime/ai-template-examples.d.ts +71 -0
- package/src/lib/runtime/ai-template-examples.js +135 -0
- package/src/lib/runtime/ai-template-examples.js.map +1 -0
- package/src/lib/runtime/assist-answer-cache.d.ts +80 -0
- package/src/lib/runtime/assist-answer-cache.js +184 -0
- package/src/lib/runtime/assist-answer-cache.js.map +1 -0
- package/src/lib/runtime/seo-audit.d.ts +93 -0
- package/src/lib/runtime/seo-audit.js +260 -0
- package/src/lib/runtime/seo-audit.js.map +1 -0
- package/src/lib/runtime/seo-content-fixes.d.ts +41 -0
- package/src/lib/runtime/seo-content-fixes.js +168 -0
- package/src/lib/runtime/seo-content-fixes.js.map +1 -0
- package/src/lib/runtime/seo-fields.d.ts +152 -0
- package/src/lib/runtime/seo-fields.js +215 -0
- package/src/lib/runtime/seo-fields.js.map +1 -0
- package/src/lib/runtime/seo-page-facts.d.ts +61 -0
- package/src/lib/runtime/seo-page-facts.js +150 -0
- package/src/lib/runtime/seo-page-facts.js.map +1 -0
- package/src/lib/runtime/site-inventory.d.ts +63 -0
- package/src/lib/runtime/site-inventory.js +230 -0
- package/src/lib/runtime/site-inventory.js.map +1 -0
- package/src/lib/server/ai-admin-org.d.ts +33 -0
- package/src/lib/server/ai-admin-org.js +381 -0
- package/src/lib/server/ai-admin-org.js.map +1 -0
- package/src/lib/server/ai-admin-orgs-spend.d.ts +40 -0
- package/src/lib/server/ai-admin-orgs-spend.js +129 -0
- package/src/lib/server/ai-admin-orgs-spend.js.map +1 -0
- package/src/lib/server/ai-admin-overage.d.ts +19 -0
- package/src/lib/server/ai-admin-overage.js +246 -0
- package/src/lib/server/ai-admin-overage.js.map +1 -0
- package/src/lib/server/ai-admin-signals.d.ts +34 -0
- package/src/lib/server/ai-admin-signals.js +330 -0
- package/src/lib/server/ai-admin-signals.js.map +1 -0
- package/src/lib/server/ai-admin-user.d.ts +27 -0
- package/src/lib/server/ai-admin-user.js +128 -0
- package/src/lib/server/ai-admin-user.js.map +1 -0
- package/src/lib/server/ai-allotments.d.ts +27 -0
- package/src/lib/server/ai-allotments.js +544 -0
- package/src/lib/server/ai-allotments.js.map +1 -0
- package/src/lib/server/ai-assist-prompts.d.ts +102 -0
- package/src/lib/server/ai-assist-prompts.js +207 -0
- package/src/lib/server/ai-assist-prompts.js.map +1 -0
- package/src/lib/server/ai-assist.d.ts +119 -0
- package/src/lib/server/ai-assist.js +517 -0
- package/src/lib/server/ai-assist.js.map +1 -0
- package/src/lib/server/ai-crm-answer.d.ts +30 -0
- package/src/lib/server/ai-crm-answer.js +98 -0
- package/src/lib/server/ai-crm-answer.js.map +1 -0
- package/src/lib/server/ai-generate-component.d.ts +111 -0
- package/src/lib/server/ai-generate-component.js +643 -0
- package/src/lib/server/ai-generate-component.js.map +1 -0
- package/src/lib/server/ai-host-permissions.d.ts +46 -0
- package/src/lib/server/ai-host-permissions.js +204 -0
- package/src/lib/server/ai-host-permissions.js.map +1 -0
- package/src/lib/server/ai-insight-answer.d.ts +30 -0
- package/src/lib/server/ai-insight-answer.js +83 -0
- package/src/lib/server/ai-insight-answer.js.map +1 -0
- package/src/lib/server/ai-insight-digest-route.d.ts +30 -0
- package/src/lib/server/ai-insight-digest-route.js +156 -0
- package/src/lib/server/ai-insight-digest-route.js.map +1 -0
- package/src/lib/server/ai-jobs-batch.d.ts +48 -0
- package/src/lib/server/ai-jobs-batch.js +306 -0
- package/src/lib/server/ai-jobs-batch.js.map +1 -0
- package/src/lib/server/ai-jobs-beat-route.d.ts +36 -0
- package/src/lib/server/ai-jobs-beat-route.js +86 -0
- package/src/lib/server/ai-jobs-beat-route.js.map +1 -0
- package/src/lib/server/ai-jobs-cancel.d.ts +30 -0
- package/src/lib/server/ai-jobs-cancel.js +74 -0
- package/src/lib/server/ai-jobs-cancel.js.map +1 -0
- package/src/lib/server/ai-jobs-events-route.d.ts +31 -0
- package/src/lib/server/ai-jobs-events-route.js +51 -0
- package/src/lib/server/ai-jobs-events-route.js.map +1 -0
- package/src/lib/server/ai-jobs-events.d.ts +55 -0
- package/src/lib/server/ai-jobs-events.js +144 -0
- package/src/lib/server/ai-jobs-events.js.map +1 -0
- package/src/lib/server/ai-jobs-gate.d.ts +47 -0
- package/src/lib/server/ai-jobs-gate.js +106 -0
- package/src/lib/server/ai-jobs-gate.js.map +1 -0
- package/src/lib/server/ai-jobs-resume.d.ts +23 -0
- package/src/lib/server/ai-jobs-resume.js +209 -0
- package/src/lib/server/ai-jobs-resume.js.map +1 -0
- package/src/lib/server/ai-jobs-route.d.ts +32 -0
- package/src/lib/server/ai-jobs-route.js +307 -0
- package/src/lib/server/ai-jobs-route.js.map +1 -0
- package/src/lib/server/ai-models.d.ts +18 -0
- package/src/lib/server/ai-models.js +134 -0
- package/src/lib/server/ai-models.js.map +1 -0
- package/src/lib/server/ai-seo-apply.d.ts +53 -0
- package/src/lib/server/ai-seo-apply.js +294 -0
- package/src/lib/server/ai-seo-apply.js.map +1 -0
- package/src/lib/server/ai-usage.d.ts +18 -0
- package/src/lib/server/ai-usage.js +220 -0
- package/src/lib/server/ai-usage.js.map +1 -0
- package/src/lib/server/assist-chat.d.ts +234 -0
- package/src/lib/server/assist-chat.js +1446 -0
- package/src/lib/server/assist-chat.js.map +1 -0
- package/src/lib/server/assist-edit-applied.d.ts +22 -0
- package/src/lib/server/assist-edit-applied.js +239 -0
- package/src/lib/server/assist-edit-applied.js.map +1 -0
- package/src/lib/server/assist-edit.d.ts +124 -0
- package/src/lib/server/assist-edit.js +1000 -0
- package/src/lib/server/assist-edit.js.map +1 -0
- package/src/lib/server/assist-feedback.d.ts +31 -0
- package/src/lib/server/assist-feedback.js +115 -0
- package/src/lib/server/assist-feedback.js.map +1 -0
- package/src/lib/server/assist-view-context.d.ts +343 -0
- package/src/lib/server/assist-view-context.js +690 -0
- package/src/lib/server/assist-view-context.js.map +1 -0
- package/src/lib/server/billing-credits.d.ts +59 -0
- package/src/lib/server/billing-credits.js +146 -0
- package/src/lib/server/billing-credits.js.map +1 -0
- package/src/lib/server/billing-overage.d.ts +19 -0
- package/src/lib/server/billing-overage.js +337 -0
- package/src/lib/server/billing-overage.js.map +1 -0
- package/src/lib/server.d.ts +32 -0
- package/src/lib/server.js +265 -0
- package/src/lib/server.js.map +1 -0
- package/src/lib/subprocessors.d.ts +18 -0
- package/src/lib/subprocessors.js +52 -0
- package/src/lib/subprocessors.js.map +1 -0
- package/src/lib/tools/ai-component-tool.d.ts +99 -0
- package/src/lib/tools/ai-component-tool.js +369 -0
- package/src/lib/tools/ai-component-tool.js.map +1 -0
- package/src/lib/tools/ai-crm-tool.d.ts +106 -0
- package/src/lib/tools/ai-crm-tool.js +488 -0
- package/src/lib/tools/ai-crm-tool.js.map +1 -0
- package/src/lib/tools/ai-duplicate-resource-tool.d.ts +71 -0
- package/src/lib/tools/ai-duplicate-resource-tool.js +164 -0
- package/src/lib/tools/ai-duplicate-resource-tool.js.map +1 -0
- package/src/lib/tools/ai-experiment-tool.d.ts +40 -0
- package/src/lib/tools/ai-experiment-tool.js +155 -0
- package/src/lib/tools/ai-experiment-tool.js.map +1 -0
- package/src/lib/tools/ai-insight-tool.d.ts +46 -0
- package/src/lib/tools/ai-insight-tool.js +200 -0
- package/src/lib/tools/ai-insight-tool.js.map +1 -0
- package/src/lib/tools/ai-inventory-lookup-tool.d.ts +86 -0
- package/src/lib/tools/ai-inventory-lookup-tool.js +164 -0
- package/src/lib/tools/ai-inventory-lookup-tool.js.map +1 -0
- package/src/lib/tools/ai-products-tool.d.ts +65 -0
- package/src/lib/tools/ai-products-tool.js +644 -0
- package/src/lib/tools/ai-products-tool.js.map +1 -0
- package/src/lib/tools/ai-seo-tool.d.ts +162 -0
- package/src/lib/tools/ai-seo-tool.js +546 -0
- package/src/lib/tools/ai-seo-tool.js.map +1 -0
- package/src/lib/tools/ai-theme-tool.d.ts +101 -0
- package/src/lib/tools/ai-theme-tool.js +562 -0
- package/src/lib/tools/ai-theme-tool.js.map +1 -0
- package/src/lib/tools/ai-workflow-tool.d.ts +166 -0
- package/src/lib/tools/ai-workflow-tool.js +860 -0
- package/src/lib/tools/ai-workflow-tool.js.map +1 -0
- package/src/lib/usage/ai-allotment-alerts.d.ts +72 -0
- package/src/lib/usage/ai-allotment-alerts.js +157 -0
- package/src/lib/usage/ai-allotment-alerts.js.map +1 -0
- package/src/lib/usage/ai-allotments.d.ts +125 -0
- package/src/lib/usage/ai-allotments.js +239 -0
- package/src/lib/usage/ai-allotments.js.map +1 -0
- package/src/lib/usage/ai-model-sample.d.ts +36 -0
- package/src/lib/usage/ai-model-sample.js +68 -0
- package/src/lib/usage/ai-model-sample.js.map +1 -0
- package/src/lib/usage/ai-usage-alerts.d.ts +55 -0
- package/src/lib/usage/ai-usage-alerts.js +114 -0
- package/src/lib/usage/ai-usage-alerts.js.map +1 -0
- package/src/lib/usage/ai-usage-by-user.d.ts +161 -0
- package/src/lib/usage/ai-usage-by-user.js +211 -0
- package/src/lib/usage/ai-usage-by-user.js.map +1 -0
- package/src/lib/usage/ai-usage-eraser.d.ts +29 -0
- package/src/lib/usage/ai-usage-eraser.js +40 -0
- package/src/lib/usage/ai-usage-eraser.js.map +1 -0
- package/src/lib/usage/ai-usage-meter.d.ts +39 -0
- package/src/lib/usage/ai-usage-meter.js +85 -0
- package/src/lib/usage/ai-usage-meter.js.map +1 -0
- package/src/lib/usage/ai-usage-wire.d.ts +184 -0
- package/src/lib/usage/ai-usage-wire.js +98 -0
- package/src/lib/usage/ai-usage-wire.js.map +1 -0
- package/src/lib/usage/assist-ceiling.d.ts +87 -0
- package/src/lib/usage/assist-ceiling.js +110 -0
- package/src/lib/usage/assist-ceiling.js.map +1 -0
- package/src/lib/usage/assist-free-taste.d.ts +225 -0
- package/src/lib/usage/assist-free-taste.js +308 -0
- package/src/lib/usage/assist-free-taste.js.map +1 -0
- package/src/lib/usage/assist-refusals.d.ts +69 -0
- package/src/lib/usage/assist-refusals.js +79 -0
- package/src/lib/usage/assist-refusals.js.map +1 -0
- package/src/lib/usage/assist-signal-mining.d.ts +375 -0
- package/src/lib/usage/assist-signal-mining.js +344 -0
- package/src/lib/usage/assist-signal-mining.js.map +1 -0
- package/src/lib/usage/assist-usage.d.ts +571 -0
- package/src/lib/usage/assist-usage.js +978 -0
- package/src/lib/usage/assist-usage.js.map +1 -0
- package/src/lib/usage/staff-org-ai.d.ts +242 -0
- package/src/lib/usage/staff-org-ai.js +173 -0
- package/src/lib/usage/staff-org-ai.js.map +1 -0
- package/src/lib/usage/staff-org-usage-ai.d.ts +83 -0
- package/src/lib/usage/staff-org-usage-ai.js +59 -0
- package/src/lib/usage/staff-org-usage-ai.js.map +1 -0
- package/src/lib/usage/staff-orgs-ai-spend.d.ts +83 -0
- package/src/lib/usage/staff-orgs-ai-spend.js +114 -0
- 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;
|