@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,573 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ 'use client';
|
|
17
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
18
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
19
|
+
import { pluginDocsHelp } from "@aglyn/aglyn/app-utils/docs-help";
|
|
20
|
+
import { ScrollTable } from "@aglyn/shared-ui-jsx/components/scroll-table.component";
|
|
21
|
+
import { useHostOrgId, useUser } from "@aglyn/tenant-feature-instance";
|
|
22
|
+
import { Alert, Box, Button, Chip, CircularProgress, Link, Stack, TableBody, TableCell, TableHead, TableRow, TextField, Typography } from "@mui/material";
|
|
23
|
+
import { useEffect, useMemo, useState } from "react";
|
|
24
|
+
import { AI_EXPERIMENT_SUBJECT_MAX_CHARS } from "../model/ai-experiment.js";
|
|
25
|
+
import { aiExperimentArmIsNamed, aiExperimentVerdictDisplay, readAiExperimentExplanation, readAiExperimentVariants } from "../model/ai-experiment-proposal.js";
|
|
26
|
+
import { aiJobProblem, useAiJobRun, useAiJobsVerdict } from "./use-ai-job-run.js";
|
|
27
|
+
/**
|
|
28
|
+
* A/B tests by AI in the console (AGL-2914): the two doors a person reaches
|
|
29
|
+
* the `experiment` job through, and the surfaces that render what it answers.
|
|
30
|
+
*
|
|
31
|
+
* Both are widgets in zones the A/B TESTING card hosts, not surfaces of this
|
|
32
|
+
* plugin's own. The test, the experiment document, the traffic split and the
|
|
33
|
+
* counters belong to the plugin that draws that card, and neither plugin
|
|
34
|
+
* imports the other: the zone's id and the props it hands a widget are the
|
|
35
|
+
* whole contract, and the interfaces below restate the halves this widget
|
|
36
|
+
* reads rather than importing the owner's.
|
|
37
|
+
*
|
|
38
|
+
* ## The result surface may not decide anything
|
|
39
|
+
*
|
|
40
|
+
* The step reached the verdict from the counts before a model was asked, and
|
|
41
|
+
* cut the answer back to it. A card can undo all of that silently — a
|
|
42
|
+
* confident heading, a highlighted row, a badge saying which to ship — and
|
|
43
|
+
* the reader will take the layout for the claim. So {@link AiExperimentResultCard}
|
|
44
|
+
* asks `aiExperimentVerdictDisplay` what the verdict permits before it draws
|
|
45
|
+
* anything: an undecided result gets a neutral chip, a sentence saying it
|
|
46
|
+
* settled nothing ABOVE the explanation, no marked arm and no recommendation.
|
|
47
|
+
* Nothing on it is conditioned on which arm has the best rate.
|
|
48
|
+
*
|
|
49
|
+
* ## Neither card writes
|
|
50
|
+
*
|
|
51
|
+
* The variants card fills the experiment editor's own fields, unsaved, and
|
|
52
|
+
* the dialog's Save is the write. The result card has nothing to apply.
|
|
53
|
+
*/ const VARIANTS_FAILED_COPY = 'Variants could not be written. Try again.';
|
|
54
|
+
const EXPLAIN_FAILED_COPY = 'The result could not be explained. Try again.';
|
|
55
|
+
/** What the test varies, in the words this card's own copy uses. */ const TARGET_NOUN = {
|
|
56
|
+
screen: 'page',
|
|
57
|
+
section: 'section',
|
|
58
|
+
email: 'email'
|
|
59
|
+
};
|
|
60
|
+
/** The proposal a finished experiment job carries, whichever task it ran. */ function proposalOf(job) {
|
|
61
|
+
var _ref;
|
|
62
|
+
var _job_outputs_find;
|
|
63
|
+
if ((job == null ? void 0 : job.status) !== 'done') return null;
|
|
64
|
+
return (_ref = (_job_outputs_find = job.outputs.find((output)=>output.resource === 'experiment')) == null ? void 0 : _job_outputs_find.proposal) != null ? _ref : null;
|
|
65
|
+
}
|
|
66
|
+
const rateText = (value)=>value === null ? '—' : `${value}%`;
|
|
67
|
+
const liftText = (value)=>value === null ? '—' : `${value >= 0 ? '+' : ''}${value}%`;
|
|
68
|
+
/**
|
|
69
|
+
* The copy an email test varies, as the editor holds it: the FIRST variant's
|
|
70
|
+
* subject and body, which is the control. A screen or a section varies a
|
|
71
|
+
* screen version, which the editor does not hold, so there is nothing to
|
|
72
|
+
* prefill and the person pastes what is under test.
|
|
73
|
+
*/ export function aiExperimentSubjectFrom(target, variants) {
|
|
74
|
+
if (target !== 'email') return '';
|
|
75
|
+
const control = variants[0];
|
|
76
|
+
if (!control) return '';
|
|
77
|
+
return [
|
|
78
|
+
control.subject,
|
|
79
|
+
control.body
|
|
80
|
+
].filter(Boolean).join('\n\n');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A proposal mapped onto the editor's variants, in order. Only the fields
|
|
84
|
+
* that target has a place for are filled: an email varies its subject and
|
|
85
|
+
* body, and a screen or a section varies a screen version, so there only the
|
|
86
|
+
* name is filled and the copy is read on the card.
|
|
87
|
+
*/ export function aiExperimentVariantDrafts(target, variants, proposal) {
|
|
88
|
+
return variants.map((variant, index)=>{
|
|
89
|
+
const proposed = proposal.variants[index];
|
|
90
|
+
if (!proposed) return variant;
|
|
91
|
+
return {
|
|
92
|
+
id: variant.id,
|
|
93
|
+
name: proposed.name,
|
|
94
|
+
subject: target === 'email' ? proposed.subject : '',
|
|
95
|
+
body: target === 'email' ? proposed.body : ''
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/** Where a proposed variant's copy lands, said before the person presses the button. */ export function aiExperimentApplyCopy(target) {
|
|
100
|
+
return target === 'email' ? 'Each variant above takes its name, subject and body. Nothing is saved until you save the experiment.' : 'Each variant above takes its name. The copy itself is a screen version — make one per variant in the editor and pin it above.';
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* "Write variants with AI", in the experiment editor beneath the variants it
|
|
104
|
+
* writes for. It proposes COPY: no weight, no traffic split, no goal and no
|
|
105
|
+
* schedule, and the first variant it writes is the copy as it stands so the
|
|
106
|
+
* test has something to measure against.
|
|
107
|
+
*/ export function AiExperimentVariantsCard(props) {
|
|
108
|
+
var _useHostOrgId, _aiJobProblem;
|
|
109
|
+
var _run_job, _run_job1, _run_job2, _run_job3;
|
|
110
|
+
const { hostId, target, variants, proposeVariants } = props;
|
|
111
|
+
// The zone hands the SITE, which is what the card it is drawn in knows. The
|
|
112
|
+
// organization is this widget's to resolve, as every AI widget in another
|
|
113
|
+
// plugin's zone resolves it.
|
|
114
|
+
const orgId = (_useHostOrgId = useHostOrgId(hostId)) != null ? _useHostOrgId : undefined;
|
|
115
|
+
const { data: user } = useUser();
|
|
116
|
+
const verdict = useAiJobsVerdict(user, orgId);
|
|
117
|
+
const run = useAiJobRun(user, VARIANTS_FAILED_COPY);
|
|
118
|
+
const prefill = useMemo(()=>aiExperimentSubjectFrom(target, variants), [
|
|
119
|
+
target,
|
|
120
|
+
variants
|
|
121
|
+
]);
|
|
122
|
+
const [subject, setSubject] = useState(prefill);
|
|
123
|
+
const [applied, setApplied] = useState(null);
|
|
124
|
+
// The control's copy follows the editor until the person edits this field,
|
|
125
|
+
// so switching a draft test from a page to an email fills it rather than
|
|
126
|
+
// leaving the earlier target's copy under a question about a new one.
|
|
127
|
+
const [typed, setTyped] = useState(false);
|
|
128
|
+
useEffect(()=>{
|
|
129
|
+
if (!typed) setSubject(prefill);
|
|
130
|
+
}, [
|
|
131
|
+
prefill,
|
|
132
|
+
typed
|
|
133
|
+
]);
|
|
134
|
+
const proposal = useMemo(()=>readAiExperimentVariants(proposalOf(run.job)), [
|
|
135
|
+
run.job
|
|
136
|
+
]);
|
|
137
|
+
const problem = (_aiJobProblem = aiJobProblem(run.job, VARIANTS_FAILED_COPY)) != null ? _aiJobProblem : ((_run_job = run.job) == null ? void 0 : _run_job.status) === 'done' && !proposal ? VARIANTS_FAILED_COPY : null;
|
|
138
|
+
if (verdict !== 'ready') return null;
|
|
139
|
+
const busy = run.starting || run.running;
|
|
140
|
+
const noun = TARGET_NOUN[target];
|
|
141
|
+
const variantsHelp = pluginDocsHelp('aiExperiments', {
|
|
142
|
+
anchor: '#write-variants',
|
|
143
|
+
excerpt: 'Writes two to four variants of the copy under test, the first of them your copy unchanged. They go into the editor’s fields unsaved; nothing is saved until you save the experiment.'
|
|
144
|
+
});
|
|
145
|
+
const write = ()=>{
|
|
146
|
+
if (!orgId || !subject.trim()) return;
|
|
147
|
+
setApplied(null);
|
|
148
|
+
void run.start({
|
|
149
|
+
orgId,
|
|
150
|
+
hostId,
|
|
151
|
+
kind: 'experiment',
|
|
152
|
+
brief: `Write variants of this ${noun} for the A/B test ` + `“${props.name.trim() || 'this test'}”.`,
|
|
153
|
+
inputs: _extends({
|
|
154
|
+
task: 'variants',
|
|
155
|
+
target,
|
|
156
|
+
subject: subject.trim().slice(0, AI_EXPERIMENT_SUBJECT_MAX_CHARS),
|
|
157
|
+
goal: props.goal
|
|
158
|
+
}, props.experimentId ? {
|
|
159
|
+
experimentId: props.experimentId
|
|
160
|
+
} : {})
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
const apply = ()=>{
|
|
164
|
+
if (!proposal || !run.job) return;
|
|
165
|
+
proposeVariants(aiExperimentVariantDrafts(target, variants, proposal), run.job.id);
|
|
166
|
+
setApplied(run.job.id);
|
|
167
|
+
};
|
|
168
|
+
return /*#__PURE__*/ _jsx(Box, {
|
|
169
|
+
sx: {
|
|
170
|
+
border: 1,
|
|
171
|
+
borderColor: 'divider',
|
|
172
|
+
borderRadius: 1,
|
|
173
|
+
p: 1.5
|
|
174
|
+
},
|
|
175
|
+
"aria-label": "Write variants with AI",
|
|
176
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
177
|
+
spacing: 1,
|
|
178
|
+
children: [
|
|
179
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
180
|
+
direction: "row",
|
|
181
|
+
spacing: 1,
|
|
182
|
+
sx: {
|
|
183
|
+
alignItems: 'baseline'
|
|
184
|
+
},
|
|
185
|
+
children: [
|
|
186
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
187
|
+
variant: "subtitle2",
|
|
188
|
+
sx: {
|
|
189
|
+
flexGrow: 1
|
|
190
|
+
},
|
|
191
|
+
children: 'Write variants with AI'
|
|
192
|
+
}),
|
|
193
|
+
/*#__PURE__*/ _jsx(Link, {
|
|
194
|
+
href: variantsHelp.href,
|
|
195
|
+
target: "_blank",
|
|
196
|
+
rel: "noopener",
|
|
197
|
+
variant: "caption",
|
|
198
|
+
title: variantsHelp.excerpt,
|
|
199
|
+
children: 'How it works'
|
|
200
|
+
})
|
|
201
|
+
]
|
|
202
|
+
}),
|
|
203
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
204
|
+
size: "small",
|
|
205
|
+
multiline: true,
|
|
206
|
+
minRows: 2,
|
|
207
|
+
label: `The ${noun} copy under test`,
|
|
208
|
+
placeholder: target === 'email' ? 'The subject line and message as they stand' : 'The headline and copy as they stand on the page',
|
|
209
|
+
helperText: 'Variants are written from this. The first one it writes is this copy unchanged, so the test has a control.',
|
|
210
|
+
value: subject,
|
|
211
|
+
onChange: (event)=>{
|
|
212
|
+
setTyped(true);
|
|
213
|
+
setSubject(event.target.value.slice(0, AI_EXPERIMENT_SUBJECT_MAX_CHARS));
|
|
214
|
+
},
|
|
215
|
+
disabled: busy
|
|
216
|
+
}),
|
|
217
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
218
|
+
direction: "row",
|
|
219
|
+
spacing: 1,
|
|
220
|
+
sx: {
|
|
221
|
+
alignItems: 'center'
|
|
222
|
+
},
|
|
223
|
+
children: [
|
|
224
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
225
|
+
size: "small",
|
|
226
|
+
variant: "outlined",
|
|
227
|
+
disabled: busy || !orgId || !subject.trim(),
|
|
228
|
+
onClick: write,
|
|
229
|
+
children: run.job && !busy ? 'Write them again' : 'Write variants'
|
|
230
|
+
}),
|
|
231
|
+
busy ? /*#__PURE__*/ _jsx(CircularProgress, {
|
|
232
|
+
size: 16,
|
|
233
|
+
"aria-label": "Writing variants"
|
|
234
|
+
}) : null
|
|
235
|
+
]
|
|
236
|
+
}),
|
|
237
|
+
run.notice ? /*#__PURE__*/ _jsx(Alert, {
|
|
238
|
+
severity: "warning",
|
|
239
|
+
children: run.notice
|
|
240
|
+
}) : null,
|
|
241
|
+
problem ? /*#__PURE__*/ _jsx(Alert, {
|
|
242
|
+
severity: ((_run_job1 = run.job) == null ? void 0 : _run_job1.status) === 'failed' ? 'error' : 'warning',
|
|
243
|
+
children: problem
|
|
244
|
+
}) : null,
|
|
245
|
+
proposal ? /*#__PURE__*/ _jsxs(Stack, {
|
|
246
|
+
spacing: 1,
|
|
247
|
+
"aria-label": "Proposed variants",
|
|
248
|
+
children: [
|
|
249
|
+
proposal.goal ? /*#__PURE__*/ _jsx(Typography, {
|
|
250
|
+
variant: "body2",
|
|
251
|
+
color: "text.secondary",
|
|
252
|
+
children: `Written to move: ${proposal.goal}`
|
|
253
|
+
}) : null,
|
|
254
|
+
proposal.variants.map((variant, index)=>/*#__PURE__*/ _jsx(Box, {
|
|
255
|
+
sx: {
|
|
256
|
+
border: 1,
|
|
257
|
+
borderColor: 'divider',
|
|
258
|
+
borderRadius: 1,
|
|
259
|
+
p: 1
|
|
260
|
+
},
|
|
261
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
262
|
+
spacing: 0.5,
|
|
263
|
+
children: [
|
|
264
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
265
|
+
variant: "subtitle2",
|
|
266
|
+
children: variant.name || `Variant ${index + 1}`
|
|
267
|
+
}),
|
|
268
|
+
variant.subject ? /*#__PURE__*/ _jsx(Typography, {
|
|
269
|
+
variant: "body2",
|
|
270
|
+
children: `Subject: ${variant.subject}`
|
|
271
|
+
}) : null,
|
|
272
|
+
variant.preheader ? /*#__PURE__*/ _jsx(Typography, {
|
|
273
|
+
variant: "body2",
|
|
274
|
+
children: `Preheader: ${variant.preheader}`
|
|
275
|
+
}) : null,
|
|
276
|
+
variant.headline ? /*#__PURE__*/ _jsx(Typography, {
|
|
277
|
+
variant: "body2",
|
|
278
|
+
children: variant.headline
|
|
279
|
+
}) : null,
|
|
280
|
+
variant.body ? /*#__PURE__*/ _jsx(Typography, {
|
|
281
|
+
variant: "body2",
|
|
282
|
+
sx: {
|
|
283
|
+
whiteSpace: 'pre-line',
|
|
284
|
+
wordBreak: 'break-word'
|
|
285
|
+
},
|
|
286
|
+
children: variant.body
|
|
287
|
+
}) : null,
|
|
288
|
+
variant.rationale ? /*#__PURE__*/ _jsx(Typography, {
|
|
289
|
+
variant: "caption",
|
|
290
|
+
color: "text.secondary",
|
|
291
|
+
children: variant.rationale
|
|
292
|
+
}) : null
|
|
293
|
+
]
|
|
294
|
+
})
|
|
295
|
+
}, `${index}:${variant.name}`)),
|
|
296
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
297
|
+
variant: "caption",
|
|
298
|
+
color: "text.secondary",
|
|
299
|
+
children: aiExperimentApplyCopy(target)
|
|
300
|
+
}),
|
|
301
|
+
/*#__PURE__*/ _jsx(Stack, {
|
|
302
|
+
direction: "row",
|
|
303
|
+
spacing: 1,
|
|
304
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
305
|
+
size: "small",
|
|
306
|
+
variant: "contained",
|
|
307
|
+
disabled: applied === ((_run_job2 = run.job) == null ? void 0 : _run_job2.id),
|
|
308
|
+
onClick: apply,
|
|
309
|
+
children: 'Put into the variants'
|
|
310
|
+
})
|
|
311
|
+
}),
|
|
312
|
+
applied === ((_run_job3 = run.job) == null ? void 0 : _run_job3.id) ? /*#__PURE__*/ _jsx(Alert, {
|
|
313
|
+
severity: "success",
|
|
314
|
+
children: 'In the variants above. Review them, then Save the experiment — or Cancel to leave it as it was.'
|
|
315
|
+
}) : null
|
|
316
|
+
]
|
|
317
|
+
}) : null
|
|
318
|
+
]
|
|
319
|
+
})
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
AiExperimentVariantsCard.displayName = 'AiExperimentVariantsCard';
|
|
323
|
+
/** One arm, drawn the same way whatever the figures say about it. */ function ArmRow({ arm, named }) {
|
|
324
|
+
return /*#__PURE__*/ _jsxs(TableRow, {
|
|
325
|
+
children: [
|
|
326
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
327
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
328
|
+
direction: "row",
|
|
329
|
+
spacing: 1,
|
|
330
|
+
sx: {
|
|
331
|
+
alignItems: 'center'
|
|
332
|
+
},
|
|
333
|
+
children: [
|
|
334
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
335
|
+
variant: "body2",
|
|
336
|
+
children: arm.id
|
|
337
|
+
}),
|
|
338
|
+
named ? /*#__PURE__*/ _jsx(Chip, {
|
|
339
|
+
size: "small",
|
|
340
|
+
color: "success",
|
|
341
|
+
label: "Ahead"
|
|
342
|
+
}) : null
|
|
343
|
+
]
|
|
344
|
+
})
|
|
345
|
+
}),
|
|
346
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
347
|
+
children: arm.exposures
|
|
348
|
+
}),
|
|
349
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
350
|
+
children: arm.conversions
|
|
351
|
+
}),
|
|
352
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
353
|
+
children: rateText(arm.rate)
|
|
354
|
+
}),
|
|
355
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
356
|
+
children: liftText(arm.lift)
|
|
357
|
+
}),
|
|
358
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
359
|
+
children: rateText(arm.confidence)
|
|
360
|
+
})
|
|
361
|
+
]
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* The explanation, drawn to the verdict rather than to the numbers.
|
|
366
|
+
*
|
|
367
|
+
* The chip and the caveat come FIRST, above the prose: a reader who stops
|
|
368
|
+
* after one line must stop on what the result settled, not on a sentence
|
|
369
|
+
* about one variant. No row is marked unless the verdict names an arm, and
|
|
370
|
+
* `aiExperimentArmIsNamed` is asked per row rather than `winnerId` compared
|
|
371
|
+
* directly, so a stored winner beside an undecided verdict marks nothing.
|
|
372
|
+
*/ export function AiExperimentExplanation({ explanation }) {
|
|
373
|
+
const display = aiExperimentVerdictDisplay(explanation.verdict);
|
|
374
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
375
|
+
spacing: 1,
|
|
376
|
+
"aria-label": "What this result shows",
|
|
377
|
+
children: [
|
|
378
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
379
|
+
direction: "row",
|
|
380
|
+
spacing: 1,
|
|
381
|
+
sx: {
|
|
382
|
+
alignItems: 'center'
|
|
383
|
+
},
|
|
384
|
+
children: [
|
|
385
|
+
/*#__PURE__*/ _jsx(Chip, {
|
|
386
|
+
size: "small",
|
|
387
|
+
color: display.tone,
|
|
388
|
+
label: display.status
|
|
389
|
+
}),
|
|
390
|
+
display.namesAnArm ? /*#__PURE__*/ _jsx(Typography, {
|
|
391
|
+
variant: "caption",
|
|
392
|
+
color: "text.secondary",
|
|
393
|
+
children: `Called at ${explanation.threshold}% confidence.`
|
|
394
|
+
}) : null
|
|
395
|
+
]
|
|
396
|
+
}),
|
|
397
|
+
display.caveat ? /*#__PURE__*/ _jsx(Typography, {
|
|
398
|
+
variant: "body2",
|
|
399
|
+
children: display.caveat
|
|
400
|
+
}) : null,
|
|
401
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
402
|
+
variant: "body2",
|
|
403
|
+
sx: {
|
|
404
|
+
wordBreak: 'break-word'
|
|
405
|
+
},
|
|
406
|
+
children: explanation.headline
|
|
407
|
+
}),
|
|
408
|
+
explanation.points.map((point)=>/*#__PURE__*/ _jsx(Typography, {
|
|
409
|
+
variant: "body2",
|
|
410
|
+
color: "text.secondary",
|
|
411
|
+
children: point
|
|
412
|
+
}, point)),
|
|
413
|
+
explanation.arms.length ? /*#__PURE__*/ _jsxs(ScrollTable, {
|
|
414
|
+
size: "small",
|
|
415
|
+
"aria-label": "The figures this reads",
|
|
416
|
+
children: [
|
|
417
|
+
/*#__PURE__*/ _jsx(TableHead, {
|
|
418
|
+
children: /*#__PURE__*/ _jsxs(TableRow, {
|
|
419
|
+
children: [
|
|
420
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
421
|
+
children: 'Variant'
|
|
422
|
+
}),
|
|
423
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
424
|
+
children: 'Shown'
|
|
425
|
+
}),
|
|
426
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
427
|
+
children: 'Conversions'
|
|
428
|
+
}),
|
|
429
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
430
|
+
children: 'Rate'
|
|
431
|
+
}),
|
|
432
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
433
|
+
children: 'Lift'
|
|
434
|
+
}),
|
|
435
|
+
/*#__PURE__*/ _jsx(TableCell, {
|
|
436
|
+
children: 'Confidence'
|
|
437
|
+
})
|
|
438
|
+
]
|
|
439
|
+
})
|
|
440
|
+
}),
|
|
441
|
+
/*#__PURE__*/ _jsx(TableBody, {
|
|
442
|
+
children: explanation.arms.map((arm)=>/*#__PURE__*/ _jsx(ArmRow, {
|
|
443
|
+
arm: arm,
|
|
444
|
+
named: aiExperimentArmIsNamed(explanation, arm.id)
|
|
445
|
+
}, arm.id))
|
|
446
|
+
})
|
|
447
|
+
]
|
|
448
|
+
}) : null,
|
|
449
|
+
explanation.next ? /*#__PURE__*/ _jsx(Typography, {
|
|
450
|
+
variant: "body2",
|
|
451
|
+
children: explanation.next
|
|
452
|
+
}) : null
|
|
453
|
+
]
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
AiExperimentExplanation.displayName = 'AiExperimentExplanation';
|
|
457
|
+
/**
|
|
458
|
+
* "Explain this result", below one test's figures. It starts an `experiment`
|
|
459
|
+
* job, which reads the same figures the dialog above it shows, decides what
|
|
460
|
+
* they support in code, and asks a model only for the words.
|
|
461
|
+
*/ export function AiExperimentResultCard(props) {
|
|
462
|
+
var _useHostOrgId, _aiJobProblem;
|
|
463
|
+
var _run_job, _run_job1;
|
|
464
|
+
const { hostId, test } = props;
|
|
465
|
+
const orgId = (_useHostOrgId = useHostOrgId(hostId)) != null ? _useHostOrgId : undefined;
|
|
466
|
+
const { data: user } = useUser();
|
|
467
|
+
const verdict = useAiJobsVerdict(user, orgId);
|
|
468
|
+
const run = useAiJobRun(user, EXPLAIN_FAILED_COPY);
|
|
469
|
+
const explanation = useMemo(()=>readAiExperimentExplanation(proposalOf(run.job)), [
|
|
470
|
+
run.job
|
|
471
|
+
]);
|
|
472
|
+
const problem = (_aiJobProblem = aiJobProblem(run.job, EXPLAIN_FAILED_COPY)) != null ? _aiJobProblem : ((_run_job = run.job) == null ? void 0 : _run_job.status) === 'done' && !explanation ? EXPLAIN_FAILED_COPY : null;
|
|
473
|
+
if (verdict !== 'ready') return null;
|
|
474
|
+
const busy = run.starting || run.running;
|
|
475
|
+
const resultHelp = pluginDocsHelp('aiExperiments', {
|
|
476
|
+
anchor: '#the-verdict',
|
|
477
|
+
excerpt: 'What the figures support is worked out from the counts before a model is asked anything, and the explanation is held to it — so an undecided test reads as undecided and no variant is named.'
|
|
478
|
+
});
|
|
479
|
+
const explain = ()=>{
|
|
480
|
+
if (!orgId || !test) return;
|
|
481
|
+
void run.start({
|
|
482
|
+
orgId,
|
|
483
|
+
hostId,
|
|
484
|
+
kind: 'experiment',
|
|
485
|
+
brief: `Explain the result of the A/B test “${test}” in plain words.`,
|
|
486
|
+
inputs: _extends({
|
|
487
|
+
task: 'explain',
|
|
488
|
+
test
|
|
489
|
+
}, props.experimentId ? {
|
|
490
|
+
experimentId: props.experimentId
|
|
491
|
+
} : {})
|
|
492
|
+
});
|
|
493
|
+
};
|
|
494
|
+
return /*#__PURE__*/ _jsx(Box, {
|
|
495
|
+
sx: {
|
|
496
|
+
border: 1,
|
|
497
|
+
borderColor: 'divider',
|
|
498
|
+
borderRadius: 1,
|
|
499
|
+
p: 1.5,
|
|
500
|
+
mt: 2
|
|
501
|
+
},
|
|
502
|
+
"aria-label": "Explain this result with AI",
|
|
503
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
504
|
+
spacing: 1,
|
|
505
|
+
children: [
|
|
506
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
507
|
+
direction: "row",
|
|
508
|
+
spacing: 1,
|
|
509
|
+
sx: {
|
|
510
|
+
alignItems: 'center'
|
|
511
|
+
},
|
|
512
|
+
children: [
|
|
513
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
514
|
+
variant: "body2",
|
|
515
|
+
color: "text.secondary",
|
|
516
|
+
sx: {
|
|
517
|
+
flexGrow: 1
|
|
518
|
+
},
|
|
519
|
+
children: 'Read these figures in plain words, including whether they settle anything yet.'
|
|
520
|
+
}),
|
|
521
|
+
/*#__PURE__*/ _jsx(Link, {
|
|
522
|
+
href: resultHelp.href,
|
|
523
|
+
target: "_blank",
|
|
524
|
+
rel: "noopener",
|
|
525
|
+
variant: "caption",
|
|
526
|
+
title: resultHelp.excerpt,
|
|
527
|
+
children: 'How it works'
|
|
528
|
+
}),
|
|
529
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
530
|
+
size: "small",
|
|
531
|
+
variant: "outlined",
|
|
532
|
+
disabled: busy || !orgId || !test,
|
|
533
|
+
onClick: explain,
|
|
534
|
+
children: run.job && !busy ? 'Ask again' : 'Explain this result'
|
|
535
|
+
})
|
|
536
|
+
]
|
|
537
|
+
}),
|
|
538
|
+
busy ? /*#__PURE__*/ _jsxs(Stack, {
|
|
539
|
+
direction: "row",
|
|
540
|
+
spacing: 1,
|
|
541
|
+
sx: {
|
|
542
|
+
alignItems: 'center'
|
|
543
|
+
},
|
|
544
|
+
children: [
|
|
545
|
+
/*#__PURE__*/ _jsx(CircularProgress, {
|
|
546
|
+
size: 16,
|
|
547
|
+
"aria-label": "Reading the result"
|
|
548
|
+
}),
|
|
549
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
550
|
+
variant: "body2",
|
|
551
|
+
color: "text.secondary",
|
|
552
|
+
children: 'Reading the result.'
|
|
553
|
+
})
|
|
554
|
+
]
|
|
555
|
+
}) : null,
|
|
556
|
+
run.notice ? /*#__PURE__*/ _jsx(Alert, {
|
|
557
|
+
severity: "warning",
|
|
558
|
+
children: run.notice
|
|
559
|
+
}) : null,
|
|
560
|
+
problem ? /*#__PURE__*/ _jsx(Alert, {
|
|
561
|
+
severity: ((_run_job1 = run.job) == null ? void 0 : _run_job1.status) === 'failed' ? 'error' : 'warning',
|
|
562
|
+
children: problem
|
|
563
|
+
}) : null,
|
|
564
|
+
explanation ? /*#__PURE__*/ _jsx(AiExperimentExplanation, {
|
|
565
|
+
explanation: explanation
|
|
566
|
+
}) : null
|
|
567
|
+
]
|
|
568
|
+
})
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
AiExperimentResultCard.displayName = 'AiExperimentResultCard';
|
|
572
|
+
|
|
573
|
+
//# sourceMappingURL=ai-experiment-cards.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/components/ai-experiment-cards.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 { pluginDocsHelp } from '@aglyn/aglyn/app-utils/docs-help'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport { useHostOrgId, useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Alert,\n Box,\n Button,\n Chip,\n CircularProgress,\n Link,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n AI_EXPERIMENT_SUBJECT_MAX_CHARS,\n type AiExperimentArm,\n type AiExperimentTarget,\n} from '../model/ai-experiment'\nimport {\n aiExperimentArmIsNamed,\n aiExperimentVerdictDisplay,\n readAiExperimentExplanation,\n readAiExperimentVariants,\n type AiExperimentExplanationProposal,\n type AiExperimentVariantsProposalView,\n} from '../model/ai-experiment-proposal'\nimport type { AiJobSummary } from '../model/ai-jobs.types'\nimport { aiJobProblem, useAiJobRun, useAiJobsVerdict } from './use-ai-job-run'\n\n/**\n * A/B tests by AI in the console (AGL-2914): the two doors a person reaches\n * the `experiment` job through, and the surfaces that render what it answers.\n *\n * Both are widgets in zones the A/B TESTING card hosts, not surfaces of this\n * plugin's own. The test, the experiment document, the traffic split and the\n * counters belong to the plugin that draws that card, and neither plugin\n * imports the other: the zone's id and the props it hands a widget are the\n * whole contract, and the interfaces below restate the halves this widget\n * reads rather than importing the owner's.\n *\n * ## The result surface may not decide anything\n *\n * The step reached the verdict from the counts before a model was asked, and\n * cut the answer back to it. A card can undo all of that silently — a\n * confident heading, a highlighted row, a badge saying which to ship — and\n * the reader will take the layout for the claim. So {@link AiExperimentResultCard}\n * asks `aiExperimentVerdictDisplay` what the verdict permits before it draws\n * anything: an undecided result gets a neutral chip, a sentence saying it\n * settled nothing ABOVE the explanation, no marked arm and no recommendation.\n * Nothing on it is conditioned on which arm has the best rate.\n *\n * ## Neither card writes\n *\n * The variants card fills the experiment editor's own fields, unsaved, and\n * the dialog's Save is the write. The result card has nothing to apply.\n */\n\nconst VARIANTS_FAILED_COPY = 'Variants could not be written. Try again.'\nconst EXPLAIN_FAILED_COPY = 'The result could not be explained. Try again.'\n\n/** What the test varies, in the words this card's own copy uses. */\nconst TARGET_NOUN: Record<AiExperimentTarget, string> = {\n screen: 'page',\n section: 'section',\n email: 'email',\n}\n\n/** One of the experiment editor's variants, as the zone hands it over. */\nexport interface AiExperimentZoneVariant {\n id: string\n name: string\n subject: string\n body: string\n}\n\n/** What the variants zone hands this widget. */\nexport interface AiExperimentVariantsCardProps {\n hostId: string\n experimentId: string\n name: string\n target: AiExperimentTarget\n goal: string\n variants: AiExperimentZoneVariant[]\n proposeVariants: (\n variants: readonly AiExperimentZoneVariant[],\n key: string,\n ) => void\n}\n\n/** What the result zone hands this widget. */\nexport interface AiExperimentResultCardProps {\n hostId: string\n experimentId: string\n test: string\n}\n\n/** The proposal a finished experiment job carries, whichever task it ran. */\nfunction proposalOf(job: AiJobSummary | null): Record<string, unknown> | null {\n if (job?.status !== 'done') return null\n return job.outputs.find((output) => output.resource === 'experiment')?.proposal ?? null\n}\n\nconst rateText = (value: number | null): string =>\n value === null ? '—' : `${value}%`\n\nconst liftText = (value: number | null): string =>\n value === null ? '—' : `${value >= 0 ? '+' : ''}${value}%`\n\n/**\n * The copy an email test varies, as the editor holds it: the FIRST variant's\n * subject and body, which is the control. A screen or a section varies a\n * screen version, which the editor does not hold, so there is nothing to\n * prefill and the person pastes what is under test.\n */\nexport function aiExperimentSubjectFrom(\n target: AiExperimentTarget,\n variants: readonly AiExperimentZoneVariant[],\n): string {\n if (target !== 'email') return ''\n const control = variants[0]\n if (!control) return ''\n return [control.subject, control.body].filter(Boolean).join('\\n\\n')\n}\n\n/**\n * A proposal mapped onto the editor's variants, in order. Only the fields\n * that target has a place for are filled: an email varies its subject and\n * body, and a screen or a section varies a screen version, so there only the\n * name is filled and the copy is read on the card.\n */\nexport function aiExperimentVariantDrafts(\n target: AiExperimentTarget,\n variants: readonly AiExperimentZoneVariant[],\n proposal: AiExperimentVariantsProposalView,\n): AiExperimentZoneVariant[] {\n return variants.map((variant, index) => {\n const proposed = proposal.variants[index]\n if (!proposed) return variant\n return {\n id: variant.id,\n name: proposed.name,\n subject: target === 'email' ? proposed.subject : '',\n body: target === 'email' ? proposed.body : '',\n }\n })\n}\n\n/** Where a proposed variant's copy lands, said before the person presses the button. */\nexport function aiExperimentApplyCopy(target: AiExperimentTarget): string {\n return target === 'email'\n ? 'Each variant above takes its name, subject and body. Nothing is saved until you save the experiment.'\n : 'Each variant above takes its name. The copy itself is a screen version — make one per variant in the editor and pin it above.'\n}\n\n/**\n * \"Write variants with AI\", in the experiment editor beneath the variants it\n * writes for. It proposes COPY: no weight, no traffic split, no goal and no\n * schedule, and the first variant it writes is the copy as it stands so the\n * test has something to measure against.\n */\nexport function AiExperimentVariantsCard(props: AiExperimentVariantsCardProps) {\n const { hostId, target, variants, proposeVariants } = props\n // The zone hands the SITE, which is what the card it is drawn in knows. The\n // organization is this widget's to resolve, as every AI widget in another\n // plugin's zone resolves it.\n const orgId = useHostOrgId(hostId) ?? undefined\n const { data: user } = useUser()\n const verdict = useAiJobsVerdict(user, orgId)\n const run = useAiJobRun(user, VARIANTS_FAILED_COPY)\n const prefill = useMemo(\n () => aiExperimentSubjectFrom(target, variants),\n [target, variants],\n )\n const [subject, setSubject] = useState(prefill)\n const [applied, setApplied] = useState<string | null>(null)\n // The control's copy follows the editor until the person edits this field,\n // so switching a draft test from a page to an email fills it rather than\n // leaving the earlier target's copy under a question about a new one.\n const [typed, setTyped] = useState(false)\n useEffect(() => {\n if (!typed) setSubject(prefill)\n }, [prefill, typed])\n\n const proposal = useMemo(\n () => readAiExperimentVariants(proposalOf(run.job)),\n [run.job],\n )\n const problem =\n aiJobProblem(run.job, VARIANTS_FAILED_COPY) ??\n (run.job?.status === 'done' && !proposal ? VARIANTS_FAILED_COPY : null)\n\n if (verdict !== 'ready') return null\n\n const busy = run.starting || run.running\n const noun = TARGET_NOUN[target]\n const variantsHelp = pluginDocsHelp('aiExperiments', {\n anchor: '#write-variants',\n excerpt:\n 'Writes two to four variants of the copy under test, the first of them your copy unchanged. They go into the editor’s fields unsaved; nothing is saved until you save the experiment.',\n })\n const write = () => {\n if (!orgId || !subject.trim()) return\n setApplied(null)\n void run.start({\n orgId,\n hostId,\n kind: 'experiment',\n brief:\n `Write variants of this ${noun} for the A/B test ` +\n `“${props.name.trim() || 'this test'}”.`,\n inputs: {\n task: 'variants',\n target,\n subject: subject.trim().slice(0, AI_EXPERIMENT_SUBJECT_MAX_CHARS),\n goal: props.goal,\n ...(props.experimentId ? { experimentId: props.experimentId } : {}),\n },\n })\n }\n\n const apply = () => {\n if (!proposal || !run.job) return\n proposeVariants(\n aiExperimentVariantDrafts(target, variants, proposal),\n run.job.id,\n )\n setApplied(run.job.id)\n }\n\n return (\n <Box\n sx={{ border: 1, borderColor: 'divider', borderRadius: 1, p: 1.5 }}\n aria-label=\"Write variants with AI\"\n >\n <Stack spacing={1}>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'baseline' }}>\n <Typography variant=\"subtitle2\" sx={{ flexGrow: 1 }}>\n {'Write variants with AI'}\n </Typography>\n <Link\n href={variantsHelp.href}\n target=\"_blank\"\n rel=\"noopener\"\n variant=\"caption\"\n title={variantsHelp.excerpt}\n >\n {'How it works'}\n </Link>\n </Stack>\n <TextField\n size=\"small\"\n multiline\n minRows={2}\n label={`The ${noun} copy under test`}\n placeholder={\n target === 'email'\n ? 'The subject line and message as they stand'\n : 'The headline and copy as they stand on the page'\n }\n helperText={\n 'Variants are written from this. The first one it writes is this copy unchanged, so the test has a control.'\n }\n value={subject}\n onChange={(event) => {\n setTyped(true)\n setSubject(event.target.value.slice(0, AI_EXPERIMENT_SUBJECT_MAX_CHARS))\n }}\n disabled={busy}\n />\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n disabled={busy || !orgId || !subject.trim()}\n onClick={write}\n >\n {run.job && !busy ? 'Write them again' : 'Write variants'}\n </Button>\n {busy ? <CircularProgress size={16} aria-label=\"Writing variants\" /> : null}\n </Stack>\n {run.notice ? <Alert severity=\"warning\">{run.notice}</Alert> : null}\n {problem ? (\n <Alert severity={run.job?.status === 'failed' ? 'error' : 'warning'}>\n {problem}\n </Alert>\n ) : null}\n\n {proposal ? (\n <Stack spacing={1} aria-label=\"Proposed variants\">\n {proposal.goal ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`Written to move: ${proposal.goal}`}\n </Typography>\n ) : null}\n {proposal.variants.map((variant, index) => (\n <Box\n key={`${index}:${variant.name}`}\n sx={{ border: 1, borderColor: 'divider', borderRadius: 1, p: 1 }}\n >\n <Stack spacing={0.5}>\n <Typography variant=\"subtitle2\">\n {variant.name || `Variant ${index + 1}`}\n </Typography>\n {variant.subject ? (\n <Typography variant=\"body2\">{`Subject: ${variant.subject}`}</Typography>\n ) : null}\n {variant.preheader ? (\n <Typography variant=\"body2\">{`Preheader: ${variant.preheader}`}</Typography>\n ) : null}\n {variant.headline ? (\n <Typography variant=\"body2\">{variant.headline}</Typography>\n ) : null}\n {variant.body ? (\n <Typography\n variant=\"body2\"\n sx={{ whiteSpace: 'pre-line', wordBreak: 'break-word' }}\n >\n {variant.body}\n </Typography>\n ) : null}\n {variant.rationale ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {variant.rationale}\n </Typography>\n ) : null}\n </Stack>\n </Box>\n ))}\n <Typography variant=\"caption\" color=\"text.secondary\">\n {aiExperimentApplyCopy(target)}\n </Typography>\n <Stack direction=\"row\" spacing={1}>\n <Button\n size=\"small\"\n variant=\"contained\"\n disabled={applied === run.job?.id}\n onClick={apply}\n >\n {'Put into the variants'}\n </Button>\n </Stack>\n {applied === run.job?.id ? (\n <Alert severity=\"success\">\n {'In the variants above. Review them, then Save the experiment — or Cancel to leave it as it was.'}\n </Alert>\n ) : null}\n </Stack>\n ) : null}\n </Stack>\n </Box>\n )\n}\nAiExperimentVariantsCard.displayName = 'AiExperimentVariantsCard'\n\n/** One arm, drawn the same way whatever the figures say about it. */\nfunction ArmRow({\n arm,\n named,\n}: {\n arm: AiExperimentArm\n named: boolean\n}) {\n return (\n <TableRow>\n <TableCell>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography variant=\"body2\">{arm.id}</Typography>\n {named ? <Chip size=\"small\" color=\"success\" label=\"Ahead\" /> : null}\n </Stack>\n </TableCell>\n <TableCell>{arm.exposures}</TableCell>\n <TableCell>{arm.conversions}</TableCell>\n <TableCell>{rateText(arm.rate)}</TableCell>\n <TableCell>{liftText(arm.lift)}</TableCell>\n <TableCell>{rateText(arm.confidence)}</TableCell>\n </TableRow>\n )\n}\n\n/**\n * The explanation, drawn to the verdict rather than to the numbers.\n *\n * The chip and the caveat come FIRST, above the prose: a reader who stops\n * after one line must stop on what the result settled, not on a sentence\n * about one variant. No row is marked unless the verdict names an arm, and\n * `aiExperimentArmIsNamed` is asked per row rather than `winnerId` compared\n * directly, so a stored winner beside an undecided verdict marks nothing.\n */\nexport function AiExperimentExplanation({\n explanation,\n}: {\n explanation: AiExperimentExplanationProposal\n}) {\n const display = aiExperimentVerdictDisplay(explanation.verdict)\n return (\n <Stack spacing={1} aria-label=\"What this result shows\">\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Chip size=\"small\" color={display.tone} label={display.status} />\n {display.namesAnArm ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`Called at ${explanation.threshold}% confidence.`}\n </Typography>\n ) : null}\n </Stack>\n {display.caveat ? (\n <Typography variant=\"body2\">{display.caveat}</Typography>\n ) : null}\n <Typography variant=\"body2\" sx={{ wordBreak: 'break-word' }}>\n {explanation.headline}\n </Typography>\n {explanation.points.map((point) => (\n <Typography key={point} variant=\"body2\" color=\"text.secondary\">\n {point}\n </Typography>\n ))}\n {explanation.arms.length ? (\n <ScrollTable size=\"small\" aria-label=\"The figures this reads\">\n <TableHead>\n <TableRow>\n <TableCell>{'Variant'}</TableCell>\n <TableCell>{'Shown'}</TableCell>\n <TableCell>{'Conversions'}</TableCell>\n <TableCell>{'Rate'}</TableCell>\n <TableCell>{'Lift'}</TableCell>\n <TableCell>{'Confidence'}</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {explanation.arms.map((arm) => (\n <ArmRow\n key={arm.id}\n arm={arm}\n named={aiExperimentArmIsNamed(explanation, arm.id)}\n />\n ))}\n </TableBody>\n </ScrollTable>\n ) : null}\n {explanation.next ? (\n <Typography variant=\"body2\">{explanation.next}</Typography>\n ) : null}\n </Stack>\n )\n}\nAiExperimentExplanation.displayName = 'AiExperimentExplanation'\n\n/**\n * \"Explain this result\", below one test's figures. It starts an `experiment`\n * job, which reads the same figures the dialog above it shows, decides what\n * they support in code, and asks a model only for the words.\n */\nexport function AiExperimentResultCard(props: AiExperimentResultCardProps) {\n const { hostId, test } = props\n const orgId = useHostOrgId(hostId) ?? undefined\n const { data: user } = useUser()\n const verdict = useAiJobsVerdict(user, orgId)\n const run = useAiJobRun(user, EXPLAIN_FAILED_COPY)\n const explanation = useMemo(\n () => readAiExperimentExplanation(proposalOf(run.job)),\n [run.job],\n )\n const problem =\n aiJobProblem(run.job, EXPLAIN_FAILED_COPY) ??\n (run.job?.status === 'done' && !explanation ? EXPLAIN_FAILED_COPY : null)\n\n if (verdict !== 'ready') return null\n\n const busy = run.starting || run.running\n const resultHelp = pluginDocsHelp('aiExperiments', {\n anchor: '#the-verdict',\n excerpt:\n 'What the figures support is worked out from the counts before a model is asked anything, and the explanation is held to it — so an undecided test reads as undecided and no variant is named.',\n })\n const explain = () => {\n if (!orgId || !test) return\n void run.start({\n orgId,\n hostId,\n kind: 'experiment',\n brief: `Explain the result of the A/B test “${test}” in plain words.`,\n inputs: {\n task: 'explain',\n test,\n ...(props.experimentId ? { experimentId: props.experimentId } : {}),\n },\n })\n }\n\n return (\n <Box\n sx={{ border: 1, borderColor: 'divider', borderRadius: 1, p: 1.5, mt: 2 }}\n aria-label=\"Explain this result with AI\"\n >\n <Stack spacing={1}>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ flexGrow: 1 }}>\n {'Read these figures in plain words, including whether they settle anything yet.'}\n </Typography>\n <Link\n href={resultHelp.href}\n target=\"_blank\"\n rel=\"noopener\"\n variant=\"caption\"\n title={resultHelp.excerpt}\n >\n {'How it works'}\n </Link>\n <Button\n size=\"small\"\n variant=\"outlined\"\n disabled={busy || !orgId || !test}\n onClick={explain}\n >\n {run.job && !busy ? 'Ask again' : 'Explain this result'}\n </Button>\n </Stack>\n {busy ? (\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <CircularProgress size={16} aria-label=\"Reading the result\" />\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Reading the result.'}\n </Typography>\n </Stack>\n ) : null}\n {run.notice ? <Alert severity=\"warning\">{run.notice}</Alert> : null}\n {problem ? (\n <Alert severity={run.job?.status === 'failed' ? 'error' : 'warning'}>\n {problem}\n </Alert>\n ) : null}\n {explanation ? <AiExperimentExplanation explanation={explanation} /> : null}\n </Stack>\n </Box>\n )\n}\nAiExperimentResultCard.displayName = 'AiExperimentResultCard'\n"],"names":["pluginDocsHelp","ScrollTable","useHostOrgId","useUser","Alert","Box","Button","Chip","CircularProgress","Link","Stack","TableBody","TableCell","TableHead","TableRow","TextField","Typography","useEffect","useMemo","useState","AI_EXPERIMENT_SUBJECT_MAX_CHARS","aiExperimentArmIsNamed","aiExperimentVerdictDisplay","readAiExperimentExplanation","readAiExperimentVariants","aiJobProblem","useAiJobRun","useAiJobsVerdict","VARIANTS_FAILED_COPY","EXPLAIN_FAILED_COPY","TARGET_NOUN","screen","section","email","proposalOf","job","status","outputs","find","output","resource","proposal","rateText","value","liftText","aiExperimentSubjectFrom","target","variants","control","subject","body","filter","Boolean","join","aiExperimentVariantDrafts","map","variant","index","proposed","id","name","aiExperimentApplyCopy","AiExperimentVariantsCard","props","run","hostId","proposeVariants","orgId","undefined","data","user","verdict","prefill","setSubject","applied","setApplied","typed","setTyped","problem","busy","starting","running","noun","variantsHelp","anchor","excerpt","write","trim","start","kind","brief","inputs","task","slice","goal","experimentId","apply","sx","border","borderColor","borderRadius","p","aria-label","spacing","direction","alignItems","flexGrow","href","rel","title","size","multiline","minRows","label","placeholder","helperText","onChange","event","disabled","onClick","notice","severity","color","preheader","headline","whiteSpace","wordBreak","rationale","displayName","ArmRow","arm","named","exposures","conversions","rate","lift","confidence","AiExperimentExplanation","explanation","display","tone","namesAnArm","threshold","caveat","points","point","arms","length","next","AiExperimentResultCard","test","resultHelp","explain","mt"],"mappings":"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"}
|