@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,643 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ // lockdown-423: via libs/plugins/ai/src/lib/runtime/ai-gate.ts
|
|
18
|
+
// The POST climbs `aiGateLadder`, whose lockdown rung is the verdict.
|
|
19
|
+
import { NODE_HIDE_IF_PROP } from "@aglyn/aglyn/app-utils/compose-reusable-components";
|
|
20
|
+
import { CANVAS_ROOT_ELEMENT_ID } from "@aglyn/aglyn/foundation/constants/canvas";
|
|
21
|
+
import { ASSIST_EDIT_ACTION_ID, assistEditDocumentOf, summarizeAssistEditOps } from "../model/assist-edit.js";
|
|
22
|
+
import { AI_ROUTING_TABLE } from "../providers/routing.js";
|
|
23
|
+
import { aiComponentKindBindsTo, aiComponentPropBindsToField, aiComponentUnofferedAnswers } from "../runtime/ai-component-bindings.js";
|
|
24
|
+
import { runValidatedGeneration } from "../runtime/ai-doctrine.js";
|
|
25
|
+
import { aiGateLadder } from "../runtime/ai-gate.js";
|
|
26
|
+
import { AI_PALETTE } from "../runtime/ai-palette.generated.js";
|
|
27
|
+
import { AI_COMPONENT_MAX_PROPS, AI_COMPONENT_SELECTION_PROP_KINDS, aiComponentPropKindWords } from "../tools/ai-component-tool.js";
|
|
28
|
+
import { recordAssistExchange, releaseAssistMessage } from "../usage/assist-usage.js";
|
|
29
|
+
import { parseAssistEditContext } from "./assist-edit.js";
|
|
30
|
+
/**
|
|
31
|
+
* Save the selection as a reusable component, with AI (AGL-2908):
|
|
32
|
+
* `POST /api/ai/generate/component { orgId, hostId, route, canvas, name }`.
|
|
33
|
+
*
|
|
34
|
+
* The second entry point of the component job. The first builds a component
|
|
35
|
+
* from a brief; this one reads a section the person already has and proposes
|
|
36
|
+
* which of its values become properties — the judgment a person makes in
|
|
37
|
+
* FILE ▸ Properties…, made from the same evidence.
|
|
38
|
+
*
|
|
39
|
+
* ## What it sends, and nothing else
|
|
40
|
+
*
|
|
41
|
+
* The outline of the open page, component or layout — its elements, their
|
|
42
|
+
* names, their shortened settings and text, and the selected element's own
|
|
43
|
+
* styles — and the name the member typed for the component. It reads no
|
|
44
|
+
* other page, no entry, no product, no contact and no site inventory, so
|
|
45
|
+
* none of them is sent. The `AI_DOORS` entry says so.
|
|
46
|
+
*
|
|
47
|
+
* ## It answers references, never a document
|
|
48
|
+
*
|
|
49
|
+
* `props[]` without defaults, and `bindings[]` of `{ nodeId, field, prop }`.
|
|
50
|
+
* The outline shortens every string, so the server has no full value to make
|
|
51
|
+
* a default out of and never invents one: the client reads each bound
|
|
52
|
+
* field's current value off the live canvas as it writes the token in, which
|
|
53
|
+
* is what makes the instance render exactly what was there.
|
|
54
|
+
*
|
|
55
|
+
* ## It writes nothing
|
|
56
|
+
*
|
|
57
|
+
* The answer is an `AssistEditProposal` carrying one `saveAsComponent` op,
|
|
58
|
+
* shown on AGL-2906's own card. The member applies it, and the apply creates
|
|
59
|
+
* the component through the host resources route and swaps the subtree for
|
|
60
|
+
* an instance on the open draft. This door touches no document at all.
|
|
61
|
+
*
|
|
62
|
+
* ## The rungs
|
|
63
|
+
*
|
|
64
|
+
* `aiGateLadder`: the `aiGenerative` entitlement, `release_ai_generative`,
|
|
65
|
+
* the `ai-generate` lockdown switch, `ai.generate` on the site the body
|
|
66
|
+
* named, a per-uid window and a reservation. A refusal before the model runs
|
|
67
|
+
* hands the reservation back.
|
|
68
|
+
*/ /** The name of the structured-output tool the proposal arrives through. */ export const AI_COMPONENT_SELECTION_TOOL_NAME = 'propose_component_from_selection';
|
|
69
|
+
/** The doctrine kind this step runs under; it has no tree of its own to read. */ export const AI_COMPONENT_SELECTION_KIND = 'component-selection';
|
|
70
|
+
/**
|
|
71
|
+
* The answer ceiling. A proposal is a property list and a binding list —
|
|
72
|
+
* references, never a tree — so it needs a fraction of what the from-brief
|
|
73
|
+
* step's answer does.
|
|
74
|
+
*/ export const AI_COMPONENT_SELECTION_MAX_TOKENS = 4000;
|
|
75
|
+
const RATE_LIMIT = {
|
|
76
|
+
key: 'ai-generate-component',
|
|
77
|
+
limit: 10,
|
|
78
|
+
windowMs: 60000
|
|
79
|
+
};
|
|
80
|
+
/** The longest name a component is created under, as the promote dialog takes one. */ const NAME_CHARS = 80;
|
|
81
|
+
/** The longest summary the card shows. */ const SUMMARY_CHARS = 160;
|
|
82
|
+
const NAME_MAX = 40;
|
|
83
|
+
const LABEL_MAX = 80;
|
|
84
|
+
const HELP_MAX = 200;
|
|
85
|
+
const PROP_NAME = /^[A-Za-z][A-Za-z0-9_]{0,39}$/;
|
|
86
|
+
const FIELD_NAME = /^[A-Za-z_][A-Za-z0-9_]{0,40}$/;
|
|
87
|
+
const isRecord = (value)=>typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
88
|
+
/** Every control character and line separator as a space, then squeezed and cut. */ function cleanText(value, limit) {
|
|
89
|
+
let out = '';
|
|
90
|
+
for (const char of String(value != null ? value : '')){
|
|
91
|
+
const code = char.charCodeAt(0);
|
|
92
|
+
out += code < 32 || code === 127 || code === 0x85 || code === 0x2028 || code === 0x2029 ? ' ' : char;
|
|
93
|
+
}
|
|
94
|
+
return out.replace(/\s+/g, ' ').trim().slice(0, limit);
|
|
95
|
+
}
|
|
96
|
+
/* ------------------------------------------------------------------ *
|
|
97
|
+
* The selection
|
|
98
|
+
* ------------------------------------------------------------------ */ /** The element ids of the selection's subtree, the selection included. */ export function aiComponentSelectionIds(context, selectedId) {
|
|
99
|
+
var _byParent_get;
|
|
100
|
+
const byParent = new Map();
|
|
101
|
+
for (const node of context.nodes){
|
|
102
|
+
var _byParent_get1;
|
|
103
|
+
if (!node.parentId) continue;
|
|
104
|
+
byParent.set(node.parentId, [
|
|
105
|
+
...(_byParent_get1 = byParent.get(node.parentId)) != null ? _byParent_get1 : [],
|
|
106
|
+
node.id
|
|
107
|
+
]);
|
|
108
|
+
}
|
|
109
|
+
const found = new Set([
|
|
110
|
+
selectedId
|
|
111
|
+
]);
|
|
112
|
+
const queue = [
|
|
113
|
+
...(_byParent_get = byParent.get(selectedId)) != null ? _byParent_get : []
|
|
114
|
+
];
|
|
115
|
+
while(queue.length){
|
|
116
|
+
var _byParent_get2;
|
|
117
|
+
const id = queue.shift();
|
|
118
|
+
if (found.has(id)) continue;
|
|
119
|
+
found.add(id);
|
|
120
|
+
queue.push(...(_byParent_get2 = byParent.get(id)) != null ? _byParent_get2 : []);
|
|
121
|
+
}
|
|
122
|
+
return found;
|
|
123
|
+
}
|
|
124
|
+
/** A heading's level in the outline: the element it renders as, else its variant. */ function headingLevel(node) {
|
|
125
|
+
var _node_props, _props_variant;
|
|
126
|
+
if (node.componentId !== 'muiTypography') return null;
|
|
127
|
+
const props = (_node_props = node.props) != null ? _node_props : {};
|
|
128
|
+
const element = typeof props['component'] === 'string' ? props['component'] : '';
|
|
129
|
+
const match = /^h([1-6])$/.exec(element || String((_props_variant = props['variant']) != null ? _props_variant : ''));
|
|
130
|
+
return match ? Number(match[1]) : null;
|
|
131
|
+
}
|
|
132
|
+
/** Whichever element a node was told to render as. */ const elementOf = (node)=>{
|
|
133
|
+
var _ref;
|
|
134
|
+
var _node_props, _node_props1;
|
|
135
|
+
const value = (_ref = (_node_props = node.props) == null ? void 0 : _node_props['component']) != null ? _ref : (_node_props1 = node.props) == null ? void 0 : _node_props1['element'];
|
|
136
|
+
return typeof value === 'string' ? value : '';
|
|
137
|
+
};
|
|
138
|
+
/** Why this selection cannot become a component; `null` when it can. */ export function aiComponentSelectionRefusal(context, selectedId) {
|
|
139
|
+
if (!selectedId || selectedId === CANVAS_ROOT_ELEMENT_ID) {
|
|
140
|
+
return 'Select the section you want to save as a component first.';
|
|
141
|
+
}
|
|
142
|
+
const described = new Map(context.nodes.map((node)=>[
|
|
143
|
+
node.id,
|
|
144
|
+
node
|
|
145
|
+
]));
|
|
146
|
+
const selection = described.get(selectedId);
|
|
147
|
+
if (!selection) {
|
|
148
|
+
return 'Select the section you want to save as a component first.';
|
|
149
|
+
}
|
|
150
|
+
const ids = aiComponentSelectionIds(context, selectedId);
|
|
151
|
+
// The outline stops at a cap, so a selection larger than it can describe is
|
|
152
|
+
// one the model would read half of. Refuse rather than guess at the rest.
|
|
153
|
+
for (const id of ids){
|
|
154
|
+
var _context_nodes_filter_length;
|
|
155
|
+
const node = described.get(id);
|
|
156
|
+
if (!node) return 'This section is too large to read all of. Pick a smaller part of it.';
|
|
157
|
+
if (node.childCount > ((_context_nodes_filter_length = context.nodes.filter((other)=>other.parentId === id).length) != null ? _context_nodes_filter_length : 0)) {
|
|
158
|
+
return 'This section is too large to read all of. Pick a smaller part of it.';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Rule 11, before any spend: a component is placed inside pages, so it
|
|
162
|
+
// carries neither the main landmark nor a second top-level heading.
|
|
163
|
+
const inside = [
|
|
164
|
+
...ids
|
|
165
|
+
].map((id)=>described.get(id)).filter(Boolean);
|
|
166
|
+
if (inside.some((node)=>elementOf(node) === 'main')) {
|
|
167
|
+
return 'This section is the page’s main landmark, which a component cannot carry. Pick the part inside it.';
|
|
168
|
+
}
|
|
169
|
+
if (inside.filter((node)=>headingLevel(node) === 1).length > 1) {
|
|
170
|
+
return 'This section has more than one top-level heading. A component carries at most one.';
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
/* ------------------------------------------------------------------ *
|
|
175
|
+
* The tool
|
|
176
|
+
* ------------------------------------------------------------------ */ const STRING = {
|
|
177
|
+
type: 'string'
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* The strict tool the proposal arrives through. Every field is required and
|
|
181
|
+
* flat — optional properties are not portable across strict tool
|
|
182
|
+
* implementations — so a kind with no answers sends `[]`.
|
|
183
|
+
*/ export function aiComponentSelectionTool() {
|
|
184
|
+
return {
|
|
185
|
+
name: AI_COMPONENT_SELECTION_TOOL_NAME,
|
|
186
|
+
description: 'Propose the properties this section should declare once it is a reusable component, and where each one binds.',
|
|
187
|
+
strict: true,
|
|
188
|
+
inputSchema: {
|
|
189
|
+
type: 'object',
|
|
190
|
+
additionalProperties: false,
|
|
191
|
+
required: [
|
|
192
|
+
'summary',
|
|
193
|
+
'props',
|
|
194
|
+
'bindings'
|
|
195
|
+
],
|
|
196
|
+
properties: {
|
|
197
|
+
summary: {
|
|
198
|
+
type: 'string',
|
|
199
|
+
description: 'One line, for the person deciding: what each page will be able to change.'
|
|
200
|
+
},
|
|
201
|
+
props: {
|
|
202
|
+
type: 'array',
|
|
203
|
+
description: 'The properties, in the order a page sets them.',
|
|
204
|
+
items: {
|
|
205
|
+
type: 'object',
|
|
206
|
+
additionalProperties: false,
|
|
207
|
+
required: [
|
|
208
|
+
'name',
|
|
209
|
+
'type',
|
|
210
|
+
'label',
|
|
211
|
+
'description',
|
|
212
|
+
'options'
|
|
213
|
+
],
|
|
214
|
+
properties: {
|
|
215
|
+
name: {
|
|
216
|
+
type: 'string',
|
|
217
|
+
description: 'Letters, digits and underscores, starting with a letter.'
|
|
218
|
+
},
|
|
219
|
+
type: {
|
|
220
|
+
type: 'string',
|
|
221
|
+
enum: [
|
|
222
|
+
...AI_COMPONENT_SELECTION_PROP_KINDS
|
|
223
|
+
],
|
|
224
|
+
description: `The kind, as type (the name a page reads): ${aiComponentPropKindWords(AI_COMPONENT_SELECTION_PROP_KINDS)}.`
|
|
225
|
+
},
|
|
226
|
+
label: {
|
|
227
|
+
type: 'string',
|
|
228
|
+
description: 'The words a page reads beside the field. A property that hides an optional part is labeled "Hide …".'
|
|
229
|
+
},
|
|
230
|
+
description: {
|
|
231
|
+
type: 'string',
|
|
232
|
+
description: 'Help beside the field, or "".'
|
|
233
|
+
},
|
|
234
|
+
options: {
|
|
235
|
+
type: 'array',
|
|
236
|
+
description: 'The answers of a choice; [] for every other kind.',
|
|
237
|
+
items: {
|
|
238
|
+
type: 'object',
|
|
239
|
+
additionalProperties: false,
|
|
240
|
+
required: [
|
|
241
|
+
'value',
|
|
242
|
+
'label'
|
|
243
|
+
],
|
|
244
|
+
properties: {
|
|
245
|
+
value: {
|
|
246
|
+
type: 'string',
|
|
247
|
+
description: 'What the bound field receives: one of the values that field lists.'
|
|
248
|
+
},
|
|
249
|
+
label: {
|
|
250
|
+
type: 'string',
|
|
251
|
+
description: 'What a page picks.'
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
bindings: {
|
|
260
|
+
type: 'array',
|
|
261
|
+
description: 'Where each property goes. Every property is bound at least once.',
|
|
262
|
+
items: {
|
|
263
|
+
type: 'object',
|
|
264
|
+
additionalProperties: false,
|
|
265
|
+
required: [
|
|
266
|
+
'nodeId',
|
|
267
|
+
'field',
|
|
268
|
+
'prop'
|
|
269
|
+
],
|
|
270
|
+
properties: {
|
|
271
|
+
nodeId: {
|
|
272
|
+
type: 'string',
|
|
273
|
+
description: 'An element id from the selected section, as the outline gave it.'
|
|
274
|
+
},
|
|
275
|
+
field: {
|
|
276
|
+
type: 'string',
|
|
277
|
+
description: `A setting of that element, or "${NODE_HIDE_IF_PROP}" to hide an optional part.`
|
|
278
|
+
},
|
|
279
|
+
prop: {
|
|
280
|
+
type: 'string',
|
|
281
|
+
description: 'The name of the property it takes.'
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/** The label a property that hides an optional part opens with. */ const HIDE_LABEL = /^Hide\b/;
|
|
291
|
+
const paletteEntry = (componentId)=>AI_PALETTE[componentId];
|
|
292
|
+
/**
|
|
293
|
+
* The proposal, held to the selection it was made from.
|
|
294
|
+
*
|
|
295
|
+
* A CLOSED WORLD, like the edit rung's: every element named is one the
|
|
296
|
+
* outline described, inside the selection. A binding outside it would tie a
|
|
297
|
+
* property of the new component to an element the component does not
|
|
298
|
+
* contain, and the token would render as its own marker on the page.
|
|
299
|
+
*
|
|
300
|
+
* Every other rule is the from-brief step's own, read from the same module,
|
|
301
|
+
* so the two paths cannot disagree about which property fits which field.
|
|
302
|
+
*/ export function checkAiComponentSelection(answer, context, selectedId) {
|
|
303
|
+
const violations = [];
|
|
304
|
+
const finding = (code, message, path)=>{
|
|
305
|
+
violations.push({
|
|
306
|
+
rule: 1,
|
|
307
|
+
code,
|
|
308
|
+
message,
|
|
309
|
+
paths: [
|
|
310
|
+
path
|
|
311
|
+
]
|
|
312
|
+
});
|
|
313
|
+
};
|
|
314
|
+
const inside = aiComponentSelectionIds(context, selectedId);
|
|
315
|
+
const described = new Map(context.nodes.map((node)=>[
|
|
316
|
+
node.id,
|
|
317
|
+
node
|
|
318
|
+
]));
|
|
319
|
+
const rawProps = Array.isArray(answer['props']) ? answer['props'] : null;
|
|
320
|
+
const rawBindings = Array.isArray(answer['bindings']) ? answer['bindings'] : null;
|
|
321
|
+
if (!rawProps || !rawBindings) {
|
|
322
|
+
finding('proposal-missing', 'The proposal came without its properties or its bindings. Send both lists, even when one is empty.', 'props');
|
|
323
|
+
return {
|
|
324
|
+
value: null,
|
|
325
|
+
violations
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
if (rawProps.length > AI_COMPONENT_MAX_PROPS) {
|
|
329
|
+
finding('props-too-many', `A component declares at most ${AI_COMPONENT_MAX_PROPS} properties. Keep the ones a page really changes.`, 'props');
|
|
330
|
+
return {
|
|
331
|
+
value: null,
|
|
332
|
+
violations
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
const props = [];
|
|
336
|
+
const byName = new Map();
|
|
337
|
+
rawProps.forEach((raw, index)=>{
|
|
338
|
+
const path = `props[${index}]`;
|
|
339
|
+
if (!isRecord(raw)) return finding('prop-shape', 'A property is not an object.', path);
|
|
340
|
+
const name = cleanText(raw['name'], NAME_MAX);
|
|
341
|
+
if (!PROP_NAME.test(name)) {
|
|
342
|
+
return finding('prop-name', 'A property name is letters, digits and underscores, starting with a letter.', path);
|
|
343
|
+
}
|
|
344
|
+
if (byName.has(name)) {
|
|
345
|
+
return finding('prop-duplicate', `Two properties are called "${name}".`, path);
|
|
346
|
+
}
|
|
347
|
+
const type = cleanText(raw['type'], NAME_MAX);
|
|
348
|
+
if (!AI_COMPONENT_SELECTION_PROP_KINDS.includes(type)) {
|
|
349
|
+
return finding('prop-kind', `"${type}" is not a kind a property takes.`, path);
|
|
350
|
+
}
|
|
351
|
+
const options = Array.isArray(raw['options']) ? raw['options'].filter(isRecord).map((option)=>({
|
|
352
|
+
value: cleanText(option['value'], LABEL_MAX),
|
|
353
|
+
label: cleanText(option['label'], LABEL_MAX)
|
|
354
|
+
})).filter((option)=>option.value) : [];
|
|
355
|
+
if (type === 'choice' && !options.length) {
|
|
356
|
+
return finding('prop-answers', `The choice "${name}" lists no answers.`, path);
|
|
357
|
+
}
|
|
358
|
+
const label = cleanText(raw['label'], LABEL_MAX);
|
|
359
|
+
const description = cleanText(raw['description'], HELP_MAX);
|
|
360
|
+
const prop = _extends({
|
|
361
|
+
name,
|
|
362
|
+
type: type
|
|
363
|
+
}, label ? {
|
|
364
|
+
label
|
|
365
|
+
} : {}, description ? {
|
|
366
|
+
description
|
|
367
|
+
} : {}, options.length ? {
|
|
368
|
+
options
|
|
369
|
+
} : {});
|
|
370
|
+
props.push(prop);
|
|
371
|
+
byName.set(name, prop);
|
|
372
|
+
});
|
|
373
|
+
if (violations.length) return {
|
|
374
|
+
value: null,
|
|
375
|
+
violations
|
|
376
|
+
};
|
|
377
|
+
const bindings = [];
|
|
378
|
+
const bound = new Set();
|
|
379
|
+
rawBindings.forEach((raw, index)=>{
|
|
380
|
+
var _prop_label;
|
|
381
|
+
const path = `bindings[${index}]`;
|
|
382
|
+
if (!isRecord(raw)) return finding('binding-shape', 'A binding is not an object.', path);
|
|
383
|
+
const nodeId = cleanText(raw['nodeId'], 64);
|
|
384
|
+
const node = described.get(nodeId);
|
|
385
|
+
if (!node || !inside.has(nodeId)) {
|
|
386
|
+
return finding('binding-outside', 'A property is bound to an element outside the section being saved. Bind only elements the section contains.', path);
|
|
387
|
+
}
|
|
388
|
+
const field = cleanText(raw['field'], 40);
|
|
389
|
+
if (!FIELD_NAME.test(field)) {
|
|
390
|
+
return finding('binding-field', `"${field}" is not a setting of an element.`, path);
|
|
391
|
+
}
|
|
392
|
+
if (field === NODE_HIDE_IF_PROP && nodeId === selectedId) {
|
|
393
|
+
return finding('binding-hides-all', 'A property cannot hide the whole component. Hide the optional part inside it.', path);
|
|
394
|
+
}
|
|
395
|
+
const propName = cleanText(raw['prop'], NAME_MAX);
|
|
396
|
+
const prop = byName.get(propName);
|
|
397
|
+
if (!prop) {
|
|
398
|
+
return finding('binding-undeclared', `No property is called "${propName}".`, path);
|
|
399
|
+
}
|
|
400
|
+
const entry = paletteEntry(node.componentId);
|
|
401
|
+
const binding = prop;
|
|
402
|
+
if (!aiComponentPropBindsToField(binding, entry, field, 'whole')) {
|
|
403
|
+
return finding('binding-fit', `"${prop.name}" does not fit the "${field}" setting of that element. Bind it to a setting of its own kind.`, path);
|
|
404
|
+
}
|
|
405
|
+
const unoffered = aiComponentUnofferedAnswers(binding, entry, field);
|
|
406
|
+
if (unoffered.length) {
|
|
407
|
+
return finding('binding-answers', `The answers ${unoffered.join(', ')} of "${prop.name}" are not ones that setting lists.`, path);
|
|
408
|
+
}
|
|
409
|
+
if (field === NODE_HIDE_IF_PROP && !HIDE_LABEL.test((_prop_label = prop.label) != null ? _prop_label : '')) {
|
|
410
|
+
return finding('hide-label', `A property that hides a part is labeled "Hide …", so a page reads what it does. "${prop.name}" is not.`, path);
|
|
411
|
+
}
|
|
412
|
+
bound.add(propName);
|
|
413
|
+
bindings.push({
|
|
414
|
+
nodeId,
|
|
415
|
+
componentId: node.componentId,
|
|
416
|
+
field,
|
|
417
|
+
prop: propName
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
if (violations.length) return {
|
|
421
|
+
value: null,
|
|
422
|
+
violations
|
|
423
|
+
};
|
|
424
|
+
for (const prop of props){
|
|
425
|
+
var _prop_type;
|
|
426
|
+
if (bound.has(prop.name)) continue;
|
|
427
|
+
finding('prop-unbound', `"${prop.name}" is declared and never bound. Every property fills a setting of the section: bind a ${prop.type} property to ${aiComponentKindBindsTo((_prop_type = prop.type) != null ? _prop_type : 'text')}.`, 'bindings');
|
|
428
|
+
}
|
|
429
|
+
if (!bindings.length) {
|
|
430
|
+
finding('nothing-proposed', 'Nothing in this section was proposed as a property. Name the values a page should be able to change.', 'bindings');
|
|
431
|
+
}
|
|
432
|
+
if (violations.length) return {
|
|
433
|
+
value: null,
|
|
434
|
+
violations
|
|
435
|
+
};
|
|
436
|
+
return {
|
|
437
|
+
value: {
|
|
438
|
+
summary: cleanText(answer['summary'], SUMMARY_CHARS),
|
|
439
|
+
props,
|
|
440
|
+
bindings
|
|
441
|
+
},
|
|
442
|
+
violations: []
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
/* ------------------------------------------------------------------ *
|
|
446
|
+
* The request
|
|
447
|
+
* ------------------------------------------------------------------ */ const INSTRUCTION_TEXT = [
|
|
448
|
+
'You are naming the properties a section should declare once it becomes a reusable component.',
|
|
449
|
+
'',
|
|
450
|
+
'A person selected a section of a page they are editing. You are given the outline of that page — its elements, their settings and their text, shortened — and the id of the element they selected. Decide which of the values inside that selection a page placing the component should be able to change, and bind each one to the setting it fills.',
|
|
451
|
+
'',
|
|
452
|
+
'Rules:',
|
|
453
|
+
'- Only elements inside the selected section. Never bind anything outside it.',
|
|
454
|
+
'- One property per thing a page changes, not one per element. A heading and the paragraph under it are two properties; the same heading bound twice is one.',
|
|
455
|
+
'- Bind a property to a setting of its own kind: copy to text, a picture to a picture, an address to a link, an answer to a setting that lists answers.',
|
|
456
|
+
`- An optional part gets a Yes / no property labeled "Hide …", bound to that part's "${NODE_HIDE_IF_PROP}". Never to the section itself.`,
|
|
457
|
+
'- Leave alone what every page should show the same way: the layout, the styling, the labels that make the section what it is.',
|
|
458
|
+
'- Do not invent defaults. The editor reads each value off the page as it writes the property in.',
|
|
459
|
+
'',
|
|
460
|
+
`Answer by calling ${AI_COMPONENT_SELECTION_TOOL_NAME} exactly once. A reply in prose cannot be used.`
|
|
461
|
+
].join('\n');
|
|
462
|
+
/** Byte-identical on every request, so the block caches. */ export const AI_COMPONENT_SELECTION_INSTRUCTIONS = [
|
|
463
|
+
{
|
|
464
|
+
text: INSTRUCTION_TEXT,
|
|
465
|
+
cacheBreakpoint: true
|
|
466
|
+
}
|
|
467
|
+
];
|
|
468
|
+
/** The outline and the selection, as the question the model answers. */ export function aiComponentSelectionPrompt(context, selectedId, name) {
|
|
469
|
+
const inside = aiComponentSelectionIds(context, selectedId);
|
|
470
|
+
// The brief tier lies outside the selection, which is all this door binds.
|
|
471
|
+
const lines = context.nodes.filter((node)=>!node.brief).map((node)=>{
|
|
472
|
+
const parts = [
|
|
473
|
+
`${inside.has(node.id) ? '*' : ' '} ${node.id}: ${node.componentId}`,
|
|
474
|
+
node.name ? `name=${JSON.stringify(node.name)}` : '',
|
|
475
|
+
node.parentId ? `in=${node.parentId}` : 'root',
|
|
476
|
+
node.childCount ? `children=${node.childCount}` : '',
|
|
477
|
+
node.props ? `settings=${JSON.stringify(node.props)}` : ''
|
|
478
|
+
];
|
|
479
|
+
return parts.filter(Boolean).join(' ');
|
|
480
|
+
});
|
|
481
|
+
return [
|
|
482
|
+
`The component will be called ${JSON.stringify(name)}.`,
|
|
483
|
+
`The selected section is ${selectedId}; every line marked * is inside it.`,
|
|
484
|
+
'',
|
|
485
|
+
...lines
|
|
486
|
+
].join('\n');
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* The proposal for one selection, as the op the card applies. Exported for
|
|
490
|
+
* the spec, which drives it with a recorded answer and never a live model.
|
|
491
|
+
*/ export function aiComponentSelectionOp(proposal, selection, name) {
|
|
492
|
+
return {
|
|
493
|
+
op: 'saveAsComponent',
|
|
494
|
+
nodeId: selection.id,
|
|
495
|
+
componentId: selection.componentId,
|
|
496
|
+
name,
|
|
497
|
+
props: proposal.props,
|
|
498
|
+
bindings: proposal.bindings
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
export async function POST(request) {
|
|
502
|
+
var _ref, _ref1;
|
|
503
|
+
let body;
|
|
504
|
+
try {
|
|
505
|
+
body = await request.json();
|
|
506
|
+
} catch (unused) {
|
|
507
|
+
body = null;
|
|
508
|
+
}
|
|
509
|
+
const rawHost = body == null ? void 0 : body['hostId'];
|
|
510
|
+
const hostId = typeof rawHost === 'string' && rawHost ? rawHost : null;
|
|
511
|
+
const gate = await aiGateLadder({
|
|
512
|
+
request,
|
|
513
|
+
orgId: String((_ref = body == null ? void 0 : body['orgId']) != null ? _ref : ''),
|
|
514
|
+
hostId
|
|
515
|
+
}, {
|
|
516
|
+
feature: 'aiGenerative',
|
|
517
|
+
releaseFlag: 'release_ai_generative',
|
|
518
|
+
lockdownFeature: 'ai-generate',
|
|
519
|
+
permission: 'ai.generate',
|
|
520
|
+
rateLimit: RATE_LIMIT
|
|
521
|
+
});
|
|
522
|
+
if (gate instanceof Response) return gate;
|
|
523
|
+
// Nothing is spent until the model runs, so every exit before it hands the
|
|
524
|
+
// reservation back.
|
|
525
|
+
const release = ()=>releaseAssistMessage(gate.firestore, gate.orgId, gate.reservation).catch(()=>undefined);
|
|
526
|
+
const refuse = async (error, status)=>{
|
|
527
|
+
await release();
|
|
528
|
+
return Response.json({
|
|
529
|
+
error
|
|
530
|
+
}, {
|
|
531
|
+
status
|
|
532
|
+
});
|
|
533
|
+
};
|
|
534
|
+
if (!hostId) return refuse('Open the site this section is on before saving it.', 400);
|
|
535
|
+
const document = assistEditDocumentOf(String((_ref1 = body == null ? void 0 : body['route']) != null ? _ref1 : ''));
|
|
536
|
+
if (!document) {
|
|
537
|
+
return refuse('Open the page, component or layout this section is on.', 400);
|
|
538
|
+
}
|
|
539
|
+
const context = parseAssistEditContext(body == null ? void 0 : body['canvas']);
|
|
540
|
+
if (!context) return refuse('The editor did not describe what is open.', 400);
|
|
541
|
+
const name = cleanText(body == null ? void 0 : body['name'], NAME_CHARS);
|
|
542
|
+
if (!name) return refuse('Give the component a name first.', 400);
|
|
543
|
+
const selectedId = context.selectedId;
|
|
544
|
+
const refusal = aiComponentSelectionRefusal(context, selectedId);
|
|
545
|
+
if (refusal) return refuse(refusal, 400);
|
|
546
|
+
const selection = context.nodes.find((node)=>node.id === selectedId);
|
|
547
|
+
if (!selection) return refuse('Select the section you want to save as a component first.', 400);
|
|
548
|
+
const target = _extends({
|
|
549
|
+
hostId
|
|
550
|
+
}, document);
|
|
551
|
+
const generation = _extends({
|
|
552
|
+
step: 'job.component',
|
|
553
|
+
instructions: AI_COMPONENT_SELECTION_INSTRUCTIONS,
|
|
554
|
+
// No site inventory: this step reads the open document and nothing else
|
|
555
|
+
// of the site, and the disclosure says so.
|
|
556
|
+
inventory: undefined,
|
|
557
|
+
messages: [
|
|
558
|
+
{
|
|
559
|
+
role: 'user',
|
|
560
|
+
content: aiComponentSelectionPrompt(context, selection.id, name)
|
|
561
|
+
}
|
|
562
|
+
],
|
|
563
|
+
tool: aiComponentSelectionTool(),
|
|
564
|
+
maxTokens: AI_COMPONENT_SELECTION_MAX_TOKENS
|
|
565
|
+
}, AI_ROUTING_TABLE['job.component'].thinking ? {
|
|
566
|
+
thinking: AI_ROUTING_TABLE['job.component'].thinking
|
|
567
|
+
} : {}, {
|
|
568
|
+
check: (answer)=>checkAiComponentSelection(answer, context, selection.id)
|
|
569
|
+
});
|
|
570
|
+
let result;
|
|
571
|
+
try {
|
|
572
|
+
result = await runValidatedGeneration(AI_COMPONENT_SELECTION_KIND, generation);
|
|
573
|
+
} catch (error) {
|
|
574
|
+
await release();
|
|
575
|
+
console.error('ai component proposal failed', {
|
|
576
|
+
orgId: gate.orgId,
|
|
577
|
+
hostId,
|
|
578
|
+
error
|
|
579
|
+
});
|
|
580
|
+
return Response.json({
|
|
581
|
+
error: 'The component could not be proposed'
|
|
582
|
+
}, {
|
|
583
|
+
status: 500
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
if (result.status !== 'ok') {
|
|
587
|
+
var _result_message;
|
|
588
|
+
const error = result.status === 'refused' ? 'The assistant would not propose a component for this section.' : (_result_message = result.message) != null ? _result_message : 'The assistant could not name properties for this section. Try a smaller part of it.';
|
|
589
|
+
// The model ran, so the reservation is spent: it is not handed back.
|
|
590
|
+
return Response.json({
|
|
591
|
+
error
|
|
592
|
+
}, {
|
|
593
|
+
status: 422
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
const op = aiComponentSelectionOp(result.value, selection, name);
|
|
597
|
+
const edit = {
|
|
598
|
+
id: ASSIST_EDIT_ACTION_ID,
|
|
599
|
+
summary: result.value.summary,
|
|
600
|
+
ops: [
|
|
601
|
+
op
|
|
602
|
+
],
|
|
603
|
+
diff: summarizeAssistEditOps([
|
|
604
|
+
op
|
|
605
|
+
]),
|
|
606
|
+
dropped: [],
|
|
607
|
+
target
|
|
608
|
+
};
|
|
609
|
+
let exchangeId = null;
|
|
610
|
+
try {
|
|
611
|
+
var _ref2, _gate_reservation_free;
|
|
612
|
+
exchangeId = await recordAssistExchange(gate.firestore, gate.orgId, {
|
|
613
|
+
uid: gate.uid,
|
|
614
|
+
hostId,
|
|
615
|
+
kind: 'component',
|
|
616
|
+
// The person's own words for the component, and the proposal's line
|
|
617
|
+
// back: the pair the signals page reads, and nothing off the page.
|
|
618
|
+
question: name,
|
|
619
|
+
answer: edit.summary,
|
|
620
|
+
route: String((_ref2 = body == null ? void 0 : body['route']) != null ? _ref2 : ''),
|
|
621
|
+
model: result.model,
|
|
622
|
+
tier: 'entitled',
|
|
623
|
+
usage: result.usage,
|
|
624
|
+
docsPaths: [],
|
|
625
|
+
stopReason: result.stopReason,
|
|
626
|
+
free: (_gate_reservation_free = gate.reservation.free) != null ? _gate_reservation_free : null,
|
|
627
|
+
editOps: edit.ops.length
|
|
628
|
+
});
|
|
629
|
+
} catch (error) {
|
|
630
|
+
// The proposal is the answer; a meter that could not be written is not a
|
|
631
|
+
// reason to withhold it from the person who paid for it.
|
|
632
|
+
console.error('ai component exchange not recorded', {
|
|
633
|
+
orgId: gate.orgId,
|
|
634
|
+
error
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
return Response.json({
|
|
638
|
+
edit,
|
|
639
|
+
exchangeId
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
//# sourceMappingURL=ai-generate-component.js.map
|