@adia-ai/gen-ui 0.8.37
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/CHANGELOG.md +26 -0
- package/README.md +77 -0
- package/compose/CHANGELOG.md +1707 -0
- package/compose/README.md +215 -0
- package/compose/core/artifacts.js +262 -0
- package/compose/core/context-store.js +218 -0
- package/compose/core/generator.d.ts +4 -0
- package/compose/core/generator.js +602 -0
- package/compose/core/pipeline/engine.js +289 -0
- package/compose/core/pipeline/types.js +91 -0
- package/compose/core/plan-primitives.js +120 -0
- package/compose/core/plan-turn.js +145 -0
- package/compose/core/reference.js +150 -0
- package/compose/core/state.js +15 -0
- package/compose/evals/harness.d.ts +4 -0
- package/compose/evals/harness.mjs +193 -0
- package/compose/index.d.ts +4 -0
- package/compose/index.js +16 -0
- package/compose/shared/validate-and-repair.js +122 -0
- package/compose/strategies/_shared/chunk-loader.js +282 -0
- package/compose/strategies/cascade.d.ts +67 -0
- package/compose/strategies/cascade.js +165 -0
- package/compose/strategies/escalation.d.ts +13 -0
- package/compose/strategies/escalation.js +132 -0
- package/compose/strategies/free-form-composer/index.js +254 -0
- package/compose/strategies/free-form-composer/system-prompt.js +205 -0
- package/compose/strategies/free-form-composer/transpile.js +279 -0
- package/compose/strategies/monolithic/_shared.js +1619 -0
- package/compose/strategies/monolithic/generate-instant.js +228 -0
- package/compose/strategies/monolithic/generate-pro.js +490 -0
- package/compose/strategies/monolithic/generate-thinking.js +206 -0
- package/compose/strategies/registry.d.ts +20 -0
- package/compose/strategies/registry.js +495 -0
- package/compose/strategies/zettel/_smoke.js +27 -0
- package/compose/strategies/zettel/chunk-composer.js +214 -0
- package/compose/strategies/zettel/chunk-refiner.js +582 -0
- package/compose/strategies/zettel/chunk-synthesizer.js +458 -0
- package/compose/strategies/zettel/composer.js +78 -0
- package/compose/strategies/zettel/composition-library.js +418 -0
- package/compose/strategies/zettel/generate.js +15 -0
- package/compose/strategies/zettel/generator-adapter.d.ts +4 -0
- package/compose/strategies/zettel/generator-adapter.js +242 -0
- package/compose/strategies/zettel/issue-reporter.js +607 -0
- package/compose/strategies/zettel/session-store.js +121 -0
- package/compose/strategies/zettel/state-cache.js +158 -0
- package/compose/transpiler/transpiler-maps.js +675 -0
- package/compose/transpiler/transpiler.d.ts +4 -0
- package/compose/transpiler/transpiler.js +962 -0
- package/corpus/CHANGELOG.md +1957 -0
- package/corpus/README.md +279 -0
- package/corpus/catalog-a2ui_0_9.d.ts +4 -0
- package/corpus/catalog-a2ui_0_9.json +29571 -0
- package/corpus/catalog-a2ui_0_9_rules.txt +1215 -0
- package/corpus/chunk-embeddings.d.ts +4 -0
- package/corpus/chunk-embeddings.json +1 -0
- package/corpus/chunks/_index.json +16658 -0
- package/corpus/chunks/_source-hashes.json +571 -0
- package/corpus/chunks/access-denied-with-request.json +124 -0
- package/corpus/chunks/access-request-form.json +166 -0
- package/corpus/chunks/access-request-pending.json +133 -0
- package/corpus/chunks/accordion-settings.json +176 -0
- package/corpus/chunks/achievement-badges.json +413 -0
- package/corpus/chunks/achievement-unlock.json +104 -0
- package/corpus/chunks/action-list-record-actions.json +84 -0
- package/corpus/chunks/activity-feed.json +390 -0
- package/corpus/chunks/admin-page-header-flush.json +83 -0
- package/corpus/chunks/admin-page-header-title-description.json +80 -0
- package/corpus/chunks/admin-page-header-with-actions.json +107 -0
- package/corpus/chunks/admin-page-header-with-tabs.json +144 -0
- package/corpus/chunks/admin-shell-rounded-borderless.json +287 -0
- package/corpus/chunks/admin-shell-standard.json +310 -0
- package/corpus/chunks/admin-sidebar-brand-signin.json +158 -0
- package/corpus/chunks/admin-sidebar-brand-version.json +130 -0
- package/corpus/chunks/admin-sidebar-flat-nav.json +131 -0
- package/corpus/chunks/admin-sidebar-nav-dividers.json +150 -0
- package/corpus/chunks/admin-sidebar-nav-groups.json +171 -0
- package/corpus/chunks/admin-sidebar-workspace-switcher.json +139 -0
- package/corpus/chunks/admin-topbar-breadcrumb-actions.json +130 -0
- package/corpus/chunks/admin-topbar-breadcrumb-minimal.json +79 -0
- package/corpus/chunks/admin-topbar-deep-breadcrumb.json +129 -0
- package/corpus/chunks/admin-topbar-search.json +104 -0
- package/corpus/chunks/admin-topbar-status-indicator.json +122 -0
- package/corpus/chunks/admin-topbar-trailing-toggle.json +114 -0
- package/corpus/chunks/agent-activity-feed.json +163 -0
- package/corpus/chunks/agent-artifact-stub-card.json +115 -0
- package/corpus/chunks/agent-canvas-shell.json +305 -0
- package/corpus/chunks/agent-citations-source-chips.json +82 -0
- package/corpus/chunks/agent-command-palette-search.json +120 -0
- package/corpus/chunks/agent-cost-detailed.json +260 -0
- package/corpus/chunks/agent-cost-inline.json +78 -0
- package/corpus/chunks/agent-memory-detail.json +181 -0
- package/corpus/chunks/agent-memory-editor.json +173 -0
- package/corpus/chunks/agent-memory-list.json +207 -0
- package/corpus/chunks/agent-pipeline-status-stages.json +61 -0
- package/corpus/chunks/agent-prompt-card.json +179 -0
- package/corpus/chunks/agent-prompt-library-grid.json +341 -0
- package/corpus/chunks/agent-prompt-picker.json +282 -0
- package/corpus/chunks/agent-rate-limit.json +100 -0
- package/corpus/chunks/agent-reasoning-collapsed.json +128 -0
- package/corpus/chunks/agent-tool-call-accordion.json +109 -0
- package/corpus/chunks/agent-tool-call-collapsed.json +98 -0
- package/corpus/chunks/agent-tool-call-error.json +112 -0
- package/corpus/chunks/agent-tool-call-result.json +145 -0
- package/corpus/chunks/agent-tool-call-running.json +85 -0
- package/corpus/chunks/agent-tool-call-success.json +137 -0
- package/corpus/chunks/agent-trace-timeline.json +244 -0
- package/corpus/chunks/ai-streaming-response.json +147 -0
- package/corpus/chunks/alert-banner-stack.json +78 -0
- package/corpus/chunks/alert-banner.json +55 -0
- package/corpus/chunks/alert-dialog-simple.json +72 -0
- package/corpus/chunks/alert-dialog-typed.json +107 -0
- package/corpus/chunks/alert-dialog-unsaved.json +81 -0
- package/corpus/chunks/analytics-chart.json +213 -0
- package/corpus/chunks/analytics-sparklines-dashboard.json +259 -0
- package/corpus/chunks/anchor-bar-selection-bar.json +226 -0
- package/corpus/chunks/api-key-table.json +148 -0
- package/corpus/chunks/api-keys-create.json +140 -0
- package/corpus/chunks/api-keys-list.json +271 -0
- package/corpus/chunks/app-nav-badges-counts.json +77 -0
- package/corpus/chunks/app-nav-badges-group-rollup-badges.json +100 -0
- package/corpus/chunks/app-nav-badges-plan-tiers.json +76 -0
- package/corpus/chunks/app-nav-badges-status-callouts.json +75 -0
- package/corpus/chunks/app-nav-full-example.json +195 -0
- package/corpus/chunks/app-nav-groups.json +103 -0
- package/corpus/chunks/app-nav-items.json +74 -0
- package/corpus/chunks/app-nav-labels-and-dividers.json +92 -0
- package/corpus/chunks/app-nav-spacer.json +77 -0
- package/corpus/chunks/app-product-listing-card.json +214 -0
- package/corpus/chunks/approvals-detail.json +240 -0
- package/corpus/chunks/approvals-queue.json +321 -0
- package/corpus/chunks/audit-log-basic.json +184 -0
- package/corpus/chunks/audit-log.json +174 -0
- package/corpus/chunks/auth-account-deleted-actions.json +51 -0
- package/corpus/chunks/auth-account-deleted.json +202 -0
- package/corpus/chunks/auth-card-content.json +260 -0
- package/corpus/chunks/auth-card-header.json +205 -0
- package/corpus/chunks/auth-email-entry.json +65 -0
- package/corpus/chunks/auth-email-verify-confirm.json +52 -0
- package/corpus/chunks/auth-email-verify.json +196 -0
- package/corpus/chunks/auth-forbidden-actions.json +59 -0
- package/corpus/chunks/auth-forbidden.json +203 -0
- package/corpus/chunks/auth-invite-actions.json +49 -0
- package/corpus/chunks/auth-invite-team-card.json +86 -0
- package/corpus/chunks/auth-link-expired-form.json +65 -0
- package/corpus/chunks/auth-link-expired.json +196 -0
- package/corpus/chunks/auth-locked-account.json +211 -0
- package/corpus/chunks/auth-locked-recovery-options.json +60 -0
- package/corpus/chunks/auth-mfa-enrollment-submit.json +54 -0
- package/corpus/chunks/auth-mfa-enrollment.json +284 -0
- package/corpus/chunks/auth-mfa-fallback-actions.json +52 -0
- package/corpus/chunks/auth-mfa-recovery.json +61 -0
- package/corpus/chunks/auth-new-password-form.json +75 -0
- package/corpus/chunks/auth-new-password.json +217 -0
- package/corpus/chunks/auth-oauth-fallback-actions.json +52 -0
- package/corpus/chunks/auth-oauth-interstitial.json +160 -0
- package/corpus/chunks/auth-password-challenge.json +94 -0
- package/corpus/chunks/auth-password-reset-form.json +64 -0
- package/corpus/chunks/auth-password-reset.json +195 -0
- package/corpus/chunks/auth-profile-form.json +72 -0
- package/corpus/chunks/auth-profile-setup.json +194 -0
- package/corpus/chunks/auth-reset-sent.json +188 -0
- package/corpus/chunks/auth-session-expired-actions.json +52 -0
- package/corpus/chunks/auth-session-expired.json +201 -0
- package/corpus/chunks/auth-signin-card-email.json +245 -0
- package/corpus/chunks/auth-signin-card-magic-link.json +147 -0
- package/corpus/chunks/auth-signin-card-mfa.json +231 -0
- package/corpus/chunks/auth-signin-card-otp.json +205 -0
- package/corpus/chunks/auth-signin-card-password.json +264 -0
- package/corpus/chunks/auth-signin-card-recovery.json +218 -0
- package/corpus/chunks/auth-signout-actions.json +51 -0
- package/corpus/chunks/auth-signout.json +184 -0
- package/corpus/chunks/auth-signup-email-entry.json +66 -0
- package/corpus/chunks/auth-signup-entry.json +281 -0
- package/corpus/chunks/auth-signup-social-auths.json +54 -0
- package/corpus/chunks/auth-signup-verify.json +227 -0
- package/corpus/chunks/auth-social-auths.json +62 -0
- package/corpus/chunks/auth-sso-providers.json +55 -0
- package/corpus/chunks/auth-sso-required.json +213 -0
- package/corpus/chunks/auth-team-invite.json +288 -0
- package/corpus/chunks/avatar-group-overflow.json +137 -0
- package/corpus/chunks/avatar-stack-overflow.json +124 -0
- package/corpus/chunks/banner-announcement-beta.json +99 -0
- package/corpus/chunks/banner-announcement-promo.json +102 -0
- package/corpus/chunks/banner-live-update.json +102 -0
- package/corpus/chunks/banner-system-maintenance.json +101 -0
- package/corpus/chunks/banner-system-offline.json +85 -0
- package/corpus/chunks/banner-system-update.json +102 -0
- package/corpus/chunks/bell-menu-empty.json +107 -0
- package/corpus/chunks/bell-menu-unread.json +395 -0
- package/corpus/chunks/billing-cancel-subscription-danger.json +61 -0
- package/corpus/chunks/billing-invoice-history-table.json +75 -0
- package/corpus/chunks/billing-overview.json +202 -0
- package/corpus/chunks/billing-payment-method-card-on-file.json +157 -0
- package/corpus/chunks/billing-progress-label.json +101 -0
- package/corpus/chunks/blog-post-card.json +212 -0
- package/corpus/chunks/breadcrumb-navigation.json +72 -0
- package/corpus/chunks/bulk-action-toolbar-floating.json +199 -0
- package/corpus/chunks/bulk-action-toolbar-swap.json +158 -0
- package/corpus/chunks/bulk-selection-actions-bar.json +162 -0
- package/corpus/chunks/business-address-form.json +953 -0
- package/corpus/chunks/calendar-month-view.json +74 -0
- package/corpus/chunks/card-grid-images.json +459 -0
- package/corpus/chunks/card-header-with-description.json +47 -0
- package/corpus/chunks/card-with-empty-state.json +96 -0
- package/corpus/chunks/card-with-form.json +143 -0
- package/corpus/chunks/card-with-sparkline.json +90 -0
- package/corpus/chunks/card-with-stat-kpi.json +86 -0
- package/corpus/chunks/changelog-feed-basic.json +470 -0
- package/corpus/chunks/chart-in-card-chart-plus-breakdown.json +188 -0
- package/corpus/chunks/chart-in-card-chart-plus-stat.json +89 -0
- package/corpus/chunks/chart-in-card-chart-with-filter-pills.json +124 -0
- package/corpus/chunks/chart-in-card-full-bleed-legend.json +116 -0
- package/corpus/chunks/chart-in-card-full-chart.json +107 -0
- package/corpus/chunks/chart-in-card-sparkline-tile.json +93 -0
- package/corpus/chunks/chart-in-card-stat-with-sparkline.json +73 -0
- package/corpus/chunks/chart-in-card-trend-footer.json +115 -0
- package/corpus/chunks/chart-with-filter-pills.json +169 -0
- package/corpus/chunks/chat-empty-state-hero.json +102 -0
- package/corpus/chunks/chat-message-assistant-byline.json +85 -0
- package/corpus/chunks/chat-message-user-byline.json +84 -0
- package/corpus/chunks/chat-page-shell.json +379 -0
- package/corpus/chunks/chat-streaming-surface.json +169 -0
- package/corpus/chunks/checkout-order-summary-card.json +140 -0
- package/corpus/chunks/code-snippet.json +107 -0
- package/corpus/chunks/col-form-stack.json +93 -0
- package/corpus/chunks/col-heading-body-action.json +79 -0
- package/corpus/chunks/col-stat-label.json +63 -0
- package/corpus/chunks/color-picker-swatches.json +153 -0
- package/corpus/chunks/command-palette.json +327 -0
- package/corpus/chunks/comments-composer.json +158 -0
- package/corpus/chunks/comments-mention-menu.json +237 -0
- package/corpus/chunks/comments-thread.json +344 -0
- package/corpus/chunks/commerce-pricing-tiers.json +401 -0
- package/corpus/chunks/comparison-table.json +246 -0
- package/corpus/chunks/contact-form-card.json +197 -0
- package/corpus/chunks/contact-form.json +157 -0
- package/corpus/chunks/contact-support-form.json +702 -0
- package/corpus/chunks/conversion-funnel-4-step-funnel.json +139 -0
- package/corpus/chunks/conversion-funnel-6step.json +151 -0
- package/corpus/chunks/conversion-funnel-wide-summary.json +192 -0
- package/corpus/chunks/conversion-funnel-with-segment-compare.json +202 -0
- package/corpus/chunks/cta-banner-centered.json +102 -0
- package/corpus/chunks/dashboard-acquisition-panel.json +212 -0
- package/corpus/chunks/dashboard-admin-page.json +104 -0
- package/corpus/chunks/dashboard-audience-kpis.json +165 -0
- package/corpus/chunks/dashboard-audience-panel.json +756 -0
- package/corpus/chunks/dashboard-behavior-panel.json +114 -0
- package/corpus/chunks/dashboard-chart-recent.json +566 -0
- package/corpus/chunks/dashboard-cohort-retention.json +83 -0
- package/corpus/chunks/dashboard-conversion-panel.json +234 -0
- package/corpus/chunks/dashboard-country-list.json +304 -0
- package/corpus/chunks/dashboard-filter-bar.json +118 -0
- package/corpus/chunks/dashboard-funnel.json +142 -0
- package/corpus/chunks/dashboard-notifications-panel.json +423 -0
- package/corpus/chunks/dashboard-overview-panel.json +1644 -0
- package/corpus/chunks/dashboard-page-header.json +166 -0
- package/corpus/chunks/dashboard-pages-table.json +86 -0
- package/corpus/chunks/dashboard-quick-actions.json +116 -0
- package/corpus/chunks/dashboard-reports-panel.json +166 -0
- package/corpus/chunks/dashboard-reports-table.json +138 -0
- package/corpus/chunks/dashboard-storage-card.json +117 -0
- package/corpus/chunks/dashboard-tabs.json +86 -0
- package/corpus/chunks/dashboard-team-actions-storage.json +605 -0
- package/corpus/chunks/dashboard-team-list.json +334 -0
- package/corpus/chunks/dashboard-traffic-channels.json +184 -0
- package/corpus/chunks/dashboard-transactions-table.json +145 -0
- package/corpus/chunks/data-export-history.json +192 -0
- package/corpus/chunks/data-export-request.json +197 -0
- package/corpus/chunks/data-import-wizard.json +391 -0
- package/corpus/chunks/date-range-picker.json +156 -0
- package/corpus/chunks/date-time-picker-form.json +222 -0
- package/corpus/chunks/departments-checkbox-form.json +390 -0
- package/corpus/chunks/destructive-confirm-modal.json +149 -0
- package/corpus/chunks/diff-inline.json +84 -0
- package/corpus/chunks/diff-side-by-side.json +131 -0
- package/corpus/chunks/diff-structured.json +216 -0
- package/corpus/chunks/digest-email-preview.json +374 -0
- package/corpus/chunks/divider-text-label.json +87 -0
- package/corpus/chunks/doc-editor-shell.json +356 -0
- package/corpus/chunks/drawer-2fa-key.json +273 -0
- package/corpus/chunks/drawer-2fa-sms.json +261 -0
- package/corpus/chunks/drawer-2fa-totp.json +385 -0
- package/corpus/chunks/drawer-cancel-sub.json +636 -0
- package/corpus/chunks/drawer-change-plan.json +561 -0
- package/corpus/chunks/drawer-custom-roles.json +696 -0
- package/corpus/chunks/drawer-data-start.json +171 -0
- package/corpus/chunks/drawer-delete-account.json +341 -0
- package/corpus/chunks/drawer-delete-workspace.json +362 -0
- package/corpus/chunks/drawer-discord.json +434 -0
- package/corpus/chunks/drawer-figma.json +401 -0
- package/corpus/chunks/drawer-first-dashboard.json +220 -0
- package/corpus/chunks/drawer-gcal.json +475 -0
- package/corpus/chunks/drawer-github.json +589 -0
- package/corpus/chunks/drawer-invite.json +397 -0
- package/corpus/chunks/drawer-record-detail.json +44 -0
- package/corpus/chunks/drawer-report.json +528 -0
- package/corpus/chunks/drawer-revoke-session.json +331 -0
- package/corpus/chunks/drawer-role.json +190 -0
- package/corpus/chunks/drawer-slack.json +429 -0
- package/corpus/chunks/drawer-smtp.json +476 -0
- package/corpus/chunks/drawer-source.json +294 -0
- package/corpus/chunks/drawer-transaction.json +493 -0
- package/corpus/chunks/drawer-with-create-form.json +43 -0
- package/corpus/chunks/editor-code-pane.json +204 -0
- package/corpus/chunks/editor-page-shell.json +149 -0
- package/corpus/chunks/editor-preview-pane.json +136 -0
- package/corpus/chunks/editor-statusbar-ready.json +99 -0
- package/corpus/chunks/editor-toolbar-import-export.json +195 -0
- package/corpus/chunks/email-inbox-list.json +678 -0
- package/corpus/chunks/empty-state-danger.json +58 -0
- package/corpus/chunks/empty-state-minimal.json +44 -0
- package/corpus/chunks/empty-state-warning.json +53 -0
- package/corpus/chunks/empty-state.json +65 -0
- package/corpus/chunks/error-404-actions.json +54 -0
- package/corpus/chunks/error-404.json +204 -0
- package/corpus/chunks/error-500-actions.json +61 -0
- package/corpus/chunks/error-500.json +220 -0
- package/corpus/chunks/error-maintenance-actions.json +53 -0
- package/corpus/chunks/error-maintenance.json +203 -0
- package/corpus/chunks/error-page-shell.json +132 -0
- package/corpus/chunks/export-flow-async.json +210 -0
- package/corpus/chunks/export-flow-delivery.json +163 -0
- package/corpus/chunks/export-flow-sync.json +162 -0
- package/corpus/chunks/extended-profile-form.json +512 -0
- package/corpus/chunks/faq-accordion.json +123 -0
- package/corpus/chunks/feature-grid-icons.json +314 -0
- package/corpus/chunks/feature-grid-three-cards.json +187 -0
- package/corpus/chunks/feature-toggle-switch-grid.json +213 -0
- package/corpus/chunks/file-upload-dnd.json +166 -0
- package/corpus/chunks/file-upload-field.json +97 -0
- package/corpus/chunks/file-upload-form.json +251 -0
- package/corpus/chunks/filter-bar-active-filters.json +176 -0
- package/corpus/chunks/filter-bar-filter-bar-with-table.json +113 -0
- package/corpus/chunks/filter-bar-saved-views.json +117 -0
- package/corpus/chunks/filter-popover-form.json +137 -0
- package/corpus/chunks/footer-multi-column.json +270 -0
- package/corpus/chunks/footer-primary-only.json +41 -0
- package/corpus/chunks/form-checkbox-group.json +65 -0
- package/corpus/chunks/form-drawer-edit-form.json +178 -0
- package/corpus/chunks/form-drawer-simple-form.json +151 -0
- package/corpus/chunks/form-drawer-tall-form.json +325 -0
- package/corpus/chunks/form-field-email-hint.json +53 -0
- package/corpus/chunks/form-field-range.json +54 -0
- package/corpus/chunks/form-field-required.json +52 -0
- package/corpus/chunks/form-field-select.json +66 -0
- package/corpus/chunks/form-field-textarea.json +51 -0
- package/corpus/chunks/form-field-with-error.json +151 -0
- package/corpus/chunks/form-fields-two-column.json +69 -0
- package/corpus/chunks/form-page-shell.json +146 -0
- package/corpus/chunks/form-switch-toggle.json +41 -0
- package/corpus/chunks/form-system-live-demo.json +123 -0
- package/corpus/chunks/forms-address-autocomplete.json +277 -0
- package/corpus/chunks/forms-address-fields.json +221 -0
- package/corpus/chunks/forms-conditional-reveal.json +195 -0
- package/corpus/chunks/gallery-page-shell.json +444 -0
- package/corpus/chunks/grid-2col-entry-cards.json +140 -0
- package/corpus/chunks/grid-kpi-4col.json +164 -0
- package/corpus/chunks/grid-responsive-kpi.json +165 -0
- package/corpus/chunks/hero-cta-simple.json +107 -0
- package/corpus/chunks/hero-cta-split.json +183 -0
- package/corpus/chunks/hero-section-split.json +111 -0
- package/corpus/chunks/icon-text-row.json +60 -0
- package/corpus/chunks/image-caption-tile.json +99 -0
- package/corpus/chunks/image-carousel.json +156 -0
- package/corpus/chunks/image-thumbnail-grid.json +77 -0
- package/corpus/chunks/image-upload-preview.json +118 -0
- package/corpus/chunks/import-mapping-flow.json +972 -0
- package/corpus/chunks/inline-dialog-rename.json +128 -0
- package/corpus/chunks/inline-dialog-schedule.json +154 -0
- package/corpus/chunks/inline-dialog-status.json +179 -0
- package/corpus/chunks/integrations-api-keys-card-list.json +475 -0
- package/corpus/chunks/integrations-connect-form.json +550 -0
- package/corpus/chunks/integrations-grid.json +141 -0
- package/corpus/chunks/integrations-webhooks-empty-state.json +66 -0
- package/corpus/chunks/inventory-list-stock.json +137 -0
- package/corpus/chunks/invite-members.json +153 -0
- package/corpus/chunks/invoice-line-items.json +493 -0
- package/corpus/chunks/kanban-board-3col.json +713 -0
- package/corpus/chunks/kanban-page-shell.json +671 -0
- package/corpus/chunks/key-value-detail-list.json +242 -0
- package/corpus/chunks/keyboard-shortcut-display.json +250 -0
- package/corpus/chunks/labeled-textarea.json +45 -0
- package/corpus/chunks/leaderboard-table.json +140 -0
- package/corpus/chunks/library-browser-search-filter.json +109 -0
- package/corpus/chunks/linked-record-row.json +61 -0
- package/corpus/chunks/loading-skeleton-placeholder.json +387 -0
- package/corpus/chunks/login-form-card.json +207 -0
- package/corpus/chunks/logo-cloud-trusted-by.json +235 -0
- package/corpus/chunks/map-with-location-list.json +293 -0
- package/corpus/chunks/marketing-hero-cta.json +102 -0
- package/corpus/chunks/marketing-page-shell.json +352 -0
- package/corpus/chunks/masonry-gallery.json +154 -0
- package/corpus/chunks/member-edit-drawer.json +236 -0
- package/corpus/chunks/members-active-table-search-filter.json +184 -0
- package/corpus/chunks/members-pending-invites-cards.json +251 -0
- package/corpus/chunks/members-roles-permissions-list.json +146 -0
- package/corpus/chunks/menu-context-actions.json +113 -0
- package/corpus/chunks/metadata-description-list.json +178 -0
- package/corpus/chunks/modal-create-project-form.json +133 -0
- package/corpus/chunks/modal-preferences-tabs.json +147 -0
- package/corpus/chunks/multi-field-form-validation.json +394 -0
- package/corpus/chunks/nav-menu-icons.json +74 -0
- package/corpus/chunks/newsletter-subscription.json +190 -0
- package/corpus/chunks/notification-badges-feed.json +411 -0
- package/corpus/chunks/notification-preferences-panel.json +238 -0
- package/corpus/chunks/onb-completion.json +139 -0
- package/corpus/chunks/onb-extension-install.json +172 -0
- package/corpus/chunks/onb-hero-welcome.json +156 -0
- package/corpus/chunks/onb-import-picker.json +86 -0
- package/corpus/chunks/onb-mobile-handoff.json +121 -0
- package/corpus/chunks/onb-notification-prefs.json +83 -0
- package/corpus/chunks/onb-persona-picker.json +82 -0
- package/corpus/chunks/onb-provider-tiles.json +137 -0
- package/corpus/chunks/onb-settings-review.json +257 -0
- package/corpus/chunks/onb-step-footer.json +121 -0
- package/corpus/chunks/onb-step-header.json +121 -0
- package/corpus/chunks/onb-step-progress.json +140 -0
- package/corpus/chunks/onb-step-shell.json +380 -0
- package/corpus/chunks/onb-story-pane.json +121 -0
- package/corpus/chunks/onb-tutorial-steps.json +193 -0
- package/corpus/chunks/order-confirmation-success-card.json +177 -0
- package/corpus/chunks/order-tracking-timeline.json +131 -0
- package/corpus/chunks/pagination-controls.json +82 -0
- package/corpus/chunks/pane-settings-sidebar.json +204 -0
- package/corpus/chunks/patient-visit-shell.json +191 -0
- package/corpus/chunks/payment-checkout-form.json +341 -0
- package/corpus/chunks/payment-method-form.json +328 -0
- package/corpus/chunks/period-comparison.json +236 -0
- package/corpus/chunks/permission-matrix-table.json +438 -0
- package/corpus/chunks/permissions-matrix-grid.json +111 -0
- package/corpus/chunks/permissions-matrix-summary.json +157 -0
- package/corpus/chunks/permissions-role-picker-radio.json +107 -0
- package/corpus/chunks/permissions-role-picker-select.json +101 -0
- package/corpus/chunks/permissions-share-link.json +256 -0
- package/corpus/chunks/permissions-share-people.json +297 -0
- package/corpus/chunks/permissions-sharing-scopes.json +109 -0
- package/corpus/chunks/plan-selection-form.json +529 -0
- package/corpus/chunks/playground-a2ui.json +181 -0
- package/corpus/chunks/playground-agent-admin.json +117 -0
- package/corpus/chunks/playground-agent-chat.json +126 -0
- package/corpus/chunks/playground-app-shell.json +488 -0
- package/corpus/chunks/playground-chat.json +265 -0
- package/corpus/chunks/playground-construct-canvas.json +118 -0
- package/corpus/chunks/playground-css-channel.json +487 -0
- package/corpus/chunks/playground-gen-ui.json +224 -0
- package/corpus/chunks/playground-render-preview.json +369 -0
- package/corpus/chunks/playground-streams-bridge.json +437 -0
- package/corpus/chunks/playground-table-toolbar.json +38 -0
- package/corpus/chunks/popover-with-content.json +118 -0
- package/corpus/chunks/pricing-tiers.json +561 -0
- package/corpus/chunks/product-tour.json +158 -0
- package/corpus/chunks/profile-public.json +297 -0
- package/corpus/chunks/progress-tracker-milestones.json +294 -0
- package/corpus/chunks/radio-button-group.json +83 -0
- package/corpus/chunks/rating-stars-review-summary.json +259 -0
- package/corpus/chunks/reactions-bar.json +75 -0
- package/corpus/chunks/reactions-picker.json +245 -0
- package/corpus/chunks/real-time-metrics-dashboard.json +344 -0
- package/corpus/chunks/record-detail-drawer-simple-detail.json +296 -0
- package/corpus/chunks/record-detail-drawer-tabbed-detail.json +443 -0
- package/corpus/chunks/referral-share-link.json +128 -0
- package/corpus/chunks/referral-status.json +243 -0
- package/corpus/chunks/reg-address-form.json +825 -0
- package/corpus/chunks/reg-billing-card.json +210 -0
- package/corpus/chunks/reg-brand-scrape.json +599 -0
- package/corpus/chunks/reg-departments-toggle.json +259 -0
- package/corpus/chunks/reg-extended-profile.json +356 -0
- package/corpus/chunks/reg-final-done.json +457 -0
- package/corpus/chunks/reg-helpdesk-grid.json +571 -0
- package/corpus/chunks/reg-import-picker.json +112 -0
- package/corpus/chunks/reg-integrations-grid.json +418 -0
- package/corpus/chunks/reg-invite-form.json +245 -0
- package/corpus/chunks/reg-legal-entity.json +260 -0
- package/corpus/chunks/reg-org-chart-review.json +891 -0
- package/corpus/chunks/reg-profile-identity.json +188 -0
- package/corpus/chunks/reg-step-footer.json +201 -0
- package/corpus/chunks/reg-step-header.json +201 -0
- package/corpus/chunks/reg-step-progress.json +236 -0
- package/corpus/chunks/reg-step-shell.json +605 -0
- package/corpus/chunks/reg-story-pane.json +201 -0
- package/corpus/chunks/reg-success-summary.json +257 -0
- package/corpus/chunks/reg-team-size.json +128 -0
- package/corpus/chunks/reg-usecase-picker.json +104 -0
- package/corpus/chunks/reg-workspace-name.json +159 -0
- package/corpus/chunks/responsive-grid-pattern.json +71 -0
- package/corpus/chunks/responsive-kpi-grid.json +166 -0
- package/corpus/chunks/responsive-row-pattern.json +71 -0
- package/corpus/chunks/responsive-shell-sidebar.json +308 -0
- package/corpus/chunks/responsive-wrap-at-pattern.json +124 -0
- package/corpus/chunks/retention-cohort-default-retention.json +80 -0
- package/corpus/chunks/retention-cohort-stat-pair.json +163 -0
- package/corpus/chunks/retention-cohort-with-legend.json +135 -0
- package/corpus/chunks/revenue-heatmap.json +82 -0
- package/corpus/chunks/role-management.json +272 -0
- package/corpus/chunks/row-action-cluster.json +54 -0
- package/corpus/chunks/row-avatar-name-role.json +71 -0
- package/corpus/chunks/row-icon-label.json +52 -0
- package/corpus/chunks/row-spread-label-value.json +54 -0
- package/corpus/chunks/row-wrap-tags.json +72 -0
- package/corpus/chunks/schedule-meeting-form-card.json +229 -0
- package/corpus/chunks/search-recents-menu.json +195 -0
- package/corpus/chunks/search-results-grouped.json +357 -0
- package/corpus/chunks/search-results-list.json +202 -0
- package/corpus/chunks/search-saved-views.json +356 -0
- package/corpus/chunks/search-with-filters.json +311 -0
- package/corpus/chunks/searchable-picker-modal.json +164 -0
- package/corpus/chunks/section-with-stack.json +48 -0
- package/corpus/chunks/security-active-sessions-devices.json +287 -0
- package/corpus/chunks/security-change-password-form.json +102 -0
- package/corpus/chunks/security-delete-account-danger.json +79 -0
- package/corpus/chunks/segmented-control-billing-tabs.json +164 -0
- package/corpus/chunks/select-multiple-preselected.json +70 -0
- package/corpus/chunks/settings-2fa-setup.json +307 -0
- package/corpus/chunks/settings-admin-page.json +1205 -0
- package/corpus/chunks/settings-appearance-primitives.json +145 -0
- package/corpus/chunks/settings-appearance-theme-panel.json +55 -0
- package/corpus/chunks/settings-appearance.json +81 -0
- package/corpus/chunks/settings-danger-zone-delete-workspace.json +93 -0
- package/corpus/chunks/settings-general-form.json +69 -0
- package/corpus/chunks/settings-integrations.json +298 -0
- package/corpus/chunks/settings-members-invite.json +112 -0
- package/corpus/chunks/settings-notification-activity-checkboxes.json +108 -0
- package/corpus/chunks/settings-notification-channels-switches.json +101 -0
- package/corpus/chunks/settings-page-shell.json +190 -0
- package/corpus/chunks/settings-privacy.json +83 -0
- package/corpus/chunks/settings-profile-security.json +122 -0
- package/corpus/chunks/settings-toggle-switches.json +66 -0
- package/corpus/chunks/sidebar-nav.json +120 -0
- package/corpus/chunks/sidebar-navigation-panel.json +165 -0
- package/corpus/chunks/signup-form-card.json +218 -0
- package/corpus/chunks/signup-team-size-form.json +259 -0
- package/corpus/chunks/single-select-card-form.json +231 -0
- package/corpus/chunks/slider-range-controls.json +119 -0
- package/corpus/chunks/social-media-post-card.json +159 -0
- package/corpus/chunks/sortable-list.json +307 -0
- package/corpus/chunks/sortable-search-paginate-table.json +162 -0
- package/corpus/chunks/split-pane-editor.json +146 -0
- package/corpus/chunks/stack-avatar-badge-overlay.json +53 -0
- package/corpus/chunks/stack-image-shimmer.json +51 -0
- package/corpus/chunks/stat-cards-kpi-dashboard.json +178 -0
- package/corpus/chunks/stats-band-big-numbers.json +175 -0
- package/corpus/chunks/status-dashboard.json +282 -0
- package/corpus/chunks/stepper-form-wizard.json +165 -0
- package/corpus/chunks/subscription-status-renewal-card.json +285 -0
- package/corpus/chunks/survey-rating-form.json +165 -0
- package/corpus/chunks/swiper-product-carousel.json +349 -0
- package/corpus/chunks/swiper-testimonial-carousel.json +279 -0
- package/corpus/chunks/table-empty-state.json +116 -0
- package/corpus/chunks/table-inline-edit-row.json +269 -0
- package/corpus/chunks/table-spreadsheet-cells.json +334 -0
- package/corpus/chunks/table-toolbar-no-search.json +42 -0
- package/corpus/chunks/table-toolbar-with-table.json +208 -0
- package/corpus/chunks/table-with-toolbar-card.json +80 -0
- package/corpus/chunks/tabs-with-panels.json +187 -0
- package/corpus/chunks/tag-chips-filter.json +100 -0
- package/corpus/chunks/team-invite-form.json +380 -0
- package/corpus/chunks/team-members-list.json +341 -0
- package/corpus/chunks/testimonial-grid.json +269 -0
- package/corpus/chunks/testimonial-pull-quote.json +137 -0
- package/corpus/chunks/testimonials-avatar-cards.json +286 -0
- package/corpus/chunks/timeline-events.json +89 -0
- package/corpus/chunks/timezone-selector-basic.json +99 -0
- package/corpus/chunks/timezone-selector-preview.json +104 -0
- package/corpus/chunks/toolbar-icons.json +216 -0
- package/corpus/chunks/toolbar-rich-text-editor.json +230 -0
- package/corpus/chunks/toolbar-tooltips.json +191 -0
- package/corpus/chunks/tooltip-hover-button.json +106 -0
- package/corpus/chunks/tree-file-explorer.json +136 -0
- package/corpus/chunks/tree-table-basic.json +171 -0
- package/corpus/chunks/trial-banner.json +158 -0
- package/corpus/chunks/url-import-form.json +728 -0
- package/corpus/chunks/usage-quota-meter-card.json +217 -0
- package/corpus/chunks/user-identity-row.json +81 -0
- package/corpus/chunks/user-onboarding-checklist.json +301 -0
- package/corpus/chunks/user-profile-card.json +192 -0
- package/corpus/chunks/users-table-badge.json +135 -0
- package/corpus/chunks/verification-document-upload.json +179 -0
- package/corpus/chunks/verification-status.json +97 -0
- package/corpus/chunks/verification-stepper.json +111 -0
- package/corpus/chunks/video-player-controls.json +120 -0
- package/corpus/chunks/webhook-config.json +209 -0
- package/corpus/chunks/webhooks-list.json +204 -0
- package/corpus/chunks/wizard-drawer-three-step-wizard.json +443 -0
- package/corpus/manifest.d.ts +4 -0
- package/corpus/manifest.json +6 -0
- package/corpus/scripts/chunk-library.d.ts +4 -0
- package/corpus/scripts/chunk-library.js +335 -0
- package/node-shims.d.ts +48 -0
- package/package.json +215 -0
- package/retrieval/CHANGELOG.md +1073 -0
- package/retrieval/README.md +71 -0
- package/retrieval/anti-patterns.js +189 -0
- package/retrieval/authoring/index.d.ts +4 -0
- package/retrieval/authoring/index.js +9 -0
- package/retrieval/authoring/web-research.js +220 -0
- package/retrieval/catalog.js +250 -0
- package/retrieval/component-catalog.js +168 -0
- package/retrieval/component-entry.js +80 -0
- package/retrieval/context-assembler.js +174 -0
- package/retrieval/domain-router.js +417 -0
- package/retrieval/embedding/chunk-embedding-retriever.js +117 -0
- package/retrieval/embedding/embedding-provider.js +72 -0
- package/retrieval/embedding/index.d.ts +4 -0
- package/retrieval/embedding/index.js +2 -0
- package/retrieval/feedback/dialog-recorder.js +107 -0
- package/retrieval/feedback/feedback-analyzer.js +180 -0
- package/retrieval/feedback/feedback-store.js +194 -0
- package/retrieval/feedback/feedback.js +117 -0
- package/retrieval/feedback/gap-registry.js +80 -0
- package/retrieval/feedback/human-signal.js +113 -0
- package/retrieval/feedback/index.d.ts +4 -0
- package/retrieval/feedback/index.js +24 -0
- package/retrieval/feedback/submit-feedback.js +45 -0
- package/retrieval/index.d.ts +4 -0
- package/retrieval/index.js +53 -0
- package/retrieval/intent/clarity.js +139 -0
- package/retrieval/intent/decomposer.js +124 -0
- package/retrieval/intent/index.d.ts +4 -0
- package/retrieval/intent/index.js +18 -0
- package/retrieval/intent/intent-alignment.js +172 -0
- package/retrieval/intent/intent-categorizer.js +69 -0
- package/retrieval/intent/intent-gate.js +96 -0
- package/retrieval/intent/prompt-analyzer.js +162 -0
- package/retrieval/wiring-catalog.js +168 -0
- package/validate/catalog-validator.d.ts +4 -0
- package/validate/catalog-validator.js +327 -0
- package/validate/semantic/cache.js +54 -0
- package/validate/semantic/classify-intent.js +128 -0
- package/validate/semantic/index.js +163 -0
- package/validate/semantic/intent-specs.js +162 -0
- package/validate/semantic/judge.js +180 -0
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @adia-ai/gen-ui — monolithic engine, pro mode.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from core/generator.js per spec §11 Phase 2. Shares state
|
|
5
|
+
* (ArtifactStore, PipelineEngine) via core/state.js. Pure helpers live
|
|
6
|
+
* in strategies/monolithic/_shared.js.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { validateAndRepair, buildFailures } from '../../shared/validate-and-repair.js';
|
|
10
|
+
import { getContext, searchBlocks, lookupDomain } from '../../core/reference.js';
|
|
11
|
+
import { decomposeIntent } from '../../../retrieval/intent/decomposer.js';
|
|
12
|
+
import { assessClarity } from '../../../retrieval/intent/clarity.js';
|
|
13
|
+
import { isConversational } from '../../../retrieval/intent/intent-gate.js';
|
|
14
|
+
import { feedbackStore } from '../../../retrieval/feedback/feedback-store.js';
|
|
15
|
+
import { store, engine } from '../../core/state.js';
|
|
16
|
+
import { isRecording } from '../../../retrieval/feedback/dialog-recorder.js';
|
|
17
|
+
import { searchChunks, expandChunkGraph } from '../_shared/chunk-loader.js';
|
|
18
|
+
import {
|
|
19
|
+
buildSystemPrompt,
|
|
20
|
+
buildChatMessages,
|
|
21
|
+
mergeCanvasDiff,
|
|
22
|
+
buildCanvasDiffPrompt,
|
|
23
|
+
parseA2UIResponse,
|
|
24
|
+
buildRepairPrompt,
|
|
25
|
+
generateSuggestions, foldInAntiPatterns } from './_shared.js';
|
|
26
|
+
|
|
27
|
+
export async function generatePro({ intent, executionId, storeId, llmAdapter, analysis, priorComponentsFromPayload, context }) {
|
|
28
|
+
const execId = executionId;
|
|
29
|
+
|
|
30
|
+
// The steelman is the enriched brief produced by the prompt-analyzer in
|
|
31
|
+
// the baseline ingestion stage. Use it for pattern search (denser query =
|
|
32
|
+
// better hits) and inject the analysis signals into the system prompt so
|
|
33
|
+
// the LLM sees the implied component set + concept tags. Falls back to raw
|
|
34
|
+
// intent when analyzer didn't run (iteration turns) or fell back.
|
|
35
|
+
const searchQuery = analysis?.steelman || intent;
|
|
36
|
+
|
|
37
|
+
// Header prepended to every user message sent to the LLM. Surfaces the
|
|
38
|
+
// analyzer's structured signals so the LLM treats steelman + components +
|
|
39
|
+
// concepts as ground truth instead of having to re-derive them from a 3-word
|
|
40
|
+
// prompt. Empty string when no analyzer signal — no behavior change.
|
|
41
|
+
const analysisHint = (analysis?.analyzed && (
|
|
42
|
+
analysis.steelman !== analysis.raw ||
|
|
43
|
+
analysis.impliedComponents?.length ||
|
|
44
|
+
analysis.concepts?.length
|
|
45
|
+
))
|
|
46
|
+
? [
|
|
47
|
+
analysis.steelman && analysis.steelman !== analysis.raw ? `BRIEF: ${analysis.steelman}` : null,
|
|
48
|
+
analysis.impliedComponents?.length ? `EXPECTED COMPONENTS: ${analysis.impliedComponents.join(', ')}` : null,
|
|
49
|
+
analysis.concepts?.length ? `CONCEPTS: ${analysis.concepts.join(', ')}` : null,
|
|
50
|
+
analysis.styleHints?.length ? `STYLE: ${analysis.styleHints.join(', ')}` : null,
|
|
51
|
+
].filter(Boolean).join('\n') + '\n\n'
|
|
52
|
+
: '';
|
|
53
|
+
|
|
54
|
+
// ── Stage 1: Interpret ──
|
|
55
|
+
const domain = lookupDomain(intent);
|
|
56
|
+
engine.submitStage(execId, 'interpret', { domain, intent, confidence: domain.confidence });
|
|
57
|
+
|
|
58
|
+
// ── Clarity gate (defense-in-depth) ──
|
|
59
|
+
// If intent has zero domain signals and clarity is below threshold,
|
|
60
|
+
// return a clarification response instead of hallucinating UI.
|
|
61
|
+
// This catches cases where the intent gate upstream didn't intercept
|
|
62
|
+
// (e.g. direct API calls bypassing isConversational).
|
|
63
|
+
// EXCEPTION: skip on iteration turns. Refinements like "make it 3D" or
|
|
64
|
+
// "remove the avatar" have zero domain signals but are valid modifications
|
|
65
|
+
// of the prior canvas — they should pass straight through to the LLM with
|
|
66
|
+
// history context. Iteration is detected by the presence of prior turns in
|
|
67
|
+
// the artifact store keyed by storeId. Same intent as F1 in generator.js.
|
|
68
|
+
const priorTurnCount = store.getAll(storeId || execId)?.length || 0;
|
|
69
|
+
const isIteration = priorTurnCount > 0;
|
|
70
|
+
const clarity = assessClarity(intent, domain);
|
|
71
|
+
if (!isIteration && !clarity.clear && domain.confidence === 0) {
|
|
72
|
+
// Note: 'clarify' is not a registered pipeline stage, so we skip submitStage
|
|
73
|
+
// here to avoid throwing — the clarification surfaces in the return payload.
|
|
74
|
+
return {
|
|
75
|
+
executionId: storeId,
|
|
76
|
+
messages: [],
|
|
77
|
+
validation: { score: 0, errors: [], warnings: ['Intent does not describe a UI component'] },
|
|
78
|
+
suggestions: clarity.questions.map(q => q.text),
|
|
79
|
+
clarify: {
|
|
80
|
+
needed: true,
|
|
81
|
+
questions: clarity.questions,
|
|
82
|
+
score: clarity.score,
|
|
83
|
+
dimensions: clarity.dimensions,
|
|
84
|
+
summary: clarity.summary,
|
|
85
|
+
},
|
|
86
|
+
pipeline: engine.getState(execId),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ── Stage 2: Analyze ──
|
|
91
|
+
const catalogContext = await getContext(intent, 2);
|
|
92
|
+
engine.submitStage(execId, 'analyze', {
|
|
93
|
+
context: catalogContext, componentCount: catalogContext.components.length, patternCount: catalogContext.patterns.length,
|
|
94
|
+
confidence: 0.85,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// ── Stage 3: Plan — search for best pattern + best chunk ──
|
|
98
|
+
const patterns = searchBlocks(searchQuery, { domain: domain.domain });
|
|
99
|
+
const bestPattern = patterns[0];
|
|
100
|
+
|
|
101
|
+
// ── Parallel chunk retrieval (training-corpus path) ──
|
|
102
|
+
// The chunks corpus at packages/gen-ui/corpus/chunks/*.json captures real
|
|
103
|
+
// page-shape blocks harvested from working apps (auth/sign-in,
|
|
104
|
+
// settings pages, dashboards, etc.). When a query strongly matches a
|
|
105
|
+
// chunk, we inject the chunk's HTML as a STRUCTURAL REFERENCE into the
|
|
106
|
+
// adapt prompt — so the LLM has the canonical shape, not just a
|
|
107
|
+
// description of it. This closes the gap where monolithic-pro was
|
|
108
|
+
// describing chunks (via the score-card's pattern-match telemetry) but
|
|
109
|
+
// never actually using them in generation.
|
|
110
|
+
//
|
|
111
|
+
// Threshold rationale: searchChunks's keyword-score scale is the same
|
|
112
|
+
// family as the existing STRONG_RETRIEVAL_SCORE=8 in zettel's chunk
|
|
113
|
+
// synthesizer. We use a slightly lower threshold (5) for monolithic
|
|
114
|
+
// because the chunk is REFERENCE, not authoritative — the LLM still
|
|
115
|
+
// adapts, so we'd rather over-inject and let the LLM judge relevance.
|
|
116
|
+
let chunkMatch = null;
|
|
117
|
+
let chunkRefHtml = null;
|
|
118
|
+
try {
|
|
119
|
+
const chunkHits = await searchChunks(searchQuery, { limit: 1 });
|
|
120
|
+
if (chunkHits.length && chunkHits[0].score >= 5) {
|
|
121
|
+
chunkMatch = chunkHits[0];
|
|
122
|
+
// Expand the chunk's nested refs so the LLM sees the complete
|
|
123
|
+
// structural context, not just the outer shell. Depth-capped to
|
|
124
|
+
// protect against the recursive nested chain blowing token budget.
|
|
125
|
+
const graph = await expandChunkGraph(chunkMatch.record, { maxDepth: 3 });
|
|
126
|
+
chunkRefHtml = graph
|
|
127
|
+
.map((g) => `<!-- chunk: ${g.name} (${g.kind}/${g.primary}) -->\n${g.html || ''}`)
|
|
128
|
+
.join('\n\n');
|
|
129
|
+
}
|
|
130
|
+
} catch {
|
|
131
|
+
// Chunk loader is best-effort — never block generation on its failures
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ── Compositional reasoning: decompose multi-section intents ──
|
|
135
|
+
// ALWAYS attempt decomposition for compound intents — even when a single
|
|
136
|
+
// best pattern matches. This lets the LLM receive fragment patterns for
|
|
137
|
+
// each sub-section (e.g. "invoice table", "payment form") alongside the
|
|
138
|
+
// overall best pattern, producing richer multi-section output.
|
|
139
|
+
let fragmentPatterns = [];
|
|
140
|
+
let decomposition = decomposeIntent(intent);
|
|
141
|
+
|
|
142
|
+
// Determine if intent is compound: decomposer says so, OR 3+ meaningful words
|
|
143
|
+
const meaningfulWords = intent.replace(/\b(a|an|the|with|and|or|for|of|in|on|to|by)\b/gi, '').trim().split(/\s+/).filter(w => w.length > 2);
|
|
144
|
+
const isCompound = (decomposition.shouldDecompose && decomposition.subtasks.length >= 2)
|
|
145
|
+
|| meaningfulWords.length >= 3;
|
|
146
|
+
|
|
147
|
+
if (isCompound && decomposition.subtasks.length >= 2) {
|
|
148
|
+
for (const subtask of decomposition.subtasks) {
|
|
149
|
+
const subPatterns = searchBlocks(subtask.intent, { domain: domain.domain });
|
|
150
|
+
const topMatch = subPatterns[0];
|
|
151
|
+
if (topMatch?.template) {
|
|
152
|
+
fragmentPatterns.push({
|
|
153
|
+
label: subtask.label,
|
|
154
|
+
subtaskIntent: subtask.intent,
|
|
155
|
+
pattern: topMatch,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const hasFragments = fragmentPatterns.length >= 2;
|
|
162
|
+
engine.submitStage(execId, 'plan', {
|
|
163
|
+
strategy: bestPattern?.template ? (hasFragments ? 'adapt-with-fragments' : 'adapt-pattern') : hasFragments ? 'compose-fragments' : 'generate-fresh',
|
|
164
|
+
patternName: bestPattern?.name ?? (chunkMatch?.name ?? null),
|
|
165
|
+
chunkRef: chunkMatch ? { name: chunkMatch.name, score: chunkMatch.score, kind: chunkMatch.kind, primary: chunkMatch.primary } : null,
|
|
166
|
+
fragments: hasFragments ? fragmentPatterns.map(f => f.pattern.name) : undefined,
|
|
167
|
+
layout: hasFragments ? decomposition?.layout : undefined,
|
|
168
|
+
confidence: bestPattern?.template ? 0.9 : hasFragments ? 0.85 : chunkMatch ? 0.8 : 0.7,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// ── Stage 4: Generate ──
|
|
172
|
+
|
|
173
|
+
// Check if this is a multi-turn iteration with existing canvas state.
|
|
174
|
+
// This runs BEFORE branching so ALL paths (adapt, compose, generate-fresh)
|
|
175
|
+
// can inject the current canvas when iterating.
|
|
176
|
+
// Priority order:
|
|
177
|
+
// 1. priorComponentsFromPayload — client-owned canvas (stateless path)
|
|
178
|
+
// 2. ArtifactStore lookup via storeId — server-stateful path (legacy)
|
|
179
|
+
// The payload path wins when both present so the client is the source of
|
|
180
|
+
// truth (it knows its current canvas; the store may be stale, e.g. after
|
|
181
|
+
// a server restart or when iterating across tabs).
|
|
182
|
+
let priorComponents = [];
|
|
183
|
+
if (Array.isArray(priorComponentsFromPayload) && priorComponentsFromPayload.length > 0) {
|
|
184
|
+
priorComponents = priorComponentsFromPayload;
|
|
185
|
+
} else {
|
|
186
|
+
const prevTurns = store.getAll(storeId || execId);
|
|
187
|
+
if (prevTurns && prevTurns.length > 0) {
|
|
188
|
+
const lastTurn = prevTurns[prevTurns.length - 1];
|
|
189
|
+
priorComponents = lastTurn.messages?.flatMap(m => m.components || []) || [];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const hasPriorCanvas = priorComponents.length > 0;
|
|
193
|
+
|
|
194
|
+
// ── Drift guard: detect scope creep and inject guardrails into prompt ──
|
|
195
|
+
const preDriftMetrics = hasPriorCanvas ? store.getDriftMetrics(storeId || execId) : null;
|
|
196
|
+
const originalIntent = preDriftMetrics?.originalIntent || null;
|
|
197
|
+
const driftGuard = preDriftMetrics?.driftScore >= 0.4
|
|
198
|
+
? `\n\nSCOPE GUARD: This canvas has grown significantly from the original brief ("${preDriftMetrics.originalIntent}"). Component count: ${priorComponents.length}. Only make changes the user EXPLICITLY requested. Do NOT add new sections, cards, or structural elements beyond what the user asked for in this turn.`
|
|
199
|
+
: '';
|
|
200
|
+
|
|
201
|
+
let messages, systemPrompt;
|
|
202
|
+
// Captured for the dialog recorder when ADIA_LOG_DIALOGS is on. Holds the
|
|
203
|
+
// raw text from whichever LLM branch produced the final result. No-op when
|
|
204
|
+
// recording is off — the assignments are cheap; the size cost only matters
|
|
205
|
+
// when the recorder actually persists them to disk.
|
|
206
|
+
let lastRawResponse = null;
|
|
207
|
+
let lastTokens = null;
|
|
208
|
+
|
|
209
|
+
// Pattern templates are pre-inlined as of the 2026-05-12 fragment
|
|
210
|
+
// retirement (§37) — compositions/ no longer carry $fragment refs and
|
|
211
|
+
// there's nothing left to expand. We pass the template straight to the
|
|
212
|
+
// LLM. If a stale pattern with $fragment refs sneaks back in, the LLM
|
|
213
|
+
// will see the literal placeholder string and likely include it in
|
|
214
|
+
// output (acceptable failure mode; corpus drift is caught by the
|
|
215
|
+
// verify:corpus script).
|
|
216
|
+
const expandedPatternTemplate = bestPattern?.template ?? null;
|
|
217
|
+
|
|
218
|
+
// ── Chunk reference block — injected into the user prompt when a
|
|
219
|
+
// strong chunk match was found at retrieval time. This is the
|
|
220
|
+
// structural "look like this" hint that lets the LLM materialize the
|
|
221
|
+
// real chunk shape (e.g. auth-signin-card-email) instead of
|
|
222
|
+
// hallucinating a passable-but-wrong shape from the brief alone.
|
|
223
|
+
//
|
|
224
|
+
// §56 (v0.4.5): prompt language enriched with provenance + metadata so
|
|
225
|
+
// the LLM understands the chunk's domain/keywords context. Tested via
|
|
226
|
+
// factory-chat + gen-ui live submit; LLMs produce closer structural
|
|
227
|
+
// matches when told what the chunk is + where it came from.
|
|
228
|
+
const chunkReferenceBlock = chunkRefHtml
|
|
229
|
+
? `\nSTRUCTURAL REFERENCE — this chunk was retrieved from the AdiaUI training corpus (annotated production HTML, harvested from real app pages). It matched your intent on keyword/domain ranking:
|
|
230
|
+
|
|
231
|
+
CHUNK: ${chunkMatch.name}
|
|
232
|
+
kind=${chunkMatch.kind}, primary=${chunkMatch.primary}, score=${chunkMatch.score}${chunkMatch.metadata?.domain ? `, domain=${chunkMatch.metadata.domain}` : ''}${chunkMatch.metadata?.description ? `\n description: ${chunkMatch.metadata.description}` : ''}${chunkMatch.metadata?.keywords ? `\n keywords: ${chunkMatch.metadata.keywords.join(', ')}` : ''}
|
|
233
|
+
|
|
234
|
+
Match this chunk's component palette, information density, and Card/Header/Section/Footer anatomy. Do NOT copy the HTML verbatim into A2UI — translate its semantic structure into the equivalent A2UI components. The chunk represents the SHAPE the user wants; your job is to instantiate that shape with their content:
|
|
235
|
+
---
|
|
236
|
+
${chunkRefHtml}
|
|
237
|
+
---
|
|
238
|
+
`
|
|
239
|
+
: '';
|
|
240
|
+
|
|
241
|
+
if (bestPattern && bestPattern.template) {
|
|
242
|
+
// PRO PATH: Adapt the matched pattern via LLM
|
|
243
|
+
systemPrompt = await buildSystemPrompt(catalogContext, patterns, '', intent, null, context);
|
|
244
|
+
|
|
245
|
+
const adaptPrompt = hasPriorCanvas
|
|
246
|
+
? `Adapt this UI for the intent: "${intent}"${driftGuard}
|
|
247
|
+
${chunkReferenceBlock}
|
|
248
|
+
${buildCanvasDiffPrompt(intent, priorComponents, { originalIntent })}`
|
|
249
|
+
: hasFragments
|
|
250
|
+
? `Adapt this UI for the intent: "${intent}"
|
|
251
|
+
${chunkReferenceBlock}
|
|
252
|
+
BASE TEMPLATE (use for overall structure — modify, don't generate from scratch):
|
|
253
|
+
${JSON.stringify(expandedPatternTemplate, null, 2)}
|
|
254
|
+
|
|
255
|
+
Pattern: "${bestPattern.name}" — ${bestPattern.description}
|
|
256
|
+
|
|
257
|
+
FRAGMENT PATTERNS — incorporate these for specific sections:
|
|
258
|
+
${fragmentPatterns.map(f => `## ${f.label} (from "${f.pattern.name}" pattern)\n${JSON.stringify(f.pattern.template, null, 1)}`).join('\n\n')}
|
|
259
|
+
|
|
260
|
+
Instructions:
|
|
261
|
+
- Use the base pattern for overall structure and layout
|
|
262
|
+
- Incorporate the fragment patterns above for their respective sections
|
|
263
|
+
- Change text content, labels, icons to match the new intent
|
|
264
|
+
- Add or remove components as needed for the intent
|
|
265
|
+
- Preserve slot attributes and Card anatomy rules
|
|
266
|
+
- Generate a COMPLETE, richly detailed UI with 20-40 components minimum
|
|
267
|
+
- Each section from the intent should have its own Card with Header, Section, and Footer
|
|
268
|
+
- Include realistic text content, labels, and placeholder data — not generic text
|
|
269
|
+
- Output ONLY the JSON array, no explanation`
|
|
270
|
+
: `Adapt this UI for the intent: "${intent}"
|
|
271
|
+
${chunkReferenceBlock}
|
|
272
|
+
BASE TEMPLATE (modify this, don't generate from scratch):
|
|
273
|
+
${JSON.stringify(expandedPatternTemplate, null, 2)}
|
|
274
|
+
|
|
275
|
+
Pattern: "${bestPattern.name}" — ${bestPattern.description}
|
|
276
|
+
|
|
277
|
+
Instructions:
|
|
278
|
+
- Keep the structural skeleton (Card > Header + Section + Footer, nesting, layout)
|
|
279
|
+
- Change text content, labels, icons to match the new intent
|
|
280
|
+
- Add or remove components as needed for the intent
|
|
281
|
+
- Preserve slot attributes and Card anatomy rules
|
|
282
|
+
- Generate at least 15 components. Expand the template with additional fields, buttons, and content as appropriate for the intent.
|
|
283
|
+
- Output ONLY the JSON array, no explanation`;
|
|
284
|
+
|
|
285
|
+
const response = await llmAdapter.complete({
|
|
286
|
+
messages: [{ role: 'user', content: analysisHint + adaptPrompt }],
|
|
287
|
+
systemPrompt,
|
|
288
|
+
});
|
|
289
|
+
messages = parseA2UIResponse(response.content, { executionId: execId, mode: 'pro', intent, stopReason: response.stopReason });
|
|
290
|
+
if (isRecording()) { lastRawResponse = response.content; lastTokens = response.usage || null; }
|
|
291
|
+
} else if (hasFragments) {
|
|
292
|
+
// COMPOSE PATH: multiple fragment patterns found for subtasks — compose in a single LLM call
|
|
293
|
+
systemPrompt = await buildSystemPrompt(catalogContext, patterns, '', intent, { fragmentPatterns, decomposition }, context);
|
|
294
|
+
|
|
295
|
+
const fragmentContext = fragmentPatterns.map(f =>
|
|
296
|
+
`## ${f.label} (from "${f.pattern.name}" pattern)\n${JSON.stringify(f.pattern.template, null, 1)}`
|
|
297
|
+
).join('\n\n');
|
|
298
|
+
|
|
299
|
+
const layoutHint = decomposition.layout
|
|
300
|
+
? `Use a ${decomposition.layout.component} as the root layout container.`
|
|
301
|
+
: 'Use a Column as the root layout container.';
|
|
302
|
+
|
|
303
|
+
const canvasContext = hasPriorCanvas
|
|
304
|
+
? `\n${buildCanvasDiffPrompt(intent, priorComponents, { originalIntent })}${driftGuard}\n`
|
|
305
|
+
: '';
|
|
306
|
+
|
|
307
|
+
const composePrompt = `Compose a UI for: "${intent}"
|
|
308
|
+
${chunkReferenceBlock}${canvasContext}
|
|
309
|
+
This intent has ${fragmentPatterns.length} sections. ${layoutHint}
|
|
310
|
+
|
|
311
|
+
FRAGMENT PATTERNS — use these as building blocks for each section:
|
|
312
|
+
|
|
313
|
+
${fragmentContext}
|
|
314
|
+
|
|
315
|
+
Instructions:
|
|
316
|
+
- ${hasPriorCanvas ? 'Return ONLY diff objects (add/modify/delete) — unchanged components are preserved automatically' : 'Combine ALL fragments into a single cohesive UI under one root'}
|
|
317
|
+
- Re-id all components to avoid collisions (e.g., prefix with section name)
|
|
318
|
+
- ${decomposition.layout?.component === 'Tabs' ? 'Use Tabs as root with Tab children for each section — each section\'s content goes INSIDE its Tab (the parent auto-hides inactive panels)' : `Use ${decomposition.layout?.component || 'Column'} as root, with each section as a child`}
|
|
319
|
+
- Adapt text content, labels, and icons to match the overall intent
|
|
320
|
+
- Add a page-level header above the sections if appropriate
|
|
321
|
+
- Preserve slot attributes and Card anatomy rules from each fragment
|
|
322
|
+
- Generate a COMPLETE, richly detailed UI with 20-40 components minimum. Each section should have its own Card with Header, Section, and Footer.
|
|
323
|
+
- Include realistic text content, labels, placeholder data, and all fields/buttons a real production UI would have.
|
|
324
|
+
- Output ONLY the JSON array, no explanation`;
|
|
325
|
+
|
|
326
|
+
const response = await llmAdapter.complete({
|
|
327
|
+
messages: [{ role: 'user', content: analysisHint + composePrompt }],
|
|
328
|
+
systemPrompt,
|
|
329
|
+
});
|
|
330
|
+
messages = parseA2UIResponse(response.content, { executionId: execId, mode: 'pro', intent, stopReason: response.stopReason });
|
|
331
|
+
if (isRecording()) { lastRawResponse = response.content; lastTokens = response.usage || null; }
|
|
332
|
+
} else {
|
|
333
|
+
// No pattern — fall through to full thinking-style generation
|
|
334
|
+
systemPrompt = await buildSystemPrompt(catalogContext, patterns, '', intent, null, context);
|
|
335
|
+
|
|
336
|
+
if (hasPriorCanvas) {
|
|
337
|
+
// Multi-turn: inject current canvas as explicit iteration context
|
|
338
|
+
const iteratePrompt = `Modify this UI for the intent: "${intent}"${driftGuard}
|
|
339
|
+
${chunkReferenceBlock}
|
|
340
|
+
${buildCanvasDiffPrompt(intent, priorComponents, { originalIntent })}`;
|
|
341
|
+
|
|
342
|
+
const response = await llmAdapter.complete({
|
|
343
|
+
messages: [{ role: 'user', content: analysisHint + iteratePrompt }],
|
|
344
|
+
systemPrompt,
|
|
345
|
+
});
|
|
346
|
+
messages = parseA2UIResponse(response.content, { executionId: execId, intent, mode: 'pro', stopReason: response.stopReason });
|
|
347
|
+
if (isRecording()) { lastRawResponse = response.content; lastTokens = response.usage || null; }
|
|
348
|
+
} else {
|
|
349
|
+
// First-turn fresh generation. When we have a chunk match, prepend
|
|
350
|
+
// the structural reference to the user message so the LLM sees the
|
|
351
|
+
// canonical shape before the standard chat-built prompt.
|
|
352
|
+
const chatMessages = buildChatMessages(intent, storeId || execId);
|
|
353
|
+
if (chunkReferenceBlock && chatMessages.length) {
|
|
354
|
+
// The last message in chatMessages is the user's brief — prepend
|
|
355
|
+
// the chunk reference to its content.
|
|
356
|
+
const lastIdx = chatMessages.length - 1;
|
|
357
|
+
if (chatMessages[lastIdx].role === 'user') {
|
|
358
|
+
chatMessages[lastIdx] = {
|
|
359
|
+
...chatMessages[lastIdx],
|
|
360
|
+
content: `${chunkReferenceBlock}\n${chatMessages[lastIdx].content}`,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
const response = await llmAdapter.complete({ messages: chatMessages, systemPrompt });
|
|
365
|
+
messages = parseA2UIResponse(response.content, { executionId: execId, intent, mode: 'pro', stopReason: response.stopReason });
|
|
366
|
+
if (isRecording()) { lastRawResponse = response.content; lastTokens = response.usage || null; }
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// ── Canvas diff merge: apply LLM response onto prior canvas ──
|
|
371
|
+
//
|
|
372
|
+
// §168 (v0.5.4): merge always runs on iteration turns regardless of canvas
|
|
373
|
+
// size. Pre-§168 the gate was `priorComponents.length >= 50`, which created
|
|
374
|
+
// a three-band threshold mismatch:
|
|
375
|
+
// 0–49 : prompt asked for COMPLETE array, merge skipped → LLM output
|
|
376
|
+
// wholesale-replaced canvas (verified 2026-05-14 chart-workflow
|
|
377
|
+
// ticket: 32-component canvas + "add a chart" intent →
|
|
378
|
+
// 202-component response wiped the user's prior work)
|
|
379
|
+
// 50–299 : prompt asked for COMPLETE array, merge ran treating output
|
|
380
|
+
// as DIFF → prompt/code mismatch
|
|
381
|
+
// 300+ : prompt asked for DIFF only, merge ran (correct band)
|
|
382
|
+
//
|
|
383
|
+
// mergeCanvasDiff() is a strict superset of "replace" behaviorally:
|
|
384
|
+
// - When LLM returns COMPLETE array: every prior id is present in output
|
|
385
|
+
// → merged in-place (no-op if unchanged; updates if changed). Missing
|
|
386
|
+
// prior ids preserved. New ids appended. Net behavior = identical to
|
|
387
|
+
// wholesale-replace when LLM cooperates, safer when LLM returns subset.
|
|
388
|
+
// - When LLM returns DIFF: existing behavior preserved.
|
|
389
|
+
// Plus the hallucination-detection guards in mergeCanvasDiff (matchRatio
|
|
390
|
+
// < 0.2 reject + < 0.6 accept-with-warning) discriminate by match ratio,
|
|
391
|
+
// which is more principled than canvas-size heuristics.
|
|
392
|
+
if (hasPriorCanvas && messages && messages.length > 0) {
|
|
393
|
+
for (const msg of messages) {
|
|
394
|
+
if (msg.type === 'updateComponents' && msg.components) {
|
|
395
|
+
msg.components = mergeCanvasDiff(priorComponents, msg.components);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
engine.submitStage(execId, 'generate', {
|
|
401
|
+
messages, source: bestPattern ? (hasFragments ? 'adapt-with-fragments' : 'adapt') : hasFragments ? 'compose' : 'llm', confidence: 0.85,
|
|
402
|
+
fragments: hasFragments ? fragmentPatterns.length : undefined,
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
// ── Stage 5: Validate + repair ──
|
|
406
|
+
// Shared with every other LLM-calling engine — see validate-and-repair.js.
|
|
407
|
+
// maxAttempts: 2 (vs. thinking's 3) reflects pro's cheaper cost tier.
|
|
408
|
+
// runCatalogCheck adds Ajv catalog-schema coverage pro never had before —
|
|
409
|
+
// buildRepairPrompt's catalogFailures param already defaults to [] so
|
|
410
|
+
// this is additive, not a signature break.
|
|
411
|
+
const repairResult = await validateAndRepair({
|
|
412
|
+
messages,
|
|
413
|
+
llmAdapter,
|
|
414
|
+
buildRepairPrompt,
|
|
415
|
+
parseResponse: (repairResponse) => parseA2UIResponse(
|
|
416
|
+
repairResponse.content,
|
|
417
|
+
{ executionId: execId, intent, mode: 'pro', stopReason: repairResponse.stopReason },
|
|
418
|
+
),
|
|
419
|
+
systemPrompt,
|
|
420
|
+
validateContext: { intent, context },
|
|
421
|
+
foldInAntiPatterns,
|
|
422
|
+
maxAttempts: 2,
|
|
423
|
+
});
|
|
424
|
+
messages = repairResult.messages;
|
|
425
|
+
const validation = repairResult.validation;
|
|
426
|
+
engine.submitStage(execId, 'validate', { ...validation, confidence: validation.score / 100 });
|
|
427
|
+
|
|
428
|
+
// REQ-03 (spec-factory-dx-ws4-acceptance): monolithic-pro is the ladder's
|
|
429
|
+
// terminal engine (cascade.js's ENGINE_LADDER) — its result is the one no
|
|
430
|
+
// exit gate ever runs against (the floor exemption cascade.js:84-88
|
|
431
|
+
// documents), so THIS is the one place `repairResult.exhausted` must
|
|
432
|
+
// survive instead of being silently discarded. "Flagged" means the
|
|
433
|
+
// returned object carries `acceptance.accepted === false` with a
|
|
434
|
+
// non-empty `failures` list whenever schema or catalog validation failed.
|
|
435
|
+
const acceptance = {
|
|
436
|
+
accepted: repairResult.valid,
|
|
437
|
+
exhausted: repairResult.exhausted,
|
|
438
|
+
failures: repairResult.valid ? [] : buildFailures(repairResult.validation, repairResult.catalogValidation),
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
// ── Stage 6: Store ──
|
|
442
|
+
// First-turn analysis is recorded so iteration turns can recover concepts +
|
|
443
|
+
// implied components for canvas-aware suggestions. The store keeps only the
|
|
444
|
+
// first turn's analysis value (later passes are nulls — by design).
|
|
445
|
+
const artifactId = storeId || execId;
|
|
446
|
+
store.record(artifactId, { messages, summary: intent, validation, intent, analysis });
|
|
447
|
+
engine.submitStage(execId, 'render', { stored: true, success: validation.valid });
|
|
448
|
+
|
|
449
|
+
// Pull the original analyzer output so suggestions stay anchored to the
|
|
450
|
+
// initial canvas concept even on iteration turns. Without this, chip
|
|
451
|
+
// clicks drift the suggestion pool away from the original intent.
|
|
452
|
+
const originalAnalysis = store.getOriginalAnalysis(artifactId);
|
|
453
|
+
const suggestions = generateSuggestions({ intent, domain, messages, originalAnalysis, originalIntent });
|
|
454
|
+
|
|
455
|
+
// ── Drift detection: warn when canvas structure diverges significantly ──
|
|
456
|
+
const driftMetrics = store.getDriftMetrics(artifactId);
|
|
457
|
+
if (driftMetrics?.warning) {
|
|
458
|
+
console.warn(`[generateUI:pro] ${driftMetrics.warning}`);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// Fire-and-forget feedback logging
|
|
462
|
+
feedbackStore.logExecution({
|
|
463
|
+
executionId: artifactId, intent, mode: 'pro',
|
|
464
|
+
domain: domain.domain, patternMatch: bestPattern?.name,
|
|
465
|
+
chunkMatch: chunkMatch ? chunkMatch.name : null,
|
|
466
|
+
composedFrom: hasFragments ? fragmentPatterns.map(f => f.pattern.name) : undefined,
|
|
467
|
+
score: validation?.score, componentCount: messages[0]?.components?.length || 0,
|
|
468
|
+
}).catch(() => {});
|
|
469
|
+
|
|
470
|
+
return {
|
|
471
|
+
executionId: artifactId,
|
|
472
|
+
messages,
|
|
473
|
+
validation,
|
|
474
|
+
acceptance,
|
|
475
|
+
suggestions,
|
|
476
|
+
drift: driftMetrics,
|
|
477
|
+
pipeline: engine.getState(execId),
|
|
478
|
+
// Debug payload for the dialog recorder. Only populated when
|
|
479
|
+
// ADIA_LOG_DIALOGS is on (the engine's capture sites guard with
|
|
480
|
+
// isRecording()). Underscore-prefixed so consumers can ignore it,
|
|
481
|
+
// and so it never accidentally appears in serialised API payloads
|
|
482
|
+
// unless the proxy explicitly forwards it.
|
|
483
|
+
_debug: isRecording() ? {
|
|
484
|
+
systemPrompt,
|
|
485
|
+
rawLLMResponse: lastRawResponse,
|
|
486
|
+
tokens: lastTokens,
|
|
487
|
+
patterns: patterns.slice(0, 8).map(p => ({ name: p.name, score: p.score, keywords: p.keywords })),
|
|
488
|
+
} : undefined,
|
|
489
|
+
};
|
|
490
|
+
}
|