chorus-codes 0.7.3 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +7 -7
- package/.next/build-manifest.json +13 -14
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +6 -0
- package/.next/required-server-files.js +2 -0
- package/.next/required-server-files.json +2 -0
- package/.next/server/app/_global-error/page.js +32 -10
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.meta +2 -1
- package/.next/server/app/_global-error.rsc +8 -9
- package/.next/server/app/_global-error.segments/_full.segment.rsc +8 -9
- package/.next/server/app/_global-error.segments/{__PAGE__.segment.rsc → _global-error/__PAGE__.segment.rsc} +2 -2
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_head.segment.rsc +3 -4
- package/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +2 -13
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -3
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +12 -10
- package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -10
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +4 -2
- package/.next/server/app/api/daemon/[...path]/route.js +1 -7
- package/.next/server/app/api/daemon/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/daemon/[...path]/route_client-reference-manifest.js +1 -3
- package/.next/server/app/api/run-artifacts/[chatId]/route.js +1 -6
- package/.next/server/app/api/run-artifacts/[chatId]/route.js.nft.json +1 -1
- package/.next/server/app/api/run-artifacts/[chatId]/route_client-reference-manifest.js +1 -3
- package/.next/server/app/connect/page.js +2 -15
- package/.next/server/app/connect/page.js.nft.json +1 -1
- package/.next/server/app/connect/page_client-reference-manifest.js +1 -3
- package/.next/server/app/favicon.ico/route.js +1 -8
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/icon.svg/route.js +1 -7
- package/.next/server/app/icon.svg/route.js.nft.json +1 -1
- package/.next/server/app/new/page.js +2 -14
- package/.next/server/app/new/page.js.nft.json +1 -1
- package/.next/server/app/new/page_client-reference-manifest.js +1 -3
- package/.next/server/app/new.html +1 -1
- package/.next/server/app/new.rsc +14 -14
- package/.next/server/app/new.segments/_full.segment.rsc +14 -14
- package/.next/server/app/new.segments/_head.segment.rsc +4 -4
- package/.next/server/app/new.segments/_index.segment.rsc +4 -4
- package/.next/server/app/new.segments/_tree.segment.rsc +4 -4
- package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/new.segments/new.segment.rsc +3 -3
- package/.next/server/app/onboarding/page.js +2 -14
- package/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/server/app/onboarding/page_client-reference-manifest.js +1 -3
- package/.next/server/app/onboarding.html +1 -1
- package/.next/server/app/onboarding.rsc +14 -14
- package/.next/server/app/onboarding.segments/_full.segment.rsc +14 -14
- package/.next/server/app/onboarding.segments/_head.segment.rsc +4 -4
- package/.next/server/app/onboarding.segments/_index.segment.rsc +4 -4
- package/.next/server/app/onboarding.segments/_tree.segment.rsc +4 -4
- package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/onboarding.segments/onboarding.segment.rsc +3 -3
- package/.next/server/app/page.js +2 -17
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -3
- package/.next/server/app/personas/page.js +2 -14
- package/.next/server/app/personas/page.js.nft.json +1 -1
- package/.next/server/app/personas/page_client-reference-manifest.js +1 -3
- package/.next/server/app/personas.html +1 -1
- package/.next/server/app/personas.rsc +14 -14
- package/.next/server/app/personas.segments/_full.segment.rsc +14 -14
- package/.next/server/app/personas.segments/_head.segment.rsc +4 -4
- package/.next/server/app/personas.segments/_index.segment.rsc +4 -4
- package/.next/server/app/personas.segments/_tree.segment.rsc +4 -4
- package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/personas.segments/personas.segment.rsc +3 -3
- package/.next/server/app/runs/[runId]/page.js +2 -16
- package/.next/server/app/runs/[runId]/page.js.nft.json +1 -1
- package/.next/server/app/runs/[runId]/page_client-reference-manifest.js +1 -3
- package/.next/server/app/runs/page.js +2 -15
- package/.next/server/app/runs/page.js.nft.json +1 -1
- package/.next/server/app/runs/page_client-reference-manifest.js +1 -3
- package/.next/server/app/settings/page.js +26 -14
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -3
- package/.next/server/app/settings/permissions/page.js +2 -14
- package/.next/server/app/settings/permissions/page.js.nft.json +1 -1
- package/.next/server/app/settings/permissions/page_client-reference-manifest.js +1 -3
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +14 -14
- package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_tree.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/server/app/templates/page.js +2 -14
- package/.next/server/app/templates/page.js.nft.json +1 -1
- package/.next/server/app/templates/page_client-reference-manifest.js +1 -3
- package/.next/server/app/templates.html +1 -1
- package/.next/server/app/templates.rsc +14 -14
- package/.next/server/app/templates.segments/_full.segment.rsc +14 -14
- package/.next/server/app/templates.segments/_head.segment.rsc +4 -4
- package/.next/server/app/templates.segments/_index.segment.rsc +4 -4
- package/.next/server/app/templates.segments/_tree.segment.rsc +4 -4
- package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/templates.segments/templates.segment.rsc +3 -3
- package/.next/server/app-paths-manifest.json +7 -7
- package/.next/server/chunks/144.js +25 -0
- package/.next/server/chunks/332.js +18 -0
- package/.next/server/chunks/418.js +1 -0
- package/.next/server/chunks/429.js +1 -0
- package/.next/server/chunks/451.js +45 -0
- package/.next/server/chunks/498.js +1 -0
- package/.next/server/chunks/504.js +1 -0
- package/.next/server/chunks/557.js +5 -0
- package/.next/server/chunks/668.js +25 -0
- package/.next/server/chunks/681.js +1 -0
- package/.next/server/chunks/946.js +1 -0
- package/.next/server/chunks/95.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -21
- package/.next/server/middleware-manifest.json +2 -2
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +1 -51
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -5
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/chunks/116-0372d11bc2a9ac4d.js +25 -0
- package/.next/static/chunks/128-a5d059bf5b2e5090.js +32 -0
- package/.next/static/chunks/15-d438a2b057302bed.js +1 -0
- package/.next/static/chunks/344-1f06059a92faa936.js +1 -0
- package/.next/static/chunks/720-9732eeb760e004e3.js +5 -0
- package/.next/static/chunks/744-2b89d96d64610581.js +1 -0
- package/.next/static/chunks/app/_global-error/page-c01ad9f9473ce080.js +1 -0
- package/.next/static/chunks/app/_not-found/page-715bac6dc7f3427d.js +1 -0
- package/.next/static/chunks/app/api/daemon/[...path]/route-c01ad9f9473ce080.js +1 -0
- package/.next/static/chunks/app/api/run-artifacts/[chatId]/route-c01ad9f9473ce080.js +1 -0
- package/.next/static/chunks/app/connect/page-c09d9fb410c468b7.js +1 -0
- package/.next/static/chunks/app/layout-df8acd5bd06cbe45.js +1 -0
- package/.next/static/chunks/app/new/page-e4923b87c7a7b6ae.js +1 -0
- package/.next/static/chunks/app/onboarding/page-4c87427335371aaa.js +1 -0
- package/.next/static/chunks/app/page-3c0d23c063b036eb.js +1 -0
- package/.next/static/chunks/app/personas/page-a130cd11d8cbd832.js +1 -0
- package/.next/static/chunks/app/runs/[runId]/page-aa118bfeb6508779.js +1 -0
- package/.next/static/chunks/app/runs/page-503439d57f433574.js +1 -0
- package/.next/static/chunks/app/settings/page-64d7d48d2413a18b.js +25 -0
- package/.next/static/chunks/app/settings/permissions/page-18bf0e6d84be8fad.js +1 -0
- package/.next/static/chunks/app/templates/page-db5165c6311bf6e1.js +1 -0
- package/.next/static/chunks/ed64ccb0-b7d2b5246d18ca7e.js +1 -0
- package/.next/static/chunks/framework-dc9b726cfb42e402.js +1 -0
- package/.next/static/chunks/main-2088f7ac0f762d6a.js +5 -0
- package/.next/static/chunks/main-app-e9f7985e32dc8a63.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-c01ad9f9473ce080.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-c01ad9f9473ce080.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-538b25894f1d36d8.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-c01ad9f9473ce080.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c01ad9f9473ce080.js +1 -0
- package/.next/static/chunks/webpack-87142ab87b87c8fb.js +1 -0
- package/.next/static/css/a552ff3997000a18.css +3 -0
- package/.next/static/fRcji-LCH-qqfsUepgR1t/_buildManifest.js +1 -0
- package/.next/trace +19 -1
- package/.next/trace-build +1 -1
- package/.next/types/app/api/daemon/[...path]/route.ts +351 -0
- package/.next/types/app/api/run-artifacts/[chatId]/route.ts +351 -0
- package/.next/types/app/connect/page.ts +87 -0
- package/.next/types/app/layout.ts +87 -0
- package/.next/types/app/new/page.ts +87 -0
- package/.next/types/app/onboarding/page.ts +87 -0
- package/.next/types/app/page.ts +87 -0
- package/.next/types/app/personas/page.ts +87 -0
- package/.next/types/app/runs/[runId]/page.ts +87 -0
- package/.next/types/app/runs/page.ts +87 -0
- package/.next/types/app/settings/page.ts +87 -0
- package/.next/types/app/settings/permissions/page.ts +87 -0
- package/.next/types/app/templates/page.ts +87 -0
- package/.next/types/package.json +1 -0
- package/dist/daemon/index.js +1 -1
- package/dist/mcp/index.js +1 -1
- package/package.json +2 -2
- package/.next/build/chunks/[root-of-the-server]__0d-m0h0._.js +0 -206
- package/.next/build/chunks/[root-of-the-server]__0d-m0h0._.js.map +0 -8
- package/.next/build/chunks/[root-of-the-server]__0ubbtyl._.js +0 -500
- package/.next/build/chunks/[root-of-the-server]__0ubbtyl._.js.map +0 -11
- package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_06e.r3r._.js +0 -13
- package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_06e.r3r._.js.map +0 -5
- package/.next/build/chunks/[turbopack]_runtime.js +0 -890
- package/.next/build/chunks/[turbopack]_runtime.js.map +0 -11
- package/.next/build/chunks/node_modules__pnpm_0e-dfa2._.js +0 -6681
- package/.next/build/chunks/node_modules__pnpm_0e-dfa2._.js.map +0 -47
- package/.next/build/package.json +0 -1
- package/.next/build/postcss.js +0 -6
- package/.next/build/postcss.js.map +0 -5
- package/.next/diagnostics/route-bundle-stats.json +0 -176
- package/.next/fallback-build-manifest.json +0 -13
- package/.next/server/app/_global-error/page/app-paths-manifest.json +0 -3
- package/.next/server/app/_global-error/page/build-manifest.json +0 -17
- package/.next/server/app/_global-error/page/next-font-manifest.json +0 -6
- package/.next/server/app/_global-error/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/_global-error/page/server-reference-manifest.json +0 -4
- package/.next/server/app/_global-error/page.js.map +0 -5
- package/.next/server/app/_not-found/page/app-paths-manifest.json +0 -3
- package/.next/server/app/_not-found/page/build-manifest.json +0 -17
- package/.next/server/app/_not-found/page/next-font-manifest.json +0 -11
- package/.next/server/app/_not-found/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/_not-found/page/server-reference-manifest.json +0 -4
- package/.next/server/app/_not-found/page.js.map +0 -5
- package/.next/server/app/api/daemon/[...path]/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/daemon/[...path]/route/build-manifest.json +0 -9
- package/.next/server/app/api/daemon/[...path]/route/server-reference-manifest.json +0 -4
- package/.next/server/app/api/daemon/[...path]/route.js.map +0 -5
- package/.next/server/app/api/run-artifacts/[chatId]/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/run-artifacts/[chatId]/route/build-manifest.json +0 -9
- package/.next/server/app/api/run-artifacts/[chatId]/route/server-reference-manifest.json +0 -4
- package/.next/server/app/api/run-artifacts/[chatId]/route.js.map +0 -5
- package/.next/server/app/connect/page/app-paths-manifest.json +0 -3
- package/.next/server/app/connect/page/build-manifest.json +0 -17
- package/.next/server/app/connect/page/next-font-manifest.json +0 -11
- package/.next/server/app/connect/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/connect/page/server-reference-manifest.json +0 -4
- package/.next/server/app/connect/page.js.map +0 -5
- package/.next/server/app/favicon.ico/route/app-paths-manifest.json +0 -3
- package/.next/server/app/favicon.ico/route/build-manifest.json +0 -9
- package/.next/server/app/favicon.ico/route.js.map +0 -5
- package/.next/server/app/icon.svg/route/app-paths-manifest.json +0 -3
- package/.next/server/app/icon.svg/route/build-manifest.json +0 -9
- package/.next/server/app/icon.svg/route.js.map +0 -5
- package/.next/server/app/new/page/app-paths-manifest.json +0 -3
- package/.next/server/app/new/page/build-manifest.json +0 -17
- package/.next/server/app/new/page/next-font-manifest.json +0 -11
- package/.next/server/app/new/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/new/page/server-reference-manifest.json +0 -4
- package/.next/server/app/new/page.js.map +0 -5
- package/.next/server/app/onboarding/page/app-paths-manifest.json +0 -3
- package/.next/server/app/onboarding/page/build-manifest.json +0 -17
- package/.next/server/app/onboarding/page/next-font-manifest.json +0 -11
- package/.next/server/app/onboarding/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/onboarding/page/server-reference-manifest.json +0 -4
- package/.next/server/app/onboarding/page.js.map +0 -5
- package/.next/server/app/page/app-paths-manifest.json +0 -3
- package/.next/server/app/page/build-manifest.json +0 -17
- package/.next/server/app/page/next-font-manifest.json +0 -11
- package/.next/server/app/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/page/server-reference-manifest.json +0 -4
- package/.next/server/app/page.js.map +0 -5
- package/.next/server/app/personas/page/app-paths-manifest.json +0 -3
- package/.next/server/app/personas/page/build-manifest.json +0 -17
- package/.next/server/app/personas/page/next-font-manifest.json +0 -11
- package/.next/server/app/personas/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/personas/page/server-reference-manifest.json +0 -4
- package/.next/server/app/personas/page.js.map +0 -5
- package/.next/server/app/runs/[runId]/page/app-paths-manifest.json +0 -3
- package/.next/server/app/runs/[runId]/page/build-manifest.json +0 -17
- package/.next/server/app/runs/[runId]/page/next-font-manifest.json +0 -11
- package/.next/server/app/runs/[runId]/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/runs/[runId]/page/server-reference-manifest.json +0 -4
- package/.next/server/app/runs/[runId]/page.js.map +0 -5
- package/.next/server/app/runs/page/app-paths-manifest.json +0 -3
- package/.next/server/app/runs/page/build-manifest.json +0 -17
- package/.next/server/app/runs/page/next-font-manifest.json +0 -11
- package/.next/server/app/runs/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/runs/page/server-reference-manifest.json +0 -4
- package/.next/server/app/runs/page.js.map +0 -5
- package/.next/server/app/settings/page/app-paths-manifest.json +0 -3
- package/.next/server/app/settings/page/build-manifest.json +0 -17
- package/.next/server/app/settings/page/next-font-manifest.json +0 -11
- package/.next/server/app/settings/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/settings/page/server-reference-manifest.json +0 -4
- package/.next/server/app/settings/page.js.map +0 -5
- package/.next/server/app/settings/permissions/page/app-paths-manifest.json +0 -3
- package/.next/server/app/settings/permissions/page/build-manifest.json +0 -17
- package/.next/server/app/settings/permissions/page/next-font-manifest.json +0 -11
- package/.next/server/app/settings/permissions/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/settings/permissions/page/server-reference-manifest.json +0 -4
- package/.next/server/app/settings/permissions/page.js.map +0 -5
- package/.next/server/app/templates/page/app-paths-manifest.json +0 -3
- package/.next/server/app/templates/page/build-manifest.json +0 -17
- package/.next/server/app/templates/page/next-font-manifest.json +0 -11
- package/.next/server/app/templates/page/react-loadable-manifest.json +0 -1
- package/.next/server/app/templates/page/server-reference-manifest.json +0 -4
- package/.next/server/app/templates/page.js.map +0 -5
- package/.next/server/chunks/05w9_next_0xdex7s._.js +0 -13
- package/.next/server/chunks/05w9_next_0xdex7s._.js.map +0 -1
- package/.next/server/chunks/05w9_next_dist_esm_build_templates_app-route_0.73kst.js +0 -3
- package/.next/server/chunks/05w9_next_dist_esm_build_templates_app-route_0.73kst.js.map +0 -1
- package/.next/server/chunks/[externals]_next_dist_0arv.vj._.js +0 -3
- package/.next/server/chunks/[externals]_next_dist_0arv.vj._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__02xvj_h._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__02xvj_h._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0i7ddmr._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0i7ddmr._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0sxhm1i._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0sxhm1i._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__12xxby8._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__12xxby8._.js.map +0 -1
- package/.next/server/chunks/[turbopack]_runtime.js +0 -903
- package/.next/server/chunks/[turbopack]_runtime.js.map +0 -11
- package/.next/server/chunks/_next-internal_server_app_api_daemon_[___path]_route_actions_0a5g-ar.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_daemon_[___path]_route_actions_0a5g-ar.js.map +0 -1
- package/.next/server/chunks/_next-internal_server_app_api_run-artifacts_[chatId]_route_actions_07e2ul1.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_run-artifacts_[chatId]_route_actions_07e2ul1.js.map +0 -1
- package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js.map +0 -1
- package/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_0-0ehc~.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_0-0ehc~.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_0q4woef._.js +0 -3
- package/.next/server/chunks/ssr/05w9_next_dist_0q4woef._.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_0ybpwn1._.js +0 -6
- package/.next/server/chunks/ssr/05w9_next_dist_0ybpwn1._.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_0~859ji._.js +0 -6
- package/.next/server/chunks/ssr/05w9_next_dist_0~859ji._.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_client_components_12u3mib._.js +0 -3
- package/.next/server/chunks/ssr/05w9_next_dist_client_components_12u3mib._.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_forbidden_04fbe_..js +0 -3
- package/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_forbidden_04fbe_..js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_global-error_0brpl_..js +0 -3
- package/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_global-error_0brpl_..js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_unauthorized_0~2g66g.js +0 -3
- package/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_unauthorized_0~2g66g.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0-f~6r1.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0-f~6r1.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_00czn99.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_00czn99.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_01nm1_6.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_01nm1_6.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0jcydv7.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0jcydv7.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0km.hvi.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0km.hvi.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0ln8_qt.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0ln8_qt.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0n3h-j1.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0n3h-j1.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0nc~v.o.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0nc~v.o.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0o6nct3.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0o6nct3.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0veve6-.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0veve6-.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0wh5tpo.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0wh5tpo.js.map +0 -1
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_10~fsfu.js +0 -4
- package/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_10~fsfu.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0-7oo8o._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0-7oo8o._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__01t9qm2._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__01t9qm2._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__076~t6~._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__076~t6~._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0_tow-j._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0_tow-j._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0bsym8v._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0bsym8v._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0bwjwxi._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0bwjwxi._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0c2e5js._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0c2e5js._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0d_59pi._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0d_59pi._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0dxp2sg._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0dxp2sg._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0e58.k_._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0e58.k_._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0ek20dj._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0ek20dj._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0h2o43u._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0h2o43u._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0hn95cc._.js +0 -33
- package/.next/server/chunks/ssr/[root-of-the-server]__0hn95cc._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0ic.~tw._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0ic.~tw._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0jltd-t._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0jltd-t._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0k_96yx._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0k_96yx._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0l5ko41._.js +0 -19
- package/.next/server/chunks/ssr/[root-of-the-server]__0l5ko41._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0p~21w8._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0p~21w8._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0tc4gl8._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0tc4gl8._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0we1ana._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0we1ana._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0xlzjhk._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0xlzjhk._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0ygksjc._.js +0 -33
- package/.next/server/chunks/ssr/[root-of-the-server]__0ygksjc._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0yhjl35._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0yhjl35._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0~cqs-9._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0~cqs-9._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__109.1j0._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__109.1j0._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__10gepjv._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__10gepjv._.js.map +0 -1
- package/.next/server/chunks/ssr/[turbopack]_runtime.js +0 -903
- package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +0 -11
- package/.next/server/chunks/ssr/_01t~nag._.js +0 -30
- package/.next/server/chunks/ssr/_01t~nag._.js.map +0 -1
- package/.next/server/chunks/ssr/_097xk3e._.js +0 -3
- package/.next/server/chunks/ssr/_097xk3e._.js.map +0 -1
- package/.next/server/chunks/ssr/_0bxoss0._.js +0 -30
- package/.next/server/chunks/ssr/_0bxoss0._.js.map +0 -1
- package/.next/server/chunks/ssr/_0ck1n8_._.js +0 -7
- package/.next/server/chunks/ssr/_0ck1n8_._.js.map +0 -1
- package/.next/server/chunks/ssr/_0d-304b._.js +0 -30
- package/.next/server/chunks/ssr/_0d-304b._.js.map +0 -1
- package/.next/server/chunks/ssr/_0p-_ahq._.js +0 -30
- package/.next/server/chunks/ssr/_0p-_ahq._.js.map +0 -1
- package/.next/server/chunks/ssr/_0qlx_85._.js +0 -7
- package/.next/server/chunks/ssr/_0qlx_85._.js.map +0 -1
- package/.next/server/chunks/ssr/_0y43gyn._.js +0 -27
- package/.next/server/chunks/ssr/_0y43gyn._.js.map +0 -1
- package/.next/server/chunks/ssr/_11i54x9._.js +0 -30
- package/.next/server/chunks/ssr/_11i54x9._.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_connect_page_actions_0vb8s6u.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_connect_page_actions_0vb8s6u.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_new_page_actions_08q6mx5.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_new_page_actions_08q6mx5.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_onboarding_page_actions_0qdby58.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_onboarding_page_actions_0qdby58.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_personas_page_actions_08fq21v.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_personas_page_actions_08fq21v.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_runs_[runId]_page_actions_0z6r2tz.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_runs_[runId]_page_actions_0z6r2tz.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_runs_page_actions_04_e1xr.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_runs_page_actions_04_e1xr.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_permissions_page_actions_0cr.qtc.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_permissions_page_actions_0cr.qtc.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_templates_page_actions_0n8gow3.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_templates_page_actions_0n8gow3.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules__pnpm_0~j0k.e._.js +0 -33
- package/.next/server/chunks/ssr/node_modules__pnpm_0~j0k.e._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_new_page_tsx_0av4n2k._.js +0 -3
- package/.next/server/chunks/ssr/src_app_new_page_tsx_0av4n2k._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_onboarding_page_tsx_0xf7hpz._.js +0 -3
- package/.next/server/chunks/ssr/src_app_onboarding_page_tsx_0xf7hpz._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_personas_page_tsx_0jx9vyh._.js +0 -3
- package/.next/server/chunks/ssr/src_app_personas_page_tsx_0jx9vyh._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_settings_page_tsx_0h9v7dr._.js +0 -27
- package/.next/server/chunks/ssr/src_app_settings_page_tsx_0h9v7dr._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_templates_page_tsx_0tml2wg._.js +0 -3
- package/.next/server/chunks/ssr/src_app_templates_page_tsx_0tml2wg._.js.map +0 -1
- package/.next/server/chunks/ssr/src_components_0j77o23._.js +0 -3
- package/.next/server/chunks/ssr/src_components_0j77o23._.js.map +0 -1
- package/.next/server/chunks/ssr/src_components_0lc2g58._.js +0 -3
- package/.next/server/chunks/ssr/src_components_0lc2g58._.js.map +0 -1
- package/.next/server/chunks/ssr/src_components_live-run-real_index_tsx_0zzsdt9._.js +0 -3
- package/.next/server/chunks/ssr/src_components_live-run-real_index_tsx_0zzsdt9._.js.map +0 -1
- package/.next/static/UrNBcWJ5KltIL6ABEsC-R/_buildManifest.js +0 -11
- package/.next/static/UrNBcWJ5KltIL6ABEsC-R/_clientMiddlewareManifest.js +0 -1
- package/.next/static/chunks/0.dctgbd3j_xg.js +0 -2
- package/.next/static/chunks/0.~gqf.-9g-fh.js +0 -1
- package/.next/static/chunks/01as9r5n5k.xo.js +0 -1
- package/.next/static/chunks/034b~pjm7y20e.js +0 -1
- package/.next/static/chunks/05o4oa_9xfaun.js +0 -1
- package/.next/static/chunks/08dnw-0gzytmy.js +0 -5
- package/.next/static/chunks/08f2b7tuf53ep.js +0 -1
- package/.next/static/chunks/0a_u3vdu6tc~f.js +0 -1
- package/.next/static/chunks/0am72irwq2bx0.js +0 -5
- package/.next/static/chunks/0c-d1bhb8byrx.js +0 -1
- package/.next/static/chunks/0s4~w2~is76y1.js +0 -1
- package/.next/static/chunks/0ue4qcctkv016.js +0 -4
- package/.next/static/chunks/0uok5~eqi6zku.js +0 -1
- package/.next/static/chunks/0u~3g88j1g2xp.css +0 -3
- package/.next/static/chunks/0v3lyuj75aq50.js +0 -1
- package/.next/static/chunks/0whnu9t5k-ij7.js +0 -1
- package/.next/static/chunks/0x00t3du13-u4.js +0 -25
- package/.next/static/chunks/0xs3ktzdh4rw4.js +0 -1
- package/.next/static/chunks/0~8r6nhrrl~f9.js +0 -1
- package/.next/static/chunks/10jdu00ksgu69.js +0 -1
- package/.next/static/chunks/10ld26~0f71ye.js +0 -25
- package/.next/static/chunks/11k2wbc04r__f.js +0 -25
- package/.next/static/chunks/13-.xgv2t5u6m.js +0 -31
- package/.next/static/chunks/152ec.u3_e~ya.js +0 -25
- package/.next/static/chunks/172tpttbumwi1.js +0 -25
- package/.next/static/chunks/turbopack-0-al833jv3to~.js +0 -1
- package/.next/static/media/favicon.0i~66t__91s97.ico +0 -0
- package/.next/static/media/icon.15.86wme~cdlv.svg +0 -6
- package/.next/turbopack +0 -0
- /package/.next/static/chunks/{03~yq9q893hmn.js → polyfills-42372ed130431b0a.js} +0 -0
- /package/.next/static/{UrNBcWJ5KltIL6ABEsC-R → fRcji-LCH-qqfsUepgR1t}/_ssgManifest.js +0 -0
- /package/.next/static/media/{caa3a2e1cccd8315-s.p.16t1db8_9y2o~.woff2 → 4cf2300e9c8272f7-s.p.woff2} +0 -0
- /package/.next/static/media/{bbc41e54d2fcbd21-s.0gw~uztddq1df.woff2 → 747892c23ea88013-s.woff2} +0 -0
- /package/.next/static/media/{8a480f0b521d4e75-s.06d3mdzz5bre_.woff2 → 8d697b304b401681-s.woff2} +0 -0
- /package/.next/static/media/{797e433ab948586e-s.p.0.q-h669a_dqa.woff2 → 93f479601ee12b01-s.p.woff2} +0 -0
- /package/.next/static/media/{4fa387ec64143e14-s.0q3udbd2bu5yp.woff2 → 9610d9e46709d722-s.woff2} +0 -0
- /package/.next/static/media/{7178b3e590c64307-s.11.cyxs5p-0z~.woff2 → ba015fad6dcf6784-s.woff2} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/run-viewer/brief-heading.tsx","../../../../src/components/run-viewer/state-badge.tsx","../../../../src/components/run-viewer/participant-card.tsx","../../../../src/components/run-viewer/round-view.tsx","../../../../src/components/live-run-real/header-actions.tsx","../../../../src/components/phase-stepper.tsx","../../../../src/components/live-run-real/phase-progress.tsx","../../../../src/components/live-run-real/index.tsx","../../../../src/components/live-run-real/helpers.ts","../../../../src/components/run-viewer/lineage-gradient.ts","../../../../node_modules/.pnpm/lucide-react%401.12.0_react%4019.2.4/node_modules/lucide-react/src/icons/rotate-cw.ts","../../../../node_modules/.pnpm/lucide-react%401.12.0_react%4019.2.4/node_modules/lucide-react/src/icons/repeat.ts","../../../../node_modules/.pnpm/lucide-react%401.12.0_react%4019.2.4/node_modules/lucide-react/src/icons/arrow-left.ts","../../../../src/components/live-run-real/enrich-rounds.ts"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { chatDisplayTitle } from \"@/lib/chat-title\";\n\n/**\n * Renders the chat brief at the top of the run page.\n *\n * The title is one CSS-truncated line that uses the full row width and\n * ellipsizes only when the viewport actually runs out of space. Click\n * anywhere on the title to reveal the full `work` blob (persona prompt\n * + user request + inlined files) in a scrollable <pre>; click again\n * to collapse. No separate expander button — the entire title row IS\n * the toggle.\n */\n// Anything longer than this gets a click-to-expand affordance even when\n// it fits on one line — at narrow viewports it'll truncate, and even at\n// wide widths the user often wants to read it wrapped instead of\n// scanning horizontally.\nconst BRIEF_EXPANDABLE_THRESHOLD = 100;\n\nexport function BriefHeading({ work }: { work: string }) {\n const [expanded, setExpanded] = useState(false);\n const displayTitle = chatDisplayTitle(work);\n const hasExpandableBody =\n work.trim() !== displayTitle.trim() ||\n work.length > BRIEF_EXPANDABLE_THRESHOLD;\n\n return (\n <div className=\"min-w-0\">\n <button\n type=\"button\"\n onClick={hasExpandableBody ? () => setExpanded((e) => !e) : undefined}\n title={hasExpandableBody ? (expanded ? \"Hide full brief\" : \"Click to show full brief\") : displayTitle}\n disabled={!hasExpandableBody}\n className=\"block w-full min-w-0 text-left disabled:cursor-default\"\n >\n <h1 className=\"truncate text-sm font-medium tracking-tight\">\n {displayTitle}\n </h1>\n </button>\n {hasExpandableBody && expanded && (\n <pre className=\"mt-2 max-h-72 overflow-auto whitespace-pre-wrap break-words rounded-md border border-border bg-background px-5 py-4 font-mono text-[12px] leading-relaxed text-foreground/90\">\n {work}\n </pre>\n )}\n </div>\n );\n}\n","import { CheckCircle2, AlertTriangle, Loader2 } from \"lucide-react\";\nimport type { ParticipantState } from \"./types\";\n\n/**\n * Small status chip rendered in the top-right of every ParticipantCard.\n * Mirrors the card-level border colour but with crisp text + icon, so the\n * grid is scannable at a glance even when the user is staring at the\n * stream area in the middle.\n */\nexport function StateBadge({ state }: { state: ParticipantState }) {\n switch (state) {\n case \"done\":\n return (\n <span className=\"flex items-center gap-1 rounded-md bg-emerald-500/10 px-1.5 py-0.5 text-[10px] font-medium text-emerald-400\">\n <CheckCircle2 className=\"h-3 w-3\" /> DONE\n </span>\n );\n case \"errored\":\n return (\n <span className=\"flex items-center gap-1 rounded-md bg-destructive/10 px-1.5 py-0.5 text-[10px] font-medium text-destructive\">\n <AlertTriangle className=\"h-3 w-3\" /> ERRORED\n </span>\n );\n case \"working\":\n return (\n <span className=\"flex items-center gap-1 rounded-md bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary\">\n <Loader2 className=\"h-3 w-3 animate-spin\" /> WORKING\n </span>\n );\n case \"pending\":\n return (\n <span className=\"flex items-center gap-1 rounded-md bg-muted/40 px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground/80\">\n QUEUED\n </span>\n );\n default:\n return (\n <span className=\"rounded-md bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n IDLE\n </span>\n );\n }\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { AlertTriangle, ArrowRight, Shuffle, X } from \"lucide-react\";\nimport { uiLineageDot, uiLineageLabel } from \"@/lib/lineage-maps\";\nimport { LINEAGE_GRADIENT } from \"./lineage-gradient\";\nimport { StateBadge } from \"./state-badge\";\nimport type { FallbackSwap, ParticipantSnapshot, ParticipantState } from \"./types\";\nimport type { ReviewerLineage } from \"@/lib/types\";\n\n/**\n * Display lineage = what to colour/label the card by.\n *\n * The slot's nominal lineage (e.g. \"kimi\") drives diversity scoring on the\n * daemon side. But moonshot has dual transports — standalone `kimi` CLI\n * vs `opencode -m opencode-go/kimi-k2.6`. Users without a Moonshot sub\n * route everything through opencode, so badging the card \"KIMI\" is\n * actively misleading: it implies a binary they don't have. When the\n * runtime sidecar tells us the binary was `opencode-cli`, badge the card\n * as opencode. The model id (`opencode-go/kimi-k2.6` vs\n * `opencode-go/deepseek-v4-pro`) still distinguishes voices visually.\n */\nfunction displayLineage(p: ParticipantSnapshot): ReviewerLineage {\n if (p.binaryUsed === \"opencode-cli\") return \"opencode\";\n return p.lineage;\n}\n\n/**\n * One reviewer/doer card in the run grid.\n *\n * Card state precedence (most-specific first):\n * pending — placeholder synthesised from template, no dir on disk yet\n * done — answer.md has non-empty content\n * working — chat is mid-run AND (proc is alive OR live tail has bytes)\n * errored — chat is in a terminal state but this participant produced 0 B\n * idle — fall-through (rare; shouldn't normally render)\n */\nexport function ParticipantCard({\n participant,\n isActive,\n liveTail,\n chatTerminal,\n chatId,\n reviewOnly,\n swaps,\n}: {\n participant: ParticipantSnapshot;\n isActive: boolean;\n liveTail?: string;\n /** Chat itself reached a terminal state — distinguishes \"errored (no\n * output produced even though run finished)\" from \"still working\". */\n chatTerminal: boolean;\n /** When provided AND the card is in working state, render a per-card\n * cancel button. Routes to /chats/:id/participants/:key/cancel.\n * When omitted (older callers, terminal chats), the button is hidden. */\n chatId?: string;\n /** True when the chat is a review-only template (no doer phase). The\n * pending-state copy swaps from \"runs after the doer\" to a generic\n * \"queued\" line in that case — there is no doer to wait for. */\n reviewOnly?: boolean;\n /** Fallback swaps that fired on this slot (per-slot model fallback or\n * cross-lineage). Rendered as inline rows under the header showing\n * what voice ACTUALLY produced the answer — the slot's identity in\n * the header stays bound to its primary lineage so cards don't\n * re-key mid-run. Empty when no swap fired. */\n swaps?: FallbackSwap[];\n}) {\n const [cancelling, setCancelling] = useState(false);\n\n // State precedence: pending (synthesised slot) → done (answer on disk) →\n // errored (chat terminal but no answer) → working (the implicit\n // non-terminal mid-flight state). Earlier code gated \"working\" on isActive\n // or liveTail bytes, but those signals lag behind phase_start replay and\n // would briefly flicker the card to \"idle\" — making it look frozen\n // between phase_start and the first text_delta. Anchoring on chat status\n // closes that window.\n // When the runner wrote a `## REVIEWER FAILED` summary (PR #11\n // silent-failure preempt), surface its parsed Kind + body in the\n // errored state instead of the generic \"didn't produce any output\"\n // message. The summary always carries the reason the LLM CLI failed\n // (quota_exhausted, refresh_token_stale, cli_failed, ...).\n const failure = parseFailureSummary(participant.answer);\n\n // State precedence — `failure` MUST come before the chatTerminal check.\n // The runner writes `## REVIEWER FAILED ...` to answer.md when a CLI\n // dies, but does NOT append `## DONE` (failure summaries aren't\n // \"answers\"). Without elevating failure here, a single reviewer that\n // crashes mid-chat would sit in `working` (showing \"Thinking...\") for\n // the rest of the run, only flipping to `errored` when chatTerminal\n // becomes true. Launch-eve gemini review of the run page caught this —\n // a stuck-WORKING card is a UX trust hit. Same precedence applies to\n // doer cards via the same helper.\n const state: ParticipantState = participant.pending\n ? \"pending\"\n : participant.hasAnswer\n ? \"done\"\n : failure\n ? \"errored\"\n : chatTerminal\n ? \"errored\"\n : \"working\";\n\n const ui = displayLineage(participant);\n\n return (\n <div\n className={`flex h-[320px] flex-col overflow-hidden rounded-lg border transition-[opacity,border-color,box-shadow] duration-300 ${\n LINEAGE_GRADIENT[ui] ?? \"bg-card\"\n } ${\n state === \"done\"\n ? \"border-emerald-500/30\"\n : state === \"working\"\n ? \"border-primary/60 shadow-[0_0_0_1px_rgba(124,58,237,0.25),0_0_24px_-6px_rgba(124,58,237,0.45)] animate-pulse-soft\"\n : state === \"errored\"\n ? \"border-destructive/40\"\n : state === \"pending\"\n ? \"border-border/40 opacity-50 grayscale-[0.6]\"\n : \"border-border\"\n }`}\n >\n <div className=\"flex items-center justify-between gap-2 border-b border-border bg-card/60 px-4 py-3\">\n <div className=\"flex min-w-0 items-center gap-2 text-xs leading-none\">\n <span\n className={`h-2 w-2 shrink-0 rounded-full ${uiLineageDot(ui)} ${\n state === \"working\" ? \"animate-pulse-soft\" : \"\"\n }`}\n />\n <span className=\"font-medium capitalize text-foreground\">{participant.role}</span>\n <span className=\"text-muted-foreground\">·</span>\n <span className=\"uppercase tracking-wider text-muted-foreground\">\n {uiLineageLabel(ui)}\n </span>\n {(participant.modelUsed ?? participant.model) && (\n <>\n <span className=\"text-muted-foreground/60\">·</span>\n <span className=\"truncate font-mono text-muted-foreground\">\n {participant.modelUsed ?? participant.model}\n </span>\n </>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {state === \"working\" && chatId && (\n <button\n type=\"button\"\n disabled={cancelling}\n onClick={async () => {\n if (cancelling) return;\n setCancelling(true);\n try {\n const res = await fetch(\n `/api/daemon/chats/${chatId}/participants/${encodeURIComponent(participant.participant)}/cancel`,\n { method: \"POST\" },\n );\n if (!res.ok) {\n setCancelling(false);\n return;\n }\n const body = (await res.json()) as {\n ok: boolean;\n data?: { aborted?: boolean };\n error?: { message?: string };\n };\n if (!body.ok) {\n window.alert(\n `Couldn't cancel: ${body.error?.message ?? \"unknown error\"}`,\n );\n setCancelling(false);\n return;\n }\n // Leave `cancelling=true` until the SSE flips this\n // card's state away from working — avoids a re-click\n // before the runner actually exits. The chat-level\n // SSE handler will re-render with state==='errored'\n // (no output) once the abort propagates.\n //\n // Fallback: if SSE never fires (stalled stream, dead\n // chat, network drop) the button would otherwise be\n // disabled forever. Reset after 15s so the user can\n // retry. Flagged in retroactive PR #24 review by\n // gemini + opencode-deepseek.\n setTimeout(() => setCancelling(false), 15_000);\n } catch {\n setCancelling(false);\n }\n }}\n aria-label=\"Cancel this reviewer\"\n title=\"Cancel this reviewer (chat continues with others)\"\n className=\"grid h-6 w-6 shrink-0 place-items-center rounded-md border border-border bg-card/40 text-muted-foreground transition hover:border-destructive/40 hover:text-destructive disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n )}\n <StateBadge state={state} />\n </div>\n </div>\n\n {swaps && swaps.length > 0 && (() => {\n // Only the LAST entry's `to` voice actually produced an answer;\n // intermediate `to` voices were attempted and themselves failed\n // (which is what triggered the next swap). Showing \"actually ran\"\n // on every row is wrong for chains of length > 1.\n const sorted = swaps.slice().sort((a, b) => a.fallbackIdx - b.fallbackIdx);\n return (\n <div className=\"space-y-1.5 border-b border-amber-500/30 bg-amber-500/5 px-4 py-2 text-[11px]\">\n {sorted.map((s, i) => {\n const isCross = s.reason === \"lineage_fallback\";\n const isLast = i === sorted.length - 1;\n return (\n <div\n key={`${s.fromLineage}-${s.fromModel}-${i}`}\n className=\"flex items-start gap-2\"\n >\n <Shuffle className=\"mt-0.5 h-3 w-3 shrink-0 text-amber-300\" />\n <div className=\"min-w-0 flex-1 space-y-0.5\">\n <div className=\"font-medium uppercase tracking-wider text-[10px] text-amber-300\">\n {isCross ? \"Cross-lineage fallback\" : \"Model fallback\"}\n </div>\n <div className=\"flex flex-wrap items-center gap-1.5 text-[11px] text-amber-100/90\">\n <span className=\"text-amber-100/60 line-through\">\n {s.fromLineage}/{s.fromModel}\n </span>\n <ArrowRight className=\"h-3 w-3 shrink-0 text-amber-300\" />\n <span\n className={\n isLast\n ? \"font-medium text-amber-100\"\n : \"text-amber-100/60 line-through\"\n }\n >\n {s.toLineage}/{s.toModel}\n </span>\n {isLast && (\n <span className=\"rounded bg-amber-500/15 px-1 py-0.5 font-mono text-[9px] text-amber-200\">\n actually ran\n </span>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n })()}\n\n {participant.warnings && participant.warnings.length > 0 && (\n <div className=\"space-y-1 border-b border-amber-500/30 bg-amber-500/5 px-4 py-2 text-[11px] text-amber-200/90\">\n {participant.warnings.map((w, i) => (\n <div key={i} className=\"flex items-start gap-1.5\">\n <AlertTriangle className=\"mt-0.5 h-3 w-3 shrink-0 text-amber-400\" />\n <div className=\"min-w-0 flex-1\">\n <span className=\"font-medium uppercase tracking-wider text-[10px] text-amber-300\">\n {w.kind}\n </span>\n <div className=\"mt-0.5 break-words font-mono text-[11px] leading-snug text-amber-100/85\">\n {w.message}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden px-4 py-3 font-mono text-xs leading-relaxed text-muted-foreground\">\n {participant.findingsPreview && participant.findingsPreview.length > 0 ? (\n participant.findingsPreview.map((line, i) => (\n <div key={i} className=\"py-0.5 text-foreground/90\">\n {line}\n </div>\n ))\n ) : state === \"working\" && liveTail && liveTail.length > 0 ? (\n // Live tail from headless transport — last ~500 chars of streaming\n // output. Gated on state===\"working\" so a stale tail keyed by\n // role:lineage (e.g. Round 1 reviewer's last text) can't leak\n // into a freshly-pending Round 2 reviewer card.\n //\n // `column-reverse` keeps the most recent output anchored at the\n // bottom and scrolls older output off the top — same visual the\n // user gets from `tail -f` and what production CLI streams expect.\n // The fixed card height (h-[320px] above) means streaming content\n // never grows the card, eliminating the layout shift across cards\n // on the same row.\n <div className=\"flex min-h-0 flex-1 flex-col-reverse overflow-y-auto\">\n <pre className=\"whitespace-pre-wrap break-words text-foreground/85\">\n {liveTail}\n </pre>\n </div>\n ) : state === \"working\" ? (\n <div className=\"text-muted-foreground\">Thinking…</div>\n ) : state === \"pending\" ? (\n <div className=\"text-muted-foreground/70\">\n {reviewOnly\n ? \"Queued — waiting for an open slot.\"\n : \"Queued — runs after the doer.\"}\n </div>\n ) : state === \"errored\" ? (\n failure ? (\n <div className=\"space-y-1.5 text-destructive/90\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider\">\n {failure.kind}\n </span>\n {failure.resetAt && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-amber-500/10 px-2 py-0.5 text-[10px] font-medium text-amber-300\">\n Resets {formatResetAt(failure.resetAt)}\n </span>\n )}\n </div>\n <div className=\"whitespace-pre-wrap break-words text-foreground/85\">\n {failure.message}\n </div>\n {failure.cta && (\n <div className=\"text-[11px] text-muted-foreground/80\">\n {failure.cta}\n </div>\n )}\n </div>\n ) : (\n <div className=\"text-destructive/80\">\n The program finished but didn't produce any output.\n </div>\n )\n ) : state === \"done\" && participant.answer ? (\n // DONE state — render the answer inline, top-anchored, with\n // overflow scrolled internally so the card stays at fixed\n // height. A click on the footer-line affordance toggles a\n // full-screen expand for long answers.\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <pre className=\"whitespace-pre-wrap break-words text-foreground/85\">\n {participant.answer}\n </pre>\n </div>\n ) : (\n <div className=\"text-muted-foreground/70\">No output yet.</div>\n )}\n </div>\n\n <div className=\"flex items-center justify-between gap-3 border-t border-border bg-card/60 px-4 py-2 font-mono text-[10px] text-muted-foreground\">\n <span className=\"truncate\">{participant.binaryUsed ?? participant.agentName}</span>\n <span className=\"flex shrink-0 items-center gap-2\">\n {participant.durationMs !== undefined && (\n <span title=\"Wall-clock time the CLI took to finish.\">\n {formatDuration(participant.durationMs)}\n </span>\n )}\n {participant.usage?.costUsd !== undefined && (\n <span title=\"USD cost reported by the CLI for this run.\">\n {formatCost(participant.usage.costUsd)}\n </span>\n )}\n {participant.usage && formatTokens(participant.usage) && (\n <span title={tokensTitle(participant.usage)}>\n {formatTokens(participant.usage)}\n </span>\n )}\n <span>\n {participant.hasAnswer\n ? `${(participant.answer?.length ?? 0).toLocaleString()} B`\n : \"—\"}\n </span>\n </span>\n </div>\n </div>\n );\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms} ms`;\n const s = ms / 1000;\n if (s < 60) return `${s.toFixed(1)}s`;\n const m = Math.floor(s / 60);\n const r = Math.round(s - m * 60);\n return `${m}m${r.toString().padStart(2, \"0\")}s`;\n}\n\n/**\n * Render USD cost as either `$0.022` (sub-dollar) or `$0.30` / `$2.45`.\n * Sub-cent costs round to the nearest cent — opencode reports\n * fractional cents (e.g. 0.000123) which clutter the chip; users care\n * about totals, not micro-cost precision.\n */\nfunction formatCost(usd: number): string {\n if (usd <= 0) return \"$0.00\";\n if (usd < 0.01) return \"<$0.01\";\n if (usd < 1) return `$${usd.toFixed(3)}`;\n return `$${usd.toFixed(2)}`;\n}\n\nfunction formatTokens(u: NonNullable<ParticipantSnapshot[\"usage\"]>): string | null {\n const total = (u.inputTokens ?? 0) + (u.outputTokens ?? 0);\n if (total <= 0) return null;\n if (total < 1000) return `${total} tok`;\n return `${(total / 1000).toFixed(1)}k tok`;\n}\n\nfunction tokensTitle(u: NonNullable<ParticipantSnapshot[\"usage\"]>): string {\n const parts: string[] = [];\n if (u.inputTokens !== undefined) parts.push(`in ${u.inputTokens.toLocaleString()}`);\n if (u.outputTokens !== undefined) parts.push(`out ${u.outputTokens.toLocaleString()}`);\n if (u.cachedInputTokens !== undefined)\n parts.push(`cached ${u.cachedInputTokens.toLocaleString()}`);\n return parts.join(\" · \");\n}\n\n/**\n * Extract Kind + message from a `## REVIEWER FAILED` / `## DOER FAILED`\n * summary written by runReviewerHeadless / runDoerHeadless when a CLI\n * subprocess dies before producing content. Returns null when the answer\n * isn't a failure summary.\n *\n * Summary shape (per src/daemon/runner/{reviewer,doer}.ts finally block):\n * ## REVIEWER FAILED\n *\n * **Kind:** quota_exhausted\n * **Lineage:** openai\n * **Model:** gpt-5.5\n *\n * ERROR: ...message...\n */\nfunction parseFailureSummary(\n answer: string | undefined,\n): { kind: string; message: string; cta?: string; resetAt?: number } | null {\n if (!answer) return null;\n const trimmed = answer.trimStart();\n if (!/^##\\s+(?:REVIEWER|DOER)\\s+FAILED/i.test(trimmed)) return null;\n const kindMatch = trimmed.match(/\\*\\*Kind:\\*\\*\\s*(.+?)(?:\\n|$)/);\n const kind = kindMatch ? kindMatch[1].trim() : \"failed\";\n // Optional `**Resets:** <iso-time>` line written by reviewer.ts/doer.ts\n // when cli-health knows when the upstream quota window expires.\n const resetMatch = trimmed.match(/\\*\\*Resets:\\*\\*\\s*(.+?)(?:\\n|$)/);\n let resetAt: number | undefined;\n if (resetMatch) {\n const t = Date.parse(resetMatch[1].trim());\n if (Number.isFinite(t)) resetAt = t;\n }\n // Body = everything after the first blank line that follows the\n // header block. The header block has Kind/Lineage/Model[/Resets] lines.\n const headerEnd = trimmed.search(/\\n\\n[^*]/);\n const body = headerEnd >= 0 ? trimmed.slice(headerEnd + 2).trim() : \"\";\n const message = body.length > 0 ? body : \"(no error message reported)\";\n // Map common kinds to a short call-to-action so the user knows what to do.\n const cta = ctaForKind(kind);\n return {\n kind,\n message,\n ...(cta ? { cta } : {}),\n ...(resetAt ? { resetAt } : {}),\n };\n}\n\nfunction formatResetAt(ms: number): string {\n const diff = ms - Date.now();\n if (diff <= 0) return \"now\";\n const sec = Math.round(diff / 1000);\n if (sec < 60) return `in ${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `in ${min}m`;\n const hr = Math.round(min / 60);\n if (hr < 24) {\n const at = new Date(ms);\n return `at ${at.getHours().toString().padStart(2, \"0\")}:${at\n .getMinutes()\n .toString()\n .padStart(2, \"0\")}`;\n }\n const days = Math.round(hr / 24);\n return `in ${days}d`;\n}\n\nfunction ctaForKind(kind: string): string | undefined {\n switch (kind) {\n case \"quota_exhausted\":\n return \"Check your subscription dashboard or swap the account in CHORUS_CODEX_HOME / chorus settings.\";\n case \"stream_failure\":\n return \"Subprocess died mid-stream — check disk space and CLI version.\";\n case \"cli_failed\":\n case \"cli_error\":\n return \"Re-auth the CLI (codex/gemini/opencode login) and retry.\";\n default:\n return undefined;\n }\n}\n","\"use client\";\n\nimport { ParticipantCard } from \"./participant-card\";\nimport type {\n FallbackSwap,\n ParticipantSnapshot,\n RoundSnapshot,\n} from \"./types\";\n\n/**\n * Single round of a chat — the doer card plus its reviewer cards.\n * Dropping the inline doer/reviewer split here was the cleanup that let\n * us extract this from the 880-line live-run-real monolith; both roles\n * land in `participants` with `role` set, and ParticipantCard renders\n * them uniformly.\n */\nexport function RoundView({\n round,\n isLatest,\n activeFor,\n liveTails,\n chatTerminal,\n reviewOnly,\n chatId,\n swaps,\n}: {\n round: RoundSnapshot;\n isLatest?: boolean;\n activeFor: (p: ParticipantSnapshot) => boolean;\n liveTails: Record<string, string>;\n chatTerminal: boolean;\n /** Review-only chats hide the doer card and the \"Round N\" header — there\n * is no doer to render, and the chat is single-pass. The participants\n * list still arrives with a synthetic doer-artifact slot; we filter it\n * out so the cockpit doesn't show \"doer · pending\" for the user's own\n * artifact. */\n reviewOnly?: boolean;\n /** Threaded down so each card's per-participant cancel button can\n * target the right chat. Optional for back-compat with any caller\n * that doesn't yet plumb it; the card silently hides the button. */\n chatId?: string;\n /** Fallback swap events for this round — rendered as their own cards\n * alongside the participant cards. */\n swaps?: FallbackSwap[];\n}) {\n const visibleParticipants = reviewOnly\n ? round.participants.filter((p) => p.role !== \"doer\")\n : round.participants;\n const roundSwaps = (swaps ?? []).filter((s) => s.round === round.round);\n\n // Strip `reviewer-` / `doer-` prefix from the dir name so we can match\n // a participant against its swap entries — runner emits swap.agent as\n // `<agentName>-<idx>` for reviewers, `<agentName>` for doers, neither\n // of which carries the role prefix.\n //\n // INVARIANT: agentName must never start with \"reviewer-\" or \"doer-\",\n // otherwise this strip will eat too much. All current shim names\n // (claude-code, codex-cli, gemini-cli, opencode-cli, kimi-cli,\n // openrouter) satisfy this. If a future shim violates it, switch to\n // matching on the (role, agent) pair directly instead.\n const swapsForParticipant = (p: ParticipantSnapshot): FallbackSwap[] => {\n const agentKey = p.participant.replace(/^(reviewer-|doer-)/, \"\");\n return roundSwaps.filter((s) => s.agent === agentKey);\n };\n\n return (\n <section>\n {!reviewOnly && (\n <h2 className=\"mb-3 text-xs uppercase tracking-wider text-muted-foreground\">\n Round {round.round}\n {isLatest && (\n <span className=\"ml-2 rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary\">\n current\n </span>\n )}\n </h2>\n )}\n <div className=\"grid items-start gap-4 sm:grid-cols-2 xl:grid-cols-3\">\n {visibleParticipants.map((p) => (\n <ParticipantCard\n key={p.participant}\n participant={p}\n isActive={activeFor(p)}\n // Look up the live tail by the participant's directory-name\n // identity (`p.participant` is \"reviewer-opencode-cli-1\",\n // \"reviewer-opencode-cli-2\", etc.) — must match the key format\n // live-run-real builds in its phase_progress handler. The old\n // `role:lineage` key collided across same-lineage reviewers\n // and rendered one reviewer's stream in another's card.\n liveTail={liveTails[p.participant]}\n chatTerminal={chatTerminal}\n chatId={chatId}\n reviewOnly={reviewOnly}\n swaps={swapsForParticipant(p)}\n />\n ))}\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport { Repeat, RotateCw, Trash2, X } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useState } from \"react\";\nimport type { Template } from \"@/lib/types\";\n\ninterface HeaderActionsProps {\n chatId: string;\n status: string;\n isTerminal: boolean;\n template: Template | null;\n onCancel: () => void;\n}\n\nexport function HeaderActions({\n chatId,\n status,\n isTerminal,\n template,\n onCancel,\n}: HeaderActionsProps) {\n const router = useRouter();\n const [retrying, setRetrying] = useState(false);\n const [deleting, setDeleting] = useState(false);\n\n const handleRetry = async () => {\n setRetrying(true);\n try {\n const res = await fetch(`/api/daemon/chats/${chatId}/rerun`, {\n method: \"POST\",\n });\n if (!res.ok) {\n window.alert(\n \"Couldn't start a new run — Chorus didn't respond. Try restarting it from your terminal: chorus start\",\n );\n setRetrying(false);\n return;\n }\n const body = (await res.json()) as {\n ok: boolean;\n data?: { slug?: string; id?: string };\n error?: { code?: string; message?: string };\n };\n // Daemon returns HTTP 200 with `{ok: false, error: {...}}` for\n // validation/conflict failures (e.g. rerun-while-active). Without\n // surfacing it, the button just stops spinning and the user has\n // no idea why nothing happened.\n if (!body.ok) {\n const msg = body.error?.message ?? \"Unknown error from Chorus.\";\n window.alert(`Couldn't start a new run: ${msg}`);\n setRetrying(false);\n return;\n }\n const target = body.data?.slug ?? body.data?.id;\n if (target) {\n router.push(`/runs/${target}`);\n router.refresh();\n } else {\n // ok:true with no slug/id is a daemon-side bug, but we still\n // need to unstick the button.\n window.alert(\n \"Chorus accepted the retry but didn't return a chat id. Refresh and try again.\",\n );\n setRetrying(false);\n }\n } catch {\n window.alert(\"Retry failed. Network error.\");\n setRetrying(false);\n }\n };\n\n const handleDelete = async () => {\n if (\n !window.confirm(\n \"Delete this chat permanently? This removes all reviewer output and history. You cannot undo this.\",\n )\n ) {\n return;\n }\n setDeleting(true);\n try {\n const res = await fetch(`/api/daemon/chats/${chatId}`, {\n method: \"DELETE\",\n });\n if (res.ok) {\n router.push(\"/runs\");\n router.refresh();\n } else {\n window.alert(\n \"Couldn't delete this chat — Chorus didn't respond. Try restarting it from your terminal: chorus start\",\n );\n setDeleting(false);\n }\n } catch {\n window.alert(\"Delete failed. Network error.\");\n setDeleting(false);\n }\n };\n\n return (\n <div className=\"flex shrink-0 items-center gap-2\">\n {/* Pause button removed — was decorative, no backend support for\n mid-run pause. Resume after pause requires session state we\n don't have today. Will reintroduce when the daemon gains real\n pause/resume in v0.8. */}\n {status === \"cancelled\" || status === \"failed\" ? (\n <button\n type=\"button\"\n disabled={retrying}\n onClick={handleRetry}\n className=\"flex items-center gap-1.5 rounded-md border border-primary/40 bg-primary/10 px-3 py-1.5 text-xs font-medium text-primary transition hover:border-primary hover:bg-primary/20 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <RotateCw className={`h-3.5 w-3.5 ${retrying ? \"animate-spin\" : \"\"}`} />\n {retrying ? \"Restarting…\" : \"Retry\"}\n </button>\n ) : (\n <button\n type=\"button\"\n disabled={isTerminal}\n onClick={async () => {\n await fetch(`/api/daemon/chats/${chatId}/cancel`, { method: \"POST\" });\n onCancel();\n }}\n className=\"flex items-center gap-1.5 rounded-md border border-border bg-card px-3 py-1.5 text-xs font-medium text-muted-foreground transition hover:border-destructive/40 hover:text-destructive disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <X className=\"h-3.5 w-3.5\" />\n Cancel\n </button>\n )}\n {/* Once the chat is terminal, give the user a one-click re-entry\n to /new with the same template pre-selected. Without this\n button users had to find the template manually. */}\n {isTerminal && template && (\n <Link\n href={`/new?template=${encodeURIComponent(template.id)}`}\n className=\"flex items-center gap-1.5 rounded-md border border-border bg-card px-3 py-1.5 text-xs font-medium text-muted-foreground transition hover:border-primary/40 hover:text-primary\"\n >\n <Repeat className=\"h-3.5 w-3.5\" />\n Run again\n </Link>\n )}\n <button\n type=\"button\"\n disabled={deleting}\n onClick={handleDelete}\n className=\"flex items-center gap-1.5 rounded-md border border-border bg-card px-3 py-1.5 text-xs font-medium text-muted-foreground transition hover:border-destructive/40 hover:text-destructive disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n {deleting ? \"Deleting…\" : \"Delete\"}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Check,\n Loader2,\n GitPullRequest,\n Eye,\n Code2,\n FlaskConical,\n Search,\n ClipboardList,\n FileCode2,\n TestTube2,\n Shuffle,\n} from \"lucide-react\";\nimport type { PhaseKind, TemplatePhase } from \"@/lib/cockpit-types\";\n\nexport type PhaseState = \"pending\" | \"active\" | \"done\" | \"blocked\" | \"skipped\";\n\ninterface PhaseStepperProps {\n phases: TemplatePhase[];\n /** Index of the active phase (0-based). */\n activeIndex: number;\n /** Per-phase state. Length should match phases. */\n states: PhaseState[];\n onSelect?: (index: number) => void;\n}\n\nconst KIND_ICON: Record<PhaseKind, React.ComponentType<{ className?: string }>> =\n {\n review: Eye,\n review_only: Eye,\n plan: ClipboardList,\n spec: FileCode2,\n tests: TestTube2,\n implement: Code2,\n verify: FlaskConical,\n pr: GitPullRequest,\n divergence: Shuffle,\n recon: Search,\n };\n\nconst STATE_DOT: Record<PhaseState, string> = {\n pending: \"bg-muted-foreground/20 text-muted-foreground\",\n active: \"bg-primary/20 text-primary ring-2 ring-primary/40 ring-offset-2 ring-offset-background\",\n done: \"bg-emerald-500/20 text-emerald-300\",\n blocked: \"bg-amber-500/20 text-amber-300\",\n skipped: \"bg-muted-foreground/10 text-muted-foreground/50 line-through\",\n};\n\nconst STATE_LABEL: Record<PhaseState, string> = {\n pending: \"queued\",\n active: \"active\",\n done: \"done\",\n blocked: \"blocked\",\n skipped: \"skipped\",\n};\n\nexport function PhaseStepper({\n phases,\n activeIndex,\n states,\n onSelect,\n}: PhaseStepperProps) {\n return (\n <div className=\"flex items-center gap-0 overflow-x-auto pb-1\">\n {phases.map((phase, i) => {\n const state = states[i] ?? \"pending\";\n const Icon = KIND_ICON[phase.kind];\n const isActive = i === activeIndex;\n const clickable = onSelect && (state === \"done\" || state === \"active\");\n\n return (\n <div key={phase.id} className=\"flex items-center\">\n <button\n type=\"button\"\n disabled={!clickable}\n onClick={() => clickable && onSelect?.(i)}\n className={`group flex items-center gap-2 rounded-md border px-3 py-1.5 text-left transition ${\n isActive\n ? \"border-primary/40 bg-primary/5\"\n : state === \"done\"\n ? \"border-emerald-500/30 bg-emerald-500/5\"\n : state === \"blocked\"\n ? \"border-amber-500/40 bg-amber-500/5\"\n : \"border-border bg-card/30\"\n } ${clickable ? \"hover:border-foreground/30\" : \"cursor-default\"}`}\n >\n <span\n className={`grid h-6 w-6 shrink-0 place-items-center rounded-md ${STATE_DOT[state]}`}\n >\n {state === \"done\" ? (\n <Check className=\"h-3.5 w-3.5\" />\n ) : state === \"active\" ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Icon className=\"h-3.5 w-3.5\" />\n )}\n </span>\n <span className=\"flex flex-col leading-tight\">\n <span className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground\">\n {String(i + 1).padStart(2, \"0\")} · {STATE_LABEL[state]}\n </span>\n <span\n className={`text-xs font-medium ${\n state === \"skipped\"\n ? \"text-muted-foreground/50\"\n : \"text-foreground\"\n }`}\n >\n {phase.name}\n </span>\n </span>\n </button>\n {i < phases.length - 1 && (\n <span\n className={`mx-1.5 h-px w-6 ${\n states[i] === \"done\"\n ? \"bg-emerald-500/40\"\n : \"bg-border\"\n }`}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport { AlertTriangle, CheckCircle2 } from \"lucide-react\";\nimport { PhaseStepper, type PhaseState } from \"@/components/phase-stepper\";\nimport type { TemplatePhase as MockTemplatePhase } from \"@/lib/cockpit-types\";\nimport type { Template } from \"@/lib/types\";\nimport type { RoundSnapshot } from \"../run-viewer/types.js\";\n\ninterface PhaseProgressProps {\n template: Template | null;\n status: string;\n totalPhases: number;\n completedPhaseCount: number;\n rounds: RoundSnapshot[];\n enrichedRounds: RoundSnapshot[];\n prUrl: string | undefined;\n shipError: string | undefined;\n}\n\nexport function PhaseProgress({\n template,\n status,\n totalPhases,\n completedPhaseCount,\n rounds,\n enrichedRounds,\n prUrl,\n shipError,\n}: PhaseProgressProps) {\n return (\n <div className=\"border-b border-border bg-card/20 px-4 py-3 sm:px-8\">\n <div className=\"mx-auto flex w-full flex-col gap-3\">\n {prUrl && (\n <div className=\"rounded-md border border-emerald-500/40 bg-emerald-500/5 px-4 py-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-emerald-300\">\n <CheckCircle2 className=\"h-4 w-4\" />\n Pull request opened\n </div>\n <a\n href={prUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"rounded-md border border-emerald-500/40 bg-emerald-500/10 px-3 py-1.5 text-xs font-medium text-emerald-300 transition hover:bg-emerald-500/20\"\n >\n View PR →\n </a>\n </div>\n <p className=\"mt-1 break-all font-mono text-[11px] text-emerald-200/70\">\n {prUrl}\n </p>\n </div>\n )}\n {shipError && !prUrl && (\n <div className=\"rounded-md border border-amber-500/40 bg-amber-500/5 px-4 py-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-amber-300\">\n <AlertTriangle className=\"h-4 w-4\" />\n Ship phase blocked\n </div>\n <p className=\"mt-1 break-words font-mono text-[11px] text-amber-200/80\">\n {shipError}\n </p>\n <p className=\"mt-2 text-[11px] leading-relaxed text-muted-foreground\">\n The reviewers approved the doer's output, but chorus\n couldn't open a PR. Resolve the issue above and re-run.\n </p>\n </div>\n )}\n\n {template?.phases && template.phases.length > 0 && (\n <div className=\"flex justify-center\">\n <PhaseStepper\n phases={template.phases as unknown as MockTemplatePhase[]}\n activeIndex={Math.min(completedPhaseCount, totalPhases - 1)}\n states={template.phases.map((_, i): PhaseState => {\n if (status === \"approved\") return \"done\";\n if (status === \"no_review\")\n return i < completedPhaseCount ? \"done\" : \"blocked\";\n if (status === \"failed\" || status === \"cancelled\")\n return i < completedPhaseCount ? \"done\" : \"skipped\";\n if (i < completedPhaseCount) return \"done\";\n if (i === completedPhaseCount) return \"active\";\n return \"pending\";\n })}\n />\n </div>\n )}\n\n <ProgressStrip\n template={template}\n status={status}\n totalPhases={totalPhases}\n completedPhaseCount={completedPhaseCount}\n rounds={rounds}\n enrichedRounds={enrichedRounds}\n />\n </div>\n </div>\n );\n}\n\n/**\n * Counts phases for multi-phase templates, rounds for single-phase +\n * multi-round (e.g. bug-diagnose), reviewers for single-phase +\n * single-round + multi-reviewer (tri-review). Hidden when the run is a\n * single shot.\n */\nfunction ProgressStrip({\n template,\n status,\n totalPhases,\n completedPhaseCount,\n rounds,\n enrichedRounds,\n}: {\n template: Template | null;\n status: string;\n totalPhases: number;\n completedPhaseCount: number;\n rounds: RoundSnapshot[];\n enrichedRounds: RoundSnapshot[];\n}) {\n const maxRounds = template?.maxRounds ?? 1;\n const isTerminal =\n status === \"approved\" ||\n status === \"merged\" ||\n status === \"no_review\" ||\n status === \"blocked\" ||\n status === \"failed\" ||\n status === \"cancelled\";\n\n const showByPhases = totalPhases > 1;\n const showByRounds = !showByPhases && maxRounds > 1;\n const currentRound = enrichedRounds[enrichedRounds.length - 1];\n // Count reviewers only — the doer (or synthetic `doer-artifact` slot\n // in review-only chats) is its own participant on disk but not part\n // of the \"N reviewers complete\" mental model. Without this filter a\n // 4-reviewer review-only chat displays \"x/5\".\n const reviewerParticipants =\n currentRound?.participants.filter((p) => p.role === \"reviewer\") ?? [];\n const participantTotal = reviewerParticipants.length;\n const participantDone = reviewerParticipants.filter((p) => p.hasAnswer).length;\n const showByParticipants =\n !showByPhases && !showByRounds && participantTotal > 1;\n if (!showByPhases && !showByRounds && !showByParticipants) return null;\n\n const total = showByPhases\n ? totalPhases\n : showByRounds\n ? maxRounds\n : participantTotal;\n const completed = showByPhases\n ? Math.min(completedPhaseCount, totalPhases)\n : showByRounds\n ? Math.min(Math.max(rounds.length, 1), maxRounds)\n : participantDone;\n const display = showByPhases && isTerminal ? total : completed;\n const label = showByPhases\n ? `${display} / ${total} phases`\n : showByRounds\n ? `Round ${display} / ${total}`\n : `${display} / ${total} complete`;\n\n return (\n <div className=\"mx-auto flex w-full max-w-xs items-center gap-2\">\n <div className=\"flex h-1 flex-1 overflow-hidden rounded-full bg-muted\">\n <div\n className={`transition-[width] duration-700 ease-out ${\n status === \"approved\" ? \"bg-emerald-400\" : \"bg-primary\"\n }`}\n style={{ width: `${(display / total) * 100}%` }}\n />\n </div>\n <span className=\"shrink-0 font-mono text-[10px] tabular-nums text-muted-foreground\">\n {label}\n </span>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Real-data run view for the /runs/<id> page. Renders doer + reviewer\n * cards with content read from disk on the server and live progress\n * streamed via SSE.\n *\n * Visual structure mirrors the prototype demo: status header, phase\n * progress, grid of reviewer cards. Mock simulation effects from the\n * v0.6 LiveRunView are gone — every value comes from a real source.\n *\n * Header actions live in `header-actions.tsx`, the secondary stepper\n * in `phase-progress.tsx`, and the placeholder-slot synthesis in\n * `enrich-rounds.ts`.\n */\n\nimport Link from \"next/link\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { isReviewOnlyTemplate, type Template } from \"@/lib/types\";\nimport { BriefHeading } from \"../run-viewer/brief-heading\";\nimport { RoundView } from \"../run-viewer/round-view\";\nimport type {\n FallbackSwap,\n ParticipantSnapshot,\n ParticipantWarning,\n RoundSnapshot,\n} from \"../run-viewer/types\";\nimport { enrichRounds } from \"./enrich-rounds\";\nimport { HeaderActions } from \"./header-actions\";\nimport {\n deriveStatusMeta,\n participantKey,\n STATUS_DOT_COLOR,\n TERMINAL_STATUSES,\n type SSEEvent,\n} from \"./helpers\";\nimport { PhaseProgress } from \"./phase-progress\";\n\n/**\n * Demo hook for the unlinked /demo/[scenario] route. When set, the\n * component substitutes the live SSE source with the provided factory\n * and skips every artifact-polling fetch (the demo's mock stream is\n * the single source of truth — no daemon round-trips). Default is\n * `undefined`, which preserves real production behaviour.\n */\nexport interface DemoDataSource {\n /** Factory that returns an EventSource-compatible object. */\n createEventSource: () => EventSource;\n /** Mock for /api/run-artifacts. Called when the SSE handler would\n * otherwise fetch artifacts (participant_done, chat_done). Returns\n * the rounds snapshot for the current scripted moment. */\n fetchArtifacts: () => { rounds: RoundSnapshot[]; swaps?: FallbackSwap[] };\n}\n\ninterface Props {\n chatId: string;\n initialStatus: string;\n initialRounds: RoundSnapshot[];\n template: Template | null;\n /** Raw template id from the chat row. Used as a header fallback when\n * `template` resolved to null (template deleted after the chat was\n * created). Optional for forward-compat with callers that don't have it. */\n templateId?: string;\n work: string;\n projectName?: string;\n /** PR URL when ship phase succeeded (chat status=merged). */\n initialPrUrl?: string;\n /** Ship phase failure detail when status=blocked. */\n initialShipError?: string;\n /** Reviewer-level outcome (separate from system-level status). When\n * status='approved' but verdict='request_changes', the run finished\n * but reviewers said no — header must reflect that, not green-stamp it. */\n initialVerdict?: string;\n /** Demo-only — see DemoDataSource. */\n demoDataSource?: DemoDataSource;\n}\n\nexport function LiveRunReal({\n chatId,\n initialStatus,\n initialRounds,\n templateId,\n template,\n work,\n projectName,\n initialPrUrl,\n initialShipError,\n initialVerdict,\n demoDataSource,\n}: Props) {\n const [status, setStatus] = useState(initialStatus);\n const [verdict, setVerdict] = useState<string | undefined>(initialVerdict);\n const [rounds, setRounds] = useState<RoundSnapshot[]>(initialRounds);\n const [activeParticipants, setActiveParticipants] = useState<Set<string>>(\n new Set(),\n );\n const [prUrl, setPrUrl] = useState<string | undefined>(initialPrUrl);\n const [shipError, setShipError] = useState<string | undefined>(initialShipError);\n\n // Live tail per participant (`<role>-<agentName>` → most recent ~500\n // chars). When headless transport is in use, runner emits\n // phase_progress events with payload.output containing the latest\n // accumulated tail. Render this immediately for instant feedback,\n // falling back to disk-polled content when the SSE event hasn't\n // arrived yet.\n const [liveTails, setLiveTails] = useState<Record<string, string>>({});\n\n // Live phase-completion counter, driven from phase_done SSE events.\n // The status-only `completedPhaseCount` derivation stays at 0 until\n // the chat reaches a terminal state, which made multi-phase chats\n // look frozen for their entire duration. Tracking phase_done gives\n // the stepper the signal it needs to advance during the run. Persist\n // max-seen instead of last-seen because phase_done events carry an\n // explicit phaseIdx and out-of-order arrival is rare-but-possible\n // after a reattach replay.\n const [livePhaseDoneIdx, setLivePhaseDoneIdx] = useState<number>(-1);\n\n // Warnings keyed by participant dir name (same key the on-disk\n // artifacts route returns). The runner emits cli_warning events with\n // payload.agent === participant identifier (e.g. \"claude-code\" for\n // doer, \"codex-cli-0\" for reviewer). Multiple warnings stack on the\n // card; cleared at session end when SSE closes.\n const [participantWarnings, setParticipantWarnings] = useState<\n Record<string, ParticipantWarning[]>\n >({});\n\n // Cross-lineage / cross-model fallback swaps, keyed nowhere — rendered\n // as their own cards on the run page so the user sees \"codex hit\n // quota → claude took over\" without having to read the warnings\n // banner on the failed card. Sources merged into one array:\n // - SSE cli_warning events (live, while chat is in flight)\n // - _swaps.json sidecars from /api/run-artifacts (post-reload, when\n // the SSE is closed because the chat went terminal)\n const [fallbackSwaps, setFallbackSwaps] = useState<FallbackSwap[]>([]);\n // Dedup key includes phaseId + role + agent so a future multi-phase\n // template can't collapse two distinct swaps that happen to share the\n // (round, agent, fromLineage, fromModel) tuple. Today's review-only\n // template has one phase + one role-per-agent, so this is purely\n // future-proofing — but the sidecar already stores the full identity.\n const swapKey = (s: FallbackSwap) =>\n `${s.round}:${s.phaseId}:${s.role}:${s.agent}:${s.fromLineage}:${s.fromModel}`;\n const mergeSwapsFromArtifacts = (incoming: FallbackSwap[]) => {\n setFallbackSwaps((prev) => {\n const seen = new Set(prev.map(swapKey));\n const merged = [...prev];\n for (const s of incoming) {\n const key = swapKey(s);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(s);\n }\n return merged;\n });\n };\n\n const isTerminal = (TERMINAL_STATUSES as readonly string[]).includes(status);\n\n // Periodic refresh of artifacts from disk (cheap server fetch). The\n // SSE stream tells us *when* something changed; this fetches the new\n // content. 8s instead of 4s because each refresh is a same-origin\n // proxy + filesystem read of every artifact in the chat dir; at 4s a\n // 10-minute run did 150 round-trips, most of them unchanged. SSE\n // deltas drive the live ticker.\n useEffect(() => {\n if (isTerminal) return;\n // Demo mode: the mock SSE stream is the single source of truth.\n // Skipping the artifact poll here means the run-page renders only\n // what the scenario script emits, with no surprise late writes\n // from a real /api/run-artifacts response.\n if (demoDataSource) return;\n const refresh = async () => {\n try {\n const res = await fetch(`/api/run-artifacts/${chatId}`);\n if (!res.ok) return;\n const data = (await res.json()) as {\n rounds: RoundSnapshot[];\n swaps?: FallbackSwap[];\n };\n setRounds(data.rounds);\n if (Array.isArray(data.swaps) && data.swaps.length > 0) {\n mergeSwapsFromArtifacts(data.swaps);\n }\n } catch {\n // ignore — next tick retries\n }\n };\n const id = setInterval(refresh, 8000);\n return () => clearInterval(id);\n }, [chatId, isTerminal, demoDataSource]);\n\n useEffect(() => {\n if (isTerminal) return;\n // In demo mode the scripted scenario provides every event we\n // render; the real /api/daemon SSE is bypassed entirely.\n const es = demoDataSource\n ? demoDataSource.createEventSource()\n : new EventSource(`/api/daemon/chats/${chatId}/stream`);\n es.onmessage = (msg) => {\n try {\n const e = JSON.parse(msg.data) as SSEEvent;\n const role = e.payload.role as string | undefined;\n const agent = e.payload.agent as string | undefined;\n const phaseId = e.payload.phaseId as string | undefined;\n\n if (e.type === \"phase_start\" && role && agent && phaseId) {\n // Format mirrors directory naming: \"<role>-<agentName>\" plus\n // phaseId so renderer maps back to dir-name participants by\n // matching role + lineage.\n setActiveParticipants((prev) => {\n const next = new Set(prev);\n next.add(`${role}-${agent}-${phaseId}`);\n return next;\n });\n // Demo mode — swap rounds when a new phase begins so a\n // multi-phase scenario can rotate the participant grid as the\n // stepper advances. Production has /api/run-artifacts polling\n // for that; we shortcut here.\n if (demoDataSource) {\n const snapshot = demoDataSource.fetchArtifacts();\n setRounds(snapshot.rounds);\n if (Array.isArray(snapshot.swaps)) mergeSwapsFromArtifacts(snapshot.swaps);\n }\n }\n\n if (e.type === \"phase_progress\" && role && agent) {\n const output = e.payload.output as string | undefined;\n if (typeof output === \"string\" && output.length > 0) {\n // Keying must match the on-disk directory name format. The\n // payload's `agent` already includes the index suffix for\n // reviewers (`opencode-cli-1`, `opencode-cli-2`), so two\n // reviewers of the same lineage land in distinct liveTails\n // entries instead of clobbering each other.\n const key = participantKey(role, agent);\n setLiveTails((prev) => ({ ...prev, [key]: output }));\n }\n }\n\n if (e.type === \"phase_done\" || e.type === \"phase_failed\") {\n // Clear actives — next phase_start re-populates. Don't clear\n // liveTails — let the disk-poll update them with the final\n // answer instead of flashing empty.\n setActiveParticipants(new Set());\n if (e.type === \"phase_done\") {\n const idx = (e.payload?.phaseIdx as number | undefined) ?? -1;\n if (Number.isInteger(idx) && idx >= 0) {\n setLivePhaseDoneIdx((prev) => (idx > prev ? idx : prev));\n }\n }\n }\n\n if (e.type === \"cli_warning\" && agent && role) {\n // doer → \"doer-<agent>\"; reviewer → already includes the\n // index in agent (e.g. \"codex-cli-0\").\n const key = role === \"doer\" ? `doer-${agent}` : `reviewer-${agent}`;\n const reason = (e.payload.reason as string | undefined) ?? undefined;\n // Older runner code emitted `kind`; current runner emits\n // `reason`. Accept either so reattach against an in-flight\n // chat from a daemon-restart edge doesn't drop the banner.\n const kind =\n reason ?? (e.payload.kind as string | undefined) ?? \"warning\";\n const message =\n (e.payload.message as string | undefined) ?? \"(no detail)\";\n setParticipantWarnings((prev) => {\n const next = { ...prev };\n const existing = next[key] ?? [];\n // Suppress duplicates (same kind + message). Repeated\n // emissions from a retried runner shouldn't pile up\n // identical banners.\n if (existing.some((w) => w.kind === kind && w.message === message)) {\n return prev;\n }\n next[key] = [...existing, { kind, message, ts: e.ts ?? Date.now() }];\n return next;\n });\n\n // Fallback swap signal — runner emits this with reason\n // 'lineage_fallback' (cross-lineage) or 'model_fallback'\n // (same-lineage, different model). Render as its own card on\n // the round so the user sees voice-X-failed → voice-Y-active\n // without having to expand a banner on the failed card.\n if (\n (reason === \"lineage_fallback\" || reason === \"model_fallback\") &&\n typeof e.payload.fromLineage === \"string\" &&\n typeof e.payload.toLineage === \"string\"\n ) {\n const round = (e.payload.round as number | undefined) ?? 1;\n const phaseId = (e.payload.phaseId as string | undefined) ?? \"\";\n const fromModel =\n (e.payload.fromModel as string | undefined) ?? \"(default)\";\n const toModel =\n (e.payload.toModel as string | undefined) ?? \"(default)\";\n const fallbackIdx =\n (e.payload.fallbackIdx as number | undefined) ?? 0;\n const candidate: FallbackSwap = {\n round,\n phaseId,\n role,\n agent,\n reason,\n fromLineage: e.payload.fromLineage as string,\n toLineage: e.payload.toLineage as string,\n fromModel,\n toModel,\n fallbackIdx,\n ts: e.ts ?? Date.now(),\n };\n setFallbackSwaps((prev) => {\n // Dedup with the same key as merge-from-artifacts so live\n // SSE + post-reload sidecar reads can't double-count.\n const candidateKey = swapKey(candidate);\n if (prev.some((s) => swapKey(s) === candidateKey)) return prev;\n return [...prev, candidate];\n });\n }\n }\n\n if (e.type === \"participant_done\") {\n // The runner has just written `## DONE` to this participant's\n // answer.md. Pull artifacts immediately so the card flips\n // from WORKING to DONE without waiting for the 8s polling\n // tick. Demo mode hands the scripted snapshot in via\n // demoDataSource.fetchArtifacts() instead of /api/run-artifacts.\n if (demoDataSource) {\n const snapshot = demoDataSource.fetchArtifacts();\n setRounds(snapshot.rounds);\n if (Array.isArray(snapshot.swaps)) mergeSwapsFromArtifacts(snapshot.swaps);\n } else {\n fetch(`/api/run-artifacts/${chatId}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (!data) return;\n setRounds(data.rounds);\n if (Array.isArray(data.swaps)) mergeSwapsFromArtifacts(data.swaps);\n })\n .catch(() => {});\n }\n }\n\n if (e.type === \"chat_done\") {\n // Runner emits chat_done with payload.status as the canonical\n // terminal state ('completed' / 'merged' / 'blocked' /\n // 'no_review'). Prefer that over verdict for the UI.\n const finalStatus = e.payload.status as string | undefined;\n if (finalStatus === \"merged\") setStatus(\"merged\");\n else if (finalStatus === \"blocked\") setStatus(\"blocked\");\n else if (finalStatus === \"no_review\") setStatus(\"no_review\");\n else if (finalStatus === \"failed\") setStatus(\"failed\");\n else if (finalStatus === \"cancelled\") setStatus(\"cancelled\");\n else setStatus(\"approved\");\n\n const finalVerdict = e.payload.verdict as string | undefined;\n if (typeof finalVerdict === \"string\" && finalVerdict.length > 0) {\n setVerdict(finalVerdict);\n }\n\n const payloadPrUrl = e.payload.prUrl as string | undefined;\n if (typeof payloadPrUrl === \"string\" && payloadPrUrl.length > 0) {\n setPrUrl(payloadPrUrl);\n }\n const payloadShipError = e.payload.shipError as string | undefined;\n if (typeof payloadShipError === \"string\" && payloadShipError.length > 0) {\n setShipError(payloadShipError);\n }\n\n es.close();\n if (demoDataSource) {\n const snapshot = demoDataSource.fetchArtifacts();\n setRounds(snapshot.rounds);\n if (Array.isArray(snapshot.swaps)) mergeSwapsFromArtifacts(snapshot.swaps);\n } else {\n fetch(`/api/run-artifacts/${chatId}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (!data) return;\n setRounds(data.rounds);\n if (Array.isArray(data.swaps)) mergeSwapsFromArtifacts(data.swaps);\n })\n .catch(() => {});\n }\n }\n } catch {\n // skip malformed\n }\n };\n return () => es.close();\n }, [chatId, isTerminal, demoDataSource]);\n\n // One-shot fetch on mount (incl. for terminal chats where the SSE\n // useEffect early-returns). Without this, navigating to a completed\n // chat would never load the swap sidecars — the periodic refresh and\n // SSE branches both skip when isTerminal is true. Demo mode skips —\n // scenario events drive every fallback render directly.\n useEffect(() => {\n if (demoDataSource) return;\n let cancelled = false;\n fetch(`/api/run-artifacts/${chatId}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled || !data) return;\n if (Array.isArray(data.swaps)) mergeSwapsFromArtifacts(data.swaps);\n })\n .catch(() => {\n /* best-effort */\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chatId, demoDataSource]);\n\n /** Active keys are built as `${role}-${agent}-${phaseId}` in the\n * phase_start handler (where `agent` includes the per-slot index for\n * reviewers — e.g. `opencode-cli-1`). The participant's\n * `p.participant` is the on-disk dir name (`reviewer-opencode-cli-1`).\n * Match by dir name as a strict prefix so two same-lineage reviewers\n * don't both light up when only one is streaming. Earlier code\n * matched on `${p.role}-${p.lineage}-` which is identical for\n * `opencode-cli-1` / `opencode-cli-2`, so the active glow leaked. */\n const lineageMatchActive = (p: ParticipantSnapshot): boolean => {\n const prefix = `${p.participant}-`;\n for (const k of activeParticipants) {\n if (k.startsWith(prefix)) return true;\n }\n return false;\n };\n\n const meta = deriveStatusMeta(status, verdict);\n const totalPhases = template?.phases?.length ?? 1;\n\n // Phase completion is driven by terminal status (not disk snapshots).\n // The previous \"any participant has an answer → phase done\" heuristic\n // flipped the stepper to DONE the moment the doer wrote its first\n // byte, even though reviewers were still running and consensus wasn't\n // reached. With status-driven logic the phase only goes \"done\" when\n // the chat itself is in an approved-equivalent terminal state.\n //\n // While drafting/reviewing, livePhaseDoneIdx (the highest phaseIdx\n // seen with phase_done; +1 converts to a count, clamped to\n // totalPhases for safety in case a stale replay sends an out-of-range\n // index) provides the live signal so multi-phase chats don't sit at\n // \"0/N done\" the entire run.\n const completedPhaseCount = useMemo(() => {\n if (status === \"approved\" || status === \"merged\") return totalPhases;\n if (status === \"no_review\" || status === \"blocked\") return totalPhases;\n if (status === \"failed\" || status === \"cancelled\") return 0;\n return Math.min(Math.max(0, livePhaseDoneIdx + 1), totalPhases);\n }, [status, totalPhases, livePhaseDoneIdx]);\n\n const reviewOnly = useMemo(() => isReviewOnlyTemplate(template), [template]);\n const enrichedRounds = useMemo<RoundSnapshot[]>(\n () => enrichRounds(rounds, template, participantWarnings),\n [rounds, template, participantWarnings],\n );\n\n const latestRound = enrichedRounds[enrichedRounds.length - 1];\n const olderRounds = enrichedRounds.slice(0, -1);\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"sticky top-0 z-20 border-b border-border bg-card/80 backdrop-blur-sm px-4 py-3 sm:px-8\">\n {/* Two-row header: meta-bar on top (status pill + template badge\n on the left, action buttons on the right, fixed-height row that\n never shifts), then the title/brief block below — gives both\n rows independent layout so a long title or expanded brief\n never pushes the action buttons around. */}\n <div className=\"mb-2 flex w-full items-center justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Link\n href=\"/runs\"\n className=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground transition hover:text-foreground\"\n >\n <ArrowLeft className=\"h-3 w-3\" />\n <span>{projectName ?? \"Runs\"}</span>\n </Link>\n\n <span className=\"text-muted-foreground/40\">·</span>\n\n {/* Status pill — dot + label together; reads cleanly in\n isolation rather than the orphan dot floating next to the\n title. */}\n <span\n title={meta.text}\n className=\"inline-flex shrink-0 items-center gap-1.5 text-[11px] uppercase tracking-wider text-muted-foreground\"\n >\n <span\n className={`h-2 w-2 shrink-0 rounded-full ${STATUS_DOT_COLOR[meta.color]} ${\n isTerminal ? \"\" : \"animate-pulse-soft\"\n }`}\n />\n {status}\n </span>\n\n {/* Template badge. Falls back to the raw templateId when the\n template row was deleted out from under the chat. */}\n {(template || templateId) && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <Link\n href={`/templates${template ? `#${encodeURIComponent(template.id)}` : \"\"}`}\n title={template ? `Template: ${template.name}` : `Template (deleted): ${templateId}`}\n className=\"inline-flex min-w-0 shrink items-center gap-1.5 text-[11px] text-muted-foreground transition hover:text-primary\"\n >\n <span className=\"font-mono uppercase tracking-wider\">tpl</span>\n <span className=\"truncate font-medium text-foreground\">\n {template?.name ?? templateId}\n </span>\n </Link>\n </>\n )}\n </div>\n\n <HeaderActions\n chatId={chatId}\n status={status}\n isTerminal={isTerminal}\n template={template}\n onCancel={() => setStatus(\"cancelled\")}\n />\n </div>\n\n {/* Title row — full width, BriefHeading owns its own truncation\n and \"Show full brief\" expander without competing with the\n action buttons for vertical space. */}\n <div className=\"min-w-0\">\n <BriefHeading work={work} />\n </div>\n </div>\n\n <PhaseProgress\n template={template}\n status={status}\n totalPhases={totalPhases}\n completedPhaseCount={completedPhaseCount}\n rounds={rounds}\n enrichedRounds={enrichedRounds}\n prUrl={prUrl}\n shipError={shipError}\n />\n\n {/* Body — full-width container. Reviewer outputs are text-heavy\n and benefit from the extra horizontal space. The 6xl cap was\n inherited from a marketing-style layout that doesn't fit a\n tool surface. */}\n <div className=\"flex-1 overflow-y-auto px-4 py-6 sm:px-8\">\n <div className=\"mx-auto w-full space-y-8\">\n {rounds.length === 0 && (\n <div className=\"rounded-lg border border-dashed border-border p-12 text-center text-sm text-muted-foreground\">\n Waiting for first phase to start…\n </div>\n )}\n\n {latestRound && (\n <RoundView\n round={latestRound}\n isLatest\n activeFor={lineageMatchActive}\n liveTails={liveTails}\n chatTerminal={isTerminal}\n reviewOnly={reviewOnly}\n chatId={chatId}\n swaps={fallbackSwaps}\n />\n )}\n\n {/* Review-only chats are single-pass by design — there is\n never an \"earlier rounds\" panel because there's exactly\n one round. */}\n {!reviewOnly && olderRounds.length > 0 && (\n <details className=\"rounded-lg border border-border bg-card\">\n <summary className=\"cursor-pointer px-4 py-3 text-xs uppercase tracking-wider text-muted-foreground hover:text-foreground\">\n Earlier rounds ({olderRounds.length})\n </summary>\n <div className=\"space-y-6 border-t border-border p-4\">\n {olderRounds\n .slice()\n .reverse()\n .map((r) => (\n <RoundView\n key={r.round}\n round={r}\n activeFor={() => false}\n liveTails={{}}\n chatTerminal={isTerminal}\n swaps={fallbackSwaps}\n />\n ))}\n </div>\n </details>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import type { ReviewerLineage } from \"@/lib/types\";\n\n// Used when synthesising placeholder participants — picks a sensible\n// CLI name for the lineage in case the real spawn hasn't happened yet.\nexport const AGENT_LABEL: Record<string, string> = {\n claude: \"claude-code\",\n codex: \"codex-cli\",\n gemini: \"gemini-cli\",\n opencode: \"opencode-cli\",\n kimi: \"kimi-cli\",\n // Matches the on-disk dir name the runner creates for HTTP-dispatched\n // voices (`reviewer-openrouter-<idx>`) so the synthesized pending card\n // reconciles cleanly with the real participant once dispatch finishes.\n openrouter: \"openrouter\",\n};\n\n// Templates use runtime lineage names (\"anthropic\", \"openai\", \"google\",\n// ...) while the cockpit UI displays Linear-style brand names (\"claude\",\n// \"codex\", \"gemini\", ...). This map translates between them so\n// placeholder reviewer cards match the visual lineage of real spawns.\nexport const TEMPLATE_TO_UI_LINEAGE: Record<string, ReviewerLineage> = {\n anthropic: \"claude\",\n openai: \"codex\",\n google: \"gemini\",\n opencode: \"opencode\",\n moonshot: \"kimi\",\n};\n\nconst STATUS_LABEL: Record<string, { text: string; color: string }> = {\n drafting: { text: \"DRAFTING · doer working\", color: \"primary\" },\n reviewing: { text: \"REVIEWING · cross-lineage check\", color: \"primary\" },\n approved: { text: \"APPROVED\", color: \"emerald\" },\n // Internal status name is 'merged' (legacy) — but chorus only opens\n // the PR; the human clicks Merge in GitHub. Label reflects reality.\n merged: { text: \"PR OPENED\", color: \"emerald\" },\n blocked: { text: \"BLOCKED · ship error\", color: \"amber\" },\n no_review: { text: \"NO REVIEW · reviewers unavailable\", color: \"amber\" },\n failed: { text: \"FAILED\", color: \"destructive\" },\n cancelled: { text: \"CANCELLED\", color: \"muted\" },\n};\n\n/**\n * When a chat finishes with status='approved' the reviewer verdict still\n * decides whether the work actually passed. A green \"APPROVED\" badge for\n * a run where every reviewer said \"request changes\" was found in\n * real-user testing on 2026-05-03 and is the kind of misread that gets\n * bad code shipped. Verdict overrides the status label whenever it\n * disagrees with the optimistic green path.\n */\nexport function deriveStatusMeta(\n status: string,\n verdict: string | undefined,\n): { text: string; color: string } {\n if (status === \"approved\" && verdict && verdict !== \"approved\") {\n if (verdict === \"request_changes\") {\n return { text: \"REVIEW · CHANGES REQUESTED\", color: \"amber\" };\n }\n return { text: `REVIEW · ${verdict.toUpperCase()}`, color: \"amber\" };\n }\n return STATUS_LABEL[status] ?? { text: status.toUpperCase(), color: \"muted\" };\n}\n\nexport const STATUS_DOT_COLOR: Record<string, string> = {\n primary: \"bg-primary\",\n emerald: \"bg-emerald-400\",\n amber: \"bg-amber-400\",\n destructive: \"bg-destructive\",\n muted: \"bg-muted-foreground\",\n};\n\nexport interface SSEEvent {\n chatId: string;\n type:\n | \"phase_start\"\n | \"phase_progress\"\n | \"phase_done\"\n | \"phase_failed\"\n | \"cli_error\"\n | \"cli_warning\"\n | \"chat_done\"\n | \"participant_done\";\n payload: Record<string, unknown>;\n ts: number;\n}\n\n/**\n * Build the participant key the run page uses for matching SSE events\n * to participant cards. Mirrors the on-disk directory name format —\n * `<role>-<agentName>` (where agentName for reviewers includes the\n * trailing index, e.g. `opencode-cli-1`, `opencode-cli-2`).\n *\n * Was previously keyed on `role:lineage`, which collided whenever a\n * phase had multiple reviewers of the SAME lineage (e.g. two opencode\n * reviewers — deepseek + kimi). Both wrote to the same liveTails slot;\n * whichever fired its phase_progress event last won, so one card\n * rendered the other reviewer's stream.\n *\n * Keying on the full directory name guarantees uniqueness because the\n * runner allocates a distinct -<idx> suffix per slot.\n */\nexport function participantKey(role: string, agent: string): string {\n return `${role}-${agent}`;\n}\n\nexport const TERMINAL_STATUSES = [\n \"approved\",\n \"merged\",\n \"blocked\",\n \"failed\",\n \"cancelled\",\n \"no_review\",\n] as const;\n","/**\n * Re-export the brand gradient map from the single-source-of-truth so the\n * old import path keeps working. New code should pull from\n * `@/lib/lineage-maps` directly via `UI_LINEAGE_BRAND` or\n * `uiLineageGradient(lineage)`.\n */\nimport { UI_LINEAGE_BRAND, type UILineage } from \"@/lib/lineage-maps\";\n\nexport const LINEAGE_GRADIENT: Record<string, string> = Object.fromEntries(\n Object.entries(UI_LINEAGE_BRAND).map(([k, v]) => [k, v.gradient]),\n) as Record<UILineage, string>;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8', key: '1p45f6' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n];\n\n/**\n * @component @name RotateCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/rotate-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RotateCw = createLucideIcon('rotate-cw', __iconNode);\n\nexport default RotateCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm17 2 4 4-4 4', key: 'nntrym' }],\n ['path', { d: 'M3 11v-1a4 4 0 0 1 4-4h14', key: '84bu3i' }],\n ['path', { d: 'm7 22-4-4 4-4', key: '1wqhfi' }],\n ['path', { d: 'M21 13v1a4 4 0 0 1-4 4H3', key: '1rx37r' }],\n];\n\n/**\n * @component @name Repeat\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/repeat\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Repeat = createLucideIcon('repeat', __iconNode);\n\nexport default Repeat;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm12 19-7-7 7-7', key: '1l729n' }],\n ['path', { d: 'M19 12H5', key: 'x3x0zl' }],\n];\n\n/**\n * @component @name ArrowLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowLeft = createLucideIcon('arrow-left', __iconNode);\n\nexport default ArrowLeft;\n","import { uiLineageDefaultModel } from \"@/lib/lineage-maps\";\nimport { isReviewOnlyTemplate, type ReviewerLineage, type Template } from \"@/lib/types\";\nimport type {\n ParticipantSnapshot,\n ParticipantWarning,\n RoundSnapshot,\n} from \"../run-viewer/types.js\";\nimport { AGENT_LABEL, TEMPLATE_TO_UI_LINEAGE } from \"./helpers\";\n\ninterface Slot {\n role: \"doer\" | \"reviewer\";\n lineage: ReviewerLineage;\n model?: string;\n reviewerIdx?: number;\n}\n\n/**\n * OpenRouter dispatch overrides the slot's lineage for UI matching: the\n * runner creates `reviewer-openrouter-N` dirs (not `reviewer-codex-N`\n * or `-gemini-N`) regardless of the underlying model's lineage. So a\n * slot with model `openrouter:openai/gpt-4o-mini` synthesises an\n * \"openrouter\" UI card that reconciles with the real participant once\n * dispatch finishes. The voice's underlying lineage stays accurate on\n * the voices table for diversity scoring.\n */\nfunction slotLineageForModel(\n templateLineage: string,\n model: string | undefined,\n): ReviewerLineage {\n if (model && model.startsWith(\"openrouter:\")) return \"openrouter\";\n return TEMPLATE_TO_UI_LINEAGE[templateLineage] ?? (templateLineage as ReviewerLineage);\n}\n\nfunction buildExpectedSlots(template: Template, reviewOnly: boolean): Slot[] {\n const phase = template.phases[0];\n // Fall back to the per-lineage default when a template's `models: []`\n // is empty so the card shows the actual model the runner will use.\n const resolveModel = (lineage: ReviewerLineage, models: string[] | undefined) =>\n models?.[0] ?? uiLineageDefaultModel(lineage);\n\n const slots: Slot[] = [];\n if (!reviewOnly) {\n const doerModel = phase.doer.models?.[0];\n const doerLineage = slotLineageForModel(phase.doer.lineage, doerModel);\n slots.push({\n role: \"doer\",\n lineage: doerLineage,\n model: doerModel ?? resolveModel(doerLineage, phase.doer.models),\n });\n }\n // Use candidatesWithModels (added to the parser) so we keep the model\n // assignment per slot. The legacy `candidates` string array is still\n // emitted for connection-status grids that don't care about models.\n for (const [idx, c] of (phase.reviewer?.candidatesWithModels ?? []).entries()) {\n const slotModel = c.models?.[0];\n const lineage = slotLineageForModel(c.lineage, slotModel);\n slots.push({\n role: \"reviewer\",\n lineage,\n model: slotModel ?? resolveModel(lineage, c.models),\n reviewerIdx: idx,\n });\n }\n return slots;\n}\n\n/**\n * Enrich rounds with model lookups + placeholder reviewer slots from\n * the template config. Without this, reviewer cards only appear once\n * the runner has spawned their dirs — leaving the doer card alone in\n * the viewport for the first 30-60s of a run with no hint that 2\n * reviewers are about to chime in. Now we render placeholder cards\n * from the start.\n */\nexport function enrichRounds(\n rounds: RoundSnapshot[],\n template: Template | null,\n participantWarnings: Record<string, ParticipantWarning[]>,\n): RoundSnapshot[] {\n if (!template?.phases?.length) return rounds;\n const reviewOnly = isReviewOnlyTemplate(template);\n const expectedSlots = buildExpectedSlots(template, reviewOnly);\n\n return rounds.map((round) => {\n const enriched: ParticipantSnapshot[] = [];\n const seen = new Set<string>();\n for (const slot of expectedSlots) {\n const slotKey =\n slot.role === \"doer\"\n ? `doer-${slot.lineage}`\n : `reviewer-${slot.lineage}-${slot.reviewerIdx}`;\n const real = round.participants.find((p) => {\n if (slot.role === \"doer\") return p.role === \"doer\" && p.lineage === slot.lineage;\n if (p.role !== \"reviewer\") return false;\n if (p.lineage !== slot.lineage) return false;\n const idxFromName = parseInt(p.participant.match(/-(\\d+)$/)?.[1] ?? \"0\", 10);\n return idxFromName === slot.reviewerIdx;\n });\n if (real) {\n enriched.push({\n ...real,\n model: slot.model,\n ...(participantWarnings[real.participant]\n ? { warnings: participantWarnings[real.participant] }\n : {}),\n });\n seen.add(real.participant);\n } else {\n enriched.push({\n participant: slotKey,\n role: slot.role,\n agentName: AGENT_LABEL[slot.lineage] ?? slot.lineage,\n lineage: slot.lineage,\n hasAnswer: false,\n model: slot.model,\n pending: true,\n ...(participantWarnings[slotKey]\n ? { warnings: participantWarnings[slotKey] }\n : {}),\n });\n }\n }\n // Append any unexpected participants (defensive — shouldn't happen).\n for (const p of round.participants) {\n if (!seen.has(p.participant)) {\n enriched.push({\n ...p,\n ...(participantWarnings[p.participant]\n ? { warnings: participantWarnings[p.participant] }\n : {}),\n });\n }\n }\n return { ...round, participants: enriched };\n });\n}\n"],"names":["ArrowLeft","__iconNode"],"mappings":"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","ignoreList":[10,11,12]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
self.__MIDDLEWARE_MATCHERS = [];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB()
|