@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.
Files changed (631) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +77 -0
  3. package/compose/CHANGELOG.md +1707 -0
  4. package/compose/README.md +215 -0
  5. package/compose/core/artifacts.js +262 -0
  6. package/compose/core/context-store.js +218 -0
  7. package/compose/core/generator.d.ts +4 -0
  8. package/compose/core/generator.js +602 -0
  9. package/compose/core/pipeline/engine.js +289 -0
  10. package/compose/core/pipeline/types.js +91 -0
  11. package/compose/core/plan-primitives.js +120 -0
  12. package/compose/core/plan-turn.js +145 -0
  13. package/compose/core/reference.js +150 -0
  14. package/compose/core/state.js +15 -0
  15. package/compose/evals/harness.d.ts +4 -0
  16. package/compose/evals/harness.mjs +193 -0
  17. package/compose/index.d.ts +4 -0
  18. package/compose/index.js +16 -0
  19. package/compose/shared/validate-and-repair.js +122 -0
  20. package/compose/strategies/_shared/chunk-loader.js +282 -0
  21. package/compose/strategies/cascade.d.ts +67 -0
  22. package/compose/strategies/cascade.js +165 -0
  23. package/compose/strategies/escalation.d.ts +13 -0
  24. package/compose/strategies/escalation.js +132 -0
  25. package/compose/strategies/free-form-composer/index.js +254 -0
  26. package/compose/strategies/free-form-composer/system-prompt.js +205 -0
  27. package/compose/strategies/free-form-composer/transpile.js +279 -0
  28. package/compose/strategies/monolithic/_shared.js +1619 -0
  29. package/compose/strategies/monolithic/generate-instant.js +228 -0
  30. package/compose/strategies/monolithic/generate-pro.js +490 -0
  31. package/compose/strategies/monolithic/generate-thinking.js +206 -0
  32. package/compose/strategies/registry.d.ts +20 -0
  33. package/compose/strategies/registry.js +495 -0
  34. package/compose/strategies/zettel/_smoke.js +27 -0
  35. package/compose/strategies/zettel/chunk-composer.js +214 -0
  36. package/compose/strategies/zettel/chunk-refiner.js +582 -0
  37. package/compose/strategies/zettel/chunk-synthesizer.js +458 -0
  38. package/compose/strategies/zettel/composer.js +78 -0
  39. package/compose/strategies/zettel/composition-library.js +418 -0
  40. package/compose/strategies/zettel/generate.js +15 -0
  41. package/compose/strategies/zettel/generator-adapter.d.ts +4 -0
  42. package/compose/strategies/zettel/generator-adapter.js +242 -0
  43. package/compose/strategies/zettel/issue-reporter.js +607 -0
  44. package/compose/strategies/zettel/session-store.js +121 -0
  45. package/compose/strategies/zettel/state-cache.js +158 -0
  46. package/compose/transpiler/transpiler-maps.js +675 -0
  47. package/compose/transpiler/transpiler.d.ts +4 -0
  48. package/compose/transpiler/transpiler.js +962 -0
  49. package/corpus/CHANGELOG.md +1957 -0
  50. package/corpus/README.md +279 -0
  51. package/corpus/catalog-a2ui_0_9.d.ts +4 -0
  52. package/corpus/catalog-a2ui_0_9.json +29571 -0
  53. package/corpus/catalog-a2ui_0_9_rules.txt +1215 -0
  54. package/corpus/chunk-embeddings.d.ts +4 -0
  55. package/corpus/chunk-embeddings.json +1 -0
  56. package/corpus/chunks/_index.json +16658 -0
  57. package/corpus/chunks/_source-hashes.json +571 -0
  58. package/corpus/chunks/access-denied-with-request.json +124 -0
  59. package/corpus/chunks/access-request-form.json +166 -0
  60. package/corpus/chunks/access-request-pending.json +133 -0
  61. package/corpus/chunks/accordion-settings.json +176 -0
  62. package/corpus/chunks/achievement-badges.json +413 -0
  63. package/corpus/chunks/achievement-unlock.json +104 -0
  64. package/corpus/chunks/action-list-record-actions.json +84 -0
  65. package/corpus/chunks/activity-feed.json +390 -0
  66. package/corpus/chunks/admin-page-header-flush.json +83 -0
  67. package/corpus/chunks/admin-page-header-title-description.json +80 -0
  68. package/corpus/chunks/admin-page-header-with-actions.json +107 -0
  69. package/corpus/chunks/admin-page-header-with-tabs.json +144 -0
  70. package/corpus/chunks/admin-shell-rounded-borderless.json +287 -0
  71. package/corpus/chunks/admin-shell-standard.json +310 -0
  72. package/corpus/chunks/admin-sidebar-brand-signin.json +158 -0
  73. package/corpus/chunks/admin-sidebar-brand-version.json +130 -0
  74. package/corpus/chunks/admin-sidebar-flat-nav.json +131 -0
  75. package/corpus/chunks/admin-sidebar-nav-dividers.json +150 -0
  76. package/corpus/chunks/admin-sidebar-nav-groups.json +171 -0
  77. package/corpus/chunks/admin-sidebar-workspace-switcher.json +139 -0
  78. package/corpus/chunks/admin-topbar-breadcrumb-actions.json +130 -0
  79. package/corpus/chunks/admin-topbar-breadcrumb-minimal.json +79 -0
  80. package/corpus/chunks/admin-topbar-deep-breadcrumb.json +129 -0
  81. package/corpus/chunks/admin-topbar-search.json +104 -0
  82. package/corpus/chunks/admin-topbar-status-indicator.json +122 -0
  83. package/corpus/chunks/admin-topbar-trailing-toggle.json +114 -0
  84. package/corpus/chunks/agent-activity-feed.json +163 -0
  85. package/corpus/chunks/agent-artifact-stub-card.json +115 -0
  86. package/corpus/chunks/agent-canvas-shell.json +305 -0
  87. package/corpus/chunks/agent-citations-source-chips.json +82 -0
  88. package/corpus/chunks/agent-command-palette-search.json +120 -0
  89. package/corpus/chunks/agent-cost-detailed.json +260 -0
  90. package/corpus/chunks/agent-cost-inline.json +78 -0
  91. package/corpus/chunks/agent-memory-detail.json +181 -0
  92. package/corpus/chunks/agent-memory-editor.json +173 -0
  93. package/corpus/chunks/agent-memory-list.json +207 -0
  94. package/corpus/chunks/agent-pipeline-status-stages.json +61 -0
  95. package/corpus/chunks/agent-prompt-card.json +179 -0
  96. package/corpus/chunks/agent-prompt-library-grid.json +341 -0
  97. package/corpus/chunks/agent-prompt-picker.json +282 -0
  98. package/corpus/chunks/agent-rate-limit.json +100 -0
  99. package/corpus/chunks/agent-reasoning-collapsed.json +128 -0
  100. package/corpus/chunks/agent-tool-call-accordion.json +109 -0
  101. package/corpus/chunks/agent-tool-call-collapsed.json +98 -0
  102. package/corpus/chunks/agent-tool-call-error.json +112 -0
  103. package/corpus/chunks/agent-tool-call-result.json +145 -0
  104. package/corpus/chunks/agent-tool-call-running.json +85 -0
  105. package/corpus/chunks/agent-tool-call-success.json +137 -0
  106. package/corpus/chunks/agent-trace-timeline.json +244 -0
  107. package/corpus/chunks/ai-streaming-response.json +147 -0
  108. package/corpus/chunks/alert-banner-stack.json +78 -0
  109. package/corpus/chunks/alert-banner.json +55 -0
  110. package/corpus/chunks/alert-dialog-simple.json +72 -0
  111. package/corpus/chunks/alert-dialog-typed.json +107 -0
  112. package/corpus/chunks/alert-dialog-unsaved.json +81 -0
  113. package/corpus/chunks/analytics-chart.json +213 -0
  114. package/corpus/chunks/analytics-sparklines-dashboard.json +259 -0
  115. package/corpus/chunks/anchor-bar-selection-bar.json +226 -0
  116. package/corpus/chunks/api-key-table.json +148 -0
  117. package/corpus/chunks/api-keys-create.json +140 -0
  118. package/corpus/chunks/api-keys-list.json +271 -0
  119. package/corpus/chunks/app-nav-badges-counts.json +77 -0
  120. package/corpus/chunks/app-nav-badges-group-rollup-badges.json +100 -0
  121. package/corpus/chunks/app-nav-badges-plan-tiers.json +76 -0
  122. package/corpus/chunks/app-nav-badges-status-callouts.json +75 -0
  123. package/corpus/chunks/app-nav-full-example.json +195 -0
  124. package/corpus/chunks/app-nav-groups.json +103 -0
  125. package/corpus/chunks/app-nav-items.json +74 -0
  126. package/corpus/chunks/app-nav-labels-and-dividers.json +92 -0
  127. package/corpus/chunks/app-nav-spacer.json +77 -0
  128. package/corpus/chunks/app-product-listing-card.json +214 -0
  129. package/corpus/chunks/approvals-detail.json +240 -0
  130. package/corpus/chunks/approvals-queue.json +321 -0
  131. package/corpus/chunks/audit-log-basic.json +184 -0
  132. package/corpus/chunks/audit-log.json +174 -0
  133. package/corpus/chunks/auth-account-deleted-actions.json +51 -0
  134. package/corpus/chunks/auth-account-deleted.json +202 -0
  135. package/corpus/chunks/auth-card-content.json +260 -0
  136. package/corpus/chunks/auth-card-header.json +205 -0
  137. package/corpus/chunks/auth-email-entry.json +65 -0
  138. package/corpus/chunks/auth-email-verify-confirm.json +52 -0
  139. package/corpus/chunks/auth-email-verify.json +196 -0
  140. package/corpus/chunks/auth-forbidden-actions.json +59 -0
  141. package/corpus/chunks/auth-forbidden.json +203 -0
  142. package/corpus/chunks/auth-invite-actions.json +49 -0
  143. package/corpus/chunks/auth-invite-team-card.json +86 -0
  144. package/corpus/chunks/auth-link-expired-form.json +65 -0
  145. package/corpus/chunks/auth-link-expired.json +196 -0
  146. package/corpus/chunks/auth-locked-account.json +211 -0
  147. package/corpus/chunks/auth-locked-recovery-options.json +60 -0
  148. package/corpus/chunks/auth-mfa-enrollment-submit.json +54 -0
  149. package/corpus/chunks/auth-mfa-enrollment.json +284 -0
  150. package/corpus/chunks/auth-mfa-fallback-actions.json +52 -0
  151. package/corpus/chunks/auth-mfa-recovery.json +61 -0
  152. package/corpus/chunks/auth-new-password-form.json +75 -0
  153. package/corpus/chunks/auth-new-password.json +217 -0
  154. package/corpus/chunks/auth-oauth-fallback-actions.json +52 -0
  155. package/corpus/chunks/auth-oauth-interstitial.json +160 -0
  156. package/corpus/chunks/auth-password-challenge.json +94 -0
  157. package/corpus/chunks/auth-password-reset-form.json +64 -0
  158. package/corpus/chunks/auth-password-reset.json +195 -0
  159. package/corpus/chunks/auth-profile-form.json +72 -0
  160. package/corpus/chunks/auth-profile-setup.json +194 -0
  161. package/corpus/chunks/auth-reset-sent.json +188 -0
  162. package/corpus/chunks/auth-session-expired-actions.json +52 -0
  163. package/corpus/chunks/auth-session-expired.json +201 -0
  164. package/corpus/chunks/auth-signin-card-email.json +245 -0
  165. package/corpus/chunks/auth-signin-card-magic-link.json +147 -0
  166. package/corpus/chunks/auth-signin-card-mfa.json +231 -0
  167. package/corpus/chunks/auth-signin-card-otp.json +205 -0
  168. package/corpus/chunks/auth-signin-card-password.json +264 -0
  169. package/corpus/chunks/auth-signin-card-recovery.json +218 -0
  170. package/corpus/chunks/auth-signout-actions.json +51 -0
  171. package/corpus/chunks/auth-signout.json +184 -0
  172. package/corpus/chunks/auth-signup-email-entry.json +66 -0
  173. package/corpus/chunks/auth-signup-entry.json +281 -0
  174. package/corpus/chunks/auth-signup-social-auths.json +54 -0
  175. package/corpus/chunks/auth-signup-verify.json +227 -0
  176. package/corpus/chunks/auth-social-auths.json +62 -0
  177. package/corpus/chunks/auth-sso-providers.json +55 -0
  178. package/corpus/chunks/auth-sso-required.json +213 -0
  179. package/corpus/chunks/auth-team-invite.json +288 -0
  180. package/corpus/chunks/avatar-group-overflow.json +137 -0
  181. package/corpus/chunks/avatar-stack-overflow.json +124 -0
  182. package/corpus/chunks/banner-announcement-beta.json +99 -0
  183. package/corpus/chunks/banner-announcement-promo.json +102 -0
  184. package/corpus/chunks/banner-live-update.json +102 -0
  185. package/corpus/chunks/banner-system-maintenance.json +101 -0
  186. package/corpus/chunks/banner-system-offline.json +85 -0
  187. package/corpus/chunks/banner-system-update.json +102 -0
  188. package/corpus/chunks/bell-menu-empty.json +107 -0
  189. package/corpus/chunks/bell-menu-unread.json +395 -0
  190. package/corpus/chunks/billing-cancel-subscription-danger.json +61 -0
  191. package/corpus/chunks/billing-invoice-history-table.json +75 -0
  192. package/corpus/chunks/billing-overview.json +202 -0
  193. package/corpus/chunks/billing-payment-method-card-on-file.json +157 -0
  194. package/corpus/chunks/billing-progress-label.json +101 -0
  195. package/corpus/chunks/blog-post-card.json +212 -0
  196. package/corpus/chunks/breadcrumb-navigation.json +72 -0
  197. package/corpus/chunks/bulk-action-toolbar-floating.json +199 -0
  198. package/corpus/chunks/bulk-action-toolbar-swap.json +158 -0
  199. package/corpus/chunks/bulk-selection-actions-bar.json +162 -0
  200. package/corpus/chunks/business-address-form.json +953 -0
  201. package/corpus/chunks/calendar-month-view.json +74 -0
  202. package/corpus/chunks/card-grid-images.json +459 -0
  203. package/corpus/chunks/card-header-with-description.json +47 -0
  204. package/corpus/chunks/card-with-empty-state.json +96 -0
  205. package/corpus/chunks/card-with-form.json +143 -0
  206. package/corpus/chunks/card-with-sparkline.json +90 -0
  207. package/corpus/chunks/card-with-stat-kpi.json +86 -0
  208. package/corpus/chunks/changelog-feed-basic.json +470 -0
  209. package/corpus/chunks/chart-in-card-chart-plus-breakdown.json +188 -0
  210. package/corpus/chunks/chart-in-card-chart-plus-stat.json +89 -0
  211. package/corpus/chunks/chart-in-card-chart-with-filter-pills.json +124 -0
  212. package/corpus/chunks/chart-in-card-full-bleed-legend.json +116 -0
  213. package/corpus/chunks/chart-in-card-full-chart.json +107 -0
  214. package/corpus/chunks/chart-in-card-sparkline-tile.json +93 -0
  215. package/corpus/chunks/chart-in-card-stat-with-sparkline.json +73 -0
  216. package/corpus/chunks/chart-in-card-trend-footer.json +115 -0
  217. package/corpus/chunks/chart-with-filter-pills.json +169 -0
  218. package/corpus/chunks/chat-empty-state-hero.json +102 -0
  219. package/corpus/chunks/chat-message-assistant-byline.json +85 -0
  220. package/corpus/chunks/chat-message-user-byline.json +84 -0
  221. package/corpus/chunks/chat-page-shell.json +379 -0
  222. package/corpus/chunks/chat-streaming-surface.json +169 -0
  223. package/corpus/chunks/checkout-order-summary-card.json +140 -0
  224. package/corpus/chunks/code-snippet.json +107 -0
  225. package/corpus/chunks/col-form-stack.json +93 -0
  226. package/corpus/chunks/col-heading-body-action.json +79 -0
  227. package/corpus/chunks/col-stat-label.json +63 -0
  228. package/corpus/chunks/color-picker-swatches.json +153 -0
  229. package/corpus/chunks/command-palette.json +327 -0
  230. package/corpus/chunks/comments-composer.json +158 -0
  231. package/corpus/chunks/comments-mention-menu.json +237 -0
  232. package/corpus/chunks/comments-thread.json +344 -0
  233. package/corpus/chunks/commerce-pricing-tiers.json +401 -0
  234. package/corpus/chunks/comparison-table.json +246 -0
  235. package/corpus/chunks/contact-form-card.json +197 -0
  236. package/corpus/chunks/contact-form.json +157 -0
  237. package/corpus/chunks/contact-support-form.json +702 -0
  238. package/corpus/chunks/conversion-funnel-4-step-funnel.json +139 -0
  239. package/corpus/chunks/conversion-funnel-6step.json +151 -0
  240. package/corpus/chunks/conversion-funnel-wide-summary.json +192 -0
  241. package/corpus/chunks/conversion-funnel-with-segment-compare.json +202 -0
  242. package/corpus/chunks/cta-banner-centered.json +102 -0
  243. package/corpus/chunks/dashboard-acquisition-panel.json +212 -0
  244. package/corpus/chunks/dashboard-admin-page.json +104 -0
  245. package/corpus/chunks/dashboard-audience-kpis.json +165 -0
  246. package/corpus/chunks/dashboard-audience-panel.json +756 -0
  247. package/corpus/chunks/dashboard-behavior-panel.json +114 -0
  248. package/corpus/chunks/dashboard-chart-recent.json +566 -0
  249. package/corpus/chunks/dashboard-cohort-retention.json +83 -0
  250. package/corpus/chunks/dashboard-conversion-panel.json +234 -0
  251. package/corpus/chunks/dashboard-country-list.json +304 -0
  252. package/corpus/chunks/dashboard-filter-bar.json +118 -0
  253. package/corpus/chunks/dashboard-funnel.json +142 -0
  254. package/corpus/chunks/dashboard-notifications-panel.json +423 -0
  255. package/corpus/chunks/dashboard-overview-panel.json +1644 -0
  256. package/corpus/chunks/dashboard-page-header.json +166 -0
  257. package/corpus/chunks/dashboard-pages-table.json +86 -0
  258. package/corpus/chunks/dashboard-quick-actions.json +116 -0
  259. package/corpus/chunks/dashboard-reports-panel.json +166 -0
  260. package/corpus/chunks/dashboard-reports-table.json +138 -0
  261. package/corpus/chunks/dashboard-storage-card.json +117 -0
  262. package/corpus/chunks/dashboard-tabs.json +86 -0
  263. package/corpus/chunks/dashboard-team-actions-storage.json +605 -0
  264. package/corpus/chunks/dashboard-team-list.json +334 -0
  265. package/corpus/chunks/dashboard-traffic-channels.json +184 -0
  266. package/corpus/chunks/dashboard-transactions-table.json +145 -0
  267. package/corpus/chunks/data-export-history.json +192 -0
  268. package/corpus/chunks/data-export-request.json +197 -0
  269. package/corpus/chunks/data-import-wizard.json +391 -0
  270. package/corpus/chunks/date-range-picker.json +156 -0
  271. package/corpus/chunks/date-time-picker-form.json +222 -0
  272. package/corpus/chunks/departments-checkbox-form.json +390 -0
  273. package/corpus/chunks/destructive-confirm-modal.json +149 -0
  274. package/corpus/chunks/diff-inline.json +84 -0
  275. package/corpus/chunks/diff-side-by-side.json +131 -0
  276. package/corpus/chunks/diff-structured.json +216 -0
  277. package/corpus/chunks/digest-email-preview.json +374 -0
  278. package/corpus/chunks/divider-text-label.json +87 -0
  279. package/corpus/chunks/doc-editor-shell.json +356 -0
  280. package/corpus/chunks/drawer-2fa-key.json +273 -0
  281. package/corpus/chunks/drawer-2fa-sms.json +261 -0
  282. package/corpus/chunks/drawer-2fa-totp.json +385 -0
  283. package/corpus/chunks/drawer-cancel-sub.json +636 -0
  284. package/corpus/chunks/drawer-change-plan.json +561 -0
  285. package/corpus/chunks/drawer-custom-roles.json +696 -0
  286. package/corpus/chunks/drawer-data-start.json +171 -0
  287. package/corpus/chunks/drawer-delete-account.json +341 -0
  288. package/corpus/chunks/drawer-delete-workspace.json +362 -0
  289. package/corpus/chunks/drawer-discord.json +434 -0
  290. package/corpus/chunks/drawer-figma.json +401 -0
  291. package/corpus/chunks/drawer-first-dashboard.json +220 -0
  292. package/corpus/chunks/drawer-gcal.json +475 -0
  293. package/corpus/chunks/drawer-github.json +589 -0
  294. package/corpus/chunks/drawer-invite.json +397 -0
  295. package/corpus/chunks/drawer-record-detail.json +44 -0
  296. package/corpus/chunks/drawer-report.json +528 -0
  297. package/corpus/chunks/drawer-revoke-session.json +331 -0
  298. package/corpus/chunks/drawer-role.json +190 -0
  299. package/corpus/chunks/drawer-slack.json +429 -0
  300. package/corpus/chunks/drawer-smtp.json +476 -0
  301. package/corpus/chunks/drawer-source.json +294 -0
  302. package/corpus/chunks/drawer-transaction.json +493 -0
  303. package/corpus/chunks/drawer-with-create-form.json +43 -0
  304. package/corpus/chunks/editor-code-pane.json +204 -0
  305. package/corpus/chunks/editor-page-shell.json +149 -0
  306. package/corpus/chunks/editor-preview-pane.json +136 -0
  307. package/corpus/chunks/editor-statusbar-ready.json +99 -0
  308. package/corpus/chunks/editor-toolbar-import-export.json +195 -0
  309. package/corpus/chunks/email-inbox-list.json +678 -0
  310. package/corpus/chunks/empty-state-danger.json +58 -0
  311. package/corpus/chunks/empty-state-minimal.json +44 -0
  312. package/corpus/chunks/empty-state-warning.json +53 -0
  313. package/corpus/chunks/empty-state.json +65 -0
  314. package/corpus/chunks/error-404-actions.json +54 -0
  315. package/corpus/chunks/error-404.json +204 -0
  316. package/corpus/chunks/error-500-actions.json +61 -0
  317. package/corpus/chunks/error-500.json +220 -0
  318. package/corpus/chunks/error-maintenance-actions.json +53 -0
  319. package/corpus/chunks/error-maintenance.json +203 -0
  320. package/corpus/chunks/error-page-shell.json +132 -0
  321. package/corpus/chunks/export-flow-async.json +210 -0
  322. package/corpus/chunks/export-flow-delivery.json +163 -0
  323. package/corpus/chunks/export-flow-sync.json +162 -0
  324. package/corpus/chunks/extended-profile-form.json +512 -0
  325. package/corpus/chunks/faq-accordion.json +123 -0
  326. package/corpus/chunks/feature-grid-icons.json +314 -0
  327. package/corpus/chunks/feature-grid-three-cards.json +187 -0
  328. package/corpus/chunks/feature-toggle-switch-grid.json +213 -0
  329. package/corpus/chunks/file-upload-dnd.json +166 -0
  330. package/corpus/chunks/file-upload-field.json +97 -0
  331. package/corpus/chunks/file-upload-form.json +251 -0
  332. package/corpus/chunks/filter-bar-active-filters.json +176 -0
  333. package/corpus/chunks/filter-bar-filter-bar-with-table.json +113 -0
  334. package/corpus/chunks/filter-bar-saved-views.json +117 -0
  335. package/corpus/chunks/filter-popover-form.json +137 -0
  336. package/corpus/chunks/footer-multi-column.json +270 -0
  337. package/corpus/chunks/footer-primary-only.json +41 -0
  338. package/corpus/chunks/form-checkbox-group.json +65 -0
  339. package/corpus/chunks/form-drawer-edit-form.json +178 -0
  340. package/corpus/chunks/form-drawer-simple-form.json +151 -0
  341. package/corpus/chunks/form-drawer-tall-form.json +325 -0
  342. package/corpus/chunks/form-field-email-hint.json +53 -0
  343. package/corpus/chunks/form-field-range.json +54 -0
  344. package/corpus/chunks/form-field-required.json +52 -0
  345. package/corpus/chunks/form-field-select.json +66 -0
  346. package/corpus/chunks/form-field-textarea.json +51 -0
  347. package/corpus/chunks/form-field-with-error.json +151 -0
  348. package/corpus/chunks/form-fields-two-column.json +69 -0
  349. package/corpus/chunks/form-page-shell.json +146 -0
  350. package/corpus/chunks/form-switch-toggle.json +41 -0
  351. package/corpus/chunks/form-system-live-demo.json +123 -0
  352. package/corpus/chunks/forms-address-autocomplete.json +277 -0
  353. package/corpus/chunks/forms-address-fields.json +221 -0
  354. package/corpus/chunks/forms-conditional-reveal.json +195 -0
  355. package/corpus/chunks/gallery-page-shell.json +444 -0
  356. package/corpus/chunks/grid-2col-entry-cards.json +140 -0
  357. package/corpus/chunks/grid-kpi-4col.json +164 -0
  358. package/corpus/chunks/grid-responsive-kpi.json +165 -0
  359. package/corpus/chunks/hero-cta-simple.json +107 -0
  360. package/corpus/chunks/hero-cta-split.json +183 -0
  361. package/corpus/chunks/hero-section-split.json +111 -0
  362. package/corpus/chunks/icon-text-row.json +60 -0
  363. package/corpus/chunks/image-caption-tile.json +99 -0
  364. package/corpus/chunks/image-carousel.json +156 -0
  365. package/corpus/chunks/image-thumbnail-grid.json +77 -0
  366. package/corpus/chunks/image-upload-preview.json +118 -0
  367. package/corpus/chunks/import-mapping-flow.json +972 -0
  368. package/corpus/chunks/inline-dialog-rename.json +128 -0
  369. package/corpus/chunks/inline-dialog-schedule.json +154 -0
  370. package/corpus/chunks/inline-dialog-status.json +179 -0
  371. package/corpus/chunks/integrations-api-keys-card-list.json +475 -0
  372. package/corpus/chunks/integrations-connect-form.json +550 -0
  373. package/corpus/chunks/integrations-grid.json +141 -0
  374. package/corpus/chunks/integrations-webhooks-empty-state.json +66 -0
  375. package/corpus/chunks/inventory-list-stock.json +137 -0
  376. package/corpus/chunks/invite-members.json +153 -0
  377. package/corpus/chunks/invoice-line-items.json +493 -0
  378. package/corpus/chunks/kanban-board-3col.json +713 -0
  379. package/corpus/chunks/kanban-page-shell.json +671 -0
  380. package/corpus/chunks/key-value-detail-list.json +242 -0
  381. package/corpus/chunks/keyboard-shortcut-display.json +250 -0
  382. package/corpus/chunks/labeled-textarea.json +45 -0
  383. package/corpus/chunks/leaderboard-table.json +140 -0
  384. package/corpus/chunks/library-browser-search-filter.json +109 -0
  385. package/corpus/chunks/linked-record-row.json +61 -0
  386. package/corpus/chunks/loading-skeleton-placeholder.json +387 -0
  387. package/corpus/chunks/login-form-card.json +207 -0
  388. package/corpus/chunks/logo-cloud-trusted-by.json +235 -0
  389. package/corpus/chunks/map-with-location-list.json +293 -0
  390. package/corpus/chunks/marketing-hero-cta.json +102 -0
  391. package/corpus/chunks/marketing-page-shell.json +352 -0
  392. package/corpus/chunks/masonry-gallery.json +154 -0
  393. package/corpus/chunks/member-edit-drawer.json +236 -0
  394. package/corpus/chunks/members-active-table-search-filter.json +184 -0
  395. package/corpus/chunks/members-pending-invites-cards.json +251 -0
  396. package/corpus/chunks/members-roles-permissions-list.json +146 -0
  397. package/corpus/chunks/menu-context-actions.json +113 -0
  398. package/corpus/chunks/metadata-description-list.json +178 -0
  399. package/corpus/chunks/modal-create-project-form.json +133 -0
  400. package/corpus/chunks/modal-preferences-tabs.json +147 -0
  401. package/corpus/chunks/multi-field-form-validation.json +394 -0
  402. package/corpus/chunks/nav-menu-icons.json +74 -0
  403. package/corpus/chunks/newsletter-subscription.json +190 -0
  404. package/corpus/chunks/notification-badges-feed.json +411 -0
  405. package/corpus/chunks/notification-preferences-panel.json +238 -0
  406. package/corpus/chunks/onb-completion.json +139 -0
  407. package/corpus/chunks/onb-extension-install.json +172 -0
  408. package/corpus/chunks/onb-hero-welcome.json +156 -0
  409. package/corpus/chunks/onb-import-picker.json +86 -0
  410. package/corpus/chunks/onb-mobile-handoff.json +121 -0
  411. package/corpus/chunks/onb-notification-prefs.json +83 -0
  412. package/corpus/chunks/onb-persona-picker.json +82 -0
  413. package/corpus/chunks/onb-provider-tiles.json +137 -0
  414. package/corpus/chunks/onb-settings-review.json +257 -0
  415. package/corpus/chunks/onb-step-footer.json +121 -0
  416. package/corpus/chunks/onb-step-header.json +121 -0
  417. package/corpus/chunks/onb-step-progress.json +140 -0
  418. package/corpus/chunks/onb-step-shell.json +380 -0
  419. package/corpus/chunks/onb-story-pane.json +121 -0
  420. package/corpus/chunks/onb-tutorial-steps.json +193 -0
  421. package/corpus/chunks/order-confirmation-success-card.json +177 -0
  422. package/corpus/chunks/order-tracking-timeline.json +131 -0
  423. package/corpus/chunks/pagination-controls.json +82 -0
  424. package/corpus/chunks/pane-settings-sidebar.json +204 -0
  425. package/corpus/chunks/patient-visit-shell.json +191 -0
  426. package/corpus/chunks/payment-checkout-form.json +341 -0
  427. package/corpus/chunks/payment-method-form.json +328 -0
  428. package/corpus/chunks/period-comparison.json +236 -0
  429. package/corpus/chunks/permission-matrix-table.json +438 -0
  430. package/corpus/chunks/permissions-matrix-grid.json +111 -0
  431. package/corpus/chunks/permissions-matrix-summary.json +157 -0
  432. package/corpus/chunks/permissions-role-picker-radio.json +107 -0
  433. package/corpus/chunks/permissions-role-picker-select.json +101 -0
  434. package/corpus/chunks/permissions-share-link.json +256 -0
  435. package/corpus/chunks/permissions-share-people.json +297 -0
  436. package/corpus/chunks/permissions-sharing-scopes.json +109 -0
  437. package/corpus/chunks/plan-selection-form.json +529 -0
  438. package/corpus/chunks/playground-a2ui.json +181 -0
  439. package/corpus/chunks/playground-agent-admin.json +117 -0
  440. package/corpus/chunks/playground-agent-chat.json +126 -0
  441. package/corpus/chunks/playground-app-shell.json +488 -0
  442. package/corpus/chunks/playground-chat.json +265 -0
  443. package/corpus/chunks/playground-construct-canvas.json +118 -0
  444. package/corpus/chunks/playground-css-channel.json +487 -0
  445. package/corpus/chunks/playground-gen-ui.json +224 -0
  446. package/corpus/chunks/playground-render-preview.json +369 -0
  447. package/corpus/chunks/playground-streams-bridge.json +437 -0
  448. package/corpus/chunks/playground-table-toolbar.json +38 -0
  449. package/corpus/chunks/popover-with-content.json +118 -0
  450. package/corpus/chunks/pricing-tiers.json +561 -0
  451. package/corpus/chunks/product-tour.json +158 -0
  452. package/corpus/chunks/profile-public.json +297 -0
  453. package/corpus/chunks/progress-tracker-milestones.json +294 -0
  454. package/corpus/chunks/radio-button-group.json +83 -0
  455. package/corpus/chunks/rating-stars-review-summary.json +259 -0
  456. package/corpus/chunks/reactions-bar.json +75 -0
  457. package/corpus/chunks/reactions-picker.json +245 -0
  458. package/corpus/chunks/real-time-metrics-dashboard.json +344 -0
  459. package/corpus/chunks/record-detail-drawer-simple-detail.json +296 -0
  460. package/corpus/chunks/record-detail-drawer-tabbed-detail.json +443 -0
  461. package/corpus/chunks/referral-share-link.json +128 -0
  462. package/corpus/chunks/referral-status.json +243 -0
  463. package/corpus/chunks/reg-address-form.json +825 -0
  464. package/corpus/chunks/reg-billing-card.json +210 -0
  465. package/corpus/chunks/reg-brand-scrape.json +599 -0
  466. package/corpus/chunks/reg-departments-toggle.json +259 -0
  467. package/corpus/chunks/reg-extended-profile.json +356 -0
  468. package/corpus/chunks/reg-final-done.json +457 -0
  469. package/corpus/chunks/reg-helpdesk-grid.json +571 -0
  470. package/corpus/chunks/reg-import-picker.json +112 -0
  471. package/corpus/chunks/reg-integrations-grid.json +418 -0
  472. package/corpus/chunks/reg-invite-form.json +245 -0
  473. package/corpus/chunks/reg-legal-entity.json +260 -0
  474. package/corpus/chunks/reg-org-chart-review.json +891 -0
  475. package/corpus/chunks/reg-profile-identity.json +188 -0
  476. package/corpus/chunks/reg-step-footer.json +201 -0
  477. package/corpus/chunks/reg-step-header.json +201 -0
  478. package/corpus/chunks/reg-step-progress.json +236 -0
  479. package/corpus/chunks/reg-step-shell.json +605 -0
  480. package/corpus/chunks/reg-story-pane.json +201 -0
  481. package/corpus/chunks/reg-success-summary.json +257 -0
  482. package/corpus/chunks/reg-team-size.json +128 -0
  483. package/corpus/chunks/reg-usecase-picker.json +104 -0
  484. package/corpus/chunks/reg-workspace-name.json +159 -0
  485. package/corpus/chunks/responsive-grid-pattern.json +71 -0
  486. package/corpus/chunks/responsive-kpi-grid.json +166 -0
  487. package/corpus/chunks/responsive-row-pattern.json +71 -0
  488. package/corpus/chunks/responsive-shell-sidebar.json +308 -0
  489. package/corpus/chunks/responsive-wrap-at-pattern.json +124 -0
  490. package/corpus/chunks/retention-cohort-default-retention.json +80 -0
  491. package/corpus/chunks/retention-cohort-stat-pair.json +163 -0
  492. package/corpus/chunks/retention-cohort-with-legend.json +135 -0
  493. package/corpus/chunks/revenue-heatmap.json +82 -0
  494. package/corpus/chunks/role-management.json +272 -0
  495. package/corpus/chunks/row-action-cluster.json +54 -0
  496. package/corpus/chunks/row-avatar-name-role.json +71 -0
  497. package/corpus/chunks/row-icon-label.json +52 -0
  498. package/corpus/chunks/row-spread-label-value.json +54 -0
  499. package/corpus/chunks/row-wrap-tags.json +72 -0
  500. package/corpus/chunks/schedule-meeting-form-card.json +229 -0
  501. package/corpus/chunks/search-recents-menu.json +195 -0
  502. package/corpus/chunks/search-results-grouped.json +357 -0
  503. package/corpus/chunks/search-results-list.json +202 -0
  504. package/corpus/chunks/search-saved-views.json +356 -0
  505. package/corpus/chunks/search-with-filters.json +311 -0
  506. package/corpus/chunks/searchable-picker-modal.json +164 -0
  507. package/corpus/chunks/section-with-stack.json +48 -0
  508. package/corpus/chunks/security-active-sessions-devices.json +287 -0
  509. package/corpus/chunks/security-change-password-form.json +102 -0
  510. package/corpus/chunks/security-delete-account-danger.json +79 -0
  511. package/corpus/chunks/segmented-control-billing-tabs.json +164 -0
  512. package/corpus/chunks/select-multiple-preselected.json +70 -0
  513. package/corpus/chunks/settings-2fa-setup.json +307 -0
  514. package/corpus/chunks/settings-admin-page.json +1205 -0
  515. package/corpus/chunks/settings-appearance-primitives.json +145 -0
  516. package/corpus/chunks/settings-appearance-theme-panel.json +55 -0
  517. package/corpus/chunks/settings-appearance.json +81 -0
  518. package/corpus/chunks/settings-danger-zone-delete-workspace.json +93 -0
  519. package/corpus/chunks/settings-general-form.json +69 -0
  520. package/corpus/chunks/settings-integrations.json +298 -0
  521. package/corpus/chunks/settings-members-invite.json +112 -0
  522. package/corpus/chunks/settings-notification-activity-checkboxes.json +108 -0
  523. package/corpus/chunks/settings-notification-channels-switches.json +101 -0
  524. package/corpus/chunks/settings-page-shell.json +190 -0
  525. package/corpus/chunks/settings-privacy.json +83 -0
  526. package/corpus/chunks/settings-profile-security.json +122 -0
  527. package/corpus/chunks/settings-toggle-switches.json +66 -0
  528. package/corpus/chunks/sidebar-nav.json +120 -0
  529. package/corpus/chunks/sidebar-navigation-panel.json +165 -0
  530. package/corpus/chunks/signup-form-card.json +218 -0
  531. package/corpus/chunks/signup-team-size-form.json +259 -0
  532. package/corpus/chunks/single-select-card-form.json +231 -0
  533. package/corpus/chunks/slider-range-controls.json +119 -0
  534. package/corpus/chunks/social-media-post-card.json +159 -0
  535. package/corpus/chunks/sortable-list.json +307 -0
  536. package/corpus/chunks/sortable-search-paginate-table.json +162 -0
  537. package/corpus/chunks/split-pane-editor.json +146 -0
  538. package/corpus/chunks/stack-avatar-badge-overlay.json +53 -0
  539. package/corpus/chunks/stack-image-shimmer.json +51 -0
  540. package/corpus/chunks/stat-cards-kpi-dashboard.json +178 -0
  541. package/corpus/chunks/stats-band-big-numbers.json +175 -0
  542. package/corpus/chunks/status-dashboard.json +282 -0
  543. package/corpus/chunks/stepper-form-wizard.json +165 -0
  544. package/corpus/chunks/subscription-status-renewal-card.json +285 -0
  545. package/corpus/chunks/survey-rating-form.json +165 -0
  546. package/corpus/chunks/swiper-product-carousel.json +349 -0
  547. package/corpus/chunks/swiper-testimonial-carousel.json +279 -0
  548. package/corpus/chunks/table-empty-state.json +116 -0
  549. package/corpus/chunks/table-inline-edit-row.json +269 -0
  550. package/corpus/chunks/table-spreadsheet-cells.json +334 -0
  551. package/corpus/chunks/table-toolbar-no-search.json +42 -0
  552. package/corpus/chunks/table-toolbar-with-table.json +208 -0
  553. package/corpus/chunks/table-with-toolbar-card.json +80 -0
  554. package/corpus/chunks/tabs-with-panels.json +187 -0
  555. package/corpus/chunks/tag-chips-filter.json +100 -0
  556. package/corpus/chunks/team-invite-form.json +380 -0
  557. package/corpus/chunks/team-members-list.json +341 -0
  558. package/corpus/chunks/testimonial-grid.json +269 -0
  559. package/corpus/chunks/testimonial-pull-quote.json +137 -0
  560. package/corpus/chunks/testimonials-avatar-cards.json +286 -0
  561. package/corpus/chunks/timeline-events.json +89 -0
  562. package/corpus/chunks/timezone-selector-basic.json +99 -0
  563. package/corpus/chunks/timezone-selector-preview.json +104 -0
  564. package/corpus/chunks/toolbar-icons.json +216 -0
  565. package/corpus/chunks/toolbar-rich-text-editor.json +230 -0
  566. package/corpus/chunks/toolbar-tooltips.json +191 -0
  567. package/corpus/chunks/tooltip-hover-button.json +106 -0
  568. package/corpus/chunks/tree-file-explorer.json +136 -0
  569. package/corpus/chunks/tree-table-basic.json +171 -0
  570. package/corpus/chunks/trial-banner.json +158 -0
  571. package/corpus/chunks/url-import-form.json +728 -0
  572. package/corpus/chunks/usage-quota-meter-card.json +217 -0
  573. package/corpus/chunks/user-identity-row.json +81 -0
  574. package/corpus/chunks/user-onboarding-checklist.json +301 -0
  575. package/corpus/chunks/user-profile-card.json +192 -0
  576. package/corpus/chunks/users-table-badge.json +135 -0
  577. package/corpus/chunks/verification-document-upload.json +179 -0
  578. package/corpus/chunks/verification-status.json +97 -0
  579. package/corpus/chunks/verification-stepper.json +111 -0
  580. package/corpus/chunks/video-player-controls.json +120 -0
  581. package/corpus/chunks/webhook-config.json +209 -0
  582. package/corpus/chunks/webhooks-list.json +204 -0
  583. package/corpus/chunks/wizard-drawer-three-step-wizard.json +443 -0
  584. package/corpus/manifest.d.ts +4 -0
  585. package/corpus/manifest.json +6 -0
  586. package/corpus/scripts/chunk-library.d.ts +4 -0
  587. package/corpus/scripts/chunk-library.js +335 -0
  588. package/node-shims.d.ts +48 -0
  589. package/package.json +215 -0
  590. package/retrieval/CHANGELOG.md +1073 -0
  591. package/retrieval/README.md +71 -0
  592. package/retrieval/anti-patterns.js +189 -0
  593. package/retrieval/authoring/index.d.ts +4 -0
  594. package/retrieval/authoring/index.js +9 -0
  595. package/retrieval/authoring/web-research.js +220 -0
  596. package/retrieval/catalog.js +250 -0
  597. package/retrieval/component-catalog.js +168 -0
  598. package/retrieval/component-entry.js +80 -0
  599. package/retrieval/context-assembler.js +174 -0
  600. package/retrieval/domain-router.js +417 -0
  601. package/retrieval/embedding/chunk-embedding-retriever.js +117 -0
  602. package/retrieval/embedding/embedding-provider.js +72 -0
  603. package/retrieval/embedding/index.d.ts +4 -0
  604. package/retrieval/embedding/index.js +2 -0
  605. package/retrieval/feedback/dialog-recorder.js +107 -0
  606. package/retrieval/feedback/feedback-analyzer.js +180 -0
  607. package/retrieval/feedback/feedback-store.js +194 -0
  608. package/retrieval/feedback/feedback.js +117 -0
  609. package/retrieval/feedback/gap-registry.js +80 -0
  610. package/retrieval/feedback/human-signal.js +113 -0
  611. package/retrieval/feedback/index.d.ts +4 -0
  612. package/retrieval/feedback/index.js +24 -0
  613. package/retrieval/feedback/submit-feedback.js +45 -0
  614. package/retrieval/index.d.ts +4 -0
  615. package/retrieval/index.js +53 -0
  616. package/retrieval/intent/clarity.js +139 -0
  617. package/retrieval/intent/decomposer.js +124 -0
  618. package/retrieval/intent/index.d.ts +4 -0
  619. package/retrieval/intent/index.js +18 -0
  620. package/retrieval/intent/intent-alignment.js +172 -0
  621. package/retrieval/intent/intent-categorizer.js +69 -0
  622. package/retrieval/intent/intent-gate.js +96 -0
  623. package/retrieval/intent/prompt-analyzer.js +162 -0
  624. package/retrieval/wiring-catalog.js +168 -0
  625. package/validate/catalog-validator.d.ts +4 -0
  626. package/validate/catalog-validator.js +327 -0
  627. package/validate/semantic/cache.js +54 -0
  628. package/validate/semantic/classify-intent.js +128 -0
  629. package/validate/semantic/index.js +163 -0
  630. package/validate/semantic/intent-specs.js +162 -0
  631. 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
+ }