@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,490 @@
1
+ /**
2
+ * @adia-ai/gen-ui — monolithic engine, pro mode.
3
+ *
4
+ * Extracted from core/generator.js per spec §11 Phase 2. Shares state
5
+ * (ArtifactStore, PipelineEngine) via core/state.js. Pure helpers live
6
+ * in strategies/monolithic/_shared.js.
7
+ */
8
+
9
+ import { validateAndRepair, buildFailures } from '../../shared/validate-and-repair.js';
10
+ import { getContext, searchBlocks, lookupDomain } from '../../core/reference.js';
11
+ import { decomposeIntent } from '../../../retrieval/intent/decomposer.js';
12
+ import { assessClarity } from '../../../retrieval/intent/clarity.js';
13
+ import { isConversational } from '../../../retrieval/intent/intent-gate.js';
14
+ import { feedbackStore } from '../../../retrieval/feedback/feedback-store.js';
15
+ import { store, engine } from '../../core/state.js';
16
+ import { isRecording } from '../../../retrieval/feedback/dialog-recorder.js';
17
+ import { searchChunks, expandChunkGraph } from '../_shared/chunk-loader.js';
18
+ import {
19
+ buildSystemPrompt,
20
+ buildChatMessages,
21
+ mergeCanvasDiff,
22
+ buildCanvasDiffPrompt,
23
+ parseA2UIResponse,
24
+ buildRepairPrompt,
25
+ generateSuggestions, foldInAntiPatterns } from './_shared.js';
26
+
27
+ export async function generatePro({ intent, executionId, storeId, llmAdapter, analysis, priorComponentsFromPayload, context }) {
28
+ const execId = executionId;
29
+
30
+ // The steelman is the enriched brief produced by the prompt-analyzer in
31
+ // the baseline ingestion stage. Use it for pattern search (denser query =
32
+ // better hits) and inject the analysis signals into the system prompt so
33
+ // the LLM sees the implied component set + concept tags. Falls back to raw
34
+ // intent when analyzer didn't run (iteration turns) or fell back.
35
+ const searchQuery = analysis?.steelman || intent;
36
+
37
+ // Header prepended to every user message sent to the LLM. Surfaces the
38
+ // analyzer's structured signals so the LLM treats steelman + components +
39
+ // concepts as ground truth instead of having to re-derive them from a 3-word
40
+ // prompt. Empty string when no analyzer signal — no behavior change.
41
+ const analysisHint = (analysis?.analyzed && (
42
+ analysis.steelman !== analysis.raw ||
43
+ analysis.impliedComponents?.length ||
44
+ analysis.concepts?.length
45
+ ))
46
+ ? [
47
+ analysis.steelman && analysis.steelman !== analysis.raw ? `BRIEF: ${analysis.steelman}` : null,
48
+ analysis.impliedComponents?.length ? `EXPECTED COMPONENTS: ${analysis.impliedComponents.join(', ')}` : null,
49
+ analysis.concepts?.length ? `CONCEPTS: ${analysis.concepts.join(', ')}` : null,
50
+ analysis.styleHints?.length ? `STYLE: ${analysis.styleHints.join(', ')}` : null,
51
+ ].filter(Boolean).join('\n') + '\n\n'
52
+ : '';
53
+
54
+ // ── Stage 1: Interpret ──
55
+ const domain = lookupDomain(intent);
56
+ engine.submitStage(execId, 'interpret', { domain, intent, confidence: domain.confidence });
57
+
58
+ // ── Clarity gate (defense-in-depth) ──
59
+ // If intent has zero domain signals and clarity is below threshold,
60
+ // return a clarification response instead of hallucinating UI.
61
+ // This catches cases where the intent gate upstream didn't intercept
62
+ // (e.g. direct API calls bypassing isConversational).
63
+ // EXCEPTION: skip on iteration turns. Refinements like "make it 3D" or
64
+ // "remove the avatar" have zero domain signals but are valid modifications
65
+ // of the prior canvas — they should pass straight through to the LLM with
66
+ // history context. Iteration is detected by the presence of prior turns in
67
+ // the artifact store keyed by storeId. Same intent as F1 in generator.js.
68
+ const priorTurnCount = store.getAll(storeId || execId)?.length || 0;
69
+ const isIteration = priorTurnCount > 0;
70
+ const clarity = assessClarity(intent, domain);
71
+ if (!isIteration && !clarity.clear && domain.confidence === 0) {
72
+ // Note: 'clarify' is not a registered pipeline stage, so we skip submitStage
73
+ // here to avoid throwing — the clarification surfaces in the return payload.
74
+ return {
75
+ executionId: storeId,
76
+ messages: [],
77
+ validation: { score: 0, errors: [], warnings: ['Intent does not describe a UI component'] },
78
+ suggestions: clarity.questions.map(q => q.text),
79
+ clarify: {
80
+ needed: true,
81
+ questions: clarity.questions,
82
+ score: clarity.score,
83
+ dimensions: clarity.dimensions,
84
+ summary: clarity.summary,
85
+ },
86
+ pipeline: engine.getState(execId),
87
+ };
88
+ }
89
+
90
+ // ── Stage 2: Analyze ──
91
+ const catalogContext = await getContext(intent, 2);
92
+ engine.submitStage(execId, 'analyze', {
93
+ context: catalogContext, componentCount: catalogContext.components.length, patternCount: catalogContext.patterns.length,
94
+ confidence: 0.85,
95
+ });
96
+
97
+ // ── Stage 3: Plan — search for best pattern + best chunk ──
98
+ const patterns = searchBlocks(searchQuery, { domain: domain.domain });
99
+ const bestPattern = patterns[0];
100
+
101
+ // ── Parallel chunk retrieval (training-corpus path) ──
102
+ // The chunks corpus at packages/gen-ui/corpus/chunks/*.json captures real
103
+ // page-shape blocks harvested from working apps (auth/sign-in,
104
+ // settings pages, dashboards, etc.). When a query strongly matches a
105
+ // chunk, we inject the chunk's HTML as a STRUCTURAL REFERENCE into the
106
+ // adapt prompt — so the LLM has the canonical shape, not just a
107
+ // description of it. This closes the gap where monolithic-pro was
108
+ // describing chunks (via the score-card's pattern-match telemetry) but
109
+ // never actually using them in generation.
110
+ //
111
+ // Threshold rationale: searchChunks's keyword-score scale is the same
112
+ // family as the existing STRONG_RETRIEVAL_SCORE=8 in zettel's chunk
113
+ // synthesizer. We use a slightly lower threshold (5) for monolithic
114
+ // because the chunk is REFERENCE, not authoritative — the LLM still
115
+ // adapts, so we'd rather over-inject and let the LLM judge relevance.
116
+ let chunkMatch = null;
117
+ let chunkRefHtml = null;
118
+ try {
119
+ const chunkHits = await searchChunks(searchQuery, { limit: 1 });
120
+ if (chunkHits.length && chunkHits[0].score >= 5) {
121
+ chunkMatch = chunkHits[0];
122
+ // Expand the chunk's nested refs so the LLM sees the complete
123
+ // structural context, not just the outer shell. Depth-capped to
124
+ // protect against the recursive nested chain blowing token budget.
125
+ const graph = await expandChunkGraph(chunkMatch.record, { maxDepth: 3 });
126
+ chunkRefHtml = graph
127
+ .map((g) => `<!-- chunk: ${g.name} (${g.kind}/${g.primary}) -->\n${g.html || ''}`)
128
+ .join('\n\n');
129
+ }
130
+ } catch {
131
+ // Chunk loader is best-effort — never block generation on its failures
132
+ }
133
+
134
+ // ── Compositional reasoning: decompose multi-section intents ──
135
+ // ALWAYS attempt decomposition for compound intents — even when a single
136
+ // best pattern matches. This lets the LLM receive fragment patterns for
137
+ // each sub-section (e.g. "invoice table", "payment form") alongside the
138
+ // overall best pattern, producing richer multi-section output.
139
+ let fragmentPatterns = [];
140
+ let decomposition = decomposeIntent(intent);
141
+
142
+ // Determine if intent is compound: decomposer says so, OR 3+ meaningful words
143
+ const meaningfulWords = intent.replace(/\b(a|an|the|with|and|or|for|of|in|on|to|by)\b/gi, '').trim().split(/\s+/).filter(w => w.length > 2);
144
+ const isCompound = (decomposition.shouldDecompose && decomposition.subtasks.length >= 2)
145
+ || meaningfulWords.length >= 3;
146
+
147
+ if (isCompound && decomposition.subtasks.length >= 2) {
148
+ for (const subtask of decomposition.subtasks) {
149
+ const subPatterns = searchBlocks(subtask.intent, { domain: domain.domain });
150
+ const topMatch = subPatterns[0];
151
+ if (topMatch?.template) {
152
+ fragmentPatterns.push({
153
+ label: subtask.label,
154
+ subtaskIntent: subtask.intent,
155
+ pattern: topMatch,
156
+ });
157
+ }
158
+ }
159
+ }
160
+
161
+ const hasFragments = fragmentPatterns.length >= 2;
162
+ engine.submitStage(execId, 'plan', {
163
+ strategy: bestPattern?.template ? (hasFragments ? 'adapt-with-fragments' : 'adapt-pattern') : hasFragments ? 'compose-fragments' : 'generate-fresh',
164
+ patternName: bestPattern?.name ?? (chunkMatch?.name ?? null),
165
+ chunkRef: chunkMatch ? { name: chunkMatch.name, score: chunkMatch.score, kind: chunkMatch.kind, primary: chunkMatch.primary } : null,
166
+ fragments: hasFragments ? fragmentPatterns.map(f => f.pattern.name) : undefined,
167
+ layout: hasFragments ? decomposition?.layout : undefined,
168
+ confidence: bestPattern?.template ? 0.9 : hasFragments ? 0.85 : chunkMatch ? 0.8 : 0.7,
169
+ });
170
+
171
+ // ── Stage 4: Generate ──
172
+
173
+ // Check if this is a multi-turn iteration with existing canvas state.
174
+ // This runs BEFORE branching so ALL paths (adapt, compose, generate-fresh)
175
+ // can inject the current canvas when iterating.
176
+ // Priority order:
177
+ // 1. priorComponentsFromPayload — client-owned canvas (stateless path)
178
+ // 2. ArtifactStore lookup via storeId — server-stateful path (legacy)
179
+ // The payload path wins when both present so the client is the source of
180
+ // truth (it knows its current canvas; the store may be stale, e.g. after
181
+ // a server restart or when iterating across tabs).
182
+ let priorComponents = [];
183
+ if (Array.isArray(priorComponentsFromPayload) && priorComponentsFromPayload.length > 0) {
184
+ priorComponents = priorComponentsFromPayload;
185
+ } else {
186
+ const prevTurns = store.getAll(storeId || execId);
187
+ if (prevTurns && prevTurns.length > 0) {
188
+ const lastTurn = prevTurns[prevTurns.length - 1];
189
+ priorComponents = lastTurn.messages?.flatMap(m => m.components || []) || [];
190
+ }
191
+ }
192
+ const hasPriorCanvas = priorComponents.length > 0;
193
+
194
+ // ── Drift guard: detect scope creep and inject guardrails into prompt ──
195
+ const preDriftMetrics = hasPriorCanvas ? store.getDriftMetrics(storeId || execId) : null;
196
+ const originalIntent = preDriftMetrics?.originalIntent || null;
197
+ const driftGuard = preDriftMetrics?.driftScore >= 0.4
198
+ ? `\n\nSCOPE GUARD: This canvas has grown significantly from the original brief ("${preDriftMetrics.originalIntent}"). Component count: ${priorComponents.length}. Only make changes the user EXPLICITLY requested. Do NOT add new sections, cards, or structural elements beyond what the user asked for in this turn.`
199
+ : '';
200
+
201
+ let messages, systemPrompt;
202
+ // Captured for the dialog recorder when ADIA_LOG_DIALOGS is on. Holds the
203
+ // raw text from whichever LLM branch produced the final result. No-op when
204
+ // recording is off — the assignments are cheap; the size cost only matters
205
+ // when the recorder actually persists them to disk.
206
+ let lastRawResponse = null;
207
+ let lastTokens = null;
208
+
209
+ // Pattern templates are pre-inlined as of the 2026-05-12 fragment
210
+ // retirement (§37) — compositions/ no longer carry $fragment refs and
211
+ // there's nothing left to expand. We pass the template straight to the
212
+ // LLM. If a stale pattern with $fragment refs sneaks back in, the LLM
213
+ // will see the literal placeholder string and likely include it in
214
+ // output (acceptable failure mode; corpus drift is caught by the
215
+ // verify:corpus script).
216
+ const expandedPatternTemplate = bestPattern?.template ?? null;
217
+
218
+ // ── Chunk reference block — injected into the user prompt when a
219
+ // strong chunk match was found at retrieval time. This is the
220
+ // structural "look like this" hint that lets the LLM materialize the
221
+ // real chunk shape (e.g. auth-signin-card-email) instead of
222
+ // hallucinating a passable-but-wrong shape from the brief alone.
223
+ //
224
+ // §56 (v0.4.5): prompt language enriched with provenance + metadata so
225
+ // the LLM understands the chunk's domain/keywords context. Tested via
226
+ // factory-chat + gen-ui live submit; LLMs produce closer structural
227
+ // matches when told what the chunk is + where it came from.
228
+ const chunkReferenceBlock = chunkRefHtml
229
+ ? `\nSTRUCTURAL REFERENCE — this chunk was retrieved from the AdiaUI training corpus (annotated production HTML, harvested from real app pages). It matched your intent on keyword/domain ranking:
230
+
231
+ CHUNK: ${chunkMatch.name}
232
+ kind=${chunkMatch.kind}, primary=${chunkMatch.primary}, score=${chunkMatch.score}${chunkMatch.metadata?.domain ? `, domain=${chunkMatch.metadata.domain}` : ''}${chunkMatch.metadata?.description ? `\n description: ${chunkMatch.metadata.description}` : ''}${chunkMatch.metadata?.keywords ? `\n keywords: ${chunkMatch.metadata.keywords.join(', ')}` : ''}
233
+
234
+ Match this chunk's component palette, information density, and Card/Header/Section/Footer anatomy. Do NOT copy the HTML verbatim into A2UI — translate its semantic structure into the equivalent A2UI components. The chunk represents the SHAPE the user wants; your job is to instantiate that shape with their content:
235
+ ---
236
+ ${chunkRefHtml}
237
+ ---
238
+ `
239
+ : '';
240
+
241
+ if (bestPattern && bestPattern.template) {
242
+ // PRO PATH: Adapt the matched pattern via LLM
243
+ systemPrompt = await buildSystemPrompt(catalogContext, patterns, '', intent, null, context);
244
+
245
+ const adaptPrompt = hasPriorCanvas
246
+ ? `Adapt this UI for the intent: "${intent}"${driftGuard}
247
+ ${chunkReferenceBlock}
248
+ ${buildCanvasDiffPrompt(intent, priorComponents, { originalIntent })}`
249
+ : hasFragments
250
+ ? `Adapt this UI for the intent: "${intent}"
251
+ ${chunkReferenceBlock}
252
+ BASE TEMPLATE (use for overall structure — modify, don't generate from scratch):
253
+ ${JSON.stringify(expandedPatternTemplate, null, 2)}
254
+
255
+ Pattern: "${bestPattern.name}" — ${bestPattern.description}
256
+
257
+ FRAGMENT PATTERNS — incorporate these for specific sections:
258
+ ${fragmentPatterns.map(f => `## ${f.label} (from "${f.pattern.name}" pattern)\n${JSON.stringify(f.pattern.template, null, 1)}`).join('\n\n')}
259
+
260
+ Instructions:
261
+ - Use the base pattern for overall structure and layout
262
+ - Incorporate the fragment patterns above for their respective sections
263
+ - Change text content, labels, icons to match the new intent
264
+ - Add or remove components as needed for the intent
265
+ - Preserve slot attributes and Card anatomy rules
266
+ - Generate a COMPLETE, richly detailed UI with 20-40 components minimum
267
+ - Each section from the intent should have its own Card with Header, Section, and Footer
268
+ - Include realistic text content, labels, and placeholder data — not generic text
269
+ - Output ONLY the JSON array, no explanation`
270
+ : `Adapt this UI for the intent: "${intent}"
271
+ ${chunkReferenceBlock}
272
+ BASE TEMPLATE (modify this, don't generate from scratch):
273
+ ${JSON.stringify(expandedPatternTemplate, null, 2)}
274
+
275
+ Pattern: "${bestPattern.name}" — ${bestPattern.description}
276
+
277
+ Instructions:
278
+ - Keep the structural skeleton (Card > Header + Section + Footer, nesting, layout)
279
+ - Change text content, labels, icons to match the new intent
280
+ - Add or remove components as needed for the intent
281
+ - Preserve slot attributes and Card anatomy rules
282
+ - Generate at least 15 components. Expand the template with additional fields, buttons, and content as appropriate for the intent.
283
+ - Output ONLY the JSON array, no explanation`;
284
+
285
+ const response = await llmAdapter.complete({
286
+ messages: [{ role: 'user', content: analysisHint + adaptPrompt }],
287
+ systemPrompt,
288
+ });
289
+ messages = parseA2UIResponse(response.content, { executionId: execId, mode: 'pro', intent, stopReason: response.stopReason });
290
+ if (isRecording()) { lastRawResponse = response.content; lastTokens = response.usage || null; }
291
+ } else if (hasFragments) {
292
+ // COMPOSE PATH: multiple fragment patterns found for subtasks — compose in a single LLM call
293
+ systemPrompt = await buildSystemPrompt(catalogContext, patterns, '', intent, { fragmentPatterns, decomposition }, context);
294
+
295
+ const fragmentContext = fragmentPatterns.map(f =>
296
+ `## ${f.label} (from "${f.pattern.name}" pattern)\n${JSON.stringify(f.pattern.template, null, 1)}`
297
+ ).join('\n\n');
298
+
299
+ const layoutHint = decomposition.layout
300
+ ? `Use a ${decomposition.layout.component} as the root layout container.`
301
+ : 'Use a Column as the root layout container.';
302
+
303
+ const canvasContext = hasPriorCanvas
304
+ ? `\n${buildCanvasDiffPrompt(intent, priorComponents, { originalIntent })}${driftGuard}\n`
305
+ : '';
306
+
307
+ const composePrompt = `Compose a UI for: "${intent}"
308
+ ${chunkReferenceBlock}${canvasContext}
309
+ This intent has ${fragmentPatterns.length} sections. ${layoutHint}
310
+
311
+ FRAGMENT PATTERNS — use these as building blocks for each section:
312
+
313
+ ${fragmentContext}
314
+
315
+ Instructions:
316
+ - ${hasPriorCanvas ? 'Return ONLY diff objects (add/modify/delete) — unchanged components are preserved automatically' : 'Combine ALL fragments into a single cohesive UI under one root'}
317
+ - Re-id all components to avoid collisions (e.g., prefix with section name)
318
+ - ${decomposition.layout?.component === 'Tabs' ? 'Use Tabs as root with Tab children for each section — each section\'s content goes INSIDE its Tab (the parent auto-hides inactive panels)' : `Use ${decomposition.layout?.component || 'Column'} as root, with each section as a child`}
319
+ - Adapt text content, labels, and icons to match the overall intent
320
+ - Add a page-level header above the sections if appropriate
321
+ - Preserve slot attributes and Card anatomy rules from each fragment
322
+ - Generate a COMPLETE, richly detailed UI with 20-40 components minimum. Each section should have its own Card with Header, Section, and Footer.
323
+ - Include realistic text content, labels, placeholder data, and all fields/buttons a real production UI would have.
324
+ - Output ONLY the JSON array, no explanation`;
325
+
326
+ const response = await llmAdapter.complete({
327
+ messages: [{ role: 'user', content: analysisHint + composePrompt }],
328
+ systemPrompt,
329
+ });
330
+ messages = parseA2UIResponse(response.content, { executionId: execId, mode: 'pro', intent, stopReason: response.stopReason });
331
+ if (isRecording()) { lastRawResponse = response.content; lastTokens = response.usage || null; }
332
+ } else {
333
+ // No pattern — fall through to full thinking-style generation
334
+ systemPrompt = await buildSystemPrompt(catalogContext, patterns, '', intent, null, context);
335
+
336
+ if (hasPriorCanvas) {
337
+ // Multi-turn: inject current canvas as explicit iteration context
338
+ const iteratePrompt = `Modify this UI for the intent: "${intent}"${driftGuard}
339
+ ${chunkReferenceBlock}
340
+ ${buildCanvasDiffPrompt(intent, priorComponents, { originalIntent })}`;
341
+
342
+ const response = await llmAdapter.complete({
343
+ messages: [{ role: 'user', content: analysisHint + iteratePrompt }],
344
+ systemPrompt,
345
+ });
346
+ messages = parseA2UIResponse(response.content, { executionId: execId, intent, mode: 'pro', stopReason: response.stopReason });
347
+ if (isRecording()) { lastRawResponse = response.content; lastTokens = response.usage || null; }
348
+ } else {
349
+ // First-turn fresh generation. When we have a chunk match, prepend
350
+ // the structural reference to the user message so the LLM sees the
351
+ // canonical shape before the standard chat-built prompt.
352
+ const chatMessages = buildChatMessages(intent, storeId || execId);
353
+ if (chunkReferenceBlock && chatMessages.length) {
354
+ // The last message in chatMessages is the user's brief — prepend
355
+ // the chunk reference to its content.
356
+ const lastIdx = chatMessages.length - 1;
357
+ if (chatMessages[lastIdx].role === 'user') {
358
+ chatMessages[lastIdx] = {
359
+ ...chatMessages[lastIdx],
360
+ content: `${chunkReferenceBlock}\n${chatMessages[lastIdx].content}`,
361
+ };
362
+ }
363
+ }
364
+ const response = await llmAdapter.complete({ messages: chatMessages, systemPrompt });
365
+ messages = parseA2UIResponse(response.content, { executionId: execId, intent, mode: 'pro', stopReason: response.stopReason });
366
+ if (isRecording()) { lastRawResponse = response.content; lastTokens = response.usage || null; }
367
+ }
368
+ }
369
+
370
+ // ── Canvas diff merge: apply LLM response onto prior canvas ──
371
+ //
372
+ // §168 (v0.5.4): merge always runs on iteration turns regardless of canvas
373
+ // size. Pre-§168 the gate was `priorComponents.length >= 50`, which created
374
+ // a three-band threshold mismatch:
375
+ // 0–49 : prompt asked for COMPLETE array, merge skipped → LLM output
376
+ // wholesale-replaced canvas (verified 2026-05-14 chart-workflow
377
+ // ticket: 32-component canvas + "add a chart" intent →
378
+ // 202-component response wiped the user's prior work)
379
+ // 50–299 : prompt asked for COMPLETE array, merge ran treating output
380
+ // as DIFF → prompt/code mismatch
381
+ // 300+ : prompt asked for DIFF only, merge ran (correct band)
382
+ //
383
+ // mergeCanvasDiff() is a strict superset of "replace" behaviorally:
384
+ // - When LLM returns COMPLETE array: every prior id is present in output
385
+ // → merged in-place (no-op if unchanged; updates if changed). Missing
386
+ // prior ids preserved. New ids appended. Net behavior = identical to
387
+ // wholesale-replace when LLM cooperates, safer when LLM returns subset.
388
+ // - When LLM returns DIFF: existing behavior preserved.
389
+ // Plus the hallucination-detection guards in mergeCanvasDiff (matchRatio
390
+ // < 0.2 reject + < 0.6 accept-with-warning) discriminate by match ratio,
391
+ // which is more principled than canvas-size heuristics.
392
+ if (hasPriorCanvas && messages && messages.length > 0) {
393
+ for (const msg of messages) {
394
+ if (msg.type === 'updateComponents' && msg.components) {
395
+ msg.components = mergeCanvasDiff(priorComponents, msg.components);
396
+ }
397
+ }
398
+ }
399
+
400
+ engine.submitStage(execId, 'generate', {
401
+ messages, source: bestPattern ? (hasFragments ? 'adapt-with-fragments' : 'adapt') : hasFragments ? 'compose' : 'llm', confidence: 0.85,
402
+ fragments: hasFragments ? fragmentPatterns.length : undefined,
403
+ });
404
+
405
+ // ── Stage 5: Validate + repair ──
406
+ // Shared with every other LLM-calling engine — see validate-and-repair.js.
407
+ // maxAttempts: 2 (vs. thinking's 3) reflects pro's cheaper cost tier.
408
+ // runCatalogCheck adds Ajv catalog-schema coverage pro never had before —
409
+ // buildRepairPrompt's catalogFailures param already defaults to [] so
410
+ // this is additive, not a signature break.
411
+ const repairResult = await validateAndRepair({
412
+ messages,
413
+ llmAdapter,
414
+ buildRepairPrompt,
415
+ parseResponse: (repairResponse) => parseA2UIResponse(
416
+ repairResponse.content,
417
+ { executionId: execId, intent, mode: 'pro', stopReason: repairResponse.stopReason },
418
+ ),
419
+ systemPrompt,
420
+ validateContext: { intent, context },
421
+ foldInAntiPatterns,
422
+ maxAttempts: 2,
423
+ });
424
+ messages = repairResult.messages;
425
+ const validation = repairResult.validation;
426
+ engine.submitStage(execId, 'validate', { ...validation, confidence: validation.score / 100 });
427
+
428
+ // REQ-03 (spec-factory-dx-ws4-acceptance): monolithic-pro is the ladder's
429
+ // terminal engine (cascade.js's ENGINE_LADDER) — its result is the one no
430
+ // exit gate ever runs against (the floor exemption cascade.js:84-88
431
+ // documents), so THIS is the one place `repairResult.exhausted` must
432
+ // survive instead of being silently discarded. "Flagged" means the
433
+ // returned object carries `acceptance.accepted === false` with a
434
+ // non-empty `failures` list whenever schema or catalog validation failed.
435
+ const acceptance = {
436
+ accepted: repairResult.valid,
437
+ exhausted: repairResult.exhausted,
438
+ failures: repairResult.valid ? [] : buildFailures(repairResult.validation, repairResult.catalogValidation),
439
+ };
440
+
441
+ // ── Stage 6: Store ──
442
+ // First-turn analysis is recorded so iteration turns can recover concepts +
443
+ // implied components for canvas-aware suggestions. The store keeps only the
444
+ // first turn's analysis value (later passes are nulls — by design).
445
+ const artifactId = storeId || execId;
446
+ store.record(artifactId, { messages, summary: intent, validation, intent, analysis });
447
+ engine.submitStage(execId, 'render', { stored: true, success: validation.valid });
448
+
449
+ // Pull the original analyzer output so suggestions stay anchored to the
450
+ // initial canvas concept even on iteration turns. Without this, chip
451
+ // clicks drift the suggestion pool away from the original intent.
452
+ const originalAnalysis = store.getOriginalAnalysis(artifactId);
453
+ const suggestions = generateSuggestions({ intent, domain, messages, originalAnalysis, originalIntent });
454
+
455
+ // ── Drift detection: warn when canvas structure diverges significantly ──
456
+ const driftMetrics = store.getDriftMetrics(artifactId);
457
+ if (driftMetrics?.warning) {
458
+ console.warn(`[generateUI:pro] ${driftMetrics.warning}`);
459
+ }
460
+
461
+ // Fire-and-forget feedback logging
462
+ feedbackStore.logExecution({
463
+ executionId: artifactId, intent, mode: 'pro',
464
+ domain: domain.domain, patternMatch: bestPattern?.name,
465
+ chunkMatch: chunkMatch ? chunkMatch.name : null,
466
+ composedFrom: hasFragments ? fragmentPatterns.map(f => f.pattern.name) : undefined,
467
+ score: validation?.score, componentCount: messages[0]?.components?.length || 0,
468
+ }).catch(() => {});
469
+
470
+ return {
471
+ executionId: artifactId,
472
+ messages,
473
+ validation,
474
+ acceptance,
475
+ suggestions,
476
+ drift: driftMetrics,
477
+ pipeline: engine.getState(execId),
478
+ // Debug payload for the dialog recorder. Only populated when
479
+ // ADIA_LOG_DIALOGS is on (the engine's capture sites guard with
480
+ // isRecording()). Underscore-prefixed so consumers can ignore it,
481
+ // and so it never accidentally appears in serialised API payloads
482
+ // unless the proxy explicitly forwards it.
483
+ _debug: isRecording() ? {
484
+ systemPrompt,
485
+ rawLLMResponse: lastRawResponse,
486
+ tokens: lastTokens,
487
+ patterns: patterns.slice(0, 8).map(p => ({ name: p.name, score: p.score, keywords: p.keywords })),
488
+ } : undefined,
489
+ };
490
+ }