@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/ai-assist-provider.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'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport {\n checkEntitlement,\n lockdownRefusalText,\n parseLockdownRefusal,\n} from '@aglyn/aglyn'\nimport { marketplaceDefinitionToNested } from '@aglyn/aglyn/app-utils/node-definition-sanitizer'\nimport { AiAssistActionsContext } from './ai-assist-actions-context'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport {\n Button,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n MenuItem,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useCallback, useMemo, useState } from 'react'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { AiModelSelector } from './ai-model-selector.component'\nimport { AiUsageStrip } from './ai-usage-strip.component'\nimport { useAiModelChoice } from './use-ai-model-choice'\nimport { usePublishAiUsageMeter } from './use-ai-usage-meter'\n\n\nexport interface AiAssistProviderProps {\n /** Org billing doc for the entitlement gate (mounted by the shell). */\n org?: unknown\n /**\n * True once `org` is a trustworthy answer (AGL-1380). The shell mounts\n * this provider above the whole console route tree, so it cannot hold its\n * render until the billing doc settles the way the plugin-page route does\n * — and an undefined `org` is not \"unknown\" to `checkEntitlement`, it is\n * the free tier. Without this flag the gates below told a Pro org that AI\n * assist is not on its plan for as long as the read was in flight.\n */\n orgReady?: boolean\n /**\n * The org every assist call is metered against (AGL-2073). The route no\n * longer resolves it from the signed-in user — a user with one paid org was\n * getting assist on all of their free ones, and their spend was landing on\n * whichever org the server happened to resolve.\n */\n orgId?: string\n /**\n * The site the canvas belongs to (AGL-2927), sent with every assist call\n * so the door can decide a site collaborator's permission on THAT site.\n * Null off a host route, where there is no canvas to assist on.\n */\n hostId?: string | null\n /**\n * The reader's AI verdict, resolved by the shell (AGL-2927). The gates\n * below HOLD until `loaded` — a door opened on a pending answer would\n * spend the workspace's credits on a permission nobody has confirmed —\n * and a refused key removes its callback from the context, so the\n * designer draws no control for it. Omitted, the answer is pending.\n */\n aiPermissions?: { loaded: boolean; use: boolean; generate: boolean }\n children?: JSX.Children\n}\n\nconst PERMISSIONS_PENDING = 'Checking your permissions — try again in a moment'\nconst AI_USE_REFUSED =\n 'Your role does not include AI assistance — ask an organization admin'\nconst AI_GENERATE_REFUSED =\n 'Your role does not include AI generation — ask an organization admin'\n\n/**\n * Console-side AI copy assist (AGL-89): provides the designer's \"Rewrite\n * with AI\" callback, hosts the instruction dialog, and calls the assist API\n * (which 501-degrades when no AI provider is configured). The commit\n * spreads the node's current props — `updateNodeProps` REPLACES the props\n * object — and clears any stale rich-text `html` so the new text renders.\n */\nexport function AiAssistProvider(props: AiAssistProviderProps) {\n const org = props.org\n const orgReady = props.orgReady\n const orgId = props.orgId\n const hostId = props.hostId ?? null\n const aiPermissions = props.aiPermissions\n const { children } = props\n const { enqueueSnackbar } = useSnackbar()\n const { data: user } = useUser()\n const [node, setNode] = useState<Aglyn.NodeSchema<any> | null>(null)\n const [instruction, setInstruction] = useState('')\n // Rewrite target (AGL-130): 'children' for text-editable elements, or\n // any text attribute the element's schema declares (alt text, labels…).\n const [targetProp, setTargetProp] = useState('children')\n const [busy, setBusy] = useState(false)\n // Generate section (AGL-169).\n const [sectionOpen, setSectionOpen] = useState(false)\n const [sectionPrompt, setSectionPrompt] = useState('')\n // The model switch and the usage strip in both dialogs (AGL-2942). Each\n // dialog remembers its own pick; one envelope store serves both strips\n // and the assistant panel's.\n const copyModel = useAiModelChoice({ orgId, hostId, surface: 'copy', kind: 'copy.element' })\n const sectionModel = useAiModelChoice({\n orgId,\n hostId,\n surface: 'section',\n kind: 'copy.section',\n })\n const publishMeter = usePublishAiUsageMeter(orgId)\n\n const textTargets = useMemo(() => {\n const schema = node?.componentSchema\n const textEditable =\n ((schema?.flags?.textEditable ?? Aglyn.FEATURE_FLAG.DISABLED) &\n Aglyn.FEATURE_FLAG.ENABLED) !==\n 0\n const attributes = (schema?.attributes ?? [])\n .filter(\n (field: any) =>\n field.component === Aglyn.FieldComponentType.TEXT_FIELD ||\n field.component === Aglyn.FieldComponentType.TEXTAREA,\n )\n .map((field: any) => ({\n prop: String(field.name),\n label: String(field.label ?? field.name),\n }))\n return textEditable\n ? [{ prop: 'children', label: 'Element text' }, ...attributes]\n : attributes\n }, [node])\n\n const handleRewrite = useCallback(\n (target: Aglyn.NodeSchema<any>) => {\n // The permission first (AGL-2927): it is a fact about the reader, and\n // pending asserts nothing here either. The refusal is unreachable\n // through the designer — a refused key publishes no callback — and\n // stands for any other caller of the context.\n if (!aiPermissions?.loaded) {\n return void enqueueSnackbar(PERMISSIONS_PENDING, {\n variant: 'info',\n persist: false,\n })\n }\n if (!aiPermissions.use) {\n return void enqueueSnackbar(AI_USE_REFUSED, {\n variant: 'warning',\n persist: false,\n })\n }\n // AGL-1380: pending asserts nothing. See `orgReady` on the props.\n if (!orgReady) {\n return void enqueueSnackbar(\n 'Checking your plan — try again in a moment',\n { variant: 'info', persist: false },\n )\n }\n if (!checkEntitlement(org as never, 'aiAssist')) {\n return void enqueueSnackbar(\n 'AI assist requires a Pro plan — see Billing to upgrade',\n { variant: 'warning', persist: false },\n )\n }\n setInstruction('')\n setTargetProp('children')\n setNode(target)\n },\n [org, orgReady, aiPermissions, enqueueSnackbar],\n )\n\n // Keep the target valid for the selected element.\n const effectiveTarget = textTargets.some((item) => item.prop === targetProp)\n ? targetProp\n : (textTargets[0]?.prop ?? 'children')\n\n const handleConfirm = useCallback(async () => {\n if (!node || !instruction.trim() || busy) return\n setBusy(true)\n try {\n const current = (Aglyn.canvas.toJSON().nodes as Record<string, any>)[\n node.$id\n ]\n const text =\n typeof current?.props?.[effectiveTarget] === 'string'\n ? (current.props[effectiveTarget] as string)\n : ''\n const response = await authorizedFetch(user, '/api/ai/assist', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n orgId,\n hostId,\n text,\n instruction: instruction.trim(),\n ...(copyModel.model ? { model: copyModel.model } : {}),\n }),\n })\n const payload = await response.json()\n publishMeter(payload?.meter)\n // An ai-assist feature lockdown (AGL-1510/1532) reads as a pause, not\n // as \"AI request failed\" — a provider incident or a cost runaway is\n // something WE turned off, and saying so keeps the user's content out\n // of the story.\n const locked = parseLockdownRefusal(response.status, payload)\n if (locked) {\n return void enqueueSnackbar(lockdownRefusalText(locked), {\n variant: 'warning',\n persist: true,\n })\n }\n if (response.status === 501) {\n return void enqueueSnackbar(\n 'AI assist is not configured on this deployment',\n { variant: 'info', persist: false },\n )\n }\n if (!response.ok || !payload?.text) {\n return void enqueueSnackbar(payload?.error ?? 'AI request failed', {\n variant: 'error',\n allowDuplicate: true,\n })\n }\n Aglyn.canvas.updateNodeProps(node, {\n ...current?.props,\n [effectiveTarget]: payload.text,\n // Rich-text elements render `html` over `children`; drop it so the\n // rewrite is what shows (the user can re-format inline afterwards).\n ...(effectiveTarget === 'children' ? { html: undefined } : {}),\n })\n setNode(null)\n enqueueSnackbar('Text rewritten — undo restores the original', {\n variant: 'success',\n persist: false,\n })\n } catch (error) {\n console.error(error)\n enqueueSnackbar('An error has occurred', {\n variant: 'error',\n allowDuplicate: true,\n })\n } finally {\n setBusy(false)\n }\n }, [\n node,\n instruction,\n busy,\n user,\n effectiveTarget,\n orgId,\n hostId,\n copyModel.model,\n publishMeter,\n enqueueSnackbar,\n ])\n\n const handleGenerateSection = useCallback(() => {\n // The permission first (AGL-2927) — a section is a generation, so this\n // door sells under `ai.generate`; see `handleRewrite`.\n if (!aiPermissions?.loaded) {\n return void enqueueSnackbar(PERMISSIONS_PENDING, {\n variant: 'info',\n persist: false,\n })\n }\n if (!aiPermissions.generate) {\n return void enqueueSnackbar(AI_GENERATE_REFUSED, {\n variant: 'warning',\n persist: false,\n })\n }\n // AGL-1380: same gate as `handleRewrite`.\n if (!orgReady) {\n return void enqueueSnackbar('Checking your plan — try again in a moment', {\n variant: 'info',\n persist: false,\n })\n }\n if (!checkEntitlement(org as never, 'aiAssist')) {\n return void enqueueSnackbar(\n 'AI assist requires a Pro plan — see Billing to upgrade',\n { variant: 'warning', persist: false },\n )\n }\n setSectionPrompt('')\n setSectionOpen(true)\n }, [org, orgReady, aiPermissions, enqueueSnackbar])\n\n const handleSectionConfirm = useCallback(async () => {\n if (!sectionPrompt.trim() || busy) return\n setBusy(true)\n try {\n const response = await authorizedFetch(user, '/api/ai/assist', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n orgId,\n hostId,\n mode: 'section',\n instruction: sectionPrompt.trim(),\n ...(sectionModel.model ? { model: sectionModel.model } : {}),\n }),\n })\n const payload = await response.json()\n publishMeter(payload?.meter)\n // Same pause notice on the section-generation door (AGL-1532).\n const locked = parseLockdownRefusal(response.status, payload)\n if (locked) {\n return void enqueueSnackbar(lockdownRefusalText(locked), {\n variant: 'warning',\n persist: true,\n })\n }\n if (response.status === 501) {\n return void enqueueSnackbar(\n 'AI assist is not configured on this deployment',\n { variant: 'info', persist: false },\n )\n }\n if (!response.ok || !payload?.section?.rootId) {\n return void enqueueSnackbar(payload?.error ?? 'AI request failed', {\n variant: 'error',\n allowDuplicate: true,\n })\n }\n const nested = marketplaceDefinitionToNested(\n payload.section.rootId,\n payload.section.nodes,\n )\n if (!nested) {\n return void enqueueSnackbar('AI returned an empty section', {\n variant: 'error',\n allowDuplicate: true,\n })\n }\n // Graft through the preset path: ids regenerate, history is saved,\n // and the subtree lands at the end of the canvas root.\n const stamped = (function stamp(node: any): any {\n const schema = Aglyn.components.getSchema(node.componentId)\n return {\n ...node,\n ...(schema?.pluginId ? { pluginId: schema.pluginId } : {}),\n nodes: (node.nodes ?? []).map(stamp),\n }\n })(nested)\n Aglyn.canvas.addNodeFromPreset(\n { type: Aglyn.NodeType.PRESET, data: stamped } as any,\n Aglyn.canvas.rootNode as any,\n )\n setSectionOpen(false)\n enqueueSnackbar('Section added — undo removes it', {\n variant: 'success',\n persist: false,\n })\n } catch (error) {\n console.error(error)\n enqueueSnackbar('An error has occurred', {\n variant: 'error',\n allowDuplicate: true,\n })\n } finally {\n setBusy(false)\n }\n }, [\n sectionPrompt,\n busy,\n user,\n orgId,\n hostId,\n sectionModel.model,\n publishMeter,\n enqueueSnackbar,\n ])\n\n // A REFUSED key publishes no callback (AGL-2927): the besigner controls\n // render only when the callback exists, so the refusal removes\n // the button rather than dimming it. A PENDING answer keeps both\n // callbacks, and each holds with a notice when pressed — a control that\n // vanishes and reappears while the read lands is worse than one that is\n // briefly inert (the `useHostRole` argument, applied here).\n const refusedUse = aiPermissions?.loaded === true && !aiPermissions.use\n const refusedGenerate =\n aiPermissions?.loaded === true && !aiPermissions.generate\n const contextValue = useMemo(\n () => ({\n ...(refusedUse ? {} : { onRewrite: handleRewrite }),\n ...(refusedGenerate ? {} : { onGenerateSection: handleGenerateSection }),\n }),\n [handleRewrite, handleGenerateSection, refusedUse, refusedGenerate],\n )\n\n return (\n <AiAssistActionsContext.Provider value={contextValue}>\n {children}\n <Dialog\n open={Boolean(node)}\n onClose={() => (busy ? null : setNode(null))}\n maxWidth=\"xs\"\n fullWidth\n >\n <DialogTitle>{'Rewrite with AI'}</DialogTitle>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}\n >\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Describe how the text should change — tone, length, message.'}\n </Typography>\n {textTargets.length > 1 ? (\n <TextField\n select\n label=\"Field\"\n value={effectiveTarget}\n onChange={(event) => setTargetProp(event.target.value)}\n size=\"small\"\n disabled={busy}\n >\n {textTargets.map((item) => (\n <MenuItem key={item.prop} value={item.prop}>\n {item.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n <TextField\n label=\"Instruction\"\n placeholder=\"e.g. Make it punchier and half as long\"\n value={instruction}\n onChange={(event) => setInstruction(event.target.value)}\n size=\"small\"\n autoFocus\n multiline\n minRows={2}\n disabled={busy}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n handleConfirm()\n }\n }}\n />\n <AiModelSelector choice={copyModel} disabled={busy} />\n <AiUsageStrip orgId={orgId} />\n </DialogContent>\n <DialogActions>\n <Button disabled={busy} onClick={() => setNode(null)}>\n {'Cancel'}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!instruction.trim() || busy}\n startIcon={busy ? <CircularProgress size={16} /> : undefined}\n onClick={handleConfirm}\n >\n {busy ? 'Rewriting…' : 'Rewrite'}\n </Button>\n </DialogActions>\n </Dialog>\n <Dialog\n open={sectionOpen}\n onClose={() => (busy ? null : setSectionOpen(false))}\n maxWidth=\"xs\"\n fullWidth\n >\n <DialogTitle>{'Generate a section with AI'}</DialogTitle>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: 2, pt: 1 }}\n >\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Describe the section — e.g. \"hero with headline, subtext, ' +\n 'and a call-to-action button\" or \"three-column feature grid\".'}\n </Typography>\n <TextField\n label=\"Section\"\n value={sectionPrompt}\n onChange={(event) => setSectionPrompt(event.target.value)}\n size=\"small\"\n autoFocus\n multiline\n minRows={2}\n disabled={busy}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n handleSectionConfirm()\n }\n }}\n />\n <AiModelSelector choice={sectionModel} disabled={busy} />\n <AiUsageStrip orgId={orgId} />\n </DialogContent>\n <DialogActions>\n <Button disabled={busy} onClick={() => setSectionOpen(false)}>\n {'Cancel'}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!sectionPrompt.trim() || busy}\n startIcon={busy ? <CircularProgress size={16} /> : undefined}\n onClick={handleSectionConfirm}\n >\n {busy ? 'Generating…' : 'Generate'}\n </Button>\n </DialogActions>\n </Dialog>\n </AiAssistActionsContext.Provider>\n )\n}\nAiAssistProvider.displayName = 'AiAssistProvider'\n\nexport default AiAssistProvider\n"],"names":["Aglyn","checkEntitlement","lockdownRefusalText","parseLockdownRefusal","marketplaceDefinitionToNested","AiAssistActionsContext","useSnackbar","Button","CircularProgress","Dialog","DialogActions","DialogContent","DialogTitle","MenuItem","TextField","Typography","useCallback","useMemo","useState","useUser","authorizedFetch","AiModelSelector","AiUsageStrip","useAiModelChoice","usePublishAiUsageMeter","PERMISSIONS_PENDING","AI_USE_REFUSED","AI_GENERATE_REFUSED","AiAssistProvider","props","textTargets","org","orgReady","orgId","hostId","aiPermissions","children","enqueueSnackbar","data","user","node","setNode","instruction","setInstruction","targetProp","setTargetProp","busy","setBusy","sectionOpen","setSectionOpen","sectionPrompt","setSectionPrompt","copyModel","surface","kind","sectionModel","publishMeter","schema","componentSchema","textEditable","flags","FEATURE_FLAG","DISABLED","ENABLED","attributes","filter","field","component","FieldComponentType","TEXT_FIELD","TEXTAREA","map","prop","String","name","label","handleRewrite","target","loaded","variant","persist","use","effectiveTarget","some","item","handleConfirm","trim","current","canvas","toJSON","nodes","$id","text","response","method","headers","body","JSON","stringify","model","payload","json","meter","locked","status","ok","error","allowDuplicate","updateNodeProps","html","undefined","console","handleGenerateSection","generate","handleSectionConfirm","mode","section","rootId","nested","stamped","stamp","components","getSchema","componentId","pluginId","addNodeFromPreset","type","NodeType","PRESET","rootNode","refusedUse","refusedGenerate","contextValue","onRewrite","onGenerateSection","Provider","value","open","Boolean","onClose","maxWidth","fullWidth","sx","display","flexDirection","gap","pt","color","length","select","onChange","event","size","disabled","placeholder","autoFocus","multiline","minRows","onKeyDown","key","metaKey","ctrlKey","preventDefault","choice","onClick","startIcon","displayName"],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { authorizedFetch } from '@aglyn/shared-util-http/authorized-token';
|
|
2
|
+
import type { AiJobKind } from '../model/ai-jobs.types';
|
|
3
|
+
import { type AiPageType } from '../model/ai-page-job';
|
|
4
|
+
import { type AiTemplateSubject } from '../model/ai-template-subjects';
|
|
5
|
+
/** The job kinds a member describes from a console page. */
|
|
6
|
+
export type AiBriefKind = Extract<AiJobKind, 'page' | 'template' | 'layout' | 'form' | 'component'>;
|
|
7
|
+
/** What the dialog says for one kind. */
|
|
8
|
+
export interface AiBriefCopy {
|
|
9
|
+
title: string;
|
|
10
|
+
/** The brief box's label. */
|
|
11
|
+
briefLabel: string;
|
|
12
|
+
placeholder: string;
|
|
13
|
+
/** What happens after the member starts the job, under the fields. */
|
|
14
|
+
next: string;
|
|
15
|
+
/** The action that starts the job. */
|
|
16
|
+
submit: string;
|
|
17
|
+
/** What the dialog says once the job exists. */
|
|
18
|
+
started: string;
|
|
19
|
+
/** What it says when the door gave no reason, or could not be reached. */
|
|
20
|
+
failed: string;
|
|
21
|
+
}
|
|
22
|
+
export declare const AI_BRIEF_COPY: Readonly<Record<AiBriefKind, AiBriefCopy>>;
|
|
23
|
+
/** Each template subject as its chip names it: what one page is drawn for. */
|
|
24
|
+
export declare const AI_TEMPLATE_SUBJECT_LABELS: Readonly<Record<AiTemplateSubject, string>>;
|
|
25
|
+
/** What a member picked beside the brief; each kind reads only its own. */
|
|
26
|
+
export interface AiBriefChoice {
|
|
27
|
+
/** A page's type, or `null` for none. */
|
|
28
|
+
pageType: AiPageType | null;
|
|
29
|
+
/** What a template's pages are drawn for, or `null` until one is picked. */
|
|
30
|
+
subject: AiTemplateSubject | null;
|
|
31
|
+
/** A collection entry template's collection, or `null` until one is picked. */
|
|
32
|
+
collectionId: string | null;
|
|
33
|
+
}
|
|
34
|
+
export declare const AI_BRIEF_NO_CHOICE: AiBriefChoice;
|
|
35
|
+
/**
|
|
36
|
+
* The job's `inputs` for what the member picked, or `null` while the kind's
|
|
37
|
+
* door would refuse them.
|
|
38
|
+
*
|
|
39
|
+
* A template's are read by the parser its door reads, so the dialog cannot
|
|
40
|
+
* send a subject the door does not know or an entry page with no collection.
|
|
41
|
+
* A page's type is optional. A layout, a form and a component read no inputs
|
|
42
|
+
* at all (AGL-2909, AGL-2913, AGL-2908), so theirs are empty.
|
|
43
|
+
*/
|
|
44
|
+
export declare function aiBriefJobInputs(kind: AiBriefKind, choice: AiBriefChoice): Record<string, string> | null;
|
|
45
|
+
export interface AiBriefDialogProps {
|
|
46
|
+
/** The job the brief starts. */
|
|
47
|
+
kind: AiBriefKind;
|
|
48
|
+
open: boolean;
|
|
49
|
+
onClose: () => void;
|
|
50
|
+
orgId: string | undefined;
|
|
51
|
+
hostId: string;
|
|
52
|
+
/** Who is signed in, whose token the request carries. */
|
|
53
|
+
user: Parameters<typeof authorizedFetch>[0];
|
|
54
|
+
}
|
|
55
|
+
export declare function AiBriefDialog({ kind, open, onClose, orgId, hostId, user }: AiBriefDialogProps): import("react").JSX.Element;
|
|
56
|
+
export default AiBriefDialog;
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
3
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
4
|
+
/**
|
|
5
|
+
* @license
|
|
6
|
+
* Copyright 2026 Aglyn LLC
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
* you may not use this file except in compliance with the License.
|
|
10
|
+
* You may obtain a copy of the License at
|
|
11
|
+
*
|
|
12
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
*
|
|
14
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
* See the License for the specific language governing permissions and
|
|
18
|
+
* limitations under the License.
|
|
19
|
+
*/ import { lockdownRefusalText, parseLockdownRefusal } from "@aglyn/aglyn";
|
|
20
|
+
import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
|
|
21
|
+
import { Alert, Button, Chip, Dialog, DialogActions, DialogContent, DialogTitle, Stack, TextField, Typography } from "@mui/material";
|
|
22
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
23
|
+
import { AI_PAGE_TYPES } from "../model/ai-page-job.js";
|
|
24
|
+
import { AI_TEMPLATE_SUBJECTS, parseAiTemplateJobInputs } from "../model/ai-template-subjects.js";
|
|
25
|
+
import { AiTemplateCollectionField } from "./ai-template-collection-field.component.js";
|
|
26
|
+
/**
|
|
27
|
+
* The brief dialog every "Describe it" opens (AGL-2907, AGL-3043, AGL-3051):
|
|
28
|
+
* a page from the Screens page and from the Assist panel's AI jobs, a page
|
|
29
|
+
* template from Templates, a layout from Layouts, a form from Forms and a
|
|
30
|
+
* reusable component from Components.
|
|
31
|
+
*
|
|
32
|
+
* One text box, and whatever the kind's door reads beside it, start one job of
|
|
33
|
+
* that kind: a page's optional page type; a template's subject and, for a
|
|
34
|
+
* collection entry's page, its collection. A layout, a form and a component
|
|
35
|
+
* read nothing but the brief and the site. The job plans first and waits in
|
|
36
|
+
* AI jobs, where the member confirms the plan and opens the draft once it is
|
|
37
|
+
* built; nothing here builds or writes anything.
|
|
38
|
+
*/ /** The longest brief a job admits. */ const BRIEF_MAX_CHARS = 4000;
|
|
39
|
+
export const AI_BRIEF_COPY = {
|
|
40
|
+
page: {
|
|
41
|
+
title: 'Describe a page',
|
|
42
|
+
briefLabel: 'What is the page for?',
|
|
43
|
+
placeholder: 'A landing page for our spring roof inspection offer, with the quote request form',
|
|
44
|
+
next: 'A plan comes first, and nothing is built until you confirm it. The page uses your ' + 'theme and what the site already has, and the plan lists anything the job builds first.',
|
|
45
|
+
submit: 'Plan the page',
|
|
46
|
+
started: 'The page is being planned. Open AI jobs in the Assist panel to review the plan and ' + 'confirm it. The page is built as an unpublished draft.',
|
|
47
|
+
failed: 'The page could not be started. Try again.'
|
|
48
|
+
},
|
|
49
|
+
template: {
|
|
50
|
+
title: 'Describe a page template',
|
|
51
|
+
briefLabel: 'What should each page show?',
|
|
52
|
+
placeholder: 'A page for each of our team members: their name and photo, their role, a short ' + 'biography and a way to get in touch',
|
|
53
|
+
next: 'A plan comes first, and nothing is built until you confirm it. What changes from one ' + 'page to the next, such as a name or a photo, is filled in from each record rather ' + 'than typed.',
|
|
54
|
+
submit: 'Plan the template',
|
|
55
|
+
started: 'The template is being planned. Open AI jobs in the Assist panel to review the plan ' + 'and confirm it. The template is built as a draft in your library, and nothing on ' + 'your site uses it until you do.',
|
|
56
|
+
failed: 'The template could not be started. Try again.'
|
|
57
|
+
},
|
|
58
|
+
layout: {
|
|
59
|
+
title: 'Describe a layout',
|
|
60
|
+
briefLabel: 'What should the layout hold?',
|
|
61
|
+
placeholder: 'A header with our name and links to Services, About and Contact, and a footer with ' + 'our address and opening hours',
|
|
62
|
+
next: 'A plan comes first, and nothing is built until you confirm it. The layout links your ' + 'screens, and places your navigation or menu component when the site has one.',
|
|
63
|
+
submit: 'Plan the layout',
|
|
64
|
+
started: 'The layout is being planned. Open AI jobs in the Assist panel to review the plan and ' + 'confirm it. The layout is built as a draft, and no screen uses it until you assign it.',
|
|
65
|
+
failed: 'The layout could not be started. Try again.'
|
|
66
|
+
},
|
|
67
|
+
form: {
|
|
68
|
+
title: 'Describe a form',
|
|
69
|
+
briefLabel: 'What is the form for?',
|
|
70
|
+
placeholder: 'A quote request form for a roofing company, asking what needs fixing and the best ' + 'time to call',
|
|
71
|
+
next: 'A plan comes first, and nothing is built until you confirm it. The form’s fields, its ' + 'marketing consent and where each submission goes are planned together.',
|
|
72
|
+
submit: 'Plan the form',
|
|
73
|
+
started: 'The form is being planned. Open AI jobs in the Assist panel to review the plan and ' + 'confirm it. The form is built as a draft, and it collects nothing until you place it ' + 'on a screen.',
|
|
74
|
+
failed: 'The form could not be started. Try again.'
|
|
75
|
+
},
|
|
76
|
+
component: {
|
|
77
|
+
title: 'Describe a reusable component',
|
|
78
|
+
briefLabel: 'What should the component show?',
|
|
79
|
+
placeholder: 'A testimonial card with the customer’s name, their role, their quote and a photo',
|
|
80
|
+
next: 'A plan comes first, and nothing is built until you confirm it. What each page can ' + 'change, such as a name or a photo, becomes a property of the component.',
|
|
81
|
+
submit: 'Plan the component',
|
|
82
|
+
started: 'The component is being planned. Open AI jobs in the Assist panel to review the plan ' + 'and confirm it. The component is built as a draft, and no page shows it until you ' + 'insert it.',
|
|
83
|
+
failed: 'The component could not be started. Try again.'
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
/** Each template subject as its chip names it: what one page is drawn for. */ export const AI_TEMPLATE_SUBJECT_LABELS = {
|
|
87
|
+
entry: 'Collection entry',
|
|
88
|
+
product: 'Product',
|
|
89
|
+
author: 'Author'
|
|
90
|
+
};
|
|
91
|
+
export const AI_BRIEF_NO_CHOICE = {
|
|
92
|
+
pageType: null,
|
|
93
|
+
subject: null,
|
|
94
|
+
collectionId: null
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* The job's `inputs` for what the member picked, or `null` while the kind's
|
|
98
|
+
* door would refuse them.
|
|
99
|
+
*
|
|
100
|
+
* A template's are read by the parser its door reads, so the dialog cannot
|
|
101
|
+
* send a subject the door does not know or an entry page with no collection.
|
|
102
|
+
* A page's type is optional. A layout, a form and a component read no inputs
|
|
103
|
+
* at all (AGL-2909, AGL-2913, AGL-2908), so theirs are empty.
|
|
104
|
+
*/ export function aiBriefJobInputs(kind, choice) {
|
|
105
|
+
if (kind === 'page') return choice.pageType ? {
|
|
106
|
+
pageType: choice.pageType
|
|
107
|
+
} : {};
|
|
108
|
+
if (kind === 'template') {
|
|
109
|
+
const inputs = parseAiTemplateJobInputs({
|
|
110
|
+
subject: choice.subject,
|
|
111
|
+
collectionId: choice.collectionId
|
|
112
|
+
});
|
|
113
|
+
if (typeof inputs === 'string') return null;
|
|
114
|
+
return inputs.collectionId ? {
|
|
115
|
+
subject: inputs.subject,
|
|
116
|
+
collectionId: inputs.collectionId
|
|
117
|
+
} : {
|
|
118
|
+
subject: inputs.subject
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return {};
|
|
122
|
+
}
|
|
123
|
+
export function AiBriefDialog({ kind, open, onClose, orgId, hostId, user }) {
|
|
124
|
+
const copy = AI_BRIEF_COPY[kind];
|
|
125
|
+
// Held in a ref so the request reads WHO is signed in, and nothing keys on
|
|
126
|
+
// the identity of the object that says so.
|
|
127
|
+
const userRef = useRef(user);
|
|
128
|
+
userRef.current = user;
|
|
129
|
+
const [brief, setBrief] = useState('');
|
|
130
|
+
const [choice, setChoice] = useState(AI_BRIEF_NO_CHOICE);
|
|
131
|
+
const [busy, setBusy] = useState(false);
|
|
132
|
+
const [notice, setNotice] = useState(null);
|
|
133
|
+
const [started, setStarted] = useState(false);
|
|
134
|
+
useEffect(()=>{
|
|
135
|
+
if (!open) return;
|
|
136
|
+
setNotice(null);
|
|
137
|
+
setStarted(false);
|
|
138
|
+
}, [
|
|
139
|
+
open
|
|
140
|
+
]);
|
|
141
|
+
const pick = useCallback((patch)=>setChoice((current)=>_extends({}, current, patch)), []);
|
|
142
|
+
const ready = aiBriefJobInputs(kind, choice) !== null;
|
|
143
|
+
const start = useCallback(async ()=>{
|
|
144
|
+
const inputs = aiBriefJobInputs(kind, choice);
|
|
145
|
+
if (!orgId || !brief.trim() || !inputs) return;
|
|
146
|
+
setBusy(true);
|
|
147
|
+
setNotice(null);
|
|
148
|
+
try {
|
|
149
|
+
const response = await authorizedFetch(userRef.current, '/api/ai/jobs', {
|
|
150
|
+
method: 'POST',
|
|
151
|
+
headers: {
|
|
152
|
+
'Content-Type': 'application/json'
|
|
153
|
+
},
|
|
154
|
+
body: JSON.stringify({
|
|
155
|
+
orgId,
|
|
156
|
+
hostId,
|
|
157
|
+
kind,
|
|
158
|
+
brief: brief.trim(),
|
|
159
|
+
inputs
|
|
160
|
+
})
|
|
161
|
+
});
|
|
162
|
+
const payload = await response.json().catch(()=>null);
|
|
163
|
+
if (!response.ok) {
|
|
164
|
+
var _ref;
|
|
165
|
+
const locked = parseLockdownRefusal(response.status, payload);
|
|
166
|
+
setNotice(locked ? lockdownRefusalText(locked) : String((_ref = payload == null ? void 0 : payload.error) != null ? _ref : copy.failed));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
setStarted(true);
|
|
170
|
+
setBrief('');
|
|
171
|
+
setChoice(AI_BRIEF_NO_CHOICE);
|
|
172
|
+
} catch (unused) {
|
|
173
|
+
setNotice(copy.failed);
|
|
174
|
+
} finally{
|
|
175
|
+
setBusy(false);
|
|
176
|
+
}
|
|
177
|
+
}, [
|
|
178
|
+
orgId,
|
|
179
|
+
hostId,
|
|
180
|
+
kind,
|
|
181
|
+
brief,
|
|
182
|
+
choice,
|
|
183
|
+
copy
|
|
184
|
+
]);
|
|
185
|
+
return /*#__PURE__*/ _jsxs(Dialog, {
|
|
186
|
+
open: open,
|
|
187
|
+
onClose: busy ? undefined : onClose,
|
|
188
|
+
fullWidth: true,
|
|
189
|
+
maxWidth: "sm",
|
|
190
|
+
children: [
|
|
191
|
+
/*#__PURE__*/ _jsx(DialogTitle, {
|
|
192
|
+
children: copy.title
|
|
193
|
+
}),
|
|
194
|
+
/*#__PURE__*/ _jsx(DialogContent, {
|
|
195
|
+
children: started ? /*#__PURE__*/ _jsx(Alert, {
|
|
196
|
+
severity: "success",
|
|
197
|
+
children: copy.started
|
|
198
|
+
}) : /*#__PURE__*/ _jsxs(Stack, {
|
|
199
|
+
spacing: 2,
|
|
200
|
+
sx: {
|
|
201
|
+
pt: 1
|
|
202
|
+
},
|
|
203
|
+
children: [
|
|
204
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
205
|
+
label: copy.briefLabel,
|
|
206
|
+
placeholder: copy.placeholder,
|
|
207
|
+
multiline: true,
|
|
208
|
+
minRows: 4,
|
|
209
|
+
value: brief,
|
|
210
|
+
onChange: (event)=>setBrief(event.target.value.slice(0, BRIEF_MAX_CHARS)),
|
|
211
|
+
helperText: `${brief.length.toLocaleString('en-US')} / ${BRIEF_MAX_CHARS.toLocaleString('en-US')}`,
|
|
212
|
+
disabled: busy,
|
|
213
|
+
autoFocus: true
|
|
214
|
+
}),
|
|
215
|
+
kind === 'page' ? /*#__PURE__*/ _jsx(ChipGroup, {
|
|
216
|
+
id: "ai-page-type-label",
|
|
217
|
+
label: "Page type (optional)",
|
|
218
|
+
options: AI_PAGE_TYPES.map((type)=>({
|
|
219
|
+
id: type.id,
|
|
220
|
+
label: type.label
|
|
221
|
+
})),
|
|
222
|
+
value: choice.pageType,
|
|
223
|
+
// Optional: pressing the pressed type again sends none.
|
|
224
|
+
onPress: (id)=>pick({
|
|
225
|
+
pageType: choice.pageType === id ? null : id
|
|
226
|
+
}),
|
|
227
|
+
disabled: busy
|
|
228
|
+
}) : null,
|
|
229
|
+
kind === 'template' ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
230
|
+
children: [
|
|
231
|
+
/*#__PURE__*/ _jsx(ChipGroup, {
|
|
232
|
+
id: "ai-template-subject-label",
|
|
233
|
+
label: "One page for each",
|
|
234
|
+
options: AI_TEMPLATE_SUBJECTS.map((subject)=>({
|
|
235
|
+
id: subject,
|
|
236
|
+
label: AI_TEMPLATE_SUBJECT_LABELS[subject]
|
|
237
|
+
})),
|
|
238
|
+
value: choice.subject,
|
|
239
|
+
// Required, so a press picks and never clears.
|
|
240
|
+
onPress: (id)=>pick({
|
|
241
|
+
subject: id
|
|
242
|
+
}),
|
|
243
|
+
disabled: busy
|
|
244
|
+
}),
|
|
245
|
+
choice.subject === 'entry' ? /*#__PURE__*/ _jsx(AiTemplateCollectionField, {
|
|
246
|
+
hostId: hostId,
|
|
247
|
+
value: choice.collectionId,
|
|
248
|
+
onChange: (collectionId)=>pick({
|
|
249
|
+
collectionId
|
|
250
|
+
}),
|
|
251
|
+
disabled: busy
|
|
252
|
+
}) : null
|
|
253
|
+
]
|
|
254
|
+
}) : null,
|
|
255
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
256
|
+
variant: "body2",
|
|
257
|
+
color: "text.secondary",
|
|
258
|
+
children: copy.next
|
|
259
|
+
}),
|
|
260
|
+
notice ? /*#__PURE__*/ _jsx(Alert, {
|
|
261
|
+
severity: "warning",
|
|
262
|
+
children: notice
|
|
263
|
+
}) : null
|
|
264
|
+
]
|
|
265
|
+
})
|
|
266
|
+
}),
|
|
267
|
+
/*#__PURE__*/ _jsxs(DialogActions, {
|
|
268
|
+
children: [
|
|
269
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
270
|
+
onClick: onClose,
|
|
271
|
+
disabled: busy,
|
|
272
|
+
children: started ? 'Close' : 'Cancel'
|
|
273
|
+
}),
|
|
274
|
+
started ? null : /*#__PURE__*/ _jsx(Button, {
|
|
275
|
+
variant: "contained",
|
|
276
|
+
onClick: ()=>void start(),
|
|
277
|
+
disabled: busy || !orgId || !brief.trim() || !ready,
|
|
278
|
+
children: copy.submit
|
|
279
|
+
})
|
|
280
|
+
]
|
|
281
|
+
})
|
|
282
|
+
]
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
/** A labeled row of chips, each a toggle button that says whether it is pressed. */ function ChipGroup(props) {
|
|
286
|
+
const { id, label, options, value, onPress, disabled } = props;
|
|
287
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
288
|
+
spacing: 1,
|
|
289
|
+
children: [
|
|
290
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
291
|
+
variant: "body2",
|
|
292
|
+
color: "text.secondary",
|
|
293
|
+
id: id,
|
|
294
|
+
children: label
|
|
295
|
+
}),
|
|
296
|
+
/*#__PURE__*/ _jsx(Stack, {
|
|
297
|
+
direction: "row",
|
|
298
|
+
useFlexGap: true,
|
|
299
|
+
role: "group",
|
|
300
|
+
"aria-labelledby": id,
|
|
301
|
+
sx: {
|
|
302
|
+
flexWrap: 'wrap',
|
|
303
|
+
gap: 1
|
|
304
|
+
},
|
|
305
|
+
children: options.map((option)=>/*#__PURE__*/ _jsx(Chip, {
|
|
306
|
+
label: option.label,
|
|
307
|
+
color: value === option.id ? 'primary' : 'default',
|
|
308
|
+
variant: value === option.id ? 'filled' : 'outlined',
|
|
309
|
+
onClick: ()=>onPress(option.id),
|
|
310
|
+
"aria-pressed": value === option.id,
|
|
311
|
+
disabled: disabled
|
|
312
|
+
}, option.id))
|
|
313
|
+
})
|
|
314
|
+
]
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
export default AiBriefDialog;
|
|
318
|
+
|
|
319
|
+
//# sourceMappingURL=ai-brief-dialog.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/ai-brief-dialog.component.tsx"],"sourcesContent":["'use client'\n\n/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { lockdownRefusalText, parseLockdownRefusal } from '@aglyn/aglyn'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport {\n Alert,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { AiJobKind } from '../model/ai-jobs.types'\nimport { AI_PAGE_TYPES, type AiPageType } from '../model/ai-page-job'\nimport {\n AI_TEMPLATE_SUBJECTS,\n parseAiTemplateJobInputs,\n type AiTemplateSubject,\n} from '../model/ai-template-subjects'\nimport { AiTemplateCollectionField } from './ai-template-collection-field.component'\n\n/**\n * The brief dialog every \"Describe it\" opens (AGL-2907, AGL-3043, AGL-3051):\n * a page from the Screens page and from the Assist panel's AI jobs, a page\n * template from Templates, a layout from Layouts, a form from Forms and a\n * reusable component from Components.\n *\n * One text box, and whatever the kind's door reads beside it, start one job of\n * that kind: a page's optional page type; a template's subject and, for a\n * collection entry's page, its collection. A layout, a form and a component\n * read nothing but the brief and the site. The job plans first and waits in\n * AI jobs, where the member confirms the plan and opens the draft once it is\n * built; nothing here builds or writes anything.\n */\n\n/** The longest brief a job admits. */\nconst BRIEF_MAX_CHARS = 4_000\n\n/** The job kinds a member describes from a console page. */\nexport type AiBriefKind = Extract<\n AiJobKind,\n 'page' | 'template' | 'layout' | 'form' | 'component'\n>\n\n/** What the dialog says for one kind. */\nexport interface AiBriefCopy {\n title: string\n /** The brief box's label. */\n briefLabel: string\n placeholder: string\n /** What happens after the member starts the job, under the fields. */\n next: string\n /** The action that starts the job. */\n submit: string\n /** What the dialog says once the job exists. */\n started: string\n /** What it says when the door gave no reason, or could not be reached. */\n failed: string\n}\n\nexport const AI_BRIEF_COPY: Readonly<Record<AiBriefKind, AiBriefCopy>> = {\n page: {\n title: 'Describe a page',\n briefLabel: 'What is the page for?',\n placeholder:\n 'A landing page for our spring roof inspection offer, with the quote request form',\n next:\n 'A plan comes first, and nothing is built until you confirm it. The page uses your ' +\n 'theme and what the site already has, and the plan lists anything the job builds first.',\n submit: 'Plan the page',\n started:\n 'The page is being planned. Open AI jobs in the Assist panel to review the plan and ' +\n 'confirm it. The page is built as an unpublished draft.',\n failed: 'The page could not be started. Try again.',\n },\n template: {\n title: 'Describe a page template',\n briefLabel: 'What should each page show?',\n placeholder:\n 'A page for each of our team members: their name and photo, their role, a short ' +\n 'biography and a way to get in touch',\n next:\n 'A plan comes first, and nothing is built until you confirm it. What changes from one ' +\n 'page to the next, such as a name or a photo, is filled in from each record rather ' +\n 'than typed.',\n submit: 'Plan the template',\n started:\n 'The template is being planned. Open AI jobs in the Assist panel to review the plan ' +\n 'and confirm it. The template is built as a draft in your library, and nothing on ' +\n 'your site uses it until you do.',\n failed: 'The template could not be started. Try again.',\n },\n layout: {\n title: 'Describe a layout',\n briefLabel: 'What should the layout hold?',\n placeholder:\n 'A header with our name and links to Services, About and Contact, and a footer with ' +\n 'our address and opening hours',\n next:\n 'A plan comes first, and nothing is built until you confirm it. The layout links your ' +\n 'screens, and places your navigation or menu component when the site has one.',\n submit: 'Plan the layout',\n started:\n 'The layout is being planned. Open AI jobs in the Assist panel to review the plan and ' +\n 'confirm it. The layout is built as a draft, and no screen uses it until you assign it.',\n failed: 'The layout could not be started. Try again.',\n },\n form: {\n title: 'Describe a form',\n briefLabel: 'What is the form for?',\n placeholder:\n 'A quote request form for a roofing company, asking what needs fixing and the best ' +\n 'time to call',\n next:\n 'A plan comes first, and nothing is built until you confirm it. The form’s fields, its ' +\n 'marketing consent and where each submission goes are planned together.',\n submit: 'Plan the form',\n started:\n 'The form is being planned. Open AI jobs in the Assist panel to review the plan and ' +\n 'confirm it. The form is built as a draft, and it collects nothing until you place it ' +\n 'on a screen.',\n failed: 'The form could not be started. Try again.',\n },\n component: {\n title: 'Describe a reusable component',\n briefLabel: 'What should the component show?',\n placeholder:\n 'A testimonial card with the customer’s name, their role, their quote and a photo',\n next:\n 'A plan comes first, and nothing is built until you confirm it. What each page can ' +\n 'change, such as a name or a photo, becomes a property of the component.',\n submit: 'Plan the component',\n started:\n 'The component is being planned. Open AI jobs in the Assist panel to review the plan ' +\n 'and confirm it. The component is built as a draft, and no page shows it until you ' +\n 'insert it.',\n failed: 'The component could not be started. Try again.',\n },\n}\n\n/** Each template subject as its chip names it: what one page is drawn for. */\nexport const AI_TEMPLATE_SUBJECT_LABELS: Readonly<Record<AiTemplateSubject, string>> = {\n entry: 'Collection entry',\n product: 'Product',\n author: 'Author',\n}\n\n/** What a member picked beside the brief; each kind reads only its own. */\nexport interface AiBriefChoice {\n /** A page's type, or `null` for none. */\n pageType: AiPageType | null\n /** What a template's pages are drawn for, or `null` until one is picked. */\n subject: AiTemplateSubject | null\n /** A collection entry template's collection, or `null` until one is picked. */\n collectionId: string | null\n}\n\nexport const AI_BRIEF_NO_CHOICE: AiBriefChoice = {\n pageType: null,\n subject: null,\n collectionId: null,\n}\n\n/**\n * The job's `inputs` for what the member picked, or `null` while the kind's\n * door would refuse them.\n *\n * A template's are read by the parser its door reads, so the dialog cannot\n * send a subject the door does not know or an entry page with no collection.\n * A page's type is optional. A layout, a form and a component read no inputs\n * at all (AGL-2909, AGL-2913, AGL-2908), so theirs are empty.\n */\nexport function aiBriefJobInputs(\n kind: AiBriefKind,\n choice: AiBriefChoice,\n): Record<string, string> | null {\n if (kind === 'page') return choice.pageType ? { pageType: choice.pageType } : {}\n if (kind === 'template') {\n const inputs = parseAiTemplateJobInputs({\n subject: choice.subject,\n collectionId: choice.collectionId,\n })\n if (typeof inputs === 'string') return null\n return inputs.collectionId\n ? { subject: inputs.subject, collectionId: inputs.collectionId }\n : { subject: inputs.subject }\n }\n return {}\n}\n\nexport interface AiBriefDialogProps {\n /** The job the brief starts. */\n kind: AiBriefKind\n open: boolean\n onClose: () => void\n orgId: string | undefined\n hostId: string\n /** Who is signed in, whose token the request carries. */\n user: Parameters<typeof authorizedFetch>[0]\n}\n\nexport function AiBriefDialog({ kind, open, onClose, orgId, hostId, user }: AiBriefDialogProps) {\n const copy = AI_BRIEF_COPY[kind]\n // Held in a ref so the request reads WHO is signed in, and nothing keys on\n // the identity of the object that says so.\n const userRef = useRef(user)\n userRef.current = user\n const [brief, setBrief] = useState('')\n const [choice, setChoice] = useState<AiBriefChoice>(AI_BRIEF_NO_CHOICE)\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState<string | null>(null)\n const [started, setStarted] = useState(false)\n\n useEffect(() => {\n if (!open) return\n setNotice(null)\n setStarted(false)\n }, [open])\n\n const pick = useCallback(\n (patch: Partial<AiBriefChoice>) => setChoice((current) => ({ ...current, ...patch })),\n [],\n )\n const ready = aiBriefJobInputs(kind, choice) !== null\n\n const start = useCallback(async () => {\n const inputs = aiBriefJobInputs(kind, choice)\n if (!orgId || !brief.trim() || !inputs) return\n setBusy(true)\n setNotice(null)\n try {\n const response = await authorizedFetch(userRef.current, '/api/ai/jobs', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ orgId, hostId, kind, brief: brief.trim(), inputs }),\n })\n const payload = await response.json().catch(() => null)\n if (!response.ok) {\n const locked = parseLockdownRefusal(response.status, payload)\n setNotice(locked ? lockdownRefusalText(locked) : String(payload?.error ?? copy.failed))\n return\n }\n setStarted(true)\n setBrief('')\n setChoice(AI_BRIEF_NO_CHOICE)\n } catch {\n setNotice(copy.failed)\n } finally {\n setBusy(false)\n }\n }, [orgId, hostId, kind, brief, choice, copy])\n\n return (\n <Dialog open={open} onClose={busy ? undefined : onClose} fullWidth maxWidth=\"sm\">\n <DialogTitle>{copy.title}</DialogTitle>\n <DialogContent>\n {started ? (\n <Alert severity=\"success\">{copy.started}</Alert>\n ) : (\n <Stack spacing={2} sx={{ pt: 1 }}>\n <TextField\n label={copy.briefLabel}\n placeholder={copy.placeholder}\n multiline\n minRows={4}\n value={brief}\n onChange={(event) => setBrief(event.target.value.slice(0, BRIEF_MAX_CHARS))}\n helperText={`${brief.length.toLocaleString('en-US')} / ${BRIEF_MAX_CHARS.toLocaleString('en-US')}`}\n disabled={busy}\n autoFocus\n />\n {kind === 'page' ? (\n <ChipGroup\n id=\"ai-page-type-label\"\n label=\"Page type (optional)\"\n options={AI_PAGE_TYPES.map((type) => ({ id: type.id, label: type.label }))}\n value={choice.pageType}\n // Optional: pressing the pressed type again sends none.\n onPress={(id) =>\n pick({ pageType: choice.pageType === id ? null : (id as AiPageType) })\n }\n disabled={busy}\n />\n ) : null}\n {kind === 'template' ? (\n <>\n <ChipGroup\n id=\"ai-template-subject-label\"\n label=\"One page for each\"\n options={AI_TEMPLATE_SUBJECTS.map((subject) => ({\n id: subject,\n label: AI_TEMPLATE_SUBJECT_LABELS[subject],\n }))}\n value={choice.subject}\n // Required, so a press picks and never clears.\n onPress={(id) => pick({ subject: id as AiTemplateSubject })}\n disabled={busy}\n />\n {choice.subject === 'entry' ? (\n <AiTemplateCollectionField\n hostId={hostId}\n value={choice.collectionId}\n onChange={(collectionId) => pick({ collectionId })}\n disabled={busy}\n />\n ) : null}\n </>\n ) : null}\n <Typography variant=\"body2\" color=\"text.secondary\">\n {copy.next}\n </Typography>\n {notice ? <Alert severity=\"warning\">{notice}</Alert> : null}\n </Stack>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={busy}>\n {started ? 'Close' : 'Cancel'}\n </Button>\n {started ? null : (\n <Button\n variant=\"contained\"\n onClick={() => void start()}\n disabled={busy || !orgId || !brief.trim() || !ready}\n >\n {copy.submit}\n </Button>\n )}\n </DialogActions>\n </Dialog>\n )\n}\n\n/** A labeled row of chips, each a toggle button that says whether it is pressed. */\nfunction ChipGroup(props: {\n id: string\n label: string\n options: ReadonlyArray<{ id: string; label: string }>\n value: string | null\n onPress: (id: string) => void\n disabled: boolean\n}) {\n const { id, label, options, value, onPress, disabled } = props\n return (\n <Stack spacing={1}>\n <Typography variant=\"body2\" color=\"text.secondary\" id={id}>\n {label}\n </Typography>\n <Stack\n direction=\"row\"\n useFlexGap\n role=\"group\"\n aria-labelledby={id}\n sx={{ flexWrap: 'wrap', gap: 1 }}\n >\n {options.map((option) => (\n <Chip\n key={option.id}\n label={option.label}\n color={value === option.id ? 'primary' : 'default'}\n variant={value === option.id ? 'filled' : 'outlined'}\n onClick={() => onPress(option.id)}\n aria-pressed={value === option.id}\n disabled={disabled}\n />\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default AiBriefDialog\n"],"names":["lockdownRefusalText","parseLockdownRefusal","authorizedFetch","Alert","Button","Chip","Dialog","DialogActions","DialogContent","DialogTitle","Stack","TextField","Typography","useCallback","useEffect","useRef","useState","AI_PAGE_TYPES","AI_TEMPLATE_SUBJECTS","parseAiTemplateJobInputs","AiTemplateCollectionField","BRIEF_MAX_CHARS","AI_BRIEF_COPY","page","title","briefLabel","placeholder","next","submit","started","failed","template","layout","form","component","AI_TEMPLATE_SUBJECT_LABELS","entry","product","author","AI_BRIEF_NO_CHOICE","pageType","subject","collectionId","aiBriefJobInputs","kind","choice","inputs","AiBriefDialog","open","onClose","orgId","hostId","user","copy","userRef","current","brief","setBrief","setChoice","busy","setBusy","notice","setNotice","setStarted","pick","patch","ready","start","trim","response","method","headers","body","JSON","stringify","payload","json","catch","ok","locked","status","String","error","undefined","fullWidth","maxWidth","severity","spacing","sx","pt","label","multiline","minRows","value","onChange","event","target","slice","helperText","length","toLocaleString","disabled","autoFocus","ChipGroup","id","options","map","type","onPress","variant","color","onClick","props","direction","useFlexGap","role","aria-labelledby","flexWrap","gap","option","aria-pressed"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type AiPermissionVerdict } from '../model/ai-permissions';
|
|
2
|
+
/** A roster row as the collaborators table hands it to a column. */
|
|
3
|
+
interface CollaboratorRow {
|
|
4
|
+
$id?: string;
|
|
5
|
+
uid?: string;
|
|
6
|
+
role?: string;
|
|
7
|
+
status?: string;
|
|
8
|
+
aiPermissions?: Partial<AiPermissionVerdict>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A collaborator's AI verdict on the site, as the row shows it: the roster
|
|
12
|
+
* copy the toggle door wrote, else the host role's default — which is what
|
|
13
|
+
* the doors resolve for a member document the toggle has never touched, so
|
|
14
|
+
* a row never shows a state the server does not hold.
|
|
15
|
+
*/
|
|
16
|
+
export declare function collaboratorAiPermissions(member: CollaboratorRow | undefined): AiPermissionVerdict;
|
|
17
|
+
/**
|
|
18
|
+
* THE COLLABORATORS TABLE'S AI COLUMN (AGL-2927, AGL-2984): whether this
|
|
19
|
+
* person may open the AI doors ON THIS SITE, through the `hostMembers`
|
|
20
|
+
* zone. The host role sets the default; the boxes refine it, and the doors
|
|
21
|
+
* read the same answer, so an unticked box is a closed door rather than a
|
|
22
|
+
* hidden button. The owner is decided by the org role, and says so.
|
|
23
|
+
*/
|
|
24
|
+
export declare function AiCollaboratorPermissionsCell(props: {
|
|
25
|
+
hostId?: string;
|
|
26
|
+
canManage?: boolean;
|
|
27
|
+
member?: CollaboratorRow;
|
|
28
|
+
}): import("react").JSX.Element;
|
|
29
|
+
export declare namespace AiCollaboratorPermissionsCell {
|
|
30
|
+
var displayName: string;
|
|
31
|
+
}
|
|
32
|
+
export {};
|