@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,107 @@
1
+ const IS_NODE = typeof process !== "undefined" && !!process.versions?.node;
2
+ const ENABLED = IS_NODE && (process?.env?.["ADIA_LOG_DIALOGS"] === "1" || process?.env?.["ADIA_LOG_DIALOGS"] === "true");
3
+ let _fs = null;
4
+ let _path = null;
5
+ let _url = null;
6
+ let _logsRoot = null;
7
+ async function _ensureModules() {
8
+ if (_fs) return;
9
+ _fs = await import(
10
+ /* @vite-ignore */
11
+ "node:fs/promises"
12
+ );
13
+ _path = await import(
14
+ /* @vite-ignore */
15
+ "node:path"
16
+ );
17
+ _url = await import(
18
+ /* @vite-ignore */
19
+ "node:url"
20
+ );
21
+ const __dirname = _path.dirname(_url.fileURLToPath(import.meta.url));
22
+ _logsRoot = _path.resolve(__dirname, "..", "..", "..", "..", "logs", "dialogs");
23
+ }
24
+ const _turnCounter = /* @__PURE__ */ new Map();
25
+ const _sessionMetaWritten = /* @__PURE__ */ new Set();
26
+ async function recordTurn(record) {
27
+ if (!ENABLED) return null;
28
+ try {
29
+ await _ensureModules();
30
+ const sessionId = record.sessionId ?? `standalone-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}`;
31
+ const turnIdx = _turnCounter.get(sessionId) ?? 0;
32
+ _turnCounter.set(sessionId, turnIdx + 1);
33
+ const slug = String(record.intent ?? "turn").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32) || "turn";
34
+ const rand = Math.random().toString(36).slice(2, 6);
35
+ const fileName = `${String(turnIdx).padStart(3, "0")}-${slug}-${rand}.json`;
36
+ const sessionDir = _path.join(_logsRoot, sessionId);
37
+ await _fs.mkdir(sessionDir, { recursive: true });
38
+ if (!_sessionMetaWritten.has(sessionId) && turnIdx === 0) {
39
+ _sessionMetaWritten.add(sessionId);
40
+ const sessionMeta = {
41
+ sessionId,
42
+ startedAt: (/* @__PURE__ */ new Date()).toISOString(),
43
+ originIntent: record.intent ?? null,
44
+ engine: record.engine ?? null,
45
+ mode: record.mode ?? null,
46
+ model: record.model ?? null,
47
+ originAnalysis: record.analysis ? {
48
+ steelman: record.analysis.steelman ?? null,
49
+ concepts: record.analysis.concepts ?? [],
50
+ impliedComponents: record.analysis.impliedComponents ?? [],
51
+ styleHints: record.analysis.styleHints ?? []
52
+ } : null
53
+ };
54
+ await _fs.writeFile(
55
+ _path.join(sessionDir, "_session.json"),
56
+ JSON.stringify(sessionMeta, null, 2) + "\n"
57
+ );
58
+ }
59
+ const payload = {
60
+ // ── Identity ────────────────────────────────────────────────
61
+ sessionId,
62
+ turnIndex: turnIdx,
63
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
64
+ isIteration: !!record.isIteration,
65
+ // ── Request ─────────────────────────────────────────────────
66
+ intent: record.intent,
67
+ mode: record.mode ?? null,
68
+ engine: record.engine ?? null,
69
+ model: record.model ?? null,
70
+ currentCanvas: record.currentCanvas ?? null,
71
+ // ── Pipeline-side reasoning ─────────────────────────────────
72
+ analysis: record.analysis ?? null,
73
+ patterns: (record.patterns ?? []).slice(0, 10).map((p) => ({
74
+ name: p.name,
75
+ score: p.score ?? p.confidence ?? null,
76
+ keywords: p.keywords ?? null
77
+ })),
78
+ // ── LLM I/O ─────────────────────────────────────────────────
79
+ systemPrompt: record.systemPrompt ?? null,
80
+ rawLLMResponse: record.rawLLMResponse ?? null,
81
+ // ── Result ──────────────────────────────────────────────────
82
+ messages: record.messages ?? [],
83
+ validation: record.validation ?? null,
84
+ drift: record.drift ?? null,
85
+ suggestions: record.suggestions ?? [],
86
+ // ── Telemetry ───────────────────────────────────────────────
87
+ timing: record.timing ?? null,
88
+ tokens: record.tokens ?? null,
89
+ engineDebug: record.engineDebug ?? null
90
+ };
91
+ const filePath = _path.join(sessionDir, fileName);
92
+ await _fs.writeFile(filePath, JSON.stringify(payload, null, 2) + "\n");
93
+ return filePath;
94
+ } catch (err) {
95
+ console.warn("[dialog-recorder] failed to record turn:", err.message);
96
+ return null;
97
+ }
98
+ }
99
+ function isRecording() {
100
+ if (ENABLED) return true;
101
+ const IS_NODE_RT = typeof process !== "undefined" && process.versions?.node;
102
+ return IS_NODE_RT ? !!process?.env?.["A2UI_COMPOSE_TRACE"] : false;
103
+ }
104
+ export {
105
+ isRecording,
106
+ recordTurn
107
+ };
@@ -0,0 +1,180 @@
1
+ import { feedbackStore } from "./feedback-store.js";
2
+ import { categorizeIntent } from "../intent/intent-categorizer.js";
3
+ let fs = null;
4
+ let path = null;
5
+ const IS_NODE = typeof process !== "undefined" && process.versions?.node;
6
+ if (IS_NODE) {
7
+ try {
8
+ fs = await import(
9
+ /* @vite-ignore */
10
+ "node:fs/promises"
11
+ );
12
+ path = await import(
13
+ /* @vite-ignore */
14
+ "node:path"
15
+ );
16
+ } catch {
17
+ }
18
+ }
19
+ const FEEDBACK_DIR = path ? path.join(path.dirname(new URL(import.meta.url).pathname), "..", "..", "..", "gen-ui/corpus", "feedback") : null;
20
+ class FeedbackAnalyzer {
21
+ /**
22
+ * Read JSONL feedback files for the last N days.
23
+ */
24
+ async readRange(days = 30) {
25
+ if (!fs || !FEEDBACK_DIR) return [];
26
+ const entries = [];
27
+ const now = /* @__PURE__ */ new Date();
28
+ const dateStrings = /* @__PURE__ */ new Set();
29
+ for (let i = 0; i < days; i++) {
30
+ const d = new Date(now);
31
+ d.setDate(d.getDate() - i);
32
+ dateStrings.add(d.toISOString().slice(0, 10));
33
+ }
34
+ try {
35
+ const files = await fs.readdir(FEEDBACK_DIR);
36
+ const jsonlFiles = files.filter((f) => f.endsWith(".jsonl")).filter((f) => {
37
+ const dateStr = f.replace(".jsonl", "");
38
+ return dateStrings.has(dateStr);
39
+ }).sort();
40
+ for (const file of jsonlFiles) {
41
+ try {
42
+ const content = await fs.readFile(path.join(FEEDBACK_DIR, file), "utf8");
43
+ const lines = content.trim().split("\n").filter(Boolean);
44
+ for (const line of lines) {
45
+ try {
46
+ const entry = JSON.parse(line);
47
+ entry["_file"] = file;
48
+ entries.push(entry);
49
+ } catch {
50
+ }
51
+ }
52
+ } catch {
53
+ }
54
+ }
55
+ } catch {
56
+ }
57
+ return entries;
58
+ }
59
+ /**
60
+ * Aggregate feedback entries by intent category.
61
+ */
62
+ aggregateByIntent(entries) {
63
+ const buckets = /* @__PURE__ */ new Map();
64
+ const executions = entries.filter((e) => e.type === "execution");
65
+ const ratings = entries.filter((e) => e.type === "rating");
66
+ const ratingsByExecId = /* @__PURE__ */ new Map();
67
+ for (const r of ratings) {
68
+ if (!r.executionId) continue;
69
+ if (!ratingsByExecId.has(r.executionId)) {
70
+ ratingsByExecId.set(r.executionId, []);
71
+ }
72
+ ratingsByExecId.get(r.executionId).push(r);
73
+ }
74
+ for (const exec of executions) {
75
+ const { category } = categorizeIntent(exec.intent ?? "");
76
+ if (!buckets.has(category)) {
77
+ buckets.set(category, {
78
+ count: 0,
79
+ totalScore: 0,
80
+ totalRating: 0,
81
+ ratingCount: 0,
82
+ patternMatchCount: 0,
83
+ entries: [],
84
+ sampleIntents: []
85
+ });
86
+ }
87
+ const bucket = buckets.get(category);
88
+ bucket.count++;
89
+ bucket.totalScore += exec.score ?? 0;
90
+ bucket.entries.push(exec);
91
+ if (exec.patternMatch) {
92
+ bucket.patternMatchCount++;
93
+ }
94
+ if (bucket.sampleIntents.length < 5 && exec.intent) {
95
+ const intentLower = exec.intent.toLowerCase();
96
+ if (!bucket.sampleIntents.some((s) => s.toLowerCase() === intentLower)) {
97
+ bucket.sampleIntents.push(exec.intent);
98
+ }
99
+ }
100
+ const execRatings = ratingsByExecId.get(exec.executionId ?? "") ?? [];
101
+ for (const r of execRatings) {
102
+ bucket.totalRating += r.rating ?? 0;
103
+ bucket.ratingCount++;
104
+ }
105
+ }
106
+ const result = /* @__PURE__ */ new Map();
107
+ for (const [category, bucket] of buckets) {
108
+ result.set(category, {
109
+ count: bucket.count,
110
+ avgScore: bucket.count > 0 ? Math.round(bucket.totalScore / bucket.count) : 0,
111
+ avgRating: bucket.ratingCount > 0 ? Math.round(bucket.totalRating / bucket.ratingCount * 10) / 10 : 0,
112
+ patternMatchRate: bucket.count > 0 ? Math.round(bucket.patternMatchCount / bucket.count * 100) : 0,
113
+ sampleIntents: bucket.sampleIntents,
114
+ entries: bucket.entries
115
+ });
116
+ }
117
+ return result;
118
+ }
119
+ /**
120
+ * Find intent categories with weak performance.
121
+ */
122
+ findWeakIntents(aggregated, threshold = 60) {
123
+ const weak = [];
124
+ for (const [category, data] of aggregated) {
125
+ if (data.avgScore < threshold) {
126
+ weak.push({
127
+ category,
128
+ count: data.count,
129
+ avgScore: data.avgScore,
130
+ avgRating: data.avgRating,
131
+ sampleIntents: data.sampleIntents
132
+ });
133
+ }
134
+ }
135
+ return weak.sort((a, b) => a.avgScore - b.avgScore);
136
+ }
137
+ /**
138
+ * Find intent categories ready for pattern promotion.
139
+ * Criteria: avgScore >= 95, avgRating >= 4, count >= 3
140
+ */
141
+ findPromotionCandidates(aggregated) {
142
+ const candidates = [];
143
+ for (const [category, data] of aggregated) {
144
+ if (data.avgScore >= 95 && data.avgRating >= 4 && data.count >= 3) {
145
+ candidates.push({
146
+ category,
147
+ count: data.count,
148
+ avgScore: data.avgScore,
149
+ avgRating: data.avgRating,
150
+ patternMatchRate: data.patternMatchRate,
151
+ sampleIntents: data.sampleIntents
152
+ });
153
+ }
154
+ }
155
+ return candidates.sort((a, b) => b.avgScore - a.avgScore);
156
+ }
157
+ /**
158
+ * Find intent categories with no pattern match AND low scores — gaps in pattern coverage.
159
+ */
160
+ findPatternGaps(aggregated) {
161
+ const gaps = [];
162
+ for (const [category, data] of aggregated) {
163
+ if (data.patternMatchRate === 0 && data.avgScore < 70) {
164
+ gaps.push({
165
+ category,
166
+ count: data.count,
167
+ avgScore: data.avgScore,
168
+ avgRating: data.avgRating,
169
+ patternMatchRate: data.patternMatchRate,
170
+ sampleIntents: data.sampleIntents
171
+ });
172
+ }
173
+ }
174
+ return gaps.sort((a, b) => a.avgScore - b.avgScore);
175
+ }
176
+ }
177
+ export {
178
+ FeedbackAnalyzer,
179
+ feedbackStore
180
+ };
@@ -0,0 +1,194 @@
1
+ import { rankWeakDomains, summarizeRatings } from "./human-signal.js";
2
+ let fs = null;
3
+ let path = null;
4
+ const IS_NODE = typeof process !== "undefined" && process.versions?.node;
5
+ if (IS_NODE) {
6
+ try {
7
+ fs = await import(
8
+ /* @vite-ignore */
9
+ "node:fs/promises"
10
+ );
11
+ path = await import(
12
+ /* @vite-ignore */
13
+ "node:path"
14
+ );
15
+ } catch {
16
+ }
17
+ }
18
+ function feedbackDir() {
19
+ if (!path) return null;
20
+ const override = typeof process !== "undefined" ? process.env?.["A2UI_FEEDBACK_DIR"] : void 0;
21
+ if (override) return override;
22
+ return path.join(path.dirname(new URL(import.meta.url).pathname), "..", "..", "..", "gen-ui/corpus", "feedback");
23
+ }
24
+ function todayFile() {
25
+ const dir = feedbackDir();
26
+ if (!path || !dir) return null;
27
+ const d = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
28
+ return path.join(dir, `${d}.jsonl`);
29
+ }
30
+ async function append(entry) {
31
+ const dir = feedbackDir();
32
+ if (!fs || !dir) return;
33
+ try {
34
+ await fs.mkdir(dir, { recursive: true });
35
+ await fs.appendFile(todayFile(), JSON.stringify(entry) + "\n");
36
+ } catch (e) {
37
+ console.warn("FeedbackStore: write failed", e.message);
38
+ }
39
+ }
40
+ const feedbackStore = {
41
+ /** Log a completed generation execution. */
42
+ async logExecution({
43
+ executionId,
44
+ intent,
45
+ model,
46
+ domain,
47
+ mode,
48
+ patternMatch,
49
+ patternConfidence,
50
+ score,
51
+ componentCount,
52
+ tokenCount,
53
+ meta
54
+ }) {
55
+ await append({
56
+ type: "execution",
57
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
58
+ executionId,
59
+ intent,
60
+ model,
61
+ domain,
62
+ mode,
63
+ patternMatch,
64
+ patternConfidence,
65
+ score,
66
+ componentCount,
67
+ tokenCount,
68
+ meta: meta ?? null
69
+ });
70
+ },
71
+ /**
72
+ * Log a user rating (thumbs up / thumbs down).
73
+ *
74
+ * The context fields are optional and additive — pre-existing rating lines
75
+ * without them still parse. Supplying `domain` is what lets human signal
76
+ * rank weak domains without an execution join (see `human-signal.ts`).
77
+ */
78
+ async logRating({ executionId, rating, intent, domain, engine, strategy, score, source, notes }) {
79
+ await append({
80
+ type: "rating",
81
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
82
+ executionId,
83
+ rating,
84
+ intent,
85
+ ...domain ? { domain } : {},
86
+ ...engine ? { engine } : {},
87
+ ...strategy ? { strategy } : {},
88
+ ...typeof score === "number" ? { score } : {},
89
+ ...source ? { source } : {},
90
+ ...notes ? { notes } : {}
91
+ });
92
+ },
93
+ /** Log a pattern save action. */
94
+ async logPatternSave({ executionId, patternName, intent }) {
95
+ await append({
96
+ type: "pattern_save",
97
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
98
+ executionId,
99
+ patternName,
100
+ intent
101
+ });
102
+ },
103
+ /** Log a training gap identified by LLM meta or heuristics. */
104
+ async logGap({ type, description, source, executionId }) {
105
+ await append({
106
+ type: "gap",
107
+ gapType: type,
108
+ // 'pattern' | 'domain' | 'component' | 'prompt'
109
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
110
+ description,
111
+ source,
112
+ executionId
113
+ });
114
+ },
115
+ /** Read recent feedback entries (Node only). */
116
+ async readRecent(limit = 100) {
117
+ const dir = feedbackDir();
118
+ if (!fs || !dir) return [];
119
+ try {
120
+ const files = (await fs.readdir(dir)).filter((f) => f.endsWith(".jsonl")).sort().reverse();
121
+ const entries = [];
122
+ for (const file of files) {
123
+ if (entries.length >= limit) break;
124
+ const content = await fs.readFile(path.join(dir, file), "utf8");
125
+ const lines = content.trim().split("\n").filter(Boolean).reverse();
126
+ for (const line of lines) {
127
+ if (entries.length >= limit) break;
128
+ try {
129
+ entries.push(JSON.parse(line));
130
+ } catch {
131
+ }
132
+ }
133
+ }
134
+ return entries;
135
+ } catch {
136
+ return [];
137
+ }
138
+ },
139
+ /** Get gap summary — aggregate gap signals for training improvement. */
140
+ async getGapSummary() {
141
+ const entries = await this.readRecent(500);
142
+ const gaps = entries.filter((e) => e["type"] === "gap");
143
+ const byType = {};
144
+ for (const g of gaps) {
145
+ if (!byType[g.gapType]) byType[g.gapType] = [];
146
+ byType[g.gapType].push(g.description ?? "");
147
+ }
148
+ return byType;
149
+ },
150
+ /**
151
+ * Get quality metrics — aggregate from recent executions and human ratings.
152
+ *
153
+ * `thumbUpRate` is a percentage over rating entries alone: it is reported
154
+ * even when the read window holds no executions, because a rated surface
155
+ * whose generation happened offline (the gen-UI gallery) has ratings without
156
+ * matching execution lines. Before gh#668 this method returned early on
157
+ * `executions === 0` and swallowed those thumbs entirely.
158
+ */
159
+ async getQualityMetrics() {
160
+ const entries = await this.readRecent(500);
161
+ const executions = entries.filter((e) => e["type"] === "execution");
162
+ const ratings = summarizeRatings(entries);
163
+ const domains = rankWeakDomains(entries, { limit: Number.MAX_SAFE_INTEGER });
164
+ const avgScore = executions.length > 0 ? executions.reduce((s, e) => s + (e.score ?? 0), 0) / executions.length : 0;
165
+ const avgTokens = executions.length > 0 ? executions.reduce((s, e) => s + (e.tokenCount ?? 0), 0) / executions.length : 0;
166
+ return {
167
+ executions: executions.length,
168
+ avgScore: Math.round(avgScore),
169
+ avgTokens: Math.round(avgTokens),
170
+ thumbUpRate: ratings.thumbUpRate,
171
+ ratings,
172
+ byDomain: Object.fromEntries(
173
+ domains.map((d) => [d.domain, {
174
+ count: d.executions,
175
+ avgScore: d.selfScore,
176
+ humanRatings: d.humanRatings,
177
+ thumbUpRate: d.humanScore
178
+ }])
179
+ ),
180
+ gaps: await this.getGapSummary()
181
+ };
182
+ },
183
+ /**
184
+ * Rank domains weakest-first, weighing human thumbs above the self-grade.
185
+ * The rule lives in `human-signal.ts`; this is the store-backed entry point.
186
+ */
187
+ async getWeakDomains(limit = 10) {
188
+ const entries = await this.readRecent(500);
189
+ return rankWeakDomains(entries, { limit });
190
+ }
191
+ };
192
+ export {
193
+ feedbackStore
194
+ };
@@ -0,0 +1,117 @@
1
+ class FeedbackCollector {
2
+ #entries = /* @__PURE__ */ new Map();
3
+ /**
4
+ * Initialize a feedback entry from generation results.
5
+ * Called automatically after each generation completes.
6
+ */
7
+ initFromGeneration(executionId, { intent, domain, mode, messages, validation }) {
8
+ const components = messages?.[0]?.components ?? [];
9
+ const checks = validation?.checks ?? [];
10
+ const failedChecks = checks.filter((c) => !c.passed);
11
+ const structural = failedChecks.some(
12
+ (c) => ["hasRootComponent", "noOrphanedChildren", "flatAdjacency"].includes(c.name)
13
+ ) ? 0.5 : 1;
14
+ const completeness = Math.max(0, 1 - failedChecks.filter((c) => ["textContentSet", "allTypesRegistered"].includes(c.name)).length * 0.1);
15
+ const idiomatic = failedChecks.some(
16
+ (c) => ["noBareDivs", "noBareInputs", "cardStructure"].includes(c.name)
17
+ ) ? 0.5 : 1;
18
+ const minimal = failedChecks.some(
19
+ (c) => ["noHardcodedColors", "noInlineLayout"].includes(c.name)
20
+ ) ? 0.5 : 1;
21
+ this.#entries.set(executionId, {
22
+ executionId,
23
+ intent: intent ?? "",
24
+ domain: domain ?? "",
25
+ mode: mode ?? "instant",
26
+ timestamp: Date.now(),
27
+ generation: {
28
+ componentCount: components.length,
29
+ componentTypes: [...new Set(components.map((c) => c.component).filter((x) => Boolean(x)))],
30
+ score: validation?.score ?? 0,
31
+ validationChecks: checks.map((c) => ({ name: c.name, passed: c.passed })),
32
+ qualityDimensions: { structural, completeness, idiomatic, minimal }
33
+ },
34
+ feedback: {},
35
+ patterns: {}
36
+ });
37
+ }
38
+ /**
39
+ * Collect user feedback for an execution.
40
+ */
41
+ collectFeedback(executionId, feedback) {
42
+ const entry = this.#entries.get(executionId);
43
+ if (!entry) {
44
+ this.#entries.set(executionId, {
45
+ executionId,
46
+ intent: "",
47
+ domain: "",
48
+ mode: "",
49
+ timestamp: Date.now(),
50
+ generation: { componentCount: 0, componentTypes: [], score: 0, validationChecks: [], qualityDimensions: { structural: 0, completeness: 0, idiomatic: 0, minimal: 0 } },
51
+ feedback: {},
52
+ patterns: {}
53
+ });
54
+ }
55
+ const e = this.#entries.get(executionId);
56
+ e.feedback = { ...e.feedback, ...feedback };
57
+ }
58
+ /**
59
+ * Collect pattern-related feedback.
60
+ */
61
+ collectPatternFeedback(executionId, patternFeedback) {
62
+ const entry = this.#entries.get(executionId);
63
+ if (!entry) return;
64
+ entry.patterns = { ...entry.patterns, ...patternFeedback };
65
+ }
66
+ /**
67
+ * Get a single feedback entry.
68
+ */
69
+ get(executionId) {
70
+ return this.#entries.get(executionId) ?? null;
71
+ }
72
+ /**
73
+ * Get all feedback entries.
74
+ */
75
+ getAll() {
76
+ return [...this.#entries.values()];
77
+ }
78
+ /** Number of entries. */
79
+ get size() {
80
+ return this.#entries.size;
81
+ }
82
+ /**
83
+ * Export all feedback as structured JSON.
84
+ * In browser: triggers a file download.
85
+ * In Node: returns the JSON string.
86
+ */
87
+ exportFeedback() {
88
+ const data = {
89
+ exportedAt: (/* @__PURE__ */ new Date()).toISOString(),
90
+ entryCount: this.#entries.size,
91
+ entries: this.getAll()
92
+ };
93
+ const json = JSON.stringify(data, null, 2);
94
+ if (typeof document !== "undefined") {
95
+ const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
96
+ const blob = new Blob([json], { type: "application/json" });
97
+ const url = URL.createObjectURL(blob);
98
+ const a = document.createElement("a");
99
+ a.href = url;
100
+ a.download = `gen-ui-feedback-${date}.json`;
101
+ a.style.display = "none";
102
+ a.addEventListener("click", (e) => e.stopPropagation());
103
+ document.body.appendChild(a);
104
+ a.click();
105
+ document.body.removeChild(a);
106
+ URL.revokeObjectURL(url);
107
+ }
108
+ return json;
109
+ }
110
+ /** Clear all entries. */
111
+ clear() {
112
+ this.#entries.clear();
113
+ }
114
+ }
115
+ export {
116
+ FeedbackCollector
117
+ };
@@ -0,0 +1,80 @@
1
+ let fs = null;
2
+ let path = null;
3
+ const IS_NODE = typeof process !== "undefined" && process.versions?.node;
4
+ if (IS_NODE) {
5
+ try {
6
+ fs = await import(
7
+ /* @vite-ignore */
8
+ "node:fs/promises"
9
+ );
10
+ path = await import(
11
+ /* @vite-ignore */
12
+ "node:path"
13
+ );
14
+ } catch {
15
+ }
16
+ }
17
+ const REGISTRY_PATH = path ? path.join(path.dirname(new URL(import.meta.url).pathname), "..", "..", "..", "gen-ui/corpus", "gaps", "registry.json") : null;
18
+ async function loadGaps() {
19
+ if (!fs || !REGISTRY_PATH) return [];
20
+ try {
21
+ const content = await fs.readFile(REGISTRY_PATH, "utf8");
22
+ return JSON.parse(content);
23
+ } catch {
24
+ return [];
25
+ }
26
+ }
27
+ async function saveGaps(gaps) {
28
+ if (!fs || !REGISTRY_PATH) return;
29
+ const dir = path.dirname(REGISTRY_PATH);
30
+ await fs.mkdir(dir, { recursive: true });
31
+ await fs.writeFile(REGISTRY_PATH, JSON.stringify(gaps, null, 2) + "\n");
32
+ }
33
+ async function addGap(gap) {
34
+ const gaps = await loadGaps();
35
+ const existing = gaps.find((g) => g.intentCategory === gap.intentCategory && g.status !== "resolved");
36
+ if (existing) {
37
+ existing.sampleCount = gap.sampleCount ?? existing.sampleCount;
38
+ existing.avgScore = gap.avgScore ?? existing.avgScore;
39
+ existing.avgRating = gap.avgRating ?? existing.avgRating;
40
+ existing.lastSeen = (/* @__PURE__ */ new Date()).toISOString();
41
+ const intentSet = /* @__PURE__ */ new Set([...existing.sampleIntents, ...gap.sampleIntents ?? []]);
42
+ existing.sampleIntents = [...intentSet].slice(0, 10);
43
+ } else {
44
+ gaps.push({
45
+ intentCategory: gap.intentCategory,
46
+ detectedAt: (/* @__PURE__ */ new Date()).toISOString(),
47
+ lastSeen: (/* @__PURE__ */ new Date()).toISOString(),
48
+ sampleCount: gap.sampleCount ?? 0,
49
+ avgScore: gap.avgScore ?? 0,
50
+ avgRating: gap.avgRating ?? 0,
51
+ status: "open",
52
+ resolution: null,
53
+ sampleIntents: (gap.sampleIntents ?? []).slice(0, 10)
54
+ });
55
+ }
56
+ await saveGaps(gaps);
57
+ return gaps;
58
+ }
59
+ async function updateGapStatus(category, status, resolution) {
60
+ const gaps = await loadGaps();
61
+ const gap = gaps.find((g) => g.intentCategory === category && g.status !== "resolved");
62
+ if (!gap) {
63
+ throw new Error(`No open gap found for category: ${category}`);
64
+ }
65
+ gap.status = status;
66
+ if (resolution) {
67
+ gap.resolution = resolution;
68
+ }
69
+ if (status === "resolved") {
70
+ gap.resolvedAt = (/* @__PURE__ */ new Date()).toISOString();
71
+ }
72
+ await saveGaps(gaps);
73
+ return gap;
74
+ }
75
+ export {
76
+ addGap,
77
+ loadGaps,
78
+ saveGaps,
79
+ updateGapStatus
80
+ };