@hybridlabor-api/bdb-synapse 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -0
  3. package/bin/synapse +0 -0
  4. package/cmd/rubriceval/main.go +308 -0
  5. package/cmd/synapse/main.go +280 -0
  6. package/cmd/synapse/main_test.go +16 -0
  7. package/go.mod +7 -0
  8. package/go.sum +6 -0
  9. package/internal/adapter/adapter.go +1117 -0
  10. package/internal/adapter/adapter_test.go +518 -0
  11. package/internal/adapter/agy/adapter.go +193 -0
  12. package/internal/adapter/claudecode/adapter.go +415 -0
  13. package/internal/adapter/claudecode/adapter_test.go +260 -0
  14. package/internal/adapter/claudecode/agents.go +387 -0
  15. package/internal/adapter/claudecode/agents_test.go +480 -0
  16. package/internal/adapter/claudecode/summary_inputs_test.go +19 -0
  17. package/internal/adapter/codex/adapter.go +919 -0
  18. package/internal/adapter/codex/adapter_test.go +920 -0
  19. package/internal/adapter/codex/agents.go +401 -0
  20. package/internal/adapter/codex/agents_test.go +610 -0
  21. package/internal/adapter/codex/summary_inputs_test.go +20 -0
  22. package/internal/adapter/pi/adapter.go +483 -0
  23. package/internal/adapter/pi/adapter_test.go +517 -0
  24. package/internal/citymap/builder.go +1124 -0
  25. package/internal/citymap/builder_test.go +818 -0
  26. package/internal/judge/cache.go +180 -0
  27. package/internal/judge/cli.go +240 -0
  28. package/internal/judge/cli_test.go +68 -0
  29. package/internal/judge/fresh_summary_test.go +37 -0
  30. package/internal/judge/input.go +233 -0
  31. package/internal/judge/judge.go +416 -0
  32. package/internal/judge/judge_test.go +288 -0
  33. package/internal/judge/prompt.go +129 -0
  34. package/internal/judge/rubric.go +275 -0
  35. package/internal/judge/rubric_test.go +642 -0
  36. package/internal/model/agent.go +63 -0
  37. package/internal/model/agent_schema_test.go +86 -0
  38. package/internal/model/agent_test.go +64 -0
  39. package/internal/model/model.go +175 -0
  40. package/internal/model/report.go +166 -0
  41. package/internal/model/stats.go +151 -0
  42. package/internal/model/stats_test.go +89 -0
  43. package/internal/model/trace_schema_test.go +67 -0
  44. package/internal/server/analyze.go +286 -0
  45. package/internal/server/analyze_test.go +297 -0
  46. package/internal/server/codex_index_test.go +40 -0
  47. package/internal/server/hardening_test.go +147 -0
  48. package/internal/server/reportindex.go +91 -0
  49. package/internal/server/reportindex_test.go +116 -0
  50. package/internal/server/server.go +1099 -0
  51. package/internal/server/server_test.go +1389 -0
  52. package/internal/server/static/assets/fraunces-latin-ext-standard-italic-CGbN9UgK.woff2 +0 -0
  53. package/internal/server/static/assets/fraunces-latin-ext-standard-normal-CJcjJNj7.woff2 +0 -0
  54. package/internal/server/static/assets/fraunces-latin-standard-italic-lSdLDfvT.woff2 +0 -0
  55. package/internal/server/static/assets/fraunces-latin-standard-normal-DihXLNYH.woff2 +0 -0
  56. package/internal/server/static/assets/fraunces-vietnamese-standard-italic-DxWqP7Ku.woff2 +0 -0
  57. package/internal/server/static/assets/fraunces-vietnamese-standard-normal-Czevyj-6.woff2 +0 -0
  58. package/internal/server/static/assets/index-BNoY_BiB.css +1 -0
  59. package/internal/server/static/assets/index-C_adLrJr.js +3 -0
  60. package/internal/server/static/assets/react-gcHzaSmV.js +10 -0
  61. package/internal/server/static/assets/schibsted-grotesk-latin-ext-wght-normal-hsMS0n0O.woff2 +0 -0
  62. package/internal/server/static/assets/schibsted-grotesk-latin-wght-normal-Bb8VGrTG.woff2 +0 -0
  63. package/internal/server/static/assets/three-DnGjZfD1.js +4012 -0
  64. package/internal/server/static/index.html +26 -0
  65. package/internal/server/tracestore.go +173 -0
  66. package/internal/server/tracestore_test.go +51 -0
  67. package/internal/textutil/truncate.go +30 -0
  68. package/internal/textutil/truncate_test.go +39 -0
  69. package/package.json +35 -0
  70. package/web/e2e/agent-lens.spec.ts +688 -0
  71. package/web/index.html +23 -0
  72. package/web/package-lock.json +1933 -0
  73. package/web/package.json +33 -0
  74. package/web/playwright.config.ts +24 -0
  75. package/web/src/App.tsx +876 -0
  76. package/web/src/api/client.ts +74 -0
  77. package/web/src/main.tsx +12 -0
  78. package/web/src/playback/recorder.ts +160 -0
  79. package/web/src/playback/reducer.ts +91 -0
  80. package/web/src/scene/CityScene.tsx +638 -0
  81. package/web/src/scene/TreeScene.tsx +656 -0
  82. package/web/src/scene/dirLabels.ts +145 -0
  83. package/web/src/scene/sceneUtils.ts +144 -0
  84. package/web/src/scene/textures.ts +60 -0
  85. package/web/src/scene/trail.ts +79 -0
  86. package/web/src/scene/treeLayout.ts +169 -0
  87. package/web/src/state/filters.ts +40 -0
  88. package/web/src/state/store.ts +83 -0
  89. package/web/src/styles.css +2565 -0
  90. package/web/src/types.ts +315 -0
  91. package/web/src/ui/AgentsPanel.tsx +376 -0
  92. package/web/src/ui/Dock.tsx +104 -0
  93. package/web/src/ui/Hud.tsx +335 -0
  94. package/web/src/ui/Inspector.tsx +107 -0
  95. package/web/src/ui/LogoMark.tsx +38 -0
  96. package/web/src/ui/ReportPanel.tsx +491 -0
  97. package/web/src/ui/SessionRail.tsx +316 -0
  98. package/web/src/ui/Timeline.tsx +458 -0
  99. package/web/src/ui/ViewPanel.tsx +45 -0
  100. package/web/src/ui/shortcuts.ts +4 -0
  101. package/web/tsconfig.json +21 -0
  102. package/web/vite.config.ts +28 -0
