@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,495 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine registry + dispatcher — the seam between gen-ui's public API and the
|
|
3
|
+
* per-engine implementations. Per .claude/docs/specs/package-architecture.md §11 Phase 5.
|
|
4
|
+
*
|
|
5
|
+
* Wired engines:
|
|
6
|
+
* - monolithic → pattern-match + adapt (instant | pro | thinking modes)
|
|
7
|
+
* - zettel → fragment-graph composition (single mode: instant)
|
|
8
|
+
* - chunk-zettel → slot-binding plan over corpus chunks
|
|
9
|
+
* - free-form → LLM-picked chunk ingredients, grounded composition
|
|
10
|
+
* - auto → the escalation ladder over the four above, declared as
|
|
11
|
+
* an `@adia-ai/agent` workflow in cascade.js (gh#664)
|
|
12
|
+
*
|
|
13
|
+
* The registry deliberately does NOT own intent-gating, clarity assessment, or
|
|
14
|
+
* execution lifecycle — the public `generateUI()` in core/generator.js does
|
|
15
|
+
* that, then delegates the actual work through `pick()`.
|
|
16
|
+
*
|
|
17
|
+
* Shape invariant: every engine function returns
|
|
18
|
+
* { executionId, messages, validation, suggestions?, strategy?, ... }
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
// Zettel is lazy-loaded — it transitively imports node:fs / node:path / node:url
|
|
22
|
+
// (strategies/zettel/composition-library.js), which Vite externalizes in the browser.
|
|
23
|
+
// Static-importing it here would break browser loads of core/generator.js.
|
|
24
|
+
// In-browser callers reach zettel via POST /api/generate (server-side), never
|
|
25
|
+
// through this registry, so lazy-loading is safe and incurs only a one-time
|
|
26
|
+
// import on first server-side invocation.
|
|
27
|
+
let _generateZettel = null;
|
|
28
|
+
async function getGenerateZettel() {
|
|
29
|
+
if (!_generateZettel) {
|
|
30
|
+
const mod = await import('./zettel/generator-adapter.js');
|
|
31
|
+
_generateZettel = mod.generateZettel;
|
|
32
|
+
}
|
|
33
|
+
return _generateZettel;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Same lazy-load story for isRecording — keeps the cold-import surface tight.
|
|
37
|
+
let _isRecording = null;
|
|
38
|
+
async function getIsRecording() {
|
|
39
|
+
if (!_isRecording) {
|
|
40
|
+
const mod = await import('../../retrieval/feedback/dialog-recorder.js');
|
|
41
|
+
_isRecording = mod.isRecording;
|
|
42
|
+
}
|
|
43
|
+
return _isRecording;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// The three monolithic paths live inside core/generator.js as internal
|
|
47
|
+
// functions. They're injected at boot via `registerMonolithicEngines()` to
|
|
48
|
+
// avoid a circular import (core/generator.js owns the registry caller).
|
|
49
|
+
let _monolithicInstant = null;
|
|
50
|
+
let _monolithicPro = null;
|
|
51
|
+
let _monolithicThinking = null;
|
|
52
|
+
|
|
53
|
+
export function registerMonolithicEngines({ instant, pro, thinking }) {
|
|
54
|
+
_monolithicInstant = instant;
|
|
55
|
+
_monolithicPro = pro;
|
|
56
|
+
_monolithicThinking = thinking;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A2UI overhaul plan, Phase 4: instant mode never repairs (it makes no LLM
|
|
60
|
+
// calls at all — that's its whole cost/latency identity) and previously
|
|
61
|
+
// returned a hard-fail's broken output silently. Escalation to pro lives
|
|
62
|
+
// HERE, at the dispatcher, not inside generate-instant.js itself — it's the
|
|
63
|
+
// caller's policy decision, matching validate-and-repair.js's "escalation
|
|
64
|
+
// stays with the caller" contract, and this is the one place that already
|
|
65
|
+
// holds both `ctx.llmAdapter` and `_monolithicPro` in scope.
|
|
66
|
+
//
|
|
67
|
+
// Capped at exactly one hop by construction: generateProAdapter has no
|
|
68
|
+
// escalation logic of its own, so a pro-mode failure after an instant
|
|
69
|
+
// escalation returns straight to the original caller — it can never chain
|
|
70
|
+
// into thinking. Only escalates when an llmAdapter is actually available;
|
|
71
|
+
// many instant-mode callers pass none (that's the 0-cost tier's point), and
|
|
72
|
+
// validate-and-repair.js's own contract for that case is "report the
|
|
73
|
+
// failure, don't invent a repair path" — same discipline here.
|
|
74
|
+
//
|
|
75
|
+
// This silently converts a 0-cost request into a billed LLM call, which is
|
|
76
|
+
// a product/cost-visibility concern, not just an engineering one — hence
|
|
77
|
+
// the counter + the warn log, from day one, not added later once someone
|
|
78
|
+
// asks "why did our LLM spend spike".
|
|
79
|
+
let _instantEscalationCount = 0;
|
|
80
|
+
export function getInstantEscalationCount() {
|
|
81
|
+
return _instantEscalationCount;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Engine adapters — uniform call signature `(ctx) => Promise<result>` where
|
|
85
|
+
// ctx is prepared by the public generateUI() orchestrator.
|
|
86
|
+
//
|
|
87
|
+
// gh#664: the instant → pro hop is a two-step `@adia-ai/agent` workflow now
|
|
88
|
+
// rather than an inline `if`. The rule is unchanged and still lives here at
|
|
89
|
+
// the dispatcher (see the note above); what changed is that it's declared
|
|
90
|
+
// as a step sequence with an `until` predicate, the same shape the full
|
|
91
|
+
// ladder in cascade.js uses, so there is one way to spell "escalate" in
|
|
92
|
+
// this package instead of two. The harness import is lazy for the same
|
|
93
|
+
// browser-load reason zettel is: this module is imported by
|
|
94
|
+
// core/generator.js, which the gen-ui playground loads directly.
|
|
95
|
+
async function generateInstantAdapter(ctx) {
|
|
96
|
+
if (!_monolithicInstant) throw new Error('monolithic-instant engine not registered');
|
|
97
|
+
const canEscalate = !!(ctx.llmAdapter && _monolithicPro);
|
|
98
|
+
const { defineWorkflow, runWorkflow } = await import('@adia-ai/agent');
|
|
99
|
+
const outcome = await runWorkflow(defineWorkflow('monolithic-escalation', [
|
|
100
|
+
{
|
|
101
|
+
name: 'monolithic-instant',
|
|
102
|
+
// A PURE verdict (gh#665 / PR #669 nit N2): the counter and the warn
|
|
103
|
+
// used to live in here, correct only while the harness called `until`
|
|
104
|
+
// exactly once per step. They moved to the pro step's `run`, which by
|
|
105
|
+
// construction executes once and only when the hop actually happens.
|
|
106
|
+
until: (result) =>
|
|
107
|
+
result.validation?.valid || !canEscalate
|
|
108
|
+
? { accepted: true }
|
|
109
|
+
: {
|
|
110
|
+
accepted: false,
|
|
111
|
+
reason: 'instant-validation-failed',
|
|
112
|
+
detail: `score=${result.validation?.score}`,
|
|
113
|
+
},
|
|
114
|
+
run: () => _monolithicInstant(ctx),
|
|
115
|
+
},
|
|
116
|
+
// Terminal by construction — generateProAdapter has no escalation of
|
|
117
|
+
// its own, so the hop is capped at exactly one, as before.
|
|
118
|
+
{
|
|
119
|
+
name: 'monolithic-pro',
|
|
120
|
+
run: (wctx) => {
|
|
121
|
+
_instantEscalationCount++;
|
|
122
|
+
console.warn(`[a2ui] monolithic-instant hard-failed validation (${wctx.feedback?.detail ?? 'no score'}) for intent "${ctx.intent}" — escalating to monolithic-pro (escalation #${_instantEscalationCount})`);
|
|
123
|
+
return _monolithicPro(ctx);
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
]), { input: ctx, sessionId: ctx.sessionId ?? ctx.executionId ?? 'monolithic' });
|
|
127
|
+
return outcome.result;
|
|
128
|
+
}
|
|
129
|
+
async function generateProAdapter(ctx) {
|
|
130
|
+
if (!_monolithicPro) throw new Error('monolithic-pro engine not registered');
|
|
131
|
+
return _monolithicPro(ctx);
|
|
132
|
+
}
|
|
133
|
+
async function generateThinkingAdapter(ctx) {
|
|
134
|
+
if (!_monolithicThinking) throw new Error('monolithic-thinking engine not registered');
|
|
135
|
+
return _monolithicThinking(ctx);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async function generateZettelAdapter(ctx) {
|
|
139
|
+
// Map the monolithic ctx to the zettel adapter's expected shape.
|
|
140
|
+
// storeId (monolithic's multi-turn handle) → sessionId (zettel's turn history).
|
|
141
|
+
// The steelman from the baseline analyzer drives both retrieval (better
|
|
142
|
+
// keyword match against the corpus) and LLM synthesis (richer brief). Falls
|
|
143
|
+
// back to raw intent on iteration turns when analyzer was skipped.
|
|
144
|
+
// Note: ctx.priorComponentsFromPayload is forwarded for forward-compat —
|
|
145
|
+
// zettel's session-store currently owns iteration history, but a future
|
|
146
|
+
// pass should let payload override session state for true statelessness.
|
|
147
|
+
const generateZettel = await getGenerateZettel();
|
|
148
|
+
const enrichedIntent = ctx.analysis?.steelman || ctx.intent;
|
|
149
|
+
const result = await generateZettel({
|
|
150
|
+
intent: enrichedIntent,
|
|
151
|
+
mode: 'instant',
|
|
152
|
+
llmAdapter: ctx.llmAdapter || null,
|
|
153
|
+
sessionId: ctx.storeId || ctx.executionId || null,
|
|
154
|
+
priorComponentsFromPayload: ctx.priorComponentsFromPayload || null,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// Dialog-recorder hook for zettel. No "system prompt" to capture (the
|
|
158
|
+
// synthesizer builds its own internally), but the strategy + composition +
|
|
159
|
+
// candidates are the equivalent reasoning surface — they explain why this
|
|
160
|
+
// turn produced what it did. Surfaced via _debug so the recorder picks
|
|
161
|
+
// them up the same way it picks up monolithic engines' system prompts.
|
|
162
|
+
const isRecording = await getIsRecording();
|
|
163
|
+
return {
|
|
164
|
+
executionId: ctx.executionId,
|
|
165
|
+
messages: result.messages,
|
|
166
|
+
validation: result.validation,
|
|
167
|
+
suggestions: [],
|
|
168
|
+
strategy: result.strategy,
|
|
169
|
+
engine: 'zettel',
|
|
170
|
+
_debug: isRecording() ? {
|
|
171
|
+
systemPrompt: null,
|
|
172
|
+
rawLLMResponse: null,
|
|
173
|
+
tokens: null,
|
|
174
|
+
patterns: (result.candidates || []).slice(0, 8).map(c => ({
|
|
175
|
+
name: c.name,
|
|
176
|
+
score: c.score,
|
|
177
|
+
type: c.type,
|
|
178
|
+
})),
|
|
179
|
+
strategy: result.strategy || null,
|
|
180
|
+
composition: result.composition || result.patternName || null,
|
|
181
|
+
fragmentsUsed: result.fragments_used || null,
|
|
182
|
+
retrievalScore: result.retrievalScore ?? null,
|
|
183
|
+
synthesisAttempts: result.synthesis?.attempts ?? null,
|
|
184
|
+
sessionTurns: result.sessionTurns ?? null,
|
|
185
|
+
} : undefined,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// §108 (v0.5.1): pin free-form's ingredient-picker to Haiku 4.5.
|
|
190
|
+
// Rationale: the picker task is "select N from 86 ingredients + emit
|
|
191
|
+
// strict JSON" — Haiku handles this well at ~5× cheaper + ~3× faster
|
|
192
|
+
// than Opus, freeing the Opus budget for monolithic-pro fall-throughs.
|
|
193
|
+
// User-decided pre-A/B per v0.5.1 plan question 2: "Haiku is a good
|
|
194
|
+
// default."
|
|
195
|
+
//
|
|
196
|
+
// §127 (v0.5.2): env override for the A/B harness. Set
|
|
197
|
+
// `FREE_FORM_MODEL_OVERRIDE` env var to e.g. `claude-opus-4-7` to run
|
|
198
|
+
// the eval against Opus for the §127 Haiku-vs-Opus comparison.
|
|
199
|
+
// Default behavior unchanged when env var unset — the Haiku-pin holds
|
|
200
|
+
// for every consumer that doesn't explicitly override. Read at
|
|
201
|
+
// call-time (not module-load) so eval harnesses can set the env after
|
|
202
|
+
// static imports complete.
|
|
203
|
+
const FREE_FORM_MODEL_DEFAULT = 'claude-haiku-4-5-20251001';
|
|
204
|
+
|
|
205
|
+
async function generateFreeFormAdapter(ctx) {
|
|
206
|
+
// Lazy-load: free-form-composer imports composition-library which
|
|
207
|
+
// top-level-awaits a node:fs read. Same browser-safety story as zettel.
|
|
208
|
+
const { generateFreeForm } = await import('./free-form-composer/index.js');
|
|
209
|
+
|
|
210
|
+
// Pin Haiku for the picker task even when harness model is Opus.
|
|
211
|
+
// Auto-engine + factory-chat may pass any-model llmAdapter; free-form
|
|
212
|
+
// mints its own to keep the picker cost-bounded.
|
|
213
|
+
//
|
|
214
|
+
// §127 (v0.5.2): `ctx.model` overrides the FREE_FORM pin (highest
|
|
215
|
+
// priority). `FREE_FORM_MODEL_OVERRIDE` env var is the second-priority
|
|
216
|
+
// override (set by `eval-diff.mjs --model <id>`). Default Haiku-pin
|
|
217
|
+
// holds otherwise. Empirical result from §127 records the production
|
|
218
|
+
// default; if Opus wins, FREE_FORM_MODEL_DEFAULT flips.
|
|
219
|
+
const modelToUse = ctx.model || process.env.FREE_FORM_MODEL_OVERRIDE || FREE_FORM_MODEL_DEFAULT;
|
|
220
|
+
let pickerAdapter = ctx.llmAdapter || null;
|
|
221
|
+
try {
|
|
222
|
+
const { createAdapter } = await import('@adia-ai/llm/bridge');
|
|
223
|
+
pickerAdapter = await createAdapter({ model: modelToUse });
|
|
224
|
+
} catch {
|
|
225
|
+
// Adapter mint failed (proxy down, no key) — fall back to whatever
|
|
226
|
+
// ctx provides. Strategy will emit `free-form-no-llm` if both fail.
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const result = await generateFreeForm({
|
|
230
|
+
intent: ctx.intent,
|
|
231
|
+
llmAdapter: pickerAdapter,
|
|
232
|
+
});
|
|
233
|
+
const isRecording = await getIsRecording();
|
|
234
|
+
return {
|
|
235
|
+
executionId: ctx.executionId,
|
|
236
|
+
messages: result.messages,
|
|
237
|
+
validation: result.validation,
|
|
238
|
+
suggestions: [],
|
|
239
|
+
strategy: result.strategy,
|
|
240
|
+
engine: 'free-form',
|
|
241
|
+
// §109 (v0.5.1): usedIngredients graduates from `_debug.*` to
|
|
242
|
+
// first-class. Auto-engine + factory-chat UI both depend on it for
|
|
243
|
+
// trace labels; coupling visibility to dialog-recorder state was
|
|
244
|
+
// fragile. `rationale` joins it for the same reason — trace
|
|
245
|
+
// copy quotes the LLM's one-line rationale when present.
|
|
246
|
+
usedIngredients: result.usedIngredients || [],
|
|
247
|
+
rationale: result.rationale || null,
|
|
248
|
+
// §107a (v0.5.1): plan graduates to first-class so eval-diff's
|
|
249
|
+
// `--report-substitutions` can read it without `_debug` gating.
|
|
250
|
+
// The plan carries the LLM's emitted substitutions per ingredient
|
|
251
|
+
// — the substitution-coverage measurement needs this surface even
|
|
252
|
+
// when dialog-recorder is off (production eval scenarios).
|
|
253
|
+
plan: result.plan || null,
|
|
254
|
+
// §131 (v0.5.2): `_debug` is **volatile** — dialog-recorder-gated,
|
|
255
|
+
// shape may change without semver coordination. Consumers MUST read
|
|
256
|
+
// first-class fields instead: `usedIngredients` (§109 v0.5.1),
|
|
257
|
+
// `rationale` (§109 v0.5.1), `plan` (§107a v0.5.2). The old soft-API
|
|
258
|
+
// paths (`_debug.usedIngredients`, `_debug.rationale`, `_debug.plan`)
|
|
259
|
+
// were removed by §109 / §107a; this block is now strictly debug-
|
|
260
|
+
// recorder fodder. Scheduled removal: v0.6.0 will fold `attempts` +
|
|
261
|
+
// `warnings` into first-class result fields and drop `_debug` here.
|
|
262
|
+
//
|
|
263
|
+
// §146 (v0.5.3): finalize the v0.6.0 deprecation schedule for the
|
|
264
|
+
// last two `_debug.*` fields that any consumer might still read.
|
|
265
|
+
//
|
|
266
|
+
// @deprecated `_debug.attempts` and `_debug.warnings` — both fields
|
|
267
|
+
// are dialog-recorder-gated (silently `undefined` when not
|
|
268
|
+
// recording), which is exactly the access pattern §109+§107a
|
|
269
|
+
// removed for `usedIngredients`/`rationale`/`plan`. v0.6.0 folds
|
|
270
|
+
// both into first-class result fields:
|
|
271
|
+
//
|
|
272
|
+
// - `result.attempts: number` — number of LLM round-trips taken
|
|
273
|
+
// to produce the final plan (1 normally; 2-3 with hallucination
|
|
274
|
+
// retry or paraphrase-retry; same value as §106's loop counter)
|
|
275
|
+
// - `result.warnings: string[]` — non-fatal transpile findings
|
|
276
|
+
// (unknown substitution keys, layout-value fall-throughs,
|
|
277
|
+
// chunk-resolution warns); same value as transpilePlan output
|
|
278
|
+
//
|
|
279
|
+
// Consumers should switch reads from `result._debug?.attempts` →
|
|
280
|
+
// `result.attempts` and `result._debug?.warnings` → `result.warnings`
|
|
281
|
+
// before v0.6.0 ships. The `_debug` block itself disappears from
|
|
282
|
+
// the free-form-composed result shape entirely in v0.6.0; the
|
|
283
|
+
// dialog-recorder will read first-class fields directly.
|
|
284
|
+
//
|
|
285
|
+
// No in-repo consumers currently read these fields (verified
|
|
286
|
+
// `grep -rn '_debug\?.attempts\|_debug.attempts\|_debug\?.warnings\|_debug.warnings'
|
|
287
|
+
// apps/ playgrounds/ catalog/ packages/` → 0 hits at v0.5.3 cut).
|
|
288
|
+
// External consumers should treat v0.6.0 as the migration window.
|
|
289
|
+
_debug: isRecording() ? {
|
|
290
|
+
systemPrompt: null,
|
|
291
|
+
rawLLMResponse: null,
|
|
292
|
+
tokens: null,
|
|
293
|
+
attempts: result.attempts,
|
|
294
|
+
warnings: result.warnings,
|
|
295
|
+
} : undefined,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
async function generateChunkZettelAdapter(ctx) {
|
|
300
|
+
const { composeFromIntent } = await import('./zettel/chunk-synthesizer.js');
|
|
301
|
+
const { validateAndRepair } = await import('../shared/validate-and-repair.js');
|
|
302
|
+
const result = await composeFromIntent({
|
|
303
|
+
intent: ctx.intent,
|
|
304
|
+
llmAdapter: ctx.llmAdapter || null,
|
|
305
|
+
maxAttempts: 2,
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// TKT-0009: composeFromIntent now returns a real component array
|
|
309
|
+
// (`result.template`) whenever it can, instead of only an HTML string —
|
|
310
|
+
// use it directly; the pre-fix fallback (a single node carrying an
|
|
311
|
+
// UNREGISTERED `component: 'article'` type) only fires if transpilation
|
|
312
|
+
// itself somehow produced nothing, which should not happen in practice.
|
|
313
|
+
const messages = result.template
|
|
314
|
+
? [{ type: 'updateComponents', components: result.template }]
|
|
315
|
+
: result.html
|
|
316
|
+
? [{ type: 'updateComponents', components: [{ id: 'chunk-root', component: 'article', html: result.html }] }]
|
|
317
|
+
: [];
|
|
318
|
+
|
|
319
|
+
// Full schema/catalog/anti-pattern conformance — the same final pass
|
|
320
|
+
// every other engine runs (see validate-and-repair.js). Validate-only:
|
|
321
|
+
// no natural repair target here (the LLM authored a slot-binding PLAN,
|
|
322
|
+
// not this A2UI JSON directly) — chunk-composer's own `validatePlan`
|
|
323
|
+
// is this engine's repair-relevant check and already ran upstream.
|
|
324
|
+
const schemaCheck = messages.length ? await validateAndRepair({ messages }) : { valid: false, validation: { score: 0 } };
|
|
325
|
+
|
|
326
|
+
return {
|
|
327
|
+
executionId: ctx.executionId,
|
|
328
|
+
messages,
|
|
329
|
+
validation: schemaCheck.validation,
|
|
330
|
+
strategy: result.source === 'retrieval' ? 'chunk-retrieval' : 'chunk-synthesis',
|
|
331
|
+
engine: 'chunk-zettel',
|
|
332
|
+
_debug: {
|
|
333
|
+
plan: result.plan || null,
|
|
334
|
+
warnings: result.warnings || [],
|
|
335
|
+
scopeDrift: result.scopeDrift || null,
|
|
336
|
+
schemaValid: schemaCheck.valid,
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// REQ-01 (spec-factory-dx-ws4-acceptance): the schema+catalog exit gate
|
|
342
|
+
// every default `auto` run gets even when the caller supplies none — the
|
|
343
|
+
// same validators the adia-producer's always-on gate composes
|
|
344
|
+
// (packages/genui/adia-producer/exit-gate.js#acceptDialectCandidate), reused
|
|
345
|
+
// directly rather than importing that consumer's module (a different
|
|
346
|
+
// consumer — that gate's `wireFormat`/envelope-translation concerns don't
|
|
347
|
+
// belong here). Lazy-imported for the same node:fs/browser-safety reason
|
|
348
|
+
// zettel is (validator.js and catalog-validator.js are both server-side-only
|
|
349
|
+
// in practice: the catalog check reads corpus JSON off disk).
|
|
350
|
+
async function defaultAcceptanceGate(result, callCtx) {
|
|
351
|
+
const messages = result?.messages;
|
|
352
|
+
if (!Array.isArray(messages) || messages.length === 0) return false;
|
|
353
|
+
const { validateSchema } = await import('@adia-ai/a2ui/validate');
|
|
354
|
+
const { validateMessages: validateCatalog } = await import('../../validate/catalog-validator.js');
|
|
355
|
+
const schema = validateSchema(messages, callCtx);
|
|
356
|
+
if (!schema.valid) return false;
|
|
357
|
+
const catalog = await validateCatalog(messages);
|
|
358
|
+
return catalog.valid;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// gh#664: `auto` is the whole ladder as one engine — zettel -> free-form ->
|
|
362
|
+
// monolithic-instant -> monolithic-pro, declared in cascade.js as an
|
|
363
|
+
// `@adia-ai/agent` workflow. It is an ENGINE rather than a separate export
|
|
364
|
+
// so every existing caller reaches it the way it reaches the others
|
|
365
|
+
// (`generateUI({ engine: 'auto' })`, `pick({ engine: 'auto' })`), and so it
|
|
366
|
+
// inherits the reserved-name protection below.
|
|
367
|
+
//
|
|
368
|
+
// Lazy import for the same reason zettel is lazy — and because cascade.js
|
|
369
|
+
// imports ENGINES from this module, so a static import here would be a
|
|
370
|
+
// load-time cycle.
|
|
371
|
+
async function generateAutoAdapter(ctx) {
|
|
372
|
+
const { runCascade, escalationsOf } = await import('./cascade.js');
|
|
373
|
+
// REQ-01: a caller-supplied ctx.gate is ANDed with the default gate, never
|
|
374
|
+
// a replacement — a lax caller gate cannot re-open the schema+catalog
|
|
375
|
+
// seam. No caller gate → the default alone runs.
|
|
376
|
+
const callerGate = ctx.gate;
|
|
377
|
+
const gate = callerGate
|
|
378
|
+
? async (result, gateCtx) => (await defaultAcceptanceGate(result, gateCtx)) && (await callerGate(result, gateCtx))
|
|
379
|
+
: defaultAcceptanceGate;
|
|
380
|
+
const outcome = await runCascade(ctx, {
|
|
381
|
+
...(ctx.ladder ? { ladder: ctx.ladder } : {}),
|
|
382
|
+
gate,
|
|
383
|
+
...(ctx.onStep ? { emit: ctx.onStep } : {}),
|
|
384
|
+
});
|
|
385
|
+
const result = outcome.result;
|
|
386
|
+
return {
|
|
387
|
+
...result,
|
|
388
|
+
executionId: result.executionId ?? ctx.executionId,
|
|
389
|
+
engine: result.engine ?? outcome.step,
|
|
390
|
+
// The ladder's own record of what it tried and why it climbed — the
|
|
391
|
+
// `{from, to, trigger}` shape trace consumers already render.
|
|
392
|
+
escalations: escalationsOf(outcome),
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// REQ-04 (spec-factory-dx-ws4-acceptance): the canonical consumer-facing
|
|
397
|
+
// projection of an ENGINES[*] result — every field a caller may render,
|
|
398
|
+
// including `acceptance` (REQ-03). A serialization boundary (the MCP
|
|
399
|
+
// `generate_ui` tool, the HTTP `/api/generate` proxy) that hand-rolls its
|
|
400
|
+
// own field whitelist silently drops a newly added first-class field
|
|
401
|
+
// (REQ-04's falsifier); consumers should build their response off THIS
|
|
402
|
+
// projection instead of restating the field list.
|
|
403
|
+
export function projectEngineResult(result, fallbackEngine) {
|
|
404
|
+
return {
|
|
405
|
+
engine: result?.engine ?? fallbackEngine,
|
|
406
|
+
executionId: result?.executionId,
|
|
407
|
+
strategy: result?.strategy,
|
|
408
|
+
messages: result?.messages,
|
|
409
|
+
validation: result?.validation,
|
|
410
|
+
suggestions: result?.suggestions,
|
|
411
|
+
composition: result?.composition,
|
|
412
|
+
fragments_used: result?.fragments_used,
|
|
413
|
+
sessionTurns: result?.sessionTurns,
|
|
414
|
+
acceptance: result?.acceptance,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
export const ENGINES = {
|
|
419
|
+
'auto': generateAutoAdapter,
|
|
420
|
+
'monolithic-instant': generateInstantAdapter,
|
|
421
|
+
'monolithic-pro': generateProAdapter,
|
|
422
|
+
'monolithic-thinking': generateThinkingAdapter,
|
|
423
|
+
'zettel': generateZettelAdapter,
|
|
424
|
+
'chunk-zettel': generateChunkZettelAdapter,
|
|
425
|
+
'free-form': generateFreeFormAdapter,
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Register a third-party generation engine at runtime (OD-5 plugin path).
|
|
430
|
+
*
|
|
431
|
+
* Contract:
|
|
432
|
+
* generate(ctx) → Promise<{ executionId, messages, validation, strategy?, suggestions?, engine }>
|
|
433
|
+
*
|
|
434
|
+
* ctx = { intent, executionId, storeId, llmAdapter, sessionId, catalog? }
|
|
435
|
+
*
|
|
436
|
+
* Built-in engine names (`monolithic-*`, `zettel`) are reserved and cannot be
|
|
437
|
+
* overwritten. Custom engines are dispatched via `pick({ engine: name })` —
|
|
438
|
+
* mode is ignored for custom engines unless the implementation uses it.
|
|
439
|
+
*
|
|
440
|
+
* @example
|
|
441
|
+
* import { registerEngine } from '@adia-ai/gen-ui';
|
|
442
|
+
* registerEngine('my-hybrid', async (ctx) => {
|
|
443
|
+
* const result = await myCustomPipeline(ctx.intent);
|
|
444
|
+
* return { executionId: ctx.executionId, messages: result.messages,
|
|
445
|
+
* validation: { score: result.score }, strategy: 'hybrid',
|
|
446
|
+
* engine: 'my-hybrid' };
|
|
447
|
+
* });
|
|
448
|
+
* generateUI({ engine: 'my-hybrid', intent: '...' });
|
|
449
|
+
*/
|
|
450
|
+
const RESERVED = new Set(['monolithic', 'monolithic-instant', 'monolithic-pro', 'monolithic-thinking', 'zettel', 'chunk-zettel', 'free-form', 'auto']);
|
|
451
|
+
|
|
452
|
+
export function registerEngine(name, generateFn) {
|
|
453
|
+
if (typeof name !== 'string' || !name.length) {
|
|
454
|
+
throw new Error('registerEngine: name must be a non-empty string');
|
|
455
|
+
}
|
|
456
|
+
if (RESERVED.has(name)) {
|
|
457
|
+
throw new Error(`registerEngine: "${name}" is a reserved built-in engine name`);
|
|
458
|
+
}
|
|
459
|
+
if (typeof generateFn !== 'function') {
|
|
460
|
+
throw new Error('registerEngine: generateFn must be a function');
|
|
461
|
+
}
|
|
462
|
+
ENGINES[name] = generateFn;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Remove a previously-registered custom engine. Reserved built-ins are
|
|
467
|
+
* protected — this throws rather than silently noop-ing on a reserved name.
|
|
468
|
+
*/
|
|
469
|
+
export function unregisterEngine(name) {
|
|
470
|
+
if (RESERVED.has(name)) {
|
|
471
|
+
throw new Error(`unregisterEngine: "${name}" is a reserved built-in engine name`);
|
|
472
|
+
}
|
|
473
|
+
return delete ENGINES[name];
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Pick the right engine function for an `{ engine, mode }` pair.
|
|
478
|
+
* Dispatch order:
|
|
479
|
+
* 1. Custom-registered name → direct lookup
|
|
480
|
+
* 2. engine === 'zettel' → zettel adapter
|
|
481
|
+
* 3. `monolithic-${mode}` → monolithic variant
|
|
482
|
+
* 4. Fallback → monolithic-instant
|
|
483
|
+
*/
|
|
484
|
+
export function pick({ engine = 'monolithic', mode = 'instant' } = {}) {
|
|
485
|
+
// Custom engines have priority over built-in name-parsing.
|
|
486
|
+
if (engine && engine !== 'monolithic' && ENGINES[engine]) return ENGINES[engine];
|
|
487
|
+
if (engine === 'zettel') return ENGINES.zettel;
|
|
488
|
+
const key = `monolithic-${mode}`;
|
|
489
|
+
return ENGINES[key] || ENGINES['monolithic-instant'];
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/** Introspection for tooling / docs. */
|
|
493
|
+
export function listEngines() {
|
|
494
|
+
return Object.keys(ENGINES);
|
|
495
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/** Smoke test: load library, resolve login-form composition, print template. */
|
|
3
|
+
import { loadAll, getAllCompositions, searchAll, getComposition } from './composition-library.js';
|
|
4
|
+
import { resolveComposition } from './composer.js';
|
|
5
|
+
|
|
6
|
+
const boot = loadAll();
|
|
7
|
+
console.log('boot:', boot);
|
|
8
|
+
|
|
9
|
+
console.log('\n=== Compositions ===');
|
|
10
|
+
for (const c of getAllCompositions()) console.log(` - ${c.name} (${c.domain})`);
|
|
11
|
+
|
|
12
|
+
console.log('\n=== Search: "login" ===');
|
|
13
|
+
console.log(searchAll('login form password', { limit: 5 }));
|
|
14
|
+
|
|
15
|
+
console.log('\n=== Search: "card header title" ===');
|
|
16
|
+
console.log(searchAll('card header title', { limit: 5 }));
|
|
17
|
+
|
|
18
|
+
console.log('\n=== Resolve login-form ===');
|
|
19
|
+
const comp = getComposition('login-form');
|
|
20
|
+
const resolved = resolveComposition(comp);
|
|
21
|
+
console.log(`resolved ${resolved.length} nodes:`);
|
|
22
|
+
for (const n of resolved) {
|
|
23
|
+
const kids = n.children ? `→[${n.children.join(',')}]` : '';
|
|
24
|
+
const text = n.textContent ? ` "${n.textContent}"` : '';
|
|
25
|
+
const label = n.label ? ` label="${n.label}"` : '';
|
|
26
|
+
console.log(` ${n.id.padEnd(20)} ${n.component}${label}${text} ${kids}`);
|
|
27
|
+
}
|