@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,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CatalogManifest — Structured index of all AdiaUI components.
|
|
3
|
+
*
|
|
4
|
+
* Reads from the per-component a2ui.json sidecars co-located with each
|
|
5
|
+
* component (packages/web-components/components/<c>/<c>.a2ui.json), generated
|
|
6
|
+
* from the YAML single-source-of-truth by scripts/build-components.mjs.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { registry } from '@adia-ai/a2ui';
|
|
10
|
+
|
|
11
|
+
// ── Schema loading ──
|
|
12
|
+
const schemaByTag = new Map();
|
|
13
|
+
let schemasLoaded = false;
|
|
14
|
+
|
|
15
|
+
function tagFromSchema(schema) {
|
|
16
|
+
return schema?.['x-adiaui']?.tag || null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function loadSchemas() {
|
|
20
|
+
if (schemasLoaded) return;
|
|
21
|
+
schemasLoaded = true;
|
|
22
|
+
|
|
23
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
24
|
+
try {
|
|
25
|
+
const { readdir, readFile, stat } = await import(/* @vite-ignore */ 'node:fs/promises');
|
|
26
|
+
const { fileURLToPath } = await import(/* @vite-ignore */ 'node:url');
|
|
27
|
+
const { dirname, join } = await import(/* @vite-ignore */ 'node:path');
|
|
28
|
+
const compsDir = join(dirname(fileURLToPath(import.meta.url)), '../../web-components/components');
|
|
29
|
+
const entries = await readdir(compsDir, { withFileTypes: true });
|
|
30
|
+
for (const e of entries) {
|
|
31
|
+
if (!e.isDirectory()) continue;
|
|
32
|
+
const path = join(compsDir, e.name, `${e.name}.a2ui.json`);
|
|
33
|
+
try {
|
|
34
|
+
const raw = await readFile(path, 'utf8');
|
|
35
|
+
const schema = JSON.parse(raw);
|
|
36
|
+
const tag = tagFromSchema(schema);
|
|
37
|
+
if (tag) schemaByTag.set(tag, schema);
|
|
38
|
+
} catch { /* skip missing / malformed */ }
|
|
39
|
+
}
|
|
40
|
+
} catch { /* components dir missing */ }
|
|
41
|
+
} else {
|
|
42
|
+
// Browser. Vite rewrites the glob CALL at transform time; on the static
|
|
43
|
+
// deploy that call throws (no Vite — `import.meta.glob` is a compile-time
|
|
44
|
+
// macro, undefined at runtime) → we fall through to fetching the
|
|
45
|
+
// CONSOLIDATED catalog. `typeof import.meta.glob` is undefined in BOTH
|
|
46
|
+
// contexts, so the only reliable discriminator is whether the CALL
|
|
47
|
+
// produced loaders. See composition-library.js for the full rationale.
|
|
48
|
+
let modules = null;
|
|
49
|
+
try {
|
|
50
|
+
modules = import.meta.glob('../../web-components/components/*/*.a2ui.json', { query: '?raw', import: 'default' });
|
|
51
|
+
} catch { /* no Vite transform — static deploy */ }
|
|
52
|
+
|
|
53
|
+
if (modules && Object.keys(modules).length > 0) {
|
|
54
|
+
// Vite dev — iterate the glob loaders.
|
|
55
|
+
for (const [, loader] of Object.entries(modules)) {
|
|
56
|
+
try {
|
|
57
|
+
const raw = await loader();
|
|
58
|
+
const schema = JSON.parse(raw);
|
|
59
|
+
const tag = tagFromSchema(schema);
|
|
60
|
+
if (tag) schemaByTag.set(tag, schema);
|
|
61
|
+
} catch { /* skip invalid */ }
|
|
62
|
+
}
|
|
63
|
+
} else {
|
|
64
|
+
// Static deploy — fetch the consolidated catalog once. Its `components`
|
|
65
|
+
// values carry the same `x-adiaui.tag` shape as the per-component
|
|
66
|
+
// sidecars (2026-06-10). Relative-to-module so it resolves under any
|
|
67
|
+
// mount point + the dist symlink layout.
|
|
68
|
+
try {
|
|
69
|
+
const url = new URL('../corpus/catalog-a2ui_0_9.json', import.meta.url);
|
|
70
|
+
const res = await fetch(url);
|
|
71
|
+
if (res.ok) {
|
|
72
|
+
const catalog = await res.json();
|
|
73
|
+
const comps = catalog?.components;
|
|
74
|
+
if (comps && typeof comps === 'object') {
|
|
75
|
+
for (const schema of Object.values(comps)) {
|
|
76
|
+
const tag = tagFromSchema(schema);
|
|
77
|
+
if (tag) schemaByTag.set(tag, schema);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
} catch { /* consolidated catalog not present */ }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Register a JSON schema for a component tag (runtime).
|
|
88
|
+
*/
|
|
89
|
+
export function registerSchema(tag, schema) {
|
|
90
|
+
schemaByTag.set(tag, schema);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ── Category classification ──
|
|
94
|
+
const categoryMap = {
|
|
95
|
+
'row-ui': 'layout', 'col-ui': 'layout', 'list-ui': 'layout', 'grid-ui': 'layout',
|
|
96
|
+
'stack-ui': 'layout', 'block-ui': 'layout', 'toolbar-ui': 'layout',
|
|
97
|
+
'text-ui': 'display', 'image-ui': 'display', 'icon-ui': 'display',
|
|
98
|
+
'divider-ui': 'display', 'badge-ui': 'display', 'avatar-ui': 'display',
|
|
99
|
+
'avatar-group-ui': 'display', 'progress-ui': 'display', 'skeleton-ui': 'display',
|
|
100
|
+
'code-ui': 'display', 'kbd-ui': 'display', 'tag-ui': 'display',
|
|
101
|
+
'stat-ui': 'display', 'empty-state-ui': 'display',
|
|
102
|
+
'input-ui': 'input', 'check-ui': 'input', 'switch-ui': 'input',
|
|
103
|
+
'slider-ui': 'input', 'select-ui': 'input', 'search-ui': 'input',
|
|
104
|
+
'upload-ui': 'input', 'textarea-ui': 'input', 'radio-ui': 'input',
|
|
105
|
+
'otp-input-ui': 'input', 'calendar-picker-ui': 'input', 'color-picker-ui': 'input',
|
|
106
|
+
'range-ui': 'input',
|
|
107
|
+
'button-ui': 'action',
|
|
108
|
+
'card-ui': 'container', 'tabs-ui': 'container', 'tab-ui': 'container',
|
|
109
|
+
'pane-ui': 'container', 'modal-ui': 'container', 'drawer-ui': 'container',
|
|
110
|
+
'toast-ui': 'container', 'popover-ui': 'container', 'accordion-ui': 'container',
|
|
111
|
+
'alert-ui': 'container', 'tooltip-ui': 'container', 'menu-ui': 'container',
|
|
112
|
+
'command-ui': 'container',
|
|
113
|
+
'section': 'card-child', 'header': 'card-child', 'footer': 'card-child',
|
|
114
|
+
'stream-ui': 'agent', 'table-ui': 'agent', 'chart-ui': 'agent',
|
|
115
|
+
'embed-ui': 'agent', 'noodles-ui': 'agent',
|
|
116
|
+
'breadcrumb-ui': 'navigation', 'nav-ui': 'navigation', 'pagination-ui': 'navigation',
|
|
117
|
+
'segmented-ui': 'navigation', 'segment-ui': 'navigation', 'router-ui': 'navigation',
|
|
118
|
+
'toggle-group-ui': 'navigation', 'toggle-option-ui': 'navigation',
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// ── Trait registry ──
|
|
122
|
+
//
|
|
123
|
+
// Loaded from packages/web-components/traits/_catalog.json — generated
|
|
124
|
+
// by `node scripts/build/traits-catalog.mjs` from the live defineTrait()
|
|
125
|
+
// metadata. Hand-edits here will be overwritten. Treat the trait file
|
|
126
|
+
// itself as the single source of truth.
|
|
127
|
+
let traitRegistry = [];
|
|
128
|
+
|
|
129
|
+
async function loadTraitRegistry() {
|
|
130
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
131
|
+
try {
|
|
132
|
+
const { readFile } = await import(/* @vite-ignore */ 'node:fs/promises');
|
|
133
|
+
const { fileURLToPath } = await import(/* @vite-ignore */ 'node:url');
|
|
134
|
+
const { dirname, join } = await import(/* @vite-ignore */ 'node:path');
|
|
135
|
+
const path = join(dirname(fileURLToPath(import.meta.url)), '../../web-components/traits/_catalog.json');
|
|
136
|
+
const raw = await readFile(path, 'utf8');
|
|
137
|
+
const data = JSON.parse(raw);
|
|
138
|
+
traitRegistry = data.traits.map(t => ({
|
|
139
|
+
name: t.name,
|
|
140
|
+
category: t.category,
|
|
141
|
+
description: t.description,
|
|
142
|
+
attributes: [...t.attributes],
|
|
143
|
+
events: [...t.events],
|
|
144
|
+
config: [...t.config],
|
|
145
|
+
}));
|
|
146
|
+
} catch (err) {
|
|
147
|
+
console.warn('[a2ui-corpus] could not load trait catalog:', err.message);
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
// Browser branch — fetch via HTTP, not `import('… .json', { with: { type: 'json' } })`.
|
|
151
|
+
// Vite's dev server transforms JSON imports into JS modules and serves them
|
|
152
|
+
// with `Content-Type: text/javascript`; Chrome's strict MIME check rejects
|
|
153
|
+
// that when the spec-correct `with: { type: 'json' }` attribute is present.
|
|
154
|
+
// (Site pages already use fetch() for the same file — see
|
|
155
|
+
// site/pages/traits/_api-table.js + site/pages/traits/catalog/index.setup.js.)
|
|
156
|
+
try {
|
|
157
|
+
const res = await fetch('/packages/web-components/traits/_catalog.json');
|
|
158
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
159
|
+
const data = await res.json();
|
|
160
|
+
traitRegistry = data.traits.map(t => ({
|
|
161
|
+
name: t.name,
|
|
162
|
+
category: t.category,
|
|
163
|
+
description: t.description,
|
|
164
|
+
attributes: [...t.attributes],
|
|
165
|
+
events: [...t.events],
|
|
166
|
+
config: [...t.config],
|
|
167
|
+
}));
|
|
168
|
+
} catch { /* trait catalog not present in this build context */ }
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
await loadTraitRegistry();
|
|
173
|
+
|
|
174
|
+
// ── Alias tracking ──
|
|
175
|
+
const aliases = new Set([
|
|
176
|
+
'Select', 'LoadingIndicator', 'ErrorContainer',
|
|
177
|
+
'Keyboard', 'DatePicker', 'CommandPalette', 'Segmented', 'OTP', 'SideNav', 'IconSource',
|
|
178
|
+
]);
|
|
179
|
+
|
|
180
|
+
// ── Build the catalog ──
|
|
181
|
+
let catalog = null;
|
|
182
|
+
|
|
183
|
+
async function buildCatalog() {
|
|
184
|
+
if (catalog) return catalog;
|
|
185
|
+
await loadSchemas();
|
|
186
|
+
|
|
187
|
+
const entries = new Map();
|
|
188
|
+
|
|
189
|
+
for (const [type, tag] of registry) {
|
|
190
|
+
if (aliases.has(type)) continue;
|
|
191
|
+
// Skip -ui alias entries (lowercase with dash)
|
|
192
|
+
if (type.includes('-')) continue;
|
|
193
|
+
|
|
194
|
+
const schema = schemaByTag.get(tag) || null;
|
|
195
|
+
const category = categoryMap[tag] || 'other';
|
|
196
|
+
|
|
197
|
+
entries.set(type, {
|
|
198
|
+
type,
|
|
199
|
+
tag,
|
|
200
|
+
category,
|
|
201
|
+
description: schema?.description || '',
|
|
202
|
+
schema,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
catalog = {
|
|
207
|
+
version: '0.1.0',
|
|
208
|
+
totalTypes: entries.size,
|
|
209
|
+
entries,
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
return catalog;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export async function getCatalog() {
|
|
216
|
+
return buildCatalog();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export async function getComponent(typeName) {
|
|
220
|
+
const cat = await buildCatalog();
|
|
221
|
+
if (cat.entries.has(typeName)) return cat.entries.get(typeName);
|
|
222
|
+
const tag = registry.get(typeName);
|
|
223
|
+
if (!tag) return null;
|
|
224
|
+
for (const entry of cat.entries.values()) {
|
|
225
|
+
if (entry.tag === tag) return entry;
|
|
226
|
+
}
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export async function getComponentsByCategory(category) {
|
|
231
|
+
const cat = await buildCatalog();
|
|
232
|
+
return [...cat.entries.values()].filter(e => e.category === category);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export function getTraits() {
|
|
236
|
+
return traitRegistry;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export function getTraitsByCategory(category) {
|
|
240
|
+
return traitRegistry.filter(t => t.category === category);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export async function getFullCatalog() {
|
|
244
|
+
const cat = await buildCatalog();
|
|
245
|
+
return {
|
|
246
|
+
...cat,
|
|
247
|
+
totalTraits: traitRegistry.length,
|
|
248
|
+
traits: traitRegistry,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component Catalog — Loads `.a2ui.json` sidecars from web-components/.
|
|
3
|
+
*
|
|
4
|
+
* The `.a2ui.json` sidecars are hand-authored component contracts that
|
|
5
|
+
* live alongside their components in `packages/web-components/components/`.
|
|
6
|
+
* They are part of the component library — NOT the training corpus — and
|
|
7
|
+
* are the canonical source of truth for component shape (v0.9 JSON Schema
|
|
8
|
+
* with `x-adiaui` extension for retrieval signals).
|
|
9
|
+
*
|
|
10
|
+
* §66 wired these into `buildSystemPrompt` as the authoritative component
|
|
11
|
+
* descriptor. §64 split this loader out of the now-retired
|
|
12
|
+
* `pattern-library.js` so it survives the patterns corpus deletion.
|
|
13
|
+
*
|
|
14
|
+
* Works in both Node.js (readdir/readFile) and the browser (Vite glob).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const IS_NODE =
|
|
18
|
+
typeof process !== 'undefined' &&
|
|
19
|
+
typeof process.versions?.node === 'string';
|
|
20
|
+
|
|
21
|
+
/** @type {Map<string, object>} */
|
|
22
|
+
const _componentData = new Map();
|
|
23
|
+
|
|
24
|
+
let _loaded = false;
|
|
25
|
+
let _loadPromise = null;
|
|
26
|
+
|
|
27
|
+
// Vite rewrites this CALL at transform time. On the static deploy the call
|
|
28
|
+
// throws (no Vite) → `_globA2UIModules` null → fetch the CONSOLIDATED
|
|
29
|
+
// catalog (one request) instead of 138 per-component sidecars.
|
|
30
|
+
// `import.meta.glob` is a compile-time macro (undefined at runtime in both
|
|
31
|
+
// Vite and static) — the only reliable discriminator is whether the CALL
|
|
32
|
+
// produced loaders. See composition-library.js for the full rationale.
|
|
33
|
+
let _globA2UIModules = null;
|
|
34
|
+
if (!IS_NODE) {
|
|
35
|
+
try {
|
|
36
|
+
_globA2UIModules = import.meta.glob('../../web-components/components/**/*.a2ui.json', {
|
|
37
|
+
query: '?raw',
|
|
38
|
+
import: 'default',
|
|
39
|
+
});
|
|
40
|
+
} catch {
|
|
41
|
+
// No Vite transform here (static deploy) — fall through to the fetch branch.
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const HAS_VITE_GLOB =
|
|
45
|
+
!IS_NODE && !!_globA2UIModules && Object.keys(_globA2UIModules).length > 0;
|
|
46
|
+
|
|
47
|
+
// Static-deploy source: the consolidated catalog co-located in the corpus.
|
|
48
|
+
// Its `components` map values are byte-shape-identical to the standalone
|
|
49
|
+
// `.a2ui.json` sidecars (verified 2026-06-10), so one fetch replaces 138.
|
|
50
|
+
// Relative-to-module from retrieval/ → ../a2ui-corpus is `../corpus/`.
|
|
51
|
+
const _CONSOLIDATED_CATALOG_URL =
|
|
52
|
+
!IS_NODE && !HAS_VITE_GLOB
|
|
53
|
+
? new URL('../corpus/catalog-a2ui_0_9.json', import.meta.url)
|
|
54
|
+
: null;
|
|
55
|
+
|
|
56
|
+
async function _loadNode() {
|
|
57
|
+
const fs = await import(/* @vite-ignore */ 'node:fs/promises');
|
|
58
|
+
const path = await import(/* @vite-ignore */ 'node:path');
|
|
59
|
+
const url = await import(/* @vite-ignore */ 'node:url');
|
|
60
|
+
|
|
61
|
+
const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
|
|
62
|
+
const componentsDir = path.resolve(__dirname, '..', '..', 'web-components', 'components');
|
|
63
|
+
|
|
64
|
+
let compEntries;
|
|
65
|
+
try {
|
|
66
|
+
compEntries = await fs.readdir(componentsDir, { withFileTypes: true });
|
|
67
|
+
} catch {
|
|
68
|
+
return; // components dir doesn't exist — skip
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
for (const compEntry of compEntries) {
|
|
72
|
+
if (!compEntry.isDirectory()) continue;
|
|
73
|
+
const a2uiPath = path.join(componentsDir, compEntry.name, `${compEntry.name}.a2ui.json`);
|
|
74
|
+
try {
|
|
75
|
+
const raw = await fs.readFile(a2uiPath, 'utf8');
|
|
76
|
+
const data = JSON.parse(raw);
|
|
77
|
+
if (data?.title) _componentData.set(data.title, data);
|
|
78
|
+
} catch {
|
|
79
|
+
// No .a2ui.json for this component — skip
|
|
80
|
+
}
|
|
81
|
+
// §172 (v0.5.4): also pick up SIBLING .a2ui.json files in the same
|
|
82
|
+
// component dir. Some components live as sibling files inside a
|
|
83
|
+
// parent's folder (e.g. <chat-input-ui> in components/chat-thread/).
|
|
84
|
+
// Pre-§172 these were invisible to the retrieval catalog +
|
|
85
|
+
// system-prompt's getComponentData() lookup, causing the LLM to emit
|
|
86
|
+
// them without schema awareness (e.g. the 2026-05-14 redundant-send-
|
|
87
|
+
// button regression on ChatInput). The build scanner gained the same
|
|
88
|
+
// sibling-discovery treatment in `scripts/build/components.mjs`.
|
|
89
|
+
try {
|
|
90
|
+
const sibs = await fs.readdir(path.join(componentsDir, compEntry.name), { withFileTypes: true });
|
|
91
|
+
for (const s of sibs) {
|
|
92
|
+
if (!s.isFile() || !s.name.endsWith('.a2ui.json')) continue;
|
|
93
|
+
if (s.name === `${compEntry.name}.a2ui.json`) continue; // already loaded
|
|
94
|
+
try {
|
|
95
|
+
const raw = await fs.readFile(path.join(componentsDir, compEntry.name, s.name), 'utf8');
|
|
96
|
+
const data = JSON.parse(raw);
|
|
97
|
+
if (data?.title) _componentData.set(data.title, data);
|
|
98
|
+
} catch {
|
|
99
|
+
// skip malformed sibling sidecar
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
} catch {
|
|
103
|
+
// skip on read error
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async function _loadBrowser() {
|
|
109
|
+
if (!_globA2UIModules) return;
|
|
110
|
+
|
|
111
|
+
for (const [, loader] of Object.entries(_globA2UIModules)) {
|
|
112
|
+
try {
|
|
113
|
+
const raw = await loader();
|
|
114
|
+
const data = JSON.parse(raw);
|
|
115
|
+
if (data?.title) _componentData.set(data.title, data);
|
|
116
|
+
} catch {
|
|
117
|
+
// skip malformed .a2ui.json
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function _loadStatic() {
|
|
123
|
+
if (!_CONSOLIDATED_CATALOG_URL) return;
|
|
124
|
+
try {
|
|
125
|
+
const res = await fetch(_CONSOLIDATED_CATALOG_URL);
|
|
126
|
+
if (!res.ok) return;
|
|
127
|
+
const catalog = await res.json();
|
|
128
|
+
const comps = catalog?.components;
|
|
129
|
+
if (!comps || typeof comps !== 'object') return;
|
|
130
|
+
for (const data of Object.values(comps)) {
|
|
131
|
+
if (data?.title) _componentData.set(data.title, data);
|
|
132
|
+
}
|
|
133
|
+
} catch {
|
|
134
|
+
// Consolidated catalog not present / unparseable — leave empty.
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export async function loadCatalog() {
|
|
139
|
+
if (_loaded) return;
|
|
140
|
+
if (_loadPromise) return _loadPromise;
|
|
141
|
+
_loadPromise = (async () => {
|
|
142
|
+
if (IS_NODE) await _loadNode();
|
|
143
|
+
else if (HAS_VITE_GLOB) await _loadBrowser();
|
|
144
|
+
else await _loadStatic();
|
|
145
|
+
})();
|
|
146
|
+
await _loadPromise;
|
|
147
|
+
_loaded = true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Eager load on module import so the synchronous getters below are safe.
|
|
151
|
+
await loadCatalog();
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Get `.a2ui.json` data for a named component.
|
|
155
|
+
* @param {string} name — PascalCase component name (e.g., "Swiper")
|
|
156
|
+
* @returns {object|null} raw .a2ui.json document, or null
|
|
157
|
+
*/
|
|
158
|
+
export function getComponentData(name) {
|
|
159
|
+
return _componentData.get(name) || null;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Get all loaded `.a2ui.json` component data.
|
|
164
|
+
* @returns {Object.<string, object>} component name → .a2ui.json data
|
|
165
|
+
*/
|
|
166
|
+
export function getAllComponentData() {
|
|
167
|
+
return Object.fromEntries(_componentData);
|
|
168
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ComponentEntry — Detail level serialization for catalog entries.
|
|
3
|
+
*
|
|
4
|
+
* Three progressive-disclosure levels:
|
|
5
|
+
* Index (~10 tokens): { type, tag, category }
|
|
6
|
+
* Summary (~50 tokens): index + { description, properties: [names] }
|
|
7
|
+
* Reference (~200 tokens): summary + { properties: [full], slots, events, children, tokens }
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** @typedef {'index' | 'summary' | 'reference'} DetailLevel */
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Serialize a component entry to the requested detail level.
|
|
14
|
+
*
|
|
15
|
+
* @param {object} entry — Full component entry from the catalog
|
|
16
|
+
* @param {DetailLevel} level — Detail level
|
|
17
|
+
* @returns {object} — Serialized entry at the requested level
|
|
18
|
+
*/
|
|
19
|
+
export function serializeEntry(entry, level = 'index') {
|
|
20
|
+
if (level === 'index') return serializeIndex(entry);
|
|
21
|
+
if (level === 'summary') return serializeSummary(entry);
|
|
22
|
+
return serializeReference(entry);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function serializeIndex(entry) {
|
|
26
|
+
return {
|
|
27
|
+
type: entry.type,
|
|
28
|
+
tag: entry.tag,
|
|
29
|
+
category: entry.category,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function serializeSummary(entry) {
|
|
34
|
+
const index = serializeIndex(entry);
|
|
35
|
+
const result = {
|
|
36
|
+
...index,
|
|
37
|
+
description: entry.description || '',
|
|
38
|
+
};
|
|
39
|
+
if (entry.schema?.properties) {
|
|
40
|
+
result.properties = Object.keys(entry.schema.properties);
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function serializeReference(entry) {
|
|
46
|
+
const summary = serializeSummary(entry);
|
|
47
|
+
const schema = entry.schema;
|
|
48
|
+
if (!schema) return summary;
|
|
49
|
+
|
|
50
|
+
const result = { ...summary };
|
|
51
|
+
|
|
52
|
+
// Full property definitions
|
|
53
|
+
if (schema.properties) {
|
|
54
|
+
result.properties = Object.entries(schema.properties).map(([name, def]) => ({
|
|
55
|
+
name,
|
|
56
|
+
type: def.type,
|
|
57
|
+
...(def.enum ? { enum: def.enum } : {}),
|
|
58
|
+
...(def.default !== undefined ? { default: def.default } : {}),
|
|
59
|
+
...(def.description ? { description: def.description } : {}),
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (schema.slots && Object.keys(schema.slots).length > 0) {
|
|
64
|
+
result.slots = schema.slots;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (schema.events && Object.keys(schema.events).length > 0) {
|
|
68
|
+
result.events = schema.events;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (schema.children) {
|
|
72
|
+
result.children = schema.children;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (schema.tokens) {
|
|
76
|
+
result.tokens = schema.tokens;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Assembler — Progressive-disclosure context packaging with token budgets.
|
|
3
|
+
*
|
|
4
|
+
* Assembles context at 5 budget tiers, combining component entries,
|
|
5
|
+
* domain-relevant patterns, and anti-patterns within token limits.
|
|
6
|
+
*
|
|
7
|
+
* Token estimation: ~1 token per 4 characters of JSON output.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { getCatalog, getComponentsByCategory } from './catalog.js';
|
|
11
|
+
import { serializeEntry } from './component-entry.js';
|
|
12
|
+
import { classifyIntent, getDomain } from './domain-router.js';
|
|
13
|
+
import { getAntiPatterns } from './anti-patterns.js';
|
|
14
|
+
import {
|
|
15
|
+
searchAll as searchCompositions,
|
|
16
|
+
getComposition,
|
|
17
|
+
getAllCompositions,
|
|
18
|
+
} from '../compose/strategies/zettel/composition-library.js';
|
|
19
|
+
|
|
20
|
+
/** Token budget per tier */
|
|
21
|
+
const TIER_BUDGETS = {
|
|
22
|
+
0: 500,
|
|
23
|
+
1: 2000,
|
|
24
|
+
2: 5000,
|
|
25
|
+
3: 10000,
|
|
26
|
+
4: 20000,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Estimate token count from a JavaScript value (serialized as JSON).
|
|
31
|
+
* @param {*} value
|
|
32
|
+
* @returns {number}
|
|
33
|
+
*/
|
|
34
|
+
function estimateTokens(value) {
|
|
35
|
+
const json = JSON.stringify(value);
|
|
36
|
+
return Math.ceil(json.length / 4);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Assemble context for a given intent at a specific budget tier.
|
|
41
|
+
*
|
|
42
|
+
* @param {object} options
|
|
43
|
+
* @param {string} [options.intent] — Natural language intent (used for domain classification)
|
|
44
|
+
* @param {number} [options.tier=1] — Budget tier (0-4)
|
|
45
|
+
* @param {string} [options.domain] — Override domain (skips classification)
|
|
46
|
+
* @returns {{ components: object[], patterns: object[], antiPatterns: object[], domain: object, estimatedTokens: number }}
|
|
47
|
+
*/
|
|
48
|
+
export async function assembleContext({ intent = '', tier = 1, domain: overrideDomain } = {}) {
|
|
49
|
+
const budget = TIER_BUDGETS[tier] ?? TIER_BUDGETS[1];
|
|
50
|
+
|
|
51
|
+
// Classify domain
|
|
52
|
+
const classification = intent ? classifyIntent(intent) : null;
|
|
53
|
+
const domainName = overrideDomain || classification?.domain || 'layout';
|
|
54
|
+
const domainConfig = getDomain(domainName);
|
|
55
|
+
|
|
56
|
+
let usedTokens = 0;
|
|
57
|
+
const result = {
|
|
58
|
+
components: [],
|
|
59
|
+
patterns: [],
|
|
60
|
+
antiPatterns: [],
|
|
61
|
+
domain: {
|
|
62
|
+
name: domainName,
|
|
63
|
+
confidence: classification?.confidence ?? 1,
|
|
64
|
+
matchedSignals: classification?.matchedSignals ?? [],
|
|
65
|
+
},
|
|
66
|
+
estimatedTokens: 0,
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// Account for domain metadata
|
|
70
|
+
usedTokens += estimateTokens(result.domain);
|
|
71
|
+
|
|
72
|
+
const catalog = await getCatalog();
|
|
73
|
+
|
|
74
|
+
// ── Tier 0: Component index only ──
|
|
75
|
+
if (tier === 0) {
|
|
76
|
+
for (const entry of catalog.entries.values()) {
|
|
77
|
+
const serialized = serializeEntry(entry, 'index');
|
|
78
|
+
const cost = estimateTokens(serialized);
|
|
79
|
+
if (usedTokens + cost > budget) break;
|
|
80
|
+
result.components.push(serialized);
|
|
81
|
+
usedTokens += cost;
|
|
82
|
+
}
|
|
83
|
+
result.estimatedTokens = usedTokens;
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ── Tier 1+: Domain-relevant summaries first ──
|
|
88
|
+
const domainComponents = domainConfig?.components || [];
|
|
89
|
+
const addedTypes = new Set();
|
|
90
|
+
|
|
91
|
+
// Add domain-relevant components as summaries
|
|
92
|
+
for (const typeName of domainComponents) {
|
|
93
|
+
const entry = findEntry(catalog, typeName);
|
|
94
|
+
if (!entry) continue;
|
|
95
|
+
|
|
96
|
+
const level = tier >= 2 ? 'reference' : 'summary';
|
|
97
|
+
const serialized = serializeEntry(entry, level);
|
|
98
|
+
const cost = estimateTokens(serialized);
|
|
99
|
+
if (usedTokens + cost > budget) break;
|
|
100
|
+
|
|
101
|
+
result.components.push(serialized);
|
|
102
|
+
addedTypes.add(entry.type);
|
|
103
|
+
usedTokens += cost;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ── Tier 2+: Fill remaining budget with other components ──
|
|
107
|
+
if (tier >= 2) {
|
|
108
|
+
for (const entry of catalog.entries.values()) {
|
|
109
|
+
if (addedTypes.has(entry.type)) continue;
|
|
110
|
+
|
|
111
|
+
const level = tier >= 3 ? 'reference' : 'summary';
|
|
112
|
+
const serialized = serializeEntry(entry, level);
|
|
113
|
+
const cost = estimateTokens(serialized);
|
|
114
|
+
if (usedTokens + cost > budget) break;
|
|
115
|
+
|
|
116
|
+
result.components.push(serialized);
|
|
117
|
+
addedTypes.add(entry.type);
|
|
118
|
+
usedTokens += cost;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// ── Tier 1+: Add anti-patterns ──
|
|
123
|
+
if (tier >= 1) {
|
|
124
|
+
const ap = getAntiPatterns();
|
|
125
|
+
const apCost = estimateTokens(ap);
|
|
126
|
+
if (usedTokens + apCost <= budget) {
|
|
127
|
+
result.antiPatterns = ap;
|
|
128
|
+
usedTokens += apCost;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ── Tier 3+: Add matching compositions ──
|
|
133
|
+
// §64 migrated from pattern-library to composition-library. Compositions
|
|
134
|
+
// are the canonical retrieval surface post-§65.
|
|
135
|
+
if (tier >= 3) {
|
|
136
|
+
const matchedCompositions = intent
|
|
137
|
+
? searchCompositions(intent).map((hit) => getComposition(hit.name)).filter(Boolean)
|
|
138
|
+
: getAllCompositions().filter((c) => c.domain === domainName);
|
|
139
|
+
|
|
140
|
+
for (const composition of matchedCompositions) {
|
|
141
|
+
const cost = estimateTokens(composition);
|
|
142
|
+
if (usedTokens + cost > budget) break;
|
|
143
|
+
result.patterns.push(composition);
|
|
144
|
+
usedTokens += cost;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// ── Tier 4: Full exploration — add remaining compositions ──
|
|
149
|
+
if (tier >= 4) {
|
|
150
|
+
const added = new Set(result.patterns.map((c) => c.name));
|
|
151
|
+
for (const composition of getAllCompositions()) {
|
|
152
|
+
if (added.has(composition.name)) continue;
|
|
153
|
+
const cost = estimateTokens(composition);
|
|
154
|
+
if (usedTokens + cost > budget) break;
|
|
155
|
+
result.patterns.push(composition);
|
|
156
|
+
usedTokens += cost;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
result.estimatedTokens = usedTokens;
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Find an entry in the catalog by type name.
|
|
166
|
+
*/
|
|
167
|
+
function findEntry(catalog, typeName) {
|
|
168
|
+
if (catalog.entries.has(typeName)) return catalog.entries.get(typeName);
|
|
169
|
+
// Search by tag fallback
|
|
170
|
+
for (const entry of catalog.entries.values()) {
|
|
171
|
+
if (entry.type === typeName) return entry;
|
|
172
|
+
}
|
|
173
|
+
return null;
|
|
174
|
+
}
|