@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,438 @@
|
|
|
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
|
+
* The plan a generation job builds from (AGL-2935): what the job's plan step
|
|
18
|
+
* (`jobs/ai-job-plan-step.ts`) returns, before a single node is generated.
|
|
19
|
+
*
|
|
20
|
+
* This module is the plan's MODEL — its shape, its tool schema and its
|
|
21
|
+
* reader — and imports nothing at runtime, so the doctrine validators, the
|
|
22
|
+
* plan step, the job document and the proposal can all read it without
|
|
23
|
+
* importing each other.
|
|
24
|
+
*
|
|
25
|
+
* A plan is REFERENCES, never documents (AGL-2937). It names what the site
|
|
26
|
+
* already has by inventory id, what the job will create by a short name, and
|
|
27
|
+
* which screens it builds from which of those — so the doctrine can be held
|
|
28
|
+
* against the plan while fixing it costs a sentence, not a regenerated page,
|
|
29
|
+
* and the customer reads what the job will do before it spends a credit on
|
|
30
|
+
* doing it.
|
|
31
|
+
*
|
|
32
|
+
* `new:<name>` is how an entry refers to something the plan itself creates;
|
|
33
|
+
* any other reference is an id from the site inventory.
|
|
34
|
+
*/ export const AI_PLAN_NEW_REF_PREFIX = 'new:';
|
|
35
|
+
export const AI_BUILD_PLAN_REUSE_KINDS = [
|
|
36
|
+
'component',
|
|
37
|
+
'layout',
|
|
38
|
+
'template',
|
|
39
|
+
'form',
|
|
40
|
+
'dataset',
|
|
41
|
+
'collection',
|
|
42
|
+
'screen',
|
|
43
|
+
'theme'
|
|
44
|
+
];
|
|
45
|
+
/**
|
|
46
|
+
* What each creation is called in a sentence, and where a member makes one.
|
|
47
|
+
*
|
|
48
|
+
* Total over the union deliberately: a refusal that cannot name a creation is
|
|
49
|
+
* a refusal a member cannot act on, so widening `AiBuildPlanCreateKind`
|
|
50
|
+
* without saying where the new thing is made does not compile.
|
|
51
|
+
*/ export const AI_BUILD_PLAN_CREATION_NOUNS = {
|
|
52
|
+
component: {
|
|
53
|
+
noun: 'component',
|
|
54
|
+
where: 'on the Components page'
|
|
55
|
+
},
|
|
56
|
+
form: {
|
|
57
|
+
noun: 'form',
|
|
58
|
+
where: 'on the Forms page'
|
|
59
|
+
},
|
|
60
|
+
layout: {
|
|
61
|
+
noun: 'layout',
|
|
62
|
+
where: 'on the Layouts page'
|
|
63
|
+
},
|
|
64
|
+
template: {
|
|
65
|
+
noun: 'template',
|
|
66
|
+
where: 'in the Templates library'
|
|
67
|
+
},
|
|
68
|
+
'theme-change': {
|
|
69
|
+
noun: 'theme change',
|
|
70
|
+
where: 'in the Theme section'
|
|
71
|
+
},
|
|
72
|
+
dataset: {
|
|
73
|
+
noun: 'dataset',
|
|
74
|
+
where: 'on the Datasets page'
|
|
75
|
+
},
|
|
76
|
+
email: {
|
|
77
|
+
noun: 'email design',
|
|
78
|
+
where: 'in Emails → Templates'
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
export const AI_BUILD_PLAN_CREATE_KINDS = [
|
|
82
|
+
'component',
|
|
83
|
+
'layout',
|
|
84
|
+
'template',
|
|
85
|
+
'form',
|
|
86
|
+
'theme-change',
|
|
87
|
+
'dataset',
|
|
88
|
+
'email'
|
|
89
|
+
];
|
|
90
|
+
/**
|
|
91
|
+
* How much one plan may hold. A job builds what one proposal can describe
|
|
92
|
+
* and one person can read before confirming; a brief asking for more is
|
|
93
|
+
* several jobs.
|
|
94
|
+
*/ export const AI_BUILD_PLAN_LIMITS = {
|
|
95
|
+
reuse: 40,
|
|
96
|
+
create: 20,
|
|
97
|
+
screens: 12,
|
|
98
|
+
sections: 16,
|
|
99
|
+
uses: 8,
|
|
100
|
+
fields: 30,
|
|
101
|
+
text: 200,
|
|
102
|
+
seoDescription: 320,
|
|
103
|
+
items: 500
|
|
104
|
+
};
|
|
105
|
+
const string = (description)=>({
|
|
106
|
+
type: 'string',
|
|
107
|
+
description
|
|
108
|
+
});
|
|
109
|
+
const nullableString = (description)=>({
|
|
110
|
+
anyOf: [
|
|
111
|
+
{
|
|
112
|
+
type: 'string'
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'null'
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
description
|
|
119
|
+
});
|
|
120
|
+
const strings = (description)=>({
|
|
121
|
+
type: 'array',
|
|
122
|
+
items: {
|
|
123
|
+
type: 'string'
|
|
124
|
+
},
|
|
125
|
+
description
|
|
126
|
+
});
|
|
127
|
+
/**
|
|
128
|
+
* The ceiling `parseAiBuildPlan` cuts a field's text at, in words (AGL-3022).
|
|
129
|
+
* The reader repairs an overlong value by cutting it, and a model never told
|
|
130
|
+
* where the cut falls writes a rationale that stops mid-sentence there.
|
|
131
|
+
*/ const atMost = (limit = AI_BUILD_PLAN_LIMITS.text)=>`at most ${limit} characters`;
|
|
132
|
+
/**
|
|
133
|
+
* The plan as a strict tool's input schema. Only the keywords strict
|
|
134
|
+
* structured output accepts: every object closes its properties and lists
|
|
135
|
+
* every one as required, an optional value is a `null` branch, and no
|
|
136
|
+
* length or count bound appears as a keyword — those are enforced by
|
|
137
|
+
* `parseAiBuildPlan`, which every answer passes through anyway.
|
|
138
|
+
*
|
|
139
|
+
* A text ceiling is stated in words instead, on each field the model writes.
|
|
140
|
+
* A reference is copied from the inventory or from a creation's name, so its
|
|
141
|
+
* length is not the model's to choose. A search title and description are
|
|
142
|
+
* held by rule 10 to ceilings far inside the reader's, which the doctrine
|
|
143
|
+
* states, so naming the reader's here would contradict the rule.
|
|
144
|
+
*/ export const AI_BUILD_PLAN_TOOL = {
|
|
145
|
+
name: 'submit_build_plan',
|
|
146
|
+
description: 'Submit the build plan: what the site already has that this job reuses, what it creates and why, and the screens it builds from them.',
|
|
147
|
+
strict: true,
|
|
148
|
+
inputSchema: {
|
|
149
|
+
type: 'object',
|
|
150
|
+
additionalProperties: false,
|
|
151
|
+
required: [
|
|
152
|
+
'reuse',
|
|
153
|
+
'create',
|
|
154
|
+
'screens'
|
|
155
|
+
],
|
|
156
|
+
properties: {
|
|
157
|
+
reuse: {
|
|
158
|
+
type: 'array',
|
|
159
|
+
description: 'Records the site already has that this plan uses, by inventory id.',
|
|
160
|
+
items: {
|
|
161
|
+
type: 'object',
|
|
162
|
+
additionalProperties: false,
|
|
163
|
+
required: [
|
|
164
|
+
'kind',
|
|
165
|
+
'id',
|
|
166
|
+
'purpose'
|
|
167
|
+
],
|
|
168
|
+
properties: {
|
|
169
|
+
kind: {
|
|
170
|
+
type: 'string',
|
|
171
|
+
enum: [
|
|
172
|
+
...AI_BUILD_PLAN_REUSE_KINDS
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
id: string('The id from the site inventory.'),
|
|
176
|
+
purpose: string(`What the plan uses it for, in a few words, ${atMost()}.`)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
create: {
|
|
181
|
+
type: 'array',
|
|
182
|
+
description: 'What the plan creates. Creating is the exception: each entry says why nothing listed will do.',
|
|
183
|
+
items: {
|
|
184
|
+
type: 'object',
|
|
185
|
+
additionalProperties: false,
|
|
186
|
+
required: [
|
|
187
|
+
'kind',
|
|
188
|
+
'name',
|
|
189
|
+
'why',
|
|
190
|
+
'duplicateOf',
|
|
191
|
+
'fields'
|
|
192
|
+
],
|
|
193
|
+
properties: {
|
|
194
|
+
kind: {
|
|
195
|
+
type: 'string',
|
|
196
|
+
enum: [
|
|
197
|
+
...AI_BUILD_PLAN_CREATE_KINDS
|
|
198
|
+
]
|
|
199
|
+
},
|
|
200
|
+
name: string(`Unique within the plan, ${atMost()}; other entries refer to it as new:<name>.`),
|
|
201
|
+
why: string(`Why nothing the site already has will do, in one sentence of ${atMost()}.`),
|
|
202
|
+
duplicateOf: nullableString('The inventory id this starts from as a duplicate, or null.'),
|
|
203
|
+
fields: strings(`A component: its props as name:type, an icon as name:icon. A layout: the regions it has, each one of header, nav, sidebar, main, footer — list every region the finished layout has, not only the ones it gains. A form or dataset: its field names. A theme change: the palette paths it adds or changes. Each ${atMost()}.`)
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
screens: {
|
|
208
|
+
type: 'array',
|
|
209
|
+
description: 'The screens the job builds, each a new draft.',
|
|
210
|
+
items: {
|
|
211
|
+
type: 'object',
|
|
212
|
+
additionalProperties: false,
|
|
213
|
+
required: [
|
|
214
|
+
'title',
|
|
215
|
+
'slug',
|
|
216
|
+
'layout',
|
|
217
|
+
'template',
|
|
218
|
+
'duplicateOf',
|
|
219
|
+
'nav',
|
|
220
|
+
'seoTitle',
|
|
221
|
+
'seoDescription',
|
|
222
|
+
'sections'
|
|
223
|
+
],
|
|
224
|
+
properties: {
|
|
225
|
+
title: string(`The screen name, ${atMost()}.`),
|
|
226
|
+
slug: string(`The path, ${atMost()}: lowercase words joined by hyphens, e.g. /services/roof-repair.`),
|
|
227
|
+
layout: nullableString('The layout it renders inside: an inventory id or new:<name>.'),
|
|
228
|
+
template: nullableString('The template it applies (inventory id or new:<name>), or null for a one-off page.'),
|
|
229
|
+
duplicateOf: nullableString('The inventory screen it starts from as a duplicate, or null.'),
|
|
230
|
+
nav: {
|
|
231
|
+
type: 'boolean',
|
|
232
|
+
description: 'Whether the site navigation gains an entry for it.'
|
|
233
|
+
},
|
|
234
|
+
seoTitle: string('The search-result title.'),
|
|
235
|
+
seoDescription: string('The search-result description.'),
|
|
236
|
+
sections: {
|
|
237
|
+
type: 'array',
|
|
238
|
+
description: 'The sections, top to bottom.',
|
|
239
|
+
items: {
|
|
240
|
+
type: 'object',
|
|
241
|
+
additionalProperties: false,
|
|
242
|
+
required: [
|
|
243
|
+
'name',
|
|
244
|
+
'uses',
|
|
245
|
+
'items'
|
|
246
|
+
],
|
|
247
|
+
properties: {
|
|
248
|
+
name: string(`A few words, ${atMost()}: hero, services grid, contact form.`),
|
|
249
|
+
uses: strings('What the section places: inventory ids or new:<name>.'),
|
|
250
|
+
items: {
|
|
251
|
+
type: 'integer',
|
|
252
|
+
description: 'How many repeated items it shows; 0 when none.'
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
function isRecord(value) {
|
|
264
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
265
|
+
}
|
|
266
|
+
let PlanShapeError = class PlanShapeError extends Error {
|
|
267
|
+
};
|
|
268
|
+
/**
|
|
269
|
+
* Read a plan out of a tool call, or name what makes it unreadable.
|
|
270
|
+
*
|
|
271
|
+
* Structure is refused — a missing list, an unknown kind, more screens than
|
|
272
|
+
* a job holds, two creations under one name — because a plan that reads
|
|
273
|
+
* differently from what the model meant is worse than a re-ask. Length is
|
|
274
|
+
* repaired: copy past a ceiling is cut and the cut is listed.
|
|
275
|
+
*/ export function parseAiBuildPlan(input) {
|
|
276
|
+
const repairs = [];
|
|
277
|
+
const text = (value, path, limit = AI_BUILD_PLAN_LIMITS.text)=>{
|
|
278
|
+
if (typeof value !== 'string') throw new PlanShapeError(`${path} is not text`);
|
|
279
|
+
const trimmed = value.trim();
|
|
280
|
+
if (trimmed.length > limit) {
|
|
281
|
+
repairs.push(`${path} was over ${limit} characters; truncated`);
|
|
282
|
+
// On the last word break inside the ceiling, not through a word: a
|
|
283
|
+
// rationale is read by the member confirming the plan, and half a word
|
|
284
|
+
// reads as a broken answer rather than a long one (AGL-3022). A run of
|
|
285
|
+
// `limit` characters with no break in it still has to be cut where the
|
|
286
|
+
// ceiling falls.
|
|
287
|
+
const cut = trimmed.slice(0, limit);
|
|
288
|
+
const brk = cut.search(/\s\S*$/);
|
|
289
|
+
return (brk > 0 ? cut.slice(0, brk) : cut).trimEnd();
|
|
290
|
+
}
|
|
291
|
+
return trimmed;
|
|
292
|
+
};
|
|
293
|
+
const nullable = (value, path)=>value === null || value === undefined || value === '' ? null : text(value, path) || null;
|
|
294
|
+
const list = (value, path, limit)=>{
|
|
295
|
+
if (!Array.isArray(value)) throw new PlanShapeError(`${path} is not a list`);
|
|
296
|
+
if (value.length > limit) {
|
|
297
|
+
throw new PlanShapeError(`${path} lists ${value.length}; one plan holds at most ${limit}`);
|
|
298
|
+
}
|
|
299
|
+
return value;
|
|
300
|
+
};
|
|
301
|
+
const record = (value, path)=>{
|
|
302
|
+
if (!isRecord(value)) throw new PlanShapeError(`${path} is not an object`);
|
|
303
|
+
return value;
|
|
304
|
+
};
|
|
305
|
+
const oneOf = (value, allowed, path)=>{
|
|
306
|
+
if (typeof value !== 'string' || !allowed.includes(value)) {
|
|
307
|
+
throw new PlanShapeError(`${path} is not one of ${allowed.join(', ')}`);
|
|
308
|
+
}
|
|
309
|
+
return value;
|
|
310
|
+
};
|
|
311
|
+
try {
|
|
312
|
+
const root = record(input, 'plan');
|
|
313
|
+
const reuse = list(root['reuse'], 'reuse', AI_BUILD_PLAN_LIMITS.reuse).map((raw, index)=>{
|
|
314
|
+
const entry = record(raw, `reuse[${index}]`);
|
|
315
|
+
const id = text(entry['id'], `reuse[${index}].id`);
|
|
316
|
+
if (!id) throw new PlanShapeError(`reuse[${index}].id is empty`);
|
|
317
|
+
return {
|
|
318
|
+
kind: oneOf(entry['kind'], AI_BUILD_PLAN_REUSE_KINDS, `reuse[${index}].kind`),
|
|
319
|
+
id,
|
|
320
|
+
purpose: text(entry['purpose'], `reuse[${index}].purpose`)
|
|
321
|
+
};
|
|
322
|
+
});
|
|
323
|
+
const names = new Set();
|
|
324
|
+
const create = list(root['create'], 'create', AI_BUILD_PLAN_LIMITS.create).map((raw, index)=>{
|
|
325
|
+
var _entry_fields;
|
|
326
|
+
const entry = record(raw, `create[${index}]`);
|
|
327
|
+
const name = text(entry['name'], `create[${index}].name`);
|
|
328
|
+
if (!name) throw new PlanShapeError(`create[${index}].name is empty`);
|
|
329
|
+
const key = name.toLowerCase();
|
|
330
|
+
if (names.has(key)) {
|
|
331
|
+
throw new PlanShapeError(`create[${index}].name "${name}" is used twice`);
|
|
332
|
+
}
|
|
333
|
+
names.add(key);
|
|
334
|
+
return {
|
|
335
|
+
kind: oneOf(entry['kind'], AI_BUILD_PLAN_CREATE_KINDS, `create[${index}].kind`),
|
|
336
|
+
name,
|
|
337
|
+
why: text(entry['why'], `create[${index}].why`),
|
|
338
|
+
duplicateOf: nullable(entry['duplicateOf'], `create[${index}].duplicateOf`),
|
|
339
|
+
fields: list((_entry_fields = entry['fields']) != null ? _entry_fields : [], `create[${index}].fields`, AI_BUILD_PLAN_LIMITS.fields).map((field, fieldIndex)=>text(field, `create[${index}].fields[${fieldIndex}]`)).filter(Boolean)
|
|
340
|
+
};
|
|
341
|
+
});
|
|
342
|
+
const screens = list(root['screens'], 'screens', AI_BUILD_PLAN_LIMITS.screens).map((raw, index)=>{
|
|
343
|
+
const entry = record(raw, `screens[${index}]`);
|
|
344
|
+
if (typeof entry['nav'] !== 'boolean') {
|
|
345
|
+
throw new PlanShapeError(`screens[${index}].nav is not true or false`);
|
|
346
|
+
}
|
|
347
|
+
return {
|
|
348
|
+
title: text(entry['title'], `screens[${index}].title`),
|
|
349
|
+
slug: text(entry['slug'], `screens[${index}].slug`),
|
|
350
|
+
layout: nullable(entry['layout'], `screens[${index}].layout`),
|
|
351
|
+
template: nullable(entry['template'], `screens[${index}].template`),
|
|
352
|
+
duplicateOf: nullable(entry['duplicateOf'], `screens[${index}].duplicateOf`),
|
|
353
|
+
nav: entry['nav'],
|
|
354
|
+
seoTitle: text(entry['seoTitle'], `screens[${index}].seoTitle`),
|
|
355
|
+
seoDescription: text(entry['seoDescription'], `screens[${index}].seoDescription`, AI_BUILD_PLAN_LIMITS.seoDescription),
|
|
356
|
+
sections: list(entry['sections'], `screens[${index}].sections`, AI_BUILD_PLAN_LIMITS.sections).map((rawSection, sectionIndex)=>{
|
|
357
|
+
var _section_items, _section_uses;
|
|
358
|
+
const path = `screens[${index}].sections[${sectionIndex}]`;
|
|
359
|
+
const section = record(rawSection, path);
|
|
360
|
+
const items = Number((_section_items = section['items']) != null ? _section_items : 0);
|
|
361
|
+
if (!Number.isInteger(items) || items < 0 || items > AI_BUILD_PLAN_LIMITS.items) {
|
|
362
|
+
throw new PlanShapeError(`${path}.items is not a count`);
|
|
363
|
+
}
|
|
364
|
+
return {
|
|
365
|
+
name: text(section['name'], `${path}.name`),
|
|
366
|
+
uses: list((_section_uses = section['uses']) != null ? _section_uses : [], `${path}.uses`, AI_BUILD_PLAN_LIMITS.uses).map((ref, refIndex)=>text(ref, `${path}.uses[${refIndex}]`)).filter(Boolean),
|
|
367
|
+
items
|
|
368
|
+
};
|
|
369
|
+
})
|
|
370
|
+
};
|
|
371
|
+
});
|
|
372
|
+
return {
|
|
373
|
+
ok: true,
|
|
374
|
+
plan: {
|
|
375
|
+
reuse,
|
|
376
|
+
create,
|
|
377
|
+
screens
|
|
378
|
+
},
|
|
379
|
+
repairs
|
|
380
|
+
};
|
|
381
|
+
} catch (error) {
|
|
382
|
+
if (error instanceof PlanShapeError) return {
|
|
383
|
+
ok: false,
|
|
384
|
+
error: error.message
|
|
385
|
+
};
|
|
386
|
+
throw error;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/** Whether a reference names something the plan creates. */ export function isAiPlanNewRef(ref) {
|
|
390
|
+
return typeof ref === 'string' && ref.startsWith(AI_PLAN_NEW_REF_PREFIX);
|
|
391
|
+
}
|
|
392
|
+
/** The creation a `new:<name>` reference names, case-insensitively. */ export function aiPlanCreateFor(plan, ref) {
|
|
393
|
+
if (!isAiPlanNewRef(ref)) return undefined;
|
|
394
|
+
const name = ref.slice(AI_PLAN_NEW_REF_PREFIX.length).trim().toLowerCase();
|
|
395
|
+
return plan.create.find((entry)=>entry.name.toLowerCase() === name);
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Every `new:<name>` reference the plan's create list does not carry, in plan
|
|
399
|
+
* order: each screen's layout, then its template, then what its sections
|
|
400
|
+
* place. A plan that places a creation it never declares has nothing to build
|
|
401
|
+
* it from, so the plan rules refuse each (AGL-3040), and the page and
|
|
402
|
+
* scaffold doors still name one in a plan confirmed before they did.
|
|
403
|
+
*/ export function aiPlanUndeclaredRefs(plan) {
|
|
404
|
+
const found = [];
|
|
405
|
+
const undeclared = (ref)=>isAiPlanNewRef(ref) && !aiPlanCreateFor(plan, ref);
|
|
406
|
+
const nameOf = (ref)=>ref.slice(AI_PLAN_NEW_REF_PREFIX.length).trim();
|
|
407
|
+
plan.screens.forEach((screen, screenIndex)=>{
|
|
408
|
+
for (const field of [
|
|
409
|
+
'layout',
|
|
410
|
+
'template'
|
|
411
|
+
]){
|
|
412
|
+
const ref = screen[field];
|
|
413
|
+
if (!undeclared(ref)) continue;
|
|
414
|
+
found.push({
|
|
415
|
+
name: nameOf(ref),
|
|
416
|
+
path: `screens[${screenIndex}].${field}`,
|
|
417
|
+
screenIndex,
|
|
418
|
+
field,
|
|
419
|
+
sectionIndex: null
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
screen.sections.forEach((section, sectionIndex)=>{
|
|
423
|
+
section.uses.forEach((ref, useIndex)=>{
|
|
424
|
+
if (!undeclared(ref)) return;
|
|
425
|
+
found.push({
|
|
426
|
+
name: nameOf(ref),
|
|
427
|
+
path: `screens[${screenIndex}].sections[${sectionIndex}].uses[${useIndex}]`,
|
|
428
|
+
screenIndex,
|
|
429
|
+
field: 'uses',
|
|
430
|
+
sectionIndex
|
|
431
|
+
});
|
|
432
|
+
});
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
return found;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
//# sourceMappingURL=ai-build-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/model/ai-build-plan.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 type { AiTool } from '../providers/contract'\n\n/**\n * The plan a generation job builds from (AGL-2935): what the job's plan step\n * (`jobs/ai-job-plan-step.ts`) returns, before a single node is generated.\n *\n * This module is the plan's MODEL — its shape, its tool schema and its\n * reader — and imports nothing at runtime, so the doctrine validators, the\n * plan step, the job document and the proposal can all read it without\n * importing each other.\n *\n * A plan is REFERENCES, never documents (AGL-2937). It names what the site\n * already has by inventory id, what the job will create by a short name, and\n * which screens it builds from which of those — so the doctrine can be held\n * against the plan while fixing it costs a sentence, not a regenerated page,\n * and the customer reads what the job will do before it spends a credit on\n * doing it.\n *\n * `new:<name>` is how an entry refers to something the plan itself creates;\n * any other reference is an id from the site inventory.\n */\n\nexport const AI_PLAN_NEW_REF_PREFIX = 'new:'\n\n/** Records a plan may reuse, by the inventory list they come from. */\nexport type AiBuildPlanReuseKind =\n | 'component'\n | 'layout'\n | 'template'\n | 'form'\n | 'dataset'\n | 'collection'\n | 'screen'\n | 'theme'\n\nexport const AI_BUILD_PLAN_REUSE_KINDS: readonly AiBuildPlanReuseKind[] = [\n 'component',\n 'layout',\n 'template',\n 'form',\n 'dataset',\n 'collection',\n 'screen',\n 'theme',\n]\n\n/** What a plan may create. A theme change is a draft through the theme door, never a literal. */\nexport type AiBuildPlanCreateKind =\n | 'component'\n | 'layout'\n | 'template'\n | 'form'\n | 'theme-change'\n | 'dataset'\n | 'email'\n\n/**\n * What each creation is called in a sentence, and where a member makes one.\n *\n * Total over the union deliberately: a refusal that cannot name a creation is\n * a refusal a member cannot act on, so widening `AiBuildPlanCreateKind`\n * without saying where the new thing is made does not compile.\n */\nexport const AI_BUILD_PLAN_CREATION_NOUNS: Record<\n AiBuildPlanCreateKind,\n { noun: string; where: string }\n> = {\n component: { noun: 'component', where: 'on the Components page' },\n form: { noun: 'form', where: 'on the Forms page' },\n layout: { noun: 'layout', where: 'on the Layouts page' },\n template: { noun: 'template', where: 'in the Templates library' },\n 'theme-change': { noun: 'theme change', where: 'in the Theme section' },\n dataset: { noun: 'dataset', where: 'on the Datasets page' },\n email: { noun: 'email design', where: 'in Emails → Templates' },\n}\n\nexport const AI_BUILD_PLAN_CREATE_KINDS: readonly AiBuildPlanCreateKind[] = [\n 'component',\n 'layout',\n 'template',\n 'form',\n 'theme-change',\n 'dataset',\n 'email',\n]\n\nexport interface AiBuildPlanReuse {\n kind: AiBuildPlanReuseKind\n /** The inventory id. */\n id: string\n /** What the plan uses it for, in a few words. */\n purpose: string\n}\n\nexport interface AiBuildPlanCreate {\n kind: AiBuildPlanCreateKind\n /** Unique within the plan; referenced as `new:<name>`. */\n name: string\n /** Why nothing the site has will do — shown in the proposal. */\n why: string\n /** The inventory id this starts from as a duplicate, or null. */\n duplicateOf: string | null\n /**\n * A component: its props as `name:type`, an icon as `name:icon`\n * (AGL-3054). A layout: the regions it has, from the closed vocabulary\n * `AI_LAYOUT_REGIONS` holds (AGL-3024) — a layout has no props, and a\n * region named here is what the built layout is held to. A form or a\n * dataset: its field names. A theme change: the palette paths it adds or\n * changes.\n */\n fields: string[]\n /**\n * The id the draft this creation becomes is written under, where a unit of\n * the job builds it (AGL-3079). Minted when the job keeps the plan, never\n * part of the model's answer.\n */\n id?: string\n}\n\nexport interface AiBuildPlanSection {\n /** A few words: \"hero\", \"services grid\", \"contact form\". */\n name: string\n /** What the section places: inventory ids or `new:<name>` references. */\n uses: string[]\n /** How many repeated items it shows (cards, rows, tiles); 0 when none. */\n items: number\n}\n\nexport interface AiBuildPlanScreen {\n title: string\n slug: string\n /** The layout it renders inside. */\n layout: string | null\n /** The template it applies, or null for a one-off page. */\n template: string | null\n /** The inventory screen it starts from as a duplicate, or null. */\n duplicateOf: string | null\n /** Whether the site navigation gains an entry for it. */\n nav: boolean\n seoTitle: string\n seoDescription: string\n sections: AiBuildPlanSection[]\n /**\n * The id the draft screen is written under, where a unit of the job builds\n * it (AGL-3079). Minted when the job keeps the plan, never part of the\n * model's answer.\n */\n id?: string\n}\n\nexport interface AiBuildPlan {\n reuse: AiBuildPlanReuse[]\n create: AiBuildPlanCreate[]\n screens: AiBuildPlanScreen[]\n}\n\n/**\n * How much one plan may hold. A job builds what one proposal can describe\n * and one person can read before confirming; a brief asking for more is\n * several jobs.\n */\nexport const AI_BUILD_PLAN_LIMITS = {\n reuse: 40,\n create: 20,\n screens: 12,\n sections: 16,\n uses: 8,\n fields: 30,\n text: 200,\n seoDescription: 320,\n items: 500,\n} as const\n\nconst string = (description: string) => ({ type: 'string', description })\nconst nullableString = (description: string) => ({\n anyOf: [{ type: 'string' }, { type: 'null' }],\n description,\n})\nconst strings = (description: string) => ({\n type: 'array',\n items: { type: 'string' },\n description,\n})\n\n/**\n * The ceiling `parseAiBuildPlan` cuts a field's text at, in words (AGL-3022).\n * The reader repairs an overlong value by cutting it, and a model never told\n * where the cut falls writes a rationale that stops mid-sentence there.\n */\nconst atMost = (limit: number = AI_BUILD_PLAN_LIMITS.text) => `at most ${limit} characters`\n\n/**\n * The plan as a strict tool's input schema. Only the keywords strict\n * structured output accepts: every object closes its properties and lists\n * every one as required, an optional value is a `null` branch, and no\n * length or count bound appears as a keyword — those are enforced by\n * `parseAiBuildPlan`, which every answer passes through anyway.\n *\n * A text ceiling is stated in words instead, on each field the model writes.\n * A reference is copied from the inventory or from a creation's name, so its\n * length is not the model's to choose. A search title and description are\n * held by rule 10 to ceilings far inside the reader's, which the doctrine\n * states, so naming the reader's here would contradict the rule.\n */\nexport const AI_BUILD_PLAN_TOOL: AiTool = {\n name: 'submit_build_plan',\n description:\n 'Submit the build plan: what the site already has that this job reuses, what it creates and why, and the screens it builds from them.',\n strict: true,\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['reuse', 'create', 'screens'],\n properties: {\n reuse: {\n type: 'array',\n description: 'Records the site already has that this plan uses, by inventory id.',\n items: {\n type: 'object',\n additionalProperties: false,\n required: ['kind', 'id', 'purpose'],\n properties: {\n kind: { type: 'string', enum: [...AI_BUILD_PLAN_REUSE_KINDS] },\n id: string('The id from the site inventory.'),\n purpose: string(`What the plan uses it for, in a few words, ${atMost()}.`),\n },\n },\n },\n create: {\n type: 'array',\n description:\n 'What the plan creates. Creating is the exception: each entry says why nothing listed will do.',\n items: {\n type: 'object',\n additionalProperties: false,\n required: ['kind', 'name', 'why', 'duplicateOf', 'fields'],\n properties: {\n kind: { type: 'string', enum: [...AI_BUILD_PLAN_CREATE_KINDS] },\n name: string(\n `Unique within the plan, ${atMost()}; other entries refer to it as new:<name>.`,\n ),\n why: string(`Why nothing the site already has will do, in one sentence of ${atMost()}.`),\n duplicateOf: nullableString(\n 'The inventory id this starts from as a duplicate, or null.',\n ),\n fields: strings(\n `A component: its props as name:type, an icon as name:icon. A layout: the regions it has, each one of header, nav, sidebar, main, footer — list every region the finished layout has, not only the ones it gains. A form or dataset: its field names. A theme change: the palette paths it adds or changes. Each ${atMost()}.`,\n ),\n },\n },\n },\n screens: {\n type: 'array',\n description: 'The screens the job builds, each a new draft.',\n items: {\n type: 'object',\n additionalProperties: false,\n required: [\n 'title',\n 'slug',\n 'layout',\n 'template',\n 'duplicateOf',\n 'nav',\n 'seoTitle',\n 'seoDescription',\n 'sections',\n ],\n properties: {\n title: string(`The screen name, ${atMost()}.`),\n slug: string(\n `The path, ${atMost()}: lowercase words joined by hyphens, e.g. /services/roof-repair.`,\n ),\n layout: nullableString(\n 'The layout it renders inside: an inventory id or new:<name>.',\n ),\n template: nullableString(\n 'The template it applies (inventory id or new:<name>), or null for a one-off page.',\n ),\n duplicateOf: nullableString(\n 'The inventory screen it starts from as a duplicate, or null.',\n ),\n nav: {\n type: 'boolean',\n description: 'Whether the site navigation gains an entry for it.',\n },\n seoTitle: string('The search-result title.'),\n seoDescription: string('The search-result description.'),\n sections: {\n type: 'array',\n description: 'The sections, top to bottom.',\n items: {\n type: 'object',\n additionalProperties: false,\n required: ['name', 'uses', 'items'],\n properties: {\n name: string(`A few words, ${atMost()}: hero, services grid, contact form.`),\n uses: strings('What the section places: inventory ids or new:<name>.'),\n items: {\n type: 'integer',\n description: 'How many repeated items it shows; 0 when none.',\n },\n },\n },\n },\n },\n },\n },\n },\n },\n}\n\nexport type AiBuildPlanParse =\n | { ok: true; plan: AiBuildPlan; repairs: string[] }\n | { ok: false; error: string }\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nclass PlanShapeError extends Error {}\n\n/**\n * Read a plan out of a tool call, or name what makes it unreadable.\n *\n * Structure is refused — a missing list, an unknown kind, more screens than\n * a job holds, two creations under one name — because a plan that reads\n * differently from what the model meant is worse than a re-ask. Length is\n * repaired: copy past a ceiling is cut and the cut is listed.\n */\nexport function parseAiBuildPlan(input: unknown): AiBuildPlanParse {\n const repairs: string[] = []\n const text = (\n value: unknown,\n path: string,\n limit: number = AI_BUILD_PLAN_LIMITS.text,\n ): string => {\n if (typeof value !== 'string') throw new PlanShapeError(`${path} is not text`)\n const trimmed = value.trim()\n if (trimmed.length > limit) {\n repairs.push(`${path} was over ${limit} characters; truncated`)\n // On the last word break inside the ceiling, not through a word: a\n // rationale is read by the member confirming the plan, and half a word\n // reads as a broken answer rather than a long one (AGL-3022). A run of\n // `limit` characters with no break in it still has to be cut where the\n // ceiling falls.\n const cut = trimmed.slice(0, limit)\n const brk = cut.search(/\\s\\S*$/)\n return (brk > 0 ? cut.slice(0, brk) : cut).trimEnd()\n }\n return trimmed\n }\n const nullable = (value: unknown, path: string): string | null =>\n value === null || value === undefined || value === '' ? null : text(value, path) || null\n const list = (value: unknown, path: string, limit: number): unknown[] => {\n if (!Array.isArray(value)) throw new PlanShapeError(`${path} is not a list`)\n if (value.length > limit) {\n throw new PlanShapeError(`${path} lists ${value.length}; one plan holds at most ${limit}`)\n }\n return value\n }\n const record = (value: unknown, path: string): Record<string, unknown> => {\n if (!isRecord(value)) throw new PlanShapeError(`${path} is not an object`)\n return value\n }\n const oneOf = <T extends string>(value: unknown, allowed: readonly T[], path: string): T => {\n if (typeof value !== 'string' || !(allowed as readonly string[]).includes(value)) {\n throw new PlanShapeError(`${path} is not one of ${allowed.join(', ')}`)\n }\n return value as T\n }\n\n try {\n const root = record(input, 'plan')\n const reuse = list(root['reuse'], 'reuse', AI_BUILD_PLAN_LIMITS.reuse).map((raw, index) => {\n const entry = record(raw, `reuse[${index}]`)\n const id = text(entry['id'], `reuse[${index}].id`)\n if (!id) throw new PlanShapeError(`reuse[${index}].id is empty`)\n return {\n kind: oneOf(entry['kind'], AI_BUILD_PLAN_REUSE_KINDS, `reuse[${index}].kind`),\n id,\n purpose: text(entry['purpose'], `reuse[${index}].purpose`),\n }\n })\n const names = new Set<string>()\n const create = list(root['create'], 'create', AI_BUILD_PLAN_LIMITS.create).map(\n (raw, index) => {\n const entry = record(raw, `create[${index}]`)\n const name = text(entry['name'], `create[${index}].name`)\n if (!name) throw new PlanShapeError(`create[${index}].name is empty`)\n const key = name.toLowerCase()\n if (names.has(key)) {\n throw new PlanShapeError(`create[${index}].name \"${name}\" is used twice`)\n }\n names.add(key)\n return {\n kind: oneOf(entry['kind'], AI_BUILD_PLAN_CREATE_KINDS, `create[${index}].kind`),\n name,\n why: text(entry['why'], `create[${index}].why`),\n duplicateOf: nullable(entry['duplicateOf'], `create[${index}].duplicateOf`),\n fields: list(entry['fields'] ?? [], `create[${index}].fields`, AI_BUILD_PLAN_LIMITS.fields)\n .map((field, fieldIndex) => text(field, `create[${index}].fields[${fieldIndex}]`))\n .filter(Boolean),\n }\n },\n )\n const screens = list(root['screens'], 'screens', AI_BUILD_PLAN_LIMITS.screens).map(\n (raw, index) => {\n const entry = record(raw, `screens[${index}]`)\n if (typeof entry['nav'] !== 'boolean') {\n throw new PlanShapeError(`screens[${index}].nav is not true or false`)\n }\n return {\n title: text(entry['title'], `screens[${index}].title`),\n slug: text(entry['slug'], `screens[${index}].slug`),\n layout: nullable(entry['layout'], `screens[${index}].layout`),\n template: nullable(entry['template'], `screens[${index}].template`),\n duplicateOf: nullable(entry['duplicateOf'], `screens[${index}].duplicateOf`),\n nav: entry['nav'],\n seoTitle: text(entry['seoTitle'], `screens[${index}].seoTitle`),\n seoDescription: text(\n entry['seoDescription'],\n `screens[${index}].seoDescription`,\n AI_BUILD_PLAN_LIMITS.seoDescription,\n ),\n sections: list(\n entry['sections'],\n `screens[${index}].sections`,\n AI_BUILD_PLAN_LIMITS.sections,\n ).map((rawSection, sectionIndex) => {\n const path = `screens[${index}].sections[${sectionIndex}]`\n const section = record(rawSection, path)\n const items = Number(section['items'] ?? 0)\n if (!Number.isInteger(items) || items < 0 || items > AI_BUILD_PLAN_LIMITS.items) {\n throw new PlanShapeError(`${path}.items is not a count`)\n }\n return {\n name: text(section['name'], `${path}.name`),\n uses: list(section['uses'] ?? [], `${path}.uses`, AI_BUILD_PLAN_LIMITS.uses)\n .map((ref, refIndex) => text(ref, `${path}.uses[${refIndex}]`))\n .filter(Boolean),\n items,\n }\n }),\n }\n },\n )\n return { ok: true, plan: { reuse, create, screens }, repairs }\n } catch (error) {\n if (error instanceof PlanShapeError) return { ok: false, error: error.message }\n throw error\n }\n}\n\n/** Whether a reference names something the plan creates. */\nexport function isAiPlanNewRef(ref: string | null | undefined): ref is string {\n return typeof ref === 'string' && ref.startsWith(AI_PLAN_NEW_REF_PREFIX)\n}\n\n/** The creation a `new:<name>` reference names, case-insensitively. */\nexport function aiPlanCreateFor(\n plan: AiBuildPlan,\n ref: string,\n): AiBuildPlanCreate | undefined {\n if (!isAiPlanNewRef(ref)) return undefined\n const name = ref.slice(AI_PLAN_NEW_REF_PREFIX.length).trim().toLowerCase()\n return plan.create.find((entry) => entry.name.toLowerCase() === name)\n}\n\n/**\n * A `new:<name>` reference that names no entry of the plan's create list: a\n * screen's own layout or template, or what one of its sections places, with\n * that section's index.\n */\nexport type AiPlanUndeclaredRef = {\n /** The name the reference gives the creation, as written after `new:`. */\n name: string\n /** Where the plan writes it: `screens[0].template`, `screens[0].sections[4].uses[0]`. */\n path: string\n /** The screen that writes it, by index. */\n screenIndex: number\n} & ({ field: 'layout' | 'template'; sectionIndex: null } | { field: 'uses'; sectionIndex: number })\n\n/**\n * Every `new:<name>` reference the plan's create list does not carry, in plan\n * order: each screen's layout, then its template, then what its sections\n * place. A plan that places a creation it never declares has nothing to build\n * it from, so the plan rules refuse each (AGL-3040), and the page and\n * scaffold doors still name one in a plan confirmed before they did.\n */\nexport function aiPlanUndeclaredRefs(plan: AiBuildPlan): AiPlanUndeclaredRef[] {\n const found: AiPlanUndeclaredRef[] = []\n const undeclared = (ref: string | null): ref is string =>\n isAiPlanNewRef(ref) && !aiPlanCreateFor(plan, ref)\n const nameOf = (ref: string) => ref.slice(AI_PLAN_NEW_REF_PREFIX.length).trim()\n plan.screens.forEach((screen, screenIndex) => {\n for (const field of ['layout', 'template'] as const) {\n const ref = screen[field]\n if (!undeclared(ref)) continue\n found.push({\n name: nameOf(ref),\n path: `screens[${screenIndex}].${field}`,\n screenIndex,\n field,\n sectionIndex: null,\n })\n }\n screen.sections.forEach((section, sectionIndex) => {\n section.uses.forEach((ref, useIndex) => {\n if (!undeclared(ref)) return\n found.push({\n name: nameOf(ref),\n path: `screens[${screenIndex}].sections[${sectionIndex}].uses[${useIndex}]`,\n screenIndex,\n field: 'uses',\n sectionIndex,\n })\n })\n })\n })\n return found\n}\n"],"names":["AI_PLAN_NEW_REF_PREFIX","AI_BUILD_PLAN_REUSE_KINDS","AI_BUILD_PLAN_CREATION_NOUNS","component","noun","where","form","layout","template","dataset","email","AI_BUILD_PLAN_CREATE_KINDS","AI_BUILD_PLAN_LIMITS","reuse","create","screens","sections","uses","fields","text","seoDescription","items","string","description","type","nullableString","anyOf","strings","atMost","limit","AI_BUILD_PLAN_TOOL","name","strict","inputSchema","additionalProperties","required","properties","kind","enum","id","purpose","why","duplicateOf","title","slug","nav","seoTitle","isRecord","value","Array","isArray","PlanShapeError","Error","parseAiBuildPlan","input","repairs","path","trimmed","trim","length","push","cut","slice","brk","search","trimEnd","nullable","undefined","list","record","oneOf","allowed","includes","join","root","map","raw","index","entry","names","Set","key","toLowerCase","has","add","field","fieldIndex","filter","Boolean","rawSection","sectionIndex","section","Number","isInteger","ref","refIndex","ok","plan","error","message","isAiPlanNewRef","startsWith","aiPlanCreateFor","find","aiPlanUndeclaredRefs","found","undeclared","nameOf","forEach","screen","screenIndex","useIndex"],"mappings":"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"}
|