@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,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import type { ConsoleOrgSitesZoneProps } from '@aglyn/aglyn/plugin-manager/feature-plugins';
|
|
18
|
+
import { type AiJobSummary } from '../model/ai-jobs.types';
|
|
19
|
+
/** A site's per-run variables, as the member typed them. */
|
|
20
|
+
export interface AiSiteBatchRow {
|
|
21
|
+
hostId: string;
|
|
22
|
+
picked: boolean;
|
|
23
|
+
businessName: string;
|
|
24
|
+
city: string;
|
|
25
|
+
brand: string;
|
|
26
|
+
}
|
|
27
|
+
/** The jobs of one batch, newest batch first, as the list route serves them. */
|
|
28
|
+
export declare function aiSiteBatchJobs(jobs: readonly AiJobSummary[], batchId: string | null): AiJobSummary[];
|
|
29
|
+
/** The batch a list of jobs most recently ran, or `null` when none did. */
|
|
30
|
+
export declare function aiLatestSiteBatch(jobs: readonly AiJobSummary[]): string | null;
|
|
31
|
+
export declare function AiSiteBatchCard(props: ConsoleOrgSitesZoneProps): JSX.Element | null;
|
|
32
|
+
export default AiSiteBatchCard;
|
|
@@ -0,0 +1,531 @@
|
|
|
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
|
+
*/ 'use client';
|
|
17
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
18
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
19
|
+
import { lockdownRefusalText, parseLockdownRefusal } from "@aglyn/aglyn";
|
|
20
|
+
import { AppLink, CardDisplay } from "@aglyn/shared-ui-jsx";
|
|
21
|
+
import { ListTable } from "@aglyn/shared-ui-jsx/components/list-table.component";
|
|
22
|
+
import { ScrollTable } from "@aglyn/shared-ui-jsx/components/scroll-table.component";
|
|
23
|
+
import { TABLE_ROW_HEIGHT } from "@aglyn/shared-ui-jsx/const/table-pagination";
|
|
24
|
+
import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
|
|
25
|
+
import { useUser } from "@aglyn/tenant-feature-instance";
|
|
26
|
+
import { Alert, Box, Button, Checkbox, Chip, CircularProgress, Collapse, MenuItem, Stack, TableBody, TableCell, TableHead, TableRow, TextField, Typography } from "@mui/material";
|
|
27
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
28
|
+
import { AI_JOB_TERMINAL_STATUSES } from "../model/ai-jobs.types.js";
|
|
29
|
+
import { AI_SITE_BATCH_MAX, AI_SITE_PAGES, AI_SITE_SUBMISSION_CHOICES, aiSiteCreditEstimate } from "../model/ai-site-job.js";
|
|
30
|
+
/**
|
|
31
|
+
* The agency batch (AGL-2911), on the organization's Sites page: one brief,
|
|
32
|
+
* with the business name, the city and the brand changed per site, started
|
|
33
|
+
* across many of the org's sites at once.
|
|
34
|
+
*
|
|
35
|
+
* What it starts are ordinary site scaffolds. Each plans first and waits for
|
|
36
|
+
* its own confirmation in the Assist panel before it builds anything, and
|
|
37
|
+
* everything it then builds is a draft — so this card publishes nothing and
|
|
38
|
+
* changes no live site, however many sites it is pointed at.
|
|
39
|
+
*
|
|
40
|
+
* The estimate beside the button is the guard rail the issue asks for: what
|
|
41
|
+
* one site is estimated to cost, and what the whole run is, before a credit
|
|
42
|
+
* is spent on any of it.
|
|
43
|
+
*
|
|
44
|
+
* Where a contact form's submissions go is asked once for the run and binds
|
|
45
|
+
* every site's form step (AGL-2918), in the words the guided start asks it
|
|
46
|
+
* in: one decision, worded once, whether it is asked of one site or twenty.
|
|
47
|
+
*/ /** Jobs the card reads to find the batches this workspace has run. */ const RECENT_JOBS_READ = 100;
|
|
48
|
+
/** A batch over one site is a scaffold; the card is for the other case. */ const MIN_SITES = 2;
|
|
49
|
+
const STATUS_LABEL = {
|
|
50
|
+
queued: 'Queued',
|
|
51
|
+
running: 'Running',
|
|
52
|
+
needs_input: 'Needs attention',
|
|
53
|
+
needs_review: 'Confirm the plan',
|
|
54
|
+
done: 'Done',
|
|
55
|
+
failed: 'Failed',
|
|
56
|
+
canceled: 'Canceled'
|
|
57
|
+
};
|
|
58
|
+
const STATUS_COLOR = {
|
|
59
|
+
queued: 'default',
|
|
60
|
+
running: 'primary',
|
|
61
|
+
needs_input: 'warning',
|
|
62
|
+
needs_review: 'warning',
|
|
63
|
+
done: 'success',
|
|
64
|
+
failed: 'error',
|
|
65
|
+
canceled: 'default'
|
|
66
|
+
};
|
|
67
|
+
const isTerminal = (job)=>AI_JOB_TERMINAL_STATUSES.includes(job.status);
|
|
68
|
+
/** The jobs of one batch, newest batch first, as the list route serves them. */ export function aiSiteBatchJobs(jobs, batchId) {
|
|
69
|
+
if (!batchId) return [];
|
|
70
|
+
return jobs.filter((job)=>job.batch === batchId);
|
|
71
|
+
}
|
|
72
|
+
/** The batch a list of jobs most recently ran, or `null` when none did. */ export function aiLatestSiteBatch(jobs) {
|
|
73
|
+
var _ref;
|
|
74
|
+
var _jobs_find;
|
|
75
|
+
return (_ref = (_jobs_find = jobs.find((job)=>job.kind === 'site' && job.batch)) == null ? void 0 : _jobs_find.batch) != null ? _ref : null;
|
|
76
|
+
}
|
|
77
|
+
export function AiSiteBatchCard(props) {
|
|
78
|
+
var _ref, _basePath_split_filter_;
|
|
79
|
+
const { orgMount, basePath } = props;
|
|
80
|
+
const { orgId, hosts, hostsReady } = orgMount;
|
|
81
|
+
const { data: user } = useUser();
|
|
82
|
+
const userRef = useRef(user);
|
|
83
|
+
userRef.current = user;
|
|
84
|
+
const uid = (_ref = user == null ? void 0 : user.uid) != null ? _ref : null;
|
|
85
|
+
const orgSlug = (_basePath_split_filter_ = basePath.split('/').filter(Boolean)[0]) != null ? _basePath_split_filter_ : '';
|
|
86
|
+
const [verdict, setVerdict] = useState('checking');
|
|
87
|
+
const [open, setOpen] = useState(false);
|
|
88
|
+
const [notice, setNotice] = useState(null);
|
|
89
|
+
const [busy, setBusy] = useState(false);
|
|
90
|
+
const [brief, setBrief] = useState('');
|
|
91
|
+
const [businessType, setBusinessType] = useState('');
|
|
92
|
+
const [pages, setPages] = useState(AI_SITE_PAGES.min + 1);
|
|
93
|
+
const [welcomeEmail, setWelcomeEmail] = useState(true);
|
|
94
|
+
/*
|
|
95
|
+
* One routing answer for the whole run. It starts on the Inbox — what every
|
|
96
|
+
* submission does anyway — because filing a lead as well is the addition,
|
|
97
|
+
* and an addition is the thing somebody should have to choose.
|
|
98
|
+
*/ const [submissions, setSubmissions] = useState('inbox');
|
|
99
|
+
const [rows, setRows] = useState([]);
|
|
100
|
+
const [batchId, setBatchId] = useState(null);
|
|
101
|
+
const [jobs, setJobs] = useState([]);
|
|
102
|
+
// One row per site the page resolved for this reader, kept as the list moves.
|
|
103
|
+
useEffect(()=>{
|
|
104
|
+
setRows((current)=>{
|
|
105
|
+
const byId = new Map(current.map((row)=>[
|
|
106
|
+
row.hostId,
|
|
107
|
+
row
|
|
108
|
+
]));
|
|
109
|
+
return hosts.map((host)=>{
|
|
110
|
+
var _byId_get;
|
|
111
|
+
return (_byId_get = byId.get(host.id)) != null ? _byId_get : {
|
|
112
|
+
hostId: host.id,
|
|
113
|
+
picked: false,
|
|
114
|
+
businessName: host.name,
|
|
115
|
+
city: '',
|
|
116
|
+
brand: ''
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
}, [
|
|
121
|
+
hosts
|
|
122
|
+
]);
|
|
123
|
+
const load = useCallback(async ()=>{
|
|
124
|
+
var _ref;
|
|
125
|
+
if (!orgId) return;
|
|
126
|
+
const response = await authorizedFetch(userRef.current, `/api/ai/jobs?orgId=${encodeURIComponent(orgId)}&limit=${RECENT_JOBS_READ}`);
|
|
127
|
+
// The generative doors answer 404 behind their release flag and 403
|
|
128
|
+
// without the add-on: a feature that is not released does not exist.
|
|
129
|
+
if (response.status === 404 || response.status === 403) return 'hidden';
|
|
130
|
+
const payload = await response.json().catch(()=>null);
|
|
131
|
+
if (!response.ok) {
|
|
132
|
+
var _ref1;
|
|
133
|
+
const locked = parseLockdownRefusal(response.status, payload);
|
|
134
|
+
setNotice(locked ? lockdownRefusalText(locked) : String((_ref1 = payload == null ? void 0 : payload.error) != null ? _ref1 : ''));
|
|
135
|
+
return 'ready';
|
|
136
|
+
}
|
|
137
|
+
const listed = (_ref = payload == null ? void 0 : payload.jobs) != null ? _ref : [];
|
|
138
|
+
setJobs(listed);
|
|
139
|
+
setBatchId((current)=>current != null ? current : aiLatestSiteBatch(listed));
|
|
140
|
+
return 'ready';
|
|
141
|
+
}, [
|
|
142
|
+
orgId
|
|
143
|
+
]);
|
|
144
|
+
useEffect(()=>{
|
|
145
|
+
if (!orgId || !uid) return;
|
|
146
|
+
let active = true;
|
|
147
|
+
setVerdict('checking');
|
|
148
|
+
void (async ()=>{
|
|
149
|
+
try {
|
|
150
|
+
const answer = await load();
|
|
151
|
+
if (active && answer) setVerdict(answer);
|
|
152
|
+
} catch (unused) {
|
|
153
|
+
if (active) setVerdict('ready');
|
|
154
|
+
}
|
|
155
|
+
})();
|
|
156
|
+
return ()=>{
|
|
157
|
+
active = false;
|
|
158
|
+
};
|
|
159
|
+
}, [
|
|
160
|
+
orgId,
|
|
161
|
+
uid,
|
|
162
|
+
load
|
|
163
|
+
]);
|
|
164
|
+
const picked = useMemo(()=>rows.filter((row)=>row.picked), [
|
|
165
|
+
rows
|
|
166
|
+
]);
|
|
167
|
+
const perSite = aiSiteCreditEstimate(pages, {
|
|
168
|
+
welcomeEmail
|
|
169
|
+
});
|
|
170
|
+
const runJobs = useMemo(()=>aiSiteBatchJobs(jobs, batchId), [
|
|
171
|
+
jobs,
|
|
172
|
+
batchId
|
|
173
|
+
]);
|
|
174
|
+
const siteName = useCallback((hostId)=>{
|
|
175
|
+
var _ref;
|
|
176
|
+
var _hosts_find;
|
|
177
|
+
return (_ref = (_hosts_find = hosts.find((host)=>host.id === hostId)) == null ? void 0 : _hosts_find.name) != null ? _ref : 'This site';
|
|
178
|
+
}, [
|
|
179
|
+
hosts
|
|
180
|
+
]);
|
|
181
|
+
const siteHref = useCallback((hostId)=>{
|
|
182
|
+
var _hosts_find;
|
|
183
|
+
const subdomain = (_hosts_find = hosts.find((host)=>host.id === hostId)) == null ? void 0 : _hosts_find.subdomain;
|
|
184
|
+
return subdomain ? `${orgMount.hostsPath}/${subdomain}` : null;
|
|
185
|
+
}, [
|
|
186
|
+
hosts,
|
|
187
|
+
orgMount.hostsPath
|
|
188
|
+
]);
|
|
189
|
+
/*
|
|
190
|
+
* One row per job of the run. A job has no page of its own — it is
|
|
191
|
+
* confirmed and followed in the Assist panel — so the row opens nothing,
|
|
192
|
+
* and the site it built for is a link when the console has an address for
|
|
193
|
+
* that site.
|
|
194
|
+
*/ const runColumns = useMemo(()=>[
|
|
195
|
+
{
|
|
196
|
+
field: 'site',
|
|
197
|
+
headerName: 'Site',
|
|
198
|
+
flex: 1,
|
|
199
|
+
minWidth: 180,
|
|
200
|
+
valueGetter: (_value, job)=>siteName(job.hostId),
|
|
201
|
+
renderCell: ({ row: job })=>{
|
|
202
|
+
const href = siteHref(job.hostId);
|
|
203
|
+
return href ? /*#__PURE__*/ _jsx(AppLink, {
|
|
204
|
+
href: href,
|
|
205
|
+
children: siteName(job.hostId)
|
|
206
|
+
}) : siteName(job.hostId);
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
field: 'status',
|
|
211
|
+
headerName: 'Status',
|
|
212
|
+
width: 180,
|
|
213
|
+
valueGetter: (_value, job)=>STATUS_LABEL[job.status],
|
|
214
|
+
renderCell: ({ row: job })=>/*#__PURE__*/ _jsx(Chip, {
|
|
215
|
+
size: "small",
|
|
216
|
+
label: STATUS_LABEL[job.status],
|
|
217
|
+
color: STATUS_COLOR[job.status]
|
|
218
|
+
})
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
field: 'drafts',
|
|
222
|
+
headerName: 'Drafts',
|
|
223
|
+
type: 'number',
|
|
224
|
+
align: 'right',
|
|
225
|
+
headerAlign: 'right',
|
|
226
|
+
width: 100,
|
|
227
|
+
valueGetter: (_value, job)=>isTerminal(job) || job.outputs.length ? job.outputs.length : null,
|
|
228
|
+
valueFormatter: (value)=>value === null ? '—' : String(value)
|
|
229
|
+
}
|
|
230
|
+
], [
|
|
231
|
+
siteHref,
|
|
232
|
+
siteName
|
|
233
|
+
]);
|
|
234
|
+
const update = (hostId, patch)=>setRows((current)=>current.map((row)=>row.hostId === hostId ? _extends({}, row, patch) : row));
|
|
235
|
+
const start = useCallback(async ()=>{
|
|
236
|
+
if (!orgId || !picked.length) return;
|
|
237
|
+
setBusy(true);
|
|
238
|
+
setNotice(null);
|
|
239
|
+
try {
|
|
240
|
+
var _ref, _ref1, _ref2;
|
|
241
|
+
const response = await authorizedFetch(userRef.current, '/api/ai/jobs/batch', {
|
|
242
|
+
method: 'POST',
|
|
243
|
+
headers: {
|
|
244
|
+
'Content-Type': 'application/json'
|
|
245
|
+
},
|
|
246
|
+
body: JSON.stringify({
|
|
247
|
+
orgId,
|
|
248
|
+
brief,
|
|
249
|
+
businessType,
|
|
250
|
+
pages,
|
|
251
|
+
welcomeEmail,
|
|
252
|
+
submissions,
|
|
253
|
+
sites: picked.map((row)=>({
|
|
254
|
+
hostId: row.hostId,
|
|
255
|
+
businessName: row.businessName,
|
|
256
|
+
city: row.city,
|
|
257
|
+
brand: row.brand
|
|
258
|
+
}))
|
|
259
|
+
})
|
|
260
|
+
});
|
|
261
|
+
const payload = await response.json().catch(()=>null);
|
|
262
|
+
if (!response.ok) {
|
|
263
|
+
var _ref3;
|
|
264
|
+
const locked = parseLockdownRefusal(response.status, payload);
|
|
265
|
+
setNotice(locked ? lockdownRefusalText(locked) : String((_ref3 = payload == null ? void 0 : payload.error) != null ? _ref3 : 'The sites could not be started.'));
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
setBatchId(String((_ref = payload == null ? void 0 : payload.batchId) != null ? _ref : '') || null);
|
|
269
|
+
setJobs((_ref1 = payload == null ? void 0 : payload.jobs) != null ? _ref1 : []);
|
|
270
|
+
setOpen(false);
|
|
271
|
+
const refused = (_ref2 = payload == null ? void 0 : payload.refused) != null ? _ref2 : [];
|
|
272
|
+
if (refused.length) {
|
|
273
|
+
setNotice(refused.map((entry)=>`${siteName(entry.hostId)}: ${entry.error}`).join(' · '));
|
|
274
|
+
}
|
|
275
|
+
} catch (unused) {
|
|
276
|
+
setNotice('The sites could not be started.');
|
|
277
|
+
} finally{
|
|
278
|
+
setBusy(false);
|
|
279
|
+
}
|
|
280
|
+
}, [
|
|
281
|
+
orgId,
|
|
282
|
+
picked,
|
|
283
|
+
brief,
|
|
284
|
+
businessType,
|
|
285
|
+
pages,
|
|
286
|
+
welcomeEmail,
|
|
287
|
+
submissions,
|
|
288
|
+
siteName
|
|
289
|
+
]);
|
|
290
|
+
if (verdict !== 'ready' || !hostsReady || hosts.length < MIN_SITES) return null;
|
|
291
|
+
return /*#__PURE__*/ _jsx(CardDisplay, {
|
|
292
|
+
contentGutterX: true,
|
|
293
|
+
contentGutterY: true,
|
|
294
|
+
HeaderProps: {
|
|
295
|
+
title: 'Generate sites with AI',
|
|
296
|
+
subheader: 'One brief across many of your sites. Each site plans first and waits for you to ' + 'confirm it; everything it builds is a draft.'
|
|
297
|
+
},
|
|
298
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
299
|
+
spacing: 2,
|
|
300
|
+
children: [
|
|
301
|
+
notice && /*#__PURE__*/ _jsx(Alert, {
|
|
302
|
+
severity: "info",
|
|
303
|
+
children: notice
|
|
304
|
+
}),
|
|
305
|
+
runJobs.length > 0 && /*#__PURE__*/ _jsxs(Box, {
|
|
306
|
+
children: [
|
|
307
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
308
|
+
variant: "subtitle2",
|
|
309
|
+
gutterBottom: true,
|
|
310
|
+
children: `Last run · ${runJobs.length} ${runJobs.length === 1 ? 'site' : 'sites'}`
|
|
311
|
+
}),
|
|
312
|
+
/*#__PURE__*/ _jsx(ListTable, {
|
|
313
|
+
"aria-label": "Sites in this run",
|
|
314
|
+
rows: runJobs,
|
|
315
|
+
columns: runColumns,
|
|
316
|
+
getRowId: (job)=>job.id,
|
|
317
|
+
rowHeight: TABLE_ROW_HEIGHT
|
|
318
|
+
})
|
|
319
|
+
]
|
|
320
|
+
}),
|
|
321
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
322
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
323
|
+
variant: open ? 'text' : 'contained',
|
|
324
|
+
onClick: ()=>setOpen(!open),
|
|
325
|
+
children: open ? 'Close' : 'Generate for several sites'
|
|
326
|
+
})
|
|
327
|
+
}),
|
|
328
|
+
/*#__PURE__*/ _jsx(Collapse, {
|
|
329
|
+
in: open,
|
|
330
|
+
unmountOnExit: true,
|
|
331
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
332
|
+
spacing: 2,
|
|
333
|
+
children: [
|
|
334
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
335
|
+
label: "What these sites are for",
|
|
336
|
+
placeholder: "A neighborhood dog groomer that takes bookings",
|
|
337
|
+
multiline: true,
|
|
338
|
+
minRows: 2,
|
|
339
|
+
value: brief,
|
|
340
|
+
onChange: (event)=>setBrief(event.target.value)
|
|
341
|
+
}),
|
|
342
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
343
|
+
direction: {
|
|
344
|
+
xs: 'column',
|
|
345
|
+
sm: 'row'
|
|
346
|
+
},
|
|
347
|
+
spacing: 2,
|
|
348
|
+
children: [
|
|
349
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
350
|
+
label: "Kind of business",
|
|
351
|
+
placeholder: "dog groomer",
|
|
352
|
+
value: businessType,
|
|
353
|
+
onChange: (event)=>setBusinessType(event.target.value),
|
|
354
|
+
sx: {
|
|
355
|
+
flex: 1
|
|
356
|
+
}
|
|
357
|
+
}),
|
|
358
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
359
|
+
select: true,
|
|
360
|
+
label: "Pages per site",
|
|
361
|
+
value: pages,
|
|
362
|
+
onChange: (event)=>setPages(Number(event.target.value)),
|
|
363
|
+
sx: {
|
|
364
|
+
minWidth: 160
|
|
365
|
+
},
|
|
366
|
+
children: Array.from({
|
|
367
|
+
length: AI_SITE_PAGES.max - AI_SITE_PAGES.min + 1
|
|
368
|
+
}, (_, index)=>AI_SITE_PAGES.min + index).map((count)=>/*#__PURE__*/ _jsx(MenuItem, {
|
|
369
|
+
value: count,
|
|
370
|
+
children: count
|
|
371
|
+
}, count))
|
|
372
|
+
}),
|
|
373
|
+
/*#__PURE__*/ _jsxs(TextField, {
|
|
374
|
+
select: true,
|
|
375
|
+
label: "Welcome email",
|
|
376
|
+
value: welcomeEmail ? 'yes' : 'no',
|
|
377
|
+
onChange: (event)=>setWelcomeEmail(event.target.value === 'yes'),
|
|
378
|
+
sx: {
|
|
379
|
+
minWidth: 160
|
|
380
|
+
},
|
|
381
|
+
children: [
|
|
382
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
383
|
+
value: "yes",
|
|
384
|
+
children: 'Draft one'
|
|
385
|
+
}),
|
|
386
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
387
|
+
value: "no",
|
|
388
|
+
children: 'No'
|
|
389
|
+
})
|
|
390
|
+
]
|
|
391
|
+
})
|
|
392
|
+
]
|
|
393
|
+
}),
|
|
394
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
395
|
+
select: true,
|
|
396
|
+
fullWidth: true,
|
|
397
|
+
label: "Where do form submissions go?",
|
|
398
|
+
value: submissions,
|
|
399
|
+
onChange: (event)=>setSubmissions(event.target.value),
|
|
400
|
+
helperText: "The same for every site in this run. You can change it on any form afterwards.",
|
|
401
|
+
children: AI_SITE_SUBMISSION_CHOICES.map((option)=>/*#__PURE__*/ _jsx(MenuItem, {
|
|
402
|
+
value: option.id,
|
|
403
|
+
children: `${option.label} — ${option.blurb}`
|
|
404
|
+
}, option.id))
|
|
405
|
+
}),
|
|
406
|
+
/*#__PURE__*/ _jsxs(ScrollTable, {
|
|
407
|
+
size: "small",
|
|
408
|
+
"aria-label": "Sites to generate for",
|
|
409
|
+
children: [
|
|
410
|
+
/*#__PURE__*/ _jsx(TableHead, {
|
|
411
|
+
children: /*#__PURE__*/ _jsxs(TableRow, {
|
|
412
|
+
children: [
|
|
413
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
414
|
+
padding: "checkbox"
|
|
415
|
+
}),
|
|
416
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
417
|
+
children: 'Site'
|
|
418
|
+
}),
|
|
419
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
420
|
+
children: 'Business name'
|
|
421
|
+
}),
|
|
422
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
423
|
+
children: 'City'
|
|
424
|
+
}),
|
|
425
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
426
|
+
children: 'Brand'
|
|
427
|
+
})
|
|
428
|
+
]
|
|
429
|
+
})
|
|
430
|
+
}),
|
|
431
|
+
/*#__PURE__*/ _jsx(TableBody, {
|
|
432
|
+
children: rows.map((row)=>/*#__PURE__*/ _jsxs(TableRow, {
|
|
433
|
+
children: [
|
|
434
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
435
|
+
padding: "checkbox",
|
|
436
|
+
children: /*#__PURE__*/ _jsx(Checkbox, {
|
|
437
|
+
checked: row.picked,
|
|
438
|
+
slotProps: {
|
|
439
|
+
input: {
|
|
440
|
+
'aria-label': `Generate for ${siteName(row.hostId)}`
|
|
441
|
+
}
|
|
442
|
+
},
|
|
443
|
+
onChange: (event)=>update(row.hostId, {
|
|
444
|
+
picked: event.target.checked
|
|
445
|
+
})
|
|
446
|
+
})
|
|
447
|
+
}),
|
|
448
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
449
|
+
children: siteName(row.hostId)
|
|
450
|
+
}),
|
|
451
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
452
|
+
children: /*#__PURE__*/ _jsx(TextField, {
|
|
453
|
+
size: "small",
|
|
454
|
+
variant: "standard",
|
|
455
|
+
value: row.businessName,
|
|
456
|
+
slotProps: {
|
|
457
|
+
htmlInput: {
|
|
458
|
+
'aria-label': `Business name for ${siteName(row.hostId)}`
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
onChange: (event)=>update(row.hostId, {
|
|
462
|
+
businessName: event.target.value
|
|
463
|
+
})
|
|
464
|
+
})
|
|
465
|
+
}),
|
|
466
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
467
|
+
children: /*#__PURE__*/ _jsx(TextField, {
|
|
468
|
+
size: "small",
|
|
469
|
+
variant: "standard",
|
|
470
|
+
value: row.city,
|
|
471
|
+
slotProps: {
|
|
472
|
+
htmlInput: {
|
|
473
|
+
'aria-label': `City for ${siteName(row.hostId)}`
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
onChange: (event)=>update(row.hostId, {
|
|
477
|
+
city: event.target.value
|
|
478
|
+
})
|
|
479
|
+
})
|
|
480
|
+
}),
|
|
481
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
482
|
+
children: /*#__PURE__*/ _jsx(TextField, {
|
|
483
|
+
size: "small",
|
|
484
|
+
variant: "standard",
|
|
485
|
+
value: row.brand,
|
|
486
|
+
slotProps: {
|
|
487
|
+
htmlInput: {
|
|
488
|
+
'aria-label': `Brand for ${siteName(row.hostId)}`
|
|
489
|
+
}
|
|
490
|
+
},
|
|
491
|
+
onChange: (event)=>update(row.hostId, {
|
|
492
|
+
brand: event.target.value
|
|
493
|
+
})
|
|
494
|
+
})
|
|
495
|
+
})
|
|
496
|
+
]
|
|
497
|
+
}, row.hostId))
|
|
498
|
+
})
|
|
499
|
+
]
|
|
500
|
+
}),
|
|
501
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
502
|
+
variant: "body2",
|
|
503
|
+
color: "text.secondary",
|
|
504
|
+
children: picked.length ? `Estimated cost: about ${perSite.toLocaleString('en-US')} credits a site, ` + `${(perSite * picked.length).toLocaleString('en-US')} for ${picked.length} ` + `${picked.length === 1 ? 'site' : 'sites'}. What each site really costs is ` + 'what its own steps spend.' : `Pick up to ${AI_SITE_BATCH_MAX} sites.`
|
|
505
|
+
}),
|
|
506
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
507
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
508
|
+
variant: "contained",
|
|
509
|
+
disabled: busy || !brief.trim() || !businessType.trim() || picked.length === 0 || picked.length > AI_SITE_BATCH_MAX,
|
|
510
|
+
onClick: ()=>void start(),
|
|
511
|
+
startIcon: busy ? /*#__PURE__*/ _jsx(CircularProgress, {
|
|
512
|
+
size: 16
|
|
513
|
+
}) : undefined,
|
|
514
|
+
children: picked.length ? `Generate for ${picked.length} ${picked.length === 1 ? 'site' : 'sites'}` : 'Generate'
|
|
515
|
+
})
|
|
516
|
+
}),
|
|
517
|
+
orgSlug && /*#__PURE__*/ _jsx(Typography, {
|
|
518
|
+
variant: "caption",
|
|
519
|
+
color: "text.secondary",
|
|
520
|
+
children: 'Each site waits for you to confirm its plan in the assistant panel.'
|
|
521
|
+
})
|
|
522
|
+
]
|
|
523
|
+
})
|
|
524
|
+
})
|
|
525
|
+
]
|
|
526
|
+
})
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
export default AiSiteBatchCard;
|
|
530
|
+
|
|
531
|
+
//# sourceMappingURL=ai-site-batch-card.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/ai-site-batch-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use client'\n\nimport { lockdownRefusalText, parseLockdownRefusal } from '@aglyn/aglyn'\nimport type { ConsoleOrgSitesZoneProps } from '@aglyn/aglyn/plugin-manager/feature-plugins'\nimport { AppLink, CardDisplay } from '@aglyn/shared-ui-jsx'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport { TABLE_ROW_HEIGHT } from '@aglyn/shared-ui-jsx/const/table-pagination'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Alert,\n Box,\n Button,\n Checkbox,\n Chip,\n CircularProgress,\n Collapse,\n MenuItem,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material'\nimport type { GridColDef } from '@mui/x-data-grid'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n AI_JOB_TERMINAL_STATUSES,\n type AiJobStatus,\n type AiJobSummary,\n} from '../model/ai-jobs.types'\nimport {\n AI_SITE_BATCH_MAX,\n AI_SITE_PAGES,\n AI_SITE_SUBMISSION_CHOICES,\n aiSiteCreditEstimate,\n type AiSiteSubmissions,\n} from '../model/ai-site-job'\n\n/**\n * The agency batch (AGL-2911), on the organization's Sites page: one brief,\n * with the business name, the city and the brand changed per site, started\n * across many of the org's sites at once.\n *\n * What it starts are ordinary site scaffolds. Each plans first and waits for\n * its own confirmation in the Assist panel before it builds anything, and\n * everything it then builds is a draft — so this card publishes nothing and\n * changes no live site, however many sites it is pointed at.\n *\n * The estimate beside the button is the guard rail the issue asks for: what\n * one site is estimated to cost, and what the whole run is, before a credit\n * is spent on any of it.\n *\n * Where a contact form's submissions go is asked once for the run and binds\n * every site's form step (AGL-2918), in the words the guided start asks it\n * in: one decision, worded once, whether it is asked of one site or twenty.\n */\n\n/** Jobs the card reads to find the batches this workspace has run. */\nconst RECENT_JOBS_READ = 100\n\n/** A batch over one site is a scaffold; the card is for the other case. */\nconst MIN_SITES = 2\n\nconst STATUS_LABEL: Record<AiJobStatus, string> = {\n queued: 'Queued',\n running: 'Running',\n needs_input: 'Needs attention',\n needs_review: 'Confirm the plan',\n done: 'Done',\n failed: 'Failed',\n canceled: 'Canceled',\n}\n\nconst STATUS_COLOR: Record<\n AiJobStatus,\n 'default' | 'primary' | 'success' | 'error' | 'warning'\n> = {\n queued: 'default',\n running: 'primary',\n needs_input: 'warning',\n needs_review: 'warning',\n done: 'success',\n failed: 'error',\n canceled: 'default',\n}\n\n/** A site's per-run variables, as the member typed them. */\nexport interface AiSiteBatchRow {\n hostId: string\n picked: boolean\n businessName: string\n city: string\n brand: string\n}\n\ntype Verdict = 'checking' | 'ready' | 'hidden'\n\nconst isTerminal = (job: AiJobSummary) =>\n AI_JOB_TERMINAL_STATUSES.includes(job.status)\n\n/** The jobs of one batch, newest batch first, as the list route serves them. */\nexport function aiSiteBatchJobs(\n jobs: readonly AiJobSummary[],\n batchId: string | null,\n): AiJobSummary[] {\n if (!batchId) return []\n return jobs.filter((job) => job.batch === batchId)\n}\n\n/** The batch a list of jobs most recently ran, or `null` when none did. */\nexport function aiLatestSiteBatch(\n jobs: readonly AiJobSummary[],\n): string | null {\n return jobs.find((job) => job.kind === 'site' && job.batch)?.batch ?? null\n}\n\nexport function AiSiteBatchCard(\n props: ConsoleOrgSitesZoneProps,\n): JSX.Element | null {\n const { orgMount, basePath } = props\n const { orgId, hosts, hostsReady } = orgMount\n const { data: user } = useUser()\n const userRef = useRef(user)\n userRef.current = user\n const uid = user?.uid ?? null\n const orgSlug = basePath.split('/').filter(Boolean)[0] ?? ''\n\n const [verdict, setVerdict] = useState<Verdict>('checking')\n const [open, setOpen] = useState(false)\n const [notice, setNotice] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const [brief, setBrief] = useState('')\n const [businessType, setBusinessType] = useState('')\n const [pages, setPages] = useState<number>(AI_SITE_PAGES.min + 1)\n const [welcomeEmail, setWelcomeEmail] = useState(true)\n /*\n * One routing answer for the whole run. It starts on the Inbox — what every\n * submission does anyway — because filing a lead as well is the addition,\n * and an addition is the thing somebody should have to choose.\n */\n const [submissions, setSubmissions] = useState<AiSiteSubmissions>('inbox')\n const [rows, setRows] = useState<AiSiteBatchRow[]>([])\n const [batchId, setBatchId] = useState<string | null>(null)\n const [jobs, setJobs] = useState<AiJobSummary[]>([])\n\n // One row per site the page resolved for this reader, kept as the list moves.\n useEffect(() => {\n setRows((current) => {\n const byId = new Map(current.map((row) => [row.hostId, row]))\n return hosts.map(\n (host) =>\n byId.get(host.id) ?? {\n hostId: host.id,\n picked: false,\n businessName: host.name,\n city: '',\n brand: '',\n },\n )\n })\n }, [hosts])\n\n const load = useCallback(async () => {\n if (!orgId) return\n const response = await authorizedFetch(\n userRef.current,\n `/api/ai/jobs?orgId=${encodeURIComponent(orgId)}&limit=${RECENT_JOBS_READ}`,\n )\n // The generative doors answer 404 behind their release flag and 403\n // without the add-on: a feature that is not released does not exist.\n if (response.status === 404 || response.status === 403)\n return 'hidden' as const\n const payload = await response.json().catch(() => null)\n if (!response.ok) {\n const locked = parseLockdownRefusal(response.status, payload)\n setNotice(\n locked ? lockdownRefusalText(locked) : String(payload?.error ?? ''),\n )\n return 'ready' as const\n }\n const listed = (payload?.jobs ?? []) as AiJobSummary[]\n setJobs(listed)\n setBatchId((current) => current ?? aiLatestSiteBatch(listed))\n return 'ready' as const\n }, [orgId])\n\n useEffect(() => {\n if (!orgId || !uid) return\n let active = true\n setVerdict('checking')\n void (async () => {\n try {\n const answer = await load()\n if (active && answer) setVerdict(answer)\n } catch {\n if (active) setVerdict('ready')\n }\n })()\n return () => {\n active = false\n }\n }, [orgId, uid, load])\n\n const picked = useMemo(() => rows.filter((row) => row.picked), [rows])\n const perSite = aiSiteCreditEstimate(pages, { welcomeEmail })\n const runJobs = useMemo(() => aiSiteBatchJobs(jobs, batchId), [jobs, batchId])\n const siteName = useCallback(\n (hostId: string | null) =>\n hosts.find((host) => host.id === hostId)?.name ?? 'This site',\n [hosts],\n )\n const siteHref = useCallback(\n (hostId: string | null) => {\n const subdomain = hosts.find((host) => host.id === hostId)?.subdomain\n return subdomain ? `${orgMount.hostsPath}/${subdomain}` : null\n },\n [hosts, orgMount.hostsPath],\n )\n /*\n * One row per job of the run. A job has no page of its own — it is\n * confirmed and followed in the Assist panel — so the row opens nothing,\n * and the site it built for is a link when the console has an address for\n * that site.\n */\n const runColumns = useMemo<GridColDef<AiJobSummary>[]>(\n () => [\n {\n field: 'site',\n headerName: 'Site',\n flex: 1,\n minWidth: 180,\n valueGetter: (_value, job) => siteName(job.hostId),\n renderCell: ({ row: job }) => {\n const href = siteHref(job.hostId)\n return href ? (\n <AppLink href={href}>{siteName(job.hostId)}</AppLink>\n ) : (\n siteName(job.hostId)\n )\n },\n },\n {\n field: 'status',\n headerName: 'Status',\n width: 180,\n valueGetter: (_value, job) => STATUS_LABEL[job.status],\n renderCell: ({ row: job }) => (\n <Chip\n size=\"small\"\n label={STATUS_LABEL[job.status]}\n color={STATUS_COLOR[job.status]}\n />\n ),\n },\n {\n field: 'drafts',\n headerName: 'Drafts',\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n width: 100,\n valueGetter: (_value, job) =>\n isTerminal(job) || job.outputs.length ? job.outputs.length : null,\n valueFormatter: (value: number | null) =>\n value === null ? '—' : String(value),\n },\n ],\n [siteHref, siteName],\n )\n\n const update = (hostId: string, patch: Partial<AiSiteBatchRow>) =>\n setRows((current) =>\n current.map((row) =>\n row.hostId === hostId ? { ...row, ...patch } : row,\n ),\n )\n\n const start = useCallback(async () => {\n if (!orgId || !picked.length) return\n setBusy(true)\n setNotice(null)\n try {\n const response = await authorizedFetch(\n userRef.current,\n '/api/ai/jobs/batch',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n orgId,\n brief,\n businessType,\n pages,\n welcomeEmail,\n submissions,\n sites: picked.map((row) => ({\n hostId: row.hostId,\n businessName: row.businessName,\n city: row.city,\n brand: row.brand,\n })),\n }),\n },\n )\n const payload = await response.json().catch(() => null)\n if (!response.ok) {\n const locked = parseLockdownRefusal(response.status, payload)\n setNotice(\n locked\n ? lockdownRefusalText(locked)\n : String(payload?.error ?? 'The sites could not be started.'),\n )\n return\n }\n setBatchId(String(payload?.batchId ?? '') || null)\n setJobs((payload?.jobs ?? []) as AiJobSummary[])\n setOpen(false)\n const refused = (payload?.refused ?? []) as Array<{\n hostId: string\n error: string\n }>\n if (refused.length) {\n setNotice(\n refused\n .map((entry) => `${siteName(entry.hostId)}: ${entry.error}`)\n .join(' · '),\n )\n }\n } catch {\n setNotice('The sites could not be started.')\n } finally {\n setBusy(false)\n }\n }, [\n orgId,\n picked,\n brief,\n businessType,\n pages,\n welcomeEmail,\n submissions,\n siteName,\n ])\n\n if (verdict !== 'ready' || !hostsReady || hosts.length < MIN_SITES)\n return null\n\n return (\n <CardDisplay\n contentGutterX\n contentGutterY\n HeaderProps={{\n title: 'Generate sites with AI',\n subheader:\n 'One brief across many of your sites. Each site plans first and waits for you to ' +\n 'confirm it; everything it builds is a draft.',\n }}\n >\n <Stack spacing={2}>\n {notice && <Alert severity=\"info\">{notice}</Alert>}\n {runJobs.length > 0 && (\n <Box>\n <Typography variant=\"subtitle2\" gutterBottom>\n {`Last run · ${runJobs.length} ${runJobs.length === 1 ? 'site' : 'sites'}`}\n </Typography>\n <ListTable\n aria-label=\"Sites in this run\"\n rows={runJobs}\n columns={runColumns}\n getRowId={(job: AiJobSummary) => job.id}\n rowHeight={TABLE_ROW_HEIGHT}\n />\n </Box>\n )}\n <Box>\n <Button\n variant={open ? 'text' : 'contained'}\n onClick={() => setOpen(!open)}\n >\n {open ? 'Close' : 'Generate for several sites'}\n </Button>\n </Box>\n <Collapse in={open} unmountOnExit>\n <Stack spacing={2}>\n <TextField\n label=\"What these sites are for\"\n placeholder=\"A neighborhood dog groomer that takes bookings\"\n multiline\n minRows={2}\n value={brief}\n onChange={(event) => setBrief(event.target.value)}\n />\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2}>\n <TextField\n label=\"Kind of business\"\n placeholder=\"dog groomer\"\n value={businessType}\n onChange={(event) => setBusinessType(event.target.value)}\n sx={{ flex: 1 }}\n />\n <TextField\n select\n label=\"Pages per site\"\n value={pages}\n onChange={(event) => setPages(Number(event.target.value))}\n sx={{ minWidth: 160 }}\n >\n {Array.from(\n { length: AI_SITE_PAGES.max - AI_SITE_PAGES.min + 1 },\n (_, index) => AI_SITE_PAGES.min + index,\n ).map((count) => (\n <MenuItem key={count} value={count}>\n {count}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n select\n label=\"Welcome email\"\n value={welcomeEmail ? 'yes' : 'no'}\n onChange={(event) =>\n setWelcomeEmail(event.target.value === 'yes')\n }\n sx={{ minWidth: 160 }}\n >\n <MenuItem value=\"yes\">{'Draft one'}</MenuItem>\n <MenuItem value=\"no\">{'No'}</MenuItem>\n </TextField>\n </Stack>\n {/*\n Asked of the run, not of each site (AGL-2918): the forms a batch\n makes are the same form, and where a submission goes is the one\n thing about a contact form a model cannot know. Left unasked,\n twenty sites each kept a proposal nobody made.\n */}\n <TextField\n select\n fullWidth\n label=\"Where do form submissions go?\"\n value={submissions}\n onChange={(event) =>\n setSubmissions(event.target.value as AiSiteSubmissions)\n }\n helperText=\"The same for every site in this run. You can change it on any form afterwards.\"\n >\n {AI_SITE_SUBMISSION_CHOICES.map((option) => (\n <MenuItem key={option.id} value={option.id}>\n {`${option.label} — ${option.blurb}`}\n </MenuItem>\n ))}\n </TextField>\n <ScrollTable size=\"small\" aria-label=\"Sites to generate for\">\n <TableHead>\n <TableRow>\n <TableCell padding=\"checkbox\" />\n <TableCell>{'Site'}</TableCell>\n <TableCell>{'Business name'}</TableCell>\n <TableCell>{'City'}</TableCell>\n <TableCell>{'Brand'}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.hostId}>\n <TableCell padding=\"checkbox\">\n <Checkbox\n checked={row.picked}\n slotProps={{\n input: {\n 'aria-label': `Generate for ${siteName(row.hostId)}`,\n },\n }}\n onChange={(event) =>\n update(row.hostId, { picked: event.target.checked })\n }\n />\n </TableCell>\n <TableCell>{siteName(row.hostId)}</TableCell>\n <TableCell>\n <TextField\n size=\"small\"\n variant=\"standard\"\n value={row.businessName}\n slotProps={{\n htmlInput: {\n 'aria-label': `Business name for ${siteName(row.hostId)}`,\n },\n }}\n onChange={(event) =>\n update(row.hostId, {\n businessName: event.target.value,\n })\n }\n />\n </TableCell>\n <TableCell>\n <TextField\n size=\"small\"\n variant=\"standard\"\n value={row.city}\n slotProps={{\n htmlInput: {\n 'aria-label': `City for ${siteName(row.hostId)}`,\n },\n }}\n onChange={(event) =>\n update(row.hostId, { city: event.target.value })\n }\n />\n </TableCell>\n <TableCell>\n <TextField\n size=\"small\"\n variant=\"standard\"\n value={row.brand}\n slotProps={{\n htmlInput: {\n 'aria-label': `Brand for ${siteName(row.hostId)}`,\n },\n }}\n onChange={(event) =>\n update(row.hostId, { brand: event.target.value })\n }\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </ScrollTable>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {picked.length\n ? `Estimated cost: about ${perSite.toLocaleString('en-US')} credits a site, ` +\n `${(perSite * picked.length).toLocaleString('en-US')} for ${picked.length} ` +\n `${picked.length === 1 ? 'site' : 'sites'}. What each site really costs is ` +\n 'what its own steps spend.'\n : `Pick up to ${AI_SITE_BATCH_MAX} sites.`}\n </Typography>\n <Box>\n <Button\n variant=\"contained\"\n disabled={\n busy ||\n !brief.trim() ||\n !businessType.trim() ||\n picked.length === 0 ||\n picked.length > AI_SITE_BATCH_MAX\n }\n onClick={() => void start()}\n startIcon={busy ? <CircularProgress size={16} /> : undefined}\n >\n {picked.length\n ? `Generate for ${picked.length} ${picked.length === 1 ? 'site' : 'sites'}`\n : 'Generate'}\n </Button>\n </Box>\n {orgSlug && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {\n 'Each site waits for you to confirm its plan in the assistant panel.'\n }\n </Typography>\n )}\n </Stack>\n </Collapse>\n </Stack>\n </CardDisplay>\n )\n}\n\nexport default AiSiteBatchCard\n"],"names":["lockdownRefusalText","parseLockdownRefusal","AppLink","CardDisplay","ListTable","ScrollTable","TABLE_ROW_HEIGHT","authorizedFetch","useUser","Alert","Box","Button","Checkbox","Chip","CircularProgress","Collapse","MenuItem","Stack","TableBody","TableCell","TableHead","TableRow","TextField","Typography","useCallback","useEffect","useMemo","useRef","useState","AI_JOB_TERMINAL_STATUSES","AI_SITE_BATCH_MAX","AI_SITE_PAGES","AI_SITE_SUBMISSION_CHOICES","aiSiteCreditEstimate","RECENT_JOBS_READ","MIN_SITES","STATUS_LABEL","queued","running","needs_input","needs_review","done","failed","canceled","STATUS_COLOR","isTerminal","job","includes","status","aiSiteBatchJobs","jobs","batchId","filter","batch","aiLatestSiteBatch","find","kind","AiSiteBatchCard","props","basePath","orgMount","orgId","hosts","hostsReady","data","user","userRef","current","uid","orgSlug","split","Boolean","verdict","setVerdict","open","setOpen","notice","setNotice","busy","setBusy","brief","setBrief","businessType","setBusinessType","pages","setPages","min","welcomeEmail","setWelcomeEmail","submissions","setSubmissions","rows","setRows","setBatchId","setJobs","byId","Map","map","row","hostId","host","get","id","picked","businessName","name","city","brand","load","response","encodeURIComponent","payload","json","catch","ok","locked","String","error","listed","active","answer","perSite","runJobs","siteName","siteHref","subdomain","hostsPath","runColumns","field","headerName","flex","minWidth","valueGetter","_value","renderCell","href","width","size","label","color","type","align","headerAlign","outputs","length","valueFormatter","value","update","patch","start","method","headers","body","JSON","stringify","sites","refused","entry","join","contentGutterX","contentGutterY","HeaderProps","title","subheader","spacing","severity","variant","gutterBottom","aria-label","columns","getRowId","rowHeight","onClick","in","unmountOnExit","placeholder","multiline","minRows","onChange","event","target","direction","xs","sm","sx","select","Number","Array","from","max","_","index","count","fullWidth","helperText","option","blurb","padding","checked","slotProps","input","htmlInput","toLocaleString","disabled","trim","startIcon","undefined"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;AAEA,SAASA,mBAAmB,EAAEC,oBAAoB,QAAQ,eAAc;AAExE,SAASC,OAAO,EAAEC,WAAW,QAAQ,uBAAsB;AAC3D,SAASC,SAAS,QAAQ,uDAAsD;AAChF,SAASC,WAAW,QAAQ,yDAAwD;AACpF,SAASC,gBAAgB,QAAQ,8CAA6C;AAC9E,SAASC,eAAe,QAAQ,2CAA0C;AAC1E,SAASC,OAAO,QAAQ,iCAAgC;AACxD,SACEC,KAAK,EACLC,GAAG,EACHC,MAAM,EACNC,QAAQ,EACRC,IAAI,EACJC,gBAAgB,EAChBC,QAAQ,EACRC,QAAQ,EACRC,KAAK,EACLC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,QAAQ,EACRC,SAAS,EACTC,UAAU,QACL,gBAAe;AAEtB,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AACzE,SACEC,wBAAwB,QAGnB,4BAAwB;AAC/B,SACEC,iBAAiB,EACjBC,aAAa,EACbC,0BAA0B,EAC1BC,oBAAoB,QAEf,0BAAsB;AAE7B;;;;;;;;;;;;;;;;;CAiBC,GAED,oEAAoE,GACpE,MAAMC,mBAAmB;AAEzB,yEAAyE,GACzE,MAAMC,YAAY;AAElB,MAAMC,eAA4C;IAChDC,QAAQ;IACRC,SAAS;IACTC,aAAa;IACbC,cAAc;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;AACZ;AAEA,MAAMC,eAGF;IACFP,QAAQ;IACRC,SAAS;IACTC,aAAa;IACbC,cAAc;IACdC,MAAM;IACNC,QAAQ;IACRC,UAAU;AACZ;AAaA,MAAME,aAAa,CAACC,MAClBjB,yBAAyBkB,QAAQ,CAACD,IAAIE,MAAM;AAE9C,8EAA8E,GAC9E,OAAO,SAASC,gBACdC,IAA6B,EAC7BC,OAAsB;IAEtB,IAAI,CAACA,SAAS,OAAO,EAAE;IACvB,OAAOD,KAAKE,MAAM,CAAC,CAACN,MAAQA,IAAIO,KAAK,KAAKF;AAC5C;AAEA,yEAAyE,GACzE,OAAO,SAASG,kBACdJ,IAA6B;;QAEtBA;IAAP,gBAAOA,aAAAA,KAAKK,IAAI,CAAC,CAACT,MAAQA,IAAIU,IAAI,KAAK,UAAUV,IAAIO,KAAK,sBAAnDH,WAAsDG,KAAK,mBAAI;AACxE;AAEA,OAAO,SAASI,gBACdC,KAA+B;cAQfC;IANhB,MAAM,EAAEC,QAAQ,EAAED,QAAQ,EAAE,GAAGD;IAC/B,MAAM,EAAEG,KAAK,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGH;IACrC,MAAM,EAAEI,MAAMC,IAAI,EAAE,GAAGzD;IACvB,MAAM0D,UAAUvC,OAAOsC;IACvBC,QAAQC,OAAO,GAAGF;IAClB,MAAMG,cAAMH,wBAAAA,KAAMG,GAAG,mBAAI;IACzB,MAAMC,WAAUV,0BAAAA,SAASW,KAAK,CAAC,KAAKlB,MAAM,CAACmB,QAAQ,CAAC,EAAE,YAAtCZ,0BAA0C;IAE1D,MAAM,CAACa,SAASC,WAAW,GAAG7C,SAAkB;IAChD,MAAM,CAAC8C,MAAMC,QAAQ,GAAG/C,SAAS;IACjC,MAAM,CAACgD,QAAQC,UAAU,GAAGjD,SAAwB;IACpD,MAAM,CAACkD,MAAMC,QAAQ,GAAGnD,SAAS;IACjC,MAAM,CAACoD,OAAOC,SAAS,GAAGrD,SAAS;IACnC,MAAM,CAACsD,cAAcC,gBAAgB,GAAGvD,SAAS;IACjD,MAAM,CAACwD,OAAOC,SAAS,GAAGzD,SAAiBG,cAAcuD,GAAG,GAAG;IAC/D,MAAM,CAACC,cAAcC,gBAAgB,GAAG5D,SAAS;IACjD;;;;GAIC,GACD,MAAM,CAAC6D,aAAaC,eAAe,GAAG9D,SAA4B;IAClE,MAAM,CAAC+D,MAAMC,QAAQ,GAAGhE,SAA2B,EAAE;IACrD,MAAM,CAACuB,SAAS0C,WAAW,GAAGjE,SAAwB;IACtD,MAAM,CAACsB,MAAM4C,QAAQ,GAAGlE,SAAyB,EAAE;IAEnD,8EAA8E;IAC9EH,UAAU;QACRmE,QAAQ,CAACzB;YACP,MAAM4B,OAAO,IAAIC,IAAI7B,QAAQ8B,GAAG,CAAC,CAACC,MAAQ;oBAACA,IAAIC,MAAM;oBAAED;iBAAI;YAC3D,OAAOpC,MAAMmC,GAAG,CACd,CAACG;oBACCL;wBAAAA,YAAAA,KAAKM,GAAG,CAACD,KAAKE,EAAE,aAAhBP,YAAqB;oBACnBI,QAAQC,KAAKE,EAAE;oBACfC,QAAQ;oBACRC,cAAcJ,KAAKK,IAAI;oBACvBC,MAAM;oBACNC,OAAO;gBACT;;QAEN;IACF,GAAG;QAAC7C;KAAM;IAEV,MAAM8C,OAAOpF,YAAY;;QACvB,IAAI,CAACqC,OAAO;QACZ,MAAMgD,WAAW,MAAMtG,gBACrB2D,QAAQC,OAAO,EACf,CAAC,mBAAmB,EAAE2C,mBAAmBjD,OAAO,OAAO,EAAE3B,kBAAkB;QAE7E,oEAAoE;QACpE,qEAAqE;QACrE,IAAI2E,SAAS7D,MAAM,KAAK,OAAO6D,SAAS7D,MAAM,KAAK,KACjD,OAAO;QACT,MAAM+D,UAAU,MAAMF,SAASG,IAAI,GAAGC,KAAK,CAAC,IAAM;QAClD,IAAI,CAACJ,SAASK,EAAE,EAAE;;YAChB,MAAMC,SAASlH,qBAAqB4G,SAAS7D,MAAM,EAAE+D;YACrDlC,UACEsC,SAASnH,oBAAoBmH,UAAUC,gBAAOL,2BAAAA,QAASM,KAAK,oBAAI;YAElE,OAAO;QACT;QACA,MAAMC,iBAAUP,2BAAAA,QAAS7D,IAAI,mBAAI,EAAE;QACnC4C,QAAQwB;QACRzB,WAAW,CAAC1B,UAAYA,kBAAAA,UAAWb,kBAAkBgE;QACrD,OAAO;IACT,GAAG;QAACzD;KAAM;IAEVpC,UAAU;QACR,IAAI,CAACoC,SAAS,CAACO,KAAK;QACpB,IAAImD,SAAS;QACb9C,WAAW;QACX,KAAK,AAAC,CAAA;YACJ,IAAI;gBACF,MAAM+C,SAAS,MAAMZ;gBACrB,IAAIW,UAAUC,QAAQ/C,WAAW+C;YACnC,EAAE,eAAM;gBACN,IAAID,QAAQ9C,WAAW;YACzB;QACF,CAAA;QACA,OAAO;YACL8C,SAAS;QACX;IACF,GAAG;QAAC1D;QAAOO;QAAKwC;KAAK;IAErB,MAAML,SAAS7E,QAAQ,IAAMiE,KAAKvC,MAAM,CAAC,CAAC8C,MAAQA,IAAIK,MAAM,GAAG;QAACZ;KAAK;IACrE,MAAM8B,UAAUxF,qBAAqBmD,OAAO;QAAEG;IAAa;IAC3D,MAAMmC,UAAUhG,QAAQ,IAAMuB,gBAAgBC,MAAMC,UAAU;QAACD;QAAMC;KAAQ;IAC7E,MAAMwE,WAAWnG,YACf,CAAC2E;;YACCrC;wBAAAA,cAAAA,MAAMP,IAAI,CAAC,CAAC6C,OAASA,KAAKE,EAAE,KAAKH,4BAAjCrC,YAA0C2C,IAAI,mBAAI;OACpD;QAAC3C;KAAM;IAET,MAAM8D,WAAWpG,YACf,CAAC2E;YACmBrC;QAAlB,MAAM+D,aAAY/D,cAAAA,MAAMP,IAAI,CAAC,CAAC6C,OAASA,KAAKE,EAAE,KAAKH,4BAAjCrC,YAA0C+D,SAAS;QACrE,OAAOA,YAAY,GAAGjE,SAASkE,SAAS,CAAC,CAAC,EAAED,WAAW,GAAG;IAC5D,GACA;QAAC/D;QAAOF,SAASkE,SAAS;KAAC;IAE7B;;;;;GAKC,GACD,MAAMC,aAAarG,QACjB,IAAM;YACJ;gBACEsG,OAAO;gBACPC,YAAY;gBACZC,MAAM;gBACNC,UAAU;gBACVC,aAAa,CAACC,QAAQvF,MAAQ6E,SAAS7E,IAAIqD,MAAM;gBACjDmC,YAAY,CAAC,EAAEpC,KAAKpD,GAAG,EAAE;oBACvB,MAAMyF,OAAOX,SAAS9E,IAAIqD,MAAM;oBAChC,OAAOoC,qBACL,KAACrI;wBAAQqI,MAAMA;kCAAOZ,SAAS7E,IAAIqD,MAAM;yBAEzCwB,SAAS7E,IAAIqD,MAAM;gBAEvB;YACF;YACA;gBACE6B,OAAO;gBACPC,YAAY;gBACZO,OAAO;gBACPJ,aAAa,CAACC,QAAQvF,MAAQV,YAAY,CAACU,IAAIE,MAAM,CAAC;gBACtDsF,YAAY,CAAC,EAAEpC,KAAKpD,GAAG,EAAE,iBACvB,KAACjC;wBACC4H,MAAK;wBACLC,OAAOtG,YAAY,CAACU,IAAIE,MAAM,CAAC;wBAC/B2F,OAAO/F,YAAY,CAACE,IAAIE,MAAM,CAAC;;YAGrC;YACA;gBACEgF,OAAO;gBACPC,YAAY;gBACZW,MAAM;gBACNC,OAAO;gBACPC,aAAa;gBACbN,OAAO;gBACPJ,aAAa,CAACC,QAAQvF,MACpBD,WAAWC,QAAQA,IAAIiG,OAAO,CAACC,MAAM,GAAGlG,IAAIiG,OAAO,CAACC,MAAM,GAAG;gBAC/DC,gBAAgB,CAACC,QACfA,UAAU,OAAO,MAAM9B,OAAO8B;YAClC;SACD,EACD;QAACtB;QAAUD;KAAS;IAGtB,MAAMwB,SAAS,CAAChD,QAAgBiD,QAC9BxD,QAAQ,CAACzB,UACPA,QAAQ8B,GAAG,CAAC,CAACC,MACXA,IAAIC,MAAM,KAAKA,SAAS,aAAKD,KAAQkD,SAAUlD;IAIrD,MAAMmD,QAAQ7H,YAAY;QACxB,IAAI,CAACqC,SAAS,CAAC0C,OAAOyC,MAAM,EAAE;QAC9BjE,QAAQ;QACRF,UAAU;QACV,IAAI;;YACF,MAAMgC,WAAW,MAAMtG,gBACrB2D,QAAQC,OAAO,EACf,sBACA;gBACEmF,QAAQ;gBACRC,SAAS;oBAAE,gBAAgB;gBAAmB;gBAC9CC,MAAMC,KAAKC,SAAS,CAAC;oBACnB7F;oBACAmB;oBACAE;oBACAE;oBACAG;oBACAE;oBACAkE,OAAOpD,OAAON,GAAG,CAAC,CAACC,MAAS,CAAA;4BAC1BC,QAAQD,IAAIC,MAAM;4BAClBK,cAAcN,IAAIM,YAAY;4BAC9BE,MAAMR,IAAIQ,IAAI;4BACdC,OAAOT,IAAIS,KAAK;wBAClB,CAAA;gBACF;YACF;YAEF,MAAMI,UAAU,MAAMF,SAASG,IAAI,GAAGC,KAAK,CAAC,IAAM;YAClD,IAAI,CAACJ,SAASK,EAAE,EAAE;;gBAChB,MAAMC,SAASlH,qBAAqB4G,SAAS7D,MAAM,EAAE+D;gBACrDlC,UACEsC,SACInH,oBAAoBmH,UACpBC,gBAAOL,2BAAAA,QAASM,KAAK,oBAAI;gBAE/B;YACF;YACAxB,WAAWuB,eAAOL,2BAAAA,QAAS5D,OAAO,mBAAI,OAAO;YAC7C2C,iBAASiB,2BAAAA,QAAS7D,IAAI,oBAAI,EAAE;YAC5ByB,QAAQ;YACR,MAAMiF,mBAAW7C,2BAAAA,QAAS6C,OAAO,oBAAI,EAAE;YAIvC,IAAIA,QAAQZ,MAAM,EAAE;gBAClBnE,UACE+E,QACG3D,GAAG,CAAC,CAAC4D,QAAU,GAAGlC,SAASkC,MAAM1D,MAAM,EAAE,EAAE,EAAE0D,MAAMxC,KAAK,EAAE,EAC1DyC,IAAI,CAAC;YAEZ;QACF,EAAE,eAAM;YACNjF,UAAU;QACZ,SAAU;YACRE,QAAQ;QACV;IACF,GAAG;QACDlB;QACA0C;QACAvB;QACAE;QACAE;QACAG;QACAE;QACAkC;KACD;IAED,IAAInD,YAAY,WAAW,CAACT,cAAcD,MAAMkF,MAAM,GAAG7G,WACvD,OAAO;IAET,qBACE,KAAChC;QACC4J,cAAc;QACdC,cAAc;QACdC,aAAa;YACXC,OAAO;YACPC,WACE,qFACA;QACJ;kBAEA,cAAA,MAAClJ;YAAMmJ,SAAS;;gBACbxF,wBAAU,KAACnE;oBAAM4J,UAAS;8BAAQzF;;gBAClC8C,QAAQsB,MAAM,GAAG,mBAChB,MAACtI;;sCACC,KAACa;4BAAW+I,SAAQ;4BAAYC,YAAY;sCACzC,CAAC,WAAW,EAAE7C,QAAQsB,MAAM,CAAC,CAAC,EAAEtB,QAAQsB,MAAM,KAAK,IAAI,SAAS,SAAS;;sCAE5E,KAAC5I;4BACCoK,cAAW;4BACX7E,MAAM+B;4BACN+C,SAAS1C;4BACT2C,UAAU,CAAC5H,MAAsBA,IAAIwD,EAAE;4BACvCqE,WAAWrK;;;;8BAIjB,KAACI;8BACC,cAAA,KAACC;wBACC2J,SAAS5F,OAAO,SAAS;wBACzBkG,SAAS,IAAMjG,QAAQ,CAACD;kCAEvBA,OAAO,UAAU;;;8BAGtB,KAAC3D;oBAAS8J,IAAInG;oBAAMoG,aAAa;8BAC/B,cAAA,MAAC7J;wBAAMmJ,SAAS;;0CACd,KAAC9I;gCACCoH,OAAM;gCACNqC,aAAY;gCACZC,SAAS;gCACTC,SAAS;gCACT/B,OAAOlE;gCACPkG,UAAU,CAACC,QAAUlG,SAASkG,MAAMC,MAAM,CAAClC,KAAK;;0CAElD,MAACjI;gCAAMoK,WAAW;oCAAEC,IAAI;oCAAUC,IAAI;gCAAM;gCAAGnB,SAAS;;kDACtD,KAAC9I;wCACCoH,OAAM;wCACNqC,aAAY;wCACZ7B,OAAOhE;wCACPgG,UAAU,CAACC,QAAUhG,gBAAgBgG,MAAMC,MAAM,CAAClC,KAAK;wCACvDsC,IAAI;4CAAEtD,MAAM;wCAAE;;kDAEhB,KAAC5G;wCACCmK,MAAM;wCACN/C,OAAM;wCACNQ,OAAO9D;wCACP8F,UAAU,CAACC,QAAU9F,SAASqG,OAAOP,MAAMC,MAAM,CAAClC,KAAK;wCACvDsC,IAAI;4CAAErD,UAAU;wCAAI;kDAEnBwD,MAAMC,IAAI,CACT;4CAAE5C,QAAQjH,cAAc8J,GAAG,GAAG9J,cAAcuD,GAAG,GAAG;wCAAE,GACpD,CAACwG,GAAGC,QAAUhK,cAAcuD,GAAG,GAAGyG,OAClC9F,GAAG,CAAC,CAAC+F,sBACL,KAAChL;gDAAqBkI,OAAO8C;0DAC1BA;+CADYA;;kDAKnB,MAAC1K;wCACCmK,MAAM;wCACN/C,OAAM;wCACNQ,OAAO3D,eAAe,QAAQ;wCAC9B2F,UAAU,CAACC,QACT3F,gBAAgB2F,MAAMC,MAAM,CAAClC,KAAK,KAAK;wCAEzCsC,IAAI;4CAAErD,UAAU;wCAAI;;0DAEpB,KAACnH;gDAASkI,OAAM;0DAAO;;0DACvB,KAAClI;gDAASkI,OAAM;0DAAM;;;;;;0CAS1B,KAAC5H;gCACCmK,MAAM;gCACNQ,SAAS;gCACTvD,OAAM;gCACNQ,OAAOzD;gCACPyF,UAAU,CAACC,QACTzF,eAAeyF,MAAMC,MAAM,CAAClC,KAAK;gCAEnCgD,YAAW;0CAEVlK,2BAA2BiE,GAAG,CAAC,CAACkG,uBAC/B,KAACnL;wCAAyBkI,OAAOiD,OAAO7F,EAAE;kDACvC,GAAG6F,OAAOzD,KAAK,CAAC,GAAG,EAAEyD,OAAOC,KAAK,EAAE;uCADvBD,OAAO7F,EAAE;;0CAK5B,MAACjG;gCAAYoI,MAAK;gCAAQ+B,cAAW;;kDACnC,KAACpJ;kDACC,cAAA,MAACC;;8DACC,KAACF;oDAAUkL,SAAQ;;8DACnB,KAAClL;8DAAW;;8DACZ,KAACA;8DAAW;;8DACZ,KAACA;8DAAW;;8DACZ,KAACA;8DAAW;;;;;kDAGhB,KAACD;kDACEyE,KAAKM,GAAG,CAAC,CAACC,oBACT,MAAC7E;;kEACC,KAACF;wDAAUkL,SAAQ;kEACjB,cAAA,KAACzL;4DACC0L,SAASpG,IAAIK,MAAM;4DACnBgG,WAAW;gEACTC,OAAO;oEACL,cAAc,CAAC,aAAa,EAAE7E,SAASzB,IAAIC,MAAM,GAAG;gEACtD;4DACF;4DACA+E,UAAU,CAACC,QACThC,OAAOjD,IAAIC,MAAM,EAAE;oEAAEI,QAAQ4E,MAAMC,MAAM,CAACkB,OAAO;gEAAC;;;kEAIxD,KAACnL;kEAAWwG,SAASzB,IAAIC,MAAM;;kEAC/B,KAAChF;kEACC,cAAA,KAACG;4DACCmH,MAAK;4DACL6B,SAAQ;4DACRpB,OAAOhD,IAAIM,YAAY;4DACvB+F,WAAW;gEACTE,WAAW;oEACT,cAAc,CAAC,kBAAkB,EAAE9E,SAASzB,IAAIC,MAAM,GAAG;gEAC3D;4DACF;4DACA+E,UAAU,CAACC,QACThC,OAAOjD,IAAIC,MAAM,EAAE;oEACjBK,cAAc2E,MAAMC,MAAM,CAAClC,KAAK;gEAClC;;;kEAIN,KAAC/H;kEACC,cAAA,KAACG;4DACCmH,MAAK;4DACL6B,SAAQ;4DACRpB,OAAOhD,IAAIQ,IAAI;4DACf6F,WAAW;gEACTE,WAAW;oEACT,cAAc,CAAC,SAAS,EAAE9E,SAASzB,IAAIC,MAAM,GAAG;gEAClD;4DACF;4DACA+E,UAAU,CAACC,QACThC,OAAOjD,IAAIC,MAAM,EAAE;oEAAEO,MAAMyE,MAAMC,MAAM,CAAClC,KAAK;gEAAC;;;kEAIpD,KAAC/H;kEACC,cAAA,KAACG;4DACCmH,MAAK;4DACL6B,SAAQ;4DACRpB,OAAOhD,IAAIS,KAAK;4DAChB4F,WAAW;gEACTE,WAAW;oEACT,cAAc,CAAC,UAAU,EAAE9E,SAASzB,IAAIC,MAAM,GAAG;gEACnD;4DACF;4DACA+E,UAAU,CAACC,QACThC,OAAOjD,IAAIC,MAAM,EAAE;oEAAEQ,OAAOwE,MAAMC,MAAM,CAAClC,KAAK;gEAAC;;;;+CA1DxChD,IAAIC,MAAM;;;;0CAkE/B,KAAC5E;gCAAW+I,SAAQ;gCAAQ3B,OAAM;0CAC/BpC,OAAOyC,MAAM,GACV,CAAC,sBAAsB,EAAEvB,QAAQiF,cAAc,CAAC,SAAS,iBAAiB,CAAC,GAC3E,GAAG,AAACjF,CAAAA,UAAUlB,OAAOyC,MAAM,AAAD,EAAG0D,cAAc,CAAC,SAAS,KAAK,EAAEnG,OAAOyC,MAAM,CAAC,CAAC,CAAC,GAC5E,GAAGzC,OAAOyC,MAAM,KAAK,IAAI,SAAS,QAAQ,iCAAiC,CAAC,GAC5E,8BACA,CAAC,WAAW,EAAElH,kBAAkB,OAAO,CAAC;;0CAE9C,KAACpB;0CACC,cAAA,KAACC;oCACC2J,SAAQ;oCACRqC,UACE7H,QACA,CAACE,MAAM4H,IAAI,MACX,CAAC1H,aAAa0H,IAAI,MAClBrG,OAAOyC,MAAM,KAAK,KAClBzC,OAAOyC,MAAM,GAAGlH;oCAElB8I,SAAS,IAAM,KAAKvB;oCACpBwD,WAAW/H,qBAAO,KAAChE;wCAAiB2H,MAAM;yCAASqE;8CAElDvG,OAAOyC,MAAM,GACV,CAAC,aAAa,EAAEzC,OAAOyC,MAAM,CAAC,CAAC,EAAEzC,OAAOyC,MAAM,KAAK,IAAI,SAAS,SAAS,GACzE;;;4BAGP3E,yBACC,KAAC9C;gCAAW+I,SAAQ;gCAAU3B,OAAM;0CAEhC;;;;;;;;AASlB;AAEA,eAAelF,gBAAe"}
|