@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,102 @@
|
|
|
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 AiSystemBlock, type AiTool } from '../runtime/ai-runtime';
|
|
18
|
+
import type { AiResult } from '../providers/contract';
|
|
19
|
+
/**
|
|
20
|
+
* The copy assistant's prompts and its section tool (AGL-2937), by their own
|
|
21
|
+
* module so a spec can read them without a Firestore, an ID token or a
|
|
22
|
+
* provider — the handler beside them needs all three.
|
|
23
|
+
*
|
|
24
|
+
* ── Why the section mode answers through a tool ───────────────────────────
|
|
25
|
+
*
|
|
26
|
+
* It asked for "ONLY a JSON object, no prose or code fences" and then parsed
|
|
27
|
+
* whatever came back, stripping a fence if it found one. When that parse
|
|
28
|
+
* failed the handler answered 502 and the tokens were already spent: the
|
|
29
|
+
* whole request, prompt and answer, bought nothing, and the member's next
|
|
30
|
+
* move is to press the button again and spend it twice. A strict tool is the
|
|
31
|
+
* cheaper shape for exactly that reason — the answer arrives as validated
|
|
32
|
+
* arguments rather than as text that has to be guessed at — and it is what
|
|
33
|
+
* AGL-2937 asks of every door.
|
|
34
|
+
*
|
|
35
|
+
* The parse stays as a fallback. A provider whose adapter has no tool
|
|
36
|
+
* support, or a model that answers in prose anyway, still gets read rather
|
|
37
|
+
* than refused: the tool is how the answer is asked for, not the only way it
|
|
38
|
+
* can arrive.
|
|
39
|
+
*
|
|
40
|
+
* ── Why the flat node list ────────────────────────────────────────────────
|
|
41
|
+
*
|
|
42
|
+
* A strict schema forbids additional properties, so a map keyed by node id
|
|
43
|
+
* cannot be described in one: every key would have to be a declared
|
|
44
|
+
* property. The tool therefore takes a LIST of nodes, each naming its own id
|
|
45
|
+
* and its children by id, and `readAssistSection` rebuilds the map the
|
|
46
|
+
* besigner consumer already reads. The same reason `assistEditTool` takes
|
|
47
|
+
* name/value pairs rather than a props object.
|
|
48
|
+
*
|
|
49
|
+
* ── Caching ───────────────────────────────────────────────────────────────
|
|
50
|
+
*
|
|
51
|
+
* Each mode's static text carries a breakpoint. None of the three is long
|
|
52
|
+
* enough for its model to cache today — `runtime/ai-prompt-cache.spec.ts`
|
|
53
|
+
* measures all three against their minimums and records the verdict — so the
|
|
54
|
+
* marker is a statement about the block rather than a saving. It costs
|
|
55
|
+
* nothing, it is correct if a mode is ever served by a model with a lower
|
|
56
|
+
* minimum, and the ledger is what says whether it pays.
|
|
57
|
+
*/
|
|
58
|
+
export type AiAssistMode = 'element' | 'blog' | 'section';
|
|
59
|
+
/**
|
|
60
|
+
* One mode's system blocks: the acceptable-use rules ahead of the mode's own
|
|
61
|
+
* prompt (AGL-2925), as one cached block with no per-org byte in it.
|
|
62
|
+
*/
|
|
63
|
+
export declare function assistModeSystemBlocks(mode: AiAssistMode): AiSystemBlock[];
|
|
64
|
+
export declare const ASSIST_SECTION_TOOL_NAME = "submit_section";
|
|
65
|
+
/**
|
|
66
|
+
* The strict tool a generated section arrives through. `componentId` is an
|
|
67
|
+
* enum of the marketplace allowlist — the same list the sanitizer holds the
|
|
68
|
+
* answer to afterward — so an unpublishable component is refused by the
|
|
69
|
+
* schema before it costs a re-ask.
|
|
70
|
+
*/
|
|
71
|
+
export declare function assistSectionTool(): AiTool;
|
|
72
|
+
/** The sanitized section, in the shape the besigner consumer already reads. */
|
|
73
|
+
export interface AssistSection {
|
|
74
|
+
rootId: string;
|
|
75
|
+
nodes: Record<string, unknown>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* What reading a section answer came to. Discriminated by a string rather
|
|
79
|
+
* than a boolean, like every other result in the plugin: this tree compiles
|
|
80
|
+
* without `strictNullChecks`, where a `true`/`false` discriminant does not
|
|
81
|
+
* narrow.
|
|
82
|
+
*/
|
|
83
|
+
export type AssistSectionRead = {
|
|
84
|
+
status: 'ok';
|
|
85
|
+
section: AssistSection;
|
|
86
|
+
}
|
|
87
|
+
/** Neither a tool call nor JSON: nothing could be read out of the answer. */
|
|
88
|
+
| {
|
|
89
|
+
status: 'unreadable';
|
|
90
|
+
error: string;
|
|
91
|
+
}
|
|
92
|
+
/** Read, and refused by the sanitizer every marketplace install passes. */
|
|
93
|
+
| {
|
|
94
|
+
status: 'rejected';
|
|
95
|
+
error: string;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Read a section answer: the tool call first, the text parse behind it, then
|
|
99
|
+
* the marketplace sanitizer every generated subtree has always passed before
|
|
100
|
+
* it reaches a canvas.
|
|
101
|
+
*/
|
|
102
|
+
export declare function readAssistSection(result: AiResult): AssistSectionRead;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ import { MARKETPLACE_COMPONENT_ID_ALLOWLIST, sanitizeMarketplaceDefinition } from "@aglyn/aglyn/app-utils/node-definition-sanitizer";
|
|
17
|
+
import { AI_PALETTE } from "../runtime/ai-palette.generated.js";
|
|
18
|
+
import { AI_ACCEPTABLE_USE_BLOCK } from "../runtime/ai-runtime.js";
|
|
19
|
+
/** The mode prompts. Static text: no byte of any workspace is in one. */ const MODE_PROMPT = {
|
|
20
|
+
element: 'You write website copy inside a site builder. Reply with ONLY the final text for the element — no quotes, preamble, or markdown. Keep roughly the same length and role as the current text unless the instruction says otherwise.',
|
|
21
|
+
blog: 'You write blog posts inside a site builder. Reply with ONLY the post body in markdown-lite: **bold**, *italic*, ## headings, - lists, [links](https://url). No front matter, title line, or preamble — the title renders separately.',
|
|
22
|
+
section: 'You design one website section inside a site builder. Answer by calling ' + `${'submit_section'} exactly once, with a flat list of nodes: each node ` + 'names its own id, the component it is, its parent (empty for the root) ' + 'and its children by id, and fills props as name/value pairs. Useful ' + 'props — muiStack: direction (row|column), spacing, justifyContent, ' + 'alignItems; muiTypography: children, variant (h1..h6, body1, ' + 'subtitle1); muiButton: children, variant (contained|outlined), color; ' + 'image: src, alt; muiContainer: maxWidth (sm|md|lg). Keep it small: 4-12 ' + 'nodes, one root container. Leave image src empty. Write real copy, not ' + 'lorem ipsum.'
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* One mode's system blocks: the acceptable-use rules ahead of the mode's own
|
|
26
|
+
* prompt (AGL-2925), as one cached block with no per-org byte in it.
|
|
27
|
+
*/ export function assistModeSystemBlocks(mode) {
|
|
28
|
+
return [
|
|
29
|
+
{
|
|
30
|
+
text: `${AI_ACCEPTABLE_USE_BLOCK}\n\n${MODE_PROMPT[mode]}`,
|
|
31
|
+
cacheBreakpoint: true
|
|
32
|
+
}
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
export const ASSIST_SECTION_TOOL_NAME = 'submit_section';
|
|
36
|
+
const STRING = {
|
|
37
|
+
type: 'string'
|
|
38
|
+
};
|
|
39
|
+
const strictObject = (properties)=>({
|
|
40
|
+
type: 'object',
|
|
41
|
+
properties,
|
|
42
|
+
required: Object.keys(properties),
|
|
43
|
+
additionalProperties: false
|
|
44
|
+
});
|
|
45
|
+
/**
|
|
46
|
+
* The strict tool a generated section arrives through. `componentId` is an
|
|
47
|
+
* enum of the marketplace allowlist — the same list the sanitizer holds the
|
|
48
|
+
* answer to afterward — so an unpublishable component is refused by the
|
|
49
|
+
* schema before it costs a re-ask.
|
|
50
|
+
*/ export function assistSectionTool() {
|
|
51
|
+
const pair = strictObject({
|
|
52
|
+
name: STRING,
|
|
53
|
+
value: STRING
|
|
54
|
+
});
|
|
55
|
+
const node = strictObject({
|
|
56
|
+
id: STRING,
|
|
57
|
+
componentId: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
enum: [
|
|
60
|
+
...MARKETPLACE_COMPONENT_ID_ALLOWLIST
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
parentId: STRING,
|
|
64
|
+
children: {
|
|
65
|
+
type: 'array',
|
|
66
|
+
items: STRING
|
|
67
|
+
},
|
|
68
|
+
props: {
|
|
69
|
+
type: 'array',
|
|
70
|
+
items: pair
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
name: ASSIST_SECTION_TOOL_NAME,
|
|
75
|
+
description: 'Submit the section you designed, as a flat list of nodes. The first ' + 'node with an empty parentId is the root. The member reviews the ' + 'section and places it, or discards it.',
|
|
76
|
+
inputSchema: {
|
|
77
|
+
type: 'object',
|
|
78
|
+
properties: {
|
|
79
|
+
nodes: {
|
|
80
|
+
type: 'array',
|
|
81
|
+
items: node
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
required: [
|
|
85
|
+
'nodes'
|
|
86
|
+
],
|
|
87
|
+
additionalProperties: false
|
|
88
|
+
},
|
|
89
|
+
strict: true
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const isRecord = (value)=>typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
93
|
+
/**
|
|
94
|
+
* A pair's value in the type the component's own schema declares for that
|
|
95
|
+
* prop, since a strict tool can only carry strings. `children` stays text
|
|
96
|
+
* whatever a schema says: a number in it is copy a visitor reads, not a
|
|
97
|
+
* count.
|
|
98
|
+
*/ function propValue(componentId, name, value) {
|
|
99
|
+
var _AI_PALETTE_componentId_propsSchema_properties, _AI_PALETTE_componentId_propsSchema, _AI_PALETTE_componentId;
|
|
100
|
+
if (name === 'children') return value;
|
|
101
|
+
const declared = (_AI_PALETTE_componentId = AI_PALETTE[componentId]) == null ? void 0 : (_AI_PALETTE_componentId_propsSchema = _AI_PALETTE_componentId.propsSchema) == null ? void 0 : (_AI_PALETTE_componentId_propsSchema_properties = _AI_PALETTE_componentId_propsSchema.properties) == null ? void 0 : _AI_PALETTE_componentId_propsSchema_properties[name];
|
|
102
|
+
const type = declared == null ? void 0 : declared.type;
|
|
103
|
+
if (type === 'boolean') return value === 'true';
|
|
104
|
+
if (type === 'number' || type === 'integer') {
|
|
105
|
+
const parsed = Number(value);
|
|
106
|
+
return Number.isFinite(parsed) ? parsed : value;
|
|
107
|
+
}
|
|
108
|
+
if (type) return value;
|
|
109
|
+
// No schema for this prop: a bare number is read as one, so `spacing: "2"`
|
|
110
|
+
// does not reach the canvas as text. The palette's own typing wins above,
|
|
111
|
+
// which is why muiStack's string-typed `spacing` stays a string.
|
|
112
|
+
const parsed = Number(value);
|
|
113
|
+
return value.trim() !== '' && Number.isFinite(parsed) ? parsed : value;
|
|
114
|
+
}
|
|
115
|
+
/** The flat node list as the stored map: `{ $id, componentId, parentId, props, nodes }`. */ function definitionFromNodes(nodes) {
|
|
116
|
+
var _ref;
|
|
117
|
+
const ids = new Set(nodes.map((node)=>node.id));
|
|
118
|
+
const root = nodes.find((node)=>!node.parentId || !ids.has(node.parentId));
|
|
119
|
+
const map = {};
|
|
120
|
+
for (const node of nodes){
|
|
121
|
+
const props = {};
|
|
122
|
+
for (const { name, value } of node.props){
|
|
123
|
+
if (name) props[name] = propValue(node.componentId, name, value);
|
|
124
|
+
}
|
|
125
|
+
map[node.id] = {
|
|
126
|
+
$id: node.id,
|
|
127
|
+
componentId: node.componentId,
|
|
128
|
+
parentId: node === root ? null : node.parentId,
|
|
129
|
+
props,
|
|
130
|
+
nodes: node.children.filter((child)=>ids.has(child))
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
rootId: (_ref = root == null ? void 0 : root.id) != null ? _ref : '',
|
|
135
|
+
nodes: map
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** A tool call's arguments as nodes, or `null` when the shape is not one. */ function nodesFromToolUse(input) {
|
|
139
|
+
const raw = input['nodes'];
|
|
140
|
+
if (!Array.isArray(raw) || !raw.length) return null;
|
|
141
|
+
const nodes = [];
|
|
142
|
+
for (const entry of raw){
|
|
143
|
+
var _entry_id, _entry_componentId, _entry_parentId;
|
|
144
|
+
if (!isRecord(entry)) return null;
|
|
145
|
+
const id = String((_entry_id = entry['id']) != null ? _entry_id : '');
|
|
146
|
+
const componentId = String((_entry_componentId = entry['componentId']) != null ? _entry_componentId : '');
|
|
147
|
+
if (!id || !componentId) return null;
|
|
148
|
+
const props = Array.isArray(entry['props']) ? entry['props'] : [];
|
|
149
|
+
nodes.push({
|
|
150
|
+
id,
|
|
151
|
+
componentId,
|
|
152
|
+
parentId: String((_entry_parentId = entry['parentId']) != null ? _entry_parentId : ''),
|
|
153
|
+
children: (Array.isArray(entry['children']) ? entry['children'] : []).map(String),
|
|
154
|
+
props: props.filter(isRecord).map((pair)=>{
|
|
155
|
+
var _pair_name, _pair_value;
|
|
156
|
+
return {
|
|
157
|
+
name: String((_pair_name = pair['name']) != null ? _pair_name : ''),
|
|
158
|
+
value: String((_pair_value = pair['value']) != null ? _pair_value : '')
|
|
159
|
+
};
|
|
160
|
+
})
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return nodes;
|
|
164
|
+
}
|
|
165
|
+
/** The old shape: a JSON object of `{ rootId, nodes }`, possibly fenced. */ function definitionFromText(text) {
|
|
166
|
+
var _parsed_rootId;
|
|
167
|
+
const raw = text.trim().replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/, '');
|
|
168
|
+
let parsed;
|
|
169
|
+
try {
|
|
170
|
+
parsed = JSON.parse(raw);
|
|
171
|
+
} catch (unused) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
if (!isRecord(parsed)) return null;
|
|
175
|
+
return {
|
|
176
|
+
rootId: String((_parsed_rootId = parsed['rootId']) != null ? _parsed_rootId : ''),
|
|
177
|
+
nodes: isRecord(parsed['nodes']) ? parsed['nodes'] : {}
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Read a section answer: the tool call first, the text parse behind it, then
|
|
182
|
+
* the marketplace sanitizer every generated subtree has always passed before
|
|
183
|
+
* it reaches a canvas.
|
|
184
|
+
*/ export function readAssistSection(result) {
|
|
185
|
+
const call = result.kind === 'completion' ? result.toolUse.find((use)=>use.name === ASSIST_SECTION_TOOL_NAME) : undefined;
|
|
186
|
+
const nodes = call ? nodesFromToolUse(call.input) : null;
|
|
187
|
+
const definition = nodes ? definitionFromNodes(nodes) : definitionFromText(result.kind === 'completion' ? result.text : '');
|
|
188
|
+
if (!definition) return {
|
|
189
|
+
status: 'unreadable',
|
|
190
|
+
error: 'AI returned invalid JSON'
|
|
191
|
+
};
|
|
192
|
+
const sanitized = sanitizeMarketplaceDefinition(definition);
|
|
193
|
+
// `=== false`, not `!`: see `AssistSectionRead`.
|
|
194
|
+
if (sanitized.ok === false) return {
|
|
195
|
+
status: 'rejected',
|
|
196
|
+
error: sanitized.error
|
|
197
|
+
};
|
|
198
|
+
return {
|
|
199
|
+
status: 'ok',
|
|
200
|
+
section: {
|
|
201
|
+
rootId: sanitized.rootId,
|
|
202
|
+
nodes: sanitized.nodes
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
//# sourceMappingURL=ai-assist-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/server/ai-assist-prompts.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 {\n MARKETPLACE_COMPONENT_ID_ALLOWLIST,\n sanitizeMarketplaceDefinition,\n} from '@aglyn/aglyn/app-utils/node-definition-sanitizer'\nimport { AI_PALETTE } from '../runtime/ai-palette.generated'\nimport { AI_ACCEPTABLE_USE_BLOCK, type AiSystemBlock, type AiTool } from '../runtime/ai-runtime'\nimport type { AiResult } from '../providers/contract'\n\n/**\n * The copy assistant's prompts and its section tool (AGL-2937), by their own\n * module so a spec can read them without a Firestore, an ID token or a\n * provider — the handler beside them needs all three.\n *\n * ── Why the section mode answers through a tool ───────────────────────────\n *\n * It asked for \"ONLY a JSON object, no prose or code fences\" and then parsed\n * whatever came back, stripping a fence if it found one. When that parse\n * failed the handler answered 502 and the tokens were already spent: the\n * whole request, prompt and answer, bought nothing, and the member's next\n * move is to press the button again and spend it twice. A strict tool is the\n * cheaper shape for exactly that reason — the answer arrives as validated\n * arguments rather than as text that has to be guessed at — and it is what\n * AGL-2937 asks of every door.\n *\n * The parse stays as a fallback. A provider whose adapter has no tool\n * support, or a model that answers in prose anyway, still gets read rather\n * than refused: the tool is how the answer is asked for, not the only way it\n * can arrive.\n *\n * ── Why the flat node list ────────────────────────────────────────────────\n *\n * A strict schema forbids additional properties, so a map keyed by node id\n * cannot be described in one: every key would have to be a declared\n * property. The tool therefore takes a LIST of nodes, each naming its own id\n * and its children by id, and `readAssistSection` rebuilds the map the\n * besigner consumer already reads. The same reason `assistEditTool` takes\n * name/value pairs rather than a props object.\n *\n * ── Caching ───────────────────────────────────────────────────────────────\n *\n * Each mode's static text carries a breakpoint. None of the three is long\n * enough for its model to cache today — `runtime/ai-prompt-cache.spec.ts`\n * measures all three against their minimums and records the verdict — so the\n * marker is a statement about the block rather than a saving. It costs\n * nothing, it is correct if a mode is ever served by a model with a lower\n * minimum, and the ledger is what says whether it pays.\n */\n\nexport type AiAssistMode = 'element' | 'blog' | 'section'\n\n/** The mode prompts. Static text: no byte of any workspace is in one. */\nconst MODE_PROMPT: Readonly<Record<AiAssistMode, string>> = {\n element:\n 'You write website copy inside a site builder. Reply with ONLY the final text for the element — no quotes, preamble, or markdown. Keep roughly the same length and role as the current text unless the instruction says otherwise.',\n blog:\n 'You write blog posts inside a site builder. Reply with ONLY the post body in markdown-lite: **bold**, *italic*, ## headings, - lists, [links](https://url). No front matter, title line, or preamble — the title renders separately.',\n section:\n 'You design one website section inside a site builder. Answer by calling ' +\n `${'submit_section'} exactly once, with a flat list of nodes: each node ` +\n 'names its own id, the component it is, its parent (empty for the root) ' +\n 'and its children by id, and fills props as name/value pairs. Useful ' +\n 'props — muiStack: direction (row|column), spacing, justifyContent, ' +\n 'alignItems; muiTypography: children, variant (h1..h6, body1, ' +\n 'subtitle1); muiButton: children, variant (contained|outlined), color; ' +\n 'image: src, alt; muiContainer: maxWidth (sm|md|lg). Keep it small: 4-12 ' +\n 'nodes, one root container. Leave image src empty. Write real copy, not ' +\n 'lorem ipsum.',\n}\n\n/**\n * One mode's system blocks: the acceptable-use rules ahead of the mode's own\n * prompt (AGL-2925), as one cached block with no per-org byte in it.\n */\nexport function assistModeSystemBlocks(mode: AiAssistMode): AiSystemBlock[] {\n return [{ text: `${AI_ACCEPTABLE_USE_BLOCK}\\n\\n${MODE_PROMPT[mode]}`, cacheBreakpoint: true }]\n}\n\nexport const ASSIST_SECTION_TOOL_NAME = 'submit_section'\n\nconst STRING = { type: 'string' } as const\n\nconst strictObject = (properties: Record<string, unknown>) => ({\n type: 'object',\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n})\n\n/**\n * The strict tool a generated section arrives through. `componentId` is an\n * enum of the marketplace allowlist — the same list the sanitizer holds the\n * answer to afterward — so an unpublishable component is refused by the\n * schema before it costs a re-ask.\n */\nexport function assistSectionTool(): AiTool {\n const pair = strictObject({ name: STRING, value: STRING })\n const node = strictObject({\n id: STRING,\n componentId: { type: 'string', enum: [...MARKETPLACE_COMPONENT_ID_ALLOWLIST] },\n parentId: STRING,\n children: { type: 'array', items: STRING },\n props: { type: 'array', items: pair },\n })\n return {\n name: ASSIST_SECTION_TOOL_NAME,\n description:\n 'Submit the section you designed, as a flat list of nodes. The first ' +\n 'node with an empty parentId is the root. The member reviews the ' +\n 'section and places it, or discards it.',\n inputSchema: {\n type: 'object',\n properties: { nodes: { type: 'array', items: node } },\n required: ['nodes'],\n additionalProperties: false,\n },\n strict: true,\n }\n}\n\n/** The sanitized section, in the shape the besigner consumer already reads. */\nexport interface AssistSection {\n rootId: string\n nodes: Record<string, unknown>\n}\n\ninterface RawNode {\n id: string\n componentId: string\n parentId: string\n children: string[]\n props: Array<{ name: string; value: string }>\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * A pair's value in the type the component's own schema declares for that\n * prop, since a strict tool can only carry strings. `children` stays text\n * whatever a schema says: a number in it is copy a visitor reads, not a\n * count.\n */\nfunction propValue(componentId: string, name: string, value: string): unknown {\n if (name === 'children') return value\n const declared = AI_PALETTE[componentId]?.propsSchema?.properties?.[name] as\n | { type?: string }\n | undefined\n const type = declared?.type\n if (type === 'boolean') return value === 'true'\n if (type === 'number' || type === 'integer') {\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : value\n }\n if (type) return value\n // No schema for this prop: a bare number is read as one, so `spacing: \"2\"`\n // does not reach the canvas as text. The palette's own typing wins above,\n // which is why muiStack's string-typed `spacing` stays a string.\n const parsed = Number(value)\n return value.trim() !== '' && Number.isFinite(parsed) ? parsed : value\n}\n\n/** The flat node list as the stored map: `{ $id, componentId, parentId, props, nodes }`. */\nfunction definitionFromNodes(nodes: readonly RawNode[]): {\n rootId: string\n nodes: Record<string, unknown>\n} {\n const ids = new Set(nodes.map((node) => node.id))\n const root = nodes.find((node) => !node.parentId || !ids.has(node.parentId))\n const map: Record<string, unknown> = {}\n for (const node of nodes) {\n const props: Record<string, unknown> = {}\n for (const { name, value } of node.props) {\n if (name) props[name] = propValue(node.componentId, name, value)\n }\n map[node.id] = {\n $id: node.id,\n componentId: node.componentId,\n parentId: node === root ? null : node.parentId,\n props,\n nodes: node.children.filter((child) => ids.has(child)),\n }\n }\n return { rootId: root?.id ?? '', nodes: map }\n}\n\n/** A tool call's arguments as nodes, or `null` when the shape is not one. */\nfunction nodesFromToolUse(input: Record<string, unknown>): RawNode[] | null {\n const raw = input['nodes']\n if (!Array.isArray(raw) || !raw.length) return null\n const nodes: RawNode[] = []\n for (const entry of raw) {\n if (!isRecord(entry)) return null\n const id = String(entry['id'] ?? '')\n const componentId = String(entry['componentId'] ?? '')\n if (!id || !componentId) return null\n const props = Array.isArray(entry['props']) ? entry['props'] : []\n nodes.push({\n id,\n componentId,\n parentId: String(entry['parentId'] ?? ''),\n children: (Array.isArray(entry['children']) ? entry['children'] : []).map(String),\n props: props.filter(isRecord).map((pair) => ({\n name: String(pair['name'] ?? ''),\n value: String(pair['value'] ?? ''),\n })),\n })\n }\n return nodes\n}\n\n/** The old shape: a JSON object of `{ rootId, nodes }`, possibly fenced. */\nfunction definitionFromText(text: string): { rootId: string; nodes: Record<string, unknown> } | null {\n const raw = text\n .trim()\n .replace(/^```(?:json)?\\s*/i, '')\n .replace(/\\s*```$/, '')\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return null\n }\n if (!isRecord(parsed)) return null\n return {\n rootId: String(parsed['rootId'] ?? ''),\n nodes: isRecord(parsed['nodes']) ? parsed['nodes'] : {},\n }\n}\n\n/**\n * What reading a section answer came to. Discriminated by a string rather\n * than a boolean, like every other result in the plugin: this tree compiles\n * without `strictNullChecks`, where a `true`/`false` discriminant does not\n * narrow.\n */\nexport type AssistSectionRead =\n | { status: 'ok'; section: AssistSection }\n /** Neither a tool call nor JSON: nothing could be read out of the answer. */\n | { status: 'unreadable'; error: string }\n /** Read, and refused by the sanitizer every marketplace install passes. */\n | { status: 'rejected'; error: string }\n\n/**\n * Read a section answer: the tool call first, the text parse behind it, then\n * the marketplace sanitizer every generated subtree has always passed before\n * it reaches a canvas.\n */\nexport function readAssistSection(result: AiResult): AssistSectionRead {\n const call =\n result.kind === 'completion'\n ? result.toolUse.find((use) => use.name === ASSIST_SECTION_TOOL_NAME)\n : undefined\n const nodes = call ? nodesFromToolUse(call.input) : null\n const definition = nodes\n ? definitionFromNodes(nodes)\n : definitionFromText(result.kind === 'completion' ? result.text : '')\n if (!definition) return { status: 'unreadable', error: 'AI returned invalid JSON' }\n const sanitized = sanitizeMarketplaceDefinition(definition)\n // `=== false`, not `!`: see `AssistSectionRead`.\n if (sanitized.ok === false) return { status: 'rejected', error: sanitized.error }\n return { status: 'ok', section: { rootId: sanitized.rootId, nodes: sanitized.nodes } }\n}\n"],"names":["MARKETPLACE_COMPONENT_ID_ALLOWLIST","sanitizeMarketplaceDefinition","AI_PALETTE","AI_ACCEPTABLE_USE_BLOCK","MODE_PROMPT","element","blog","section","assistModeSystemBlocks","mode","text","cacheBreakpoint","ASSIST_SECTION_TOOL_NAME","STRING","type","strictObject","properties","required","Object","keys","additionalProperties","assistSectionTool","pair","name","value","node","id","componentId","enum","parentId","children","items","props","description","inputSchema","nodes","strict","isRecord","Array","isArray","propValue","declared","propsSchema","parsed","Number","isFinite","trim","definitionFromNodes","ids","Set","map","root","find","has","$id","filter","child","rootId","nodesFromToolUse","input","raw","length","entry","String","push","definitionFromText","replace","JSON","parse","readAssistSection","result","call","kind","toolUse","use","undefined","definition","status","error","sanitized","ok"],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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 PluginApiHandler } from '@aglyn/aglyn/server';
|
|
18
|
+
import { type AiAssistMode } from './ai-assist-prompts';
|
|
19
|
+
/**
|
|
20
|
+
* The model each mode is served by, through the routing table — tiered by
|
|
21
|
+
* what the mode actually asks for (AGL-2486), not one model for all three.
|
|
22
|
+
*
|
|
23
|
+
* - **element** → the fast tier (`copy.element`). Rewriting one button label
|
|
24
|
+
* or one heading to an instruction is a short, bounded transformation with
|
|
25
|
+
* the source text supplied: the least model-shaped work on this route and
|
|
26
|
+
* the highest-volume (a user clicking "improve this" runs it repeatedly on
|
|
27
|
+
* the same element).
|
|
28
|
+
* - **blog** → the balanced tier (`copy.blog`). A post body is real long-form
|
|
29
|
+
* writing, and the difference between tiers is legible to the reader.
|
|
30
|
+
* - **section** → the balanced tier (`copy.section`). A constrained-JSON node
|
|
31
|
+
* subtree over the published-component allowlist is a structured-generation
|
|
32
|
+
* task with a schema the sanitizer will reject if it is got wrong, and a
|
|
33
|
+
* rejected generation costs the whole request rather than part of it.
|
|
34
|
+
*
|
|
35
|
+
* ⚠️ NO PROMPT CACHING IS LOST BY THE FAST RUNG. Each mode's static text now
|
|
36
|
+
* carries a breakpoint (`assistModeSystemBlocks`), but none of the three is
|
|
37
|
+
* long enough for its model to cache: the catalog states each model's
|
|
38
|
+
* minimum and `runtime/ai-prompt-cache.spec.ts` measures every door against
|
|
39
|
+
* it. That is why the tier drop is free here and NOT free on
|
|
40
|
+
* `/api/assist/chat`, whose ~1,030-token prefix clears the balanced tier's
|
|
41
|
+
* minimum and would stop caching entirely on the fast tier's — cheaper per
|
|
42
|
+
* token, dearer per request, and invisible either way without that
|
|
43
|
+
* measurement. See the header of `assist-chat.ts`.
|
|
44
|
+
*
|
|
45
|
+
* The cost meter prices by model id, so the value returned here MUST be the
|
|
46
|
+
* one passed to `recordAssistCost` — same call, same variable. A tiering
|
|
47
|
+
* change that updates the request and not the meter reports one tier's money
|
|
48
|
+
* for another tier's tokens, which is the failure the by-model rate table
|
|
49
|
+
* exists to stop.
|
|
50
|
+
*/
|
|
51
|
+
export declare function assistModelForMode(mode: AiAssistMode): string;
|
|
52
|
+
/** The routing table's step kind for each mode. */
|
|
53
|
+
export declare function assistStepKindForMode(mode: AiAssistMode): 'copy.element' | 'copy.blog' | 'copy.section';
|
|
54
|
+
/**
|
|
55
|
+
* AI assist (AGL-89/130/169), the besigner copy assistant's door — the
|
|
56
|
+
* section mode composes over the published-component allowlist and every
|
|
57
|
+
* generated subtree passes the node-definition sanitizer a marketplace
|
|
58
|
+
* install passes, before it reaches a canvas. `/api/ai/assist` is served by
|
|
59
|
+
* the plugin API dispatcher under the `ai` prefix. Gated on a ready provider,
|
|
60
|
+
* one registered with its key set (501 without, the same degrade pattern as
|
|
61
|
+
* Stripe); auth via Firebase ID token.
|
|
62
|
+
*
|
|
63
|
+
* The provider call is `runAiRequest`, the runtime every AI door shares
|
|
64
|
+
* (AGL-2903). This handler owns the ladder below and the response shapes;
|
|
65
|
+
* `ai-assist-prompts.ts` owns the three prompts and the section tool; the
|
|
66
|
+
* runtime owns the wire, the usage arithmetic and the error boundary. The
|
|
67
|
+
* request keeps the model per mode, the `max_tokens` and the absent
|
|
68
|
+
* `thinking` field it has always had — a fast-tier model rejects an explicit
|
|
69
|
+
* one, and the balanced modes keep the model default.
|
|
70
|
+
*
|
|
71
|
+
* A section arrives through a strict tool (AGL-2937). It used to be asked
|
|
72
|
+
* for as bare JSON and parsed: a parse that failed answered 502 with the
|
|
73
|
+
* tokens already spent, so the whole request bought nothing and the member's
|
|
74
|
+
* next move was to spend it again. The text parse is kept behind the tool,
|
|
75
|
+
* for a provider whose adapter has none.
|
|
76
|
+
*
|
|
77
|
+
* ── The spend ladder (AGL-2073) ────────────────────────────────────────────
|
|
78
|
+
*
|
|
79
|
+
* This route reached the provider behind nothing but an entitlement check. Free
|
|
80
|
+
* orgs could not get in, so the free tier was safe — but for any Pro org it
|
|
81
|
+
* had no rate limit, no quota, no per-org cost telemetry, and it resolved the
|
|
82
|
+
* org from the USER rather than the request, so someone with one paid org got
|
|
83
|
+
* assist charged against whichever org `getOrgForUser` happened to return. One
|
|
84
|
+
* subscription, unbounded and unmeasured provider spend.
|
|
85
|
+
*
|
|
86
|
+
* The ladder now, in order, each rung able to go red on its own:
|
|
87
|
+
* 405 → 501 no ready provider → 401 no token → 400 bad body (the request
|
|
88
|
+
* must NAME the org it is metered against) → 403 not a member of that org →
|
|
89
|
+
* 423 the workspace's AI pause → 403 the member's role lacks `ai.use`, or
|
|
90
|
+
* `ai.generate` for a section (AGL-2927; staff pass) → 403 no `aiAssist`
|
|
91
|
+
* entitlement → 423 org lockdown → 429 rate limit → 429 quota → the model
|
|
92
|
+
* call → meter.
|
|
93
|
+
*
|
|
94
|
+
* Two deliberate choices about which way each rung fails:
|
|
95
|
+
*
|
|
96
|
+
* - **The rate limiter fails SOFT and is not the spend bound.** It is a
|
|
97
|
+
* per-instance in-memory window, so N serverless instances admit N × 20/min;
|
|
98
|
+
* it smooths bursts and nothing more. Treating it as the cap would be the
|
|
99
|
+
* fail-open this issue is about.
|
|
100
|
+
* - **The reservation fails CLOSED.** It is the only global, atomic bound on
|
|
101
|
+
* provider spend, so a reservation that cannot be taken — a Firestore
|
|
102
|
+
* outage, a contended transaction — refuses the request with 503 rather than
|
|
103
|
+
* calling the provider uncapped. An unavailable meter must stop the spending,
|
|
104
|
+
* not wave it through.
|
|
105
|
+
*
|
|
106
|
+
* The reservation is `reserveAssistMessage` — the same shared counter the
|
|
107
|
+
* console chat route moves (AGL-2057), not a second mechanism. That is what
|
|
108
|
+
* closes the "uncapped for paid" hole the earlier audit named: an entitled org
|
|
109
|
+
* carries the monthly runaway guard, and because both doors move the SAME
|
|
110
|
+
* counter, an org's monthly assist budget is shared across them rather than
|
|
111
|
+
* doubled by having two.
|
|
112
|
+
*
|
|
113
|
+
* Metering is `recordAssistCost`, the signal + rollup half of the assist
|
|
114
|
+
* meters WITHOUT the verbatim half: what a customer types here is their own
|
|
115
|
+
* site copy and blog bodies, and retaining that for 180 days is a data flow
|
|
116
|
+
* the published privacy disclosure does not describe. The margin question is
|
|
117
|
+
* answered by the signal alone.
|
|
118
|
+
*/
|
|
119
|
+
export declare const aiAssistHandler: PluginApiHandler;
|