@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,607 @@
1
+ /**
2
+ * Issue-reporter — first-class telemetry surface for the gen-UI engine.
3
+ *
4
+ * Three call paths converge here:
5
+ * 1. LLM self-fire — the `report_issue` MCP tool. ctx.reporter = 'llm'.
6
+ * 2. Consumer-fire — human user requests a bug ticket. ctx.reporter = 'user'.
7
+ * 3. Engine auto-fire — internal failure paths trigger `autoReport(reason)`.
8
+ * ctx.reporter = 'auto'. Suppressed when ctx.evalMode is true.
9
+ *
10
+ * Every issue lands as immutable JSON under `qa/findings/issues/`.
11
+ * Traces > 200KB spill to a sidecar `.trace.json` next to the issue.
12
+ *
13
+ * Spec: .claude/docs/specs/genui-multiturn-architecture.md §3.5 + §4.6 + §11.
14
+ *
15
+ * Distinct from the curated `.tickets/` system (corpus/scripts/ticket.mjs):
16
+ * those are human-authored work items. Issues here are runtime telemetry —
17
+ * promoted to tickets during weekly triage when patterns emerge (spec §11.5).
18
+ */
19
+
20
+ import { mkdir, writeFile } from 'node:fs/promises';
21
+ import { dirname, resolve, join } from 'node:path';
22
+ import { fileURLToPath } from 'node:url';
23
+
24
+ const __dirname = dirname(fileURLToPath(import.meta.url));
25
+ const REPO_ROOT = resolve(__dirname, '../../../../..');
26
+ const DEFAULT_STORAGE_ROOT = resolve(REPO_ROOT, 'qa/findings/issues');
27
+ const TRACE_INLINE_THRESHOLD_BYTES = 200 * 1024;
28
+
29
+ const VALID_TYPES = new Set(['bug', 'training-gap', 'protocol-gap', 'ux-feedback']);
30
+ const VALID_SEVERITIES = new Set(['blocker', 'drift', 'nit']);
31
+ const VALID_OWNERS = new Set(['synthesis', 'retrieval', 'validator', 'chunk-corpus', 'mcp-protocol', 'unknown']);
32
+ const VALID_TRACE_DEPTHS = new Set(['full', 'summary', 'none']);
33
+ const VALID_REPORTER_KINDS = new Set(['auto', 'user', 'llm']);
34
+
35
+ const SEVERITY_RANK = { nit: 0, drift: 1, blocker: 2 };
36
+
37
+ /**
38
+ * Auto-fire policy: maps reason → defaults for type/severity/owner/title.
39
+ * Spec §11.3.
40
+ */
41
+ export const AUTO_FIRE_POLICY = {
42
+ 'synthesizer-exhausted': {
43
+ type: 'bug',
44
+ severity: 'drift',
45
+ suggested_owner: 'synthesis',
46
+ titleFor: (ctx) => `Synthesizer exhausted retries${ctx?.intent ? ` for "${truncate(ctx.intent, 50)}"` : ''}`,
47
+ },
48
+ 'validator-exhausted': {
49
+ type: 'bug',
50
+ severity: 'blocker',
51
+ suggested_owner: 'validator',
52
+ titleFor: (ctx) => `Validator exhausted retries on ${ctx?.tool || 'refine_composition'}`,
53
+ },
54
+ 'locator-empty-targets': {
55
+ type: 'bug',
56
+ severity: 'drift',
57
+ suggested_owner: 'synthesis',
58
+ titleFor: (ctx) => `Locator pass returned empty targets${ctx?.intent ? ` for "${truncate(ctx.intent, 50)}"` : ''}`,
59
+ },
60
+ 'retrieval-zero-then-synthesis-fail': {
61
+ type: 'training-gap',
62
+ severity: 'drift',
63
+ suggested_owner: 'chunk-corpus',
64
+ titleFor: (ctx) => `Retrieval returned 0 candidates and synthesis failed${ctx?.intent ? ` for "${truncate(ctx.intent, 40)}"` : ''}`,
65
+ },
66
+ 'cache-miss-on-known-state': {
67
+ type: 'bug',
68
+ severity: 'nit',
69
+ suggested_owner: 'mcp-protocol',
70
+ titleFor: (ctx) => `get_state called with unknown state_id "${truncate(ctx?.state_id || 'unknown', 40)}"`,
71
+ },
72
+ 'ops-failed-after-apply': {
73
+ type: 'bug',
74
+ severity: 'drift',
75
+ suggested_owner: 'validator',
76
+ titleFor: () => `refine_composition ops_failed list non-empty after apply`,
77
+ },
78
+ 'scope-drift': {
79
+ type: 'bug',
80
+ severity: 'drift',
81
+ suggested_owner: 'synthesis',
82
+ titleFor: (ctx) => {
83
+ const ratio = ctx?.scopeDrift?.ratio != null ? `${ctx.scopeDrift.ratio.toFixed(1)}×` : '';
84
+ const intent = ctx?.intent ? ` for "${truncate(ctx.intent, 40)}"` : '';
85
+ return `Scope drift${ratio ? ' ' + ratio : ''}: composed HTML exceeds bound-chunk envelope${intent}`;
86
+ },
87
+ },
88
+ 'iteration-synthesis-failure': {
89
+ type: 'bug',
90
+ severity: 'drift',
91
+ suggested_owner: 'synthesis',
92
+ titleFor: (ctx) => {
93
+ const turn = ctx?.turn != null ? ` on turn ${ctx.turn}` : '';
94
+ const intent = ctx?.intent ? ` for "${truncate(ctx.intent, 40)}"` : '';
95
+ return `Iteration synthesis failed${turn}${intent}`;
96
+ },
97
+ },
98
+ };
99
+
100
+ function truncate(s, n = 60) {
101
+ if (!s || typeof s !== 'string') return '';
102
+ return s.length > n ? `${s.slice(0, n - 1)}…` : s;
103
+ }
104
+
105
+ function slugify(s, max = 40) {
106
+ return (s || '')
107
+ .toLowerCase()
108
+ .replace(/[^a-z0-9]+/g, '-')
109
+ .replace(/^-+|-+$/g, '')
110
+ .slice(0, max);
111
+ }
112
+
113
+ function mintIssueId(title) {
114
+ const date = new Date().toISOString().slice(0, 10);
115
+ const titleSlug = slugify(title) || 'issue';
116
+ const rand4 = Math.floor(Math.random() * 0xffff).toString(16).padStart(4, '0');
117
+ return `${date}-${titleSlug}-${rand4}`;
118
+ }
119
+
120
+ function getStorageRoot(ctx) {
121
+ return ctx?.storageRoot || DEFAULT_STORAGE_ROOT;
122
+ }
123
+
124
+ function validateInput(input) {
125
+ if (!input || typeof input !== 'object') {
126
+ throw new Error('reportIssue: input is required');
127
+ }
128
+ if (!input.title || typeof input.title !== 'string') {
129
+ throw new Error('reportIssue: title (string) is required');
130
+ }
131
+ if (input.title.length > 80) {
132
+ throw new Error('reportIssue: title must be ≤ 80 chars');
133
+ }
134
+ if (typeof input.body !== 'string') {
135
+ throw new Error('reportIssue: body (string) is required');
136
+ }
137
+ if (!VALID_TYPES.has(input.type)) {
138
+ throw new Error(`reportIssue: type must be one of ${[...VALID_TYPES].join('|')}`);
139
+ }
140
+ if (!VALID_SEVERITIES.has(input.severity)) {
141
+ throw new Error(`reportIssue: severity must be one of ${[...VALID_SEVERITIES].join('|')}`);
142
+ }
143
+ if (input.suggested_owner != null && !VALID_OWNERS.has(input.suggested_owner)) {
144
+ throw new Error(`reportIssue: suggested_owner must be one of ${[...VALID_OWNERS].join('|')}`);
145
+ }
146
+ if (input.trace != null && !VALID_TRACE_DEPTHS.has(input.trace)) {
147
+ throw new Error(`reportIssue: trace must be one of ${[...VALID_TRACE_DEPTHS].join('|')}`);
148
+ }
149
+ if (input.tags != null && !Array.isArray(input.tags)) {
150
+ throw new Error('reportIssue: tags must be an array');
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Pull a trace from the cached state-entry.
156
+ *
157
+ * `summary` — final intent + last 5 ops + warnings (compact).
158
+ * `full` — every prompt, every LLM response, every validator result, every retry.
159
+ *
160
+ * Returns null when state_id is absent from the cache.
161
+ *
162
+ * @param {string} state_id
163
+ * @param {'full'|'summary'} depth
164
+ * @param {object} cache — StateCache instance (uses .peek() to avoid touching recency)
165
+ */
166
+ export async function attachTrace(state_id, depth, cache) {
167
+ if (!cache || typeof cache.peek !== 'function') return null;
168
+ const entry = cache.peek(state_id);
169
+ if (!entry) return null;
170
+ if (depth === 'none') return null;
171
+
172
+ const baseTrace = {
173
+ state_id,
174
+ tool: entry.tool ?? null,
175
+ input: entry.input ?? null,
176
+ };
177
+
178
+ if (depth === 'summary') {
179
+ return {
180
+ ...baseTrace,
181
+ output: {
182
+ ops: (entry.ops_history || []).slice(-5),
183
+ delta_summary: entry.delta_summary ?? null,
184
+ },
185
+ warnings: entry.warnings || [],
186
+ duration_ms: entry.duration_ms ?? null,
187
+ };
188
+ }
189
+
190
+ // 'full' — high-resolution session trace. Includes everything from
191
+ // summary plus the synthesis breadcrumbs (retrieval log, LLM prompts,
192
+ // raw responses per attempt, validation, plan, composed HTML preview)
193
+ // so a human reviewer or future agent can replay the full session.
194
+ return {
195
+ ...baseTrace,
196
+ intent: entry.intent ?? null,
197
+ source: entry.source ?? null,
198
+ score: entry.score ?? null,
199
+ plan: entry.plan ?? null,
200
+ synthesis: entry.synthesis ?? null, // retrievalTrace, attemptsLog, prompts
201
+ htmlPreview: entry.html ? truncateHtmlForTrace(entry.html) : null,
202
+ componentCount: entry.html ? countComponents(entry.html) : null,
203
+ scopeDrift: entry.scopeDrift ?? null,
204
+ internal: entry.internal ?? null,
205
+ output: entry.output ?? {
206
+ ops: entry.ops_history || [],
207
+ delta_summary: entry.delta_summary ?? null,
208
+ },
209
+ warnings: entry.warnings || [],
210
+ duration_ms: entry.duration_ms ?? null,
211
+ parent_state_id: entry.parent_state_id ?? null,
212
+ created_at: entry.created_at ?? null,
213
+ };
214
+ }
215
+
216
+ const HTML_PREVIEW_MAX_BYTES = 8 * 1024;
217
+
218
+ function truncateHtmlForTrace(html) {
219
+ if (typeof html !== 'string') return null;
220
+ if (html.length <= HTML_PREVIEW_MAX_BYTES) return html;
221
+ return html.slice(0, HTML_PREVIEW_MAX_BYTES) + `\n<!-- ... ${html.length - HTML_PREVIEW_MAX_BYTES} bytes truncated -->`;
222
+ }
223
+
224
+ function countComponents(html) {
225
+ if (typeof html !== 'string') return 0;
226
+ // Count opening tags (excluding void/standalone HTML elements that
227
+ // don't contribute to A2UI component count). Loose heuristic; signals
228
+ // scope drift even if it's not a perfect protocol-level count.
229
+ return (html.match(/<[a-z][a-z0-9-]*/g) || []).length;
230
+ }
231
+
232
+ /**
233
+ * Write an issue to disk.
234
+ *
235
+ * @returns {Promise<{ issue_id, path, ack: 'logged' }>}
236
+ */
237
+ export async function reportIssue(input, ctx = {}) {
238
+ validateInput(input);
239
+
240
+ const storageRoot = getStorageRoot(ctx);
241
+ await mkdir(storageRoot, { recursive: true });
242
+
243
+ const issue_id = mintIssueId(input.title);
244
+ const created_at = new Date().toISOString();
245
+
246
+ const reporterKind = ctx.reporter && VALID_REPORTER_KINDS.has(ctx.reporter)
247
+ ? ctx.reporter
248
+ : 'user';
249
+
250
+ // Default to 'full' when a state_id is provided — high-resolution session
251
+ // tickets are the design intent (the previous 'summary' default produced
252
+ // tickets too thin to debug from). Caller can opt down to 'summary' or
253
+ // 'none' explicitly.
254
+ const traceDepth = input.trace ?? (input.state_id ? 'full' : 'none');
255
+ let trace = null;
256
+ if (input.state_id && traceDepth !== 'none') {
257
+ trace = await attachTrace(input.state_id, traceDepth, ctx.cache);
258
+ }
259
+
260
+ // Spill oversized traces to a sidecar file
261
+ let tracePayload = trace;
262
+ if (trace && JSON.stringify(trace).length > TRACE_INLINE_THRESHOLD_BYTES) {
263
+ const tracesDir = join(storageRoot, 'traces');
264
+ await mkdir(tracesDir, { recursive: true });
265
+ const tracePath = join(tracesDir, `${issue_id}.trace.json`);
266
+ await writeFile(tracePath, JSON.stringify(trace, null, 2));
267
+ tracePayload = { sidecar: `traces/${issue_id}.trace.json` };
268
+ }
269
+
270
+ const issue = {
271
+ issue_id,
272
+ created_at,
273
+ type: input.type,
274
+ severity: input.severity,
275
+ status: 'open',
276
+ title: input.title,
277
+ body: input.body,
278
+ reporter: {
279
+ kind: reporterKind,
280
+ context: ctx.reporterContext ?? null,
281
+ },
282
+ trace: tracePayload,
283
+ environment: ctx.versionInfo ?? null,
284
+ suggested_owner: input.suggested_owner ?? 'unknown',
285
+ tags: input.tags ?? [],
286
+ related_issue_ids: ctx.related_issue_ids ?? [],
287
+ linked_specs: ctx.linked_specs ?? ['.claude/docs/specs/genui-multiturn-architecture.md'],
288
+ };
289
+
290
+ const path = join(storageRoot, `${issue_id}.json`);
291
+ await writeFile(path, JSON.stringify(issue, null, 2));
292
+
293
+ // Write a sibling Markdown report for human review. The JSON ticket
294
+ // is the machine-readable source of truth; the .md is the readable
295
+ // surface a maintainer scans first to triage. Always written when
296
+ // we have a non-trivial trace (full or summary), so reviewers can
297
+ // see retrieval log, LLM prompts, attempts, plan, and composed HTML
298
+ // without reading the raw JSON.
299
+ let markdown_path = null;
300
+ if (trace) {
301
+ markdown_path = join(storageRoot, `${issue_id}.md`);
302
+ await writeFile(markdown_path, renderTicketMarkdown(issue, trace));
303
+ }
304
+
305
+ return {
306
+ issue_id,
307
+ path, // .json (machine-readable)
308
+ markdown_path, // .md (human-readable; null when trace='none')
309
+ ack: 'logged',
310
+ severity: issue.severity,
311
+ suggested_owner: issue.suggested_owner,
312
+ };
313
+ }
314
+
315
+ /**
316
+ * Render the high-resolution session ticket as Markdown.
317
+ * Sections (each appears only if relevant data exists):
318
+ * 1. Header (id, severity, type, title, owner, tags)
319
+ * 2. Description (body)
320
+ * 3. Reproduction (intent, state_id, source, score)
321
+ * 4. Component-count drift (heuristic; flagged when > 50 components)
322
+ * 5. Retrieval log (Tier 1 hits + Tier 2 catalog summary)
323
+ * 6. LLM trace (each attempt's raw response)
324
+ * 7. Composer plan (slot bindings)
325
+ * 8. HTML preview (first 8KB of generated output)
326
+ * 9. Warnings + ops history
327
+ * 10. Environment (mcp/engine/model)
328
+ */
329
+ function renderTicketMarkdown(issue, trace) {
330
+ const lines = [];
331
+ lines.push(`# ${issue.title}`);
332
+ lines.push('');
333
+ lines.push(`> **${issue.severity.toUpperCase()}** · ${issue.type} · owner: \`${issue.suggested_owner}\` · ${issue.created_at}`);
334
+ lines.push('> ');
335
+ lines.push(`> Issue ID: \`${issue.issue_id}\`${issue.tags?.length ? ' · tags: ' + issue.tags.map((t) => '`' + t + '`').join(' ') : ''}`);
336
+ lines.push('');
337
+
338
+ if (issue.body) {
339
+ lines.push('## Description');
340
+ lines.push('');
341
+ lines.push(issue.body);
342
+ lines.push('');
343
+ }
344
+
345
+ if (trace.intent || trace.state_id) {
346
+ lines.push('## Reproduction');
347
+ lines.push('');
348
+ if (trace.intent) lines.push(`- **Intent**: \`${trace.intent}\``);
349
+ if (trace.state_id) lines.push(`- **State ID**: \`${trace.state_id}\``);
350
+ if (trace.source) lines.push(`- **Source**: ${trace.source}${trace.score != null ? ` (score: ${trace.score.toFixed(3)})` : ''}`);
351
+ if (trace.parent_state_id) lines.push(`- **Parent state**: \`${trace.parent_state_id}\``);
352
+ if (trace.duration_ms != null) lines.push(`- **Duration**: ${trace.duration_ms}ms`);
353
+ lines.push('');
354
+ }
355
+
356
+ if (trace.componentCount != null) {
357
+ lines.push('## Component count');
358
+ lines.push('');
359
+ lines.push(`- **${trace.componentCount}** components in generated HTML`);
360
+ if (trace.scopeDrift) {
361
+ const sd = trace.scopeDrift;
362
+ const flag = sd.drift ? ' ⚠ **scope drift**' : '';
363
+ const ratio = sd.ratio != null ? `${sd.ratio.toFixed(2)}×` : 'n/a';
364
+ lines.push(`- Bound-chunk envelope: ${sd.expected} components`);
365
+ lines.push(`- Ratio (actual / expected): **${ratio}**${flag}`);
366
+ if (sd.drift) {
367
+ lines.push('');
368
+ lines.push(`> The composed HTML's component count exceeds the bound chunks' envelope by more than the drift gate. This is the canvas-drift regression class — the synthesizer materialized markup beyond what the retrieved chunks justify.`);
369
+ }
370
+ } else if (trace.componentCount > 50) {
371
+ lines.push('- ⚠ over-generation candidate (>50 components, no scope-drift signal available)');
372
+ }
373
+ lines.push('');
374
+ }
375
+
376
+ if (trace.synthesis?.retrievalTrace) {
377
+ const r = trace.synthesis.retrievalTrace;
378
+ lines.push('## Retrieval log');
379
+ lines.push('');
380
+ lines.push(`**Tier 1** (semantic-blended, threshold ${r.tier1Threshold}, ${r.tier1Pass ? '✓ pass' : '✗ fall through to Tier 2'})`);
381
+ lines.push('');
382
+ lines.push('| rank | score | kind | chunk |');
383
+ lines.push('|------|------:|------|-------|');
384
+ r.tier1Hits.forEach((h, i) => lines.push(`| ${i + 1} | ${h.score} | ${h.kind} | \`${h.name}\` |`));
385
+ lines.push('');
386
+ if (r.catalogSize) {
387
+ lines.push(`**Tier 2 catalog**: ${r.catalogSize} chunks (${r.catalogPageNames.length} page · ${r.catalogPanelNames.length} panel · ${r.catalogBlockTopN.length} top-block)`);
388
+ lines.push('');
389
+ if (r.catalogBlockTopN.length) {
390
+ lines.push('Top block candidates:');
391
+ for (const h of r.catalogBlockTopN) lines.push(` - ${h.score} \`${h.name}\``);
392
+ lines.push('');
393
+ }
394
+ }
395
+ }
396
+
397
+ if (trace.synthesis?.attemptsLog?.length) {
398
+ lines.push('## LLM attempts');
399
+ lines.push('');
400
+ trace.synthesis.attemptsLog.forEach((att, i) => {
401
+ lines.push(`### Attempt ${att.attempt ?? i + 1}`);
402
+ lines.push('');
403
+ lines.push('```json');
404
+ lines.push(typeof att.raw === 'string' ? att.raw.slice(0, 2000) : JSON.stringify(att.raw, null, 2).slice(0, 2000));
405
+ lines.push('```');
406
+ lines.push('');
407
+ });
408
+ if (trace.synthesis.userPrompt) {
409
+ lines.push('### User prompt sent to LLM');
410
+ lines.push('');
411
+ lines.push('```');
412
+ lines.push(trace.synthesis.userPrompt.slice(0, 3000));
413
+ if (trace.synthesis.userPrompt.length > 3000) lines.push(`... (${trace.synthesis.userPrompt.length - 3000} more chars)`);
414
+ lines.push('```');
415
+ lines.push('');
416
+ if (trace.synthesis.systemPromptHash) lines.push(`System prompt hash: \`${trace.synthesis.systemPromptHash}\` (matches across attempts)`);
417
+ lines.push('');
418
+ }
419
+ }
420
+
421
+ if (trace.plan) {
422
+ lines.push('## Composer plan');
423
+ lines.push('');
424
+ lines.push('```json');
425
+ lines.push(JSON.stringify(trace.plan, null, 2));
426
+ lines.push('```');
427
+ lines.push('');
428
+ }
429
+
430
+ if (trace.htmlPreview) {
431
+ lines.push('## Generated HTML (preview)');
432
+ lines.push('');
433
+ lines.push('```html');
434
+ lines.push(trace.htmlPreview);
435
+ lines.push('```');
436
+ lines.push('');
437
+ }
438
+
439
+ if (trace.warnings?.length) {
440
+ lines.push('## Warnings');
441
+ lines.push('');
442
+ for (const w of trace.warnings) lines.push(`- ${w}`);
443
+ lines.push('');
444
+ }
445
+
446
+ if (trace.output?.ops?.length) {
447
+ lines.push('## Ops history (refinement chain)');
448
+ lines.push('');
449
+ lines.push(`${trace.output.ops.length} ops applied. ${trace.output.delta_summary ? 'Last delta: ' + trace.output.delta_summary : ''}`);
450
+ lines.push('');
451
+ }
452
+
453
+ if (issue.environment) {
454
+ lines.push('## Environment');
455
+ lines.push('');
456
+ for (const [k, v] of Object.entries(issue.environment)) lines.push(`- **${k}**: ${v}`);
457
+ lines.push('');
458
+ }
459
+
460
+ if (issue.related_issue_ids?.length) {
461
+ lines.push('## Related issues');
462
+ lines.push('');
463
+ for (const id of issue.related_issue_ids) lines.push(`- \`${id}\``);
464
+ lines.push('');
465
+ }
466
+
467
+ return lines.join('\n');
468
+ }
469
+
470
+ /**
471
+ * Auto-fire an issue based on a known reason.
472
+ *
473
+ * Looks up the policy table, derives type/severity/title/owner; the caller
474
+ * passes intent / state_id / extra context via `autoCtx`.
475
+ *
476
+ * Returns null when ctx.evalMode is true (eval runs don't pollute the ledger);
477
+ * manual reportIssue calls are unaffected by evalMode.
478
+ *
479
+ * @param {keyof typeof AUTO_FIRE_POLICY} reason
480
+ * @param {object} autoCtx — { intent?, state_id?, tool?, body?, trace?, tags? }
481
+ * @param {object} ctx — { cache, versionInfo, evalMode, storageRoot }
482
+ */
483
+ export async function autoReport(reason, autoCtx = {}, ctx = {}) {
484
+ if (ctx.evalMode) return null;
485
+ const policy = AUTO_FIRE_POLICY[reason];
486
+ if (!policy) {
487
+ throw new Error(
488
+ `autoReport: unknown reason "${reason}". Valid: ${Object.keys(AUTO_FIRE_POLICY).join(', ')}`
489
+ );
490
+ }
491
+ const title = policy.titleFor(autoCtx);
492
+ const body = autoCtx.body || `Auto-fired by engine. Reason: \`${reason}\`.`;
493
+
494
+ return await reportIssue(
495
+ {
496
+ type: policy.type,
497
+ severity: policy.severity,
498
+ title,
499
+ body,
500
+ state_id: autoCtx.state_id,
501
+ trace: autoCtx.trace ?? (autoCtx.state_id ? 'summary' : 'none'),
502
+ suggested_owner: policy.suggested_owner,
503
+ tags: ['auto-fire', reason, ...(autoCtx.tags || [])],
504
+ },
505
+ {
506
+ ...ctx,
507
+ reporter: 'auto',
508
+ reporterContext: reason,
509
+ }
510
+ );
511
+ }
512
+
513
+ /**
514
+ * Per-tool-call accumulator for auto-fired issues.
515
+ *
516
+ * Multiple fires within one call coalesce into a single issue (spec §6.4).
517
+ * The highest-severity entry dictates type/severity/owner; the body lists
518
+ * every reason. Engine code creates one accumulator per tool invocation,
519
+ * pushes auto-fires into it, and flushes at the end.
520
+ */
521
+ export function createIssueAccumulator() {
522
+ const entries = [];
523
+
524
+ return {
525
+ add(reason, autoCtx = {}) {
526
+ if (!AUTO_FIRE_POLICY[reason]) {
527
+ throw new Error(`accumulator.add: unknown reason "${reason}"`);
528
+ }
529
+ entries.push({ reason, autoCtx });
530
+ },
531
+
532
+ size() {
533
+ return entries.length;
534
+ },
535
+
536
+ reasons() {
537
+ return entries.map((e) => e.reason);
538
+ },
539
+
540
+ /**
541
+ * Write the accumulated issue(s).
542
+ *
543
+ * - 0 entries → returns null without writing.
544
+ * - 1 entry → writes via autoReport (or no-op when evalMode).
545
+ * - N entries → coalesces into one issue. Highest-severity entry's policy
546
+ * wins; body lists every reason; tags include all reasons + 'coalesced'.
547
+ */
548
+ async flush(ctx = {}) {
549
+ if (entries.length === 0) return null;
550
+
551
+ if (entries.length === 1) {
552
+ const { reason, autoCtx } = entries[0];
553
+ const result = await autoReport(reason, autoCtx, ctx);
554
+ entries.length = 0;
555
+ return result;
556
+ }
557
+
558
+ // Coalesce. Sort by severity desc, ties broken by insertion order.
559
+ const ranked = entries
560
+ .map((e, i) => ({ ...e, _idx: i }))
561
+ .sort((a, b) => {
562
+ const sa = SEVERITY_RANK[AUTO_FIRE_POLICY[a.reason].severity];
563
+ const sb = SEVERITY_RANK[AUTO_FIRE_POLICY[b.reason].severity];
564
+ return sb - sa || a._idx - b._idx;
565
+ });
566
+
567
+ const primary = ranked[0];
568
+ const policy = AUTO_FIRE_POLICY[primary.reason];
569
+ const reasons = entries.map((e) => e.reason);
570
+
571
+ if (ctx.evalMode) {
572
+ entries.length = 0;
573
+ return null;
574
+ }
575
+
576
+ const titles = entries.map((e) => AUTO_FIRE_POLICY[e.reason].titleFor(e.autoCtx));
577
+ const body = [
578
+ '## Coalesced auto-fires within one tool call',
579
+ '',
580
+ ...entries.map((e, i) => `${i + 1}. **\`${e.reason}\`** — ${titles[i]}`),
581
+ '',
582
+ `Primary (highest severity) dictates type/severity/owner: \`${primary.reason}\` (severity \`${policy.severity}\`).`,
583
+ ].join('\n');
584
+
585
+ const result = await reportIssue(
586
+ {
587
+ type: policy.type,
588
+ severity: policy.severity,
589
+ title: truncate(`Coalesced auto-fires: ${reasons.join(', ')}`, 80),
590
+ body,
591
+ state_id: primary.autoCtx?.state_id,
592
+ trace: primary.autoCtx?.trace ?? (primary.autoCtx?.state_id ? 'summary' : 'none'),
593
+ suggested_owner: policy.suggested_owner,
594
+ tags: ['auto-fire', 'coalesced', ...new Set(reasons)],
595
+ },
596
+ {
597
+ ...ctx,
598
+ reporter: 'auto',
599
+ reporterContext: 'coalesced',
600
+ }
601
+ );
602
+
603
+ entries.length = 0;
604
+ return result;
605
+ },
606
+ };
607
+ }