@@ -0,0 +1 @@
1
+ @font-face{font-family:Fraunces Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/fraunces-vietnamese-standard-normal-Czevyj-6.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Fraunces Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/fraunces-latin-ext-standard-normal-CJcjJNj7.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fraunces Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/fraunces-latin-standard-normal-DihXLNYH.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fraunces Variable;font-style:italic;font-display:swap;font-weight:100 900;src:url(/assets/fraunces-vietnamese-standard-italic-DxWqP7Ku.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Fraunces Variable;font-style:italic;font-display:swap;font-weight:100 900;src:url(/assets/fraunces-latin-ext-standard-italic-CGbN9UgK.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fraunces Variable;font-style:italic;font-display:swap;font-weight:100 900;src:url(/assets/fraunces-latin-standard-italic-lSdLDfvT.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Schibsted Grotesk Variable;font-style:normal;font-display:swap;font-weight:400 900;src:url(/assets/schibsted-grotesk-latin-ext-wght-normal-hsMS0n0O.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Schibsted Grotesk Variable;font-style:normal;font-display:swap;font-weight:400 900;src:url(/assets/schibsted-grotesk-latin-wght-normal-Bb8VGrTG.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{color-scheme:dark;--sky: oklch(.19 .016 258);--panel: oklch(.245 .014 256);--panel-raised: oklch(.285 .014 254);--hairline: oklch(.37 .014 254);--hairline-strong: oklch(.46 .016 252);--ink: oklch(.91 .014 88);--muted: oklch(.72 .02 252);--faint: oklch(.63 .02 252);--text-xs: .75rem;--text-sm: .9rem;--text-lg: 1.35rem;--moss: oklch(.78 .11 131);--moon: oklch(.83 .07 250);--amber: oklch(.79 .13 68);--ember: oklch(.73 .16 52);--pine: oklch(.72 .09 155);--alarm: oklch(.7 .16 32);--act-search: oklch(.74 .09 192);--act-read: oklch(.8 .07 242);--act-edit: oklch(.8 .16 75);--act-verify: oklch(.75 .13 145);--act-exec: oklch(.58 .02 255);--mark-compaction: oklch(.66 .2 32);--mark-subagent: oklch(.74 .09 300);--font-display: "Fraunces Variable", "Songti SC", "Noto Serif SC", serif;--font-body: "Schibsted Grotesk Variable", "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", system-ui, sans-serif;color:var(--ink);background:var(--sky);font-family:var(--font-body);font-size:15px;line-height:1.5;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh;overflow:hidden}button,input{font:inherit;color:inherit}button{cursor:pointer;border:0;background:none;padding:0}h1,h2,h3,p,dl,dd{margin:0}::selection{background:#f1aa5759}:focus-visible{outline:1.5px solid var(--amber);outline-offset:2px}.app-frame{display:flex;width:100vw;height:100vh;height:100dvh;overflow:hidden;background:var(--sky)}.stage{flex:1;min-width:0;display:flex;flex-direction:column}.viewport{position:relative;flex:1;min-height:0}.city-scene{position:absolute;inset:0}.city-scene canvas{display:block}.session-rail{flex:none;width:292px;display:flex;flex-direction:column;background:var(--panel);border-right:1px solid var(--hairline);transition:margin .28s cubic-bezier(.16,1,.3,1),visibility 0s}.session-rail.collapsed{margin-left:-293px;visibility:hidden;transition:margin .28s cubic-bezier(.16,1,.3,1),visibility 0s .28s}.rail-head{display:flex;align-items:baseline;justify-content:space-between;padding:20px 18px 14px}.wordmark{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-display);font-style:italic;font-weight:480;font-size:1.5rem;letter-spacing:.01em;line-height:1}.wordmark svg{flex:none;border-radius:5px;box-shadow:0 0 0 1px var(--hairline)}.wordmark .spark{color:var(--amber)}.rail-head-actions{display:flex;gap:2px}.rail-head .icon-btn{transform:translateY(2px)}.rail-expand{position:absolute;top:20px;left:24px;z-index:5;display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid var(--hairline-strong);border-radius:4px;background:var(--panel);color:var(--muted)}.rail-expand:hover{color:var(--ink);background:var(--panel-raised)}.rail-controls{display:grid;gap:9px;margin:0 18px 10px;padding-bottom:10px;border-bottom:1px solid var(--hairline)}.rail-filter{display:flex;align-items:center;gap:8px;color:var(--faint)}.rail-filter input{flex:1;min-width:0;border:0;background:none;color:var(--ink);font-size:var(--text-sm)}.rail-filter input::placeholder{color:var(--faint)}.rail-filter input:focus{outline:none}.rail-chips{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.chip{padding:3px 10px;border:1px solid var(--hairline-strong);border-radius:999px;color:var(--muted);font-size:var(--text-xs);font-weight:560;letter-spacing:.04em}.chip:hover{color:var(--ink);background:var(--panel-raised)}.chip.active{color:#f4eee0;background:var(--panel-raised);border-color:var(--muted)}.eye-toggle{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;margin-left:auto;border-radius:4px;color:var(--faint)}.eye-toggle:hover{color:var(--ink);background:var(--panel-raised)}.eye-toggle.showing{color:#f4eee0;background:var(--panel-raised)}.session-list{flex:1;overflow-y:auto;padding:4px 10px 12px;scrollbar-width:thin;scrollbar-color:var(--hairline) transparent}.session-row{position:relative;width:100%;display:grid;gap:4px;padding:10px 10px 10px 14px;border-radius:4px;text-align:left}.session-row:before{content:"";position:absolute;left:0;top:12px;bottom:12px;width:2px;border-radius:2px;background:transparent}.session-row:hover{background:#252b3199}.session-row.active{background:var(--panel-raised)}.session-row.active:before{background:var(--amber);box-shadow:0 0 8px #f1aa578c}.session-title{font-size:var(--text-sm);font-weight:560;line-height:1.4;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;color:var(--ink)}.session-row.active .session-title{color:#f4eee0}.session-meta{display:flex;align-items:center;gap:7px;min-width:0;color:var(--faint);font-size:var(--text-xs);letter-spacing:.02em;font-variant-numeric:tabular-nums}.session-row.active .session-meta{color:var(--muted)}.session-meta-text{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rail-map{position:relative}.rail-map-pop{position:absolute;top:calc(100% + 6px);left:0;z-index:20;display:grid;grid-template-columns:minmax(0,1fr);gap:6px;padding:8px;width:240px;border:1px solid var(--hairline-strong);border-radius:6px;background:var(--panel-raised);box-shadow:0 8px 24px #0006}.rail-map-primary{display:flex;align-items:center;gap:9px;width:100%;padding:8px 9px;text-align:left;color:var(--muted);border:1px solid var(--hairline-strong);border-radius:4px}.rail-map-primary:hover{color:var(--ink);background:var(--panel)}.rail-map-primary-text{display:grid;gap:1px;min-width:0}.rail-map-primary-name{color:var(--ink);font-size:var(--text-sm);font-weight:560}.rail-map-primary-path{font-size:var(--text-xs);color:var(--faint);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;direction:rtl;text-align:left}.rail-map-divider{display:flex;align-items:center;gap:8px;margin:2px 0;color:var(--faint);font-size:var(--text-xs);letter-spacing:.04em}.rail-map-divider:before,.rail-map-divider:after{content:"";flex:1;height:1px;background:var(--hairline)}.rail-map-label{color:var(--faint);font-size:var(--text-xs);letter-spacing:.08em;text-transform:uppercase}.rail-map-form{display:flex;gap:6px}.rail-map-input{flex:1;min-width:0;padding:6px 8px;color:var(--ink);font-size:var(--text-sm);background:var(--panel);border:1px solid var(--hairline-strong);border-radius:4px}.rail-map-input::placeholder{color:var(--faint)}.rail-map-input:focus{outline:none;border-color:var(--muted)}.rail-map-go{padding:6px 11px;color:var(--ink);font-size:var(--text-xs);font-weight:560;border:1px solid var(--hairline-strong);border-radius:4px}.rail-map-go:hover:not(:disabled){background:var(--panel)}.rail-map-go:disabled{opacity:.4}.rail-foot{padding:10px 18px 14px;border-top:1px solid var(--hairline);color:var(--faint);font-size:var(--text-xs);letter-spacing:.08em;text-transform:uppercase;font-variant-numeric:tabular-nums}.hud{position:absolute;inset:0;pointer-events:none;padding:20px 24px;display:flex;align-items:flex-start;justify-content:space-between;gap:24px}.hud-left{min-width:0;transition:margin-left .28s cubic-bezier(.16,1,.3,1)}.rail-collapsed .hud-left{margin-left:42px}.hud-repo{font-family:var(--font-display);font-weight:540;font-size:1.6rem;line-height:1.1;letter-spacing:.005em}.hud-title-line{display:flex;align-items:center;flex-wrap:wrap;gap:8px 12px}.hud-lens{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;border:1px solid var(--hairline-strong);border-radius:999px;background:#1c2127db;color:var(--ink);font-size:var(--text-xs);font-weight:560;letter-spacing:.02em;pointer-events:auto}.hud-lens:hover:not(:disabled),.hud-agent-link:hover:not(:disabled){color:var(--ink);border-color:var(--amber)}.hud-lens:disabled,.hud-agent-link:disabled{cursor:default}.hud-lens span{color:var(--amber);font-size:.67rem;letter-spacing:.1em;text-transform:uppercase}.hud-commit{display:flex;align-items:center;gap:8px;margin-top:5px;color:var(--muted);font-size:var(--text-sm);font-variant-numeric:tabular-nums}.hud-commit .dirty{color:var(--ember)}.spectrum{display:flex;flex-wrap:wrap;gap:3px 18px;margin-top:18px;font-size:var(--text-xs);letter-spacing:.03em;font-variant-numeric:tabular-nums;pointer-events:auto}.spectrum-stat{display:flex;align-items:center;gap:7px}.spectrum-label{color:var(--faint);text-transform:uppercase;letter-spacing:.1em;text-decoration:underline dotted oklch(.63 .02 252 / .5);text-underline-offset:3px}.spectrum-stat strong{font-size:var(--text-sm);font-weight:560;color:var(--ink)}.hud-quiet{display:flex;flex-wrap:wrap;gap:3px 14px;margin-top:7px;color:var(--faint);font-size:var(--text-xs);letter-spacing:.04em;font-variant-numeric:tabular-nums;pointer-events:auto}.hud-agent-link{color:inherit;border-bottom:1px dotted var(--hairline-strong)}.hud-review{display:flex;flex-wrap:wrap;align-items:baseline;gap:3px 14px;margin-top:8px;font-size:var(--text-xs);letter-spacing:.04em;font-variant-numeric:tabular-nums;pointer-events:auto}.review-label{color:var(--faint);text-transform:uppercase;letter-spacing:.1em}.hud-review .warn{color:var(--ember)}.hud-review .ok{color:var(--pine)}.churn-toggle{font-size:inherit;letter-spacing:inherit;text-decoration:underline dotted oklch(.73 .16 52 / .6);text-underline-offset:3px}.churn-toggle:hover,.churn-toggle.open{color:#ffaf7e;color:oklch(.82 .16 52)}.churn-panel{display:grid;width:max-content;min-width:240px;max-width:340px;margin-top:8px;padding:5px;border:1px solid var(--hairline-strong);border-radius:5px;background:#1c2127f7;pointer-events:auto}.churn-row{display:flex;align-items:baseline;justify-content:space-between;gap:14px;padding:5px 8px;border-radius:3px;text-align:left;font-size:var(--text-xs);color:var(--muted);font-variant-numeric:tabular-nums}.churn-row:hover{background:var(--panel-raised);color:var(--ink)}.churn-path{direction:rtl;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;unicode-bidi:plaintext}.churn-count{flex:none;color:var(--faint)}.churn-row:hover .churn-count{color:var(--muted)}.churn-more{padding:4px 8px 3px;color:var(--faint);font-size:var(--text-xs)}[data-hint]{position:relative;cursor:help}[data-hint]:after{content:attr(data-hint);position:absolute;top:calc(100% + 7px);left:0;z-index:40;width:max-content;max-width:250px;padding:6px 10px;border:1px solid var(--hairline-strong);border-radius:4px;background:var(--panel-raised);color:var(--ink);font-size:var(--text-xs);font-weight:420;letter-spacing:.01em;line-height:1.45;text-transform:none;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s ease-out}[data-hint]:hover:after{opacity:1;visibility:visible}.hud-right{display:grid;gap:10px;justify-items:end}.legend-dot{width:8px;height:8px;border-radius:50%}.legend-dot.hit{background:var(--moss);box-shadow:0 0 7px #9fc67bcc}.legend-dot.read{background:var(--moon);box-shadow:0 0 7px #a5ccf4cc}.legend-dot.edit{background:var(--amber);box-shadow:0 0 7px #f1aa57cc}.legend-dot.unvisited{background:#5e646b}.legend-dot.ghost{background:transparent;border:1px solid oklch(.55 .014 254)}.scene-tip{position:absolute;z-index:30;display:none;max-width:380px;padding:5px 9px;border:1px solid var(--hairline-strong);border-radius:4px;background:#1c2127f7;color:var(--ink);font-size:var(--text-xs);letter-spacing:.01em;line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none;font-variant-numeric:tabular-nums}.scene-tip .dim{color:var(--muted)}.dock-panel{width:308px;max-height:100%;display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto;background:#1c2127f5;border:1px solid var(--hairline);border-radius:6px;scrollbar-width:thin;scrollbar-color:var(--hairline) transparent}@media(prefers-reduced-motion:no-preference){.dock-panel{animation:inspector-in .28s cubic-bezier(.16,1,.3,1)}}@keyframes inspector-in{0%{opacity:0;transform:translate(14px)}to{opacity:1;transform:none}}.inspector-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding:14px 16px 12px;border-bottom:1px solid var(--hairline)}.inspector-path{font-size:var(--text-sm);font-weight:560;line-height:1.45;overflow-wrap:anywhere}.inspector-path .dir{color:var(--muted);font-weight:420}.ghost-badge{display:inline-block;margin-top:6px;padding:2px 8px;border:1px solid var(--hairline-strong);border-radius:999px;color:var(--muted);font-size:var(--text-xs);letter-spacing:.08em;text-transform:uppercase}.inspector-facts{display:grid;grid-template-columns:1fr 1fr;padding:6px 16px 12px;border-bottom:1px solid var(--hairline)}.inspector-facts>div{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:6px 0}.inspector-facts>div:nth-child(odd){padding-right:14px;border-right:1px solid var(--hairline)}.inspector-facts>div:nth-child(2n){padding-left:14px}.inspector-facts dt{color:var(--faint);font-size:var(--text-xs);letter-spacing:.1em;text-transform:uppercase}.inspector-facts dd{font-size:var(--text-sm);font-weight:560;font-variant-numeric:tabular-nums}.inspector-facts dd.touch-hit{color:var(--moss)}.inspector-facts dd.touch-read{color:var(--moon)}.inspector-facts dd.touch-edit{color:var(--amber)}.inspector-history{padding:12px 16px}.eyebrow{margin:0 0 10px;color:var(--faint);font-size:var(--text-xs);font-weight:560;letter-spacing:.14em;text-transform:uppercase}.history-list{display:grid}.history-row{display:grid;grid-template-columns:10px max-content 1fr auto auto;align-items:center;gap:9px;width:100%;padding:6px 4px;border-radius:3px;text-align:left;font-size:var(--text-sm);color:var(--muted);font-variant-numeric:tabular-nums}.history-time{color:var(--faint);font-size:var(--text-xs)}.history-row:hover:not(:disabled){background:var(--panel-raised);color:var(--ink)}.history-row:disabled{opacity:.45;cursor:not-allowed}.history-row strong{font-weight:560;color:var(--faint)}.history-row:hover:not(:disabled) strong{color:var(--muted)}.history-err{color:var(--alarm)}.muted{color:var(--faint);font-size:var(--text-sm);line-height:1.5}.action-dot{width:7px;height:7px;border-radius:50%;background:var(--faint)}.action-dot.search{background:var(--act-search)}.action-dot.read{background:var(--act-read)}.action-dot.edit{background:var(--act-edit)}.action-dot.verify{background:var(--act-verify)}.action-dot.exec{background:var(--act-exec)}.deck{flex:none;display:flex;flex-direction:column;gap:6px;padding:12px 22px 10px;background:var(--panel);border-top:1px solid var(--hairline)}.deck-main{display:flex;align-items:center;gap:12px}.deck-main .strip{margin-right:10px}.deck-foot{display:flex;align-items:center;gap:26px}.transport{display:flex;align-items:center;gap:6px}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:4px;color:var(--muted)}.icon-btn:hover:not(:disabled){color:var(--ink);background:var(--panel-raised)}.icon-btn:disabled{opacity:.45;cursor:not-allowed}.icon-btn.recording{color:var(--warm, #e0a458)}.spin{animation:spin .9s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.play-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:30px;border:1px solid var(--hairline-strong);border-radius:4px;color:var(--ink)}.play-btn .play-glyph{transform:translate(1px)}.play-btn:hover{border-color:var(--muted);background:var(--panel-raised)}.transport-more{position:relative;display:inline-flex}.icon-btn.open{color:var(--ink);background:var(--panel-raised)}.more-speed{color:#f4eee0;font-size:var(--text-xs);font-weight:560;letter-spacing:.04em;font-variant-numeric:tabular-nums}.transport-pop{position:absolute;bottom:calc(100% + 8px);right:0;z-index:20;min-width:172px;padding:8px;display:grid;gap:3px;border:1px solid var(--hairline-strong);border-radius:6px;background:var(--panel-raised);box-shadow:0 8px 24px #0006;animation:pop-rise .14s ease-out}@keyframes pop-rise{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.pop-speed{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:2px 8px 8px;margin-bottom:3px;border-bottom:1px solid var(--hairline)}.pop-speed-label{color:var(--muted);font-size:var(--text-sm)}.pop-speed-chips{display:inline-flex;gap:2px}.pop-chip{min-width:26px;height:22px;padding:0 5px;border-radius:3px;color:var(--muted);font-size:var(--text-xs);font-weight:560;letter-spacing:.04em;font-variant-numeric:tabular-nums}.pop-chip:hover{color:var(--ink);background:var(--panel)}.pop-chip.engaged{color:#f4eee0;background:var(--panel);box-shadow:inset 0 0 0 1px var(--hairline-strong)}.pop-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:4px;text-align:left;color:var(--muted);font-size:var(--text-sm)}.pop-item:hover{color:var(--ink);background:var(--panel)}.pop-item kbd{margin-left:auto;padding:1px 5px;border:1px solid var(--hairline);border-radius:3px;color:var(--faint);font-family:inherit;font-size:.62rem;letter-spacing:.06em}.transport>button:disabled,.transport-more>button:disabled{opacity:.45;cursor:default;pointer-events:none}.strip{position:relative;flex:1;height:46px;min-width:0}.strip-marks{position:absolute;top:0;left:0;right:0;height:10px;pointer-events:none}.strip-mark{position:absolute;top:1px;width:7px;height:7px;transform:translate(-50%) rotate(45deg);border:1px solid var(--mark-compaction);background:transparent;pointer-events:auto;cursor:pointer;transition:transform .12s ease-out}.strip-mark:hover{transform:translate(-50%) rotate(45deg) scale(1.5)}.strip-mark:disabled{cursor:default;opacity:.45;pointer-events:none}.strip-mark.subagent{border-color:var(--mark-subagent);border-radius:50%}.strip-mark.user-message{top:0;width:11px;height:10px;border:0;border-radius:0;transform:translate(-50%)}.strip-mark.user-message:after{content:"";position:absolute;left:3px;top:2.5px;width:4px;height:4px;border:1.5px solid var(--faint);border-left:0;border-bottom:0;transform:rotate(45deg)}.strip-mark.user-message:hover{transform:translate(-50%) scale(1.5)}.strip-mark.user-message:hover:after{border-color:var(--ink)}.strip-bars{position:absolute;inset:12px 0;display:flex;align-items:flex-end;gap:1px;border-bottom:1px solid var(--hairline-strong)}.strip-bar{flex:1;min-width:0;border-radius:1px 1px 0 0;background:var(--faint);opacity:.85}.strip-bar.search{background:var(--act-search)}.strip-bar.read{background:var(--act-read)}.strip-bar.edit{background:var(--act-edit)}.strip-bar.verify{background:var(--act-verify)}.strip-bar.exec{background:var(--act-exec)}.strip-playhead{position:absolute;top:10px;bottom:0;width:1.5px;background:var(--ink);transform:translate(-50%);pointer-events:none}.strip-playhead:after{content:"";position:absolute;bottom:-2px;left:50%;width:5px;height:5px;transform:translate(-50%) rotate(45deg);background:var(--ink)}.strip-input{position:absolute;inset:8px 0 0;width:100%;margin:0;opacity:0;cursor:ew-resize}.deck-pos{display:flex;align-items:baseline;gap:12px;font-variant-numeric:tabular-nums}.deck-pos-count{color:var(--ink);font-size:var(--text-sm);letter-spacing:.04em;text-align:right}.deck-pos-clock{color:var(--faint);font-size:var(--text-xs);letter-spacing:.06em}.readout-now{flex:1;min-width:0;display:flex;align-items:center;gap:8px;font-size:var(--text-sm);white-space:nowrap}.readout-tool{font-weight:560;flex:none}.readout-now .err{flex:none;color:var(--alarm);font-size:var(--text-xs);letter-spacing:.08em;text-transform:uppercase}.readout-summary{color:var(--muted);line-height:1.4;overflow:hidden;text-overflow:ellipsis}.deck-legend{flex:none;display:flex;align-items:center;gap:22px;color:var(--faint);font-size:.68rem;letter-spacing:.07em;white-space:nowrap}.legend-group{display:inline-flex;align-items:center;gap:11px}.legend-item{display:inline-flex;align-items:center;gap:5px}.deck-legend .action-dot{width:5px;height:5px}.legend-glyph{display:inline-block;flex:none}.legend-glyph.compaction{width:6px;height:6px;border:1px solid var(--mark-compaction);transform:rotate(45deg)}.legend-glyph.subagent{width:6px;height:6px;border:1px solid var(--mark-subagent);border-radius:50%}.legend-glyph.user-message{width:4px;height:4px;border:1.5px solid var(--faint);border-left:0;border-bottom:0;transform:rotate(45deg);margin-right:2px}.toast{position:absolute;top:18px;left:50%;transform:translate(-50%);padding:8px 14px;border:1px solid var(--hairline-strong);border-radius:4px;background:var(--panel-raised);color:var(--muted);font-size:var(--text-sm);pointer-events:none}.toast.error{color:var(--alarm);border-color:#f1735c80}.empty-stage{position:absolute;inset:0;display:grid;place-items:center;pointer-events:none}.empty-stage .card{text-align:center;color:var(--muted);max-width:340px;line-height:1.6;font-size:var(--text-sm)}.empty-stage .card h2{font-family:var(--font-display);font-style:italic;font-weight:480;font-size:var(--text-lg);margin-bottom:8px;color:var(--ink)}@media(max-width:900px){.app-frame{flex-direction:column}.session-rail{width:auto;height:224px;border-right:0;border-bottom:1px solid var(--hairline)}.session-rail.collapsed{margin-left:0;margin-top:-225px}.rail-expand{top:14px;left:16px}.rail-head{padding:12px 16px 8px}.hud{padding:14px 16px}.hud-repo{font-size:1.2rem}.dock{position:fixed;inset:auto 12px 12px;z-index:30;flex-direction:row-reverse;align-items:flex-end}.dock-panel{position:static;flex:1;min-width:0;width:auto;max-height:46vh}.deck-pos{display:none}}@media(max-width:1180px){.deck-legend{display:none}}@media(prefers-reduced-motion:reduce){*{transition-duration:.01ms!important;animation-duration:.01ms!important}}.dock{position:absolute;top:20px;right:20px;bottom:20px;display:flex;align-items:flex-start;gap:10px;pointer-events:none}.dock>*{pointer-events:auto}.dock-side{position:relative;display:flex;align-items:flex-start}.dock-strip{display:grid;gap:6px;padding:6px;border:1px solid var(--hairline);border-radius:6px;background:#1c2127eb}.dock-strip-group{display:grid;gap:6px}.dock-strip-divider{height:1px;margin:2px 3px;background:var(--hairline)}.dock-pop{position:absolute;top:0;right:calc(100% + 10px);z-index:20;min-width:148px;padding:8px;border:1px solid var(--hairline-strong);border-radius:6px;background:var(--panel-raised);box-shadow:0 8px 24px #0006}.view-pop{display:grid;gap:3px}.view-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:4px;text-align:left;color:var(--muted);font-size:var(--text-sm)}.view-row:hover:not(:disabled){color:var(--ink);background:var(--panel)}.view-row.active{color:var(--ink);background:var(--panel);box-shadow:inset 0 0 0 1px var(--hairline-strong)}.view-row:disabled{opacity:.5}.view-note{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:4px 2px 0;padding-top:6px;border-top:1px solid var(--hairline);color:var(--faint);font-size:var(--text-xs)}.view-key{padding:0 5px;border:1px solid var(--hairline-strong);border-radius:3px;font-size:var(--text-xs);color:var(--muted)}.dock-strip button{position:relative;display:grid;place-items:center;width:30px;height:30px;border-radius:4px;color:var(--muted)}.dock-strip button:hover{color:var(--ink);background:var(--panel-raised)}.dock-strip button.active{color:var(--ink);background:var(--panel-raised);box-shadow:inset 0 0 0 1px var(--hairline-strong)}.dock-strip [data-hint]:after{top:50%;left:auto;right:calc(100% + 8px);transform:translateY(-50%)}.dock-dot{position:absolute;top:4px;right:4px;width:6px;height:6px;border-radius:999px}.dock-dot-running{background:var(--moon);animation:report-pulse 1.4s ease-in-out infinite}.dock-dot-done{background:var(--pine)}.dock-dot-stale{background:var(--amber)}.dock-dot-failed{background:var(--alarm)}@keyframes report-pulse{0%,to{opacity:1}50%{opacity:.35}}.dock-note{padding:14px 16px;color:var(--muted);font-size:var(--text-sm);line-height:1.55}.agents-head-note{margin-top:3px;color:var(--faint);font-size:var(--text-xs)}.agent-list{display:grid;gap:4px;padding:10px}.agent-row{position:relative;width:100%;border-radius:4px;color:var(--muted)}.agent-row-select{display:grid;grid-template-columns:16px minmax(0,1fr);gap:8px;width:100%;padding:9px 10px 9px 12px;border-radius:inherit;color:inherit;text-align:left}.agent-row>.agent-row-select{padding-right:34px}.agent-row:hover:not(:disabled){color:var(--ink);background:var(--panel-raised)}.agent-row.active{color:var(--ink);background:var(--panel-raised);box-shadow:inset 0 0 0 1px var(--hairline-strong)}.agent-row:disabled,.agent-row.disabled{opacity:.76}.agent-row:disabled,.agent-row-select:disabled{cursor:not-allowed}.agent-row-icon{display:grid;place-items:center;min-height:19px;color:var(--faint)}.agent-row-copy{min-width:0;display:grid;gap:2px}.agent-row-primary{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:10px}.agent-row-title{min-width:0;display:flex;align-items:center;gap:7px;font-size:var(--text-sm);font-weight:560;line-height:1.35;overflow-wrap:anywhere}.agent-current{flex:none;padding:1px 6px;border:1px solid var(--amber);border-radius:999px;color:var(--amber);font-size:.65rem;font-weight:560;letter-spacing:.07em;line-height:1.45;text-transform:uppercase}.agent-row-count,.agent-row-secondary{color:var(--faint);font-size:var(--text-xs);line-height:1.4}.agent-row-count{flex:none;text-align:right;font-variant-numeric:tabular-nums}.agent-status-missing{color:var(--amber)}.agent-status-unavailable{color:var(--alarm)}.agent-row-secondary{min-width:0;overflow:hidden;color:var(--muted);text-overflow:ellipsis;white-space:nowrap}.agent-row-detail-trigger{position:absolute;right:8px;bottom:8px;display:grid;place-items:center;width:20px;height:20px;border-radius:3px;color:var(--faint)}.agent-row-detail-trigger:hover,.agent-row-detail-trigger[aria-pressed=true]{color:var(--ink);background:var(--panel)}.agent-detail-popover{position:fixed;z-index:30;display:grid;gap:8px;padding:12px;border:1px solid var(--hairline-strong);border-radius:6px;background:#181c22fc;box-shadow:0 8px 24px #0006;color:var(--muted);font-size:var(--text-xs);line-height:1.5;overflow-wrap:anywhere}.agent-detail-popover.preview{overflow:hidden;pointer-events:none}.agent-detail-popover.pinned{overflow-y:auto;pointer-events:auto}.agent-detail-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.agent-detail-head>span{display:flex;align-items:baseline;gap:8px;min-width:0}.agent-detail-head strong,.agent-detail-instruction{color:var(--ink)}.agent-detail-head strong{font-size:var(--text-sm);font-weight:560}.agent-detail-close{flex:none;display:grid;place-items:center;width:22px;height:22px;border-radius:3px;color:var(--faint)}.agent-detail-close:hover{color:var(--ink);background:var(--panel-raised)}.agent-detail-instruction,.agent-detail-meta{min-width:0}.agents-empty,.agents-state{display:flex;align-items:center;gap:7px;padding:9px 10px;color:var(--faint);font-size:var(--text-xs)}.agents-state{margin:0 10px 10px;border-top:1px solid var(--hairline)}.agent-list .agents-state{margin:0}.agents-error{display:grid;gap:9px;margin:0 10px 10px;padding:10px;border:1px solid oklch(.7 .16 32 / .45);border-radius:4px;background:#f1735c14;color:var(--muted);font-size:var(--text-xs);line-height:1.45}.agents-error.row-local{margin:-1px 10px 4px 34px}.agents-error>span,.agents-retry{display:flex;align-items:flex-start;gap:7px}.agents-error>span svg,.agents-retry svg{flex:none;margin-top:1px}.agents-error>span svg{color:var(--alarm)}.agents-retry{width:max-content;align-items:center;padding:4px 8px;border:1px solid var(--hairline-strong);border-radius:4px;color:var(--ink)}.agents-retry:hover{background:var(--panel-raised)}.agents-retry:disabled{cursor:default;opacity:.45}.report-panel .report-meta{margin-top:4px;color:var(--faint);font-size:var(--text-xs)}.report-note{padding:14px 16px;color:var(--muted);font-size:var(--text-sm);line-height:1.55;display:grid;gap:10px}.report-note code{color:var(--ink)}.report-running{color:var(--moon);font-weight:560}.report-error{display:inline-flex;align-items:center;gap:6px;color:var(--alarm);font-weight:560}.report-error-detail{color:var(--faint);font-size:var(--text-xs);overflow-wrap:anywhere}.report-run{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:7px 12px;font-size:var(--text-sm);font-weight:560;color:var(--ink);border:1px solid var(--hairline-strong);border-radius:4px}.report-run:hover{background:var(--panel-raised)}.report-cost{color:var(--faint);font-size:var(--text-xs)}.report-picker{display:flex;flex-wrap:wrap;gap:6px;min-width:0}.report-picker select{max-width:100%;appearance:none;padding:4px 8px;font-size:var(--text-xs);font-family:inherit;color:var(--muted);background:transparent;border:1px solid var(--hairline-strong);border-radius:3px;cursor:pointer}.report-picker select:hover{color:var(--ink);background:var(--panel-raised)}.report-stale-actions{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.report-body{display:grid;gap:2px;padding-bottom:10px}.report-controls{display:flex;flex-direction:column;gap:7px;padding:10px 16px 0}.report-stale-note{color:var(--amber);font-size:var(--text-xs);line-height:1.4}.report-rerun{display:inline-flex;align-items:center;gap:5px;flex-shrink:0;padding:3px 8px;font-size:var(--text-xs);font-weight:560;color:var(--muted);border:1px solid var(--hairline-strong);border-radius:3px}.report-rerun:hover{color:var(--ink);background:var(--panel-raised)}.report-task{padding:12px 16px 2px;color:var(--ink);font-size:var(--text-sm);line-height:1.55}.report-dimension{padding:12px 16px 2px}.report-dimension-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:6px}.report-dimension-name{color:var(--faint);font-size:var(--text-xs);font-weight:560;letter-spacing:.14em;text-transform:uppercase}.verdict{padding:1px 8px;border-radius:999px;border:1px solid var(--hairline-strong);font-size:var(--text-xs);font-weight:560;letter-spacing:.04em}.verdict-good{color:var(--pine)}.verdict-warning{color:var(--amber)}.verdict-problem{color:var(--alarm)}.verdict-insufficient-data{color:var(--faint)}.report-finding{display:grid;grid-template-columns:10px 1fr;align-items:baseline;gap:8px;width:100%;padding:5px 4px;border-radius:3px;text-align:left;color:var(--muted);font-size:var(--text-sm);line-height:1.5}.report-finding:not(:disabled):hover{color:var(--ink);background:var(--panel-raised)}.report-finding:disabled{cursor:default}.report-finding:disabled,.report-moment:disabled{opacity:.45;cursor:not-allowed}.severity-dot{width:7px;height:7px;border-radius:999px;transform:translateY(-1px)}.severity-dot.sev-info{background:var(--faint)}.severity-dot.sev-warning{background:var(--amber)}.severity-dot.sev-problem{background:var(--alarm)}.report-claim{overflow-wrap:anywhere}.report-chapter{margin:0;padding:20px 16px 4px;color:var(--ink);font-size:var(--text-sm);font-weight:620;letter-spacing:.12em;text-transform:uppercase}.report-rubric-note{padding:8px 16px;color:var(--faint);font-size:var(--text-xs);line-height:1.5}.report-rubric-hint{padding:8px 16px 0;color:var(--muted);font-size:var(--text-sm);line-height:1.5}.report-criterion{padding:8px 16px 6px}.report-criterion .report-dimension-head{margin-bottom:4px}.rubric-task-head{display:flex;align-items:center;gap:8px;width:100%;padding:16px 16px 0;text-align:left}.rubric-task-head:not(:disabled):hover .rubric-task-title{text-decoration:underline;text-decoration-color:var(--hairline-strong);text-underline-offset:3px}.rubric-task-head:disabled{cursor:default}.rubric-task-title{color:var(--ink);font-size:var(--text-sm);font-weight:560}.rubric-task-type{margin-left:8px;color:var(--faint);font-size:var(--text-xs);font-weight:400;letter-spacing:.06em}.report-criterion-name{color:var(--muted);font-size:var(--text-sm);font-weight:560;overflow-wrap:anywhere}.report-criterion-badges{display:inline-flex;align-items:center;gap:6px;flex-shrink:0}.coverage-badge{padding:1px 7px;border:1px solid var(--hairline);border-radius:999px;color:var(--faint);font-size:var(--text-xs)}.report-rubric-footnote{padding:14px 16px 2px;color:var(--muted);font-size:var(--text-sm);line-height:1.55}.report-rubric-footnote .eyebrow{margin-bottom:4px}.report-moment{display:grid;grid-template-columns:max-content 1fr;align-items:baseline;gap:9px;width:100%;padding:5px 4px;border-radius:3px;text-align:left;color:var(--muted);font-size:var(--text-sm);line-height:1.5}.report-moment:hover:not(:disabled){color:var(--ink);background:var(--panel-raised)}.report-moment strong{font-variant-numeric:tabular-nums}.report-narrative{padding:0 16px 12px;color:var(--muted);font-size:var(--text-sm);line-height:1.6}.report-section{padding:10px 16px 6px}.rail-eval{display:inline-flex;align-items:center;gap:5px;flex-shrink:0;margin-left:auto;font-size:var(--text-xs);letter-spacing:.04em}.rail-eval:before{content:"";width:6px;height:6px;border-radius:999px}.rail-eval-running{color:var(--moon)}.rail-eval-running:before{background:var(--moon);animation:report-pulse 1.4s ease-in-out infinite}.rail-eval-done:before{background:var(--pine)}.rail-eval-stale:before{background:var(--amber)}.rail-eval-failed:before{background:var(--alarm)}
@@ -0,0 +1,3 @@
1
+ import{r,j as t,a as rs,R as Qe,c as as}from"./react-gcHzaSmV.js";import{C as jt,V as te,Q as ze,S as ct,a as Mt,M as kt,b as me,c as We,L as os,d as is,B as nn,e as rt,D as Pt,f as sn,A as at,g as rn,h as an,P as on,W as cn,O as ln,H as dn,i as un,R as cs,j as _e,G as hn,F as fn,k as wt,l as nt,m as pn,n as bt,I as qe,o as Be,p as st,q as mn,r as ls,E as ds,s as us,t as It,u as hs,v as fs,w as ps}from"./three-DnGjZfD1.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))a(o);new MutationObserver(o=>{for(const l of o)if(l.type==="childList")for(const f of l.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&a(f)}).observe(document,{childList:!0,subtree:!0});function s(o){const l={};return o.integrity&&(l.integrity=o.integrity),o.referrerPolicy&&(l.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?l.credentials="include":o.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function a(o){if(o.ep)return;o.ep=!0;const l=s(o);fetch(o.href,l)}})();const ms=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),gs=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(n,s,a)=>a?a.toUpperCase():s.toLowerCase()),zt=e=>{const n=gs(e);return n.charAt(0).toUpperCase()+n.slice(1)},gn=(...e)=>e.filter((n,s,a)=>!!n&&n.trim()!==""&&a.indexOf(n)===s).join(" ").trim(),xs=e=>{for(const n in e)if(n.startsWith("aria-")||n==="role"||n==="title")return!0};var vs={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const ys=r.forwardRef(({color:e="currentColor",size:n=24,strokeWidth:s=2,absoluteStrokeWidth:a,className:o="",children:l,iconNode:f,...m},v)=>r.createElement("svg",{ref:v,...vs,width:n,height:n,stroke:e,strokeWidth:a?Number(s)*24/Number(n):s,className:gn("lucide",o),...!l&&!xs(m)&&{"aria-hidden":"true"},...m},[...f.map(([d,b])=>r.createElement(d,b)),...Array.isArray(l)?l:[l]]));const oe=(e,n)=>{const s=r.forwardRef(({className:a,...o},l)=>r.createElement(ys,{ref:l,iconNode:n,className:gn(`lucide-${ms(zt(e))}`,`lucide-${e}`,a),...o}));return s.displayName=zt(e),s};const ws=[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]],bs=oe("bot",ws);const js=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],Ms=oe("circle",js);const ks=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"22",x2:"18",y1:"12",y2:"12",key:"l9bcsi"}],["line",{x1:"6",x2:"2",y1:"12",y2:"12",key:"13hhkx"}],["line",{x1:"12",x2:"12",y1:"6",y2:"2",key:"10w3f3"}],["line",{x1:"12",x2:"12",y1:"22",y2:"18",key:"15g9kq"}]],Ns=oe("crosshair",ks);const Cs=[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],Es=oe("ellipsis",Cs);const Rs=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],Ss=oe("eye-off",Rs);const $s=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],As=oe("eye",$s);const Ls=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]],Tt=oe("folder-open",Ls);const Ps=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],Is=oe("info",Ps);const zs=[["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m16.2 7.8 2.9-2.9",key:"r700ao"}],["path",{d:"M18 12h4",key:"wj9ykh"}],["path",{d:"m16.2 16.2 2.9 2.9",key:"1bxg5t"}],["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"m4.9 19.1 2.9-2.9",key:"bwix9q"}],["path",{d:"M2 12h4",key:"j09sii"}],["path",{d:"m4.9 4.9 2.9 2.9",key:"giyufr"}]],Nt=oe("loader",zs);const Ts=[["path",{d:"m8 3 4 8 5-5 5 15H2L8 3z",key:"otkl63"}]],xn=oe("mountain",Ts);const Fs=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m16 15-3-3 3-3",key:"14y99z"}]],Bs=oe("panel-left-close",Fs);const _s=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m14 9 3 3-3 3",key:"8010ee"}]],qs=oe("panel-left-open",_s);const Ds=[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1",key:"kaeet6"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1",key:"1wsw3u"}]],Os=oe("pause",Ds);const Hs=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]],Us=oe("play",Hs);const Vs=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],ot=oe("refresh-cw",Vs);const Gs=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Ks=oe("rotate-ccw",Gs);const Ws=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Ys=oe("search",Ws);const Xs=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],vn=oe("sparkles",Xs);const Js=[["path",{d:"M13.971 4.285A2 2 0 0 1 17 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z",key:"19qhus"}],["path",{d:"M21 20V4",key:"cb8qj8"}]],Zs=oe("step-back",Js);const Qs=[["path",{d:"M10.029 4.285A2 2 0 0 0 7 6v12a2 2 0 0 0 3.029 1.715l9.997-5.998a2 2 0 0 0 .003-3.432z",key:"1ystz2"}],["path",{d:"M3 4v16",key:"1ph11n"}]],er=oe("step-forward",Qs);const tr=[["path",{d:"m17 14 3 3.3a1 1 0 0 1-.7 1.7H4.7a1 1 0 0 1-.7-1.7L7 14h-.3a1 1 0 0 1-.7-1.7L9 9h-.2A1 1 0 0 1 8 7.3L12 3l4 4.3a1 1 0 0 1-.8 1.7H15l3 3.3a1 1 0 0 1-.7 1.7H17Z",key:"cpyugq"}],["path",{d:"M12 22v-3",key:"kmzjlo"}]],yn=oe("tree-pine",tr);const nr=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Ct=oe("triangle-alert",nr);const sr=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],rr=oe("users",sr);const ar=[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]],or=oe("video",ar);const ir=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Ye=oe("x",ir);async function De(e){const n=await fetch(e);if(!n.ok){const s=(await n.text()).trim();throw new Error(s||`${n.status} ${n.statusText}`)}return n.json()}function Ae(e,n){if(e instanceof TypeError)return`Can't reach the mindwalk server while ${n} — is it still running?`;const s=(e instanceof Error?e.message:String(e)).trim();return s?`Couldn't finish ${n}: ${s}`:`Couldn't finish ${n}`}function Ft(e=!1){return De(e?"/api/sessions?fresh=1":"/api/sessions")}function cr(e){return De(`/api/sessions/${encodeURIComponent(e)}/snapshot`)}function lr(e){return De(`/api/sessions/${encodeURIComponent(e)}/agents`)}function dr(e,n){return De(`/api/sessions/${encodeURIComponent(e)}/agents/${encodeURIComponent(n)}/trace`)}function ur(e){return De(`/api/sessions/${encodeURIComponent(e)}/report`)}async function hr(e,n){const s=await fetch(`/api/sessions/${encodeURIComponent(e)}/analyze`,{method:"POST",headers:n?{"Content-Type":"application/json"}:void 0,body:n?JSON.stringify(n):void 0});if(!s.ok){const a=(await s.text()).trim();throw new Error(a||`${s.status} ${s.statusText}`)}return s.json()}function fr(e){const n=e?`/api/repomap?repo=${encodeURIComponent(e)}`:"/api/repomap";return De(n)}function pr({panels:e,openSheet:n,openPop:s,onToggle:a,onClosePop:o}){const l=r.useRef(null),f=r.useRef(null),m=e.find(c=>c.id===n&&c.presentation==="sheet"),v=e.find(c=>c.id===s&&c.presentation==="pop"),b=["scene","session"].map(c=>({section:c,items:e.filter(S=>S.section===c)})).filter(c=>c.items.length>0);return r.useEffect(()=>{if(!v)return;const c=w=>{const I=w.target;l.current?.contains(I)||f.current?.contains(I)||o()},S=w=>{w.key==="Escape"&&o()};return document.addEventListener("pointerdown",c),document.addEventListener("keydown",S),()=>{document.removeEventListener("pointerdown",c),document.removeEventListener("keydown",S)}},[v,o]),t.jsxs("div",{className:"dock",children:[v?t.jsx("div",{className:"dock-pop",ref:l,children:v.render()}):null,m?t.jsx("aside",{className:"dock-panel",children:m.render()}):null,t.jsx("div",{className:"dock-side",ref:f,children:t.jsx("div",{className:"dock-strip",role:"group","aria-label":"Stage panels",children:b.map((c,S)=>t.jsxs("div",{className:"dock-strip-group",children:[S>0?t.jsx("div",{className:"dock-strip-divider","aria-hidden":!0}):null,c.items.map(w=>{const I=w.id===n||w.id===s,O=w.icon;return t.jsxs("button",{"aria-pressed":I,className:I?"active":"",onClick:()=>a(w),"data-hint":w.hint,"aria-label":w.hint,children:[t.jsx(O,{size:15}),w.badge?t.jsx("span",{className:`dock-dot dock-dot-${w.badge}`}):null]},w.id)})]},c.section))})})]})}function mr({graph:e,current:n,loading:s,loadingAgentID:a,locked:o=!1,error:l,retryAgentID:f,onSelect:m,onRetry:v,onClose:d}){const b=e?.agents.filter(p=>p.kind!=="main")??[],c=e?.agents.find(p=>p.kind==="main"),S=l&&f===null?l:void 0,[w,I]=r.useState(null),O=e?.agents.find(p=>p.id===w?.agentID);r.useEffect(()=>{w&&e&&!O&&I(null)},[w,O,e]);const T=()=>{I(null),d()};return t.jsxs("div",{className:"dock-body agents-panel","aria-label":"Agent lenses",children:[t.jsxs("div",{className:"inspector-head",children:[t.jsxs("div",{children:[t.jsx("div",{className:"inspector-path",children:"Agents"}),t.jsx("div",{className:"agents-head-note",children:"Choose one trace at a time"})]}),t.jsx("button",{className:"icon-btn",onClick:T,title:"Close","aria-label":"Close agents",children:t.jsx(Ye,{size:15})})]}),S?t.jsx(Bt,{error:S,locked:o,onRetry:v}):null,t.jsxs("div",{className:"agent-list","aria-busy":s||a!==void 0,children:[t.jsxs("button",{className:n===null?"agent-row agent-row-select active":"agent-row agent-row-select","aria-pressed":n===null,disabled:o,onClick:()=>m(null),children:[t.jsx("span",{className:"agent-row-icon","aria-hidden":!0,children:t.jsx(Ms,{size:12})}),t.jsxs("span",{className:"agent-row-copy",children:[t.jsxs("span",{className:"agent-row-primary",children:[t.jsxs("span",{className:"agent-row-title",children:["Main",n===null?t.jsx("span",{className:"agent-current",children:"current"}):null]}),t.jsx("span",{className:"agent-row-count",children:wn(c?.traceEventCount??0)})]}),t.jsx("span",{className:"agent-row-secondary",children:"Root trace"})]})]}),b.map(p=>{const j=l&&f===p.id?l:void 0;return t.jsxs(r.Fragment,{children:[t.jsx(gr,{agent:p,current:n===p.id,loading:a===p.id,locked:o,onSelect:m,detailMode:w?.agentID===p.id?w.mode:void 0,onPreview:$=>I(C=>C?.mode==="pinned"?C:{agentID:p.id,mode:"preview",anchor:$}),onPreviewEnd:$=>I(C=>C?.agentID===$&&C.mode==="preview"?null:C),onToggleDetails:$=>I(C=>C?.agentID===p.id&&C.mode==="pinned"?null:{agentID:p.id,mode:"pinned",anchor:$})}),j?t.jsx(Bt,{error:j,locked:o,onRetry:v,rowLocal:!0}):null]},p.id)}),e&&b.length===0?t.jsx("p",{className:"agents-empty",children:"No child agents found."}):null,!e&&s?t.jsxs("p",{className:"agents-state","aria-live":"polite",children:[t.jsx(Nt,{size:13,className:"spin","aria-hidden":!0}),"Loading agents…"]}):null]}),w&&O?t.jsx(xr,{agent:O,state:w,onClose:()=>I(null)}):null]})}function Bt({error:e,locked:n,onRetry:s,rowLocal:a=!1}){return t.jsxs("div",{className:a?"agents-error row-local":"agents-error",role:"alert",children:[t.jsxs("span",{children:[t.jsx(Ct,{size:14,"aria-hidden":!0}),e]}),t.jsxs("button",{className:"agents-retry",onClick:s,disabled:n,children:[t.jsx(ot,{size:13,"aria-hidden":!0}),"Retry"]})]})}function gr({agent:e,current:n,loading:s,locked:a,onSelect:o,detailMode:l,onPreview:f,onPreviewEnd:m,onToggleDetails:v}){const d=e.traceAvailability==="available",b=vr(e,s),c=[e.role,e.instructionPreview].filter(Boolean).join(" · "),S=!d||a;return t.jsxs("div",{className:["agent-row",n?"active":"",S?"disabled":""].filter(Boolean).join(" "),onMouseEnter:w=>f(w.currentTarget),onMouseLeave:()=>m(e.id),onFocus:w=>f(w.currentTarget),onBlur:w=>{w.currentTarget.contains(w.relatedTarget)||m(e.id)},children:[t.jsxs("button",{className:"agent-row-select",style:{paddingLeft:`${12+Math.min(e.depth,4)*14}px`},"aria-pressed":n,disabled:S,onClick:()=>o(e.id),"aria-label":`${e.label}, ${b}`,children:[t.jsx("span",{className:"agent-row-icon","aria-hidden":!0,children:s?t.jsx(Nt,{size:13,className:"spin"}):t.jsx(bs,{size:13})}),t.jsxs("span",{className:"agent-row-copy",children:[t.jsxs("span",{className:"agent-row-primary",children:[t.jsxs("span",{className:"agent-row-title",children:[e.label,n?t.jsx("span",{className:"agent-current",children:"current"}):null]}),t.jsx("span",{className:`agent-row-count agent-status-${e.traceAvailability}`,children:b})]}),t.jsx("span",{className:"agent-row-secondary",children:c||"No launch details"})]})]}),t.jsx("button",{className:"agent-row-detail-trigger","aria-label":`${l==="pinned"?"Unpin":"Pin"} details for ${e.label}`,"aria-pressed":l==="pinned",onClick:w=>{w.stopPropagation(),v(w.currentTarget.closest(".agent-row"))},children:t.jsx(Is,{size:12,"aria-hidden":!0})})]})}function xr({agent:e,state:n,onClose:s}){const o=r.useRef(null),[l,f]=r.useState({left:12,top:12,width:Math.min(520,window.innerWidth-24),maxHeight:window.innerHeight-24});return r.useLayoutEffect(()=>{const m=()=>{const b=Math.min(520,window.innerWidth-24),c=n.anchor.getBoundingClientRect(),S=c.left-b-12,w=c.right+12,I=S>=12?S:w+b<=window.innerWidth-12?w:Math.min(Math.max(c.left,12),window.innerWidth-b-12),O=window.innerHeight-24,T=Math.min(o.current?.offsetHeight??O,O),p=Math.min(Math.max(c.top,12),window.innerHeight-T-12);f({left:I,top:p,width:b,maxHeight:O})},v=n.anchor.closest(".dock-panel");return m(),window.addEventListener("resize",m),window.addEventListener("scroll",m,!0),v?.addEventListener("animationend",m),()=>{window.removeEventListener("resize",m),window.removeEventListener("scroll",m,!0),v?.removeEventListener("animationend",m)}},[n.anchor]),r.useEffect(()=>{if(n.mode!=="pinned")return;const m=d=>{d.key==="Escape"&&s()},v=d=>{const b=d.target;o.current?.contains(b)||n.anchor.contains(b)||s()};return document.addEventListener("keydown",m),document.addEventListener("pointerdown",v),()=>{document.removeEventListener("keydown",m),document.removeEventListener("pointerdown",v)}},[s,n.anchor,n.mode]),rs.createPortal(t.jsxs("div",{ref:o,className:`agent-detail-popover ${n.mode}`,role:n.mode==="preview"?"tooltip":"dialog","aria-label":`${e.label} details`,style:l,children:[t.jsxs("div",{className:"agent-detail-head",children:[t.jsxs("span",{children:[t.jsx("strong",{children:e.label}),e.role?t.jsx("span",{children:e.role}):null]}),n.mode==="pinned"?t.jsx("button",{className:"agent-detail-close",onClick:s,"aria-label":"Close details",children:t.jsx(Ye,{size:14,"aria-hidden":!0})}):null]}),e.instructionPreview?t.jsx("div",{className:"agent-detail-instruction",children:e.instructionPreview}):null,t.jsx("div",{className:"agent-detail-meta",children:yr(e)})]}),document.body)}function vr(e,n){return n?"Loading trace…":e.traceAvailability==="missing"?"Trace missing":e.status==="failed"?"Launch failed · no trace":e.traceAvailability==="unavailable"?"Trace unavailable":wn(e.traceEventCount)}function wn(e){return`${e} event${e===1?"":"s"}`}function yr(e){return`Launch: ${e.status} · Trace: ${e.traceAvailability} · Correlation: ${e.linkQuality} via ${e.linkMethod}`}const wr={exploration:{title:"Exploration",hint:"Did the agent build enough understanding before editing?"},scope:{title:"Scope",hint:"Does the footprint match what the task needed?"},wandering:{title:"Wandering",hint:"Purposeful path, or circles and dead ends?"},verification:{title:"Verification",hint:"Were edits verified, and errors followed up?"}},bn={claude:[{value:"",label:"default model"},{value:"sonnet",label:"sonnet"},{value:"opus",label:"opus"},{value:"fable",label:"fable"}],codex:[{value:"",label:"default model"},{value:"gpt-5.6-sol",label:"gpt-5.6 sol"},{value:"gpt-5.6-terra",label:"gpt-5.6 terra"}]},jn="mindwalk:judge-choice";function br(){try{const e=localStorage.getItem(jn);if(e){const n=JSON.parse(e);return{cli:typeof n.cli=="string"?n.cli:"",model:typeof n.model=="string"?n.model:""}}}catch{}return{cli:"",model:""}}function jr(e,n){const s=n.includes(e.cli)?e.cli:n[0]??"",o=(bn[s]??[]).some(l=>l.value===e.model)?e.model:"";return{cli:s,model:o}}function Mr({status:e,analyzing:n,locked:s,onAnalyze:a,onClose:o,onJumpTo:l}){const[f,m]=r.useState(br),v=e?.judgeClis??(e?.judgeCli?[e.judgeCli]:[]),d=jr(f,v),b=r.useCallback(S=>{m(S);try{localStorage.setItem(jn,JSON.stringify(S))}catch{}},[]),c=r.useCallback(()=>a(d),[a,d]);return t.jsxs("div",{className:"dock-body","aria-label":"Session evaluation",children:[t.jsxs("div",{className:"inspector-head",children:[t.jsxs("div",{children:[t.jsx("div",{className:"inspector-path",children:"Evaluation"}),e?.report?t.jsxs("div",{className:"report-meta",children:["judged by ",e.report.judge.cli,e.report.judge.model?` · ${e.report.judge.model}`:""," ·"," ",Ar(e.report.judge.generatedAt)]}):null]}),t.jsx("button",{className:"icon-btn",onClick:o,title:"Close","aria-label":"Close evaluation",children:t.jsx(Ye,{size:15})})]}),t.jsx(Nr,{status:e,analyzing:n,locked:s,analyze:c,onJumpTo:l,picker:v.length>0?t.jsx(kr,{clis:v,choice:d,onChange:b}):null})]})}function kr({clis:e,choice:n,onChange:s}){const a=bn[n.cli]??[{value:"",label:"default model"}];return t.jsxs("div",{className:"report-picker",children:[t.jsx("select",{value:n.cli,onChange:o=>s({cli:o.target.value,model:""}),"aria-label":"Judge agent",title:"Which agent CLI judges this session",children:e.map(o=>t.jsx("option",{value:o,children:o},o))}),t.jsx("select",{value:n.model,onChange:o=>s({...n,model:o.target.value}),"aria-label":"Judge model",title:"Which model the judge runs on",children:a.map(o=>t.jsx("option",{value:o.value,children:o.label},o.value))})]})}function Nr({status:e,analyzing:n,locked:s,analyze:a,onJumpTo:o,picker:l}){if(!e)return t.jsx("p",{className:"report-note",children:"Checking for an existing report…"});if(e.state==="running"||n)return t.jsxs("div",{className:"report-note",children:[t.jsx("p",{className:"report-running",children:"Judging the trajectory…"}),t.jsx("p",{children:"The judge first drafts task-specific criteria from your request, then scores the session against them plus four process dimensions. Usually a minute or two; you can keep exploring meanwhile."})]});if(e.state==="failed")return t.jsxs("div",{className:"report-note",children:[t.jsxs("p",{className:"report-error",children:[t.jsx(Ct,{size:13})," Evaluation failed"]}),t.jsx("p",{className:"report-error-detail",children:e.error}),l,t.jsxs("button",{className:"report-run",onClick:a,children:[t.jsx(ot,{size:13}),"Retry"]})]});if(e.state==="none"||!e.report)return e.judgeAvailable?t.jsxs("div",{className:"report-note",children:[t.jsx("p",{children:"Ask an agent to evaluate this session: how it explored, whether the footprint matched the task, where it wandered, and how it verified its work. Every finding links back to the timeline."}),l,t.jsxs("button",{className:"report-run",onClick:a,children:[t.jsx(vn,{size:13}),"Evaluate session"]}),t.jsx("p",{className:"report-cost",children:"Runs the selected CLI under your own account and sends it a summary of this session — task wording, file paths, event digests — for the model to read. About a minute."})]}):t.jsxs("p",{className:"report-note",children:["Evaluation needs a local agent CLI as judge. Install ",t.jsx("code",{children:"claude"})," or ",t.jsx("code",{children:"codex"})," and make it available on PATH."]});const f=e.report;return t.jsxs("div",{className:"report-body",children:[t.jsxs("div",{className:"report-controls",children:[e.stale?t.jsxs("p",{className:"report-stale-note",children:["Based on ",f.session.eventCount," events — the session has grown since."]}):null,t.jsxs("div",{className:"report-stale-actions",children:[l,t.jsxs("button",{className:"report-rerun",onClick:a,title:e.stale?"Re-evaluate with the current trace":"Run a fresh evaluation of this session",children:[t.jsx(ot,{size:12}),"Re-evaluate"]})]})]}),t.jsx("p",{className:"report-task",children:f.taskSummary}),t.jsx("p",{className:"report-narrative",children:f.narrative}),t.jsx(Cr,{rubric:f.rubric,locked:s,onJumpTo:o}),t.jsx("p",{className:"report-chapter",children:"Process"}),f.dimensions.map(m=>t.jsx(Sr,{dimension:m,locked:s,onJumpTo:o},m.name)),f.notableMoments?.length?t.jsxs("section",{className:"report-section",children:[t.jsx("p",{className:"eyebrow",children:"Moments"}),f.notableMoments.map(m=>t.jsxs("button",{className:"report-moment",onClick:()=>o(m.seq),disabled:s,title:`Jump to step ${m.seq+1}`,children:[t.jsxs("strong",{children:["#",m.seq+1]}),t.jsx("span",{children:m.note})]},m.seq))]}):null]})}function Cr({rubric:e,locked:n,onJumpTo:s}){if(!e)return t.jsx("p",{className:"report-rubric-note",children:"This report has no task rubric — re-evaluate to add one."});if(e.status!=="scored"||!e.tasks?.length){const v=e.reason==="generation-failed"?"Task rubric unavailable this run — showing process dimensions only.":e.reason==="no-events"?"No tool events to evidence a rubric.":"Not enough task text to build a rubric from.";return t.jsx("p",{className:"report-rubric-note",children:v})}const a=e.tasks,o=a.flatMap(v=>v.criteria),l=o.filter(v=>v.coverage&&v.coverage!=="sufficient"),f=o.length>0&&l.length/o.length>.4,m=a.length>1;return t.jsxs("div",{className:"report-rubric",children:[t.jsx("p",{className:"report-chapter",children:"Tasks"}),f?t.jsxs("p",{className:"report-rubric-hint",children:[l.length," of ",o.length," criteria had thin evidence — the log may not show enough to judge them."]}):null,a.map((v,d)=>t.jsx(Er,{task:v,multi:m,locked:n,onJumpTo:s},v.anchorSeqs?.[0]??`task-${d}`)),e.note?t.jsxs("div",{className:"report-rubric-footnote",children:[t.jsx("p",{className:"eyebrow",children:"Rubric note"}),t.jsx("p",{children:e.note})]}):null]})}function Er({task:e,multi:n,locked:s,onJumpTo:a}){const o=e.anchorSeqs?.[0];return t.jsxs("section",{className:"report-rubric-task",children:[n?t.jsx("button",{className:"rubric-task-head",onClick:()=>{o!==void 0&&a(o)},disabled:s||o===void 0,title:o!==void 0?`Jump to this task's start (step ${o+1})`:void 0,children:t.jsxs("span",{className:"rubric-task-title",children:[e.title,e.type?t.jsx("span",{className:"rubric-task-type",children:e.type}):null]})}):null,e.criteria.map(l=>t.jsx(Rr,{criterion:l,locked:s,onJumpTo:a},l.id))]})}function Rr({criterion:e,locked:n,onJumpTo:s}){const a=[e.why,e.good?`good: ${e.good}`:"",e.bad?`bad: ${e.bad}`:""].filter(Boolean).join(`
2
+ `);return t.jsxs("section",{className:"report-dimension report-criterion",children:[t.jsxs("div",{className:"report-dimension-head",children:[t.jsx("span",{className:"report-criterion-name",title:a||void 0,children:e.title}),t.jsxs("span",{className:"report-criterion-badges",children:[e.coverage==="partial"?t.jsx("span",{className:"coverage-badge",children:"partial evidence"}):null,t.jsx("span",{className:`verdict verdict-${e.verdict}`,title:e.coverage==="none"?"The log cannot evidence this criterion either way":void 0,children:kn(e.verdict)})]})]}),e.findings.map(o=>t.jsx(Mn,{finding:o,locked:n,onJumpTo:s},`${o.severity}|${o.evidenceSeqs?.join(",")}|${o.claim}`))]})}function Mn({finding:e,locked:n,onJumpTo:s}){return t.jsxs("button",{className:"report-finding",onClick:()=>{const a=e.evidenceSeqs?.[0];a!==void 0&&s(a)},disabled:n||!e.evidenceSeqs?.length,title:e.evidenceSeqs?.length?`Jump to step ${e.evidenceSeqs[0]+1} — evidence: ${e.evidenceSeqs.map(a=>`#${a+1}`).join(" ")}`:void 0,children:[t.jsx("span",{className:`severity-dot ${$r(e.severity)}`}),t.jsx("span",{className:"report-claim",children:e.claim})]})}function Sr({dimension:e,locked:n,onJumpTo:s}){const a=wr[e.name]??{title:e.name,hint:""};return t.jsxs("section",{className:"report-dimension",children:[t.jsxs("div",{className:"report-dimension-head","data-hint":a.hint,children:[t.jsx("span",{className:"report-dimension-name",children:a.title}),t.jsx("span",{className:`verdict verdict-${e.verdict}`,children:kn(e.verdict)})]}),e.findings.map(o=>t.jsx(Mn,{finding:o,locked:n,onJumpTo:s},`${o.severity}|${o.evidenceSeqs?.join(",")}|${o.claim}`))]})}function kn(e){return e==="insufficient-data"?"no signal":e}function $r(e){return`sev-${e}`}function Ar(e){const n=new Date(e);return Number.isNaN(n.getTime())?"":n.toISOString().slice(0,10)}function Lr({view:e,onViewChange:n,note:s,locked:a=!1}){return t.jsxs("div",{className:"view-pop",role:"group","aria-label":"Scene view",children:[t.jsxs("button",{"aria-pressed":e==="tree",className:e==="tree"?"view-row active":"view-row",onClick:()=>n("tree"),disabled:a,children:[t.jsx(yn,{size:14}),t.jsx("span",{children:"Tree"})]}),t.jsxs("button",{"aria-pressed":e==="terrain",className:e==="terrain"?"view-row active":"view-row",onClick:()=>n("terrain"),disabled:a,children:[t.jsx(xn,{size:14}),t.jsx("span",{children:"Terrain"})]}),t.jsxs("p",{className:"view-note",children:[s,t.jsx("span",{className:"view-key",children:"V"})]})]})}const et={hit:1,read:2,edit:3},Pr=12;class Ir{events;idByPath=new Map;cursor=-1;touchByFile=new Map;touchByPath=new Map;visitsByFile=new Map;historyByPath=new Map;recentTargets=[];constructor(n,s){this.events=n?.events??[];for(const a of s?.files??[])this.idByPath.set(a.path,a.id)}snapshotAt(n){const s=Math.min(n,this.events.length-1);s<this.cursor&&this.reset();for(let a=this.cursor+1;a<=s;a++)this.apply(this.events[a]);return this.cursor=Math.max(this.cursor,s),{touchByFile:this.touchByFile,touchByPath:this.touchByPath,visitsByFile:this.visitsByFile,historyByPath:this.historyByPath,recentTargets:this.recentTargets}}reset(){this.cursor=-1,this.touchByFile.clear(),this.touchByPath.clear(),this.visitsByFile.clear(),this.historyByPath.clear(),this.recentTargets.length=0}apply(n){for(const s of n.targets){const a=this.touchByPath.get(s.path);(!a||et[s.touch]>et[a])&&this.touchByPath.set(s.path,s.touch);const o=s.fileId??this.idByPath.get(s.path);if(o!==void 0){const f=this.touchByFile.get(o);(!f||et[s.touch]>et[f])&&this.touchByFile.set(o,s.touch),this.visitsByFile.set(o,(this.visitsByFile.get(o)??0)+1)}const l=this.historyByPath.get(s.path);l?l.push(n):this.historyByPath.set(s.path,[n])}if(n.targets.length>0){const s=n.targets.find(a=>!a.weak)??n.targets[0];this.recentTargets.push({...s,fileId:s.fileId??this.idByPath.get(s.path)}),this.recentTargets.length>Pr&&this.recentTargets.shift()}}}function zr(e){const s=e.split(";")[0].trim().toLowerCase().split("/")[1]??"";return s.includes("webm")?"webm":s.includes("mp4")?"mp4":s.includes("x-matroska")||s.includes("matroska")?"mkv":s.includes("ogg")?"ogv":s||"webm"}const Tr=30,Fr=3e4,Br=120;function _r(){const e=["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"];for(const n of e)if(typeof MediaRecorder<"u"&&MediaRecorder.isTypeSupported(n))return n}function Nn(){return typeof MediaRecorder<"u"&&typeof HTMLCanvasElement<"u"&&typeof HTMLCanvasElement.prototype.captureStream=="function"}function qr(e){const{canvas:n,total:s,setSeq:a,onProgress:o,signal:l}=e,f=e.fps??Tr;if(!Nn())return Promise.reject(new Error("This browser can't record the canvas (MediaRecorder unavailable)."));if(s<=0)return Promise.reject(new Error("Nothing to record — load a session first."));const m=e.durationMs??Math.min(Fr,Math.max(1e3,s*Br)),v=_r(),d=n.captureStream(f),b=v?new MediaRecorder(d,{mimeType:v}):new MediaRecorder(d),c=[];return new Promise((S,w)=>{let I=0,O=0,T=!1;const p=()=>{I&&cancelAnimationFrame(I),d.getTracks().forEach(P=>P.stop()),l?.removeEventListener("abort",C)},j=()=>{if(T)return;T=!0,p();const P=b.mimeType||v||"video/webm";S({blob:new Blob(c,{type:P}),extension:zr(P)})},$=P=>{if(!T){T=!0,p();try{b.state!=="inactive"&&b.stop()}catch{}w(P)}},C=()=>$(new Error("Recording cancelled."));if(b.ondataavailable=P=>{P.data&&P.data.size>0&&c.push(P.data)},b.onerror=()=>$(new Error("Recording failed.")),b.onstop=j,l){if(l.aborted){$(new Error("Recording cancelled."));return}l.addEventListener("abort",C)}const L=P=>{if(T)return;O||(O=P);const ne=Math.min(1,(P-O)/m),K=Math.min(s-1,Math.floor(ne*(s-1)));if(a(K),o?.(ne),ne>=1){I=requestAnimationFrame(()=>{b.state!=="inactive"&&b.stop()});return}I=requestAnimationFrame(L)};a(0),b.start(),I=requestAnimationFrame(L)})}function Dr(e,n){const s=URL.createObjectURL(e),a=document.createElement("a");a.href=s,a.download=n,document.body.appendChild(a),a.click(),a.remove(),setTimeout(()=>URL.revokeObjectURL(s),1e3)}function Xe(e){switch(e){case"hit":return"seen";case"read":return"read";case"edit":return"edited";default:return"unvisited"}}let He=null;function Cn(){if(He)return He;const e=64,n=document.createElement("canvas");n.width=e,n.height=e;const s=n.getContext("2d"),a=s.createRadialGradient(e/2,e/2,0,e/2,e/2,e/2);return a.addColorStop(0,"rgba(255,255,255,1)"),a.addColorStop(.25,"rgba(255,210,160,0.55)"),a.addColorStop(1,"rgba(255,158,94,0)"),s.fillStyle=a,s.fillRect(0,0,e,e),He=new jt(n),He.userData.shared=!0,He}let Ue=null;function Or(){if(Ue)return Ue;const e=128,n=document.createElement("canvas");n.width=e,n.height=e;const s=n.getContext("2d"),a=s.createRadialGradient(e/2,e/2,0,e/2,e/2,e/2);return a.addColorStop(0,"rgba(255,255,255,0.9)"),a.addColorStop(.4,"rgba(255,255,255,0.28)"),a.addColorStop(1,"rgba(255,255,255,0)"),s.fillStyle=a,s.fillRect(0,0,e,e),Ue=new jt(n),Ue.userData.shared=!0,Ue}function Hr(e){const n='500 30px "Schibsted Grotesk Variable", "PingFang SC", sans-serif',s=document.createElement("canvas").getContext("2d");s.font=n;const a=Math.ceil(s.measureText(e).width)+24,o=44,l=document.createElement("canvas");l.width=a*2,l.height=o*2;const f=l.getContext("2d");f.scale(2,2),f.font=n,f.textBaseline="middle",f.textAlign="center",f.fillStyle="rgba(197, 205, 222, 0.95)",f.fillText(e,a/2,o/2+1);const m=new jt(l);return m.anisotropy=4,{texture:m,aspect:a/o}}const Ur=60,Vr=120;class En{labels=[];y;dirty=!0;lastCamPos=new te(1/0,1/0,1/0);lastCamQuat=new ze(0,0,0,0);lastViewW=0;lastViewH=0;point=new te;constructor(n,s,a,o=!1){this.y=a;const l=[...n].sort((f,m)=>m.fileCount-f.fileCount).slice(0,Vr);for(const f of l){const{texture:m,aspect:v}=Hr(f.name),d=new ct(new Mt({map:m,transparent:!0,opacity:0,depthWrite:!1,depthTest:!o,toneMapped:!1,fog:!1}));o&&(d.renderOrder=20),d.visible=!1,d.position.set(f.x,a,f.z),d.raycast=()=>{},s.add(d),this.labels.push({sprite:d,entry:f,aspect:v,target:0})}}markDirty(){this.dirty=!0}updateTargets(n,s,a){if(this.labels.length===0||s===0||a===0||!(this.dirty||!n.position.equals(this.lastCamPos)||!n.quaternion.equals(this.lastCamQuat)||s!==this.lastViewW||a!==this.lastViewH))return;this.dirty=!1,this.lastCamPos.copy(n.position),this.lastCamQuat.copy(n.quaternion),this.lastViewW=s,this.lastViewH=a;const l=Math.tan(kt.degToRad(n.fov)/2),f=Math.max(s,a),m=[];for(const d of this.labels){this.point.set(d.entry.x,this.y,d.entry.z);const b=this.point.distanceTo(n.position),c=a/(2*b*l),S=d.entry.radius*c;this.point.project(n);const w=(this.point.x+1)/2*s,I=(1-this.point.y)/2*a;if(!(this.point.z<1&&w>-60&&w<s+60&&I>-40&&I<a+40)||S<Ur||S>f*1.6){d.target=0;continue}const T=d.entry.depth<=1?15:13,p=T/c;d.sprite.scale.set(p*d.aspect,p,1),m.push({label:d,sx:w,sy:I,pw:T*d.aspect,ph:T})}m.sort((d,b)=>b.label.entry.fileCount-d.label.entry.fileCount);const v=[];for(const d of m){const b=v.some(c=>Math.abs(c.sx-d.sx)<(c.pw+d.pw)/2+14&&Math.abs(c.sy-d.sy)<(c.ph+d.ph)/2+10);d.label.target=b?0:1,b||v.push(d)}}ease(n){for(const s of this.labels){const a=s.sprite.material,o=s.target-a.opacity;Math.abs(o)>.02?a.opacity=n?s.target:a.opacity+o*.16:a.opacity!==s.target&&(a.opacity=s.target),s.sprite.visible=a.opacity>.02}}}const it=new me("#12151c"),Rn=new me("#ff9e5e"),Sn={hit:new me("#8fb45f"),read:new me("#a5c8f1"),edit:new me("#f0ad5a"),selected:new me("#f6ead2")};function $n(e,n,s){if(!Number.isFinite(e.aspect)||e.aspect<=0)return null;const a=n.clone().negate(),o=new te().crossVectors(a,new te(0,1,0)).normalize(),l=new te().crossVectors(o,a),f=Math.tan(kt.degToRad(e.fov)/2),m=f*e.aspect;let v=0;for(const d of s){const b=d.dot(a);v=Math.max(v,Math.abs(d.dot(o))/m-b,Math.abs(d.dot(l))/f-b)}return v}function An(e,n,s,a,o,l){if(a===0||o===0)return;const f=e.getWorldDirection(new te),m=s.clone().sub(e.position).dot(f);if(m<=0)return;const v=s.clone().project(e),d=(v.x+1)/2*a,b=(1-v.y)/2*o,c=48,S=Math.max(c+60,a-l-48),w=120,I=o-100,O=Math.min(Math.max(d,c),S),T=Math.min(Math.max(b,w),I);if(O===d&&T===b)return;const p=Math.tan(kt.degToRad(e.fov)/2),j=p*e.aspect,$=new te().crossVectors(f,new te(0,1,0)).normalize(),C=new te().crossVectors($,f),L=$.multiplyScalar((d-O)*2*m*j/a).addScaledVector(C,(T-b)*2*m*p/o);e.position.add(L),n.target.add(L),n.update()}class Ln{constructor(n){this.host=n,this.el=document.createElement("div"),this.el.className="scene-tip",this.pathEl=document.createElement("span"),this.metaEl=document.createElement("span"),this.metaEl.className="dim",this.el.append(this.pathEl,this.metaEl),n.appendChild(this.el)}host;el;pathEl;metaEl;show(n,s,a,o){this.pathEl.textContent=n,this.metaEl.textContent=` · ${s}`,this.el.style.display="block";const l=this.host.getBoundingClientRect(),f=a-l.left,m=o-l.top,v=Math.min(f+14,Math.max(0,l.width-this.el.offsetWidth-8)),d=Math.min(m+16,Math.max(0,l.height-this.el.offsetHeight-8));this.el.style.left=`${v}px`,this.el.style.top=`${d}px`}hide(){this.el.style.display="none"}dispose(){this.el.remove()}}const Pn=()=>typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;function In(e){e.traverse(n=>{if(n instanceof We||n instanceof os||n instanceof ct){n.geometry?.dispose();const s=n.material;Array.isArray(s)?s.forEach(_t):s&&_t(s)}})}function _t(e){const n=e.map;n&&!n.userData.shared&&n.dispose(),e.dispose()}const Ve=14,qt=11;class zn{object;positions;colors;lift;arcPoints=Array.from({length:Ve+1},()=>new te);mid=new te;curve=new is;color=new me;constructor(n){this.lift=n;const s=qt*Ve*2,a=new nn;this.positions=new rt(new Float32Array(s*3),3),this.positions.setUsage(Pt),this.colors=new rt(new Float32Array(s*3),3),this.colors.setUsage(Pt),a.setAttribute("position",this.positions),a.setAttribute("color",this.colors),a.setDrawRange(0,0);const o=new sn({vertexColors:!0,transparent:!0,blending:at,depthWrite:!1,fog:!1});this.object=new rn(a,o),this.object.frustumCulled=!1}update(n){const s=Math.min(Math.max(n.length-1,0),qt);if(s===0){this.object.geometry.setDrawRange(0,0);return}const a=n.length-1-s;let o=0;for(let l=1;l<=s;l++){const f=n[a+l-1],m=n[a+l];this.mid.copy(f).lerp(m,.5),this.mid.y=Math.max(f.y,m.y)+f.distanceTo(m)*.22+this.lift,this.curve.v0.copy(f),this.curve.v1.copy(this.mid),this.curve.v2.copy(m);for(let d=0;d<=Ve;d++)this.curve.getPoint(d/Ve,this.arcPoints[d]);const v=l/s;this.color.copy(Rn).multiplyScalar(.05+.95*v*v);for(let d=0;d<Ve;d++){const b=this.arcPoints[d],c=this.arcPoints[d+1];this.positions.setXYZ(o,b.x,b.y,b.z),this.colors.setXYZ(o,this.color.r,this.color.g,this.color.b),o++,this.positions.setXYZ(o,c.x,c.y,c.z),this.colors.setXYZ(o,this.color.r,this.color.g,this.color.b),o++}}this.object.geometry.setDrawRange(0,o),this.positions.needsUpdate=!0,this.colors.needsUpdate=!0}}const Ce={unvisited:new me("#5b6372"),ghost:new me("#404551"),...Sn},Ge=.14,Gr=2.4,Kr=348;function Dt(e,n){return(e==="edit"?7.2:e==="read"?4.2:1.6)*(1+.35*Math.log2(Math.max(n,1)))}const Ot=.3,Wr=16,Yr=2.2;function Xr(e,n){return n<=0?0:Math.min(1,Math.log2(Math.max(e,1))/n)}function Jr(e){return Ot+Math.pow(e,Yr)*(Wr-Ot)}const Fe=[{at:0,color:new me("#5b6372")},{at:.35,color:new me("#e0894f")},{at:.7,color:new me("#9a6bd8")},{at:1,color:new me("#e0524f")}];function Zr(e){for(let n=1;n<Fe.length;n++)if(e<=Fe[n].at){const s=Fe[n-1],a=Fe[n],o=a.at-s.at,l=o>0?(e-s.at)/o:0;return s.color.clone().lerp(a.color,l)}return Fe[Fe.length-1].color.clone()}function Qr({city:e,playback:n,selectedPath:s,onSelect:a,onCanvasReady:o,locHeights:l}){const f=r.useRef(null),m=r.useRef(null),v=r.useRef(null),d=r.useRef([]),b=r.useRef([]),c=r.useRef(new Map),S=r.useRef(null),w=r.useRef(null),I=r.useRef(null),O=r.useRef(null),T=r.useRef(null),p=r.useRef(null),j=r.useRef(null),$=r.useRef(null),C=r.useRef(null),L=r.useRef(!1),P=r.useRef({cx:0,cz:0,size:120}),ne=r.useRef(n);ne.current=n;const K=r.useRef(null),G=r.useMemo(()=>{if(!e||e.files.length===0)return{cx:0,cz:0,size:120,halfW:60,halfD:60};let A=1/0,x=-1/0,k=1/0,E=-1/0;for(const i of e.files)A=Math.min(A,i.rect.x),x=Math.max(x,i.rect.x+i.rect.w),k=Math.min(k,i.rect.z),E=Math.max(E,i.rect.z+i.rect.d);return{cx:(A+x)/2,cz:(k+E)/2,size:Math.max(x-A,E-k,60),halfW:(x-A)/2,halfD:(E-k)/2}},[e]);return r.useEffect(()=>{const A=f.current;if(!A)return;const x=Pn();L.current=x;const k=new an;k.background=it,O.current=k;const E=new on(38,A.clientWidth/A.clientHeight||1,.1,2400);E.position.set(70,130,100),w.current=E;const i=new cn({antialias:!0});i.setPixelRatio(Math.min(window.devicePixelRatio,2)),i.setSize(A.clientWidth,A.clientHeight),S.current=i,A.appendChild(i.domElement),o?.(i.domElement);const h=new ln(E,i.domElement);h.enableDamping=!x,h.dampingFactor=.08,h.maxPolarAngle=Math.PI*.44,h.autoRotate=!x,h.autoRotateSpeed=-.5;const g=new Ln(A);h.addEventListener("start",()=>{h.autoRotate=!1,g.hide()}),I.current=h;const y=new dn("#66779b","#161922",1.7);k.add(y);const R=new un("#b6c5de",1.1);R.position.set(-60,120,-40),k.add(R);const q=new cs,U=new ls,de=X=>{if(!w.current||!S.current)return;const J=S.current.domElement.getBoundingClientRect();U.x=(X.clientX-J.left)/J.width*2-1,U.y=-((X.clientY-J.top)/J.height)*2+1,q.setFromCamera(U,w.current);const he=[v.current,m.current].filter(Boolean),ie=q.intersectObjects(he,!1)[0];if(!(!ie||ie.instanceId===void 0)){if(ie.object===v.current){const H=b.current[ie.instanceId];return H?d.current[H.fileId]:void 0}return d.current[ie.instanceId]}};let ae=null;const le=X=>{ae={x:X.clientX,y:X.clientY}},F=X=>{if(!ae)return;const J=Math.hypot(X.clientX-ae.x,X.clientY-ae.y);ae=null,!(J>5)&&a(de(X)?.path)};let z=0;const D=X=>{if(ae){g.hide();return}z||(z=requestAnimationFrame(()=>{z=0;const J=de(X);if(i.domElement.style.cursor=J?"pointer":"",!J){g.hide();return}const he=ne.current,ie=he.touchByPath.get(J.path),H=he.visitsByFile.get(J.id)??0,N=ie?`${Xe(ie)} · ${H} visit${H===1?"":"s"}`:Xe(void 0);g.show(J.path,J.ghost?`${N} · ghost`:N,X.clientX,X.clientY)}))},Y=()=>{g.hide(),i.domElement.style.cursor=""};i.domElement.addEventListener("pointerdown",le),i.domElement.addEventListener("pointerup",F),i.domElement.addEventListener("pointermove",D),i.domElement.addEventListener("pointerleave",Y);const re=()=>{if(!f.current)return;const X=f.current.clientWidth,J=f.current.clientHeight;X===0||J===0||(i.setSize(X,J),E.aspect=X/J,E.updateProjectionMatrix(),K.current?.()&&(K.current=null))},W=new ResizeObserver(re);W.observe(A);const ue=new mn,se=new _e,xe=new ze,je=()=>{h.update(),$.current?.updateTargets(E,i.domElement.clientWidth,i.domElement.clientHeight),$.current?.ease(L.current);const X=v.current,J=b.current,he=c.current;if(X&&J.length>0){let H=!1;for(let N=0;N<J.length;N++){const _=J[N],V=d.current[_.fileId];if(!V)continue;let ee=he.get(_.fileId)??0;const ce=_.target-ee;Math.abs(ce)>.015?(ee=L.current?_.target:ee+ce*.13,he.set(_.fileId,ee),H=!0):ee!==_.target&&(he.set(_.fileId,_.target),ee=_.target,H=!0);const fe=Math.max(V.rect.w,.45)+.04,Z=Math.max(V.rect.d,.45)+.04;se.compose(new te(V.rect.x+V.rect.w/2-P.current.cx,Math.max(ee,.02)/2+Ge,V.rect.z+V.rect.d/2-P.current.cz),xe,new te(fe,Math.max(ee,.02),Z)),X.setMatrixAt(N,se)}H&&(X.instanceMatrix.needsUpdate=!0)}const ie=j.current;if(ie?.visible){const H=ue.getElapsedTime(),N=ie.userData.baseScale,_=L.current?1:1+.1*Math.sin(H*2.4);ie.scale.setScalar(N*_)}i.render(k,E),C.current=requestAnimationFrame(je)};return je(),()=>{C.current&&cancelAnimationFrame(C.current),z&&cancelAnimationFrame(z),i.domElement.removeEventListener("pointerdown",le),i.domElement.removeEventListener("pointerup",F),i.domElement.removeEventListener("pointermove",D),i.domElement.removeEventListener("pointerleave",Y),g.dispose(),W.disconnect(),h.dispose(),i.dispose(),A.removeChild(i.domElement),k.clear(),o?.(null)}},[a,o]),r.useEffect(()=>{const A=O.current;if(!A||(d.current=e?.files??[],b.current=[],c.current=new Map,P.current=G,!e||e.files.length===0))return;const x=new hn,k=G.size;A.fog=new fn(it,k*2.1,k*4.2);const E=new We(new wt(k*6,k*6),new nt({color:"#14171e",roughness:1}));E.rotation.x=-Math.PI/2,E.position.y=-.32,x.add(E);const i=new pn(k*2.8,46,"#20242e","#1a1e27");i.material.transparent=!0,i.material.opacity=.5,i.position.y=-.3,x.add(i);const h=e.dirs.filter(F=>F.depth<=3&&F.rect.w>0&&F.rect.d>0);if(h.length>0){const F=new bt(1,1,1),z=new nt({roughness:.95,metalness:0}),D=new qe(F,z,h.length),Y=new _e,re=new me;h.forEach((W,ue)=>{const se=-.2+Math.min(W.depth,3)*.06,xe=se+.3;Y.compose(new te(W.rect.x+W.rect.w/2-G.cx,se-xe/2,W.rect.z+W.rect.d/2-G.cz),new ze,new te(W.rect.w,xe,W.rect.d)),D.setMatrixAt(ue,Y),re.set("#1a1f29").lerp(new me("#252b37"),Math.min(W.depth,3)/3),D.setColorAt(ue,re)}),D.instanceMatrix.needsUpdate=!0,D.instanceColor&&(D.instanceColor.needsUpdate=!0),x.add(D)}const g=new bt(1,1,1),y=new nt({roughness:.85,metalness:0}),R=new qe(g,y,e.files.length),q=new _e;for(const F of e.files){const z=Math.max(F.rect.w,.45),D=Math.max(F.rect.d,.45),Y=F.rect.x+F.rect.w/2-G.cx,re=F.rect.z+F.rect.d/2-G.cz;q.compose(new te(Y,Ge/2,re),new ze,new te(z,Ge,D)),R.setMatrixAt(F.id,q),R.setColorAt(F.id,Ht(F))}R.instanceMatrix.needsUpdate=!0,R.instanceColor&&(R.instanceColor.needsUpdate=!0),m.current=R,x.add(R);const U=new qe(ea(),new Be({toneMapped:!1,vertexColors:!0}),e.files.length);U.instanceColor=new st(new Float32Array(e.files.length*3),3),U.count=0,U.frustumCulled=!1,v.current=U,x.add(U),$.current=new En(e.dirs.filter(F=>F.depth>=1&&F.fileCount>0&&F.rect.w>0&&F.rect.d>0).map(F=>({name:ta(F.path),x:F.rect.x+F.rect.w/2-G.cx,z:F.rect.z+F.rect.d/2-G.cz,radius:Math.hypot(F.rect.w,F.rect.d)/2,fileCount:F.fileCount,depth:F.depth})),x,Gr,!0);const de=new ct(new Mt({map:Cn(),color:Rn,blending:at,depthWrite:!1,transparent:!0}));de.userData.baseScale=Math.max(k*.028,2.2),de.visible=!1,j.current=de,x.add(de);const ae=new zn(1.4);p.current=ae,x.add(ae.object),T.current=x,A.add(x);const le=()=>{const F=w.current,z=I.current;if(!F||!z)return!0;const D=new te(.46,1.08,.72).normalize(),Y=[];for(const ue of[-1,1])for(const se of[-1,1])Y.push(new te(ue*G.halfW,0,se*G.halfD));const re=$n(F,D,Y);if(re===null)return!1;const W=Math.max(re*1.12,k*.6);return F.position.copy(D).multiplyScalar(W),z.target.set(0,0,0),z.minDistance=k*.18,z.maxDistance=Math.max(k*2.6,W*1.2),z.update(),!0};return K.current=le()?null:le,()=>{K.current=null,In(x),A.remove(x),T.current=null,m.current=null,v.current=null,p.current=null,j.current=null,$.current=null}},[e,G]),r.useEffect(()=>{const A=v.current,x=m.current;if(!A||!x||!e)return;const k=c.current,E=[],i=new Set,h=l?Math.log2(Math.max(1,e.files.reduce((g,y)=>Math.max(g,y.lines),1))):0;for(const g of e.files){const y=n.touchByFile.get(g.id),R=g.path===s;if(x.setColorAt(g.id,R?Ce.selected:Ht(g)),y){const q=n.visitsByFile.get(g.id)??1;let U=Ce[y];g.ghost&&(U=U.clone().lerp(Ce.ghost,.45)),R&&(U=Ce.selected),E.push({fileId:g.id,target:Dt(y,q),color:U}),i.add(g.id)}else if(l){const q=Xr(g.lines,h);let U=Zr(q);g.ghost&&(U=U.lerp(Ce.ghost,.45)),R&&(U=Ce.selected),E.push({fileId:g.id,target:Jr(q),color:U}),i.add(g.id)}}for(const[g,y]of k)y>.04&&!i.has(g)?E.push({fileId:g,target:0,color:Ce.unvisited}):y<=.04&&!i.has(g)&&k.delete(g);E.forEach((g,y)=>A.setColorAt(y,g.color)),A.count=E.length,A.instanceColor&&(A.instanceColor.needsUpdate=!0),x.instanceColor&&(x.instanceColor.needsUpdate=!0),b.current=E},[e,n,s,l]),r.useEffect(()=>{if(!e||!s)return;const A=e.files.find(g=>g.path===s),x=w.current,k=I.current,E=S.current?.domElement;if(!A||!x||!k||!E)return;k.autoRotate=!1;const i=c.current.get(A.id)??Ge,h=vt(A,G);h.y=i,An(x,k,h,E.clientWidth,E.clientHeight,Kr)},[e,G,s]),r.useEffect(()=>{const A=p.current;if(!A||!e)return;const x=n.recentTargets.map(i=>i.fileId!==void 0?e.files[i.fileId]:void 0).filter(i=>!!i),k=i=>{const h=n.touchByFile.get(i.id),g=n.visitsByFile.get(i.id)??1;return h?Dt(h,g):Ge},E=j.current;if(E){const i=x[x.length-1];if(i){const h=vt(i,G);E.position.set(h.x,k(i)+1.6,h.z),E.visible=!0}else E.visible=!1}A.update(x.map(i=>{const h=vt(i,G);return h.y=k(i)+.4,h}))},[e,n,G]),t.jsx("div",{className:"city-scene",ref:f,"aria-label":"Attention terrain"})}function ea(){const e=new bt(1,1,1),n=e.getAttribute("position"),s=e.getAttribute("normal"),a=new Float32Array(n.count*3);for(let o=0;o<n.count;o++){const l=n.getY(o)+.5,f=s.getY(o)===1?.82:.34+.66*l*l;a.fill(f,o*3,o*3+3)}return e.setAttribute("color",new rt(a,3)),e}function Ht(e){if(e.ghost)return Ce.ghost;let n=2166136261;for(let a=0;a<e.path.length;a++)n=Math.imul(n^e.path.charCodeAt(a),16777619);const s=(n>>>0)%1e3/1e3-.5;return Ce.unvisited.clone().offsetHSL(0,0,s*.05)}function vt(e,n){return new te(e.rect.x+e.rect.w/2-n.cx,0,e.rect.z+e.rect.d/2-n.cz)}function ta(e){return e.slice(e.lastIndexOf("/")+1)||e}function na(e){const n={name:"",path:"",depth:0,children:new Map,files:[],leafCount:0,angle:0},s=[...e].sort((p,j)=>p.path<j.path?-1:1);for(const p of s){const j=p.path.split("/").filter(Boolean);let $=n;for(const C of j.slice(0,-1)){let L=$.children.get(C);L||(L={name:C,path:$.path?`${$.path}/${C}`:C,depth:$.depth+1,children:new Map,files:[],leafCount:0,angle:0},$.children.set(C,L)),$=L}$.files.push(p)}let a=1;const o=p=>{p.leafCount=p.files.length,p.files.length>0&&(a=Math.max(a,p.depth+1));for(const j of p.children.values())p.leafCount+=o(j);return p.leafCount};o(n);const l=Math.max(n.leafCount,1),f=Math.max(55,Math.sqrt(l)*4),m=f/Math.max(a,1),v=Math.PI*2/l,d={radius:f,leaf:new Map,dirs:[],edges:[]},b=(p,j)=>({x:p*Math.cos(j),z:p*Math.sin(j)}),c=(p,j,$,C)=>{const L=p<1e-6?C:j;let P=C-L;for(;P>Math.PI;)P-=Math.PI*2;for(;P<-Math.PI;)P+=Math.PI*2;const ne=[],K=8;for(let G=0;G<=K;G++){const A=G/K,x=A*A*(3-2*A);ne.push(b(p+($-p)*A,L+P*x))}return ne};let S=0;const w=p=>{p.angle=(S+p.leafCount/2)*v;const j=[...p.children.values()].sort((C,L)=>C.name<L.name?-1:1),$=[...p.files].sort((C,L)=>C.path<L.path?-1:1);for(const C of j)w(C);for(const C of $){const L=(S+.5)*v;S+=1;const P=b((p.depth+1)*m,L);d.leaf.set(C.id,P),d.edges.push({childFileId:C.id,points:c(p.depth*m,p.angle,(p.depth+1)*m,L)})}if(p.path!==""){const C=b(p.depth*m,p.angle);d.dirs.push({path:p.path,name:p.name,x:C.x,z:C.z,depth:p.depth,fileCount:p.leafCount,radius:0})}};w(n);const I=new Map,O=p=>{I.set(p.path,p);for(const j of p.children.values())O(j)};O(n);for(const p of d.dirs){const j=I.get(p.path),$=p.path.includes("/")?p.path.slice(0,p.path.lastIndexOf("/")):"",C=I.get($);d.edges.push({childPath:p.path,points:c(C.depth*m,C.angle,j.depth*m,j.angle)})}const T=new Map(d.dirs.map(p=>[p.path,p]));for(const p of e){const j=d.leaf.get(p.id);if(!j)continue;const $=p.path.split("/").filter(Boolean);let C="";for(let L=0;L<$.length-1;L++){C=C?`${C}/${$[L]}`:$[L];const P=T.get(C);P&&(P.radius=Math.max(P.radius,Math.hypot(j.x-P.x,j.z-P.z)))}}return d}const Ne={unvisited:new me("#5a6375"),ghost:new me("#4d5464"),...Sn},sa=new me("#3c424f"),ra=new me("#7d8496"),aa=new me("#ffeeda"),Le=.7;function oa(e){return Math.min(1.8*(1+.45*Math.log2(Math.max(e,1))),4.8)}const ia=1.8,ca=348;function la({city:e,playback:n,selectedPath:s,onSelect:a,onCanvasReady:o}){const l=r.useRef(null),f=r.useRef(null),m=r.useRef(null),v=r.useRef(new Map),d=r.useRef(null),b=r.useRef(null),c=r.useRef(null),S=r.useRef([]),w=r.useRef([]),I=r.useRef(null),O=r.useRef([]),T=r.useRef(new Map),p=r.useRef(null),j=r.useRef(null),$=r.useRef(null),C=r.useRef(null),L=r.useRef(null),P=r.useRef(null),ne=r.useRef(null),K=r.useRef(null),G=r.useRef(null),A=r.useRef(!1),x=r.useRef(n);x.current=n;const k=r.useRef(null),E=r.useMemo(()=>e&&e.files.length>0?na(e.files):null,[e]);return r.useEffect(()=>{const i=l.current;if(!i)return;const h=Pn();A.current=h;const g=new an;g.background=it,C.current=g;const y=new on(38,i.clientWidth/i.clientHeight||1,.1,2400);y.position.set(60,110,90),j.current=y;const R=new cn({antialias:!0});R.setPixelRatio(Math.min(window.devicePixelRatio,2)),R.setSize(i.clientWidth,i.clientHeight),p.current=R,i.appendChild(R.domElement),o?.(R.domElement);const q=new ln(y,R.domElement);q.enableDamping=!h,q.dampingFactor=.08,q.maxPolarAngle=Math.PI*.44,q.autoRotate=!h,q.autoRotateSpeed=-.5;const U=new Ln(i);q.addEventListener("start",()=>{q.autoRotate=!1,U.hide()}),$.current=q;const de=new dn("#66779b","#161922",1.7);g.add(de);const ae=new un("#b6c5de",1.1);ae.position.set(-60,120,-40),g.add(ae);const le=18,F=new te,z=H=>{const N=I.current;if(!N||!j.current||!p.current)return;const _=p.current.domElement.getBoundingClientRect(),V=H.clientX-_.left,ee=H.clientY-_.top;let ce,fe=le*le;for(const Z of w.current){const ke=N.leaf.get(Z.id);if(!ke||(F.set(ke.x,Le,ke.z).project(j.current),F.z>1))continue;const ge=(F.x+1)/2*_.width,Me=(1-F.y)/2*_.height,Re=(ge-V)*(ge-V)+(Me-ee)*(Me-ee);Re<fe&&(fe=Re,ce=Z)}return ce};let D=null;const Y=H=>{D={x:H.clientX,y:H.clientY}},re=H=>{if(!D)return;const N=Math.hypot(H.clientX-D.x,H.clientY-D.y);D=null,!(N>5)&&a(z(H)?.path)};let W=0;const ue=H=>{if(D){U.hide();return}W||(W=requestAnimationFrame(()=>{W=0;const N=z(H);if(R.domElement.style.cursor=N?"pointer":"",!N){U.hide();return}const _=x.current,V=_.touchByPath.get(N.path),ee=_.visitsByFile.get(N.id)??0,ce=V?`${Xe(V)} · ${ee} visit${ee===1?"":"s"}`:Xe(void 0);U.show(N.path,N.ghost?`${ce} · ghost`:ce,H.clientX,H.clientY)}))},se=()=>{U.hide(),R.domElement.style.cursor=""};R.domElement.addEventListener("pointerdown",Y),R.domElement.addEventListener("pointerup",re),R.domElement.addEventListener("pointermove",ue),R.domElement.addEventListener("pointerleave",se);const xe=()=>{if(!l.current)return;const H=l.current.clientWidth,N=l.current.clientHeight;H===0||N===0||(R.setSize(H,N),y.aspect=H/N,y.updateProjectionMatrix(),k.current?.()&&(k.current=null))},je=new ResizeObserver(xe);je.observe(i);const X=new mn,J=new _e,he=new ze().setFromEuler(new ds(-Math.PI/2,0,0)),ie=()=>{q.update(),K.current?.updateTargets(y,R.domElement.clientWidth,R.domElement.clientHeight),K.current?.ease(A.current);const H=b.current,N=O.current,_=T.current,V=I.current;if(H&&V&&N.length>0){let ce=!1;for(let fe=0;fe<N.length;fe++){const Z=N[fe],ke=V.leaf.get(Z.fileId);if(!ke)continue;let ge=_.get(Z.fileId)??0;const Me=Z.target-ge;Math.abs(Me)>.015?(ge=A.current?Z.target:ge+Me*.12,_.set(Z.fileId,ge),ce=!0):ge!==Z.target&&(_.set(Z.fileId,Z.target),ge=Z.target,ce=!0),J.compose(new te(ke.x,.06,ke.z),he,new te(Math.max(ge,.01)*2,Math.max(ge,.01)*2,1)),H.setMatrixAt(fe,J)}ce&&(H.instanceMatrix.needsUpdate=!0)}const ee=ne.current;if(ee?.visible){const ce=X.getElapsedTime(),fe=ee.userData.baseScale,Z=A.current?1:1+.1*Math.sin(ce*2.4);ee.scale.setScalar(fe*Z)}R.render(g,y),G.current=requestAnimationFrame(ie)};return ie(),()=>{G.current&&cancelAnimationFrame(G.current),W&&cancelAnimationFrame(W),R.domElement.removeEventListener("pointerdown",Y),R.domElement.removeEventListener("pointerup",re),R.domElement.removeEventListener("pointermove",ue),R.domElement.removeEventListener("pointerleave",se),U.dispose(),je.disconnect(),q.dispose(),R.dispose(),i.removeChild(R.domElement),g.clear(),o?.(null)}},[a,o]),r.useEffect(()=>{const i=C.current;if(!i||(w.current=e?.files??[],I.current=E,O.current=[],T.current=new Map,!e||!E))return;const h=new hn,g=E.radius*2.3;i.fog=new fn(it,g*2.1,g*4.2);const y=new We(new wt(g*6,g*6),new nt({color:"#14171e",roughness:1}));y.rotation.x=-Math.PI/2,y.position.y=-.25,h.add(y);const R=new pn(g*2.4,40,"#1d222c","#181c25");R.material.transparent=!0,R.material.opacity=.4,R.position.y=-.24,h.add(R);const q=[],U=[];for(const N of E.edges){let _=0;for(let V=0;V<N.points.length-1;V++)q.push(N.points[V].x,.12,N.points[V].z),q.push(N.points[V+1].x,.12,N.points[V+1].z),_+=2;U.push({childPath:N.childPath,childFileId:N.childFileId,vertexCount:_})}const de=new nn;de.setAttribute("position",new us(q,3));const ae=new Float32Array(q.length);de.setAttribute("color",new rt(ae,3));const le=new rn(de,new sn({vertexColors:!0,transparent:!0,opacity:.9}));c.current=le,S.current=U,h.add(le);const F=new It(.5,10,8),z=new Be({toneMapped:!1,fog:!1}),D=new qe(F,z,e.files.length);D.instanceColor=new st(new Float32Array(e.files.length*3),3);const Y=e.files.filter(N=>N.ghost),re=new Map;Y.forEach((N,_)=>re.set(N.id,_)),v.current=re;const W=new _e,ue=new _e().makeScale(0,0,0);for(const N of e.files){const _=E.leaf.get(N.id);if(!_)continue;if(N.ghost){D.setMatrixAt(N.id,ue);continue}const V=Math.min(.24+Math.sqrt(Math.max(N.lines,1))*.045,1.05);W.compose(new te(_.x,Le,_.z),new ze,new te(V,V,V)),D.setMatrixAt(N.id,W),D.setColorAt(N.id,Ne.unvisited)}D.instanceMatrix.needsUpdate=!0,D.instanceColor&&(D.instanceColor.needsUpdate=!0),f.current=D,h.add(D);let se=null;if(Y.length>0){se=new qe(new It(.55,8,5),new Be({wireframe:!0,transparent:!0,opacity:.85,toneMapped:!1,fog:!1}),Y.length),se.instanceColor=new st(new Float32Array(Y.length*3),3);for(const N of Y){const _=E.leaf.get(N.id),V=re.get(N.id);if(!_){se.setMatrixAt(V,ue);continue}const ee=Math.min(.24+Math.sqrt(Math.max(N.lines,1))*.045,1.05)*.8;W.compose(new te(_.x,Le,_.z),new ze,new te(ee,ee,ee)),se.setMatrixAt(V,W),se.setColorAt(V,Ne.ghost)}se.instanceMatrix.needsUpdate=!0,se.instanceColor&&(se.instanceColor.needsUpdate=!0),se.raycast=()=>{},h.add(se)}m.current=se;const xe=new qe(new wt(1,1),new Be({map:Or(),transparent:!0,opacity:.55,depthWrite:!1,toneMapped:!1,fog:!1}),e.files.length);xe.instanceColor=new st(new Float32Array(e.files.length*3),3),xe.count=0,xe.frustumCulled=!1,xe.raycast=()=>{},b.current=xe,h.add(xe),K.current=new En(E.dirs,h,ia);const je=new ct(new Mt({map:Cn(),color:aa,blending:at,depthWrite:!1,transparent:!0,fog:!1}));je.userData.baseScale=Math.max(g*.026,2.2),je.visible=!1,ne.current=je,h.add(je);const X=new Be({color:Ne.selected,transparent:!0,opacity:.9,side:hs,depthWrite:!1,toneMapped:!1,fog:!1}),J=new We(new fs(1.2,1.5,48),X);J.rotation.x=-Math.PI/2,J.visible=!1,J.raycast=()=>{},h.add(J);const he=new We(new ps(.05,.05,6,6,1,!0),new Be({color:Ne.selected,transparent:!0,opacity:.32,blending:at,depthWrite:!1,toneMapped:!1,fog:!1}));he.visible=!1,he.raycast=()=>{},h.add(he),d.current={ring:J,beam:he};const ie=new zn(1.6);P.current=ie,h.add(ie.object),L.current=h,i.add(h);const H=()=>{const N=j.current,_=$.current;if(!N||!_)return!0;const V=new te(.3,.66,.47).normalize(),ee=[...E.leaf.values()].map(Z=>new te(Z.x,Le,Z.z)),ce=$n(N,V,ee);if(ce===null)return!1;const fe=ce*1.12;return N.position.copy(V).multiplyScalar(fe),_.target.set(0,0,0),_.minDistance=g*.15,_.maxDistance=Math.max(g*2.4,fe*1.2),_.update(),!0};return k.current=H()?null:H,()=>{k.current=null,In(h),i.remove(h),L.current=null,f.current=null,m.current=null,v.current=new Map,d.current=null,b.current=null,c.current=null,P.current=null,ne.current=null,K.current=null}},[e,E]),r.useEffect(()=>{const i=f.current,h=m.current,g=v.current,y=b.current,R=c.current;if(!i||!y||!R||!e||!E)return;const q=T.current,U=[],de=new Set,ae=new Set;for(const z of e.files){const D=n.touchByFile.get(z.id);let Y=z.ghost?Ne.ghost:Ne.unvisited;if(D){Y=Ne[D];const re=n.visitsByFile.get(z.id)??1;U.push({fileId:z.id,target:oa(re),color:Ne[D]}),de.add(z.id);const W=z.path.split("/");let ue="";for(let se=0;se<W.length-1;se++)ue=ue?`${ue}/${W[se]}`:W[se],ae.add(ue)}if(z.ghost){const re=g.get(z.id);h&&re!==void 0&&h.setColorAt(re,Y)}else i.setColorAt(z.id,Y)}for(const[z,D]of q)D>.04&&!de.has(z)?U.push({fileId:z,target:0,color:Ne.unvisited}):D<=.04&&!de.has(z)&&q.delete(z);U.forEach((z,D)=>y.setColorAt(D,z.color)),y.count=U.length,y.instanceColor&&(y.instanceColor.needsUpdate=!0),i.instanceColor&&(i.instanceColor.needsUpdate=!0),h?.instanceColor&&(h.instanceColor.needsUpdate=!0),O.current=U;const le=R.geometry.getAttribute("color");let F=0;for(const z of S.current){let D=!1;z.childFileId!==void 0?D=n.touchByFile.has(z.childFileId):z.childPath&&(D=ae.has(z.childPath));const Y=D?ra:sa;for(let re=0;re<z.vertexCount;re++)le.setXYZ(F++,Y.r,Y.g,Y.b)}le.needsUpdate=!0},[e,E,n]),r.useEffect(()=>{const i=d.current;if(!i||!e||!E)return;const h=s?e.files.find(y=>y.path===s):void 0,g=h?E.leaf.get(h.id):void 0;if(g){i.ring.position.set(g.x,.1,g.z),i.beam.position.set(g.x,3,g.z),i.ring.visible=!0,i.beam.visible=!0;const y=j.current,R=$.current,q=p.current?.domElement;y&&R&&q&&(R.autoRotate=!1,An(y,R,new te(g.x,Le,g.z),q.clientWidth,q.clientHeight,ca))}else i.ring.visible=!1,i.beam.visible=!1},[e,E,s]),r.useEffect(()=>{const i=P.current;if(!i||!e||!E)return;const h=n.recentTargets.map(y=>y.fileId!==void 0?e.files[y.fileId]:void 0).filter(y=>!!(y&&E.leaf.get(y.id))),g=ne.current;if(g){const y=h[h.length-1];if(y){const R=E.leaf.get(y.id);g.position.set(R.x,Le+1.7,R.z),g.visible=!0}else g.visible=!1}i.update(h.map(y=>{const R=E.leaf.get(y.id);return new te(R.x,Le+.3,R.z)}))},[e,E,n]),t.jsx("div",{className:"city-scene",ref:l,"aria-label":"Firefly tree"})}const Tn="mindwalk.sessionFilters";function Fn(e,n,s){return!(n.harness&&e.harness!==n.harness||n.hideEmpty&&e.eventCount===0&&e.key!==s)}function da(){try{const e=localStorage.getItem(Tn);if(e){const n=JSON.parse(e);return{hideEmpty:n.hideEmpty!==!1,harness:typeof n.harness=="string"?n.harness:void 0}}}catch{}return{hideEmpty:!0}}function Ut(e){try{localStorage.setItem(Tn,JSON.stringify(e))}catch{}}const Vt=e=>{let n;const s=new Set,a=(d,b)=>{const c=typeof d=="function"?d(n):d;if(!Object.is(c,n)){const S=n;n=b??(typeof c!="object"||c===null)?c:Object.assign({},n,c),s.forEach(w=>w(n,S))}},o=()=>n,m={setState:a,getState:o,getInitialState:()=>v,subscribe:d=>(s.add(d),()=>s.delete(d))},v=n=e(a,o,m);return m},ua=(e=>e?Vt(e):Vt),ha=e=>e;function fa(e,n=ha){const s=Qe.useSyncExternalStore(e.subscribe,Qe.useCallback(()=>n(e.getState()),[e,n]),Qe.useCallback(()=>n(e.getInitialState()),[e,n]));return Qe.useDebugValue(s),s}const Gt=e=>{const n=ua(e),s=a=>fa(n,a);return Object.assign(s,n),s},pa=(e=>e?Gt(e):Gt),Kt=da(),Bn="mindwalk.railCollapsed";function ma(){try{return localStorage.getItem(Bn)==="1"}catch{return!1}}const Pe=pa((e,n)=>({sessions:[],currentSeq:0,view:"tree",loading:!1,hideEmpty:Kt.hideEmpty,harnessFilter:Kt.harness,railCollapsed:ma(),mapOnly:!1,setView:s=>e({view:s}),setSessions:s=>e({sessions:s}),setActiveSession:s=>e({activeSessionKey:s,trace:void 0,city:void 0,currentSeq:0,selectedPath:void 0}),setData:(s,a)=>e({trace:s,city:a,currentSeq:Math.max(0,s.events.length-1)}),setCityOnly:s=>e({city:s,trace:void 0,currentSeq:0,selectedPath:void 0,mapOnly:!0}),setCurrentSeq:s=>e({currentSeq:s}),setSelectedPath:s=>e({selectedPath:s}),setLoading:s=>e({loading:s}),setError:s=>e({error:s}),setHideEmpty:s=>{e({hideEmpty:s}),Ut({hideEmpty:s,harness:n().harnessFilter})},setHarnessFilter:s=>{e({harnessFilter:s}),Ut({hideEmpty:n().hideEmpty,harness:s})},setRailCollapsed:s=>{e({railCollapsed:s});try{localStorage.setItem(Bn,s?"1":"0")}catch{}}})),yt=8,ga=r.memo(function({trace:n,city:s,agentLabel:a,editedNow:o,readNow:l,seenNow:f,churn:m,onSelectFile:v,onOpenAgents:d,locked:b=!1}){const c=n?.stats,S=c?c.fovea-c.edited:0,w=c?Math.max(0,c.filesInRepo-o-l-f):0,I=c?Math.max(0,c.filesInRepo-c.fovea-c.parafovea):0,O=s?s.files.reduce((P,ne)=>P+(ne.ghost?1:0),0):0,T=c?Xt(c.errors):0,p=c?T>0||c.churnFiles>0||c.actions.edit>0:!1,[j,$]=r.useState(!1),C=r.useRef(null),L=r.useRef(null);return r.useEffect(()=>$(!1),[n]),r.useEffect(()=>{if(!j)return;const P=K=>{const G=K.target;C.current?.contains(G)||L.current?.contains(G)||$(!1)},ne=K=>{K.key==="Escape"&&$(!1)};return document.addEventListener("pointerdown",P),document.addEventListener("keydown",ne),()=>{document.removeEventListener("pointerdown",P),document.removeEventListener("keydown",ne)}},[j]),t.jsx("div",{className:"hud","aria-hidden":!s,children:t.jsxs("div",{className:"hud-left",children:[t.jsxs("div",{className:"hud-title-line",children:[t.jsx("div",{className:"hud-repo",children:s?ba(s.repo.root):""}),n&&a?t.jsxs("button",{className:"hud-lens",onClick:d,disabled:!d||b,"aria-label":`Open Agent lenses, current ${a}`,children:[t.jsx("span",{children:"Lens"}),a]}):null]}),s?t.jsxs("div",{className:"hud-commit",children:[t.jsx("span",{children:s.repo.commit||"worktree"}),s.repo.dirty?t.jsx("span",{className:"dirty",children:"● dirty"}):null,n?.session.model?t.jsx("span",{children:n.session.model}):null,c?t.jsxs("span",{"data-hint":"Files in the repository map — the denominator of the coverage spectrum below",children:[c.filesInRepo," files"]}):null,s.repo.truncated?t.jsx("span",{"data-hint":"The tree holds more files than the map shows — scanning stopped at the budget",children:"partial map"}):null]}):null,c?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"spectrum",children:[t.jsx(Ke,{kind:"edit",label:"edited",now:o,final:c.edited,hint:"Files the agent changed"}),t.jsx(Ke,{kind:"read",label:"read",now:l,final:S,hint:"Files the agent opened and read, but never changed"}),t.jsx(Ke,{kind:"hit",label:"seen",now:f,final:c.parafovea,hint:"Files that only appeared in search results, never opened"}),t.jsx(Ke,{kind:"unvisited",label:"unvisited",now:w,final:I,hint:"Files in the map the agent never touched"}),O>0?t.jsx(Ke,{kind:"ghost",label:"ghost",now:O,final:O,hint:"Files the session touched that are gone from the repository — drawn hollow in the scene"}):null]}),t.jsxs("div",{className:"hud-quiet",children:[t.jsxs("span",{"data-hint":`Tool calls — ${Jt(c.actions)}`,children:[Xt(c.actions)," calls"]}),t.jsxs("span",{"data-hint":"User messages — each one starts a turn of agent work",children:[c.userTurns," turns"]}),c.subagents>0?t.jsxs("button",{className:"hud-agent-link","data-hint":"Subagent launches (Task/Agent) — open Agent lenses",onClick:d,disabled:!d||b,"aria-label":`Open ${c.subagents} subagent${c.subagents===1?"":"s"} in Agent lenses`,children:[c.subagents," subagent",c.subagents===1?"":"s"]}):null,c.compactions>0?t.jsxs("span",{"data-hint":"Context compactions — the conversation was summarized to free memory",children:[c.compactions," compaction",c.compactions===1?"":"s"]}):null,t.jsxs("span",{"data-hint":"Tool output the agent consumed over the session",children:[wa(c.resultBytes)," output"]}),t.jsx("span",{"data-hint":va(c.observability.reads),children:c.observability.reads==="unavailable"?"re-reads n/a":`re-reads ${Wt(c.observability.reads)}${xa(c.regressionRate)}`})]}),p?t.jsxs("div",{className:"hud-review",children:[t.jsx("span",{className:"review-label",children:"review"}),T>0?t.jsxs("span",{className:"warn","data-hint":`${Jt(c.errors)} — press X to jump to the next one${ya(c.observability.errors)}`,children:[Wt(c.observability.errors),T," error",T===1?"":"s"]}):null,c.churnFiles>0?t.jsxs("button",{ref:L,className:j?"warn churn-toggle open":"warn churn-toggle","aria-expanded":j,onClick:()=>$(P=>!P),"data-hint":`Files edited in three or more separate events — the most-edited file changed ${c.maxEditsPerFile} times. Click to list them.`,children:[c.churnFiles," file",c.churnFiles===1?"":"s"," edited 3+ times"]}):null,c.actions.edit>0?c.actions.verify===0?t.jsx("span",{className:"warn","data-hint":"The session edited files but no build or test commands were recognized (go test, make test, npm run build, …)",children:"never verified"}):c.editsAfterLastVerify>0?t.jsxs("span",{className:"warn","data-hint":`Edit events after the session's last build or test run — ${Yt(c.actions.verify)} total; pass/fail is not tracked`,children:[c.editsAfterLastVerify," edit",c.editsAfterLastVerify===1?"":"s"," after last verify"]}):t.jsx("span",{className:"ok","data-hint":`The last edit was followed by a build or test run — ${Yt(c.actions.verify)} total; pass/fail is not tracked`,children:"verified after final edit"}):null]}):null,j?t.jsxs("div",{className:"churn-panel",ref:C,children:[m.slice(0,yt).map(P=>t.jsxs("button",{className:"churn-row",onClick:()=>{v(P.path),$(!1)},children:[t.jsx("span",{className:"churn-path",children:P.path}),t.jsxs("span",{className:"churn-count",children:[P.edits," edit",P.edits===1?"":"s"]})]},P.path)),m.length>yt?t.jsxs("p",{className:"churn-more",children:["…and ",m.length-yt," more"]}):null]}):null]}):null]})})});function Ke({kind:e,label:n,now:s,final:a,hint:o}){return t.jsxs("div",{className:"spectrum-stat","data-hint":o,children:[t.jsx("span",{className:`legend-dot ${e}`}),t.jsx("span",{className:"spectrum-label",children:n}),t.jsx("strong",{children:s===a?a:`${s} → ${a}`})]})}function xa(e){return`${Math.round(e*100)}%`}function Wt(e){return e==="estimated"?"~":""}function Yt(e){return`${e} verify run${e===1?"":"s"}`}function va(e){switch(e){case"unavailable":return"No file reads observed — this session reads files through commands mindwalk could not recognize";case"estimated":return"Reads that re-read a file unchanged since its last read — inferred from shell commands, so the rate is approximate";default:return"Reads that re-read a file unchanged since its last read"}}function ya(e){return e==="estimated"?" — inferred from command output; failures inside scripted calls may be missed":""}const _n=["search","read","edit","exec","verify","other"];function Xt(e){return _n.reduce((n,s)=>n+e[s],0)}function Jt(e){const n=_n.filter(s=>e[s]>0).map(s=>`${e[s]} ${s}`);return n.length?n.join(" · "):"none"}function wa(e){const n=e/1024;return n<1?`${e} B`:n<1e3?`${Math.round(n)} KB`:`${(n/1024).toFixed(1)} MB`}function ba(e){const n=e.replace(/\/+$/,"");return n.slice(n.lastIndexOf("/")+1)}function ja({file:e,touch:n,history:s,onClose:a,onJumpTo:o,locked:l=!1}){if(!e)return t.jsxs("div",{className:"dock-body","aria-label":"File inspector",children:[t.jsxs("div",{className:"inspector-head",children:[t.jsx("div",{className:"inspector-path",children:"Inspect"}),t.jsx("button",{className:"icon-btn",onClick:a,title:"Close","aria-label":"Close inspector",children:t.jsx(Ye,{size:15})})]}),t.jsx("p",{className:"dock-note",children:"Click a building in the scene to inspect a file — its touch state, size, and every visit the agent paid it."})]});const f=e.path.lastIndexOf("/"),m=f>=0?e.path.slice(0,f+1):"",v=f>=0?e.path.slice(f+1):e.path;return t.jsxs("div",{className:"dock-body","aria-label":`File ${e.path}`,children:[t.jsxs("div",{className:"inspector-head",children:[t.jsxs("div",{children:[t.jsxs("div",{className:"inspector-path",children:[t.jsx("span",{className:"dir",children:m}),v]}),e.ghost?t.jsx("span",{className:"ghost-badge",children:"ghost — not in this tree"}):null]}),t.jsx("button",{className:"icon-btn",onClick:a,title:"Close","aria-label":"Close inspector",children:t.jsx(Ye,{size:15})})]}),t.jsxs("dl",{className:"inspector-facts",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Touch"}),t.jsx("dd",{className:n?`touch-${n}`:void 0,children:Xe(n)})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Lang"}),t.jsx("dd",{children:e.lang||"text"})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Lines"}),t.jsx("dd",{children:e.lines.toLocaleString()})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Bytes"}),t.jsx("dd",{children:e.bytes.toLocaleString()})]})]}),t.jsxs("section",{className:"inspector-history",children:[t.jsxs("p",{className:"eyebrow",children:["Visits · ",s.length]}),t.jsxs("div",{className:"history-list",children:[s.slice(-14).reverse().map(d=>t.jsxs("button",{className:"history-row",onClick:()=>o(d.seq),disabled:l,title:`Jump to step ${d.seq+1} — ${d.summary}`,children:[t.jsx("span",{className:`action-dot ${d.action}`}),t.jsxs("strong",{children:["#",d.seq+1]}),t.jsx("span",{children:d.tool}),t.jsx("span",{className:"history-time",children:d.ts?Ma(d.ts):""}),d.isError?t.jsx(Ct,{className:"history-err",size:13}):t.jsx("span",{})]},d.seq)),s.length===0?t.jsx("p",{className:"muted",children:"Not visited yet at this point of the walk. Scrub the timeline forward."}):null]})]})]})}function Ma(e){const n=new Date(e);return Number.isNaN(n.getTime())?"":[n.getHours(),n.getMinutes(),n.getSeconds()].map(s=>String(s).padStart(2,"0")).join(":")}function ka({size:e=22}){return t.jsxs("svg",{viewBox:"0 0 64 64",width:e,height:e,"aria-hidden":!0,focusable:"false",children:[t.jsx("defs",{children:t.jsxs("radialGradient",{id:"logo-halo",children:[t.jsx("stop",{offset:"0%",stopColor:"#f1aa57",stopOpacity:"0.55"}),t.jsx("stop",{offset:"100%",stopColor:"#f1aa57",stopOpacity:"0"})]})}),t.jsx("rect",{width:"64",height:"64",rx:"14",fill:"#0f141b"}),t.jsx("circle",{cx:"20",cy:"15",r:"1.6",fill:"#3b4047"}),t.jsx("circle",{cx:"11",cy:"27",r:"1.4",fill:"#3b4047"}),t.jsx("circle",{cx:"51",cy:"40",r:"1.6",fill:"#3b4047"}),t.jsx("circle",{cx:"34",cy:"53",r:"1.4",fill:"#3b4047"}),t.jsxs("g",{fill:"#f1aa57",children:[t.jsx("circle",{cx:"18.6",cy:"47.9",r:"1.15",opacity:"0.35"}),t.jsx("circle",{cx:"22.7",cy:"45.2",r:"1.25",opacity:"0.42"}),t.jsx("circle",{cx:"25.9",cy:"42",r:"1.35",opacity:"0.49"}),t.jsx("circle",{cx:"28.2",cy:"38.1",r:"1.45",opacity:"0.56"}),t.jsx("circle",{cx:"30.9",cy:"29.3",r:"1.55",opacity:"0.64"}),t.jsx("circle",{cx:"33",cy:"25.4",r:"1.65",opacity:"0.72"}),t.jsx("circle",{cx:"36",cy:"22.1",r:"1.75",opacity:"0.8"}),t.jsx("circle",{cx:"38",cy:"20.4",r:"1.85",opacity:"0.88"})]}),t.jsx("circle",{cx:"13",cy:"50",r:"4.5",fill:"#9fc67b",opacity:"0.16"}),t.jsx("circle",{cx:"13",cy:"50",r:"2.4",fill:"#9fc67b"}),t.jsx("circle",{cx:"29.5",cy:"34",r:"5",fill:"#b6daf1",opacity:"0.16"}),t.jsx("circle",{cx:"29.5",cy:"34",r:"2.7",fill:"#b6daf1"}),t.jsx("circle",{cx:"44",cy:"17.5",r:"9.5",fill:"url(#logo-halo)"}),t.jsx("circle",{cx:"44",cy:"17.5",r:"3.4",fill:"#f1aa57"}),t.jsx("circle",{cx:"44",cy:"17.5",r:"1.7",fill:"#ffe0b0"})]})}const Na=typeof navigator<"u"&&/Mac|iPhone|iPad/.test(navigator.platform),qn=Na?"⌘B":"Ctrl+B",Ca=r.memo(function({sessions:n,activeKey:s,loading:a,hideEmpty:o,harnessFilter:l,collapsed:f,onSelect:m,onRefresh:v,onHideEmptyChange:d,onHarnessFilterChange:b,onCollapse:c,onOpenMap:S,activeRepo:w,locked:I=!1,activeReportState:O}){const[T,p]=r.useState(""),[j,$]=r.useState(""),[C,L]=r.useState(!1),P=r.useRef(null);r.useEffect(()=>{if(!C)return;const x=E=>{P.current?.contains(E.target)||L(!1)},k=E=>{E.key==="Escape"&&L(!1)};return document.addEventListener("pointerdown",x),document.addEventListener("keydown",k),()=>{document.removeEventListener("pointerdown",x),document.removeEventListener("keydown",k)}},[C]);const ne=r.useMemo(()=>[...new Set(n.map(x=>x.harness))].sort(),[n]),K=r.useMemo(()=>n.filter(x=>x.eventCount===0).length,[n]),G=l&&ne.includes(l)?l:void 0,A=r.useMemo(()=>{const x=T.trim().toLowerCase();return n.filter(k=>Fn(k,{hideEmpty:o,harness:G},s)?x?`${k.title??""} ${k.id} ${k.gitBranch??""} ${k.harness}`.toLowerCase().includes(x):!0:!1)},[n,T,o,G,s]);return t.jsxs("aside",{className:f?"session-rail collapsed":"session-rail",children:[t.jsxs("div",{className:"rail-head",children:[t.jsxs("h1",{className:"wordmark",children:[t.jsx(ka,{}),t.jsxs("span",{children:["mindwalk",t.jsx("span",{className:"spark",children:"."})]})]}),t.jsxs("div",{className:"rail-head-actions",children:[t.jsxs("div",{className:"rail-map",ref:P,children:[t.jsx("button",{className:"icon-btn",onClick:()=>L(x=>!x),"aria-expanded":C,title:"Open a repository map","aria-label":"Open a repository map",children:t.jsx(Tt,{size:15})}),C?t.jsxs("div",{className:"rail-map-pop",children:[w?t.jsxs("button",{className:"rail-map-primary",onClick:()=>{S(w),L(!1)},title:`Open the map of ${w}`,children:[t.jsx(Tt,{size:14,"aria-hidden":!0}),t.jsxs("span",{className:"rail-map-primary-text",children:[t.jsx("span",{className:"rail-map-primary-name",children:Ea(w)}),t.jsx("span",{className:"rail-map-primary-path",children:"‎"+w})]})]}):null,w?t.jsx("div",{className:"rail-map-divider","aria-hidden":!0,children:t.jsx("span",{children:"or open any repository"})}):t.jsx("p",{className:"rail-map-label",children:"Open a repository map"}),t.jsxs("form",{className:"rail-map-form",onSubmit:x=>{x.preventDefault();const k=j.trim();k&&(S(k),L(!1))},children:[t.jsx("input",{type:"text",className:"rail-map-input",placeholder:"/path/to/repo",value:j,onChange:x=>$(x.currentTarget.value),spellCheck:!1}),t.jsx("button",{type:"submit",className:"rail-map-go",disabled:j.trim()==="",children:"Open"})]})]}):null]}),t.jsx("button",{className:"icon-btn",onClick:v,disabled:I,title:"Rescan sessions","aria-label":"Rescan sessions",children:t.jsx(ot,{size:15})}),t.jsx("button",{className:"icon-btn",onClick:c,title:`Hide sidebar (${qn})`,"aria-label":"Hide session sidebar",children:t.jsx(Bs,{size:15})})]})]}),t.jsxs("div",{className:"rail-controls",children:[t.jsxs("label",{className:"rail-filter",children:[t.jsx(Ys,{size:14,"aria-hidden":!0}),t.jsx("input",{type:"search",placeholder:"Filter sessions",value:T,onChange:x=>p(x.currentTarget.value),"aria-label":"Filter sessions"})]}),ne.length>1||K>0?t.jsxs("div",{className:"rail-chips",role:"group","aria-label":"Session filters",children:[ne.length>1?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:G===void 0?"chip active":"chip",onClick:()=>b(void 0),children:"all"}),ne.map(x=>t.jsx("button",{className:G===x?"chip active":"chip",onClick:()=>b(x),children:Qt(x)},x))]}):null,K>0?t.jsx("button",{className:o?"eye-toggle":"eye-toggle showing",onClick:()=>d(!o),"aria-pressed":!o,title:o?`Show ${K} empty sessions`:`Hide ${K} empty sessions`,"aria-label":o?`Show ${K} empty sessions`:`Hide ${K} empty sessions`,children:o?t.jsx(Ss,{size:13,"aria-hidden":!0}):t.jsx(As,{size:13,"aria-hidden":!0})}):null]}):null]}),t.jsxs("div",{className:"session-list","aria-busy":a,children:[A.map(x=>t.jsxs("button",{className:x.key===s?"session-row active":"session-row",onClick:()=>m(x.key),disabled:I,children:[t.jsx("span",{className:"session-title",children:x.title||x.id}),t.jsxs("span",{className:"session-meta",children:[t.jsxs("span",{className:"session-meta-text",children:[Qt(x.harness)," · ",x.eventCount," ",x.eventCount===1?"call":"calls",x.gitBranch?` · ${x.gitBranch}`:"",x.endedAt?` · ${Ra(x.endedAt)}`:""]}),(()=>{const k=x.key===s&&O!==void 0?O:x.reportState;return k?t.jsx("span",{className:`rail-eval rail-eval-${k}`,title:Zt(k),"aria-label":Zt(k),children:k==="running"?"evaluating":""}):null})()]})]},x.key)),A.length===0?t.jsx("p",{className:"muted",style:{padding:"10px 8px"},children:a&&n.length===0?"Scanning sessions…":"No matching sessions."}):null]}),t.jsx("div",{className:"rail-foot",children:A.length===n.length?`${n.length} session${n.length===1?"":"s"}`:`${A.length} of ${n.length} sessions`})]})});function Ea(e){const n=e.replace(/\/+$/,"");return n.slice(n.lastIndexOf("/")+1)||n}function Zt(e){switch(e){case"running":return"Evaluation in progress";case"done":return"Evaluation ready";case"stale":return"Evaluation ready, but the session has grown since";case"failed":return"Last evaluation failed"}}function Qt(e){return e==="claude-code"?"claude":e}function Ra(e){const n=new Date(e);if(Number.isNaN(n.getTime()))return"";const s=new Date,a=n.getFullYear()===s.getFullYear(),o=`${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`,l=`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`;return a?`${o} ${l}`:`${n.getFullYear()}-${o}`}const Sa=160,en=340,tt=[1,4,16],$a=220,tn={compaction:"context compaction","user-message":"user message",subagent:"subagent"},Aa=["search","read","edit","verify","exec"];function La({trace:e,currentSeq:n,onChange:s,onSubagentMark:a,onExport:o,exporting:l=!1}){const[f,m]=r.useState(!1),[v,d]=r.useState(1),[b,c]=r.useState(!1),S=r.useRef(null),w=e?.events.length??0,I=Math.max(0,w-1),O=Math.min(n,I),T=e?.events[O];r.useEffect(()=>{m(!1)},[e]),r.useEffect(()=>{l&&m(!1)},[l]);const p=r.useRef(O),j=r.useRef(I),$=r.useRef(f);p.current=O,j.current=I,$.current=f,r.useEffect(()=>{if(!f||w===0||l)return;const i=Math.max(85,en/v),h=Math.max(1,Math.round(v*i/en)),g=window.setInterval(()=>{if(p.current>=j.current){m(!1);return}s(Math.min(p.current+h,j.current))},i);return()=>window.clearInterval(g)},[f,v,w,s,l]);const C=r.useCallback(()=>{!$.current&&p.current>=j.current&&s(0),m(i=>!i)},[s]),L=r.useCallback(()=>{d(i=>tt[(tt.indexOf(i)+1)%tt.length])},[]),P=r.useCallback(i=>{s(Math.min(j.current,Math.max(0,p.current+i)))},[s]),ne=r.useCallback((i,h)=>{if(e){for(let g=p.current+i;g>=0&&g<e.events.length;g+=i)if(h(e.events[g])){s(g);return}}},[e,s]),K=r.useMemo(()=>{const i=(e?.marks??[]).map(h=>Math.min(h.seq,Math.max(0,(e?.events.length??1)-1)));return[...new Set(i)].sort((h,g)=>h-g)},[e]),G=r.useCallback(i=>{const h=p.current,g=i===1?K.find(y=>y>h):[...K].reverse().find(y=>y<h);g!==void 0&&s(g)},[K,s]);r.useEffect(()=>{if(!e||l)return;const i=h=>{if(!(h.metaKey||h.ctrlKey||h.altKey||h.target?.closest("input, textarea, select, button, [contenteditable]"))){switch(h.key){case" ":h.preventDefault(),C();return;case"ArrowLeft":h.preventDefault(),P(h.shiftKey?-10:-1);return;case"ArrowRight":h.preventDefault(),P(h.shiftKey?10:1);return;case"Home":h.preventDefault(),s(0);return;case"End":h.preventDefault(),s(j.current);return}switch(h.key.toLowerCase()){case"s":L();return;case"e":ne(h.shiftKey?-1:1,y=>y.action==="edit");return;case"x":ne(h.shiftKey?-1:1,y=>y.isError);return;case"m":G(h.shiftKey?-1:1);return}}};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[e,l,C,P,s,L,ne,G]);const A=w===0||l;r.useEffect(()=>{A&&c(!1)},[A]),r.useEffect(()=>{if(!b)return;const i=g=>{S.current?.contains(g.target)||c(!1)},h=g=>{g.key==="Escape"&&c(!1)};return window.addEventListener("pointerdown",i),window.addEventListener("keydown",h),()=>{window.removeEventListener("pointerdown",i),window.removeEventListener("keydown",h)}},[b]);const x=r.useMemo(()=>{if(!e||w===0)return[];const i=Math.min(Sa,w),h=[];for(let g=0;g<i;g++){const y=Math.floor(g*w/i),R=Math.floor((g+1)*w/i),q=new Map;for(let le=y;le<R;le++){const F=e.events[le].action;q.set(F,(q.get(F)??0)+1)}let U="other",de=-1;const ae=["edit","verify","read","search","exec","other"];for(const le of ae){const F=q.get(le)??0;F>de&&(de=F,U=le)}h.push({count:R-y,dominant:U})}return h},[e,w]),k=r.useMemo(()=>x.reduce((i,h)=>Math.max(i,h.count),1),[x]),E=r.useMemo(()=>{if(!e)return[];const i=new Map;for(const h of e.marks){const g=Math.min(h.seq,I),y=I>0?g/I:0,R=`${h.type}:${Math.round(y*$a)}`,q=i.get(R);q?(q.count++,q.seq=Math.min(q.seq,g)):i.set(R,{type:h.type,seq:g,pos:y,count:1,note:h.note})}return[...i.values()]},[e,I]);return t.jsxs("footer",{className:"deck",children:[t.jsxs("div",{className:"deck-main",children:[t.jsxs("div",{className:"strip",children:[t.jsx("div",{className:"strip-marks",children:E.map((i,h)=>t.jsx("button",{type:"button",className:`strip-mark ${i.type}`,style:{left:`${i.pos*100}%`},disabled:A,title:`${i.note||tn[i.type]}${i.count>1?` ×${i.count}`:""}`,"aria-label":`Jump to ${i.note||tn[i.type]} at event ${i.seq+1}${i.count>1?`, ${i.count} marks`:""}`,onClick:()=>i.type==="subagent"&&a?a(i.seq):s(i.seq)},`${i.type}-${i.seq}-${h}`))}),t.jsx("div",{className:"strip-bars","aria-hidden":!0,children:x.map((i,h)=>t.jsx("span",{className:`strip-bar ${i.dominant}`,style:{height:`${18+i.count/k*82}%`}},h))}),w>0?t.jsx("div",{className:"strip-playhead",style:{left:`${O/Math.max(I,1)*100}%`},"aria-hidden":!0}):null,t.jsx("input",{className:"strip-input",type:"range",min:0,max:I,value:O,disabled:A,onChange:i=>s(Number(i.currentTarget.value)),"aria-label":"Playback position","aria-valuetext":T?`event ${T.seq}: ${T.tool}`:"empty"})]}),t.jsxs("div",{className:"deck-pos",children:[t.jsx("span",{className:"deck-pos-count",style:{minWidth:`${String(Math.max(w,1)).length*2+3}ch`},children:w>0?`${O+1} / ${w}`:"0 / 0"}),t.jsx("span",{className:"deck-pos-clock",children:T?.ts?Pa(T.ts):"—"})]}),t.jsxs("div",{className:"transport",children:[t.jsx("button",{className:"icon-btn",onClick:()=>P(-1),disabled:A,title:"Step back (←)","aria-label":"Step back one event",children:t.jsx(Zs,{size:15})}),t.jsx("button",{className:"play-btn",onClick:C,disabled:A,title:f?"Pause (Space)":"Play (Space)","aria-label":f?"Pause playback":"Play playback",children:f?t.jsx(Os,{size:16}):t.jsx(Us,{size:16,className:"play-glyph"})}),t.jsx("button",{className:"icon-btn",onClick:()=>P(1),disabled:A,title:"Step forward (→)","aria-label":"Step forward one event",children:t.jsx(er,{size:15})}),t.jsxs("div",{className:"transport-more",ref:S,children:[t.jsx("button",{className:`icon-btn${l?" recording":""}${b?" open":""}`,onClick:()=>c(i=>!i),disabled:A,"aria-haspopup":"true","aria-expanded":b,title:"More controls","aria-label":"More playback controls",children:l?t.jsx(Nt,{size:15,className:"spin"}):v!==1?t.jsxs("span",{className:"more-speed",children:[v,"×"]}):t.jsx(Es,{size:15})}),b?t.jsxs("div",{className:"transport-pop",children:[t.jsxs("div",{className:"pop-speed",children:[t.jsx("span",{className:"pop-speed-label",children:"Speed"}),t.jsx("div",{className:"pop-speed-chips",title:"Cycle with S",children:tt.map(i=>t.jsxs("button",{className:i===v?"pop-chip engaged":"pop-chip",onClick:()=>d(i),"aria-pressed":i===v,children:[i,"×"]},i))})]}),t.jsxs("button",{className:"pop-item",onClick:()=>{s(0),c(!1)},children:[t.jsx(Ks,{size:14}),t.jsx("span",{children:"Restart"}),t.jsx("kbd",{children:"Home"})]}),o?t.jsxs("button",{className:"pop-item",onClick:()=>{c(!1),o()},children:[t.jsx(or,{size:14}),t.jsx("span",{children:"Export video"})]}):null]}):null]})]})]}),t.jsxs("div",{className:"deck-foot",children:[t.jsx("div",{className:"readout-now",children:T?t.jsxs(t.Fragment,{children:[t.jsx("span",{className:`action-dot ${T.action}`}),t.jsx("span",{className:"readout-tool",children:T.tool}),T.isError?t.jsx("span",{className:"err",children:"error"}):null,t.jsx("span",{className:"readout-summary",title:T.summary,children:T.summary})]}):t.jsx("span",{className:"readout-summary",children:e?"No recorded activity for this agent.":"Select a session to start the walk."})}),t.jsxs("div",{className:"deck-legend","aria-hidden":!0,children:[t.jsx("span",{className:"legend-group",children:Aa.map(i=>t.jsxs("span",{className:"legend-item",children:[t.jsx("span",{className:`action-dot ${i}`}),i]},i))}),t.jsxs("span",{className:"legend-group",children:[t.jsxs("span",{className:"legend-item",children:[t.jsx("span",{className:"legend-glyph compaction"}),"compaction"]}),t.jsxs("span",{className:"legend-item",children:[t.jsx("span",{className:"legend-glyph subagent"}),"subagent"]}),t.jsxs("span",{className:"legend-item",children:[t.jsx("span",{className:"legend-glyph user-message"}),"user turn"]})]})]})]})]})}function Pa(e){const n=new Date(e);return Number.isNaN(n.getTime())?"":[n.getHours(),n.getMinutes(),n.getSeconds()].map(s=>String(s).padStart(2,"0")).join(":")}function Ia(e){switch(e){case"running":return"The judge is reading the trace — about a minute";case"done":return"Evaluation ready";case"stale":return"Evaluation ready, but the session has grown since";case"failed":return"The last evaluation failed — open to retry";default:return"Evaluate this session with your local agent CLI"}}const Ie="__main__";function za(){const{sessions:e,activeSessionKey:n,trace:s,city:a,currentSeq:o,selectedPath:l,view:f,loading:m,error:v,hideEmpty:d,harnessFilter:b,railCollapsed:c,mapOnly:S,setView:w,setSessions:I,setActiveSession:O,setData:T,setCityOnly:p,setCurrentSeq:j,setSelectedPath:$,setLoading:C,setError:L,setHideEmpty:P,setHarnessFilter:ne,setRailCollapsed:K}=Pe(),G=r.useRef(!1),A=r.useRef(0),x=r.useRef(0),k=r.useRef(0),E=r.useRef(0),i=r.useRef(0),h=r.useRef(!1),g=r.useRef(0),y=r.useRef(n);y.current=n;const R=r.useRef(null),[q,U]=r.useState(!1),[de,ae]=r.useState(null),[le,F]=r.useState(null),[z,D]=r.useState(),[Y,re]=r.useState(),[W,ue]=r.useState(null),[se,xe]=r.useState(!1),[je,X]=r.useState(),[J,he]=r.useState(),[ie,H]=r.useState(),N=r.useRef(null),_=r.useRef(void 0),V=r.useRef(void 0),ee=r.useRef(void 0),ce=r.useRef(new Map),fe=r.useRef(new Map),Z=r.useRef(!1);Z.current=q;const ke=r.useCallback(u=>{R.current=u},[]),ge=r.useCallback(()=>{g.current++,C(!0)},[C]),Me=r.useCallback(()=>{g.current=Math.max(0,g.current-1),g.current===0&&C(!1)},[C]),Re=r.useCallback(()=>{const u=++k.current;return E.current++,i.current++,N.current=null,_.current=void 0,V.current=void 0,ee.current=void 0,ce.current.clear(),fe.current.clear(),re(void 0),ue(null),xe(!1),X(void 0),he(void 0),H(void 0),u},[]),Se=r.useCallback(async(u,M=k.current)=>{const B=++E.current;xe(!0),he(void 0),H(void 0);try{const Q=await lr(u);if(M!==k.current||B!==E.current||y.current!==u)return;re(Q)}catch(Q){M===k.current&&B===E.current&&y.current===u&&(he(Ae(Q,"loading agents")),H(null))}finally{M===k.current&&B===E.current&&y.current===u&&xe(!1)}},[]),Je=r.useCallback(async u=>{const M=++x.current,B=k.current;ge(),L(void 0);try{const{trace:Q,city:ve}=await cr(u);if(M!==x.current||B!==k.current||y.current!==u)return;V.current=Q,ee.current=ve,ce.current.set(Ie,Q);const ye=N.current;if(ye===null){T(Q,ve);const we=fe.current.get(Ie);we!==void 0&&j(Math.min(we,Math.max(0,Q.events.length-1))),$(void 0)}else{const we=ce.current.get(ye);if(we){const pe=Pe.getState().currentSeq;T(we,ve),j(Math.min(pe,Math.max(0,we.events.length-1)))}}}catch(Q){M===x.current&&y.current===u&&L(Ae(Q,"loading the session"))}finally{Me()}},[ge,Me,j,T,L,$]),Et=r.useCallback(()=>{const u=N.current;fe.current.set(u??Ie,Pe.getState().currentSeq),i.current++,_.current=void 0,ce.current.clear(),N.current=null,ue(null),X(void 0),he(void 0),H(void 0);const M=V.current,B=ee.current;if(M&&B){T(M,B);const Q=fe.current.get(Ie);Q!==void 0&&j(Math.min(Q,Math.max(0,M.events.length-1))),$(void 0)}},[j,T,$]),lt=r.useCallback(async u=>{const M=++A.current;ge(),L(void 0);try{const B=await Ft(u);if(M!==A.current)return;I(B);let Q;if(!G.current){G.current=!0;const be=new URL(window.location.href).searchParams.get("session")??void 0,At=be?B.find(xt=>xt.key===be):void 0,gt=be&&!At?B.filter(xt=>xt.id===be):[],Lt=At?.key??(gt.length===1?gt[0].key:void 0);Lt?Q=Lt:gt.length>1?console.warn(`session id "${be}" is ambiguous; falling back to the latest session`):be&&console.warn(`session "${be}" not found; falling back to the latest session`)}const ve=y.current,ye=ve!==void 0&&B.some(be=>be.key===ve),we=(B.find(be=>Fn(be,{hideEmpty:d,harness:b}))??B[0])?.key,pe=Q??(ye?ve:we);if(pe!==ve){const be=Re();y.current=pe,pe||x.current++,O(pe),pe&&Se(pe,be)}else u&&pe&&(Et(),Se(pe));pe&&await Je(pe)}catch(B){M===A.current&&L(Ae(B,"scanning sessions"))}finally{Me()}},[ge,Me,b,d,Et,Se,Je,Re,O,L,I]),Dn=r.useCallback(async u=>{ge(),L(void 0);try{const M=await fr(u);p(M)}catch(M){L(Ae(M,"loading the repository map"))}finally{Me()}},[ge,Me,p,L]),On=r.useCallback(u=>{const M=u?`/?map=1&repo=${encodeURIComponent(u)}`:"/?map=1";window.open(M,"_blank","noopener")},[]),Hn=r.useCallback(u=>{if(y.current===u)return;const M=Re();y.current=u,O(u),Se(u,M),Je(u)},[Se,Je,Re,O]),Ze=r.useCallback(()=>{const u=N.current??Ie;fe.current.set(u,Pe.getState().currentSeq)},[]),dt=r.useCallback((u,M,B)=>{Ze(),N.current=u,ue(u),T(M,B);const Q=fe.current.get(u??Ie);Q!==void 0&&j(Math.min(Q,Math.max(0,M.events.length-1))),$(void 0)},[Ze,j,T,$]),ut=r.useCallback(async u=>{if(Z.current)return;const M=y.current,B=ee.current;if(!M||!B)return;const Q=++i.current;if(_.current=void 0,X(void 0),he(void 0),H(void 0),N.current===u)return;const ve=u===null?V.current:ce.current.get(u);if(ve){dt(u,ve,B);return}if(u===null)return;const ye=Y?.agents.find(pe=>pe.id===u);if(!ye||ye.traceAvailability!=="available")return;const we=k.current;_.current=u,X(u);try{const pe=await dr(M,u);if(we!==k.current||Q!==i.current||_.current!==u||y.current!==M||Z.current)return;ce.current.set(u,pe),dt(u,pe,ee.current??B)}catch(pe){we===k.current&&Q===i.current&&_.current===u&&y.current===M&&(he(Ae(pe,`loading the ${ye.label} trace`)),H(u))}finally{we===k.current&&Q===i.current&&_.current===u&&y.current===M&&(_.current=void 0,X(void 0))}},[Y,dt]),Un=r.useCallback(()=>{const u=y.current;Z.current||!u||ie===void 0||(ie===null?Se(u):ut(ie))},[ie,Se,ut]),Vn=r.useCallback(async()=>{const u=R.current,M=s?.events.length??0;if(!u||M===0||Z.current)return;const B=y.current,Q=N.current,ve=Pe.getState().currentSeq;i.current++,_.current=void 0,X(void 0),Z.current=!0,U(!0),L(void 0);try{const{blob:ye,extension:we}=await qr({canvas:u,total:M,setSeq:j}),pe=s?.session.id||B||"session";Dr(ye,`mindwalk-${pe}.${we}`)}catch(ye){L(Ae(ye,"exporting the video"))}finally{y.current===B&&N.current===Q&&j(ve),Z.current=!1,U(!1)}},[s,q,j,L]),Gn=r.useCallback(()=>K(!0),[K]),Kn=r.useCallback(()=>K(!1),[K]),Ee=r.useCallback(async u=>{try{const M=await ur(u);y.current===u&&D(M)}catch{}},[]);r.useEffect(()=>{ae(null),F(null),D(void 0),n&&!S&&Ee(n)},[n,S,Ee]);const $e=r.useCallback(async()=>{try{I(await Ft())}catch{}},[I]),Wn=r.useCallback(()=>{if(Z.current||h.current)return;h.current=!0;const u=y.current;u&&!S&&Ee(u),lt(!0).finally(()=>{h.current=!1})},[lt,Ee,S]);r.useEffect(()=>{if(z?.state!=="running"||!n)return;const u=setInterval(()=>{Ee(n),$e()},2500);return()=>{clearInterval(u),$e()}},[z?.state,n,Ee,$e]),r.useEffect(()=>{if(z!==void 0||!n||S)return;const u=setInterval(()=>{Ee(n)},5e3);return()=>clearInterval(u)},[z===void 0,n,S,Ee]);const Rt=r.useMemo(()=>e.some(u=>u.reportState==="running"),[e]);r.useEffect(()=>{if(!Rt||z?.state==="running")return;const u=setInterval(()=>{$e()},5e3);return()=>clearInterval(u)},[Rt,z?.state,$e]);const Yn=r.useCallback(async u=>{const M=y.current;if(M)try{const B=await hr(M,u);y.current===M&&D(B),$e()}catch(B){L(Ae(B,"starting the evaluation"))}},[L,$e]),ht=r.useCallback(u=>{$(u),u&&ae("inspect")},[$]),ft=r.useCallback(()=>ae(null),[]),Xn=r.useCallback(()=>F(null),[]),Jn=r.useCallback(()=>{Z.current||ae("agents")},[]),Zn=r.useCallback(u=>{u.presentation==="sheet"?ae(M=>M===u.id?null:u.id):F(M=>M===u.id?null:u.id)},[]),Qn=r.useCallback(u=>{if(Z.current)return;const M=V.current,B=ee.current;if(!M||!B)return;i.current++,_.current=void 0,X(void 0),N.current!==null&&(Ze(),N.current=null,ue(null),T(M,B)),j(u),fe.current.set(Ie,u);const ve=M.events[u]?.targets.find(ye=>ye.path)?.path;$(ve)},[Ze,j,T,$]),es=r.useCallback(u=>{j(u),ae("agents")},[j]),ts=r.useCallback(u=>{Z.current||j(u)},[j]);r.useEffect(()=>{const u=M=>{if(M.key.toLowerCase()!=="b"||!(M.metaKey||M.ctrlKey)||M.altKey||M.shiftKey)return;M.preventDefault();const B=Pe.getState();B.setRailCollapsed(!B.railCollapsed)};return window.addEventListener("keydown",u),()=>window.removeEventListener("keydown",u)},[]),r.useEffect(()=>{const u=M=>{if(M.key.toLowerCase()!=="v"||M.metaKey||M.ctrlKey||M.altKey||M.shiftKey)return;const B=M.target;if(B&&(B.tagName==="INPUT"||B.tagName==="TEXTAREA"||B.isContentEditable)||Z.current)return;const Q=Pe.getState();Q.setView(Q.view==="tree"?"terrain":"tree")};return window.addEventListener("keydown",u),()=>window.removeEventListener("keydown",u)},[]),r.useEffect(()=>{const u=new URL(window.location.href).searchParams;u.get("map")==="1"?Dn(u.get("repo")??void 0):lt(!1)},[]);const pt=r.useMemo(()=>z?.state==="running"?"running":z?.state==="failed"?"failed":z?.state==="done"?z.stale?"stale":"done":null,[z]),St=r.useMemo(()=>W===null?"Main":Y?.agents.find(u=>u.id===W)?.label??"Subagent",[W,Y]),ns=f==="tree"?s?"glow ∝ revisits":"static map":s?"height ∝ depth × revisits":"height ∝ lines",$t=r.useMemo(()=>new Ir(s,a),[s,a]),Te=r.useMemo(()=>$t.snapshotAt(o),[$t,o]),mt=r.useMemo(()=>{let u=0,M=0,B=0;for(const Q of Te.touchByPath.values())Q==="edit"?u++:Q==="read"?M++:B++;return{edited:u,read:M,seen:B}},[Te]),Oe=r.useMemo(()=>l?a?.files.find(u=>u.path===l):void 0,[a,l]),ss=r.useMemo(()=>{const u=new Map;for(const M of s?.events??[])for(const B of M.targets)B.touch==="edit"&&B.path&&u.set(B.path,(u.get(B.path)??0)+1);return[...u.entries()].filter(([,M])=>M>=3).map(([M,B])=>({path:M,edits:B})).sort((M,B)=>B.edits-M.edits||(M.path<B.path?-1:1))},[s]);return t.jsxs("main",{className:S||c?"app-frame rail-collapsed":"app-frame",children:[S?null:t.jsx(Ca,{sessions:e,activeKey:n,loading:m,hideEmpty:d,harnessFilter:b,collapsed:c,onSelect:Hn,onRefresh:Wn,onHideEmptyChange:P,onHarnessFilterChange:ne,onCollapse:Gn,onOpenMap:On,activeRepo:s?.session.cwd,locked:q,activeReportState:z===void 0?void 0:pt}),t.jsxs("section",{className:"stage",children:[t.jsxs("div",{className:"viewport",children:[!S&&c?t.jsx("button",{className:"rail-expand",onClick:Kn,title:`Show sidebar (${qn})`,"aria-label":"Show session sidebar",children:t.jsx(qs,{size:15})}):null,f==="tree"?t.jsx(la,{city:a,playback:Te,selectedPath:l,onSelect:ht,onCanvasReady:ke}):t.jsx(Qr,{city:a,playback:Te,selectedPath:l,onSelect:ht,onCanvasReady:ke,locHeights:S}),t.jsx(ga,{trace:s,city:a,agentLabel:St,editedNow:mt.edited,readNow:mt.read,seenNow:mt.seen,churn:ss,onSelectFile:ht,onOpenAgents:!S&&s?Jn:void 0,locked:q}),a?t.jsx(pr,{panels:[{id:"view",icon:f==="tree"?yn:xn,hint:`Scene view: ${f} — click to change, or press V`,section:"scene",presentation:"pop",render:()=>t.jsx(Lr,{view:f,onViewChange:w,note:ns,locked:q})},{id:"inspect",icon:Ns,hint:"Inspect the selected file",section:"session",presentation:"sheet",render:()=>t.jsx(ja,{file:Oe,touch:Oe?Te.touchByPath.get(Oe.path):void 0,history:Oe?Te.historyByPath.get(Oe.path)??[]:[],onClose:ft,onJumpTo:ts,locked:q})},...!S&&s?[{id:"agents",icon:rr,hint:`Agent lenses — current: ${St}`,section:"session",presentation:"sheet",render:()=>t.jsx(mr,{graph:Y,current:W,loading:se,loadingAgentID:je,locked:q,error:J,retryAgentID:ie,onSelect:u=>{ut(u)},onRetry:Un,onClose:ft})}]:[],...!S&&s?[{id:"evaluate",icon:vn,hint:Ia(pt),section:"session",presentation:"sheet",badge:pt,render:()=>t.jsx(Mr,{status:z,analyzing:z?.state==="running",locked:q,onAnalyze:u=>{Yn(u)},onClose:ft,onJumpTo:Qn})}]:[]],openSheet:de,openPop:le,onToggle:Zn,onClosePop:Xn}):null,!S&&!m&&e.length===0?t.jsx("div",{className:"empty-stage",children:t.jsxs("div",{className:"card",children:[t.jsx("h2",{children:"No sessions found"}),t.jsxs("p",{children:["mindwalk scans ",t.jsx("code",{children:"~/.claude/projects"}),", ",t.jsx("code",{children:"~/.codex/sessions"}),", and"," ",t.jsx("code",{children:"~/.pi/agent/sessions"})," for agent traces. Run a session there, then refresh."]})]})}):null,m?t.jsx("div",{className:"toast",children:S?"Building the map…":e.length===0?"Scanning sessions…":"Reading trace…"}):null,v?t.jsx("div",{className:"toast error",children:v}):null]}),t.jsx(La,{trace:s,currentSeq:o,onChange:j,onExport:Nn()?Vn:void 0,exporting:q,onSubagentMark:es})]})]})}as.createRoot(document.getElementById("root")).render(t.jsx(r.StrictMode,{children:t.jsx(za,{})}));
3
+ //# sourceMappingURL=index-C_adLrJr.js.map