claude-code-workflow 7.2.15 → 7.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ccw/workflows/cli-templates/schemas/team-tasks-schema.json +255 -0
- package/.codex/agents/team-supervisor.toml +39 -0
- package/.codex/agents/team-worker.toml +46 -0
- package/.codex/skills/team-arch-opt/SKILL.md +151 -698
- package/.codex/skills/team-arch-opt/roles/analyzer/role.md +78 -0
- package/.codex/skills/team-arch-opt/roles/coordinator/commands/analyze.md +57 -0
- package/.codex/skills/team-arch-opt/roles/coordinator/commands/dispatch.md +287 -0
- package/.codex/skills/team-arch-opt/roles/coordinator/commands/monitor.md +204 -0
- package/.codex/skills/team-arch-opt/roles/coordinator/role.md +162 -0
- package/.codex/skills/team-arch-opt/roles/designer/role.md +115 -0
- package/.codex/skills/team-arch-opt/roles/refactorer/role.md +102 -0
- package/.codex/skills/team-arch-opt/roles/reviewer/role.md +111 -0
- package/.codex/skills/team-arch-opt/roles/validator/role.md +115 -0
- package/.codex/skills/team-arch-opt/specs/pipelines.md +102 -0
- package/.codex/skills/team-arch-opt/specs/team-config.json +263 -0
- package/.codex/skills/team-brainstorm/SKILL.md +167 -724
- package/.codex/skills/team-brainstorm/roles/challenger/role.md +61 -0
- package/.codex/skills/team-brainstorm/roles/coordinator/commands/analyze.md +58 -0
- package/.codex/skills/team-brainstorm/roles/coordinator/commands/dispatch.md +162 -0
- package/.codex/skills/team-brainstorm/roles/coordinator/commands/monitor.md +171 -0
- package/.codex/skills/team-brainstorm/roles/coordinator/role.md +140 -0
- package/.codex/skills/team-brainstorm/roles/evaluator/role.md +56 -0
- package/.codex/skills/team-brainstorm/roles/ideator/role.md +69 -0
- package/.codex/skills/team-brainstorm/roles/synthesizer/role.md +57 -0
- package/.codex/skills/team-brainstorm/specs/pipelines.md +72 -0
- package/.codex/skills/team-brainstorm/specs/team-config.json +86 -0
- package/.codex/skills/team-coordinate/SKILL.md +267 -667
- package/.codex/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +247 -0
- package/.codex/skills/team-coordinate/roles/coordinator/commands/dispatch.md +126 -0
- package/.codex/skills/team-coordinate/roles/coordinator/commands/monitor.md +327 -0
- package/.codex/skills/team-coordinate/roles/coordinator/role.md +361 -0
- package/.codex/skills/team-coordinate/specs/knowledge-transfer.md +111 -0
- package/.codex/skills/team-coordinate/specs/pipelines.md +97 -0
- package/.codex/skills/team-coordinate/specs/quality-gates.md +112 -0
- package/.codex/skills/team-coordinate/specs/role-spec-template.md +192 -0
- package/.codex/skills/team-designer/SKILL.md +153 -691
- package/.codex/skills/team-designer/phases/01-requirements-analysis.md +250 -0
- package/.codex/skills/team-designer/phases/02-scaffold-generation.md +228 -0
- package/.codex/skills/team-designer/phases/03-content-generation.md +330 -0
- package/.codex/skills/team-designer/phases/04-validation.md +320 -0
- package/.codex/skills/team-executor/SKILL.md +191 -515
- package/.codex/skills/team-executor/roles/executor/commands/monitor.md +280 -0
- package/.codex/skills/team-executor/roles/executor/role.md +170 -0
- package/.codex/skills/team-executor/specs/session-schema.md +264 -0
- package/.codex/skills/team-frontend/SKILL.md +129 -750
- package/.codex/skills/team-frontend/roles/analyst/role.md +92 -0
- package/.codex/skills/team-frontend/roles/architect/role.md +86 -0
- package/.codex/skills/team-frontend/roles/coordinator/commands/analyze.md +52 -0
- package/.codex/skills/team-frontend/roles/coordinator/commands/dispatch.md +151 -0
- package/.codex/skills/team-frontend/roles/coordinator/commands/monitor.md +188 -0
- package/.codex/skills/team-frontend/roles/coordinator/role.md +157 -0
- package/.codex/skills/team-frontend/roles/developer/role.md +93 -0
- package/.codex/skills/team-frontend/roles/qa/role.md +79 -0
- package/.codex/skills/team-frontend/specs/pipelines.md +76 -0
- package/.codex/skills/team-frontend/specs/team-config.json +84 -0
- package/.codex/skills/team-frontend-debug/SKILL.md +191 -821
- package/.codex/skills/team-frontend-debug/roles/analyzer/role.md +208 -0
- package/.codex/skills/team-frontend-debug/roles/coordinator/commands/analyze.md +174 -0
- package/.codex/skills/team-frontend-debug/roles/coordinator/commands/dispatch.md +198 -0
- package/.codex/skills/team-frontend-debug/roles/coordinator/commands/monitor.md +143 -0
- package/.codex/skills/team-frontend-debug/roles/coordinator/role.md +131 -0
- package/.codex/skills/team-frontend-debug/roles/fixer/role.md +147 -0
- package/.codex/skills/team-frontend-debug/roles/reproducer/role.md +147 -0
- package/.codex/skills/team-frontend-debug/roles/tester/role.md +231 -0
- package/.codex/skills/team-frontend-debug/roles/verifier/role.md +172 -0
- package/.codex/skills/team-frontend-debug/specs/debug-tools.md +215 -0
- package/.codex/skills/team-frontend-debug/specs/pipelines.md +94 -0
- package/.codex/skills/team-issue/SKILL.md +166 -751
- package/.codex/skills/team-issue/roles/coordinator/commands/analyze.md +64 -0
- package/.codex/skills/team-issue/roles/coordinator/commands/dispatch.md +273 -0
- package/.codex/skills/team-issue/roles/coordinator/commands/monitor.md +194 -0
- package/.codex/skills/team-issue/roles/coordinator/role.md +175 -0
- package/.codex/skills/team-issue/roles/explorer/role.md +94 -0
- package/.codex/skills/team-issue/roles/implementer/role.md +87 -0
- package/.codex/skills/team-issue/roles/integrator/role.md +84 -0
- package/.codex/skills/team-issue/roles/planner/role.md +81 -0
- package/.codex/skills/team-issue/roles/reviewer/role.md +86 -0
- package/.codex/skills/team-issue/specs/pipelines.md +124 -0
- package/.codex/skills/team-issue/specs/team-config.json +70 -0
- package/.codex/skills/team-iterdev/SKILL.md +134 -825
- package/.codex/skills/team-iterdev/roles/architect/role.md +65 -0
- package/.codex/skills/team-iterdev/roles/coordinator/commands/analyze.md +62 -0
- package/.codex/skills/team-iterdev/roles/coordinator/commands/dispatch.md +187 -0
- package/.codex/skills/team-iterdev/roles/coordinator/commands/monitor.md +186 -0
- package/.codex/skills/team-iterdev/roles/coordinator/role.md +161 -0
- package/.codex/skills/team-iterdev/roles/developer/role.md +74 -0
- package/.codex/skills/team-iterdev/roles/reviewer/role.md +66 -0
- package/.codex/skills/team-iterdev/roles/tester/role.md +88 -0
- package/.codex/skills/team-iterdev/specs/pipelines.md +94 -0
- package/.codex/skills/team-iterdev/specs/team-config.json +172 -0
- package/.codex/skills/team-lifecycle-v4/MIGRATION-PLAN.md +512 -0
- package/.codex/skills/team-lifecycle-v4/SKILL.md +166 -723
- package/.codex/skills/team-lifecycle-v4/roles/analyst/role.md +104 -0
- package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/analyze.md +56 -0
- package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +61 -0
- package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +177 -0
- package/.codex/skills/team-lifecycle-v4/roles/coordinator/role.md +152 -0
- package/.codex/skills/team-lifecycle-v4/roles/executor/commands/fix.md +35 -0
- package/.codex/skills/team-lifecycle-v4/roles/executor/commands/implement.md +63 -0
- package/.codex/skills/team-lifecycle-v4/roles/executor/role.md +89 -0
- package/.codex/skills/team-lifecycle-v4/roles/planner/role.md +108 -0
- package/.codex/skills/team-lifecycle-v4/roles/reviewer/commands/review-code.md +57 -0
- package/.codex/skills/team-lifecycle-v4/roles/reviewer/commands/review-spec.md +44 -0
- package/.codex/skills/team-lifecycle-v4/roles/reviewer/role.md +98 -0
- package/.codex/skills/team-lifecycle-v4/roles/supervisor/role.md +210 -0
- package/.codex/skills/team-lifecycle-v4/roles/tester/role.md +126 -0
- package/.codex/skills/team-lifecycle-v4/roles/writer/role.md +125 -0
- package/.codex/skills/team-lifecycle-v4/schemas/tasks-schema.md +82 -160
- package/.codex/skills/team-lifecycle-v4/specs/knowledge-transfer.md +136 -0
- package/.codex/skills/team-lifecycle-v4/specs/pipelines.md +125 -0
- package/.codex/skills/team-lifecycle-v4/specs/quality-gates.md +130 -0
- package/.codex/skills/team-perf-opt/SKILL.md +169 -697
- package/.codex/skills/team-perf-opt/roles/benchmarker/role.md +89 -0
- package/.codex/skills/team-perf-opt/roles/coordinator/commands/analyze.md +61 -0
- package/.codex/skills/team-perf-opt/roles/coordinator/commands/dispatch.md +262 -0
- package/.codex/skills/team-perf-opt/roles/coordinator/commands/monitor.md +320 -0
- package/.codex/skills/team-perf-opt/roles/coordinator/role.md +147 -0
- package/.codex/skills/team-perf-opt/roles/optimizer/role.md +97 -0
- package/.codex/skills/team-perf-opt/roles/profiler/role.md +73 -0
- package/.codex/skills/team-perf-opt/roles/reviewer/role.md +75 -0
- package/.codex/skills/team-perf-opt/roles/strategist/role.md +94 -0
- package/.codex/skills/team-perf-opt/specs/pipelines.md +65 -0
- package/.codex/skills/team-perf-opt/specs/team-config.json +246 -0
- package/.codex/skills/team-planex/SKILL.md +103 -477
- package/.codex/skills/team-planex/roles/coordinator/commands/analyze.md +52 -0
- package/.codex/skills/team-planex/roles/coordinator/commands/dispatch.md +80 -0
- package/.codex/skills/team-planex/roles/coordinator/commands/monitor.md +164 -0
- package/.codex/skills/team-planex/roles/coordinator/role.md +140 -0
- package/.codex/skills/team-planex/roles/executor/role.md +91 -0
- package/.codex/skills/team-planex/roles/planner/role.md +112 -0
- package/.codex/skills/team-planex/specs/pipelines.md +93 -0
- package/.codex/skills/team-quality-assurance/SKILL.md +148 -813
- package/.codex/skills/team-quality-assurance/roles/analyst/role.md +80 -0
- package/.codex/skills/team-quality-assurance/roles/coordinator/commands/analyze.md +72 -0
- package/.codex/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +108 -0
- package/.codex/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +209 -0
- package/.codex/skills/team-quality-assurance/roles/coordinator/role.md +143 -0
- package/.codex/skills/team-quality-assurance/roles/executor/role.md +66 -0
- package/.codex/skills/team-quality-assurance/roles/generator/role.md +68 -0
- package/.codex/skills/team-quality-assurance/roles/scout/role.md +67 -0
- package/.codex/skills/team-quality-assurance/roles/strategist/role.md +71 -0
- package/.codex/skills/team-quality-assurance/specs/pipelines.md +115 -0
- package/.codex/skills/team-quality-assurance/specs/team-config.json +131 -0
- package/.codex/skills/team-review/SKILL.md +148 -533
- package/.codex/skills/team-review/roles/coordinator/commands/analyze.md +71 -0
- package/.codex/skills/team-review/roles/coordinator/commands/dispatch.md +90 -0
- package/.codex/skills/team-review/roles/coordinator/commands/monitor.md +185 -0
- package/.codex/skills/team-review/roles/coordinator/role.md +142 -0
- package/.codex/skills/team-review/roles/fixer/role.md +76 -0
- package/.codex/skills/team-review/roles/reviewer/role.md +68 -0
- package/.codex/skills/team-review/roles/scanner/role.md +71 -0
- package/.codex/skills/team-review/specs/dimensions.md +82 -0
- package/.codex/skills/team-review/specs/finding-schema.json +82 -0
- package/.codex/skills/team-review/specs/pipelines.md +102 -0
- package/.codex/skills/team-review/specs/team-config.json +27 -0
- package/.codex/skills/team-roadmap-dev/SKILL.md +162 -683
- package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/analyze.md +61 -0
- package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/dispatch.md +241 -0
- package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/monitor.md +468 -0
- package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/pause.md +90 -0
- package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/resume.md +137 -0
- package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/roadmap-discuss.md +243 -0
- package/.codex/skills/team-roadmap-dev/roles/coordinator/role.md +303 -0
- package/.codex/skills/team-roadmap-dev/roles/executor/role.md +71 -0
- package/.codex/skills/team-roadmap-dev/roles/planner/role.md +76 -0
- package/.codex/skills/team-roadmap-dev/roles/verifier/role.md +74 -0
- package/.codex/skills/team-roadmap-dev/specs/pipelines.md +93 -0
- package/.codex/skills/team-roadmap-dev/specs/team-config.json +95 -0
- package/.codex/skills/team-tech-debt/SKILL.md +129 -708
- package/.codex/skills/team-tech-debt/roles/assessor/role.md +69 -0
- package/.codex/skills/team-tech-debt/roles/coordinator/commands/analyze.md +47 -0
- package/.codex/skills/team-tech-debt/roles/coordinator/commands/dispatch.md +163 -0
- package/.codex/skills/team-tech-debt/roles/coordinator/commands/monitor.md +231 -0
- package/.codex/skills/team-tech-debt/roles/coordinator/role.md +141 -0
- package/.codex/skills/team-tech-debt/roles/executor/role.md +76 -0
- package/.codex/skills/team-tech-debt/roles/planner/role.md +69 -0
- package/.codex/skills/team-tech-debt/roles/scanner/role.md +82 -0
- package/.codex/skills/team-tech-debt/roles/validator/role.md +75 -0
- package/.codex/skills/team-tech-debt/specs/pipelines.md +47 -0
- package/.codex/skills/team-tech-debt/specs/team-config.json +129 -0
- package/.codex/skills/team-testing/SKILL.md +144 -769
- package/.codex/skills/team-testing/roles/analyst/role.md +95 -0
- package/.codex/skills/team-testing/roles/coordinator/commands/analyze.md +70 -0
- package/.codex/skills/team-testing/roles/coordinator/commands/dispatch.md +106 -0
- package/.codex/skills/team-testing/roles/coordinator/commands/monitor.md +242 -0
- package/.codex/skills/team-testing/roles/coordinator/role.md +151 -0
- package/.codex/skills/team-testing/roles/executor/role.md +96 -0
- package/.codex/skills/team-testing/roles/generator/role.md +95 -0
- package/.codex/skills/team-testing/roles/strategist/role.md +83 -0
- package/.codex/skills/team-testing/specs/pipelines.md +101 -0
- package/.codex/skills/team-testing/specs/team-config.json +93 -0
- package/.codex/skills/team-uidesign/SKILL.md +133 -767
- package/.codex/skills/team-uidesign/roles/coordinator/commands/analyze.md +59 -0
- package/.codex/skills/team-uidesign/roles/coordinator/commands/dispatch.md +156 -0
- package/.codex/skills/team-uidesign/roles/coordinator/commands/monitor.md +194 -0
- package/.codex/skills/team-uidesign/roles/coordinator/role.md +179 -0
- package/.codex/skills/team-uidesign/roles/designer/role.md +69 -0
- package/.codex/skills/team-uidesign/roles/implementer/role.md +72 -0
- package/.codex/skills/team-uidesign/roles/researcher/role.md +82 -0
- package/.codex/skills/team-uidesign/roles/reviewer/role.md +67 -0
- package/.codex/skills/team-uidesign/specs/pipelines.md +76 -0
- package/.codex/skills/team-uidesign/specs/team-config.json +107 -0
- package/.codex/skills/team-ultra-analyze/SKILL.md +166 -786
- package/.codex/skills/team-ultra-analyze/roles/analyst/role.md +90 -0
- package/.codex/skills/team-ultra-analyze/roles/coordinator/commands/analyze.md +73 -0
- package/.codex/skills/team-ultra-analyze/roles/coordinator/commands/dispatch.md +225 -0
- package/.codex/skills/team-ultra-analyze/roles/coordinator/commands/monitor.md +327 -0
- package/.codex/skills/team-ultra-analyze/roles/coordinator/role.md +223 -0
- package/.codex/skills/team-ultra-analyze/roles/discussant/role.md +104 -0
- package/.codex/skills/team-ultra-analyze/roles/explorer/role.md +74 -0
- package/.codex/skills/team-ultra-analyze/roles/synthesizer/role.md +78 -0
- package/.codex/skills/team-ultra-analyze/specs/pipelines.md +64 -0
- package/.codex/skills/team-ultra-analyze/specs/team-config.json +129 -0
- package/.codex/skills/team-ux-improve/SKILL.md +142 -638
- package/.codex/skills/team-ux-improve/roles/coordinator/commands/analyze.md +62 -0
- package/.codex/skills/team-ux-improve/roles/coordinator/commands/dispatch.md +233 -0
- package/.codex/skills/team-ux-improve/roles/coordinator/commands/monitor.md +160 -0
- package/.codex/skills/team-ux-improve/roles/coordinator/role.md +138 -0
- package/.codex/skills/team-ux-improve/roles/designer/role.md +122 -0
- package/.codex/skills/team-ux-improve/roles/diagnoser/role.md +93 -0
- package/.codex/skills/team-ux-improve/roles/explorer/role.md +77 -0
- package/.codex/skills/team-ux-improve/roles/implementer/role.md +102 -0
- package/.codex/skills/team-ux-improve/roles/scanner/role.md +93 -0
- package/.codex/skills/team-ux-improve/roles/tester/role.md +84 -0
- package/.codex/skills/team-ux-improve/specs/pipelines.md +54 -0
- package/.codex/skills/team-ux-improve/specs/team-config.json +181 -0
- package/.codex/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +17 -0
- package/.codex/skills/team-ux-improve/wisdom/contributions/.gitkeep +0 -0
- package/.codex/skills/team-ux-improve/wisdom/patterns/state-management.md +14 -0
- package/.codex/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +16 -0
- package/.codex/skills/team-ux-improve/wisdom/principles/general-ux.md +16 -0
- package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-settings-routes.js +135 -133
- package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-BW9jiZ-p.js → AlertDialog-CnpjWAGm.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-BW9jiZ-p.js.map → AlertDialog-CnpjWAGm.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-ds-w_nVO.js → AnalysisPage-BT2rDDUD.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-ds-w_nVO.js.map → AnalysisPage-BT2rDDUD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-DlCbXxTz.js → ApiSettingsPage-DGpjiNVu.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-DlCbXxTz.js.map → ApiSettingsPage-DGpjiNVu.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-Dq3nL4fF.js → CliModeToggle-BqUadHn3.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-Dq3nL4fF.js.map → CliModeToggle-BqUadHn3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-BNDkEE4u.js → CliSessionSharePage-C3AdsDkm.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-BNDkEE4u.js.map → CliSessionSharePage-C3AdsDkm.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-ChM-uNx_.js → CliViewerPage-BZXpgY0N.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-ChM-uNx_.js.map → CliViewerPage-BZXpgY0N.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-DOcsYNQk.js → CodexLensPage-CePoJz-u.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-DOcsYNQk.js.map → CodexLensPage-CePoJz-u.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-CRNbykXN.js → Collapsible-DXVzWwmb.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-CRNbykXN.js.map → Collapsible-DXVzWwmb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-C2JWcemF.js → CommandsManagerPage-B6wJYF0z.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-C2JWcemF.js.map → CommandsManagerPage-B6wJYF0z.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-CvleOtJy.js → DeepWikiPage-D55fcvSk.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-CvleOtJy.js.map → DeepWikiPage-D55fcvSk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-CMOWQG64.js → EndpointsPage-DcGziJ5t.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-CMOWQG64.js.map → EndpointsPage-DcGziJ5t.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-DaFPRlNo.js → ExplorerPage-C4eKzn7F.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-DaFPRlNo.js.map → ExplorerPage-C4eKzn7F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CC4p04Az.js → FixSessionPage-BUHh954A.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CC4p04Az.js.map → FixSessionPage-BUHh954A.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-DROn1xZ5.js → FloatingFileBrowser-C3GF_u1C.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-DROn1xZ5.js.map → FloatingFileBrowser-C3GF_u1C.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-CmL_yhDv.js → FloatingPanel-Cn-q9PyJ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-CmL_yhDv.js.map → FloatingPanel-Cn-q9PyJ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-DCV5ybKE.js → GraphExplorerPage-DIpqgvoU.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-DCV5ybKE.js.map → GraphExplorerPage-DIpqgvoU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-D0fYQZgc.js → HistoryPage-DzSvEAFe.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-D0fYQZgc.js.map → HistoryPage-DzSvEAFe.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-D2FuJfsM.js → HookManagerPage-C6LDhWrH.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-D2FuJfsM.js.map → HookManagerPage-C6LDhWrH.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage-tjklillZ.js → InstallationsPage-D9ct9xFV.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage-tjklillZ.js.map → InstallationsPage-D9ct9xFV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-E4JVrhO1.js → IssueHubPage-CXgDC8pS.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-E4JVrhO1.js.map → IssueHubPage-CXgDC8pS.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-aJuRoyLt.js → LiteTasksPage-DMkauCwG.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-aJuRoyLt.js.map → LiteTasksPage-DMkauCwG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-BJeuWJv1.js → McpManagerPage-DhLDydgc.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-BJeuWJv1.js.map → McpManagerPage-DhLDydgc.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-BI4FAXhs.js → MemoryPage-Be3nhq40.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-BI4FAXhs.js.map → MemoryPage-Be3nhq40.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-DD2svchp.js → NotFoundPage-0yGnCePd.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-DD2svchp.js.map → NotFoundPage-0yGnCePd.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-FC__7yYa.js → OrchestratorPage-_SmXZcGl.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-FC__7yYa.js.map → OrchestratorPage-_SmXZcGl.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-DBB_-FzV.js → ProjectOverviewPage-BeXTMsdo.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-DBB_-FzV.js.map → ProjectOverviewPage-BeXTMsdo.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-BwOAvCH8.js → PromptHistoryPage-DS6ycuAv.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-BwOAvCH8.js.map → PromptHistoryPage-DS6ycuAv.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-Dd1-g_gp.js → ReviewSessionPage-BoqyjhPo.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-Dd1-g_gp.js.map → ReviewSessionPage-BoqyjhPo.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-B3RGdsKD.js → RulesManagerPage-DMAwkKlc.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-B3RGdsKD.js.map → RulesManagerPage-DMAwkKlc.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-DM-W5R8K.js → SessionDetailPage-BgJRHIF4.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-DM-W5R8K.js.map → SessionDetailPage-BgJRHIF4.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-BVz1KCc7.js → SessionsPage-DBPdWlji.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-BVz1KCc7.js.map → SessionsPage-DBPdWlji.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-ComW7EZS.js → SettingsPage-BY3QiJhm.js} +4 -4
- package/ccw/frontend/dist/assets/{SettingsPage-ComW7EZS.js.map → SettingsPage-BY3QiJhm.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SkillsManagerPage-CKom9XwV.js → SkillsManagerPage-DS101Adm.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-CKom9XwV.js.map → SkillsManagerPage-DS101Adm.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-DQz7WP2s.js → SpecsSettingsPage-BcsLu1qq.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-DQz7WP2s.js.map → SpecsSettingsPage-BcsLu1qq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BPMdND9H.js → Switch-BL9AmNPC.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BPMdND9H.js.map → Switch-BL9AmNPC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-qqt70VYL.js → TabsNavigation-BUcjsLeE.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-qqt70VYL.js.map → TabsNavigation-BUcjsLeE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-BqK_qiHX.js → TaskDrawer-BNvfS6dq.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-BqK_qiHX.js.map → TaskDrawer-BNvfS6dq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-u5_i0Rgh.js → TeamPage-CT-zNCrF.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-u5_i0Rgh.js.map → TeamPage-CT-zNCrF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-rUtC9e40.js → TerminalDashboardPage-DfZFGs8g.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-rUtC9e40.js.map → TerminalDashboardPage-DfZFGs8g.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-C3u8YNQF.js → archive-Cev1SaQq.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-C3u8YNQF.js.map → archive-Cev1SaQq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-DfQ998g5.js → archive-restore-BIVluaHZ.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-DfQ998g5.js.map → archive-restore-BIVluaHZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-BshJM9Po.js → arrow-right-DrivbS5j.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-BshJM9Po.js.map → arrow-right-DrivbS5j.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-D03qJyOZ.js → bookmark-plus-DKyzL0Xg.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-D03qJyOZ.js.map → bookmark-plus-DKyzL0Xg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-CyzWuwq0.js → bot-GBUkPAe3.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-CyzWuwq0.js.map → bot-GBUkPAe3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-BPgtyjsG.js → braces-BWhm2c4g.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-BPgtyjsG.js.map → braces-BWhm2c4g.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-Dix1AOmw.js → circle-stop-CBcZSKNp.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-Dix1AOmw.js.map → circle-stop-CBcZSKNp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-CCQ4Q0Zh.js → cpu-CzNmuTZD.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-CCQ4Q0Zh.js.map → cpu-CzNmuTZD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-BpTysg-Y.js → ellipsis-vertical-BoIyQKaI.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-BpTysg-Y.js.map → ellipsis-vertical-BoIyQKaI.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-DGY1rAZs.js → eye-BqxyhxQq.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-DGY1rAZs.js.map → eye-BqxyhxQq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-D8t3JfWG.js → eye-off-D9dTZP1A.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-D8t3JfWG.js.map → eye-off-D9dTZP1A.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-BAdJb0n8.js → file-json-CLYEUI6e.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-BAdJb0n8.js.map → file-json-CLYEUI6e.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DrJFiOUB.js → file-text-D5j9C5XC.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DrJFiOUB.js.map → file-text-D5j9C5XC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-CKqzYbz7.js → filter-CEUK5jsA.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-CKqzYbz7.js.map → filter-CEUK5jsA.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-CV8511y9.js → folder-BEOY8txM.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-CV8511y9.js.map → folder-BEOY8txM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-XKvmu_uU.js → gauge-CbumHmVn.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-XKvmu_uU.js.map → gauge-CbumHmVn.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-C56cDUzX.js → globe-D8_IB9gV.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-C56cDUzX.js.map → globe-D8_IB9gV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-Bya-suFW.js → grid-3x3-BpzWmYF5.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-Bya-suFW.js.map → grid-3x3-BpzWmYF5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-CmuTZpsB.js → hard-drive-QIHpGln7.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-CmuTZpsB.js.map → hard-drive-QIHpGln7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-CRPT_tJQ.js → hash-CP0YRHVs.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-CRPT_tJQ.js.map → hash-CP0YRHVs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-C1pJZQCL.js → history-hOjgVKax.js} +2 -2
- package/ccw/frontend/dist/assets/{history-C1pJZQCL.js.map → history-hOjgVKax.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Dmt9OiEf.js → index-B_ysvdnP.js} +2 -2
- package/ccw/frontend/dist/assets/{index-Dmt9OiEf.js.map → index-B_ysvdnP.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-dWT2M6Ef.js → index-C5Oqx2xI.js} +3 -3
- package/ccw/frontend/dist/assets/{index-dWT2M6Ef.js.map → index-C5Oqx2xI.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CI8-rBff.js → index-CJi0bWL-.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CI8-rBff.js.map → index-CJi0bWL-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-anSMmEF8.js → index-CdQpo1x0.js} +2 -2
- package/ccw/frontend/dist/assets/{index-anSMmEF8.js.map → index-CdQpo1x0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-TSO0BFQE.js → layout-grid-C38fQyLs.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-TSO0BFQE.js.map → layout-grid-C38fQyLs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-Caj6fIQD.js → lightbulb-CClbCUzu.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-Caj6fIQD.js.map → lightbulb-CClbCUzu.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-DE9lMxa-.js → link-2-CB-LKbI0.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-DE9lMxa-.js.map → link-2-CB-LKbI0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-BZtPgLW0.js → link-BK6SBzHS.js} +2 -2
- package/ccw/frontend/dist/assets/{link-BZtPgLW0.js.map → link-BK6SBzHS.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-DubWyY-U.js → list-BME_WOA_.js} +2 -2
- package/ccw/frontend/dist/assets/{list-DubWyY-U.js.map → list-BME_WOA_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-DwN_48AF.js → map-pin-ADsnCyjJ.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-DwN_48AF.js.map → map-pin-ADsnCyjJ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-bjxvaiM9.js → messages-square-CLflB1Cq.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-bjxvaiM9.js.map → messages-square-CLflB1Cq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-CGfBKD_V.js → minimize-2-B3ZNzfGr.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-CGfBKD_V.js.map → minimize-2-B3ZNzfGr.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-nzWY6ilt.js → package-CByPhtMG.js} +2 -2
- package/ccw/frontend/dist/assets/{package-nzWY6ilt.js.map → package-CByPhtMG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-CiLce49C.js → plug-BggRzPX9.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-CiLce49C.js.map → plug-BggRzPX9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-CFLmB-U9.js → power-CWuxQSJK.js} +2 -2
- package/ccw/frontend/dist/assets/{power-CFLmB-U9.js.map → power-CWuxQSJK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-DuO6OF0C.js → save-BdJ6EX4Q.js} +2 -2
- package/ccw/frontend/dist/assets/{save-DuO6OF0C.js.map → save-BdJ6EX4Q.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-CZk9p0mM.js → send-Ce9wuY7Q.js} +2 -2
- package/ccw/frontend/dist/assets/{send-CZk9p0mM.js.map → send-Ce9wuY7Q.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-BY_1YQQg.js → square-check-big-D6jItkfw.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-BY_1YQQg.js.map → square-check-big-D6jItkfw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-CnZgm6g-.js → square-pen-Byxq21zp.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-CnZgm6g-.js.map → square-pen-Byxq21zp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-Cn1F0qy7.js → star-Codj9dvK.js} +2 -2
- package/ccw/frontend/dist/assets/{star-Cn1F0qy7.js.map → star-Codj9dvK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-Dxs1iXCV.js → style-4bYpUGcc.js} +2 -2
- package/ccw/frontend/dist/assets/{style-Dxs1iXCV.js.map → style-4bYpUGcc.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-Bz1fLRKH.js → target-DKBoDNCn.js} +2 -2
- package/ccw/frontend/dist/assets/{target-Bz1fLRKH.js.map → target-DKBoDNCn.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-C6qCYlDr.js → test-tube-DTqZcBtA.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-C6qCYlDr.js.map → test-tube-DTqZcBtA.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-C71kd4Qs.js → upload-DlUl-e6b.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-C71kd4Qs.js.map → upload-DlUl-e6b.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-CqP2BAJ7.js → useApiSettings-D4zhKKT-.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-CqP2BAJ7.js.map → useApiSettings-D4zhKKT-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-PCoPoVeM.js → useCli-D-qDwsAH.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-PCoPoVeM.js.map → useCli-D-qDwsAH.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-3OfPQPw4.js → useCommands-B0sidbbW.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-3OfPQPw4.js.map → useCommands-B0sidbbW.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-bXiFhQx9.js → useDebounce-eTtbKevt.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-bXiFhQx9.js.map → useDebounce-eTtbKevt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-DEyUm46_.js → useFileExplorer-MGSK0h33.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-DEyUm46_.js.map → useFileExplorer-MGSK0h33.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-sXTrdxcJ.js → useLocale-DDNxU7pJ.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-sXTrdxcJ.js.map → useLocale-DDNxU7pJ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-D0W0kXYm.js → useSkills-CZCRBtMY.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-D0W0kXYm.js.map → useSkills-CZCRBtMY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-DZ-8lZsG.js → useSystemSettings-DfQEFXSD.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-DZ-8lZsG.js.map → useSystemSettings-DfQEFXSD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-83GmAYuw.js → wand-sparkles-DCLvfgl1.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-83GmAYuw.js.map → wand-sparkles-DCLvfgl1.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +1 -1
- package/.codex/skills/team-arch-opt/agents/completion-handler.md +0 -138
- package/.codex/skills/team-arch-opt/agents/fix-cycle-handler.md +0 -146
- package/.codex/skills/team-arch-opt/agents/plan-reviewer.md +0 -150
- package/.codex/skills/team-arch-opt/instructions/agent-instruction.md +0 -114
- package/.codex/skills/team-arch-opt/schemas/tasks-schema.md +0 -174
- package/.codex/skills/team-brainstorm/agents/gc-controller.md +0 -122
- package/.codex/skills/team-brainstorm/agents/topic-clarifier.md +0 -126
- package/.codex/skills/team-brainstorm/instructions/agent-instruction.md +0 -105
- package/.codex/skills/team-brainstorm/schemas/tasks-schema.md +0 -171
- package/.codex/skills/team-coordinate/agents/completion-handler.md +0 -127
- package/.codex/skills/team-coordinate/agents/plan-reviewer.md +0 -145
- package/.codex/skills/team-coordinate/instructions/agent-instruction.md +0 -184
- package/.codex/skills/team-coordinate/schemas/tasks-schema.md +0 -165
- package/.codex/skills/team-designer/agents/requirement-clarifier.md +0 -247
- package/.codex/skills/team-designer/agents/validation-reporter.md +0 -186
- package/.codex/skills/team-designer/instructions/agent-instruction.md +0 -163
- package/.codex/skills/team-designer/schemas/tasks-schema.md +0 -180
- package/.codex/skills/team-executor/instructions/agent-instruction.md +0 -62
- package/.codex/skills/team-executor/schemas/tasks-schema.md +0 -141
- package/.codex/skills/team-frontend/agents/completion-handler.md +0 -131
- package/.codex/skills/team-frontend/agents/qa-gate-reviewer.md +0 -153
- package/.codex/skills/team-frontend/instructions/agent-instruction.md +0 -197
- package/.codex/skills/team-frontend/schemas/tasks-schema.md +0 -188
- package/.codex/skills/team-frontend-debug/agents/completion-handler.md +0 -142
- package/.codex/skills/team-frontend-debug/agents/conditional-skip-gate.md +0 -130
- package/.codex/skills/team-frontend-debug/agents/iteration-handler.md +0 -120
- package/.codex/skills/team-frontend-debug/instructions/agent-instruction.md +0 -272
- package/.codex/skills/team-frontend-debug/schemas/tasks-schema.md +0 -198
- package/.codex/skills/team-issue/agents/reviewer.md +0 -204
- package/.codex/skills/team-issue/instructions/agent-instruction.md +0 -198
- package/.codex/skills/team-issue/schemas/tasks-schema.md +0 -198
- package/.codex/skills/team-iterdev/agents/gc-controller.md +0 -193
- package/.codex/skills/team-iterdev/agents/task-analyzer.md +0 -206
- package/.codex/skills/team-iterdev/instructions/agent-instruction.md +0 -118
- package/.codex/skills/team-iterdev/schemas/tasks-schema.md +0 -174
- package/.codex/skills/team-lifecycle/SKILL.md +0 -906
- package/.codex/skills/team-lifecycle/agents/analyst.md +0 -424
- package/.codex/skills/team-lifecycle/agents/architect.md +0 -274
- package/.codex/skills/team-lifecycle/agents/discuss-agent.md +0 -422
- package/.codex/skills/team-lifecycle/agents/executor.md +0 -423
- package/.codex/skills/team-lifecycle/agents/explore-agent.md +0 -471
- package/.codex/skills/team-lifecycle/agents/fe-developer.md +0 -239
- package/.codex/skills/team-lifecycle/agents/fe-qa.md +0 -357
- package/.codex/skills/team-lifecycle/agents/planner.md +0 -437
- package/.codex/skills/team-lifecycle/agents/reviewer.md +0 -483
- package/.codex/skills/team-lifecycle/agents/tester.md +0 -423
- package/.codex/skills/team-lifecycle/agents/writer.md +0 -502
- package/.codex/skills/team-lifecycle/phases/01-requirement-clarification.md +0 -209
- package/.codex/skills/team-lifecycle/phases/02-team-initialization.md +0 -263
- package/.codex/skills/team-lifecycle/phases/03-task-chain-creation.md +0 -251
- package/.codex/skills/team-lifecycle/phases/04-pipeline-coordination.md +0 -831
- package/.codex/skills/team-lifecycle/phases/05-completion-report.md +0 -309
- package/.codex/skills/team-lifecycle/specs/document-standards.md +0 -192
- package/.codex/skills/team-lifecycle/specs/quality-gates.md +0 -207
- package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +0 -165
- package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +0 -163
- package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +0 -182
- package/.codex/skills/team-perf-opt/agents/completion-handler.md +0 -141
- package/.codex/skills/team-perf-opt/agents/fix-cycle-handler.md +0 -156
- package/.codex/skills/team-perf-opt/agents/plan-reviewer.md +0 -150
- package/.codex/skills/team-perf-opt/instructions/agent-instruction.md +0 -122
- package/.codex/skills/team-perf-opt/schemas/tasks-schema.md +0 -174
- package/.codex/skills/team-planex/instructions/agent-instruction.md +0 -301
- package/.codex/skills/team-planex/schemas/tasks-schema.md +0 -198
- package/.codex/skills/team-planex-v2/SKILL.md +0 -652
- package/.codex/skills/team-planex-v2/instructions/agent-instruction.md +0 -193
- package/.codex/skills/team-planex-v2/schemas/tasks-schema.md +0 -206
- package/.codex/skills/team-quality-assurance/agents/executor.md +0 -192
- package/.codex/skills/team-quality-assurance/agents/gc-loop-handler.md +0 -163
- package/.codex/skills/team-quality-assurance/instructions/agent-instruction.md +0 -185
- package/.codex/skills/team-quality-assurance/schemas/tasks-schema.md +0 -190
- package/.codex/skills/team-review/agents/fixer.md +0 -360
- package/.codex/skills/team-review/instructions/agent-instruction.md +0 -102
- package/.codex/skills/team-review/schemas/tasks-schema.md +0 -143
- package/.codex/skills/team-roadmap-dev/agents/roadmap-discusser.md +0 -176
- package/.codex/skills/team-roadmap-dev/agents/roadmap-planner.md +0 -194
- package/.codex/skills/team-roadmap-dev/agents/roadmap-verifier.md +0 -221
- package/.codex/skills/team-roadmap-dev/instructions/executor-instruction.md +0 -55
- package/.codex/skills/team-roadmap-dev/schemas/tasks-schema.md +0 -144
- package/.codex/skills/team-tech-debt/agents/gc-loop-manager.md +0 -130
- package/.codex/skills/team-tech-debt/agents/plan-approver.md +0 -151
- package/.codex/skills/team-tech-debt/instructions/agent-instruction.md +0 -390
- package/.codex/skills/team-tech-debt/schemas/tasks-schema.md +0 -196
- package/.codex/skills/team-testing/agents/executor.md +0 -195
- package/.codex/skills/team-testing/agents/gc-loop-handler.md +0 -155
- package/.codex/skills/team-testing/instructions/agent-instruction.md +0 -142
- package/.codex/skills/team-testing/schemas/tasks-schema.md +0 -172
- package/.codex/skills/team-uidesign/agents/completion-handler.md +0 -177
- package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +0 -162
- package/.codex/skills/team-uidesign/instructions/agent-instruction.md +0 -509
- package/.codex/skills/team-uidesign/schemas/tasks-schema.md +0 -187
- package/.codex/skills/team-ultra-analyze/agents/discussion-feedback.md +0 -155
- package/.codex/skills/team-ultra-analyze/agents/topic-analyzer.md +0 -153
- package/.codex/skills/team-ultra-analyze/instructions/agent-instruction.md +0 -169
- package/.codex/skills/team-ultra-analyze/schemas/tasks-schema.md +0 -180
- package/.codex/skills/team-ux-improve/agents/ux-designer.md +0 -136
- package/.codex/skills/team-ux-improve/agents/ux-explorer.md +0 -158
- package/.codex/skills/team-ux-improve/agents/ux-tester.md +0 -174
- package/.codex/skills/team-ux-improve/instructions/ux-worker-instruction.md +0 -55
- package/.codex/skills/team-ux-improve/schemas/tasks-schema.md +0 -87
- /package/.codex/skills/{team-lifecycle/templates/architecture-doc.md → team-lifecycle-v4/templates/architecture.md} +0 -0
- /package/.codex/skills/{team-lifecycle/templates/epics-template.md → team-lifecycle-v4/templates/epics.md} +0 -0
- /package/.codex/skills/{team-lifecycle → team-lifecycle-v4}/templates/product-brief.md +0 -0
- /package/.codex/skills/{team-lifecycle/templates/requirements-prd.md → team-lifecycle-v4/templates/requirements.md} +0 -0
package/ccw/frontend/dist/assets/{HistoryPage-D0fYQZgc.js.map → HistoryPage-DzSvEAFe.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryPage-D0fYQZgc.js","sources":["../../../../node_modules/@tanstack/query-core/build/modern/infiniteQueryObserver.js","../../../../node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.js","../../../../node_modules/lucide-react/dist/esm/icons/arrow-down-up.js","../../../../node_modules/lucide-react/dist/esm/icons/coins.js","../../../../node_modules/lucide-react/dist/esm/icons/search-x.js","../../src/hooks/useAudit.ts","../../src/hooks/useCliExecution.ts","../../src/hooks/useHistory.ts","../../src/hooks/useNativeSessions.ts","../../src/components/shared/ConversationCard.tsx","../../src/hooks/useNativeSession.ts","../../src/lib/cli-tool-theme.ts","../../src/components/shared/CliStreamPanel.tsx","../../src/hooks/useNativeSessionByPath.ts","../../src/components/shared/SessionTimeline.tsx","../../src/components/shared/NativeSessionPanel.tsx","../../src/components/issue/hub/ObservabilityPanel.tsx","../../src/pages/HistoryPage.tsx"],"sourcesContent":["// src/infiniteQueryObserver.ts\nimport { QueryObserver } from \"./queryObserver.js\";\nimport {\n hasNextPage,\n hasPreviousPage,\n infiniteQueryBehavior\n} from \"./infiniteQueryBehavior.js\";\nvar InfiniteQueryObserver = class extends QueryObserver {\n constructor(client, options) {\n super(client, options);\n }\n bindMethods() {\n super.bindMethods();\n this.fetchNextPage = this.fetchNextPage.bind(this);\n this.fetchPreviousPage = this.fetchPreviousPage.bind(this);\n }\n setOptions(options) {\n super.setOptions({\n ...options,\n behavior: infiniteQueryBehavior()\n });\n }\n getOptimisticResult(options) {\n options.behavior = infiniteQueryBehavior();\n return super.getOptimisticResult(options);\n }\n fetchNextPage(options) {\n return this.fetch({\n ...options,\n meta: {\n fetchMore: { direction: \"forward\" }\n }\n });\n }\n fetchPreviousPage(options) {\n return this.fetch({\n ...options,\n meta: {\n fetchMore: { direction: \"backward\" }\n }\n });\n }\n createResult(query, options) {\n const { state } = query;\n const parentResult = super.createResult(query, options);\n const { isFetching, isRefetching, isError, isRefetchError } = parentResult;\n const fetchDirection = state.fetchMeta?.fetchMore?.direction;\n const isFetchNextPageError = isError && fetchDirection === \"forward\";\n const isFetchingNextPage = isFetching && fetchDirection === \"forward\";\n const isFetchPreviousPageError = isError && fetchDirection === \"backward\";\n const isFetchingPreviousPage = isFetching && fetchDirection === \"backward\";\n const result = {\n ...parentResult,\n fetchNextPage: this.fetchNextPage,\n fetchPreviousPage: this.fetchPreviousPage,\n hasNextPage: hasNextPage(options, state.data),\n hasPreviousPage: hasPreviousPage(options, state.data),\n isFetchNextPageError,\n isFetchingNextPage,\n isFetchPreviousPageError,\n isFetchingPreviousPage,\n isRefetchError: isRefetchError && !isFetchNextPageError && !isFetchPreviousPageError,\n isRefetching: isRefetching && !isFetchingNextPage && !isFetchingPreviousPage\n };\n return result;\n }\n};\nexport {\n InfiniteQueryObserver\n};\n//# sourceMappingURL=infiniteQueryObserver.js.map","\"use client\";\n\n// src/useInfiniteQuery.ts\nimport { InfiniteQueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useInfiniteQuery(options, queryClient) {\n return useBaseQuery(\n options,\n InfiniteQueryObserver,\n queryClient\n );\n}\nexport {\n useInfiniteQuery\n};\n//# sourceMappingURL=useInfiniteQuery.js.map","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ArrowDownUp = createLucideIcon(\"ArrowDownUp\", [\n [\"path\", { d: \"m3 16 4 4 4-4\", key: \"1co6wj\" }],\n [\"path\", { d: \"M7 20V4\", key: \"1yoxec\" }],\n [\"path\", { d: \"m21 8-4-4-4 4\", key: \"1c9v7m\" }],\n [\"path\", { d: \"M17 4v16\", key: \"7dpous\" }]\n]);\n\nexport { ArrowDownUp as default };\n//# sourceMappingURL=arrow-down-up.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Coins = createLucideIcon(\"Coins\", [\n [\"circle\", { cx: \"8\", cy: \"8\", r: \"6\", key: \"3yglwk\" }],\n [\"path\", { d: \"M18.09 10.37A6 6 0 1 1 10.34 18\", key: \"t5s6rm\" }],\n [\"path\", { d: \"M7 6h1v4\", key: \"1obek4\" }],\n [\"path\", { d: \"m16.71 13.88.7.71-2.82 2.82\", key: \"1rbuyh\" }]\n]);\n\nexport { Coins as default };\n//# sourceMappingURL=coins.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SearchX = createLucideIcon(\"SearchX\", [\n [\"path\", { d: \"m13.5 8.5-5 5\", key: \"1cs55j\" }],\n [\"path\", { d: \"m8.5 8.5 5 5\", key: \"a8mexj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"path\", { d: \"m21 21-4.3-4.3\", key: \"1qie3q\" }]\n]);\n\nexport { SearchX as default };\n//# sourceMappingURL=search-x.js.map\n","// ========================================\n// useAudit Hooks\n// ========================================\n// TanStack Query hooks for audit/observability APIs\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\nimport {\n fetchCliSessionAudit,\n type CliSessionAuditEventType,\n type CliSessionAuditListResponse,\n} from '@/lib/api';\n\nexport interface UseCliSessionAuditOptions {\n sessionKey?: string;\n type?: CliSessionAuditEventType | CliSessionAuditEventType[];\n q?: string;\n limit?: number;\n offset?: number;\n enabled?: boolean;\n}\n\nexport function useCliSessionAudit(\n options: UseCliSessionAuditOptions = {}\n): UseQueryResult<{ success: boolean; data: CliSessionAuditListResponse }> {\n const projectPath = useWorkflowStore(selectProjectPath);\n const enabled = (options.enabled ?? true) && !!projectPath;\n\n const typeParam = Array.isArray(options.type)\n ? options.type.join(',')\n : options.type;\n\n return useQuery({\n queryKey: projectPath\n ? workspaceQueryKeys.cliSessionAudit(projectPath, {\n sessionKey: options.sessionKey,\n type: typeParam,\n q: options.q,\n limit: options.limit,\n offset: options.offset,\n })\n : ['audit', 'cliSessions', 'no-project'],\n queryFn: () => fetchCliSessionAudit({\n projectPath: projectPath ?? undefined,\n sessionKey: options.sessionKey,\n type: options.type,\n q: options.q,\n limit: options.limit,\n offset: options.offset,\n }),\n enabled,\n staleTime: 10_000,\n retry: 1,\n });\n}\n\n","// ========================================\r\n// useCliExecution Hook\r\n// ========================================\r\n// TanStack Query hook for CLI execution details\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport {\r\n fetchExecutionDetail,\r\n type ConversationRecord,\r\n} from '../lib/api';\r\n\r\n// ========== Query Keys ==========\r\n\r\n/**\r\n * Query key factory for CLI execution queries\r\n */\r\nexport const cliExecutionKeys = {\r\n all: ['cliExecution'] as const,\r\n details: () => [...cliExecutionKeys.all, 'detail'] as const,\r\n detail: (id: string | null) => [...cliExecutionKeys.details(), id] as const,\r\n};\r\n\r\n// ========== Constants ==========\r\n\r\n/**\r\n * Default stale time: 5 minutes\r\n * Execution details don't change frequently after completion\r\n */\r\nconst STALE_TIME = 5 * 60 * 1000;\r\n\r\n/**\r\n * Cache time: 10 minutes\r\n * Keep cached data available for potential re-use\r\n */\r\nconst GC_TIME = 10 * 60 * 1000;\r\n\r\n// ========== Types ==========\r\n\r\nexport interface UseCliExecutionOptions {\r\n /** Override default stale time (ms) */\r\n staleTime?: number;\r\n /** Override default cache time (ms) */\r\n gcTime?: number;\r\n /** Enable/disable the query */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseCliExecutionReturn {\r\n /** Execution detail data */\r\n data: ConversationRecord | undefined;\r\n /** Loading state for initial fetch */\r\n isLoading: boolean;\r\n /** Fetching state (initial or refetch) */\r\n isFetching: boolean;\r\n /** Error object if query failed */\r\n error: Error | null;\r\n /** Manually refetch data */\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n// ========== Hook ==========\r\n\r\n/**\r\n * Hook for fetching CLI execution detail (conversation records)\r\n *\r\n * @param executionId - The CLI execution ID to fetch details for\r\n * @param options - Query options\r\n *\r\n * @example\r\n * ```tsx\r\n * const { data, isLoading, error } = useCliExecutionDetail('exec-123');\r\n * ```\r\n *\r\n * @remarks\r\n * - Query is disabled when executionId is null/undefined\r\n * - Data is cached for 5 minutes by default\r\n * - Auto-refetch is disabled (execution details don't change)\r\n */\r\nexport function useCliExecutionDetail(\r\n executionId: string | null,\r\n options: UseCliExecutionOptions = {}\r\n): UseCliExecutionReturn {\r\n const { staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n\r\n const query = useQuery<ConversationRecord>({\r\n queryKey: cliExecutionKeys.detail(executionId),\r\n queryFn: () => {\r\n if (!executionId) throw new Error('executionId is required');\r\n return fetchExecutionDetail(executionId);\r\n },\r\n enabled: !!executionId && enabled,\r\n staleTime,\r\n gcTime,\r\n refetchOnWindowFocus: false,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n data: query.data,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n };\r\n}\r\n","// ========================================\r\n// useHistory Hook\r\n// ========================================\r\n// TanStack Query hook for CLI execution history\r\n\r\nimport React from 'react';\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport {\r\n fetchHistory,\r\n deleteExecution,\r\n deleteExecutionsByTool,\r\n deleteAllHistory,\r\n type HistoryResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\nexport interface HistoryFilter {\r\n search?: string;\r\n tool?: string;\r\n}\r\n\r\n// Default stale time: 30 seconds\r\nconst STALE_TIME = 30 * 1000;\r\n\r\nexport interface UseHistoryOptions {\r\n /** Filter options */\r\n filter?: HistoryFilter;\r\n /** Override default stale time (ms) */\r\n staleTime?: number;\r\n /** Enable/disable the query */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseHistoryReturn {\r\n /** All executions data */\r\n executions: HistoryResponse['executions'];\r\n /** Loading state for initial fetch */\r\n isLoading: boolean;\r\n /** Fetching state (initial or refetch) */\r\n isFetching: boolean;\r\n /** Error object if query failed */\r\n error: Error | null;\r\n /** Manually refetch data */\r\n refetch: () => Promise<void>;\r\n /** Delete a single execution */\r\n deleteExecution: (id: string) => Promise<void>;\r\n /** Delete executions by tool */\r\n deleteByTool: (tool: string) => Promise<void>;\r\n /** Delete all history */\r\n deleteAll: () => Promise<void>;\r\n /** Is any mutation in progress */\r\n isDeleting: boolean;\r\n}\r\n\r\n/**\r\n * Hook for fetching CLI execution history\r\n *\r\n * @example\r\n * ```tsx\r\n * const { executions, isLoading, deleteExecution } = useHistory();\r\n * ```\r\n */\r\nexport function useHistory(options: UseHistoryOptions = {}): UseHistoryReturn {\r\n const { filter, staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n const queryEnabled = enabled && !!projectPath;\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.cliHistoryList(projectPath),\r\n queryFn: () => fetchHistory(projectPath),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n // Apply client-side filtering\r\n const executions = React.useMemo(() => {\r\n let executions = query.data?.executions ?? [];\r\n\r\n // Apply search filter\r\n if (filter?.search) {\r\n const searchLower = filter.search.toLowerCase();\r\n executions = executions.filter(\r\n (exec) => {\r\n // Guard against prompt_preview being an object instead of string\r\n const preview = typeof exec.prompt_preview === 'string'\r\n ? exec.prompt_preview\r\n : JSON.stringify(exec.prompt_preview);\r\n return preview.toLowerCase().includes(searchLower) ||\r\n exec.tool.toLowerCase().includes(searchLower);\r\n }\r\n );\r\n }\r\n\r\n // Apply tool filter\r\n if (filter?.tool) {\r\n executions = executions.filter((exec) => exec.tool === filter.tool);\r\n }\r\n\r\n return executions;\r\n }, [query.data, filter]);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n // Delete single execution\r\n const deleteSingleMutation = useMutation({\r\n mutationFn: deleteExecution,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.cliHistory(projectPath) });\r\n },\r\n });\r\n\r\n // Delete by tool\r\n const deleteByToolMutation = useMutation({\r\n mutationFn: deleteExecutionsByTool,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.cliHistory(projectPath) });\r\n },\r\n });\r\n\r\n // Delete all\r\n const deleteAllMutation = useMutation({\r\n mutationFn: deleteAllHistory,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.cliHistory(projectPath) });\r\n },\r\n });\r\n\r\n const isDeleting =\r\n deleteSingleMutation.isPending ||\r\n deleteByToolMutation.isPending ||\r\n deleteAllMutation.isPending;\r\n\r\n return {\r\n executions,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n deleteExecution: deleteSingleMutation.mutateAsync,\r\n deleteByTool: deleteByToolMutation.mutateAsync,\r\n deleteAll: deleteAllMutation.mutateAsync,\r\n isDeleting,\r\n };\r\n}\r\n","// ========================================\r\n// useNativeSessions Hook\r\n// ========================================\r\n// TanStack Query hook for native CLI sessions list\r\n\r\nimport React from 'react';\r\nimport { useQuery, useInfiniteQuery } from '@tanstack/react-query';\r\nimport {\r\n fetchNativeSessions,\r\n type NativeSessionListItem,\r\n type NativeSessionsListResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\n// ========== Constants ==========\r\n\r\nconst STALE_TIME = 2 * 60 * 1000; // 2 minutes (increased from 30s)\r\nconst GC_TIME = 10 * 60 * 1000; // 10 minutes (increased from 5min)\r\nconst PAGE_SIZE = 50; // Default page size for pagination\r\n\r\n// ========== Types ==========\r\n\r\nexport type NativeTool = 'gemini' | 'qwen' | 'codex' | 'claude' | 'opencode';\r\n\r\nexport interface UseNativeSessionsOptions {\r\n /** Filter by tool type */\r\n tool?: NativeTool;\r\n /** Override default stale time (ms) */\r\n staleTime?: number;\r\n /** Override default gc time (ms) */\r\n gcTime?: number;\r\n /** Enable/disable the query */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface ByToolRecord {\r\n [tool: string]: NativeSessionListItem[];\r\n}\r\n\r\nexport interface UseNativeSessionsReturn {\r\n /** All sessions data */\r\n sessions: NativeSessionListItem[];\r\n /** Sessions grouped by tool */\r\n byTool: ByToolRecord;\r\n /** Total count from API */\r\n count: number;\r\n /** Loading state for initial fetch */\r\n isLoading: boolean;\r\n /** Fetching state (initial or refetch) */\r\n isFetching: boolean;\r\n /** Error object if query failed */\r\n error: Error | null;\r\n /** Manually refetch data */\r\n refetch: () => Promise<void>;\r\n}\r\n\r\nexport interface UseNativeSessionsInfiniteReturn {\r\n /** All sessions data (flattened from all pages) */\r\n sessions: NativeSessionListItem[];\r\n /** Sessions grouped by tool */\r\n byTool: ByToolRecord;\r\n /** Total count from current pages */\r\n count: number;\r\n /** Loading state for initial fetch */\r\n isLoading: boolean;\r\n /** Fetching state (initial or refetch) */\r\n isFetching: boolean;\r\n /** Fetching next page */\r\n isFetchingNextPage: boolean;\r\n /** Whether there are more pages */\r\n hasNextPage: boolean;\r\n /** Error object if query failed */\r\n error: Error | null;\r\n /** Fetch next page */\r\n fetchNextPage: () => Promise<void>;\r\n /** Manually refetch data */\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n// ========== Helper Functions ==========\r\n\r\n/**\r\n * Group sessions by tool type\r\n */\r\nfunction groupByTool(sessions: NativeSessionListItem[]): ByToolRecord {\r\n return sessions.reduce<ByToolRecord>((acc, session) => {\r\n const tool = session.tool;\r\n if (!acc[tool]) {\r\n acc[tool] = [];\r\n }\r\n acc[tool].push(session);\r\n return acc;\r\n }, {});\r\n}\r\n\r\n// ========== Hook ==========\r\n\r\n/**\r\n * Hook for fetching native CLI sessions list\r\n *\r\n * @example\r\n * ```tsx\r\n * const { sessions, byTool, isLoading } = useNativeSessions();\r\n * const geminiSessions = byTool['gemini'] ?? [];\r\n * ```\r\n *\r\n * @example\r\n * ```tsx\r\n * // Filter by tool\r\n * const { sessions } = useNativeSessions({ tool: 'gemini' });\r\n * ```\r\n */\r\nexport function useNativeSessions(\r\n options: UseNativeSessionsOptions = {}\r\n): UseNativeSessionsReturn {\r\n const { tool, staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery<NativeSessionsListResponse>({\r\n queryKey: workspaceQueryKeys.nativeSessionsList(projectPath, tool),\r\n queryFn: () => fetchNativeSessions({ tool, project: projectPath, limit: 200 }),\r\n staleTime,\r\n gcTime,\r\n enabled,\r\n refetchOnWindowFocus: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n // Memoize sessions and byTool calculations\r\n const { sessions, byTool } = React.useMemo(() => {\r\n const sessions = query.data?.sessions ?? [];\r\n const byTool = query.data?.byTool ?? groupByTool(sessions);\r\n return { sessions, byTool };\r\n }, [query.data]);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n sessions,\r\n byTool,\r\n count: query.data?.count ?? 0,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n };\r\n}\r\n\r\n/**\r\n * Hook for fetching native CLI sessions with infinite scroll/pagination\r\n *\r\n * @example\r\n * ```tsx\r\n * const { sessions, fetchNextPage, hasNextPage, isFetchingNextPage } = useNativeSessionsInfinite();\r\n *\r\n * // Load more button\r\n * <button onClick={() => fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage}>\r\n * {isFetchingNextPage ? 'Loading...' : 'Load More'}\r\n * </button>\r\n * ```\r\n */\r\nexport function useNativeSessionsInfinite(\r\n options: UseNativeSessionsOptions = {}\r\n): UseNativeSessionsInfiniteReturn {\r\n const { tool, staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useInfiniteQuery<NativeSessionsListResponse>({\r\n queryKey: [...workspaceQueryKeys.nativeSessionsList(projectPath, tool), 'infinite'],\r\n queryFn: ({ pageParam }) => fetchNativeSessions({\r\n tool,\r\n project: projectPath,\r\n limit: PAGE_SIZE,\r\n cursor: pageParam as string | null,\r\n }),\r\n initialPageParam: null as string | null,\r\n getNextPageParam: (lastPage) => {\r\n if (!lastPage.hasMore || !lastPage.nextCursor) return undefined;\r\n return lastPage.nextCursor;\r\n },\r\n staleTime,\r\n gcTime,\r\n enabled,\r\n refetchOnWindowFocus: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n // Flatten all pages into a single array and group by tool\r\n const { sessions, byTool, count } = React.useMemo(() => {\r\n const allSessions = query.data?.pages.flatMap(page => page.sessions) ?? [];\r\n // Merge byTool from all pages\r\n const mergedByTool: ByToolRecord = {};\r\n for (const page of query.data?.pages ?? []) {\r\n for (const [toolKey, toolSessions] of Object.entries(page.byTool ?? {})) {\r\n if (!mergedByTool[toolKey]) {\r\n mergedByTool[toolKey] = [];\r\n }\r\n mergedByTool[toolKey].push(...toolSessions);\r\n }\r\n }\r\n return { sessions: allSessions, byTool: mergedByTool, count: allSessions.length };\r\n }, [query.data]);\r\n\r\n const fetchNextPage = async () => {\r\n await query.fetchNextPage();\r\n };\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n sessions,\r\n byTool,\r\n count,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n isFetchingNextPage: query.isFetchingNextPage,\r\n hasNextPage: query.hasNextPage,\r\n error: query.error,\r\n fetchNextPage,\r\n refetch,\r\n };\r\n}\r\n","// ========================================\r\n// ConversationCard Component\r\n// ========================================\r\n// Card component for displaying CLI execution history items\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { cn } from '@/lib/utils';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Button } from '@/components/ui/Button';\r\nimport {\r\n MoreVertical,\r\n Eye,\r\n Trash2,\r\n Copy,\r\n Clock,\r\n Timer,\r\n Hash,\r\n MessagesSquare,\r\n Folder,\r\n FileJson,\r\n} from 'lucide-react';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n} from '@/components/ui/Dropdown';\r\nimport type { CliExecution } from '@/lib/api';\r\n\r\nexport interface ConversationCardProps {\r\n /** Execution data */\r\n execution: CliExecution;\r\n /** Called when view action is triggered */\r\n onView?: (execution: CliExecution) => void;\r\n /** Called when view native session is triggered */\r\n onViewNative?: (execution: CliExecution) => void;\r\n /** Called when delete action is triggered */\r\n onDelete?: (id: string) => void;\r\n /** Called when card is clicked */\r\n onClick?: (execution: CliExecution) => void;\r\n /** Optional className */\r\n className?: string;\r\n /** Disabled state for actions */\r\n actionsDisabled?: boolean;\r\n}\r\n\r\n// Status configuration\r\nconst statusConfig = {\r\n success: {\r\n variant: 'success' as const,\r\n icon: 'check-circle',\r\n },\r\n error: {\r\n variant: 'destructive' as const,\r\n icon: 'x-circle',\r\n },\r\n timeout: {\r\n variant: 'warning' as const,\r\n icon: 'clock',\r\n },\r\n};\r\n\r\n/**\r\n * Format duration to human readable string\r\n */\r\nfunction formatDuration(ms: number): string {\r\n const seconds = Math.floor(ms / 1000);\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n const remainingSeconds = seconds % 60;\r\n return `${minutes}m ${remainingSeconds}s`;\r\n}\r\n\r\n/**\r\n * Hook to get localized time ago string\r\n */\r\nfunction useTimeAgo() {\r\n const { formatMessage } = useIntl();\r\n\r\n return React.useCallback((dateString: string): string => {\r\n const date = new Date(dateString);\r\n const now = new Date();\r\n const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);\r\n\r\n if (seconds < 60) return formatMessage({ id: 'common.time.justNow' });\r\n const minutes = Math.floor(seconds / 60);\r\n if (minutes < 60) return formatMessage({ id: 'common.time.minutesAgo' }, { count: minutes });\r\n const hours = Math.floor(minutes / 60);\r\n if (hours < 24) return formatMessage({ id: 'common.time.hoursAgo' }, { count: hours });\r\n const days = Math.floor(hours / 24);\r\n return formatMessage({ id: 'common.time.daysAgo' }, { count: days });\r\n }, [formatMessage]);\r\n}\r\n\r\n/**\r\n * ConversationCard component for displaying CLI execution history\r\n */\r\nexport function ConversationCard({\r\n execution,\r\n onView,\r\n onViewNative,\r\n onDelete,\r\n onClick,\r\n className,\r\n actionsDisabled = false,\r\n}: ConversationCardProps) {\r\n const { formatMessage } = useIntl();\r\n const getTimeAgo = useTimeAgo();\r\n const [copied, setCopied] = React.useState(false);\r\n\r\n const status = statusConfig[execution.status] || statusConfig.error;\r\n\r\n const handleCopyId = async (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n await navigator.clipboard.writeText(execution.id);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch {\r\n console.error('Failed to copy ID');\r\n }\r\n };\r\n\r\n const handleCardClick = (e: React.MouseEvent) => {\r\n // Don't trigger if clicking on dropdown\r\n if ((e.target as HTMLElement).closest('[data-radix-popper-content-wrapper]')) {\r\n return;\r\n }\r\n onClick?.(execution);\r\n };\r\n\r\n const handleAction = (\r\n e: React.MouseEvent,\r\n action: 'view' | 'delete' | 'copy'\r\n ) => {\r\n e.stopPropagation();\r\n switch (action) {\r\n case 'view':\r\n onView?.(execution);\r\n break;\r\n case 'delete':\r\n onDelete?.(execution.id);\r\n break;\r\n case 'copy':\r\n handleCopyId(e);\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <Card\r\n className={cn(\r\n 'group cursor-pointer transition-all duration-200 hover:shadow-md',\r\n className\r\n )}\r\n onClick={handleCardClick}\r\n >\r\n <CardContent className=\"p-4\">\r\n <div className=\"flex items-start gap-3\">\r\n {/* Main content */}\r\n <div className=\"flex-1 min-w-0\">\r\n {/* Header row */}\r\n <div className=\"flex flex-wrap items-center gap-2 mb-2\">\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n {execution.tool}\r\n </Badge>\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {execution.mode || 'analysis'}\r\n </Badge>\r\n {execution.turn_count && execution.turn_count > 1 && (\r\n <Badge variant=\"info\" className=\"gap-1 text-xs\">\r\n <MessagesSquare className=\"h-3 w-3\" />\r\n {execution.turn_count}\r\n </Badge>\r\n )}\r\n {execution.sourceDir && execution.sourceDir !== '.' && (\r\n <Badge variant=\"outline\" className=\"gap-1 text-xs\">\r\n <Folder className=\"h-3 w-3\" />\r\n {execution.sourceDir}\r\n </Badge>\r\n )}\r\n {execution.hasNativeSession && (\r\n <Badge variant=\"outline\" className=\"gap-1 text-xs\">\r\n <FileJson className=\"h-3 w-3\" />\r\n {formatMessage({ id: 'history.badge.native' })}\r\n </Badge>\r\n )}\r\n <Badge variant={status.variant} className=\"gap-1 text-xs ml-auto\">\r\n {status.icon === 'check-circle' && '✓'}\r\n {status.icon === 'x-circle' && '✗'}\r\n {status.icon === 'clock' && '⏱'}\r\n {execution.status}\r\n </Badge>\r\n </div>\r\n\r\n {/* Prompt preview */}\r\n <p className=\"text-sm text-foreground line-clamp-2 mb-2\">\r\n {typeof execution.prompt_preview === 'string'\r\n ? execution.prompt_preview\r\n : JSON.stringify(execution.prompt_preview)}\r\n </p>\r\n\r\n {/* Meta info */}\r\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {getTimeAgo(execution.timestamp)}\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <Timer className=\"h-3 w-3\" />\r\n {formatDuration(execution.duration_ms)}\r\n </span>\r\n <span className=\"flex items-center gap-1 font-mono\" title={execution.id}>\r\n <Hash className=\"h-3 w-3\" />\r\n {execution.id.substring(0, 8)}...\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Actions dropdown */}\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity\"\r\n onClick={(e) => e.stopPropagation()}\r\n disabled={actionsDisabled}\r\n >\r\n <MoreVertical className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">{formatMessage({ id: 'common.aria.actions' })}</span>\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuItem onClick={(e) => handleAction(e, 'copy')}>\r\n <Copy className=\"mr-2 h-4 w-4\" />\r\n {copied\r\n ? formatMessage({ id: 'history.actions.copied' })\r\n : formatMessage({ id: 'history.actions.copyId' })}\r\n </DropdownMenuItem>\r\n <DropdownMenuItem onClick={(e) => handleAction(e, 'view')}>\r\n <Eye className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'history.actions.view' })}\r\n </DropdownMenuItem>\r\n {execution.hasNativeSession && (\r\n <DropdownMenuItem onClick={(e) => { e.stopPropagation(); onViewNative?.(execution); }}>\r\n <FileJson className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'history.actions.viewNative', defaultMessage: 'View Native Session' })}\r\n </DropdownMenuItem>\r\n )}\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem\r\n onClick={(e) => handleAction(e, 'delete')}\r\n className=\"text-destructive focus:text-destructive\"\r\n >\r\n <Trash2 className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'history.actions.delete' })}\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n","// ========================================\r\n// useNativeSession Hook\r\n// ========================================\r\n// TanStack Query hook for native CLI session content\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport {\r\n fetchNativeSession,\r\n type NativeSession,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\n// ========== Query Keys ==========\r\n\r\nexport const nativeSessionKeys = {\r\n all: ['nativeSession'] as const,\r\n details: () => [...nativeSessionKeys.all, 'detail'] as const,\r\n detail: (id: string | null) => [...nativeSessionKeys.details(), id] as const,\r\n};\r\n\r\n// ========== Constants ==========\r\n\r\nconst STALE_TIME = 5 * 60 * 1000;\r\nconst GC_TIME = 10 * 60 * 1000;\r\n\r\n// ========== Types ==========\r\n\r\nexport interface UseNativeSessionOptions {\r\n staleTime?: number;\r\n gcTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseNativeSessionReturn {\r\n data: NativeSession | undefined;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n// ========== Hook ==========\r\n\r\n/**\r\n * Hook for fetching native CLI session content\r\n *\r\n * @param executionId - The CCW execution ID to fetch native session for\r\n * @param options - Query options\r\n */\r\nexport function useNativeSession(\r\n executionId: string | null,\r\n options: UseNativeSessionOptions = {}\r\n): UseNativeSessionReturn {\r\n const { staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery<NativeSession>({\r\n queryKey: nativeSessionKeys.detail(executionId),\r\n queryFn: () => {\r\n if (!executionId) throw new Error('executionId is required');\r\n return fetchNativeSession(executionId, projectPath);\r\n },\r\n enabled: !!executionId && enabled,\r\n staleTime,\r\n gcTime,\r\n refetchOnWindowFocus: false,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n data: query.data,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n };\r\n}\r\n","// ========================================\n// CLI Tool Theme Configuration\n// ========================================\n// Centralized theme configuration for CLI tools (gemini, codex, qwen, opencode)\n// Used for Badge variants, icons, and color theming across components\n\nimport type { LucideIcon } from 'lucide-react';\nimport { Sparkles, Code, Brain, Terminal, Cpu } from 'lucide-react';\n\n// ========== Types ==========\n\nexport type BadgeVariant = 'default' | 'secondary' | 'outline' | 'success' | 'warning' | 'info' | 'destructive';\n\nexport interface CliToolTheme {\n /** Badge variant for UI components */\n variant: BadgeVariant;\n /** Lucide icon name */\n icon: LucideIcon;\n /** Color theme (used for CSS classes) */\n color: 'blue' | 'green' | 'amber' | 'gray' | 'purple';\n /** Human-readable display name */\n displayName: string;\n /** Short label for compact display */\n shortLabel: string;\n}\n\n// ========== Tool Theme Configuration ==========\n\n/**\n * Theme configuration for each supported CLI tool\n * Maps tool ID to visual theme properties\n */\nexport const CLI_TOOL_THEMES: Record<string, CliToolTheme> = {\n gemini: {\n variant: 'info',\n icon: Sparkles,\n color: 'blue',\n displayName: 'Gemini',\n shortLabel: 'GEM',\n },\n codex: {\n variant: 'success',\n icon: Code,\n color: 'green',\n displayName: 'Codex',\n shortLabel: 'CDX',\n },\n qwen: {\n variant: 'warning',\n icon: Brain,\n color: 'amber',\n displayName: 'Qwen',\n shortLabel: 'QWN',\n },\n opencode: {\n variant: 'secondary',\n icon: Terminal,\n color: 'gray',\n displayName: 'OpenCode',\n shortLabel: 'OPC',\n },\n claude: {\n variant: 'default',\n icon: Cpu,\n color: 'purple',\n displayName: 'Claude',\n shortLabel: 'CLD',\n },\n};\n\n/**\n * Default theme for unknown tools\n */\nexport const DEFAULT_TOOL_THEME: CliToolTheme = {\n variant: 'secondary',\n icon: Terminal,\n color: 'gray',\n displayName: 'CLI',\n shortLabel: 'CLI',\n};\n\n// ========== Helper Functions ==========\n\n/**\n * Get theme configuration for a CLI tool\n * Falls back to default theme for unknown tools\n *\n * @param tool - Tool identifier (e.g., 'gemini', 'codex', 'qwen')\n * @returns Theme configuration for the tool\n */\nexport function getToolTheme(tool: string): CliToolTheme {\n const normalizedTool = tool.toLowerCase().trim();\n return CLI_TOOL_THEMES[normalizedTool] || DEFAULT_TOOL_THEME;\n}\n\n/**\n * Get Badge variant for a CLI tool\n * Used for tool badges in UI components\n *\n * @param tool - Tool identifier\n * @returns Badge variant\n */\nexport function getToolVariant(tool: string): BadgeVariant {\n return getToolTheme(tool).variant;\n}\n\n/**\n * Get icon component for a CLI tool\n *\n * @param tool - Tool identifier\n * @returns Lucide icon component\n */\nexport function getToolIcon(tool: string): LucideIcon {\n return getToolTheme(tool).icon;\n}\n\n/**\n * Get color class for a CLI tool\n * Returns a Tailwind CSS color class prefix\n *\n * @param tool - Tool identifier\n * @returns Color class prefix (e.g., 'text-blue-500')\n */\nexport function getToolColorClass(tool: string, shade: number = 500): string {\n const color = getToolTheme(tool).color;\n const colorMap: Record<string, string> = {\n blue: 'blue',\n green: 'green',\n amber: 'amber',\n gray: 'gray',\n purple: 'purple',\n };\n return `text-${colorMap[color] || 'gray'}-${shade}`;\n}\n\n/**\n * Get background color class for a CLI tool\n *\n * @param tool - Tool identifier\n * @returns Background color class (e.g., 'bg-blue-100')\n */\nexport function getToolBgClass(tool: string, shade: number = 100): string {\n const color = getToolTheme(tool).color;\n const colorMap: Record<string, string> = {\n blue: 'blue',\n green: 'green',\n amber: 'amber',\n gray: 'gray',\n purple: 'purple',\n };\n return `bg-${colorMap[color] || 'gray'}-${shade}`;\n}\n\n/**\n * Check if a tool is a known CLI tool\n *\n * @param tool - Tool identifier\n * @returns Whether the tool is known\n */\nexport function isKnownTool(tool: string): boolean {\n return tool.toLowerCase().trim() in CLI_TOOL_THEMES;\n}\n\n/**\n * Get all known tool identifiers\n *\n * @returns Array of known tool IDs\n */\nexport function getKnownTools(): string[] {\n return Object.keys(CLI_TOOL_THEMES);\n}\n","// ========================================\r\n// CliStreamPanel Component\r\n// ========================================\r\n// Turn-based CLI execution detail view\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { User, Bot, AlertTriangle, Info, Layers, Clock, Copy, Terminal, Hash, Calendar, CheckCircle2, XCircle, Timer, ChevronDown, ChevronRight, FileJson, Brain, Wrench, Coins, Loader2 } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Card } from '@/components/ui/Card';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '@/components/ui/Dialog';\r\nimport { useCliExecutionDetail } from '@/hooks/useCliExecution';\r\nimport { useNativeSession } from '@/hooks/useNativeSession';\r\nimport type { ConversationRecord, ConversationTurn, NativeSessionTurn, NativeTokenInfo, NativeToolCall } from '@/lib/api';\r\nimport { getToolVariant } from '@/lib/cli-tool-theme';\r\n\r\ntype ViewMode = 'per-turn' | 'concatenated' | 'native';\r\ntype ConcatFormat = 'plain' | 'yaml' | 'json';\r\n\r\nexport interface CliStreamPanelProps {\r\n executionId: string;\r\n sourceDir?: string;\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n}\r\n\r\n// ========== Types ==========\r\n\r\ninterface TurnSectionProps {\r\n turn: ConversationTurn;\r\n isLatest: boolean;\r\n isExpanded: boolean;\r\n onToggle: () => void;\r\n}\r\n\r\ninterface ConcatenatedViewProps {\r\n prompt: string;\r\n format: ConcatFormat;\r\n onFormatChange: (fmt: ConcatFormat) => void;\r\n}\r\n\r\n// ========== Helpers ==========\r\n\r\n/**\r\n * Format duration to human readable string\r\n */\r\nfunction formatDuration(ms: number): string {\r\n if (ms < 1000) return `${ms}ms`;\r\n const seconds = (ms / 1000).toFixed(1);\r\n return `${seconds}s`;\r\n}\r\n\r\n/**\r\n * Get status icon and color for a turn\r\n */\r\nfunction getStatusInfo(status: string) {\r\n const statusMap = {\r\n success: { icon: CheckCircle2, color: 'text-green-600 dark:text-green-400' },\r\n error: { icon: XCircle, color: 'text-destructive' },\r\n timeout: { icon: Timer, color: 'text-warning' },\r\n };\r\n return statusMap[status as keyof typeof statusMap] || statusMap.error;\r\n}\r\n\r\n/**\r\n * Ensure prompt is a string (handle legacy object data)\r\n */\r\nfunction ensureString(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n if (value && typeof value === 'object') return JSON.stringify(value);\r\n return String(value ?? '');\r\n}\r\n\r\n/**\r\n * Build concatenated prompt in specified format\r\n */\r\nfunction buildConcatenatedPrompt(execution: ConversationRecord, format: ConcatFormat, formatMessage: (message: { id: string }) => string): string {\r\n const turns = execution.turns;\r\n\r\n if (format === 'plain') {\r\n const parts: string[] = [];\r\n parts.push(`=== ${formatMessage({ id: 'cli-manager.streamPanel.conversationHistory' })} ===`);\r\n parts.push('');\r\n\r\n for (const turn of turns) {\r\n parts.push(`--- Turn ${turn.turn} ---`);\r\n parts.push('USER:');\r\n parts.push(ensureString(turn.prompt));\r\n parts.push('');\r\n parts.push('ASSISTANT:');\r\n parts.push(turn.output.stdout || formatMessage({ id: 'cli-manager.streamPanel.noOutput' }));\r\n parts.push('');\r\n }\r\n\r\n parts.push(`=== ${formatMessage({ id: 'cli-manager.streamPanel.newRequest' })} ===`);\r\n parts.push('');\r\n parts.push(formatMessage({ id: 'cli-manager.streamPanel.yourNextPrompt' }));\r\n\r\n return parts.join('\\n');\r\n }\r\n\r\n if (format === 'yaml') {\r\n const yaml: string[] = [];\r\n yaml.push('conversation:');\r\n yaml.push(' turns:');\r\n\r\n for (const turn of turns) {\r\n yaml.push(` - turn: ${turn.turn}`);\r\n yaml.push(` timestamp: ${turn.timestamp}`);\r\n yaml.push(` prompt: |`);\r\n ensureString(turn.prompt).split('\\n').forEach(line => {\r\n yaml.push(` ${line}`);\r\n });\r\n yaml.push(` response: |`);\r\n const output = turn.output.stdout || '';\r\n if (output) {\r\n output.split('\\n').forEach(line => {\r\n yaml.push(` ${line}`);\r\n });\r\n } else {\r\n yaml.push(` ${formatMessage({ id: 'cli-manager.streamPanel.noOutput' })}`);\r\n }\r\n }\r\n\r\n return yaml.join('\\n');\r\n }\r\n\r\n // JSON format\r\n return JSON.stringify(\r\n turns.map((t) => ({\r\n turn: t.turn,\r\n timestamp: t.timestamp,\r\n prompt: ensureString(t.prompt),\r\n response: t.output.stdout || '',\r\n })),\r\n null,\r\n 2\r\n );\r\n}\r\n\r\n// ========== Sub-Components ==========\r\n\r\n/**\r\n * TurnSection - Single turn display with collapsible content\r\n */\r\nfunction TurnSection({ turn, isLatest, isExpanded, onToggle }: TurnSectionProps) {\r\n const { formatMessage } = useIntl();\r\n const StatusIcon = getStatusInfo(turn.status as string).icon;\r\n const statusColor = getStatusInfo(turn.status as string).color;\r\n\r\n return (\r\n <Card\r\n className={cn(\r\n 'overflow-hidden transition-all',\r\n isLatest && 'ring-2 ring-primary/50 shadow-md'\r\n )}\r\n >\r\n {/* Turn Header - Clickable for expand/collapse */}\r\n <div\r\n className=\"flex items-center justify-between px-4 py-3 bg-muted/50 border-b cursor-pointer hover:bg-muted/70 transition-colors\"\r\n onClick={onToggle}\r\n role=\"button\"\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onToggle(); }}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <span className=\"font-semibold text-sm\">{formatMessage({ id: 'cli.details.turn' })} {turn.turn}</span>\r\n {isLatest && (\r\n <Badge variant=\"default\" className=\"text-xs h-5 px-1.5\">\r\n {formatMessage({ id: 'cli-manager.streamPanel.latest' })}\r\n </Badge>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'cli.details.timestamp' })}>\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(turn.timestamp).toLocaleTimeString()}\r\n </span>\r\n <span className={cn('flex items-center gap-1 font-medium', statusColor)} title={formatMessage({ id: 'cli.details.status' })}>\r\n <StatusIcon className=\"h-3.5 w-3.5\" />\r\n {turn.status}\r\n </span>\r\n <span className=\"font-mono text-xs\" title={formatMessage({ id: 'cli.details.duration' })}>\r\n {formatDuration(turn.duration_ms)}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Turn Body - Collapsible */}\r\n {isExpanded && (\r\n <div className=\"p-4 space-y-4\">\r\n {/* User Prompt */}\r\n <div>\r\n <h4 className=\"flex items-center gap-2 text-sm font-semibold mb-2 text-foreground\">\r\n <User className=\"h-4 w-4 text-primary\" aria-hidden=\"true\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.userPrompt' })}\r\n </h4>\r\n <pre className=\"p-3 bg-muted/50 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed\">\r\n {ensureString(turn.prompt)}\r\n </pre>\r\n </div>\r\n\r\n {/* Assistant Response */}\r\n {turn.output.stdout && (\r\n <div>\r\n <h4 className=\"flex items-center gap-2 text-sm font-semibold mb-2 text-foreground\">\r\n <Bot className=\"h-4 w-4 text-blue-500\" aria-hidden=\"true\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.assistantResponse' })}\r\n </h4>\r\n <pre className=\"p-3 bg-blue-500/5 dark:bg-blue-500/10 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed\">\r\n {turn.output.stdout}\r\n </pre>\r\n </div>\r\n )}\r\n\r\n {/* Errors */}\r\n {turn.output.stderr && (\r\n <div>\r\n <h4 className=\"flex items-center gap-2 text-sm font-semibold mb-2 text-destructive\">\r\n <AlertTriangle className=\"h-4 w-4\" aria-hidden=\"true\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.errors' })}\r\n </h4>\r\n <pre className=\"p-3 bg-destructive/10 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed text-destructive\">\r\n {turn.output.stderr}\r\n </pre>\r\n </div>\r\n )}\r\n\r\n {/* Truncated Notice */}\r\n {turn.output.truncated && (\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground p-3 bg-muted/50 rounded-lg border border-border/50\">\r\n <Info className=\"h-4 w-4 flex-shrink-0\" aria-hidden=\"true\" />\r\n <span>{formatMessage({ id: 'cli-manager.streamPanel.truncatedNotice' })}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </Card>\r\n );\r\n}\r\n\r\n/**\r\n * PerTurnView - Display all turns with collapsible sections\r\n * Default behavior: only latest turn is expanded, others are collapsed\r\n */\r\nfunction PerTurnView({ turns }: { turns: ConversationTurn[] }) {\r\n // Default: only the latest turn is expanded\r\n const [expandedTurns, setExpandedTurns] = React.useState<Set<number>>(() => {\r\n if (turns.length === 0) return new Set();\r\n return new Set([turns[turns.length - 1].turn]);\r\n });\r\n\r\n const handleToggle = React.useCallback((turnNumber: number) => {\r\n setExpandedTurns((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(turnNumber)) {\r\n next.delete(turnNumber);\r\n } else {\r\n next.add(turnNumber);\r\n }\r\n return next;\r\n });\r\n }, []);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {turns.map((turn, idx) => (\r\n <React.Fragment key={turn.turn}>\r\n <TurnSection\r\n turn={turn}\r\n isLatest={idx === turns.length - 1}\r\n isExpanded={expandedTurns.has(turn.turn)}\r\n onToggle={() => handleToggle(turn.turn)}\r\n />\r\n {/* Connector line between turns */}\r\n {idx < turns.length - 1 && (\r\n <div className=\"flex justify-center\" aria-hidden=\"true\">\r\n <div className=\"w-px h-6 bg-border\" />\r\n </div>\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * ConcatenatedView - Display all turns merged into a single prompt\r\n */\r\nfunction ConcatenatedView({ prompt, format, onFormatChange }: ConcatenatedViewProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h4 className=\"flex items-center gap-2 text-sm font-semibold\">\r\n <Layers className=\"h-4 w-4\" aria-hidden=\"true\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.concatenatedPrompt' })}\r\n </h4>\r\n <div className=\"flex gap-2\">\r\n {(['plain', 'yaml', 'json'] as const).map((fmt) => (\r\n <Button\r\n key={fmt}\r\n size=\"sm\"\r\n variant={format === fmt ? 'default' : 'outline'}\r\n onClick={() => onFormatChange(fmt)}\r\n className=\"h-7 px-2 text-xs\"\r\n >\r\n {fmt.toUpperCase()}\r\n </Button>\r\n ))}\r\n </div>\r\n </div>\r\n <pre className=\"p-4 bg-muted/50 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-[60vh] overflow-y-auto\">\r\n {prompt}\r\n </pre>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Native View Components ==========\r\n\r\n/**\r\n * Format token count with compact notation\r\n */\r\nfunction formatTokenCount(count: number | undefined): string {\r\n if (count == null || count === 0) return '0';\r\n if (count >= 1_000_000) return `${(count / 1_000_000).toFixed(1)}M`;\r\n if (count >= 1_000) return `${(count / 1_000).toFixed(1)}K`;\r\n return count.toLocaleString();\r\n}\r\n\r\n/**\r\n * NativeTokenDisplay - Compact token info line\r\n */\r\nfunction NativeTokenDisplay({ tokens, className }: { tokens: NativeTokenInfo; className?: string }) {\r\n return (\r\n <div className={cn('flex items-center gap-3 text-xs text-muted-foreground', className)}>\r\n <span className=\"flex items-center gap-1\" title=\"Total tokens\">\r\n <Coins className=\"h-3 w-3\" />\r\n {formatTokenCount(tokens.total)}\r\n </span>\r\n {tokens.input != null && (\r\n <span title=\"Input tokens\">in: {formatTokenCount(tokens.input)}</span>\r\n )}\r\n {tokens.output != null && (\r\n <span title=\"Output tokens\">out: {formatTokenCount(tokens.output)}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * NativeToolCallItem - Single tool call display\r\n */\r\nfunction NativeToolCallItem({ toolCall, index }: { toolCall: NativeToolCall; index: number }) {\r\n return (\r\n <details className=\"group/tool border border-border/50 rounded-md overflow-hidden\">\r\n <summary className=\"flex items-center gap-2 px-3 py-2 text-xs cursor-pointer hover:bg-muted/50 select-none\">\r\n <Wrench className=\"h-3 w-3 text-muted-foreground flex-shrink-0\" />\r\n <span className=\"font-mono font-medium\">{toolCall.name}</span>\r\n <span className=\"text-muted-foreground\">#{index + 1}</span>\r\n </summary>\r\n <div className=\"border-t border-border/50 divide-y divide-border/50\">\r\n {toolCall.arguments && (\r\n <div className=\"p-3\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">Input</p>\r\n <pre className=\"p-2 bg-muted/30 rounded text-xs whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-40 overflow-y-auto\">\r\n {toolCall.arguments}\r\n </pre>\r\n </div>\r\n )}\r\n {toolCall.output && (\r\n <div className=\"p-3\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">Output</p>\r\n <pre className=\"p-2 bg-muted/30 rounded text-xs whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-40 overflow-y-auto\">\r\n {toolCall.output}\r\n </pre>\r\n </div>\r\n )}\r\n </div>\r\n </details>\r\n );\r\n}\r\n\r\ninterface NativeTurnCardProps {\r\n turn: NativeSessionTurn;\r\n isLatest: boolean;\r\n isExpanded: boolean;\r\n onToggle: () => void;\r\n}\r\n\r\n/**\r\n * NativeTurnCard - Single native conversation turn with collapsible content\r\n */\r\nfunction NativeTurnCard({ turn, isLatest, isExpanded, onToggle }: NativeTurnCardProps) {\r\n const { formatMessage } = useIntl();\r\n const isUser = turn.role === 'user';\r\n const RoleIcon = isUser ? User : Bot;\r\n\r\n return (\r\n <Card\r\n className={cn(\r\n 'overflow-hidden transition-all',\r\n isUser ? 'bg-muted/30' : 'bg-blue-500/5 dark:bg-blue-500/10',\r\n isLatest && 'ring-2 ring-primary/50 shadow-md'\r\n )}\r\n >\r\n {/* Header - Clickable */}\r\n <div\r\n className=\"flex items-center justify-between px-4 py-3 border-b border-border/50 cursor-pointer hover:bg-muted/30 transition-colors\"\r\n onClick={onToggle}\r\n role=\"button\"\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onToggle(); }}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <RoleIcon className={cn('h-4 w-4', isUser ? 'text-primary' : 'text-blue-500')} />\r\n <span className=\"font-semibold text-sm capitalize\">{turn.role}</span>\r\n <span className=\"text-xs text-muted-foreground\">#{turn.turnNumber}</span>\r\n {isLatest && (\r\n <Badge variant=\"default\" className=\"text-xs h-5 px-1.5\">\r\n {formatMessage({ id: 'cli-manager.streamPanel.latest' })}\r\n </Badge>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\r\n {turn.timestamp && (\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(turn.timestamp).toLocaleTimeString()}\r\n </span>\r\n )}\r\n {turn.tokens && <NativeTokenDisplay tokens={turn.tokens} />}\r\n </div>\r\n </div>\r\n\r\n {/* Content - Collapsible */}\r\n {isExpanded && (\r\n <div className=\"p-4 space-y-3\">\r\n {turn.content && (\r\n <pre className=\"p-3 bg-background/50 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-80 overflow-y-auto\">\r\n {ensureString(turn.content)}\r\n </pre>\r\n )}\r\n\r\n {/* Thoughts Section */}\r\n {turn.thoughts && turn.thoughts.length > 0 && (\r\n <details className=\"group/thoughts\" open>\r\n <summary className=\"flex items-center gap-2 text-sm cursor-pointer hover:text-foreground text-muted-foreground select-none py-1\">\r\n <Brain className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">Thoughts</span>\r\n <span className=\"text-xs\">({turn.thoughts.length})</span>\r\n </summary>\r\n <ul className=\"mt-2 space-y-1 pl-6 text-sm text-muted-foreground list-disc\">\r\n {turn.thoughts.map((thought, i) => (\r\n <li key={i} className=\"leading-relaxed\">{thought}</li>\r\n ))}\r\n </ul>\r\n </details>\r\n )}\r\n\r\n {/* Tool Calls Section */}\r\n {turn.toolCalls && turn.toolCalls.length > 0 && (\r\n <details className=\"group/calls\">\r\n <summary className=\"flex items-center gap-2 text-sm cursor-pointer hover:text-foreground text-muted-foreground select-none py-1\">\r\n <Wrench className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">Tool Calls</span>\r\n <span className=\"text-xs\">({turn.toolCalls.length})</span>\r\n </summary>\r\n <div className=\"mt-2 space-y-2\">\r\n {turn.toolCalls.map((tc, i) => (\r\n <NativeToolCallItem key={i} toolCall={tc} index={i} />\r\n ))}\r\n </div>\r\n </details>\r\n )}\r\n </div>\r\n )}\r\n </Card>\r\n );\r\n}\r\n\r\ninterface NativeTurnViewProps {\r\n turns: NativeSessionTurn[];\r\n}\r\n\r\n/**\r\n * NativeTurnView - Display native session turns with collapsible cards\r\n */\r\nfunction NativeTurnView({ turns }: NativeTurnViewProps) {\r\n // Default: only the latest turn is expanded\r\n const [expandedTurns, setExpandedTurns] = React.useState<Set<number>>(() => {\r\n if (turns.length === 0) return new Set();\r\n return new Set([turns[turns.length - 1].turnNumber]);\r\n });\r\n\r\n const handleToggle = React.useCallback((turnNumber: number) => {\r\n setExpandedTurns((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(turnNumber)) {\r\n next.delete(turnNumber);\r\n } else {\r\n next.add(turnNumber);\r\n }\r\n return next;\r\n });\r\n }, []);\r\n\r\n if (turns.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8 text-muted-foreground\">\r\n No native session data available\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {turns.map((turn, idx) => (\r\n <React.Fragment key={turn.turnNumber}>\r\n <NativeTurnCard\r\n turn={turn}\r\n isLatest={idx === turns.length - 1}\r\n isExpanded={expandedTurns.has(turn.turnNumber)}\r\n onToggle={() => handleToggle(turn.turnNumber)}\r\n />\r\n {idx < turns.length - 1 && (\r\n <div className=\"flex justify-center\" aria-hidden=\"true\">\r\n <div className=\"w-px h-4 bg-border\" />\r\n </div>\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * CliStreamPanel component - Elegant turn-based conversation view\r\n *\r\n * Displays CLI execution details with:\r\n * - Per-turn view with collapsible timeline layout\r\n * - Concatenated view for resume context\r\n * - Native view for detailed CLI session data\r\n * - Format selection (Plain/YAML/JSON)\r\n */\r\nexport function CliStreamPanel({\r\n executionId,\r\n sourceDir: _sourceDir,\r\n open,\r\n onOpenChange,\r\n}: CliStreamPanelProps) {\r\n const { formatMessage } = useIntl();\r\n const [viewMode, setViewMode] = React.useState<ViewMode>('per-turn');\r\n const [concatFormat, setConcatFormat] = React.useState<ConcatFormat>('plain');\r\n\r\n const { data: execution, isLoading } = useCliExecutionDetail(open ? executionId : null);\r\n\r\n // Load native session only when native view is selected\r\n const { data: nativeSession, isLoading: nativeLoading } = useNativeSession(\r\n viewMode === 'native' && open ? executionId : null\r\n );\r\n\r\n // Build concatenated prompt\r\n const concatenatedPrompt = React.useMemo(() => {\r\n if (!execution?.turns) return '';\r\n return buildConcatenatedPrompt(execution, concatFormat, formatMessage);\r\n }, [execution, concatFormat, formatMessage]);\r\n\r\n // Copy to clipboard\r\n const copyToClipboard = React.useCallback(\r\n async (text: string, label: string) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n // Optional: add toast notification here\r\n console.log(`Copied ${label} to clipboard`);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n },\r\n []\r\n );\r\n\r\n // Calculate total duration\r\n const totalDuration = React.useMemo(() => {\r\n if (!execution?.turns) return 0;\r\n return execution.turns.reduce((sum, t) => sum + t.duration_ms, 0);\r\n }, [execution]);\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-4xl max-h-[85vh] overflow-hidden flex flex-col p-0\">\r\n <DialogHeader className=\"px-6 pt-6 pb-4 border-b shrink-0\">\r\n <div className=\"flex items-center justify-between pr-8\">\r\n <DialogTitle className=\"flex items-center gap-2\">\r\n <Terminal className=\"h-5 w-5\" />\r\n {formatMessage({ id: 'cli-manager.executionDetails' })}\r\n </DialogTitle>\r\n {execution && (\r\n <div className=\"flex items-center gap-2\">\r\n <Badge variant={getToolVariant(execution.tool)} title={formatMessage({ id: 'cli.details.tool' })}>\r\n {execution.tool.toUpperCase()}\r\n </Badge>\r\n {execution.mode && <Badge variant=\"secondary\" title={formatMessage({ id: 'cli.details.mode' })}>{execution.mode}</Badge>}\r\n <span className=\"text-sm text-muted-foreground font-mono\" title={formatMessage({ id: 'cli.details.duration' })}>\r\n {formatDuration(totalDuration)}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n {execution && (\r\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground mt-2\">\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'cli.details.created' })}>\r\n <Calendar className=\"h-3 w-3\" />\r\n {new Date(execution.created_at).toLocaleString()}\r\n </span>\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'cli.details.id' })}>\r\n <Hash className=\"h-3 w-3\" />\r\n {execution.id.slice(0, 8)}\r\n </span>\r\n <span>{execution.turn_count} {formatMessage({ id: 'cli-manager.streamPanel.turns' })}</span>\r\n </div>\r\n )}\r\n </DialogHeader>\r\n\r\n {isLoading ? (\r\n <div className=\"flex-1 flex items-center justify-center\">\r\n <div className=\"text-muted-foreground\">{formatMessage({ id: 'cli-manager.streamPanel.loading' })}</div>\r\n </div>\r\n ) : execution?.turns && execution.turns.length > 0 ? (\r\n <>\r\n {/* View Toggle - Show for all conversations */}\r\n <div className=\"flex items-center gap-2 px-6 py-3 border-b shrink-0\">\r\n <Button\r\n size=\"sm\"\r\n variant={viewMode === 'per-turn' ? 'default' : 'outline'}\r\n onClick={() => setViewMode('per-turn')}\r\n className=\"h-8\"\r\n >\r\n <Layers className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.perTurnView' })}\r\n </Button>\r\n {execution.turns.length > 1 && (\r\n <Button\r\n size=\"sm\"\r\n variant={viewMode === 'concatenated' ? 'default' : 'outline'}\r\n onClick={() => setViewMode('concatenated')}\r\n className=\"h-8\"\r\n >\r\n <Copy className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.concatenatedView' })}\r\n </Button>\r\n )}\r\n <Button\r\n size=\"sm\"\r\n variant={viewMode === 'native' ? 'default' : 'outline'}\r\n onClick={() => setViewMode('native')}\r\n className=\"h-8\"\r\n >\r\n <FileJson className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.nativeView' })}\r\n </Button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\r\n {viewMode === 'per-turn' ? (\r\n <PerTurnView turns={execution.turns} />\r\n ) : viewMode === 'concatenated' ? (\r\n <ConcatenatedView\r\n prompt={concatenatedPrompt}\r\n format={concatFormat}\r\n onFormatChange={setConcatFormat}\r\n />\r\n ) : viewMode === 'native' ? (\r\n nativeLoading ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"h-5 w-5 animate-spin mr-2\" />\r\n <span className=\"text-muted-foreground\">Loading native session...</span>\r\n </div>\r\n ) : nativeSession ? (\r\n <NativeTurnView turns={nativeSession.turns} />\r\n ) : (\r\n <div className=\"flex items-center justify-center py-8 text-muted-foreground\">\r\n No native session data available\r\n </div>\r\n )\r\n ) : null}\r\n </div>\r\n\r\n {/* Footer Actions */}\r\n <div className=\"flex items-center gap-2 px-6 py-4 border-t bg-muted/30 shrink-0\">\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n onClick={() => copyToClipboard(execution.id, 'ID')}\r\n className=\"h-8\"\r\n >\r\n <Copy className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.copyId' })}\r\n </Button>\r\n {execution.turns.length > 1 && viewMode === 'concatenated' && (\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n onClick={() => copyToClipboard(concatenatedPrompt, 'prompt')}\r\n className=\"h-8\"\r\n >\r\n <Copy className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.copyPrompt' })}\r\n </Button>\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"flex-1 flex items-center justify-center text-muted-foreground\">\r\n {formatMessage({ id: 'cli-manager.streamPanel.noDetails' })}\r\n </div>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n","// ========================================\r\n// useNativeSessionByPath Hook\r\n// ========================================\r\n// TanStack Query hook for native CLI session content by file path\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport {\r\n fetchNativeSessionWithOptions,\r\n type NativeSession,\r\n} from '../lib/api';\r\n\r\n// ========== Query Keys ==========\r\n\r\nexport const nativeSessionPathKeys = {\r\n all: ['nativeSessionPath'] as const,\r\n details: () => [...nativeSessionPathKeys.all, 'detail'] as const,\r\n detail: (filePath: string | null) => [...nativeSessionPathKeys.details(), filePath] as const,\r\n};\r\n\r\n// ========== Constants ==========\r\n\r\nconst STALE_TIME = 5 * 60 * 1000; // 5 minutes\r\nconst GC_TIME = 30 * 60 * 1000; // 30 minutes\r\n\r\n// ========== Types ==========\r\n\r\nexport interface UseNativeSessionByPathOptions {\r\n staleTime?: number;\r\n gcTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseNativeSessionByPathReturn {\r\n data: NativeSession | undefined;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n// ========== Hook ==========\r\n\r\n/**\r\n * Hook for fetching native CLI session content by file path\r\n *\r\n * @param filePath - The file path to the session file\r\n * @param tool - The tool type (gemini, qwen, codex, claude, opencode)\r\n * @param options - Query options\r\n */\r\nexport function useNativeSessionByPath(\r\n filePath: string | null,\r\n tool?: string,\r\n options: UseNativeSessionByPathOptions = {}\r\n): UseNativeSessionByPathReturn {\r\n const { staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n\r\n const query = useQuery<NativeSession>({\r\n queryKey: nativeSessionPathKeys.detail(filePath),\r\n queryFn: () => {\r\n if (!filePath) throw new Error('filePath is required');\r\n return fetchNativeSessionWithOptions({\r\n filePath,\r\n tool: tool as 'gemini' | 'qwen' | 'codex' | 'claude' | 'opencode' | undefined,\r\n }) as Promise<NativeSession>;\r\n },\r\n enabled: !!filePath && enabled,\r\n staleTime,\r\n gcTime,\r\n refetchOnWindowFocus: false,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n data: query.data,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n };\r\n}\r\n","// ========================================\r\n// SessionTimeline Component\r\n// ========================================\r\n// Timeline visualization for native CLI session turns, tokens, and tool calls\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n User,\r\n Bot,\r\n Brain,\r\n Wrench,\r\n Coins,\r\n Clock,\r\n ChevronDown,\r\n ChevronRight,\r\n Archive,\r\n ArrowDownUp,\r\n CheckCircle,\r\n XCircle,\r\n Loader2,\r\n} from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport type {\r\n NativeSession,\r\n NativeSessionTurn,\r\n NativeTokenInfo,\r\n NativeToolCall,\r\n} from '@/lib/api';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface SessionTimelineProps {\r\n session: NativeSession;\r\n className?: string;\r\n}\r\n\r\ninterface TurnNodeProps {\r\n turn: NativeSessionTurn;\r\n isLatest: boolean;\r\n isLast: boolean;\r\n}\r\n\r\ninterface TokenBarProps {\r\n tokens: NativeTokenInfo;\r\n className?: string;\r\n}\r\n\r\ninterface ToolCallPanelProps {\r\n toolCall: NativeToolCall;\r\n index: number;\r\n}\r\n\r\n// ========== Helpers ==========\r\n\r\n/**\r\n * Ensure content is a string (handle legacy object data like {text: \"...\"})\r\n */\r\nfunction ensureString(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n if (value && typeof value === 'object') return JSON.stringify(value);\r\n return String(value ?? '');\r\n}\r\n\r\n/**\r\n * Format token number with compact notation\r\n */\r\nfunction formatTokenCount(count: number | undefined): string {\r\n if (count == null || count === 0) return '0';\r\n if (count >= 1_000_000) return `${(count / 1_000_000).toFixed(1)}M`;\r\n if (count >= 1_000) return `${(count / 1_000).toFixed(1)}K`;\r\n return count.toLocaleString();\r\n}\r\n\r\n/**\r\n * Get status icon for tool call\r\n */\r\nfunction getToolStatusIcon(status?: string): React.ReactNode {\r\n switch (status) {\r\n case 'completed':\r\n case 'success':\r\n return <CheckCircle className=\"h-3.5 w-3.5 text-green-500\" />;\r\n case 'error':\r\n case 'failed':\r\n return <XCircle className=\"h-3.5 w-3.5 text-destructive\" />;\r\n case 'running':\r\n case 'pending':\r\n return <Loader2 className=\"h-3.5 w-3.5 text-blue-500 animate-spin\" />;\r\n default:\r\n return <Wrench className=\"h-3.5 w-3.5 text-muted-foreground\" />;\r\n }\r\n}\r\n\r\n/**\r\n * Get badge variant for tool call status\r\n */\r\nfunction getStatusVariant(status?: string): 'default' | 'secondary' | 'outline' | 'success' | 'warning' | 'info' {\r\n switch (status) {\r\n case 'completed':\r\n case 'success':\r\n return 'success';\r\n case 'error':\r\n case 'failed':\r\n return 'warning';\r\n case 'running':\r\n case 'pending':\r\n return 'info';\r\n default:\r\n return 'secondary';\r\n }\r\n}\r\n\r\n// ========== Sub-Components ==========\r\n\r\n/**\r\n * TokenBar - Horizontal stacked bar for token usage\r\n */\r\nfunction TokenBar({ tokens, className }: TokenBarProps) {\r\n const { formatMessage } = useIntl();\r\n const total = tokens.total || 0;\r\n const input = tokens.input || 0;\r\n const output = tokens.output || 0;\r\n const cached = tokens.cached || 0;\r\n\r\n // Calculate percentages\r\n const inputPercent = total > 0 ? (input / total) * 100 : 0;\r\n const outputPercent = total > 0 ? (output / total) * 100 : 0;\r\n const cachedPercent = total > 0 ? (cached / total) * 100 : 0;\r\n\r\n return (\r\n <div className={cn('space-y-1.5', className)}>\r\n {/* Visual bar */}\r\n <div className=\"flex h-2 w-full rounded-full overflow-hidden bg-muted\">\r\n {input > 0 && (\r\n <div\r\n className=\"bg-blue-500/80\"\r\n style={{ width: `${inputPercent}%` }}\r\n title={formatMessage({ id: 'nativeSession.timeline.tokens.input', defaultMessage: 'Input: {count}' }, { count: formatTokenCount(input) })}\r\n />\r\n )}\r\n {output > 0 && (\r\n <div\r\n className=\"bg-green-500/80\"\r\n style={{ width: `${outputPercent}%` }}\r\n title={formatMessage({ id: 'nativeSession.timeline.tokens.output', defaultMessage: 'Output: {count}' }, { count: formatTokenCount(output) })}\r\n />\r\n )}\r\n {cached > 0 && (\r\n <div\r\n className=\"bg-amber-500/80\"\r\n style={{ width: `${cachedPercent}%` }}\r\n title={formatMessage({ id: 'nativeSession.timeline.tokens.cached', defaultMessage: 'Cached: {count}' }, { count: formatTokenCount(cached) })}\r\n />\r\n )}\r\n </div>\r\n {/* Labels */}\r\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\">\r\n <Coins className=\"h-3 w-3\" />\r\n {formatTokenCount(total)}\r\n </span>\r\n {input > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <ArrowDownUp className=\"h-3 w-3 text-blue-500\" />\r\n {formatTokenCount(input)}\r\n </span>\r\n )}\r\n {output > 0 && (\r\n <span className=\"text-green-600 dark:text-green-400\">\r\n out: {formatTokenCount(output)}\r\n </span>\r\n )}\r\n {cached > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <Archive className=\"h-3 w-3 text-amber-500\" />\r\n {formatTokenCount(cached)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * ToolCallPanel - Collapsible panel for tool call details\r\n */\r\nfunction ToolCallPanel({ toolCall, index }: ToolCallPanelProps) {\r\n const { formatMessage } = useIntl();\r\n const [isExpanded, setIsExpanded] = React.useState(false);\r\n\r\n return (\r\n <div className=\"border border-border/50 rounded-lg overflow-hidden\">\r\n {/* Header */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n className=\"w-full flex items-center justify-between px-3 py-2.5 text-sm hover:bg-muted/50 transition-colors\"\r\n aria-expanded={isExpanded}\r\n aria-controls={`toolcall-panel-${toolCall.name}-${index}`}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <span aria-label={toolCall.output ? 'Tool completed' : 'Tool status unknown'}>\r\n {getToolStatusIcon(toolCall.output ? 'completed' : undefined)}\r\n </span>\r\n <span className=\"font-mono font-medium\">{toolCall.name}</span>\r\n <span className=\"text-muted-foreground text-xs\">#{index + 1}</span>\r\n </div>\r\n <Badge variant={getStatusVariant(toolCall.output ? 'completed' : undefined)} className=\"text-xs\">\r\n {formatMessage({ id: 'nativeSession.timeline.toolCall.completed', defaultMessage: 'completed' })}\r\n </Badge>\r\n </button>\r\n\r\n {/* Collapsible content */}\r\n {isExpanded && (\r\n <div\r\n id={`toolcall-panel-${toolCall.name}-${index}`}\r\n className=\"border-t border-border/50 divide-y divide-border/50\"\r\n >\r\n {toolCall.arguments && (\r\n <div className=\"p-3\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-1.5\">\r\n {formatMessage({ id: 'nativeSession.toolCall.input', defaultMessage: 'Input' })}\r\n </p>\r\n <pre className=\"p-2.5 bg-muted/30 rounded-md text-xs whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-48 overflow-y-auto\">\r\n {toolCall.arguments}\r\n </pre>\r\n </div>\r\n )}\r\n {toolCall.output && (\r\n <div className=\"p-3\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-1.5\">\r\n {formatMessage({ id: 'nativeSession.toolCall.output', defaultMessage: 'Output' })}\r\n </p>\r\n <pre className=\"p-2.5 bg-muted/30 rounded-md text-xs whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-48 overflow-y-auto\">\r\n {toolCall.output}\r\n </pre>\r\n </div>\r\n )}\r\n {!toolCall.arguments && !toolCall.output && (\r\n <div className=\"p-3 text-xs text-muted-foreground italic\">\r\n {formatMessage({ id: 'nativeSession.timeline.toolCall.noData', defaultMessage: 'No data available' })}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * TurnNode - Single conversation turn on the timeline\r\n */\r\nfunction TurnNode({ turn, isLatest, isLast }: TurnNodeProps) {\r\n const { formatMessage } = useIntl();\r\n const isUser = turn.role === 'user';\r\n const RoleIcon = isUser ? User : Bot;\r\n\r\n return (\r\n <div className=\"flex gap-4\">\r\n {/* Timeline column */}\r\n <div className=\"flex flex-col items-center\">\r\n {/* Node dot */}\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center w-8 h-8 rounded-full border-2 shrink-0',\r\n isUser\r\n ? 'bg-primary/10 border-primary text-primary'\r\n : 'bg-blue-500/10 border-blue-500 text-blue-500',\r\n isLatest && 'ring-2 ring-offset-2 ring-offset-background',\r\n isLatest && (isUser ? 'ring-primary/50' : 'ring-blue-500/50')\r\n )}\r\n >\r\n <RoleIcon className=\"h-4 w-4\" />\r\n </div>\r\n {/* Vertical connector line */}\r\n {!isLast && (\r\n <div className=\"w-0.5 flex-1 bg-border min-h-4\" aria-hidden=\"true\" />\r\n )}\r\n </div>\r\n\r\n {/* Content column */}\r\n <div className=\"flex-1 pb-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className={cn(\r\n 'font-semibold text-sm capitalize',\r\n isUser ? 'text-primary' : 'text-blue-500'\r\n )}>\r\n {turn.role}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formatMessage(\r\n { id: 'nativeSession.timeline.turnNumber', defaultMessage: 'Turn #{number}' },\r\n { number: turn.turnNumber }\r\n )}\r\n </span>\r\n {isLatest && (\r\n <Badge variant=\"default\" className=\"text-xs h-5 px-1.5\">\r\n {formatMessage({ id: 'nativeSession.turn.latest', defaultMessage: 'Latest' })}\r\n </Badge>\r\n )}\r\n </div>\r\n {turn.timestamp && (\r\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(turn.timestamp).toLocaleTimeString()}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Content card */}\r\n <div\r\n className={cn(\r\n 'rounded-lg border overflow-hidden',\r\n isUser\r\n ? 'bg-muted/30 border-border'\r\n : 'bg-blue-500/5 dark:bg-blue-500/10 border-blue-500/20'\r\n )}\r\n >\r\n {/* Message content */}\r\n {turn.content && (\r\n <div className=\"p-4\">\r\n <pre className=\"text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-64 overflow-y-auto\">\r\n {ensureString(turn.content)}\r\n </pre>\r\n </div>\r\n )}\r\n\r\n {/* Thoughts section */}\r\n {turn.thoughts && turn.thoughts.length > 0 && (\r\n <details className=\"group/thoughts border-t border-border/50\">\r\n <summary className=\"flex items-center gap-2 px-4 py-2.5 text-sm cursor-pointer hover:bg-muted/30 select-none\">\r\n <Brain className=\"h-4 w-4 text-purple-500\" />\r\n <span className=\"font-medium text-muted-foreground\">\r\n {formatMessage({ id: 'nativeSession.turn.thoughts', defaultMessage: 'Thoughts' })}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n ({turn.thoughts.length})\r\n </span>\r\n </summary>\r\n <ul className=\"px-4 pb-3 space-y-1 text-sm text-muted-foreground list-disc list-inside\">\r\n {turn.thoughts.map((thought, i) => (\r\n <li key={`thought-${turn.turnNumber}-${i}`} className=\"leading-relaxed pl-2\">{thought}</li>\r\n ))}\r\n </ul>\r\n </details>\r\n )}\r\n\r\n {/* Tool calls section */}\r\n {turn.toolCalls && turn.toolCalls.length > 0 && (\r\n <div className=\"border-t border-border/50 p-4 space-y-2\">\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground mb-2\">\r\n <Wrench className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">\r\n {formatMessage({ id: 'nativeSession.turn.toolCalls', defaultMessage: 'Tool Calls' })}\r\n </span>\r\n <span className=\"text-xs\">({turn.toolCalls.length})</span>\r\n </div>\r\n {turn.toolCalls.map((tc, i) => (\r\n <ToolCallPanel key={`toolcall-${turn.turnNumber}-${tc.name}-${i}`} toolCall={tc} index={i} />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Token usage bar */}\r\n {turn.tokens && (\r\n <div className=\"border-t border-border/50 px-4 py-3\">\r\n <TokenBar tokens={turn.tokens} />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * SessionTimeline - Timeline visualization for native CLI sessions\r\n *\r\n * Displays conversation turns in a vertical timeline layout with:\r\n * - Left side: Timeline nodes with role icons\r\n * - Right side: Content cards with messages, thoughts, and tool calls\r\n * - Token usage bars with stacked input/output/cached visualization\r\n * - Collapsible tool call panels\r\n */\r\nexport function SessionTimeline({ session, className }: SessionTimelineProps) {\r\n const { formatMessage } = useIntl();\r\n const turns = session.turns || [];\r\n\r\n return (\r\n <div className={cn('space-y-0', className)}>\r\n {/* Session token summary bar */}\r\n {session.totalTokens && (\r\n <div className=\"mb-6 p-4 rounded-lg bg-muted/30 border\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\r\n {formatMessage({ id: 'nativeSession.tokenSummary', defaultMessage: 'Total Tokens' })}\r\n </p>\r\n <TokenBar tokens={session.totalTokens} />\r\n </div>\r\n )}\r\n\r\n {/* Timeline turns */}\r\n {turns.length > 0 ? (\r\n <div className=\"relative\">\r\n {turns.map((turn, idx) => (\r\n <TurnNode\r\n key={turn.turnNumber}\r\n turn={turn}\r\n isLatest={idx === turns.length - 1}\r\n isLast={idx === turns.length - 1}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\r\n {formatMessage({ id: 'nativeSession.empty', defaultMessage: 'No session data available' })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default SessionTimeline;\r\n","// ========================================\r\n// NativeSessionPanel Component\r\n// ========================================\r\n// Dialog for displaying native CLI session content (Gemini/Codex/Qwen)\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Copy,\r\n Clock,\r\n Hash,\r\n FolderOpen,\r\n FileJson,\r\n Loader2,\r\n AlertCircle,\r\n} from 'lucide-react';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '@/components/ui/Dialog';\r\nimport { useNativeSession } from '@/hooks/useNativeSession';\r\nimport { useNativeSessionByPath } from '@/hooks/useNativeSessionByPath';\r\nimport { SessionTimeline } from './SessionTimeline';\r\nimport { getToolVariant } from '@/lib/cli-tool-theme';\r\nimport type { NativeSessionListItem } from '@/lib/api';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface NativeSessionPanelProps {\r\n /** Legacy: CCW execution ID for lookup */\r\n executionId?: string;\r\n /** New: Session metadata with path for direct file loading */\r\n session?: NativeSessionListItem | null;\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n}\r\n\r\n// ========== Helpers ==========\r\n\r\n/**\r\n * Truncate a string to a max length with ellipsis\r\n */\r\nfunction truncate(str: string, maxLen: number): string {\r\n if (str.length <= maxLen) return str;\r\n return str.slice(0, maxLen) + '...';\r\n}\r\n\r\n/**\r\n * Copy text to clipboard\r\n */\r\nasync function copyToClipboard(text: string): Promise<boolean> {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * NativeSessionPanel - Dialog for displaying native CLI session content\r\n *\r\n * Shows session metadata, token summary, and all conversation turns\r\n * with thoughts and tool calls for Gemini/Codex/Qwen native sessions.\r\n *\r\n * Supports two modes:\r\n * - executionId: Look up session via CCW database\r\n * - session: Load session directly from file path\r\n */\r\nexport function NativeSessionPanel({\r\n executionId,\r\n session,\r\n open,\r\n onOpenChange,\r\n}: NativeSessionPanelProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n // Use appropriate hook based on what's provided\r\n // Priority: session (path-based) > executionId (lookup-based)\r\n const pathBasedResult = useNativeSessionByPath(\r\n open && session ? session.filePath : null,\r\n session?.tool\r\n );\r\n\r\n const idBasedResult = useNativeSession(\r\n open && !session && executionId ? executionId : null\r\n );\r\n\r\n // Determine which result to use\r\n const { data, isLoading, error } = session\r\n ? pathBasedResult\r\n : idBasedResult;\r\n\r\n const [copiedField, setCopiedField] = React.useState<string | null>(null);\r\n\r\n const handleCopy = React.useCallback(async (text: string, field: string) => {\r\n const ok = await copyToClipboard(text);\r\n if (ok) {\r\n setCopiedField(field);\r\n setTimeout(() => setCopiedField(null), 2000);\r\n }\r\n }, []);\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-4xl max-h-[85vh] overflow-hidden flex flex-col p-0\">\r\n <DialogHeader className=\"px-6 pt-6 pb-4 border-b shrink-0\">\r\n <div className=\"flex items-center justify-between pr-8\">\r\n <DialogTitle className=\"flex items-center gap-2\">\r\n <FileJson className=\"h-5 w-5\" />\r\n {formatMessage({ id: 'nativeSession.title', defaultMessage: 'Native Session' })}\r\n </DialogTitle>\r\n {(data || session) && (\r\n <div className=\"flex items-center gap-2\">\r\n <Badge variant={getToolVariant(data?.tool || session?.tool || 'claude')}>\r\n {(data?.tool || session?.tool || 'unknown').toUpperCase()}\r\n </Badge>\r\n {data?.model && (\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n {data.model}\r\n </Badge>\r\n )}\r\n {(data?.sessionId || session?.sessionId) && (\r\n <span\r\n className=\"text-xs text-muted-foreground font-mono\"\r\n title={data?.sessionId || session?.sessionId}\r\n >\r\n {truncate(data?.sessionId || session?.sessionId || '', 16)}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n {(data || session) && (\r\n <div className=\"flex flex-wrap items-center gap-4 text-xs text-muted-foreground mt-2\">\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'nativeSession.meta.startTime', defaultMessage: 'Start time' })}>\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(data?.startTime || session?.createdAt || '').toLocaleString()}\r\n </span>\r\n {(data?.workingDir || session?.projectHash) && (\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'nativeSession.meta.workingDir', defaultMessage: 'Working directory' })}>\r\n <FolderOpen className=\"h-3 w-3\" />\r\n <span className=\"font-mono max-w-48 truncate\">{data?.workingDir || session?.projectHash}</span>\r\n </span>\r\n )}\r\n {data?.projectHash && (\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'nativeSession.meta.projectHash', defaultMessage: 'Project hash' })}>\r\n <Hash className=\"h-3 w-3\" />\r\n <span className=\"font-mono\">{truncate(data.projectHash, 12)}</span>\r\n </span>\r\n )}\r\n {data && <span>{data.turns.length} {formatMessage({ id: 'nativeSession.meta.turns', defaultMessage: 'turns' })}</span>}\r\n </div>\r\n )}\r\n </DialogHeader>\r\n\r\n {/* Content Area with SessionTimeline */}\r\n {isLoading ? (\r\n <div className=\"flex-1 flex items-center justify-center py-16\">\r\n <div className=\"flex items-center gap-2 text-muted-foreground\">\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n <span>{formatMessage({ id: 'nativeSession.loading', defaultMessage: 'Loading session...' })}</span>\r\n </div>\r\n </div>\r\n ) : error ? (\r\n <div className=\"flex-1 flex flex-col items-center justify-center py-16 gap-3\">\r\n <div className=\"flex items-center gap-2 text-destructive\">\r\n <AlertCircle className=\"h-5 w-5\" />\r\n <span>{formatMessage({ id: 'nativeSession.error', defaultMessage: 'Failed to load session' })}</span>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'nativeSession.errorHint', defaultMessage: 'The session file may have been moved or deleted.' })}\r\n </p>\r\n </div>\r\n ) : data ? (\r\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\r\n <SessionTimeline session={data} />\r\n </div>\r\n ) : (\r\n <div className=\"flex-1 flex items-center justify-center py-16 text-muted-foreground\">\r\n {formatMessage({ id: 'nativeSession.empty', defaultMessage: 'No session data available' })}\r\n </div>\r\n )}\r\n\r\n {/* Footer Actions */}\r\n {data && (\r\n <div className=\"flex items-center gap-2 px-6 py-4 border-t bg-muted/30 shrink-0\">\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n onClick={() => handleCopy(data.sessionId, 'sessionId')}\r\n className=\"h-8\"\r\n >\r\n <Copy className=\"h-4 w-4 mr-2\" />\r\n {copiedField === 'sessionId'\r\n ? formatMessage({ id: 'nativeSession.footer.copied', defaultMessage: 'Copied!' })\r\n : formatMessage({ id: 'nativeSession.footer.copySessionId', defaultMessage: 'Copy Session ID' })}\r\n </Button>\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n onClick={() => {\r\n const json = JSON.stringify(data, null, 2);\r\n handleCopy(json, 'json');\r\n }}\r\n className=\"h-8\"\r\n >\r\n <FileJson className=\"h-4 w-4 mr-2\" />\r\n {copiedField === 'json'\r\n ? formatMessage({ id: 'nativeSession.footer.copied', defaultMessage: 'Copied!' })\r\n : formatMessage({ id: 'nativeSession.footer.exportJson', defaultMessage: 'Export JSON' })}\r\n </Button>\r\n </div>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n","// ========================================\n// Observability Panel\n// ========================================\n// Audit log UI for issue workbench (read-only)\n\nimport { useEffect, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { ChevronDown, ChevronRight, RefreshCw } from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Badge } from '@/components/ui/Badge';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { useCliSessionAudit } from '@/hooks';\nimport { cn } from '@/lib/utils';\nimport type { CliSessionAuditEvent, CliSessionAuditEventType } from '@/lib/api';\n\nconst EVENT_TYPES: CliSessionAuditEventType[] = [\n 'session_created',\n 'session_closed',\n 'session_send',\n 'session_execute',\n 'session_resize',\n 'session_share_created',\n 'session_share_revoked',\n 'session_idle_reaped',\n];\n\nfunction badgeVariantForType(type: CliSessionAuditEventType): 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'info' {\n switch (type) {\n case 'session_created':\n return 'success';\n case 'session_closed':\n case 'session_idle_reaped':\n return 'secondary';\n case 'session_execute':\n return 'info';\n case 'session_send':\n case 'session_resize':\n return 'outline';\n case 'session_share_created':\n return 'warning';\n case 'session_share_revoked':\n return 'secondary';\n default:\n return 'default';\n }\n}\n\nfunction stableEventKey(ev: CliSessionAuditEvent, index: number): string {\n return `${ev.timestamp}|${ev.type}|${ev.sessionKey ?? ''}|${index}`;\n}\n\nexport function ObservabilityPanel() {\n const { formatMessage } = useIntl();\n\n const [q, setQ] = useState('');\n const [sessionKey, setSessionKey] = useState('');\n const [type, setType] = useState<string>('');\n const [limit, setLimit] = useState<number>(200);\n const [offset, setOffset] = useState<number>(0);\n const [expandedKey, setExpandedKey] = useState<string | null>(null);\n\n // Reset paging when filters change\n useEffect(() => {\n setOffset(0);\n }, [q, sessionKey, type, limit]);\n\n const query = useCliSessionAudit({\n q: q.trim() || undefined,\n sessionKey: sessionKey.trim() || undefined,\n type: type ? (type as CliSessionAuditEventType) : undefined,\n limit,\n offset,\n });\n\n const events = query.data?.data.events ?? [];\n const total = query.data?.data.total ?? 0;\n const hasMore = query.data?.data.hasMore ?? false;\n\n const headerRight = useMemo(() => {\n const start = total === 0 ? 0 : offset + 1;\n const end = Math.min(total, offset + limit);\n return `${start}-${end} / ${total}`;\n }, [limit, offset, total]);\n\n const handleRefresh = async () => {\n try {\n await query.refetch();\n } catch (e) {\n // Errors are surfaced by query.error\n }\n };\n\n return (\n <div className=\"space-y-4\">\n <Card className=\"p-4\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-semibold text-foreground\">\n {formatMessage({ id: 'issues.observability.audit.title' })}\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-xs text-muted-foreground font-mono\">\n {headerRight}\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRefresh}\n disabled={query.isFetching}\n className=\"gap-2\"\n >\n <RefreshCw className={cn('h-4 w-4', query.isFetching && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\n <div className=\"md:col-span-2\">\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {formatMessage({ id: 'issues.observability.filters.search' })}\n </label>\n <Input\n value={q}\n onChange={(e) => setQ(e.target.value)}\n placeholder={formatMessage({ id: 'issues.observability.filters.searchPlaceholder' })}\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {formatMessage({ id: 'issues.observability.filters.sessionKey' })}\n </label>\n <Input\n value={sessionKey}\n onChange={(e) => setSessionKey(e.target.value)}\n placeholder={formatMessage({ id: 'issues.observability.filters.sessionKeyPlaceholder' })}\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {formatMessage({ id: 'issues.observability.filters.type' })}\n </label>\n <Select value={type || '__all__'} onValueChange={(v) => setType(v === '__all__' ? '' : v)}>\n <SelectTrigger>\n <SelectValue placeholder={formatMessage({ id: 'issues.observability.filters.typeAll' })} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">{formatMessage({ id: 'issues.observability.filters.typeAll' })}</SelectItem>\n {EVENT_TYPES.map((t) => (\n <SelectItem key={t} value={t}>\n {t}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <label className=\"block text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'issues.observability.filters.limit' })}\n </label>\n <Select value={String(limit)} onValueChange={(v) => setLimit(parseInt(v, 10))}>\n <SelectTrigger className=\"w-[140px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {[50, 100, 200, 500, 1000].map((n) => (\n <SelectItem key={n} value={String(n)}>{n}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOffset(Math.max(0, offset - limit))}\n disabled={offset === 0 || query.isFetching}\n >\n {formatMessage({ id: 'common.actions.previous' })}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOffset(offset + limit)}\n disabled={!hasMore || query.isFetching}\n >\n {formatMessage({ id: 'common.actions.next' })}\n </Button>\n </div>\n </div>\n </div>\n </Card>\n\n {query.error && (\n <Card className=\"p-6 border-destructive/50 bg-destructive/5\">\n <div className=\"text-sm text-destructive\">\n {(query.error as Error).message || formatMessage({ id: 'issues.observability.error' })}\n </div>\n </Card>\n )}\n\n {!query.isLoading && events.length === 0 && (\n <Card className=\"p-10 text-center text-muted-foreground\">\n {formatMessage({ id: 'issues.observability.empty' })}\n </Card>\n )}\n\n {events.length > 0 && (\n <Card className=\"p-0 overflow-hidden\">\n <div className=\"px-4 py-2 border-b border-border bg-card/50 text-xs font-medium text-muted-foreground grid grid-cols-12 gap-3\">\n <div className=\"col-span-3\">{formatMessage({ id: 'issues.observability.table.timestamp' })}</div>\n <div className=\"col-span-2\">{formatMessage({ id: 'issues.observability.table.type' })}</div>\n <div className=\"col-span-3\">{formatMessage({ id: 'issues.observability.table.sessionKey' })}</div>\n <div className=\"col-span-2\">{formatMessage({ id: 'issues.observability.table.tool' })}</div>\n <div className=\"col-span-2\">{formatMessage({ id: 'issues.observability.table.resumeKey' })}</div>\n </div>\n\n <div className=\"divide-y divide-border\">\n {events.map((ev, index) => {\n const key = stableEventKey(ev, index);\n const expanded = expandedKey === key;\n return (\n <div key={key} className=\"px-4 py-2\">\n <button\n type=\"button\"\n className=\"w-full text-left grid grid-cols-12 gap-3 items-center hover:bg-muted/40 rounded-md px-2 py-2\"\n onClick={() => setExpandedKey(expanded ? null : key)}\n >\n <div className=\"col-span-3 flex items-center gap-2 min-w-0\">\n {expanded ? (\n <ChevronDown className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n )}\n <span className=\"font-mono text-xs text-foreground truncate\">\n {ev.timestamp}\n </span>\n </div>\n <div className=\"col-span-2\">\n <Badge variant={badgeVariantForType(ev.type)} className=\"font-mono text-xs\">\n {ev.type}\n </Badge>\n </div>\n <div className=\"col-span-3 font-mono text-xs text-muted-foreground truncate\">\n {ev.sessionKey || '-'}\n </div>\n <div className=\"col-span-2 font-mono text-xs text-muted-foreground truncate\">\n {ev.tool || '-'}\n </div>\n <div className=\"col-span-2 font-mono text-xs text-muted-foreground truncate\">\n {ev.resumeKey || '-'}\n </div>\n </button>\n\n {expanded && (\n <div className=\"mt-2 ml-6 space-y-2\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-2 text-xs\">\n <div className=\"text-muted-foreground\">\n <span className=\"font-medium text-foreground\">{formatMessage({ id: 'issues.observability.table.workingDir' })}: </span>\n <span className=\"font-mono break-all\">{ev.workingDir || '-'}</span>\n </div>\n <div className=\"text-muted-foreground\">\n <span className=\"font-medium text-foreground\">{formatMessage({ id: 'issues.observability.table.ip' })}: </span>\n <span className=\"font-mono break-all\">{ev.ip || '-'}</span>\n </div>\n </div>\n {ev.userAgent && (\n <div className=\"text-xs text-muted-foreground\">\n <span className=\"font-medium text-foreground\">{formatMessage({ id: 'issues.observability.table.userAgent' })}: </span>\n <span className=\"font-mono break-all\">{ev.userAgent}</span>\n </div>\n )}\n <pre className=\"text-xs bg-muted/50 rounded-md p-3 overflow-x-auto\">\n {JSON.stringify(ev.details ?? {}, null, 2)}\n </pre>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </Card>\n )}\n </div>\n );\n}\n\nexport default ObservabilityPanel;\n","// ========================================\r\n// HistoryPage Component\r\n// ========================================\r\n// CLI execution history page with filtering and bulk actions\r\n// Includes tabs: Executions + Session Audit (Observability)\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Terminal,\r\n SearchX,\r\n RefreshCw,\r\n Trash2,\r\n AlertTriangle,\r\n Search,\r\n X,\r\n Maximize2,\r\n Minimize2,\r\n ChevronDown,\r\n ChevronRight,\r\n FileJson,\r\n Clock,\r\n} from 'lucide-react';\r\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\r\nimport { cn } from '@/lib/utils';\r\nimport { useHistory } from '@/hooks/useHistory';\r\nimport { useNotifications } from '@/hooks/useNotifications';\r\nimport { useNativeSessionsInfinite } from '@/hooks/useNativeSessions';\r\nimport { ConversationCard } from '@/components/shared/ConversationCard';\r\nimport { CliStreamPanel } from '@/components/shared/CliStreamPanel';\r\nimport { NativeSessionPanel } from '@/components/shared/NativeSessionPanel';\r\nimport { ObservabilityPanel } from '@/components/issue/hub/ObservabilityPanel';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from '@/components/ui/Dialog';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuLabel,\r\n} from '@/components/ui/Dropdown';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport type { CliExecution, NativeSessionListItem } from '@/lib/api';\r\nimport { getToolVariant } from '@/lib/cli-tool-theme';\r\n\r\ntype HistoryTab = 'executions' | 'observability' | 'native-sessions';\r\n\r\n/**\r\n * HistoryPage component - Display CLI execution history\r\n */\r\nexport function HistoryPage() {\r\n const { formatMessage } = useIntl();\r\n const { error: showError } = useNotifications();\r\n const [currentTab, setCurrentTab] = React.useState<HistoryTab>('executions');\r\n const [searchQuery, setSearchQuery] = React.useState('');\r\n const [toolFilter, setToolFilter] = React.useState<string | undefined>(undefined);\r\n const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false);\r\n const [deleteType, setDeleteType] = React.useState<'single' | 'tool' | 'all' | null>(null);\r\n const [deleteTarget, setDeleteTarget] = React.useState<string | null>(null);\r\n const [selectedExecution, setSelectedExecution] = React.useState<string | null>(null);\r\n const [isPanelOpen, setIsPanelOpen] = React.useState(false);\r\n const [selectedNativeSession, setSelectedNativeSession] = React.useState<NativeSessionListItem | null>(null);\r\n const [nativeExecutionId, setNativeExecutionId] = React.useState<string | null>(null);\r\n const [isNativePanelOpen, setIsNativePanelOpen] = React.useState(false);\r\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\r\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\r\n\r\n const {\r\n executions,\r\n isLoading,\r\n isFetching,\r\n error,\r\n refetch,\r\n deleteExecution,\r\n deleteByTool,\r\n deleteAll,\r\n isDeleting,\r\n } = useHistory({\r\n filter: { search: searchQuery || undefined, tool: toolFilter },\r\n });\r\n\r\n // Native sessions hook (infinite loading)\r\n const {\r\n sessions: nativeSessions,\r\n byTool: nativeSessionsByTool,\r\n isLoading: isLoadingNativeSessions,\r\n isFetching: isFetchingNativeSessions,\r\n isFetchingNextPage: isLoadingMoreNativeSessions,\r\n hasNextPage: hasMoreNativeSessions,\r\n error: nativeSessionsError,\r\n fetchNextPage: loadMoreNativeSessions,\r\n refetch: refetchNativeSessions,\r\n } = useNativeSessionsInfinite();\r\n\r\n // Track expanded tool groups in native sessions tab\r\n const [expandedTools, setExpandedTools] = React.useState<Set<string>>(new Set());\r\n\r\n const toggleToolExpand = (tool: string) => {\r\n setExpandedTools((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(tool)) {\r\n next.delete(tool);\r\n } else {\r\n next.add(tool);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n // Native session click handler - opens NativeSessionPanel\r\n const handleNativeSessionClick = (session: NativeSessionListItem) => {\r\n setSelectedNativeSession(session);\r\n setIsNativePanelOpen(true);\r\n };\r\n\r\n // Tool order for display\r\n const toolOrder = ['gemini', 'qwen', 'codex', 'claude', 'opencode'] as const;\r\n\r\n const tools = React.useMemo(() => {\r\n const toolSet = new Set(executions.map((e) => e.tool));\r\n return Array.from(toolSet).sort();\r\n }, [executions]);\r\n\r\n // Filter handlers\r\n const handleClearSearch = () => {\r\n setSearchQuery('');\r\n };\r\n\r\n const handleClearFilters = () => {\r\n setSearchQuery('');\r\n setToolFilter(undefined);\r\n };\r\n\r\n const hasActiveFilters = searchQuery.length > 0 || toolFilter !== undefined;\r\n\r\n // Card click handler - open execution details panel\r\n const handleCardClick = (execution: CliExecution) => {\r\n setSelectedExecution(execution.id);\r\n setIsPanelOpen(true);\r\n };\r\n\r\n // View native session handler\r\n const handleViewNative = (execution: CliExecution) => {\r\n setNativeExecutionId(execution.id);\r\n setIsNativePanelOpen(true);\r\n };\r\n\r\n // Delete handlers\r\n const handleDeleteClick = (id: string) => {\r\n setDeleteType('single');\r\n setDeleteTarget(id);\r\n setDeleteDialogOpen(true);\r\n };\r\n\r\n const handleDeleteByTool = (tool: string) => {\r\n setDeleteType('tool');\r\n setDeleteTarget(tool);\r\n setDeleteDialogOpen(true);\r\n };\r\n\r\n const handleDeleteAll = () => {\r\n setDeleteType('all');\r\n setDeleteTarget(null);\r\n setDeleteDialogOpen(true);\r\n };\r\n\r\n const handleConfirmDelete = async () => {\r\n try {\r\n if (deleteType === 'single' && deleteTarget) {\r\n await deleteExecution(deleteTarget);\r\n } else if (deleteType === 'tool' && deleteTarget) {\r\n await deleteByTool(deleteTarget);\r\n } else if (deleteType === 'all') {\r\n await deleteAll();\r\n }\r\n setDeleteDialogOpen(false);\r\n setDeleteType(null);\r\n setDeleteTarget(null);\r\n } catch (err) {\r\n showError(formatMessage({ id: 'history.deleteFailed' }), err instanceof Error ? err.message : String(err));\r\n console.error('Failed to delete:', err);\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(\"space-y-6\", isImmersiveMode && \"h-screen overflow-hidden\")}>\r\n {/* Header */}\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-semibold text-foreground\">\r\n {formatMessage({ id: 'history.title' })}\r\n </h1>\r\n <p className=\"text-sm text-muted-foreground mt-1\">\r\n {formatMessage({ id: 'history.description' })}\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={toggleImmersiveMode}\r\n className={cn(\r\n 'p-2 rounded-md transition-colors',\r\n isImmersiveMode\r\n ? 'bg-primary/10 text-primary'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n title={isImmersiveMode ? 'Exit Fullscreen' : 'Fullscreen'}\r\n >\r\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs - matching IssueHubTabs style */}\r\n <div className=\"flex gap-2 border-b border-border\">\r\n <Button\r\n variant=\"ghost\"\r\n className={cn(\r\n \"border-b-2 rounded-none h-11 px-4\",\r\n currentTab === 'executions'\r\n ? \"border-primary text-primary\"\r\n : \"border-transparent text-muted-foreground hover:text-foreground\"\r\n )}\r\n onClick={() => setCurrentTab('executions')}\r\n >\r\n {formatMessage({ id: 'history.tabs.executions' })}\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n className={cn(\r\n \"border-b-2 rounded-none h-11 px-4\",\r\n currentTab === 'observability'\r\n ? \"border-primary text-primary\"\r\n : \"border-transparent text-muted-foreground hover:text-foreground\"\r\n )}\r\n onClick={() => setCurrentTab('observability')}\r\n >\r\n {formatMessage({ id: 'history.tabs.observability' })}\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n className={cn(\r\n \"border-b-2 rounded-none h-11 px-4\",\r\n currentTab === 'native-sessions'\r\n ? \"border-primary text-primary\"\r\n : \"border-transparent text-muted-foreground hover:text-foreground\"\r\n )}\r\n onClick={() => setCurrentTab('native-sessions')}\r\n >\r\n <FileJson className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'history.tabs.nativeSessions' })}\r\n </Button>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n {currentTab === 'executions' && (\r\n <div className=\"space-y-4\">\r\n {/* Error alert */}\r\n {error && (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <Terminal className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{error.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n {formatMessage({ id: 'common.actions.retry' })}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* Filters and Actions on same row */}\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\r\n {/* Search input */}\r\n <div className=\"flex-1 max-w-sm relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={formatMessage({ id: 'history.searchPlaceholder' })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9 pr-9\"\r\n />\r\n {searchQuery && (\r\n <button\r\n onClick={handleClearSearch}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Tool filter */}\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2 min-w-[160px] justify-between\">\r\n {toolFilter || formatMessage({ id: 'history.filterAllTools' })}\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\" className=\"w-48\">\r\n <DropdownMenuItem onClick={() => setToolFilter(undefined)}>\r\n {formatMessage({ id: 'history.filterAllTools' })}\r\n </DropdownMenuItem>\r\n <DropdownMenuSeparator />\r\n {tools.map((tool) => (\r\n <DropdownMenuItem\r\n key={tool}\r\n onClick={() => setToolFilter(tool)}\r\n className={toolFilter === tool ? 'bg-accent' : ''}\r\n >\r\n {tool}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n\r\n {/* Clear filters */}\r\n {hasActiveFilters && (\r\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClearFilters}>\r\n {formatMessage({ id: 'common.actions.clearFilters' })}\r\n </Button>\r\n )}\r\n\r\n {/* Actions */}\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => refetch()}\r\n disabled={isFetching}\r\n >\r\n <RefreshCw className={cn('h-4 w-4 mr-2', isFetching && 'animate-spin')} />\r\n {formatMessage({ id: 'common.actions.refresh' })}\r\n </Button>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"outline\" size=\"sm\">\r\n <Trash2 className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'history.deleteOptions' })}\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuLabel>{formatMessage({ id: 'history.deleteBy' })}</DropdownMenuLabel>\r\n <DropdownMenuSeparator />\r\n {tools.map((tool) => (\r\n <DropdownMenuItem key={tool} onClick={() => handleDeleteByTool(tool)}>\r\n {formatMessage({ id: 'history.deleteAllTool' }, { tool })}\r\n </DropdownMenuItem>\r\n ))}\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem\r\n onClick={handleDeleteAll}\r\n className=\"text-destructive focus:text-destructive\"\r\n >\r\n <AlertTriangle className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'history.deleteAll' })}\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n\r\n {/* Executions list */}\r\n {isLoading ? (\r\n <div className=\"grid gap-3\">\r\n {Array.from({ length: 5 }).map((_, i) => (\r\n <div key={i} className=\"h-28 rounded-lg bg-muted animate-pulse\" />\r\n ))}\r\n </div>\r\n ) : executions.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n <SearchX className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {hasActiveFilters\r\n ? formatMessage({ id: 'history.empty.filtered' })\r\n : formatMessage({ id: 'history.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground text-center\">\r\n {hasActiveFilters\r\n ? formatMessage({ id: 'history.empty.filteredMessage' })\r\n : formatMessage({ id: 'history.empty.message' })}\r\n </p>\r\n {hasActiveFilters && (\r\n <Button variant=\"outline\" onClick={handleClearFilters} className=\"mt-4\">\r\n {formatMessage({ id: 'common.actions.clearFilters' })}\r\n </Button>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-3\">\r\n {executions.map((execution) => (\r\n <ConversationCard\r\n key={execution.id}\r\n execution={execution}\r\n onClick={handleCardClick}\r\n onViewNative={handleViewNative}\r\n onDelete={handleDeleteClick}\r\n actionsDisabled={isDeleting}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {currentTab === 'observability' && (\r\n <div className=\"mt-4\">\r\n <ObservabilityPanel />\r\n </div>\r\n )}\r\n\r\n {currentTab === 'native-sessions' && (\r\n <div className=\"space-y-4\">\r\n {/* Header with refresh */}\r\n <div className=\"flex items-center justify-between\">\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage(\r\n { id: 'history.nativeSessions.count' },\r\n { count: nativeSessions.length }\r\n )}\r\n </p>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => refetchNativeSessions()}\r\n disabled={isFetchingNativeSessions && !isLoadingMoreNativeSessions}\r\n >\r\n <RefreshCw className={cn('h-4 w-4 mr-2', isFetchingNativeSessions && 'animate-spin')} />\r\n {formatMessage({ id: 'common.actions.refresh' })}\r\n </Button>\r\n </div>\r\n\r\n {/* Error alert */}\r\n {nativeSessionsError && (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <Terminal className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{nativeSessionsError.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetchNativeSessions()}>\r\n {formatMessage({ id: 'common.actions.retry' })}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* Loading state */}\r\n {isLoadingNativeSessions ? (\r\n <div className=\"grid gap-3\">\r\n {Array.from({ length: 3 }).map((_, i) => (\r\n <div key={i} className=\"h-20 rounded-lg bg-muted animate-pulse\" />\r\n ))}\r\n </div>\r\n ) : nativeSessions.length === 0 ? (\r\n /* Empty state */\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n <FileJson className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'history.nativeSessions.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground text-center\">\r\n {formatMessage({ id: 'history.nativeSessions.empty.message' })}\r\n </p>\r\n </div>\r\n ) : (\r\n /* Sessions grouped by tool */\r\n <div className=\"space-y-2\">\r\n {toolOrder\r\n .filter((tool) => nativeSessionsByTool[tool]?.length > 0)\r\n .map((tool) => {\r\n const sessions = nativeSessionsByTool[tool];\r\n const isExpanded = expandedTools.has(tool);\r\n return (\r\n <div key={tool} className=\"border rounded-lg\">\r\n {/* Tool header - clickable to expand/collapse */}\r\n <button\r\n className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-muted/50 transition-colors\"\r\n onClick={() => toggleToolExpand(tool)}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <Badge variant={getToolVariant(tool)}>\r\n {tool.toUpperCase()}\r\n </Badge>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {sessions.length} {formatMessage({ id: 'history.nativeSessions.sessions' })}\r\n </span>\r\n </div>\r\n </button>\r\n {/* Sessions list */}\r\n {isExpanded && (\r\n <div className=\"border-t divide-y\">\r\n {sessions.map((session) => (\r\n <button\r\n key={session.sessionId}\r\n className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-muted/30 transition-colors text-left\"\r\n onClick={() => handleNativeSessionClick(session)}\r\n >\r\n <div className=\"flex items-center gap-3 min-w-0\">\r\n <span className=\"font-mono text-sm truncate max-w-48\" title={session.sessionId}>\r\n {session.sessionId.length > 24 ? session.sessionId.slice(0, 24) + '...' : session.sessionId}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground shrink-0\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(session.updatedAt).toLocaleString()}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n {/* Other tools not in predefined order */}\r\n {Object.keys(nativeSessionsByTool)\r\n .filter((tool) => !toolOrder.includes(tool as typeof toolOrder[number]))\r\n .sort()\r\n .map((tool) => {\r\n const sessions = nativeSessionsByTool[tool];\r\n const isExpanded = expandedTools.has(tool);\r\n return (\r\n <div key={tool} className=\"border rounded-lg\">\r\n <button\r\n className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-muted/50 transition-colors\"\r\n onClick={() => toggleToolExpand(tool)}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <Badge variant=\"secondary\">\r\n {tool.toUpperCase()}\r\n </Badge>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {sessions.length} {formatMessage({ id: 'history.nativeSessions.sessions' })}\r\n </span>\r\n </div>\r\n </button>\r\n {isExpanded && (\r\n <div className=\"border-t divide-y\">\r\n {sessions.map((session) => (\r\n <button\r\n key={session.sessionId}\r\n className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-muted/30 transition-colors text-left\"\r\n onClick={() => handleNativeSessionClick(session)}\r\n >\r\n <div className=\"flex items-center gap-3 min-w-0\">\r\n <span className=\"font-mono text-sm truncate max-w-48\" title={session.sessionId}>\r\n {session.sessionId.length > 24 ? session.sessionId.slice(0, 24) + '...' : session.sessionId}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground shrink-0\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(session.updatedAt).toLocaleString()}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Load More Button */}\r\n {hasMoreNativeSessions && (\r\n <div className=\"flex justify-center pt-4\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => loadMoreNativeSessions()}\r\n disabled={isLoadingMoreNativeSessions}\r\n >\r\n {isLoadingMoreNativeSessions ? (\r\n <>\r\n <RefreshCw className=\"h-4 w-4 mr-2 animate-spin\" />\r\n {formatMessage({ id: 'history.nativeSessions.loading', defaultMessage: 'Loading...' })}\r\n </>\r\n ) : (\r\n formatMessage({ id: 'history.nativeSessions.loadMore', defaultMessage: 'Load More' })\r\n )}\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* CLI Stream Panel */}\r\n <CliStreamPanel\r\n executionId={selectedExecution || ''}\r\n open={isPanelOpen}\r\n onOpenChange={setIsPanelOpen}\r\n />\r\n\r\n {/* Native Session Panel */}\r\n <NativeSessionPanel\r\n session={selectedNativeSession}\r\n executionId={nativeExecutionId || undefined}\r\n open={isNativePanelOpen}\r\n onOpenChange={setIsNativePanelOpen}\r\n />\r\n\r\n {/* Delete Confirmation Dialog */}\r\n <Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>\r\n <DialogContent>\r\n <DialogHeader>\r\n <DialogTitle>\r\n {deleteType === 'all'\r\n ? formatMessage({ id: 'history.dialog.deleteAllTitle' })\r\n : formatMessage({ id: 'history.dialog.deleteTitle' })}\r\n </DialogTitle>\r\n <DialogDescription>\r\n {deleteType === 'all' && formatMessage({ id: 'history.dialog.deleteAllMessage' })}\r\n {deleteType === 'tool' &&\r\n formatMessage({ id: 'history.dialog.deleteToolMessage' }, { tool: deleteTarget })}\r\n {deleteType === 'single' &&\r\n formatMessage({ id: 'history.dialog.deleteMessage' })}\r\n </DialogDescription>\r\n </DialogHeader>\r\n <DialogFooter>\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => setDeleteDialogOpen(false)}\r\n disabled={isDeleting}\r\n >\r\n {formatMessage({ id: 'common.actions.cancel' })}\r\n </Button>\r\n <Button\r\n variant=\"destructive\"\r\n onClick={handleConfirmDelete}\r\n disabled={isDeleting}\r\n >\r\n {isDeleting\r\n ? formatMessage({ id: 'common.status.deleting' })\r\n : formatMessage({ id: 'common.actions.delete' })}\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n </div>\r\n );\r\n}\r\n\r\nexport default HistoryPage;\r\n"],"names":["InfiniteQueryObserver","QueryObserver","client","options","infiniteQueryBehavior","query","state","parentResult","isFetching","isRefetching","isError","isRefetchError","fetchDirection","_b","_a","isFetchNextPageError","isFetchingNextPage","isFetchPreviousPageError","isFetchingPreviousPage","hasNextPage","hasPreviousPage","useInfiniteQuery","queryClient","useBaseQuery","ArrowDownUp","createLucideIcon","Coins","SearchX","useCliSessionAudit","projectPath","useWorkflowStore","selectProjectPath","enabled","typeParam","useQuery","workspaceQueryKeys","fetchCliSessionAudit","cliExecutionKeys","id","STALE_TIME","GC_TIME","useCliExecutionDetail","executionId","staleTime","gcTime","fetchExecutionDetail","attemptIndex","refetch","useHistory","filter","useQueryClient","queryEnabled","fetchHistory","executions","React","searchLower","exec","deleteSingleMutation","useMutation","deleteExecution","deleteByToolMutation","deleteExecutionsByTool","deleteAllMutation","deleteAllHistory","isDeleting","PAGE_SIZE","useNativeSessionsInfinite","tool","pageParam","fetchNativeSessions","lastPage","sessions","byTool","count","allSessions","page","mergedByTool","toolKey","toolSessions","fetchNextPage","statusConfig","formatDuration","ms","seconds","minutes","remainingSeconds","useTimeAgo","formatMessage","useIntl","React.useCallback","dateString","date","hours","days","ConversationCard","execution","onView","onViewNative","onDelete","onClick","className","actionsDisabled","getTimeAgo","copied","setCopied","React.useState","status","handleCopyId","e","handleCardClick","handleAction","action","jsx","Card","cn","CardContent","jsxs","Badge","MessagesSquare","Folder","FileJson","Clock","Timer","Hash","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","Copy","Eye","DropdownMenuSeparator","Trash2","nativeSessionKeys","useNativeSession","fetchNativeSession","CLI_TOOL_THEMES","Sparkles","Code","Brain","Terminal","Cpu","DEFAULT_TOOL_THEME","getToolTheme","normalizedTool","getToolVariant","getStatusInfo","statusMap","CheckCircle2","XCircle","ensureString","value","buildConcatenatedPrompt","format","turns","parts","turn","yaml","line","output","TurnSection","isLatest","isExpanded","onToggle","StatusIcon","statusColor","ChevronDown","ChevronRight","User","Bot","AlertTriangle","Info","PerTurnView","expandedTurns","setExpandedTurns","handleToggle","turnNumber","prev","next","idx","React.Fragment","ConcatenatedView","prompt","onFormatChange","Layers","fmt","formatTokenCount","NativeTokenDisplay","tokens","NativeToolCallItem","toolCall","index","Wrench","NativeTurnCard","isUser","RoleIcon","thought","i","tc","NativeTurnView","CliStreamPanel","_sourceDir","open","onOpenChange","viewMode","setViewMode","concatFormat","setConcatFormat","isLoading","nativeSession","nativeLoading","concatenatedPrompt","React.useMemo","copyToClipboard","text","label","err","totalDuration","sum","t","Dialog","DialogContent","DialogHeader","DialogTitle","Calendar","Fragment","Loader2","nativeSessionPathKeys","filePath","useNativeSessionByPath","fetchNativeSessionWithOptions","getToolStatusIcon","CheckCircle","getStatusVariant","TokenBar","total","input","cached","inputPercent","outputPercent","cachedPercent","Archive","ToolCallPanel","setIsExpanded","TurnNode","isLast","SessionTimeline","session","truncate","str","maxLen","NativeSessionPanel","pathBasedResult","idBasedResult","data","error","copiedField","setCopiedField","handleCopy","field","FolderOpen","AlertCircle","json","EVENT_TYPES","badgeVariantForType","type","stableEventKey","ev","ObservabilityPanel","q","setQ","useState","sessionKey","setSessionKey","setType","limit","setLimit","offset","setOffset","expandedKey","setExpandedKey","useEffect","events","hasMore","_c","headerRight","useMemo","start","end","handleRefresh","RefreshCw","Input","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","n","key","expanded","HistoryPage","showError","useNotifications","currentTab","setCurrentTab","searchQuery","setSearchQuery","toolFilter","setToolFilter","deleteDialogOpen","setDeleteDialogOpen","deleteType","setDeleteType","deleteTarget","setDeleteTarget","selectedExecution","setSelectedExecution","isPanelOpen","setIsPanelOpen","selectedNativeSession","setSelectedNativeSession","nativeExecutionId","setNativeExecutionId","isNativePanelOpen","setIsNativePanelOpen","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","s","deleteByTool","deleteAll","nativeSessions","nativeSessionsByTool","isLoadingNativeSessions","isFetchingNativeSessions","isLoadingMoreNativeSessions","hasMoreNativeSessions","nativeSessionsError","loadMoreNativeSessions","refetchNativeSessions","expandedTools","setExpandedTools","toggleToolExpand","handleNativeSessionClick","toolOrder","tools","toolSet","handleClearSearch","handleClearFilters","hasActiveFilters","handleViewNative","handleDeleteClick","handleDeleteByTool","handleDeleteAll","handleConfirmDelete","Minimize2","Maximize2","Search","X","DropdownMenuLabel","_","DialogDescription","DialogFooter"],"mappings":"mlCAOA,IAAIA,GAAwB,cAAcC,EAAc,CACtD,YAAYC,EAAQC,EAAS,CAC3B,MAAMD,EAAQC,CAAO,CACvB,CACA,aAAc,CACZ,MAAM,YAAW,EACjB,KAAK,cAAgB,KAAK,cAAc,KAAK,IAAI,EACjD,KAAK,kBAAoB,KAAK,kBAAkB,KAAK,IAAI,CAC3D,CACA,WAAWA,EAAS,CAClB,MAAM,WAAW,CACf,GAAGA,EACH,SAAUC,GAAqB,CACrC,CAAK,CACH,CACA,oBAAoBD,EAAS,CAC3B,OAAAA,EAAQ,SAAWC,GAAqB,EACjC,MAAM,oBAAoBD,CAAO,CAC1C,CACA,cAAcA,EAAS,CACrB,OAAO,KAAK,MAAM,CAChB,GAAGA,EACH,KAAM,CACJ,UAAW,CAAE,UAAW,SAAS,CACzC,CACA,CAAK,CACH,CACA,kBAAkBA,EAAS,CACzB,OAAO,KAAK,MAAM,CAChB,GAAGA,EACH,KAAM,CACJ,UAAW,CAAE,UAAW,UAAU,CAC1C,CACA,CAAK,CACH,CACA,aAAaE,EAAOF,EAAS,SAC3B,KAAM,CAAE,MAAAG,CAAK,EAAKD,EACZE,EAAe,MAAM,aAAaF,EAAOF,CAAO,EAChD,CAAE,WAAAK,EAAY,aAAAC,EAAc,QAAAC,EAAS,eAAAC,CAAc,EAAKJ,EACxDK,GAAiBC,GAAAC,EAAAR,EAAM,YAAN,YAAAQ,EAAiB,YAAjB,YAAAD,EAA4B,UAC7CE,EAAuBL,GAAWE,IAAmB,UACrDI,EAAqBR,GAAcI,IAAmB,UACtDK,EAA2BP,GAAWE,IAAmB,WACzDM,EAAyBV,GAAcI,IAAmB,WAchE,MAbe,CACb,GAAGL,EACH,cAAe,KAAK,cACpB,kBAAmB,KAAK,kBACxB,YAAaY,GAAYhB,EAASG,EAAM,IAAI,EAC5C,gBAAiBc,GAAgBjB,EAASG,EAAM,IAAI,EACpD,qBAAAS,EACA,mBAAAC,EACA,yBAAAC,EACA,uBAAAC,EACA,eAAgBP,GAAkB,CAACI,GAAwB,CAACE,EAC5D,aAAcR,GAAgB,CAACO,GAAsB,CAACE,CAC5D,CAEE,CACF,EC7DA,SAASG,GAAiBlB,EAASmB,EAAa,CAC9C,OAAOC,GACLpB,EACAH,EAEF,CACF,CCXA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMwB,GAAcC,GAAiB,cAAe,CAClD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,EAC9C,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,EAC9C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC,ECdD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMC,GAAQD,GAAiB,QAAS,CACtC,CAAC,SAAU,CAAE,GAAI,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,SAAU,EACtD,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,8BAA+B,IAAK,QAAQ,CAAE,CAC9D,CAAC,ECdD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAME,GAAUF,GAAiB,UAAW,CAC1C,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,EAC9C,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,QAAQ,CAAE,EAC7C,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,SAAU,EACxD,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,CAAC,ECSM,SAASG,GACdzB,EAAqC,GACoC,CACzE,MAAM0B,EAAcC,GAAiBC,EAAiB,EAChDC,GAAW7B,EAAQ,SAAW,KAAS,CAAC,CAAC0B,EAEzCI,EAAY,MAAM,QAAQ9B,EAAQ,IAAI,EACxCA,EAAQ,KAAK,KAAK,GAAG,EACrBA,EAAQ,KAEZ,OAAO+B,EAAS,CACd,SAAUL,EACNM,EAAmB,gBAAgBN,EAAa,CAChD,WAAY1B,EAAQ,WACpB,KAAM8B,EACN,EAAG9B,EAAQ,EACX,MAAOA,EAAQ,MACf,OAAQA,EAAQ,MAAA,CACjB,EACC,CAAC,QAAS,cAAe,YAAY,EACzC,QAAS,IAAMiC,GAAqB,CAClC,YAAaP,GAAe,OAC5B,WAAY1B,EAAQ,WACpB,KAAMA,EAAQ,KACd,EAAGA,EAAQ,EACX,MAAOA,EAAQ,MACf,OAAQA,EAAQ,MAAA,CACjB,EACD,QAAA6B,EACA,UAAW,IACX,MAAO,CAAA,CACR,CACH,CCvCO,MAAMK,GAAmB,CAC9B,IAAK,CAAC,cAAc,EACpB,QAAS,IAAM,CAAC,GAAGA,GAAiB,IAAK,QAAQ,EACjD,OAASC,GAAsB,CAAC,GAAGD,GAAiB,QAAA,EAAWC,CAAE,CACnE,EAQMC,GAAa,IAAS,IAMtBC,GAAU,IAAU,IA4CnB,SAASC,GACdC,EACAvC,EAAkC,GACX,CACvB,KAAM,CAAE,UAAAwC,EAAYJ,GAAY,OAAAK,EAASJ,GAAS,QAAAR,EAAU,IAAS7B,EAE/DE,EAAQ6B,EAA6B,CACzC,SAAUG,GAAiB,OAAOK,CAAW,EAC7C,QAAS,IAAM,CACb,GAAI,CAACA,EAAa,MAAM,IAAI,MAAM,yBAAyB,EAC3D,OAAOG,GAAqBH,CAAW,CACzC,EACA,QAAS,CAAC,CAACA,GAAeV,EAC1B,UAAAW,EACA,OAAAC,EACA,qBAAsB,GACtB,eAAgB,GAChB,mBAAoB,GACpB,MAAO,EACP,WAAaE,GAAiB,KAAK,IAAI,IAAO,GAAKA,EAAc,GAAK,CAAA,CACvE,EAEKC,EAAU,SAAY,CAC1B,MAAM1C,EAAM,QAAA,CACd,EAEA,MAAO,CACL,KAAMA,EAAM,KACZ,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAA0C,CAAA,CAEJ,CCxFA,MAAMR,GAAa,GAAK,IAwCjB,SAASS,GAAW7C,EAA6B,GAAsB,CAC5E,KAAM,CAAE,OAAA8C,EAAQ,UAAAN,EAAYJ,GAAY,QAAAP,EAAU,IAAS7B,EACrDmB,EAAc4B,GAAA,EAEdrB,EAAcC,GAAiBC,EAAiB,EAChDoB,EAAenB,GAAW,CAAC,CAACH,EAE5BxB,EAAQ6B,EAAS,CACrB,SAAUC,EAAmB,eAAeN,CAAW,EACvD,QAAS,IAAMuB,GAAavB,CAAW,EACvC,UAAAc,EACA,QAASQ,EACT,MAAO,EACP,WAAaL,GAAiB,KAAK,IAAI,IAAO,GAAKA,EAAc,GAAK,CAAA,CACvE,EAGKO,EAAaC,GAAM,QAAQ,IAAM,OACrC,IAAID,IAAavC,EAAAT,EAAM,OAAN,YAAAS,EAAY,aAAc,CAAA,EAG3C,GAAImC,GAAA,MAAAA,EAAQ,OAAQ,CAClB,MAAMM,EAAcN,EAAO,OAAO,YAAA,EAClCI,EAAaA,EAAW,OACrBG,IAEiB,OAAOA,EAAK,gBAAmB,SAC3CA,EAAK,eACL,KAAK,UAAUA,EAAK,cAAc,GACvB,cAAc,SAASD,CAAW,GAC/CC,EAAK,KAAK,cAAc,SAASD,CAAW,CAChD,CAEJ,CAGA,OAAIN,GAAA,MAAAA,EAAQ,OACVI,EAAaA,EAAW,OAAQG,GAASA,EAAK,OAASP,EAAO,IAAI,GAG7DI,CACT,EAAG,CAAChD,EAAM,KAAM4C,CAAM,CAAC,EAEjBF,EAAU,SAAY,CAC1B,MAAM1C,EAAM,QAAA,CACd,EAGMoD,EAAuBC,GAAY,CACvC,WAAYC,GACZ,UAAW,IAAM,CACfrC,EAAY,kBAAkB,CAAE,SAAUa,EAAmB,WAAWN,CAAW,EAAG,CACxF,CAAA,CACD,EAGK+B,EAAuBF,GAAY,CACvC,WAAYG,GACZ,UAAW,IAAM,CACfvC,EAAY,kBAAkB,CAAE,SAAUa,EAAmB,WAAWN,CAAW,EAAG,CACxF,CAAA,CACD,EAGKiC,EAAoBJ,GAAY,CACpC,WAAYK,GACZ,UAAW,IAAM,CACfzC,EAAY,kBAAkB,CAAE,SAAUa,EAAmB,WAAWN,CAAW,EAAG,CACxF,CAAA,CACD,EAEKmC,EACJP,EAAqB,WACrBG,EAAqB,WACrBE,EAAkB,UAEpB,MAAO,CACL,WAAAT,EACA,UAAWhD,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAA0C,EACA,gBAAiBU,EAAqB,YACtC,aAAcG,EAAqB,YACnC,UAAWE,EAAkB,YAC7B,WAAAE,CAAA,CAEJ,CCrIA,MAAMzB,GAAa,IAAS,IACtBC,GAAU,IAAU,IACpByB,GAAY,GAkJX,SAASC,GACd/D,EAAoC,GACH,CACjC,KAAM,CAAE,KAAAgE,EAAM,UAAAxB,EAAYJ,GAAY,OAAAK,EAASJ,GAAS,QAAAR,EAAU,IAAS7B,EACrE0B,EAAcC,GAAiBC,EAAiB,EAEhD1B,EAAQgB,GAA6C,CACzD,SAAU,CAAC,GAAGc,EAAmB,mBAAmBN,EAAasC,CAAI,EAAG,UAAU,EAClF,QAAS,CAAC,CAAE,UAAAC,CAAA,IAAgBC,GAAoB,CAC9C,KAAAF,EACA,QAAStC,EACT,MAAOoC,GACP,OAAQG,CAAA,CACT,EACD,iBAAkB,KAClB,iBAAmBE,GAAa,CAC9B,GAAI,GAACA,EAAS,SAAW,CAACA,EAAS,YACnC,OAAOA,EAAS,UAClB,EACA,UAAA3B,EACA,OAAAC,EACA,QAAAZ,EACA,qBAAsB,GACtB,MAAO,EACP,WAAac,GAAiB,KAAK,IAAI,IAAO,GAAKA,EAAc,GAAK,CAAA,CACvE,EAGK,CAAE,SAAAyB,EAAU,OAAAC,EAAQ,MAAAC,GAAUnB,GAAM,QAAQ,IAAM,SACtD,MAAMoB,IAAc5D,EAAAT,EAAM,OAAN,YAAAS,EAAY,MAAM,QAAQ6D,GAAQA,EAAK,YAAa,CAAA,EAElEC,EAA6B,CAAA,EACnC,UAAWD,MAAQ9D,EAAAR,EAAM,OAAN,YAAAQ,EAAY,QAAS,CAAA,EACtC,SAAW,CAACgE,EAASC,CAAY,IAAK,OAAO,QAAQH,EAAK,QAAU,CAAA,CAAE,EAC/DC,EAAaC,CAAO,IACvBD,EAAaC,CAAO,EAAI,CAAA,GAE1BD,EAAaC,CAAO,EAAE,KAAK,GAAGC,CAAY,EAG9C,MAAO,CAAE,SAAUJ,EAAa,OAAQE,EAAc,MAAOF,EAAY,MAAA,CAC3E,EAAG,CAACrE,EAAM,IAAI,CAAC,EAET0E,EAAgB,SAAY,CAChC,MAAM1E,EAAM,cAAA,CACd,EAEM0C,EAAU,SAAY,CAC1B,MAAM1C,EAAM,QAAA,CACd,EAEA,MAAO,CACL,SAAAkE,EACA,OAAAC,EACA,MAAAC,EACA,UAAWpE,EAAM,UACjB,WAAYA,EAAM,WAClB,mBAAoBA,EAAM,mBAC1B,YAAaA,EAAM,YACnB,MAAOA,EAAM,MACb,cAAA0E,EACA,QAAAhC,CAAA,CAEJ,CClLA,MAAMiC,GAAe,CACnB,QAAS,CACP,QAAS,UACT,KAAM,cAAA,EAER,MAAO,CACL,QAAS,cACT,KAAM,UAAA,EAER,QAAS,CACP,QAAS,UACT,KAAM,OAAA,CAEV,EAKA,SAASC,GAAeC,EAAoB,CAC1C,MAAMC,EAAU,KAAK,MAAMD,EAAK,GAAI,EACpC,GAAIC,EAAU,GAAI,MAAO,GAAGA,CAAO,IACnC,MAAMC,EAAU,KAAK,MAAMD,EAAU,EAAE,EACjCE,EAAmBF,EAAU,GACnC,MAAO,GAAGC,CAAO,KAAKC,CAAgB,GACxC,CAKA,SAASC,IAAa,CACpB,KAAM,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EAE1B,OAAOC,EAAAA,YAAmBC,GAA+B,CACvD,MAAMC,EAAO,IAAI,KAAKD,CAAU,EAE1BP,EAAU,KAAK,WADL,KAAA,EACgB,UAAYQ,EAAK,QAAA,GAAa,GAAI,EAElE,GAAIR,EAAU,GAAI,OAAOI,EAAc,CAAE,GAAI,sBAAuB,EACpE,MAAMH,EAAU,KAAK,MAAMD,EAAU,EAAE,EACvC,GAAIC,EAAU,GAAI,OAAOG,EAAc,CAAE,GAAI,0BAA4B,CAAE,MAAOH,EAAS,EAC3F,MAAMQ,EAAQ,KAAK,MAAMR,EAAU,EAAE,EACrC,GAAIQ,EAAQ,GAAI,OAAOL,EAAc,CAAE,GAAI,wBAA0B,CAAE,MAAOK,EAAO,EACrF,MAAMC,EAAO,KAAK,MAAMD,EAAQ,EAAE,EAClC,OAAOL,EAAc,CAAE,GAAI,qBAAA,EAAyB,CAAE,MAAOM,EAAM,CACrE,EAAG,CAACN,CAAa,CAAC,CACpB,CAKO,SAASO,GAAiB,CAC/B,UAAAC,EACA,OAAAC,EACA,aAAAC,EACA,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,gBAAAC,EAAkB,EACpB,EAA0B,CACxB,KAAM,CAAE,cAAAd,CAAA,EAAkBC,EAAA,EACpBc,EAAahB,GAAA,EACb,CAACiB,EAAQC,CAAS,EAAIC,EAAAA,SAAe,EAAK,EAE1CC,EAAS1B,GAAae,EAAU,MAAM,GAAKf,GAAa,MAExD2B,EAAe,MAAOC,GAAwB,CAClDA,EAAE,gBAAA,EACF,GAAI,CACF,MAAM,UAAU,UAAU,UAAUb,EAAU,EAAE,EAChDS,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,CACzC,MAAQ,CACN,QAAQ,MAAM,mBAAmB,CACnC,CACF,EAEMK,EAAmBD,GAAwB,CAE1CA,EAAE,OAAuB,QAAQ,qCAAqC,GAG3ET,GAAA,MAAAA,EAAUJ,EACZ,EAEMe,EAAe,CACnBF,EACAG,IACG,CAEH,OADAH,EAAE,gBAAA,EACMG,EAAA,CACN,IAAK,OACHf,GAAA,MAAAA,EAASD,GACT,MACF,IAAK,SACHG,GAAA,MAAAA,EAAWH,EAAU,IACrB,MACF,IAAK,OACHY,EAAaC,CAAC,EACd,KAAA,CAEN,EAEA,OACEI,EAAAA,IAACC,EAAA,CACC,UAAWC,EACT,mEACAd,CAAA,EAEF,QAASS,EAET,eAACM,GAAA,CAAY,UAAU,MACrB,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,yBAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,iBAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAJ,MAACK,GAAM,QAAQ,YAAY,UAAU,UAClC,WAAU,KACb,EACAL,EAAAA,IAACK,GAAM,QAAQ,UAAU,UAAU,UAChC,SAAAtB,EAAU,MAAQ,UAAA,CACrB,EACCA,EAAU,YAAcA,EAAU,WAAa,UAC7CsB,EAAA,CAAM,QAAQ,OAAO,UAAU,gBAC9B,SAAA,CAAAL,EAAAA,IAACM,GAAA,CAAe,UAAU,SAAA,CAAU,EACnCvB,EAAU,UAAA,EACb,EAEDA,EAAU,WAAaA,EAAU,YAAc,YAC7CsB,EAAA,CAAM,QAAQ,UAAU,UAAU,gBACjC,SAAA,CAAAL,EAAAA,IAACO,GAAA,CAAO,UAAU,SAAA,CAAU,EAC3BxB,EAAU,SAAA,EACb,EAEDA,EAAU,kBACTqB,EAAAA,KAACC,GAAM,QAAQ,UAAU,UAAU,gBACjC,SAAA,CAAAL,EAAAA,IAACQ,EAAA,CAAS,UAAU,SAAA,CAAU,EAC7BjC,EAAc,CAAE,GAAI,sBAAA,CAAwB,CAAA,EAC/C,SAED8B,EAAA,CAAM,QAASX,EAAO,QAAS,UAAU,wBACvC,SAAA,CAAAA,EAAO,OAAS,gBAAkB,IAClCA,EAAO,OAAS,YAAc,IAC9BA,EAAO,OAAS,SAAW,IAC3BX,EAAU,MAAA,CAAA,CACb,CAAA,EACF,EAGAiB,EAAAA,IAAC,IAAA,CAAE,UAAU,4CACV,gBAAOjB,EAAU,gBAAmB,SACjCA,EAAU,eACV,KAAK,UAAUA,EAAU,cAAc,EAC7C,EAGAqB,EAAAA,KAAC,MAAA,CAAI,UAAU,kEACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAJ,EAAAA,IAACS,EAAA,CAAM,UAAU,SAAA,CAAU,EAC1BnB,EAAWP,EAAU,SAAS,CAAA,EACjC,EACAqB,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAJ,EAAAA,IAACU,GAAA,CAAM,UAAU,SAAA,CAAU,EAC1BzC,GAAec,EAAU,WAAW,CAAA,EACvC,SACC,OAAA,CAAK,UAAU,oCAAoC,MAAOA,EAAU,GACnE,SAAA,CAAAiB,EAAAA,IAACW,GAAA,CAAK,UAAU,SAAA,CAAU,EACzB5B,EAAU,GAAG,UAAU,EAAG,CAAC,EAAE,KAAA,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,EACF,SAGC6B,GAAA,CACC,SAAA,CAAAZ,EAAAA,IAACa,GAAA,CAAoB,QAAO,GAC1B,SAAAT,EAAAA,KAACU,EAAA,CACC,QAAQ,QACR,KAAK,OACL,UAAU,+DACV,QAAUlB,GAAMA,EAAE,gBAAA,EAClB,SAAUP,EAEV,SAAA,CAAAW,EAAAA,IAACe,GAAA,CAAa,UAAU,SAAA,CAAU,EAClCf,MAAC,QAAK,UAAU,UAAW,WAAc,CAAE,GAAI,qBAAA,CAAuB,CAAA,CAAE,CAAA,CAAA,CAAA,EAE5E,EACAI,EAAAA,KAACY,GAAA,CAAoB,MAAM,MACzB,SAAA,CAAAZ,OAACa,GAAiB,QAAUrB,GAAME,EAAaF,EAAG,MAAM,EACtD,SAAA,CAAAI,EAAAA,IAACkB,EAAA,CAAK,UAAU,cAAA,CAAe,EAE3B3C,EADHgB,EACiB,CAAE,GAAI,wBAAA,EACN,CAAE,GAAI,wBAAA,CAD0B,CACA,EACpD,EACAa,OAACa,GAAiB,QAAUrB,GAAME,EAAaF,EAAG,MAAM,EACtD,SAAA,CAAAI,EAAAA,IAACmB,GAAA,CAAI,UAAU,cAAA,CAAe,EAC7B5C,EAAc,CAAE,GAAI,sBAAA,CAAwB,CAAA,EAC/C,EACCQ,EAAU,kBACTqB,EAAAA,KAACa,EAAA,CAAiB,QAAUrB,GAAM,CAAEA,EAAE,gBAAA,EAAmBX,GAAA,MAAAA,EAAeF,EAAY,EAClF,SAAA,CAAAiB,EAAAA,IAACQ,EAAA,CAAS,UAAU,cAAA,CAAe,EAClCjC,EAAc,CAAE,GAAI,6BAA8B,eAAgB,sBAAuB,CAAA,EAC5F,QAED6C,EAAA,EAAsB,EACvBhB,EAAAA,KAACa,EAAA,CACC,QAAUrB,GAAME,EAAaF,EAAG,QAAQ,EACxC,UAAU,0CAEV,SAAA,CAAAI,EAAAA,IAACqB,GAAA,CAAO,UAAU,cAAA,CAAe,EAChC9C,EAAc,CAAE,GAAI,wBAAA,CAA0B,CAAA,CAAA,CAAA,CACjD,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CAGN,CC7PO,MAAM+C,GAAoB,CAC/B,IAAK,CAAC,eAAe,EACrB,QAAS,IAAM,CAAC,GAAGA,GAAkB,IAAK,QAAQ,EAClD,OAAShG,GAAsB,CAAC,GAAGgG,GAAkB,QAAA,EAAWhG,CAAE,CACpE,EAIMC,GAAa,IAAS,IACtBC,GAAU,IAAU,IA0BnB,SAAS+F,GACd7F,EACAvC,EAAmC,GACX,CACxB,KAAM,CAAE,UAAAwC,EAAYJ,GAAY,OAAAK,EAASJ,GAAS,QAAAR,EAAU,IAAS7B,EAC/D0B,EAAcC,GAAiBC,EAAiB,EAEhD1B,EAAQ6B,EAAwB,CACpC,SAAUoG,GAAkB,OAAO5F,CAAW,EAC9C,QAAS,IAAM,CACb,GAAI,CAACA,EAAa,MAAM,IAAI,MAAM,yBAAyB,EAC3D,OAAO8F,GAAmB9F,EAAab,CAAW,CACpD,EACA,QAAS,CAAC,CAACa,GAAeV,EAC1B,UAAAW,EACA,OAAAC,EACA,qBAAsB,GACtB,eAAgB,GAChB,mBAAoB,GACpB,MAAO,EACP,WAAaE,GAAiB,KAAK,IAAI,IAAO,GAAKA,EAAc,GAAK,CAAA,CACvE,EAEKC,EAAU,SAAY,CAC1B,MAAM1C,EAAM,QAAA,CACd,EAEA,MAAO,CACL,KAAMA,EAAM,KACZ,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAA0C,CAAA,CAEJ,CCnDO,MAAM0F,GAAgD,CAC3D,OAAQ,CACN,QAAS,OACT,KAAMC,GACN,MAAO,OACP,YAAa,SACb,WAAY,KAAA,EAEd,MAAO,CACL,QAAS,UACT,KAAMC,GACN,MAAO,QACP,YAAa,QACb,WAAY,KAAA,EAEd,KAAM,CACJ,QAAS,UACT,KAAMC,GACN,MAAO,QACP,YAAa,OACb,WAAY,KAAA,EAEd,SAAU,CACR,QAAS,YACT,KAAMC,EACN,MAAO,OACP,YAAa,WACb,WAAY,KAAA,EAEd,OAAQ,CACN,QAAS,UACT,KAAMC,GACN,MAAO,SACP,YAAa,SACb,WAAY,KAAA,CAEhB,EAKaC,GAAmC,CAC9C,QAAS,YACT,KAAMF,EACN,MAAO,OACP,YAAa,MACb,WAAY,KACd,EAWO,SAASG,GAAa7E,EAA4B,CACvD,MAAM8E,EAAiB9E,EAAK,YAAA,EAAc,KAAA,EAC1C,OAAOsE,GAAgBQ,CAAc,GAAKF,EAC5C,CASO,SAASG,GAAe/E,EAA4B,CACzD,OAAO6E,GAAa7E,CAAI,EAAE,OAC5B,CCnDA,SAASc,GAAeC,EAAoB,CAC1C,OAAIA,EAAK,IAAa,GAAGA,CAAE,KAEpB,IADUA,EAAK,KAAM,QAAQ,CAAC,CACpB,GACnB,CAKA,SAASiE,GAAczC,EAAgB,CACrC,MAAM0C,EAAY,CAChB,QAAS,CAAE,KAAMC,GAAc,MAAO,oCAAA,EACtC,MAAO,CAAE,KAAMC,GAAS,MAAO,kBAAA,EAC/B,QAAS,CAAE,KAAM5B,GAAO,MAAO,cAAA,CAAe,EAEhD,OAAO0B,EAAU1C,CAAgC,GAAK0C,EAAU,KAClE,CAKA,SAASG,EAAaC,EAAwB,CAC5C,OAAI,OAAOA,GAAU,SAAiBA,EAClCA,GAAS,OAAOA,GAAU,SAAiB,KAAK,UAAUA,CAAK,EAC5D,OAAOA,GAAS,EAAE,CAC3B,CAKA,SAASC,GAAwB1D,EAA+B2D,EAAsBnE,EAA4D,CAChJ,MAAMoE,EAAQ5D,EAAU,MAExB,GAAI2D,IAAW,QAAS,CACtB,MAAME,EAAkB,CAAA,EACxBA,EAAM,KAAK,OAAOrE,EAAc,CAAE,GAAI,6CAAA,CAA+C,CAAC,MAAM,EAC5FqE,EAAM,KAAK,EAAE,EAEb,UAAWC,KAAQF,EACjBC,EAAM,KAAK,YAAYC,EAAK,IAAI,MAAM,EACtCD,EAAM,KAAK,OAAO,EAClBA,EAAM,KAAKL,EAAaM,EAAK,MAAM,CAAC,EACpCD,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,YAAY,EACvBA,EAAM,KAAKC,EAAK,OAAO,QAAUtE,EAAc,CAAE,GAAI,kCAAA,CAAoC,CAAC,EAC1FqE,EAAM,KAAK,EAAE,EAGf,OAAAA,EAAM,KAAK,OAAOrE,EAAc,CAAE,GAAI,oCAAA,CAAsC,CAAC,MAAM,EACnFqE,EAAM,KAAK,EAAE,EACbA,EAAM,KAAKrE,EAAc,CAAE,GAAI,wCAAA,CAA0C,CAAC,EAEnEqE,EAAM,KAAK;AAAA,CAAI,CACxB,CAEA,GAAIF,IAAW,OAAQ,CACrB,MAAMI,EAAiB,CAAA,EACvBA,EAAK,KAAK,eAAe,EACzBA,EAAK,KAAK,UAAU,EAEpB,UAAWD,KAAQF,EAAO,CACxBG,EAAK,KAAK,eAAeD,EAAK,IAAI,EAAE,EACpCC,EAAK,KAAK,oBAAoBD,EAAK,SAAS,EAAE,EAC9CC,EAAK,KAAK,iBAAiB,EAC3BP,EAAaM,EAAK,MAAM,EAAE,MAAM;AAAA,CAAI,EAAE,QAAQE,GAAQ,CACpDD,EAAK,KAAK,WAAWC,CAAI,EAAE,CAC7B,CAAC,EACDD,EAAK,KAAK,mBAAmB,EAC7B,MAAME,EAASH,EAAK,OAAO,QAAU,GACjCG,EACFA,EAAO,MAAM;AAAA,CAAI,EAAE,QAAQD,GAAQ,CACjCD,EAAK,KAAK,WAAWC,CAAI,EAAE,CAC7B,CAAC,EAEDD,EAAK,KAAK,WAAWvE,EAAc,CAAE,GAAI,mCAAoC,CAAC,EAAE,CAEpF,CAEA,OAAOuE,EAAK,KAAK;AAAA,CAAI,CACvB,CAGA,OAAO,KAAK,UACVH,EAAM,IAAK,IAAO,CAChB,KAAM,EAAE,KACR,UAAW,EAAE,UACb,OAAQJ,EAAa,EAAE,MAAM,EAC7B,SAAU,EAAE,OAAO,QAAU,EAAA,EAC7B,EACF,KACA,CAAA,CAEJ,CAOA,SAASU,GAAY,CAAE,KAAAJ,EAAM,SAAAK,EAAU,WAAAC,EAAY,SAAAC,GAA8B,CAC/E,KAAM,CAAE,cAAA7E,CAAA,EAAkBC,EAAA,EACpB6E,EAAalB,GAAcU,EAAK,MAAgB,EAAE,KAClDS,EAAcnB,GAAcU,EAAK,MAAgB,EAAE,MAEzD,OACEzC,EAAAA,KAACH,EAAA,CACC,UAAWC,EACT,iCACAgD,GAAY,kCAAA,EAId,SAAA,CAAA9C,EAAAA,KAAC,MAAA,CACC,UAAU,sHACV,QAASgD,EACT,KAAK,SACL,gBAAeD,EACf,SAAU,EACV,UAAYvD,GAAM,EAAMA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,MAAKwD,EAAA,CAAY,EAExE,SAAA,CAAAhD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAA+C,EACCnD,EAAAA,IAACuD,GAAY,UAAU,+BAAA,CAAgC,EAEvDvD,EAAAA,IAACwD,EAAA,CAAa,UAAU,+BAAA,CAAgC,EAE1DpD,EAAAA,KAAC,OAAA,CAAK,UAAU,wBAAyB,SAAA,CAAA7B,EAAc,CAAE,GAAI,mBAAoB,EAAE,IAAEsE,EAAK,IAAA,EAAK,EAC9FK,GACClD,EAAAA,IAACK,EAAA,CAAM,QAAQ,UAAU,UAAU,qBAChC,SAAA9B,EAAc,CAAE,GAAI,gCAAA,CAAkC,CAAA,CACzD,CAAA,EAEJ,EACA6B,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,0BAA0B,MAAO7B,EAAc,CAAE,GAAI,uBAAA,CAAyB,EAC5F,SAAA,CAAAyB,EAAAA,IAACS,EAAA,CAAM,UAAU,SAAA,CAAU,EAC1B,IAAI,KAAKoC,EAAK,SAAS,EAAE,mBAAA,CAAmB,EAC/C,EACAzC,EAAAA,KAAC,OAAA,CAAK,UAAWF,EAAG,sCAAuCoD,CAAW,EAAG,MAAO/E,EAAc,CAAE,GAAI,oBAAA,CAAsB,EACxH,SAAA,CAAAyB,EAAAA,IAACqD,EAAA,CAAW,UAAU,aAAA,CAAc,EACnCR,EAAK,MAAA,EACR,EACA7C,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAoB,MAAOzB,EAAc,CAAE,GAAI,sBAAA,CAAwB,EACpF,SAAAN,GAAe4E,EAAK,WAAW,CAAA,CAClC,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,EAIDM,GACC/C,EAAAA,KAAC,MAAA,CAAI,UAAU,gBAEb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,qEACZ,SAAA,CAAAJ,EAAAA,IAACyD,GAAA,CAAK,UAAU,uBAAuB,cAAY,OAAO,EACzDlF,EAAc,CAAE,GAAI,oCAAA,CAAsC,CAAA,EAC7D,QACC,MAAA,CAAI,UAAU,mGACZ,SAAAgE,EAAaM,EAAK,MAAM,CAAA,CAC3B,CAAA,EACF,EAGCA,EAAK,OAAO,QACXzC,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,qEACZ,SAAA,CAAAJ,EAAAA,IAAC0D,GAAA,CAAI,UAAU,wBAAwB,cAAY,OAAO,EACzDnF,EAAc,CAAE,GAAI,2CAAA,CAA6C,CAAA,EACpE,QACC,MAAA,CAAI,UAAU,yHACZ,SAAAsE,EAAK,OAAO,MAAA,CACf,CAAA,EACF,EAIDA,EAAK,OAAO,QACXzC,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,sEACZ,SAAA,CAAAJ,EAAAA,IAAC2D,GAAA,CAAc,UAAU,UAAU,cAAY,OAAO,EACrDpF,EAAc,CAAE,GAAI,gCAAA,CAAkC,CAAA,EACzD,QACC,MAAA,CAAI,UAAU,0HACZ,SAAAsE,EAAK,OAAO,MAAA,CACf,CAAA,EACF,EAIDA,EAAK,OAAO,WACXzC,EAAAA,KAAC,MAAA,CAAI,UAAU,2GACb,SAAA,CAAAJ,EAAAA,IAAC4D,GAAA,CAAK,UAAU,wBAAwB,cAAY,OAAO,QAC1D,OAAA,CAAM,SAAArF,EAAc,CAAE,GAAI,yCAAA,CAA2C,CAAA,CAAE,CAAA,CAAA,CAC1E,CAAA,CAAA,CAEJ,CAAA,CAAA,CAAA,CAIR,CAMA,SAASsF,GAAY,CAAE,MAAAlB,GAAwC,CAE7D,KAAM,CAACmB,EAAeC,CAAgB,EAAItE,EAAAA,SAA4B,IAChEkD,EAAM,SAAW,MAAc,IAC5B,IAAI,IAAI,CAACA,EAAMA,EAAM,OAAS,CAAC,EAAE,IAAI,CAAC,CAC9C,EAEKqB,EAAevF,cAAmBwF,GAAuB,CAC7DF,EAAkBG,GAAS,CACzB,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAIC,EAAK,IAAIF,CAAU,EACrBE,EAAK,OAAOF,CAAU,EAEtBE,EAAK,IAAIF,CAAU,EAEdE,CACT,CAAC,CACH,EAAG,CAAA,CAAE,EAEL,OACEnE,EAAAA,IAAC,MAAA,CAAI,UAAU,YACZ,SAAA2C,EAAM,IAAI,CAACE,EAAMuB,IAChBhE,EAAAA,KAACiE,EAAAA,SAAA,CACC,SAAA,CAAArE,EAAAA,IAACiD,GAAA,CACC,KAAAJ,EACA,SAAUuB,IAAQzB,EAAM,OAAS,EACjC,WAAYmB,EAAc,IAAIjB,EAAK,IAAI,EACvC,SAAU,IAAMmB,EAAanB,EAAK,IAAI,CAAA,CAAA,EAGvCuB,EAAMzB,EAAM,OAAS,SACnB,MAAA,CAAI,UAAU,sBAAsB,cAAY,OAC/C,SAAA3C,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAqB,CAAA,CACtC,CAAA,CAAA,EAXiB6C,EAAK,IAa1B,CACD,EACH,CAEJ,CAKA,SAASyB,GAAiB,CAAE,OAAAC,EAAQ,OAAA7B,EAAQ,eAAA8B,GAAyC,CACnF,KAAM,CAAE,cAAAjG,CAAA,EAAkBC,EAAA,EAE1B,OACE4B,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,gDACZ,SAAA,CAAAJ,EAAAA,IAACyE,GAAA,CAAO,UAAU,UAAU,cAAY,OAAO,EAC9ClG,EAAc,CAAE,GAAI,4CAAA,CAA8C,CAAA,EACrE,EACAyB,EAAAA,IAAC,MAAA,CAAI,UAAU,aACX,SAAA,CAAC,QAAS,OAAQ,MAAM,EAAY,IAAK0E,GACzC1E,EAAAA,IAACc,EAAA,CAEC,KAAK,KACL,QAAS4B,IAAWgC,EAAM,UAAY,UACtC,QAAS,IAAMF,EAAeE,CAAG,EACjC,UAAU,mBAET,WAAI,YAAA,CAAY,EANZA,CAAA,CAQR,CAAA,CACH,CAAA,EACF,EACA1E,EAAAA,IAAC,MAAA,CAAI,UAAU,gIACZ,SAAAuE,CAAA,CACH,CAAA,EACF,CAEJ,CAOA,SAASI,GAAiBlH,EAAmC,CAC3D,OAAIA,GAAS,MAAQA,IAAU,EAAU,IACrCA,GAAS,IAAkB,IAAIA,EAAQ,KAAW,QAAQ,CAAC,CAAC,IAC5DA,GAAS,IAAc,IAAIA,EAAQ,KAAO,QAAQ,CAAC,CAAC,IACjDA,EAAM,eAAA,CACf,CAKA,SAASmH,GAAmB,CAAE,OAAAC,EAAQ,UAAAzF,GAA8D,CAClG,cACG,MAAA,CAAI,UAAWc,EAAG,wDAAyDd,CAAS,EACnF,SAAA,CAAAgB,EAAAA,KAAC,OAAA,CAAK,UAAU,0BAA0B,MAAM,eAC9C,SAAA,CAAAJ,EAAAA,IAACtF,GAAA,CAAM,UAAU,SAAA,CAAU,EAC1BiK,GAAiBE,EAAO,KAAK,CAAA,EAChC,EACCA,EAAO,OAAS,MACfzE,EAAAA,KAAC,OAAA,CAAK,MAAM,eAAe,SAAA,CAAA,OAAKuE,GAAiBE,EAAO,KAAK,CAAA,EAAE,EAEhEA,EAAO,QAAU,MAChBzE,EAAAA,KAAC,OAAA,CAAK,MAAM,gBAAgB,SAAA,CAAA,QAAMuE,GAAiBE,EAAO,MAAM,CAAA,CAAA,CAAE,CAAA,EAEtE,CAEJ,CAKA,SAASC,GAAmB,CAAE,SAAAC,EAAU,MAAAC,GAAsD,CAC5F,OACE5E,EAAAA,KAAC,UAAA,CAAQ,UAAU,gEACjB,SAAA,CAAAA,EAAAA,KAAC,UAAA,CAAQ,UAAU,yFACjB,SAAA,CAAAJ,EAAAA,IAACiF,GAAA,CAAO,UAAU,6CAAA,CAA8C,EAChEjF,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,WAAS,KAAK,EACvDI,EAAAA,KAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,CAAA,IAAE4E,EAAQ,CAAA,CAAA,CAAE,CAAA,EACtD,EACA5E,EAAAA,KAAC,MAAA,CAAI,UAAU,sDACZ,SAAA,CAAA2E,EAAS,WACR3E,OAAC,MAAA,CAAI,UAAU,MACb,SAAA,CAAAJ,EAAAA,IAAC,IAAA,CAAE,UAAU,iDAAiD,SAAA,QAAK,EACnEA,EAAAA,IAAC,MAAA,CAAI,UAAU,yHACZ,WAAS,SAAA,CACZ,CAAA,EACF,EAED+E,EAAS,QACR3E,OAAC,MAAA,CAAI,UAAU,MACb,SAAA,CAAAJ,EAAAA,IAAC,IAAA,CAAE,UAAU,iDAAiD,SAAA,SAAM,EACpEA,EAAAA,IAAC,MAAA,CAAI,UAAU,yHACZ,WAAS,MAAA,CACZ,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,CAYA,SAASkF,GAAe,CAAE,KAAArC,EAAM,SAAAK,EAAU,WAAAC,EAAY,SAAAC,GAAiC,CACrF,KAAM,CAAE,cAAA7E,CAAA,EAAkBC,EAAA,EACpB2G,EAAStC,EAAK,OAAS,OACvBuC,EAAWD,EAAS1B,GAAOC,GAEjC,OACEtD,EAAAA,KAACH,EAAA,CACC,UAAWC,EACT,iCACAiF,EAAS,cAAgB,oCACzBjC,GAAY,kCAAA,EAId,SAAA,CAAA9C,EAAAA,KAAC,MAAA,CACC,UAAU,2HACV,QAASgD,EACT,KAAK,SACL,gBAAeD,EACf,SAAU,EACV,UAAYvD,GAAM,EAAMA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,MAAKwD,EAAA,CAAY,EAExE,SAAA,CAAAhD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAA+C,EACCnD,EAAAA,IAACuD,GAAY,UAAU,+BAAA,CAAgC,EAEvDvD,EAAAA,IAACwD,EAAA,CAAa,UAAU,+BAAA,CAAgC,EAE1DxD,MAACoF,GAAS,UAAWlF,EAAG,UAAWiF,EAAS,eAAiB,eAAe,EAAG,EAC/EnF,EAAAA,IAAC,OAAA,CAAK,UAAU,mCAAoC,WAAK,KAAK,EAC9DI,EAAAA,KAAC,OAAA,CAAK,UAAU,gCAAgC,SAAA,CAAA,IAAEyC,EAAK,UAAA,EAAW,EACjEK,GACClD,EAAAA,IAACK,EAAA,CAAM,QAAQ,UAAU,UAAU,qBAChC,SAAA9B,EAAc,CAAE,GAAI,gCAAA,CAAkC,CAAA,CACzD,CAAA,EAEJ,EACA6B,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACZ,SAAA,CAAAyC,EAAK,WACJzC,OAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAJ,EAAAA,IAACS,EAAA,CAAM,UAAU,SAAA,CAAU,EAC1B,IAAI,KAAKoC,EAAK,SAAS,EAAE,mBAAA,CAAmB,EAC/C,EAEDA,EAAK,QAAU7C,MAAC4E,GAAA,CAAmB,OAAQ/B,EAAK,MAAA,CAAQ,CAAA,CAAA,CAC3D,CAAA,CAAA,CAAA,EAIDM,GACC/C,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACZ,SAAA,CAAAyC,EAAK,eACH,MAAA,CAAI,UAAU,iIACZ,SAAAN,EAAaM,EAAK,OAAO,CAAA,CAC5B,EAIDA,EAAK,UAAYA,EAAK,SAAS,OAAS,GACvCzC,EAAAA,KAAC,UAAA,CAAQ,UAAU,iBAAiB,KAAI,GACtC,SAAA,CAAAA,EAAAA,KAAC,UAAA,CAAQ,UAAU,8GACjB,SAAA,CAAAJ,EAAAA,IAAC4B,GAAA,CAAM,UAAU,SAAA,CAAU,EAC3B5B,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,SAAA,WAAQ,EACtCI,EAAAA,KAAC,OAAA,CAAK,UAAU,UAAU,SAAA,CAAA,IAAEyC,EAAK,SAAS,OAAO,GAAA,CAAA,CAAC,CAAA,EACpD,QACC,KAAA,CAAG,UAAU,8DACX,SAAAA,EAAK,SAAS,IAAI,CAACwC,EAASC,UAC1B,KAAA,CAAW,UAAU,kBAAmB,SAAAD,CAAA,EAAhCC,CAAwC,CAClD,CAAA,CACH,CAAA,EACF,EAIDzC,EAAK,WAAaA,EAAK,UAAU,OAAS,GACzCzC,EAAAA,KAAC,UAAA,CAAQ,UAAU,cACjB,SAAA,CAAAA,EAAAA,KAAC,UAAA,CAAQ,UAAU,8GACjB,SAAA,CAAAJ,EAAAA,IAACiF,GAAA,CAAO,UAAU,SAAA,CAAU,EAC5BjF,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAc,SAAA,aAAU,EACxCI,EAAAA,KAAC,OAAA,CAAK,UAAU,UAAU,SAAA,CAAA,IAAEyC,EAAK,UAAU,OAAO,GAAA,CAAA,CAAC,CAAA,EACrD,QACC,MAAA,CAAI,UAAU,iBACZ,SAAAA,EAAK,UAAU,IAAI,CAAC0C,EAAID,IACvBtF,EAAAA,IAAC8E,IAA2B,SAAUS,EAAI,MAAOD,CAAA,EAAxBA,CAA2B,CACrD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CAAA,CAIR,CASA,SAASE,GAAe,CAAE,MAAA7C,GAA8B,CAEtD,KAAM,CAACmB,EAAeC,CAAgB,EAAItE,EAAAA,SAA4B,IAChEkD,EAAM,SAAW,MAAc,IAC5B,IAAI,IAAI,CAACA,EAAMA,EAAM,OAAS,CAAC,EAAE,UAAU,CAAC,CACpD,EAEKqB,EAAevF,cAAmBwF,GAAuB,CAC7DF,EAAkBG,GAAS,CACzB,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAIC,EAAK,IAAIF,CAAU,EACrBE,EAAK,OAAOF,CAAU,EAEtBE,EAAK,IAAIF,CAAU,EAEdE,CACT,CAAC,CACH,EAAG,CAAA,CAAE,EAEL,OAAIxB,EAAM,SAAW,EAEjB3C,EAAAA,IAAC,MAAA,CAAI,UAAU,8DAA8D,SAAA,mCAE7E,EAKFA,EAAAA,IAAC,MAAA,CAAI,UAAU,YACZ,SAAA2C,EAAM,IAAI,CAACE,EAAMuB,IAChBhE,EAAAA,KAACiE,EAAAA,SAAA,CACC,SAAA,CAAArE,EAAAA,IAACkF,GAAA,CACC,KAAArC,EACA,SAAUuB,IAAQzB,EAAM,OAAS,EACjC,WAAYmB,EAAc,IAAIjB,EAAK,UAAU,EAC7C,SAAU,IAAMmB,EAAanB,EAAK,UAAU,CAAA,CAAA,EAE7CuB,EAAMzB,EAAM,OAAS,SACnB,MAAA,CAAI,UAAU,sBAAsB,cAAY,OAC/C,SAAA3C,EAAAA,IAAC,MAAA,CAAI,UAAU,qBAAqB,CAAA,CACtC,CAAA,CAAA,EAViB6C,EAAK,UAY1B,CACD,EACH,CAEJ,CAaO,SAAS4C,GAAe,CAC7B,YAAA/J,EACA,UAAWgK,EACX,KAAAC,EACA,aAAAC,CACF,EAAwB,CACtB,KAAM,CAAE,cAAArH,CAAA,EAAkBC,EAAA,EACpB,CAACqH,EAAUC,CAAW,EAAIrG,EAAAA,SAAyB,UAAU,EAC7D,CAACsG,EAAcC,CAAe,EAAIvG,EAAAA,SAA6B,OAAO,EAEtE,CAAE,KAAMV,EAAW,UAAAkH,CAAA,EAAcxK,GAAsBkK,EAAOjK,EAAc,IAAI,EAGhF,CAAE,KAAMwK,EAAe,UAAWC,GAAkB5E,GACxDsE,IAAa,UAAYF,EAAOjK,EAAc,IAAA,EAI1C0K,EAAqBC,EAAAA,QAAc,IAClCtH,GAAA,MAAAA,EAAW,MACT0D,GAAwB1D,EAAWgH,EAAcxH,CAAa,EADvC,GAE7B,CAACQ,EAAWgH,EAAcxH,CAAa,CAAC,EAGrC+H,EAAkB7H,EAAAA,YACtB,MAAO8H,EAAcC,IAAkB,CACrC,GAAI,CACF,MAAM,UAAU,UAAU,UAAUD,CAAI,EAExC,QAAQ,IAAI,UAAUC,CAAK,eAAe,CAC5C,OAASC,EAAK,CACZ,QAAQ,MAAM,kBAAmBA,CAAG,CACtC,CACF,EACA,CAAA,CAAC,EAIGC,EAAgBL,EAAAA,QAAc,IAC7BtH,GAAA,MAAAA,EAAW,MACTA,EAAU,MAAM,OAAO,CAAC4H,EAAKC,IAAMD,EAAMC,EAAE,YAAa,CAAC,EADlC,EAE7B,CAAC7H,CAAS,CAAC,EAEd,aACG8H,GAAA,CAAO,KAAAlB,EAAY,aAAAC,EAClB,SAAAxF,EAAAA,KAAC0G,GAAA,CAAc,UAAU,2DACvB,SAAA,CAAA1G,EAAAA,KAAC2G,GAAA,CAAa,UAAU,mCACtB,SAAA,CAAA3G,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,KAAC4G,GAAA,CAAY,UAAU,0BACrB,SAAA,CAAAhH,EAAAA,IAAC6B,EAAA,CAAS,UAAU,SAAA,CAAU,EAC7BtD,EAAc,CAAE,GAAI,8BAAA,CAAgC,CAAA,EACvD,EACCQ,GACCqB,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAJ,EAAAA,IAACK,GAAM,QAAS6B,GAAenD,EAAU,IAAI,EAAG,MAAOR,EAAc,CAAE,GAAI,mBAAoB,EAC5F,SAAAQ,EAAU,KAAK,cAClB,EACCA,EAAU,MAAQiB,EAAAA,IAACK,EAAA,CAAM,QAAQ,YAAY,MAAO9B,EAAc,CAAE,GAAI,kBAAA,CAAoB,EAAI,WAAU,KAAK,EAChHyB,EAAAA,IAAC,OAAA,CAAK,UAAU,0CAA0C,MAAOzB,EAAc,CAAE,GAAI,sBAAA,CAAwB,EAC1G,SAAAN,GAAeyI,CAAa,CAAA,CAC/B,CAAA,CAAA,CACF,CAAA,EAEJ,EACC3H,GACCqB,EAAAA,KAAC,MAAA,CAAI,UAAU,6DACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,0BAA0B,MAAO7B,EAAc,CAAE,GAAI,qBAAA,CAAuB,EAC1F,SAAA,CAAAyB,EAAAA,IAACiH,GAAA,CAAS,UAAU,SAAA,CAAU,EAC7B,IAAI,KAAKlI,EAAU,UAAU,EAAE,eAAA,CAAe,EACjD,EACAqB,EAAAA,KAAC,OAAA,CAAK,UAAU,0BAA0B,MAAO7B,EAAc,CAAE,GAAI,gBAAA,CAAkB,EACrF,SAAA,CAAAyB,EAAAA,IAACW,GAAA,CAAK,UAAU,SAAA,CAAU,EACzB5B,EAAU,GAAG,MAAM,EAAG,CAAC,CAAA,EAC1B,SACC,OAAA,CAAM,SAAA,CAAAA,EAAU,WAAW,IAAER,EAAc,CAAE,GAAI,+BAAA,CAAiC,CAAA,CAAA,CAAE,CAAA,CAAA,CACvF,CAAA,EAEJ,EAEC0H,QACE,MAAA,CAAI,UAAU,0CACb,SAAAjG,EAAAA,IAAC,MAAA,CAAI,UAAU,wBAAyB,SAAAzB,EAAc,CAAE,GAAI,iCAAA,CAAmC,CAAA,CAAE,CAAA,CACnG,EACEQ,GAAA,MAAAA,EAAW,OAASA,EAAU,MAAM,OAAS,EAC/CqB,EAAAA,KAAA8G,EAAAA,SAAA,CAEE,SAAA,CAAA9G,EAAAA,KAAC,MAAA,CAAI,UAAU,sDACb,SAAA,CAAAA,EAAAA,KAACU,EAAA,CACC,KAAK,KACL,QAAS+E,IAAa,WAAa,UAAY,UAC/C,QAAS,IAAMC,EAAY,UAAU,EACrC,UAAU,MAEV,SAAA,CAAA9F,EAAAA,IAACyE,GAAA,CAAO,UAAU,cAAA,CAAe,EAChClG,EAAc,CAAE,GAAI,qCAAA,CAAuC,CAAA,CAAA,CAAA,EAE7DQ,EAAU,MAAM,OAAS,GACxBqB,EAAAA,KAACU,EAAA,CACC,KAAK,KACL,QAAS+E,IAAa,eAAiB,UAAY,UACnD,QAAS,IAAMC,EAAY,cAAc,EACzC,UAAU,MAEV,SAAA,CAAA9F,EAAAA,IAACkB,EAAA,CAAK,UAAU,cAAA,CAAe,EAC9B3C,EAAc,CAAE,GAAI,0CAAA,CAA4C,CAAA,CAAA,CAAA,EAGrE6B,EAAAA,KAACU,EAAA,CACC,KAAK,KACL,QAAS+E,IAAa,SAAW,UAAY,UAC7C,QAAS,IAAMC,EAAY,QAAQ,EACnC,UAAU,MAEV,SAAA,CAAA9F,EAAAA,IAACQ,EAAA,CAAS,UAAU,cAAA,CAAe,EAClCjC,EAAc,CAAE,GAAI,oCAAA,CAAsC,CAAA,CAAA,CAAA,CAC7D,EACF,EAGAyB,EAAAA,IAAC,MAAA,CAAI,UAAU,mCACZ,SAAA6F,IAAa,WACZ7F,EAAAA,IAAC6D,GAAA,CAAY,MAAO9E,EAAU,KAAA,CAAO,EACnC8G,IAAa,eACf7F,EAAAA,IAACsE,GAAA,CACC,OAAQ8B,EACR,OAAQL,EACR,eAAgBC,CAAA,CAAA,EAEhBH,IAAa,SACfM,EACE/F,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAJ,EAAAA,IAACmH,GAAA,CAAQ,UAAU,2BAAA,CAA4B,EAC/CnH,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,2BAAA,CAAyB,CAAA,CAAA,CACnE,EACEkG,EACFlG,EAAAA,IAACwF,GAAA,CAAe,MAAOU,EAAc,KAAA,CAAO,EAE5ClG,EAAAA,IAAC,MAAA,CAAI,UAAU,8DAA8D,SAAA,kCAAA,CAE7E,EAEA,KACN,EAGAI,EAAAA,KAAC,MAAA,CAAI,UAAU,kEACb,SAAA,CAAAA,EAAAA,KAACU,EAAA,CACC,KAAK,KACL,QAAQ,UACR,QAAS,IAAMwF,EAAgBvH,EAAU,GAAI,IAAI,EACjD,UAAU,MAEV,SAAA,CAAAiB,EAAAA,IAACkB,EAAA,CAAK,UAAU,cAAA,CAAe,EAC9B3C,EAAc,CAAE,GAAI,gCAAA,CAAkC,CAAA,CAAA,CAAA,EAExDQ,EAAU,MAAM,OAAS,GAAK8G,IAAa,gBAC1CzF,EAAAA,KAACU,EAAA,CACC,KAAK,KACL,QAAQ,UACR,QAAS,IAAMwF,EAAgBF,EAAoB,QAAQ,EAC3D,UAAU,MAEV,SAAA,CAAApG,EAAAA,IAACkB,EAAA,CAAK,UAAU,cAAA,CAAe,EAC9B3C,EAAc,CAAE,GAAI,oCAAA,CAAsC,CAAA,CAAA,CAAA,CAC7D,CAAA,CAEJ,CAAA,CAAA,CACF,EAEAyB,EAAAA,IAAC,MAAA,CAAI,UAAU,gEACZ,WAAc,CAAE,GAAI,mCAAA,CAAqC,CAAA,CAC5D,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CC3tBO,MAAMoH,GAAwB,CACnC,IAAK,CAAC,mBAAmB,EACzB,QAAS,IAAM,CAAC,GAAGA,GAAsB,IAAK,QAAQ,EACtD,OAASC,GAA4B,CAAC,GAAGD,GAAsB,QAAA,EAAWC,CAAQ,CACpF,EAIM9L,GAAa,IAAS,IACtBC,GAAU,KAAU,IA2BnB,SAAS8L,GACdD,EACAlK,EACAhE,EAAyC,CAAA,EACX,CAC9B,KAAM,CAAE,UAAAwC,EAAYJ,GAAY,OAAAK,EAASJ,GAAS,QAAAR,EAAU,IAAS7B,EAE/DE,EAAQ6B,EAAwB,CACpC,SAAUkM,GAAsB,OAAOC,CAAQ,EAC/C,QAAS,IAAM,CACb,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,sBAAsB,EACrD,OAAOE,GAA8B,CACnC,SAAAF,EACA,KAAAlK,CAAA,CACD,CACH,EACA,QAAS,CAAC,CAACkK,GAAYrM,EACvB,UAAAW,EACA,OAAAC,EACA,qBAAsB,GACtB,eAAgB,GAChB,mBAAoB,GACpB,MAAO,EACP,WAAaE,GAAiB,KAAK,IAAI,IAAO,GAAKA,EAAc,GAAK,CAAA,CACvE,EAEKC,EAAU,SAAY,CAC1B,MAAM1C,EAAM,QAAA,CACd,EAEA,MAAO,CACL,KAAMA,EAAM,KACZ,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAA0C,CAAA,CAEJ,CC3BA,SAASwG,GAAaC,EAAwB,CAC5C,OAAI,OAAOA,GAAU,SAAiBA,EAClCA,GAAS,OAAOA,GAAU,SAAiB,KAAK,UAAUA,CAAK,EAC5D,OAAOA,GAAS,EAAE,CAC3B,CAKA,SAASmC,EAAiBlH,EAAmC,CAC3D,OAAIA,GAAS,MAAQA,IAAU,EAAU,IACrCA,GAAS,IAAkB,IAAIA,EAAQ,KAAW,QAAQ,CAAC,CAAC,IAC5DA,GAAS,IAAc,IAAIA,EAAQ,KAAO,QAAQ,CAAC,CAAC,IACjDA,EAAM,eAAA,CACf,CAKA,SAAS+J,GAAkB9H,EAAkC,CAC3D,OAAQA,EAAA,CACN,IAAK,YACL,IAAK,UACH,OAAOM,EAAAA,IAACyH,GAAA,CAAY,UAAU,4BAAA,CAA6B,EAC7D,IAAK,QACL,IAAK,SACH,OAAOzH,EAAAA,IAACsC,GAAA,CAAQ,UAAU,8BAAA,CAA+B,EAC3D,IAAK,UACL,IAAK,UACH,OAAOtC,EAAAA,IAACmH,GAAA,CAAQ,UAAU,wCAAA,CAAyC,EACrE,QACE,OAAOnH,EAAAA,IAACiF,GAAA,CAAO,UAAU,mCAAA,CAAoC,CAAA,CAEnE,CAKA,SAASyC,GAAiBhI,EAAuF,CAC/G,OAAQA,EAAA,CACN,IAAK,YACL,IAAK,UACH,MAAO,UACT,IAAK,QACL,IAAK,SACH,MAAO,UACT,IAAK,UACL,IAAK,UACH,MAAO,OACT,QACE,MAAO,WAAA,CAEb,CAOA,SAASiI,GAAS,CAAE,OAAA9C,EAAQ,UAAAzF,GAA4B,CACtD,KAAM,CAAE,cAAAb,CAAA,EAAkBC,EAAA,EACpBoJ,EAAQ/C,EAAO,OAAS,EACxBgD,EAAQhD,EAAO,OAAS,EACxB7B,EAAS6B,EAAO,QAAU,EAC1BiD,EAASjD,EAAO,QAAU,EAG1BkD,EAAeH,EAAQ,EAAKC,EAAQD,EAAS,IAAM,EACnDI,EAAgBJ,EAAQ,EAAK5E,EAAS4E,EAAS,IAAM,EACrDK,EAAgBL,EAAQ,EAAKE,EAASF,EAAS,IAAM,EAE3D,cACG,MAAA,CAAI,UAAW1H,EAAG,cAAed,CAAS,EAEzC,SAAA,CAAAgB,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACZ,SAAA,CAAAyH,EAAQ,GACP7H,EAAAA,IAAC,MAAA,CACC,UAAU,iBACV,MAAO,CAAE,MAAO,GAAG+H,CAAY,GAAA,EAC/B,MAAOxJ,EAAc,CAAE,GAAI,sCAAuC,eAAgB,gBAAA,EAAoB,CAAE,MAAOoG,EAAiBkD,CAAK,EAAG,CAAA,CAAA,EAG3I7E,EAAS,GACRhD,EAAAA,IAAC,MAAA,CACC,UAAU,kBACV,MAAO,CAAE,MAAO,GAAGgI,CAAa,GAAA,EAChC,MAAOzJ,EAAc,CAAE,GAAI,uCAAwC,eAAgB,iBAAA,EAAqB,CAAE,MAAOoG,EAAiB3B,CAAM,EAAG,CAAA,CAAA,EAG9I8E,EAAS,GACR9H,EAAAA,IAAC,MAAA,CACC,UAAU,kBACV,MAAO,CAAE,MAAO,GAAGiI,CAAa,GAAA,EAChC,MAAO1J,EAAc,CAAE,GAAI,uCAAwC,eAAgB,iBAAA,EAAqB,CAAE,MAAOoG,EAAiBmD,CAAM,EAAG,CAAA,CAAA,CAC7I,EAEJ,EAEA1H,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAJ,EAAAA,IAACtF,GAAA,CAAM,UAAU,SAAA,CAAU,EAC1BiK,EAAiBiD,CAAK,CAAA,EACzB,EACCC,EAAQ,GACPzH,OAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAJ,EAAAA,IAACxF,GAAA,CAAY,UAAU,uBAAA,CAAwB,EAC9CmK,EAAiBkD,CAAK,CAAA,EACzB,EAED7E,EAAS,GACR5C,OAAC,OAAA,CAAK,UAAU,qCAAqC,SAAA,CAAA,QAC7CuE,EAAiB3B,CAAM,CAAA,EAC/B,EAED8E,EAAS,GACR1H,OAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAJ,EAAAA,IAACkI,GAAA,CAAQ,UAAU,wBAAA,CAAyB,EAC3CvD,EAAiBmD,CAAM,CAAA,CAAA,CAC1B,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,CAKA,SAASK,GAAc,CAAE,SAAApD,EAAU,MAAAC,GAA6B,CAC9D,KAAM,CAAE,cAAAzG,CAAA,EAAkBC,EAAA,EACpB,CAAC2E,EAAYiF,CAAa,EAAI3I,EAAAA,SAAe,EAAK,EAExD,OACEW,EAAAA,KAAC,MAAA,CAAI,UAAU,qDAEb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAMgI,EAAc,CAACjF,CAAU,EACxC,UAAU,mGACV,gBAAeA,EACf,gBAAe,kBAAkB4B,EAAS,IAAI,IAAIC,CAAK,GAEvD,SAAA,CAAA5E,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAA+C,EACCnD,EAAAA,IAACuD,GAAY,UAAU,+BAAA,CAAgC,EAEvDvD,EAAAA,IAACwD,EAAA,CAAa,UAAU,+BAAA,CAAgC,EAE1DxD,EAAAA,IAAC,OAAA,CAAK,aAAY+E,EAAS,OAAS,iBAAmB,sBACpD,SAAAyC,GAAkBzC,EAAS,OAAS,YAAc,MAAS,CAAA,CAC9D,EACA/E,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,WAAS,KAAK,EACvDI,EAAAA,KAAC,OAAA,CAAK,UAAU,gCAAgC,SAAA,CAAA,IAAE4E,EAAQ,CAAA,CAAA,CAAE,CAAA,EAC9D,QACC3E,EAAA,CAAM,QAASqH,GAAiB3C,EAAS,OAAS,YAAc,MAAS,EAAG,UAAU,UACpF,WAAc,CAAE,GAAI,4CAA6C,eAAgB,WAAA,CAAa,CAAA,CACjG,CAAA,CAAA,CAAA,EAID5B,GACC/C,EAAAA,KAAC,MAAA,CACC,GAAI,kBAAkB2E,EAAS,IAAI,IAAIC,CAAK,GAC5C,UAAU,sDAET,SAAA,CAAAD,EAAS,WACR3E,OAAC,MAAA,CAAI,UAAU,MACb,SAAA,CAAAJ,EAAAA,IAAC,IAAA,CAAE,UAAU,mDACV,SAAAzB,EAAc,CAAE,GAAI,+BAAgC,eAAgB,OAAA,CAAS,CAAA,CAChF,EACAyB,EAAAA,IAAC,MAAA,CAAI,UAAU,8HACZ,WAAS,SAAA,CACZ,CAAA,EACF,EAED+E,EAAS,QACR3E,OAAC,MAAA,CAAI,UAAU,MACb,SAAA,CAAAJ,EAAAA,IAAC,IAAA,CAAE,UAAU,mDACV,SAAAzB,EAAc,CAAE,GAAI,gCAAiC,eAAgB,QAAA,CAAU,CAAA,CAClF,EACAyB,EAAAA,IAAC,MAAA,CAAI,UAAU,8HACZ,WAAS,MAAA,CACZ,CAAA,EACF,EAED,CAAC+E,EAAS,WAAa,CAACA,EAAS,QAChC/E,EAAAA,IAAC,MAAA,CAAI,UAAU,2CACZ,WAAc,CAAE,GAAI,yCAA0C,eAAgB,mBAAA,CAAqB,CAAA,CACtG,CAAA,CAAA,CAAA,CAEJ,EAEJ,CAEJ,CAKA,SAASqI,GAAS,CAAE,KAAAxF,EAAM,SAAAK,EAAU,OAAAoF,GAAyB,CAC3D,KAAM,CAAE,cAAA/J,CAAA,EAAkBC,EAAA,EACpB2G,EAAStC,EAAK,OAAS,OACvBuC,EAAWD,EAAS1B,GAAOC,GAEjC,OACEtD,EAAAA,KAAC,MAAA,CAAI,UAAU,aAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,6BAEb,SAAA,CAAAJ,EAAAA,IAAC,MAAA,CACC,UAAWE,EACT,0EACAiF,EACI,4CACA,+CACJjC,GAAY,8CACZA,IAAaiC,EAAS,kBAAoB,mBAAA,EAG5C,SAAAnF,EAAAA,IAACoF,EAAA,CAAS,UAAU,SAAA,CAAU,CAAA,CAAA,EAG/B,CAACkD,GACAtI,EAAAA,IAAC,OAAI,UAAU,iCAAiC,cAAY,MAAA,CAAO,CAAA,EAEvE,EAGAI,EAAAA,KAAC,MAAA,CAAI,UAAU,cAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAJ,MAAC,QAAK,UAAWE,EACf,mCACAiF,EAAS,eAAiB,eAAA,EAEzB,WAAK,KACR,EACAnF,EAAAA,IAAC,OAAA,CAAK,UAAU,gCACb,SAAAzB,EACC,CAAE,GAAI,oCAAqC,eAAgB,gBAAA,EAC3D,CAAE,OAAQsE,EAAK,UAAA,CAAW,EAE9B,EACCK,GACClD,EAAAA,IAACK,EAAA,CAAM,QAAQ,UAAU,UAAU,qBAChC,SAAA9B,EAAc,CAAE,GAAI,4BAA6B,eAAgB,QAAA,CAAU,CAAA,CAC9E,CAAA,EAEJ,EACCsE,EAAK,WACJzC,OAAC,OAAA,CAAK,UAAU,wDACd,SAAA,CAAAJ,EAAAA,IAACS,EAAA,CAAM,UAAU,SAAA,CAAU,EAC1B,IAAI,KAAKoC,EAAK,SAAS,EAAE,mBAAA,CAAmB,CAAA,CAC/C,CAAA,EAEJ,EAGAzC,EAAAA,KAAC,MAAA,CACC,UAAWF,EACT,oCACAiF,EACI,4BACA,sDAAA,EAIL,SAAA,CAAAtC,EAAK,SACJ7C,MAAC,MAAA,CAAI,UAAU,MACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,iGACZ,SAAAuC,GAAaM,EAAK,OAAO,EAC5B,EACF,EAIDA,EAAK,UAAYA,EAAK,SAAS,OAAS,GACvCzC,EAAAA,KAAC,UAAA,CAAQ,UAAU,2CACjB,SAAA,CAAAA,EAAAA,KAAC,UAAA,CAAQ,UAAU,2FACjB,SAAA,CAAAJ,EAAAA,IAAC4B,GAAA,CAAM,UAAU,yBAAA,CAA0B,EAC3C5B,EAAAA,IAAC,OAAA,CAAK,UAAU,oCACb,SAAAzB,EAAc,CAAE,GAAI,8BAA+B,eAAgB,UAAA,CAAY,CAAA,CAClF,EACA6B,EAAAA,KAAC,OAAA,CAAK,UAAU,gCAAgC,SAAA,CAAA,IAC5CyC,EAAK,SAAS,OAAO,GAAA,CAAA,CACzB,CAAA,EACF,EACA7C,EAAAA,IAAC,MAAG,UAAU,0EACX,WAAK,SAAS,IAAI,CAACqF,EAASC,IAC3BtF,EAAAA,IAAC,MAA2C,UAAU,uBAAwB,YAArE,WAAW6C,EAAK,UAAU,IAAIyC,CAAC,EAA8C,CACvF,CAAA,CACH,CAAA,EACF,EAIDzC,EAAK,WAAaA,EAAK,UAAU,OAAS,GACzCzC,EAAAA,KAAC,MAAA,CAAI,UAAU,0CACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,6DACb,SAAA,CAAAJ,EAAAA,IAACiF,GAAA,CAAO,UAAU,SAAA,CAAU,EAC5BjF,EAAAA,IAAC,OAAA,CAAK,UAAU,cACb,SAAAzB,EAAc,CAAE,GAAI,+BAAgC,eAAgB,YAAA,CAAc,CAAA,CACrF,EACA6B,EAAAA,KAAC,OAAA,CAAK,UAAU,UAAU,SAAA,CAAA,IAAEyC,EAAK,UAAU,OAAO,GAAA,CAAA,CAAC,CAAA,EACrD,EACCA,EAAK,UAAU,IAAI,CAAC0C,EAAID,IACvBtF,EAAAA,IAACmI,IAAkE,SAAU5C,EAAI,MAAOD,CAAA,EAApE,YAAYzC,EAAK,UAAU,IAAI0C,EAAG,IAAI,IAAID,CAAC,EAA4B,CAC5F,CAAA,EACH,EAIDzC,EAAK,QACJ7C,EAAAA,IAAC,MAAA,CAAI,UAAU,sCACb,SAAAA,EAAAA,IAAC2H,GAAA,CAAS,OAAQ9E,EAAK,MAAA,CAAQ,CAAA,CACjC,CAAA,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,EACF,CAEJ,CAaO,SAAS0F,GAAgB,CAAE,QAAAC,EAAS,UAAApJ,GAAmC,CAC5E,KAAM,CAAE,cAAAb,CAAA,EAAkBC,EAAA,EACpBmE,EAAQ6F,EAAQ,OAAS,CAAA,EAE/B,cACG,MAAA,CAAI,UAAWtI,EAAG,YAAad,CAAS,EAEtC,SAAA,CAAAoJ,EAAQ,aACPpI,OAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAJ,EAAAA,IAAC,IAAA,CAAE,UAAU,iDACV,SAAAzB,EAAc,CAAE,GAAI,6BAA8B,eAAgB,cAAA,CAAgB,CAAA,CACrF,EACAyB,EAAAA,IAAC2H,GAAA,CAAS,OAAQa,EAAQ,WAAA,CAAa,CAAA,EACzC,EAID7F,EAAM,OAAS,EACd3C,EAAAA,IAAC,MAAA,CAAI,UAAU,WACZ,SAAA2C,EAAM,IAAI,CAACE,EAAMuB,IAChBpE,EAAAA,IAACqI,GAAA,CAEC,KAAAxF,EACA,SAAUuB,IAAQzB,EAAM,OAAS,EACjC,OAAQyB,IAAQzB,EAAM,OAAS,CAAA,EAH1BE,EAAK,UAAA,CAKb,CAAA,CACH,EAEA7C,EAAAA,IAAC,OAAI,UAAU,+DACZ,SAAAzB,EAAc,CAAE,GAAI,sBAAuB,eAAgB,2BAAA,CAA6B,CAAA,CAC3F,CAAA,EAEJ,CAEJ,CC/XA,SAASkK,GAASC,EAAaC,EAAwB,CACrD,OAAID,EAAI,QAAUC,EAAeD,EAC1BA,EAAI,MAAM,EAAGC,CAAM,EAAI,KAChC,CAKA,eAAerC,GAAgBC,EAAgC,CAC7D,GAAI,CACF,aAAM,UAAU,UAAU,UAAUA,CAAI,EACjC,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAcO,SAASqC,GAAmB,CACjC,YAAAlN,EACA,QAAA8M,EACA,KAAA7C,EACA,aAAAC,CACF,EAA4B,CAC1B,KAAM,CAAE,cAAArH,CAAA,EAAkBC,EAAA,EAIpBqK,EAAkBvB,GACtB3B,GAAQ6C,EAAUA,EAAQ,SAAW,KACrCA,GAAA,YAAAA,EAAS,IAAA,EAGLM,EAAgBvH,GACpBoE,GAAQ,CAAC6C,GAAW9M,EAAcA,EAAc,IAAA,EAI5C,CAAE,KAAAqN,EAAM,UAAA9C,EAAW,MAAA+C,CAAA,EAAUR,EAC/BK,EACAC,EAEE,CAACG,EAAaC,CAAc,EAAIzJ,EAAAA,SAA8B,IAAI,EAElE0J,EAAa1K,EAAAA,YAAkB,MAAO8H,EAAc6C,IAAkB,CAC/D,MAAM9C,GAAgBC,CAAI,IAEnC2C,EAAeE,CAAK,EACpB,WAAW,IAAMF,EAAe,IAAI,EAAG,GAAI,EAE/C,EAAG,CAAA,CAAE,EAEL,aACGrC,GAAA,CAAO,KAAAlB,EAAY,aAAAC,EAClB,SAAAxF,EAAAA,KAAC0G,GAAA,CAAc,UAAU,2DACvB,SAAA,CAAA1G,EAAAA,KAAC2G,GAAA,CAAa,UAAU,mCACtB,SAAA,CAAA3G,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,KAAC4G,GAAA,CAAY,UAAU,0BACrB,SAAA,CAAAhH,EAAAA,IAACQ,EAAA,CAAS,UAAU,SAAA,CAAU,EAC7BjC,EAAc,CAAE,GAAI,sBAAuB,eAAgB,iBAAkB,CAAA,EAChF,GACEwK,GAAQP,IACRpI,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAJ,MAACK,EAAA,CAAM,QAAS6B,IAAe6G,GAAA,YAAAA,EAAM,QAAQP,GAAA,YAAAA,EAAS,OAAQ,QAAQ,EAClE,4BAAM,QAAQA,GAAA,YAAAA,EAAS,OAAQ,WAAW,cAC9C,GACCO,GAAA,YAAAA,EAAM,QACL/I,MAACK,EAAA,CAAM,QAAQ,YAAY,UAAU,UAClC,SAAA0I,EAAK,KAAA,CACR,IAEAA,GAAA,YAAAA,EAAM,aAAaP,GAAA,YAAAA,EAAS,aAC5BxI,EAAAA,IAAC,OAAA,CACC,UAAU,0CACV,OAAO+I,GAAA,YAAAA,EAAM,aAAaP,GAAA,YAAAA,EAAS,WAElC,aAASO,GAAA,YAAAA,EAAM,aAAaP,GAAA,YAAAA,EAAS,YAAa,GAAI,EAAE,CAAA,CAAA,CAC3D,CAAA,CAEJ,CAAA,EAEJ,GACEO,GAAQP,IACRpI,EAAAA,KAAC,MAAA,CAAI,UAAU,uEACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,0BAA0B,MAAO7B,EAAc,CAAE,GAAI,+BAAgC,eAAgB,YAAA,CAAc,EACjI,SAAA,CAAAyB,EAAAA,IAACS,EAAA,CAAM,UAAU,SAAA,CAAU,EAC1B,IAAI,MAAKsI,GAAA,YAAAA,EAAM,aAAaP,GAAA,YAAAA,EAAS,YAAa,EAAE,EAAE,eAAA,CAAe,EACxE,IACEO,GAAA,YAAAA,EAAM,cAAcP,GAAA,YAAAA,EAAS,eAC7BpI,OAAC,QAAK,UAAU,0BAA0B,MAAO7B,EAAc,CAAE,GAAI,gCAAiC,eAAgB,mBAAA,CAAqB,EACzI,SAAA,CAAAyB,EAAAA,IAACqJ,GAAA,CAAW,UAAU,SAAA,CAAU,QAC/B,OAAA,CAAK,UAAU,8BAA+B,UAAAN,GAAA,YAAAA,EAAM,cAAcP,GAAA,YAAAA,EAAS,YAAA,CAAY,CAAA,EAC1F,GAEDO,GAAA,YAAAA,EAAM,cACL3I,EAAAA,KAAC,OAAA,CAAK,UAAU,0BAA0B,MAAO7B,EAAc,CAAE,GAAI,iCAAkC,eAAgB,cAAA,CAAgB,EACrI,SAAA,CAAAyB,EAAAA,IAACW,GAAA,CAAK,UAAU,SAAA,CAAU,EAC1BX,MAAC,QAAK,UAAU,YAAa,YAAS+I,EAAK,YAAa,EAAE,CAAA,CAAE,CAAA,EAC9D,EAEDA,UAAS,OAAA,CAAM,SAAA,CAAAA,EAAK,MAAM,OAAO,IAAExK,EAAc,CAAE,GAAI,2BAA4B,eAAgB,QAAS,CAAA,CAAA,CAAE,CAAA,CAAA,CACjH,CAAA,EAEJ,EAGC0H,QACE,MAAA,CAAI,UAAU,gDACb,SAAA7F,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAAJ,EAAAA,IAACmH,GAAA,CAAQ,UAAU,sBAAA,CAAuB,EAC1CnH,MAAC,QAAM,SAAAzB,EAAc,CAAE,GAAI,wBAAyB,eAAgB,oBAAA,CAAsB,CAAA,CAAE,CAAA,EAC9F,EACF,EACEyK,EACF5I,EAAAA,KAAC,MAAA,CAAI,UAAU,+DACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,2CACb,SAAA,CAAAJ,EAAAA,IAACsJ,GAAA,CAAY,UAAU,SAAA,CAAU,EACjCtJ,MAAC,QAAM,SAAAzB,EAAc,CAAE,GAAI,sBAAuB,eAAgB,wBAAA,CAA0B,CAAA,CAAE,CAAA,EAChG,EACAyB,EAAAA,IAAC,IAAA,CAAE,UAAU,gCACV,SAAAzB,EAAc,CAAE,GAAI,0BAA2B,eAAgB,kDAAA,CAAoD,CAAA,CACtH,CAAA,CAAA,CACF,EACEwK,EACF/I,MAAC,MAAA,CAAI,UAAU,mCACb,SAAAA,EAAAA,IAACuI,GAAA,CAAgB,QAASQ,CAAA,CAAM,EAClC,EAEA/I,EAAAA,IAAC,MAAA,CAAI,UAAU,sEACZ,SAAAzB,EAAc,CAAE,GAAI,sBAAuB,eAAgB,2BAAA,CAA6B,CAAA,CAC3F,EAIDwK,GACC3I,EAAAA,KAAC,MAAA,CAAI,UAAU,kEACb,SAAA,CAAAA,EAAAA,KAACU,EAAA,CACC,KAAK,KACL,QAAQ,UACR,QAAS,IAAMqI,EAAWJ,EAAK,UAAW,WAAW,EACrD,UAAU,MAEV,SAAA,CAAA/I,EAAAA,IAACkB,EAAA,CAAK,UAAU,cAAA,CAAe,EAE3B3C,EADH0K,IAAgB,YACC,CAAE,GAAI,8BAA+B,eAAgB,SAAA,EACrD,CAAE,GAAI,qCAAsC,eAAgB,kBADI,CACe,CAAA,CAAA,EAEnG7I,EAAAA,KAACU,EAAA,CACC,KAAK,KACL,QAAQ,UACR,QAAS,IAAM,CACb,MAAMyI,EAAO,KAAK,UAAUR,EAAM,KAAM,CAAC,EACzCI,EAAWI,EAAM,MAAM,CACzB,EACA,UAAU,MAEV,SAAA,CAAAvJ,EAAAA,IAACQ,EAAA,CAAS,UAAU,cAAA,CAAe,EAE/BjC,EADH0K,IAAgB,OACC,CAAE,GAAI,8BAA+B,eAAgB,SAAA,EACrD,CAAE,GAAI,kCAAmC,eAAgB,cADO,CACQ,CAAA,CAAA,CAC5F,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,CC9MA,MAAMO,GAA0C,CAC9C,kBACA,iBACA,eACA,kBACA,iBACA,wBACA,wBACA,qBACF,EAEA,SAASC,GAAoBC,EAAsH,CACjJ,OAAQA,EAAA,CACN,IAAK,kBACH,MAAO,UACT,IAAK,iBACL,IAAK,sBACH,MAAO,YACT,IAAK,kBACH,MAAO,OACT,IAAK,eACL,IAAK,iBACH,MAAO,UACT,IAAK,wBACH,MAAO,UACT,IAAK,wBACH,MAAO,YACT,QACE,MAAO,SAAA,CAEb,CAEA,SAASC,GAAeC,EAA0B5E,EAAuB,CACvE,MAAO,GAAG4E,EAAG,SAAS,IAAIA,EAAG,IAAI,IAAIA,EAAG,YAAc,EAAE,IAAI5E,CAAK,EACnE,CAEO,SAAS6E,IAAqB,WACnC,KAAM,CAAE,cAAAtL,CAAA,EAAkBC,EAAA,EAEpB,CAACsL,EAAGC,CAAI,EAAIC,EAAAA,SAAS,EAAE,EACvB,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,EAAE,EACzC,CAACN,EAAMS,CAAO,EAAIH,EAAAA,SAAiB,EAAE,EACrC,CAACI,EAAOC,CAAQ,EAAIL,EAAAA,SAAiB,GAAG,EACxC,CAACM,EAAQC,CAAS,EAAIP,EAAAA,SAAiB,CAAC,EACxC,CAACQ,EAAaC,CAAc,EAAIT,EAAAA,SAAwB,IAAI,EAGlEU,EAAAA,UAAU,IAAM,CACdH,EAAU,CAAC,CACb,EAAG,CAACT,EAAGG,EAAYP,EAAMU,CAAK,CAAC,EAE/B,MAAM/Q,EAAQuB,GAAmB,CAC/B,EAAGkP,EAAE,KAAA,GAAU,OACf,WAAYG,EAAW,KAAA,GAAU,OACjC,KAAMP,GAA4C,OAClD,MAAAU,EACA,OAAAE,CAAA,CACD,EAEKK,IAAS7Q,EAAAT,EAAM,OAAN,YAAAS,EAAY,KAAK,SAAU,CAAA,EACpC8N,IAAQ/N,EAAAR,EAAM,OAAN,YAAAQ,EAAY,KAAK,QAAS,EAClC+Q,IAAUC,EAAAxR,EAAM,OAAN,YAAAwR,EAAY,KAAK,UAAW,GAEtCC,EAAcC,EAAAA,QAAQ,IAAM,CAChC,MAAMC,EAAQpD,IAAU,EAAI,EAAI0C,EAAS,EACnCW,EAAM,KAAK,IAAIrD,EAAO0C,EAASF,CAAK,EAC1C,MAAO,GAAGY,CAAK,IAAIC,CAAG,MAAMrD,CAAK,EACnC,EAAG,CAACwC,EAAOE,EAAQ1C,CAAK,CAAC,EAEnBsD,EAAgB,SAAY,CAChC,GAAI,CACF,MAAM7R,EAAM,QAAA,CACd,MAAY,CAEZ,CACF,EAEA,OACE+G,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAJ,EAAAA,IAACC,GAAK,UAAU,MACd,SAAAG,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0CACb,SAAA,CAAAJ,EAAAA,IAAC,MAAA,CAAI,UAAU,wCACZ,SAAAzB,EAAc,CAAE,GAAI,kCAAA,CAAoC,EAC3D,EACA6B,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAJ,EAAAA,IAAC,MAAA,CAAI,UAAU,0CACZ,SAAA8K,EACH,EACA1K,EAAAA,KAACU,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAASoK,EACT,SAAU7R,EAAM,WAChB,UAAU,QAEV,SAAA,CAAA2G,MAACmL,GAAU,UAAWjL,EAAG,UAAW7G,EAAM,YAAc,cAAc,EAAG,EACxEkF,EAAc,CAAE,GAAI,wBAAA,CAA0B,CAAA,CAAA,CAAA,CACjD,CAAA,CACF,CAAA,EACF,EAEA6B,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAJ,EAAAA,IAAC,QAAA,CAAM,UAAU,uDACd,SAAAzB,EAAc,CAAE,GAAI,qCAAA,CAAuC,EAC9D,EACAyB,EAAAA,IAACoL,GAAA,CACC,MAAOtB,EACP,SAAWlK,GAAMmK,EAAKnK,EAAE,OAAO,KAAK,EACpC,YAAarB,EAAc,CAAE,GAAI,iDAAkD,CAAA,CAAA,CACrF,EACF,SACC,MAAA,CACC,SAAA,CAAAyB,EAAAA,IAAC,QAAA,CAAM,UAAU,uDACd,SAAAzB,EAAc,CAAE,GAAI,yCAAA,CAA2C,EAClE,EACAyB,EAAAA,IAACoL,GAAA,CACC,MAAOnB,EACP,SAAWrK,GAAMsK,EAActK,EAAE,OAAO,KAAK,EAC7C,YAAarB,EAAc,CAAE,GAAI,qDAAsD,CAAA,CAAA,CACzF,EACF,SACC,MAAA,CACC,SAAA,CAAAyB,EAAAA,IAAC,QAAA,CAAM,UAAU,uDACd,SAAAzB,EAAc,CAAE,GAAI,mCAAA,CAAqC,EAC5D,EACA6B,EAAAA,KAACiL,GAAA,CAAO,MAAO3B,GAAQ,UAAW,cAAgB4B,GAAMnB,EAAQmB,IAAM,UAAY,GAAKA,CAAC,EACtF,SAAA,CAAAtL,EAAAA,IAACuL,GAAA,CACC,SAAAvL,EAAAA,IAACwL,GAAA,CAAY,YAAajN,EAAc,CAAE,GAAI,sCAAA,CAAwC,CAAA,CAAG,CAAA,CAC3F,SACCkN,GAAA,CACC,SAAA,CAAAzL,EAAAA,IAAC0L,GAAA,CAAW,MAAM,UAAW,SAAAnN,EAAc,CAAE,GAAI,sCAAA,CAAwC,EAAE,EAC1FiL,GAAY,IAAK5C,GAChB5G,EAAAA,IAAC0L,IAAmB,MAAO9E,EACxB,SAAAA,CAAA,EADcA,CAEjB,CACD,CAAA,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,EAEAxG,EAAAA,KAAC,MAAA,CAAI,UAAU,oDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAJ,EAAAA,IAAC,QAAA,CAAM,UAAU,kDACd,SAAAzB,EAAc,CAAE,GAAI,oCAAA,CAAsC,EAC7D,EACA6B,EAAAA,KAACiL,GAAA,CAAO,MAAO,OAAOjB,CAAK,EAAG,cAAgBkB,GAAMjB,EAAS,SAASiB,EAAG,EAAE,CAAC,EAC1E,SAAA,CAAAtL,MAACuL,GAAA,CAAc,UAAU,YACvB,SAAAvL,MAACwL,KAAY,EACf,EACAxL,EAAAA,IAACyL,IACE,SAAA,CAAC,GAAI,IAAK,IAAK,IAAK,GAAI,EAAE,IAAKE,GAC9B3L,EAAAA,IAAC0L,IAAmB,MAAO,OAAOC,CAAC,EAAI,SAAAA,CAAA,EAAtBA,CAAwB,CAC1C,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,EAEAvL,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAJ,EAAAA,IAACc,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMyJ,EAAU,KAAK,IAAI,EAAGD,EAASF,CAAK,CAAC,EACpD,SAAUE,IAAW,GAAKjR,EAAM,WAE/B,SAAAkF,EAAc,CAAE,GAAI,yBAAA,CAA2B,CAAA,CAAA,EAElDyB,EAAAA,IAACc,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMyJ,EAAUD,EAASF,CAAK,EACvC,SAAU,CAACQ,GAAWvR,EAAM,WAE3B,SAAAkF,EAAc,CAAE,GAAI,qBAAA,CAAuB,CAAA,CAAA,CAC9C,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,EAEClF,EAAM,OACL2G,EAAAA,IAACC,GAAK,UAAU,6CACd,eAAC,MAAA,CAAI,UAAU,2BACX,SAAA5G,EAAM,MAAgB,SAAWkF,EAAc,CAAE,GAAI,4BAAA,CAA8B,EACvF,EACF,EAGD,CAAClF,EAAM,WAAasR,EAAO,SAAW,GACrC3K,EAAAA,IAACC,EAAA,CAAK,UAAU,yCACb,SAAA1B,EAAc,CAAE,GAAI,4BAAA,CAA8B,EACrD,EAGDoM,EAAO,OAAS,GACfvK,EAAAA,KAACH,EAAA,CAAK,UAAU,sBACd,SAAA,CAAAG,EAAAA,KAAC,MAAA,CAAI,UAAU,gHACb,SAAA,CAAAJ,EAAAA,IAAC,MAAA,CAAI,UAAU,aAAc,SAAAzB,EAAc,CAAE,GAAI,sCAAA,CAAwC,EAAE,EAC3FyB,EAAAA,IAAC,OAAI,UAAU,aAAc,WAAc,CAAE,GAAI,iCAAA,CAAmC,EAAE,EACtFA,EAAAA,IAAC,OAAI,UAAU,aAAc,WAAc,CAAE,GAAI,uCAAA,CAAyC,EAAE,EAC5FA,EAAAA,IAAC,OAAI,UAAU,aAAc,WAAc,CAAE,GAAI,iCAAA,CAAmC,EAAE,EACtFA,MAAC,OAAI,UAAU,aAAc,WAAc,CAAE,GAAI,sCAAA,CAAwC,CAAA,CAAE,CAAA,EAC7F,EAEAA,MAAC,OAAI,UAAU,yBACZ,WAAO,IAAI,CAAC4J,EAAI5E,IAAU,CACzB,MAAM4G,EAAMjC,GAAeC,EAAI5E,CAAK,EAC9B6G,EAAWrB,IAAgBoB,EACjC,OACExL,EAAAA,KAAC,MAAA,CAAc,UAAU,YACvB,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,UAAU,+FACV,QAAS,IAAMqK,EAAeoB,EAAW,KAAOD,CAAG,EAEnD,SAAA,CAAAxL,EAAAA,KAAC,MAAA,CAAI,UAAU,6CACZ,SAAA,CAAAyL,EACC7L,EAAAA,IAACuD,GAAY,UAAU,wCAAA,CAAyC,EAEhEvD,EAAAA,IAACwD,EAAA,CAAa,UAAU,wCAAA,CAAyC,EAEnExD,EAAAA,IAAC,OAAA,CAAK,UAAU,6CACb,WAAG,SAAA,CACN,CAAA,EACF,EACAA,MAAC,MAAA,CAAI,UAAU,aACb,eAACK,EAAA,CAAM,QAASoJ,GAAoBG,EAAG,IAAI,EAAG,UAAU,oBACrD,SAAAA,EAAG,KACN,EACF,QACC,MAAA,CAAI,UAAU,8DACZ,SAAAA,EAAG,YAAc,IACpB,QACC,MAAA,CAAI,UAAU,8DACZ,SAAAA,EAAG,MAAQ,IACd,QACC,MAAA,CAAI,UAAU,8DACZ,SAAAA,EAAG,WAAa,GAAA,CACnB,CAAA,CAAA,CAAA,EAGDiC,GACCzL,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,8BAA+B,SAAA,CAAA7B,EAAc,CAAE,GAAI,wCAAyC,EAAE,IAAA,EAAE,QAC/G,OAAA,CAAK,UAAU,sBAAuB,SAAAqL,EAAG,YAAc,GAAA,CAAI,CAAA,EAC9D,EACAxJ,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,8BAA+B,SAAA,CAAA7B,EAAc,CAAE,GAAI,gCAAiC,EAAE,IAAA,EAAE,QACvG,OAAA,CAAK,UAAU,sBAAuB,SAAAqL,EAAG,IAAM,GAAA,CAAI,CAAA,CAAA,CACtD,CAAA,EACF,EACCA,EAAG,WACFxJ,OAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,8BAA+B,SAAA,CAAA7B,EAAc,CAAE,GAAI,uCAAwC,EAAE,IAAA,EAAE,EAC/GyB,EAAAA,IAAC,OAAA,CAAK,UAAU,sBAAuB,WAAG,SAAA,CAAU,CAAA,EACtD,EAEFA,EAAAA,IAAC,MAAA,CAAI,UAAU,qDACZ,SAAA,KAAK,UAAU4J,EAAG,SAAW,CAAA,EAAI,KAAM,CAAC,CAAA,CAC3C,CAAA,CAAA,CACF,CAAA,CAAA,EArDMgC,CAuDV,CAEJ,CAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,CCxOO,SAASE,IAAc,CAC5B,KAAM,CAAE,cAAAvN,CAAA,EAAkBC,EAAA,EACpB,CAAE,MAAOuN,CAAA,EAAcC,GAAA,EACvB,CAACC,EAAYC,CAAa,EAAIzM,EAAAA,SAA2B,YAAY,EACrE,CAAC0M,EAAaC,CAAc,EAAI3M,EAAAA,SAAe,EAAE,EACjD,CAAC4M,EAAYC,CAAa,EAAI7M,EAAAA,SAAmC,MAAS,EAC1E,CAAC8M,EAAkBC,CAAmB,EAAI/M,EAAAA,SAAe,EAAK,EAC9D,CAACgN,EAAYC,CAAa,EAAIjN,EAAAA,SAAiD,IAAI,EACnF,CAACkN,EAAcC,CAAe,EAAInN,EAAAA,SAA8B,IAAI,EACpE,CAACoN,EAAmBC,CAAoB,EAAIrN,EAAAA,SAA8B,IAAI,EAC9E,CAACsN,EAAaC,CAAc,EAAIvN,EAAAA,SAAe,EAAK,EACpD,CAACwN,EAAuBC,CAAwB,EAAIzN,EAAAA,SAA6C,IAAI,EACrG,CAAC0N,EAAmBC,CAAoB,EAAI3N,EAAAA,SAA8B,IAAI,EAC9E,CAAC4N,EAAmBC,CAAoB,EAAI7N,EAAAA,SAAe,EAAK,EAChE8N,EAAkBC,GAAYC,EAAqB,EACnDC,EAAsBF,GAAaG,GAAMA,EAAE,mBAAmB,EAE9D,CACJ,WAAAtR,EACA,UAAA4J,GACA,WAAAzM,GACA,MAAAwP,GACA,QAAAjN,GACA,gBAAAY,GACA,aAAAiR,GACA,UAAAC,GACA,WAAA7Q,CAAA,EACEhB,GAAW,CACb,OAAQ,CAAE,OAAQmQ,GAAe,OAAW,KAAME,CAAA,CAAW,CAC9D,EAGK,CACJ,SAAUyB,GACV,OAAQC,EACR,UAAWC,GACX,WAAYC,GACZ,mBAAoBC,GACpB,YAAaC,GACb,MAAOC,GACP,cAAeC,GACf,QAASC,EAAA,EACPpR,GAAA,EAGE,CAACqR,GAAeC,EAAgB,EAAI/O,EAAAA,SAA4B,IAAI,GAAK,EAEzEgP,GAAoBtR,GAAiB,CACzCqR,GAAkBtK,GAAS,CACzB,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAIC,EAAK,IAAIhH,CAAI,EACfgH,EAAK,OAAOhH,CAAI,EAEhBgH,EAAK,IAAIhH,CAAI,EAERgH,CACT,CAAC,CACH,EAGMuK,GAA4BlG,GAAmC,CACnE0E,EAAyB1E,CAAO,EAChC8E,EAAqB,EAAI,CAC3B,EAGMqB,GAAY,CAAC,SAAU,OAAQ,QAAS,SAAU,UAAU,EAE5DC,GAAQvI,EAAAA,QAAc,IAAM,CAChC,MAAMwI,EAAU,IAAI,IAAIxS,EAAW,IAAKuD,GAAMA,EAAE,IAAI,CAAC,EACrD,OAAO,MAAM,KAAKiP,CAAO,EAAE,KAAA,CAC7B,EAAG,CAACxS,CAAU,CAAC,EAGTyS,GAAoB,IAAM,CAC9B1C,EAAe,EAAE,CACnB,EAEM2C,GAAqB,IAAM,CAC/B3C,EAAe,EAAE,EACjBE,EAAc,MAAS,CACzB,EAEM0C,EAAmB7C,EAAY,OAAS,GAAKE,IAAe,OAG5DxM,GAAmBd,GAA4B,CACnD+N,EAAqB/N,EAAU,EAAE,EACjCiO,EAAe,EAAI,CACrB,EAGMiC,GAAoBlQ,GAA4B,CACpDqO,EAAqBrO,EAAU,EAAE,EACjCuO,EAAqB,EAAI,CAC3B,EAGM4B,GAAqB5T,GAAe,CACxCoR,EAAc,QAAQ,EACtBE,EAAgBtR,CAAE,EAClBkR,EAAoB,EAAI,CAC1B,EAEM2C,GAAsBhS,GAAiB,CAC3CuP,EAAc,MAAM,EACpBE,EAAgBzP,CAAI,EACpBqP,EAAoB,EAAI,CAC1B,EAEM4C,GAAkB,IAAM,CAC5B1C,EAAc,KAAK,EACnBE,EAAgB,IAAI,EACpBJ,EAAoB,EAAI,CAC1B,EAEM6C,GAAsB,SAAY,CACtC,GAAI,CACE5C,IAAe,UAAYE,EAC7B,MAAMhQ,GAAgBgQ,CAAY,EACzBF,IAAe,QAAUE,EAClC,MAAMiB,GAAajB,CAAY,EACtBF,IAAe,OACxB,MAAMoB,GAAA,EAERrB,EAAoB,EAAK,EACzBE,EAAc,IAAI,EAClBE,EAAgB,IAAI,CACtB,OAASnG,EAAK,CACZsF,EAAUxN,EAAc,CAAE,GAAI,sBAAA,CAAwB,EAAGkI,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,CAAC,EACzG,QAAQ,MAAM,oBAAqBA,CAAG,CACxC,CACF,EAEA,cACG,MAAA,CAAI,UAAWvG,EAAG,YAAaqN,GAAmB,0BAA0B,EAE3E,SAAA,CAAAnN,EAAAA,KAAC,MAAA,CAAI,UAAU,qEACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAJ,EAAAA,IAAC,KAAA,CAAG,UAAU,yCACX,SAAAzB,EAAc,CAAE,GAAI,eAAA,CAAiB,EACxC,EACAyB,MAAC,KAAE,UAAU,qCACV,WAAc,CAAE,GAAI,qBAAA,CAAuB,CAAA,CAC9C,CAAA,EACF,EACAA,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACb,SAAAA,EAAAA,IAAC,SAAA,CACC,QAAS0N,EACT,UAAWxN,EACT,mCACAqN,EACI,6BACA,4DAAA,EAEN,MAAOA,EAAkB,kBAAoB,aAE5C,SAAAA,QAAmB+B,GAAA,CAAU,UAAU,UAAU,EAAKtP,EAAAA,IAACuP,GAAA,CAAU,UAAU,SAAA,CAAU,CAAA,CAAA,CACxF,CACF,CAAA,EACF,EAGAnP,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAJ,EAAAA,IAACc,EAAA,CACC,QAAQ,QACR,UAAWZ,EACT,oCACA+L,IAAe,aACX,8BACA,gEAAA,EAEN,QAAS,IAAMC,EAAc,YAAY,EAExC,SAAA3N,EAAc,CAAE,GAAI,yBAAA,CAA2B,CAAA,CAAA,EAElDyB,EAAAA,IAACc,EAAA,CACC,QAAQ,QACR,UAAWZ,EACT,oCACA+L,IAAe,gBACX,8BACA,gEAAA,EAEN,QAAS,IAAMC,EAAc,eAAe,EAE3C,SAAA3N,EAAc,CAAE,GAAI,4BAAA,CAA8B,CAAA,CAAA,EAErD6B,EAAAA,KAACU,EAAA,CACC,QAAQ,QACR,UAAWZ,EACT,oCACA+L,IAAe,kBACX,8BACA,gEAAA,EAEN,QAAS,IAAMC,EAAc,iBAAiB,EAE9C,SAAA,CAAAlM,EAAAA,IAACQ,EAAA,CAAS,UAAU,cAAA,CAAe,EAClCjC,EAAc,CAAE,GAAI,6BAAA,CAA+B,CAAA,CAAA,CAAA,CACtD,EACF,EAGC0N,IAAe,cACd7L,OAAC,MAAA,CAAI,UAAU,YAEZ,SAAA,CAAA4I,IACC5I,EAAAA,KAAC,MAAA,CAAI,UAAU,yGACb,SAAA,CAAAJ,EAAAA,IAAC6B,EAAA,CAAS,UAAU,uBAAA,CAAwB,EAC5CzB,EAAAA,KAAC,MAAA,CAAI,UAAU,SACb,SAAA,CAAAJ,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAuB,SAAAzB,EAAc,CAAE,GAAI,0BAAA,CAA4B,EAAE,EACtFyB,EAAAA,IAAC,IAAA,CAAE,UAAU,iBAAkB,YAAM,OAAA,CAAQ,CAAA,EAC/C,EACAA,EAAAA,IAACc,EAAA,CAAO,QAAQ,UAAU,KAAK,KAAK,QAAS,IAAM/E,GAAA,EAChD,SAAAwC,EAAc,CAAE,GAAI,sBAAA,CAAwB,CAAA,CAC/C,CAAA,EACF,EAIF6B,EAAAA,KAAC,MAAA,CAAI,UAAU,kDAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAJ,EAAAA,IAACwP,GAAA,CAAO,UAAU,wEAAA,CAAyE,EAC3FxP,EAAAA,IAACoL,GAAA,CACC,YAAa7M,EAAc,CAAE,GAAI,4BAA6B,EAC9D,MAAO4N,EACP,SAAWvM,GAAMwM,EAAexM,EAAE,OAAO,KAAK,EAC9C,UAAU,WAAA,CAAA,EAEXuM,GACCnM,EAAAA,IAAC,SAAA,CACC,QAAS8O,GACT,UAAU,wFAEV,SAAA9O,EAAAA,IAACyP,GAAA,CAAE,UAAU,SAAA,CAAU,CAAA,CAAA,CACzB,EAEJ,SAGC7O,GAAA,CACC,SAAA,CAAAZ,MAACa,IAAoB,QAAO,GAC1B,eAACC,EAAA,CAAO,QAAQ,UAAU,KAAK,KAAK,UAAU,sCAC3C,YAAcvC,EAAc,CAAE,GAAI,wBAAA,CAA0B,EAC/D,EACF,EACA6B,EAAAA,KAACY,GAAA,CAAoB,MAAM,QAAQ,UAAU,OAC3C,SAAA,CAAAhB,EAAAA,IAACiB,EAAA,CAAiB,QAAS,IAAMqL,EAAc,MAAS,EACrD,SAAA/N,EAAc,CAAE,GAAI,wBAAA,CAA0B,CAAA,CACjD,QACC6C,EAAA,EAAsB,EACtBwN,GAAM,IAAKzR,GACV6C,EAAAA,IAACiB,EAAA,CAEC,QAAS,IAAMqL,EAAcnP,CAAI,EACjC,UAAWkP,IAAelP,EAAO,YAAc,GAE9C,SAAAA,CAAA,EAJIA,CAAA,CAMR,CAAA,CAAA,CACH,CAAA,EACF,EAGC6R,GACChP,EAAAA,IAACc,EAAA,CAAO,QAAQ,QAAQ,KAAK,KAAK,QAASiO,GACxC,SAAAxQ,EAAc,CAAE,GAAI,6BAAA,CAA+B,EACtD,EAIF6B,EAAAA,KAACU,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAM/E,GAAA,EACf,SAAUvC,GAEV,SAAA,CAAAwG,MAACmL,GAAU,UAAWjL,EAAG,eAAgB1G,IAAc,cAAc,EAAG,EACvE+E,EAAc,CAAE,GAAI,wBAAA,CAA0B,CAAA,CAAA,CAAA,SAEhDqC,GAAA,CACC,SAAA,CAAAZ,EAAAA,IAACa,GAAA,CAAoB,QAAO,GAC1B,SAAAT,EAAAA,KAACU,GAAO,QAAQ,UAAU,KAAK,KAC7B,SAAA,CAAAd,EAAAA,IAACqB,GAAA,CAAO,UAAU,cAAA,CAAe,EAChC9C,EAAc,CAAE,GAAI,uBAAA,CAAyB,CAAA,CAAA,CAChD,CAAA,CACF,EACA6B,EAAAA,KAACY,GAAA,CAAoB,MAAM,MACzB,SAAA,CAAAhB,MAAC0P,IAAmB,SAAAnR,EAAc,CAAE,GAAI,kBAAA,CAAoB,EAAE,QAC7D6C,EAAA,EAAsB,EACtBwN,GAAM,IAAKzR,SACT8D,EAAA,CAA4B,QAAS,IAAMkO,GAAmBhS,CAAI,EAChE,SAAAoB,EAAc,CAAE,GAAI,uBAAA,EAA2B,CAAE,KAAApB,CAAA,CAAM,GADnCA,CAEvB,CACD,QACAiE,EAAA,EAAsB,EACvBhB,EAAAA,KAACa,EAAA,CACC,QAASmO,GACT,UAAU,0CAEV,SAAA,CAAApP,EAAAA,IAAC2D,GAAA,CAAc,UAAU,cAAA,CAAe,EACvCpF,EAAc,CAAE,GAAI,mBAAA,CAAqB,CAAA,CAAA,CAAA,CAC5C,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,EAGC0H,GACCjG,EAAAA,IAAC,MAAA,CAAI,UAAU,aACZ,SAAA,MAAM,KAAK,CAAE,OAAQ,CAAA,CAAG,EAAE,IAAI,CAAC2P,EAAGrK,IACjCtF,EAAAA,IAAC,MAAA,CAAY,UAAU,wCAAA,EAAbsF,CAAsD,CACjE,CAAA,CACH,EACEjJ,EAAW,SAAW,EACxB+D,EAAAA,KAAC,MAAA,CAAI,UAAU,uDACb,SAAA,CAAAJ,EAAAA,IAACrF,GAAA,CAAQ,UAAU,sCAAA,CAAuC,QACzD,KAAA,CAAG,UAAU,2CACX,SACG4D,EADHyQ,EACiB,CAAE,GAAI,wBAAA,EACN,CAAE,GAAI,qBAAA,CAD0B,EAEpD,QACC,IAAA,CAAE,UAAU,4CACV,SACGzQ,EADHyQ,EACiB,CAAE,GAAI,+BAAA,EACN,CAAE,GAAI,uBAAA,CADiC,EAE3D,EACCA,GACChP,EAAAA,IAACc,EAAA,CAAO,QAAQ,UAAU,QAASiO,GAAoB,UAAU,OAC9D,SAAAxQ,EAAc,CAAE,GAAI,6BAAA,CAA+B,CAAA,CACtD,CAAA,CAAA,CAEJ,QAEC,MAAA,CAAI,UAAU,aACZ,SAAAlC,EAAW,IAAK0C,GACfiB,EAAAA,IAAClB,GAAA,CAEC,UAAAC,EACA,QAASc,GACT,aAAcoP,GACd,SAAUC,GACV,gBAAiBlS,CAAA,EALZ+B,EAAU,EAAA,CAOlB,CAAA,CACH,CAAA,EAEJ,EAGDkN,IAAe,iBACdjM,MAAC,MAAA,CAAI,UAAU,OACb,SAAAA,EAAAA,IAAC6J,KAAmB,CAAA,CACtB,EAGDoC,IAAe,mBACd7L,OAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAJ,EAAAA,IAAC,IAAA,CAAE,UAAU,gCACV,SAAAzB,EACC,CAAE,GAAI,8BAAA,EACN,CAAE,MAAOuP,GAAe,MAAA,CAAO,EAEnC,EACA1N,EAAAA,KAACU,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMwN,GAAA,EACf,SAAUL,IAA4B,CAACC,GAEvC,SAAA,CAAAlO,MAACmL,GAAU,UAAWjL,EAAG,eAAgB+N,IAA4B,cAAc,EAAG,EACrF1P,EAAc,CAAE,GAAI,wBAAA,CAA0B,CAAA,CAAA,CAAA,CACjD,EACF,EAGC6P,IACChO,EAAAA,KAAC,MAAA,CAAI,UAAU,yGACb,SAAA,CAAAJ,EAAAA,IAAC6B,EAAA,CAAS,UAAU,uBAAA,CAAwB,EAC5CzB,EAAAA,KAAC,MAAA,CAAI,UAAU,SACb,SAAA,CAAAJ,EAAAA,IAAC,IAAA,CAAE,UAAU,sBAAuB,SAAAzB,EAAc,CAAE,GAAI,0BAAA,CAA4B,EAAE,EACtFyB,EAAAA,IAAC,IAAA,CAAE,UAAU,iBAAkB,YAAoB,OAAA,CAAQ,CAAA,EAC7D,EACAA,EAAAA,IAACc,EAAA,CAAO,QAAQ,UAAU,KAAK,KAAK,QAAS,IAAMwN,GAAA,EAChD,SAAA/P,EAAc,CAAE,GAAI,sBAAA,CAAwB,CAAA,CAC/C,CAAA,EACF,EAIDyP,GACChO,EAAAA,IAAC,MAAA,CAAI,UAAU,aACZ,eAAM,KAAK,CAAE,OAAQ,CAAA,CAAG,EAAE,IAAI,CAAC2P,EAAGrK,IACjCtF,EAAAA,IAAC,MAAA,CAAY,UAAU,0CAAbsF,CAAsD,CACjE,CAAA,CACH,EACEwI,GAAe,SAAW,EAE5B1N,EAAAA,KAAC,MAAA,CAAI,UAAU,uDACb,SAAA,CAAAJ,EAAAA,IAACQ,EAAA,CAAS,UAAU,sCAAA,CAAuC,EAC3DR,EAAAA,IAAC,MAAG,UAAU,2CACX,WAAc,CAAE,GAAI,oCAAA,CAAsC,EAC7D,EACAA,MAAC,KAAE,UAAU,4CACV,WAAc,CAAE,GAAI,sCAAA,CAAwC,CAAA,CAC/D,CAAA,CAAA,CACF,EAGAI,EAAAA,KAAC,MAAA,CAAI,UAAU,YACZ,SAAA,CAAAuO,GACE,OAAQxR,GAAA,OAAS,QAAArD,EAAAiU,EAAqB5Q,CAAI,IAAzB,YAAArD,EAA4B,QAAS,EAAC,EACvD,IAAKqD,GAAS,CACb,MAAMI,EAAWwQ,EAAqB5Q,CAAI,EACpCgG,EAAaoL,GAAc,IAAIpR,CAAI,EACzC,OACEiD,EAAAA,KAAC,MAAA,CAAe,UAAU,oBAExB,SAAA,CAAAJ,EAAAA,IAAC,SAAA,CACC,UAAU,yFACV,QAAS,IAAMyO,GAAiBtR,CAAI,EAEpC,SAAAiD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAA+C,EACCnD,EAAAA,IAACuD,GAAY,UAAU,+BAAA,CAAgC,EAEvDvD,EAAAA,IAACwD,EAAA,CAAa,UAAU,+BAAA,CAAgC,EAE1DxD,MAACK,GAAM,QAAS6B,GAAe/E,CAAI,EAChC,SAAAA,EAAK,cACR,EACAiD,EAAAA,KAAC,OAAA,CAAK,UAAU,gCACb,SAAA,CAAA7C,EAAS,OAAO,IAAEgB,EAAc,CAAE,GAAI,iCAAA,CAAmC,CAAA,CAAA,CAC5E,CAAA,CAAA,CACF,CAAA,CAAA,EAGD4E,SACE,MAAA,CAAI,UAAU,oBACZ,SAAA5F,EAAS,IAAKiL,GACbpI,EAAAA,KAAC,SAAA,CAEC,UAAU,mGACV,QAAS,IAAMsO,GAAyBlG,CAAO,EAE/C,SAAA,CAAAxI,EAAAA,IAAC,MAAA,CAAI,UAAU,kCACb,SAAAA,EAAAA,IAAC,QAAK,UAAU,sCAAsC,MAAOwI,EAAQ,UAClE,SAAAA,EAAQ,UAAU,OAAS,GAAKA,EAAQ,UAAU,MAAM,EAAG,EAAE,EAAI,MAAQA,EAAQ,SAAA,CACpF,CAAA,CACF,QACC,MAAA,CAAI,UAAU,iEACb,SAAApI,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAJ,EAAAA,IAACS,EAAA,CAAM,UAAU,SAAA,CAAU,EAC1B,IAAI,KAAK+H,EAAQ,SAAS,EAAE,eAAA,CAAe,CAAA,CAC9C,CAAA,CACF,CAAA,CAAA,EAdKA,EAAQ,SAAA,CAgBhB,CAAA,CACH,CAAA,CAAA,EA1CMrL,CA4CV,CAEJ,CAAC,EAEF,OAAO,KAAK4Q,CAAoB,EAC9B,OAAQ5Q,GAAS,CAACwR,GAAU,SAASxR,CAAgC,CAAC,EACtE,OACA,IAAKA,GAAS,CACb,MAAMI,EAAWwQ,EAAqB5Q,CAAI,EACpCgG,EAAaoL,GAAc,IAAIpR,CAAI,EACzC,OACEiD,EAAAA,KAAC,MAAA,CAAe,UAAU,oBACxB,SAAA,CAAAJ,EAAAA,IAAC,SAAA,CACC,UAAU,yFACV,QAAS,IAAMyO,GAAiBtR,CAAI,EAEpC,SAAAiD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAA+C,EACCnD,EAAAA,IAACuD,GAAY,UAAU,+BAAA,CAAgC,EAEvDvD,EAAAA,IAACwD,EAAA,CAAa,UAAU,+BAAA,CAAgC,QAEzDnD,EAAA,CAAM,QAAQ,YACZ,SAAAlD,EAAK,cACR,EACAiD,EAAAA,KAAC,OAAA,CAAK,UAAU,gCACb,SAAA,CAAA7C,EAAS,OAAO,IAAEgB,EAAc,CAAE,GAAI,iCAAA,CAAmC,CAAA,CAAA,CAC5E,CAAA,CAAA,CACF,CAAA,CAAA,EAED4E,SACE,MAAA,CAAI,UAAU,oBACZ,SAAA5F,EAAS,IAAKiL,GACbpI,EAAAA,KAAC,SAAA,CAEC,UAAU,mGACV,QAAS,IAAMsO,GAAyBlG,CAAO,EAE/C,SAAA,CAAAxI,EAAAA,IAAC,MAAA,CAAI,UAAU,kCACb,SAAAA,EAAAA,IAAC,QAAK,UAAU,sCAAsC,MAAOwI,EAAQ,UAClE,SAAAA,EAAQ,UAAU,OAAS,GAAKA,EAAQ,UAAU,MAAM,EAAG,EAAE,EAAI,MAAQA,EAAQ,SAAA,CACpF,CAAA,CACF,QACC,MAAA,CAAI,UAAU,iEACb,SAAApI,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACd,SAAA,CAAAJ,EAAAA,IAACS,EAAA,CAAM,UAAU,SAAA,CAAU,EAC1B,IAAI,KAAK+H,EAAQ,SAAS,EAAE,eAAA,CAAe,CAAA,CAC9C,CAAA,CACF,CAAA,CAAA,EAdKA,EAAQ,SAAA,CAgBhB,CAAA,CACH,CAAA,CAAA,EAxCMrL,CA0CV,CAEJ,CAAC,EAGFgR,IACCnO,EAAAA,IAAC,MAAA,CAAI,UAAU,2BACb,SAAAA,EAAAA,IAACc,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMuN,GAAA,EACf,SAAUH,GAET,YACC9N,EAAAA,KAAA8G,EAAAA,SAAA,CACE,SAAA,CAAAlH,EAAAA,IAACmL,EAAA,CAAU,UAAU,2BAAA,CAA4B,EAChD5M,EAAc,CAAE,GAAI,iCAAkC,eAAgB,aAAc,CAAA,CAAA,CACvF,EAEAA,EAAc,CAAE,GAAI,kCAAmC,eAAgB,YAAa,CAAA,CAAA,CAExF,CACF,CAAA,CAAA,CAEJ,CAAA,EAEJ,EAIFyB,EAAAA,IAACyF,GAAA,CACC,YAAaoH,GAAqB,GAClC,KAAME,EACN,aAAcC,CAAA,CAAA,EAIhBhN,EAAAA,IAAC4I,GAAA,CACC,QAASqE,EACT,YAAaE,GAAqB,OAClC,KAAME,EACN,aAAcC,CAAA,CAAA,QAIfzG,GAAA,CAAO,KAAM0F,EAAkB,aAAcC,EAC5C,gBAAC1F,GAAA,CACC,SAAA,CAAA1G,OAAC2G,GAAA,CACC,SAAA,CAAA/G,EAAAA,IAACgH,GAAA,CACE,SACGzI,EADHkO,IAAe,MACE,CAAE,GAAI,+BAAA,EACN,CAAE,GAAI,4BAAA,CADiC,EAE3D,SACCmD,GAAA,CACE,SAAA,CAAAnD,IAAe,OAASlO,EAAc,CAAE,GAAI,kCAAmC,EAC/EkO,IAAe,QACdlO,EAAc,CAAE,GAAI,oCAAsC,CAAE,KAAMoO,EAAc,EACjFF,IAAe,UACdlO,EAAc,CAAE,GAAI,+BAAgC,CAAA,CAAA,CACxD,CAAA,EACF,SACCsR,GAAA,CACC,SAAA,CAAA7P,EAAAA,IAACc,EAAA,CACC,QAAQ,UACR,QAAS,IAAM0L,EAAoB,EAAK,EACxC,SAAUxP,EAET,SAAAuB,EAAc,CAAE,GAAI,uBAAA,CAAyB,CAAA,CAAA,EAEhDyB,EAAAA,IAACc,EAAA,CACC,QAAQ,cACR,QAASuO,GACT,SAAUrS,EAET,SACGuB,EADHvB,EACiB,CAAE,GAAI,wBAAA,EACN,CAAE,GAAI,uBAAA,CAD0B,CACD,CAAA,CACnD,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,CAEJ","x_google_ignoreList":[0,1,2,3,4]}
|
|
1
|
+
{"version":3,"file":"HistoryPage-DzSvEAFe.js","sources":["../../../../node_modules/@tanstack/query-core/build/modern/infiniteQueryObserver.js","../../../../node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.js","../../../../node_modules/lucide-react/dist/esm/icons/arrow-down-up.js","../../../../node_modules/lucide-react/dist/esm/icons/coins.js","../../../../node_modules/lucide-react/dist/esm/icons/search-x.js","../../src/hooks/useAudit.ts","../../src/hooks/useCliExecution.ts","../../src/hooks/useHistory.ts","../../src/hooks/useNativeSessions.ts","../../src/components/shared/ConversationCard.tsx","../../src/hooks/useNativeSession.ts","../../src/lib/cli-tool-theme.ts","../../src/components/shared/CliStreamPanel.tsx","../../src/hooks/useNativeSessionByPath.ts","../../src/components/shared/SessionTimeline.tsx","../../src/components/shared/NativeSessionPanel.tsx","../../src/components/issue/hub/ObservabilityPanel.tsx","../../src/pages/HistoryPage.tsx"],"sourcesContent":["// src/infiniteQueryObserver.ts\nimport { QueryObserver } from \"./queryObserver.js\";\nimport {\n hasNextPage,\n hasPreviousPage,\n infiniteQueryBehavior\n} from \"./infiniteQueryBehavior.js\";\nvar InfiniteQueryObserver = class extends QueryObserver {\n constructor(client, options) {\n super(client, options);\n }\n bindMethods() {\n super.bindMethods();\n this.fetchNextPage = this.fetchNextPage.bind(this);\n this.fetchPreviousPage = this.fetchPreviousPage.bind(this);\n }\n setOptions(options) {\n super.setOptions({\n ...options,\n behavior: infiniteQueryBehavior()\n });\n }\n getOptimisticResult(options) {\n options.behavior = infiniteQueryBehavior();\n return super.getOptimisticResult(options);\n }\n fetchNextPage(options) {\n return this.fetch({\n ...options,\n meta: {\n fetchMore: { direction: \"forward\" }\n }\n });\n }\n fetchPreviousPage(options) {\n return this.fetch({\n ...options,\n meta: {\n fetchMore: { direction: \"backward\" }\n }\n });\n }\n createResult(query, options) {\n const { state } = query;\n const parentResult = super.createResult(query, options);\n const { isFetching, isRefetching, isError, isRefetchError } = parentResult;\n const fetchDirection = state.fetchMeta?.fetchMore?.direction;\n const isFetchNextPageError = isError && fetchDirection === \"forward\";\n const isFetchingNextPage = isFetching && fetchDirection === \"forward\";\n const isFetchPreviousPageError = isError && fetchDirection === \"backward\";\n const isFetchingPreviousPage = isFetching && fetchDirection === \"backward\";\n const result = {\n ...parentResult,\n fetchNextPage: this.fetchNextPage,\n fetchPreviousPage: this.fetchPreviousPage,\n hasNextPage: hasNextPage(options, state.data),\n hasPreviousPage: hasPreviousPage(options, state.data),\n isFetchNextPageError,\n isFetchingNextPage,\n isFetchPreviousPageError,\n isFetchingPreviousPage,\n isRefetchError: isRefetchError && !isFetchNextPageError && !isFetchPreviousPageError,\n isRefetching: isRefetching && !isFetchingNextPage && !isFetchingPreviousPage\n };\n return result;\n }\n};\nexport {\n InfiniteQueryObserver\n};\n//# sourceMappingURL=infiniteQueryObserver.js.map","\"use client\";\n\n// src/useInfiniteQuery.ts\nimport { InfiniteQueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useInfiniteQuery(options, queryClient) {\n return useBaseQuery(\n options,\n InfiniteQueryObserver,\n queryClient\n );\n}\nexport {\n useInfiniteQuery\n};\n//# sourceMappingURL=useInfiniteQuery.js.map","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ArrowDownUp = createLucideIcon(\"ArrowDownUp\", [\n [\"path\", { d: \"m3 16 4 4 4-4\", key: \"1co6wj\" }],\n [\"path\", { d: \"M7 20V4\", key: \"1yoxec\" }],\n [\"path\", { d: \"m21 8-4-4-4 4\", key: \"1c9v7m\" }],\n [\"path\", { d: \"M17 4v16\", key: \"7dpous\" }]\n]);\n\nexport { ArrowDownUp as default };\n//# sourceMappingURL=arrow-down-up.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Coins = createLucideIcon(\"Coins\", [\n [\"circle\", { cx: \"8\", cy: \"8\", r: \"6\", key: \"3yglwk\" }],\n [\"path\", { d: \"M18.09 10.37A6 6 0 1 1 10.34 18\", key: \"t5s6rm\" }],\n [\"path\", { d: \"M7 6h1v4\", key: \"1obek4\" }],\n [\"path\", { d: \"m16.71 13.88.7.71-2.82 2.82\", key: \"1rbuyh\" }]\n]);\n\nexport { Coins as default };\n//# sourceMappingURL=coins.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SearchX = createLucideIcon(\"SearchX\", [\n [\"path\", { d: \"m13.5 8.5-5 5\", key: \"1cs55j\" }],\n [\"path\", { d: \"m8.5 8.5 5 5\", key: \"a8mexj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"path\", { d: \"m21 21-4.3-4.3\", key: \"1qie3q\" }]\n]);\n\nexport { SearchX as default };\n//# sourceMappingURL=search-x.js.map\n","// ========================================\n// useAudit Hooks\n// ========================================\n// TanStack Query hooks for audit/observability APIs\n\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\nimport {\n fetchCliSessionAudit,\n type CliSessionAuditEventType,\n type CliSessionAuditListResponse,\n} from '@/lib/api';\n\nexport interface UseCliSessionAuditOptions {\n sessionKey?: string;\n type?: CliSessionAuditEventType | CliSessionAuditEventType[];\n q?: string;\n limit?: number;\n offset?: number;\n enabled?: boolean;\n}\n\nexport function useCliSessionAudit(\n options: UseCliSessionAuditOptions = {}\n): UseQueryResult<{ success: boolean; data: CliSessionAuditListResponse }> {\n const projectPath = useWorkflowStore(selectProjectPath);\n const enabled = (options.enabled ?? true) && !!projectPath;\n\n const typeParam = Array.isArray(options.type)\n ? options.type.join(',')\n : options.type;\n\n return useQuery({\n queryKey: projectPath\n ? workspaceQueryKeys.cliSessionAudit(projectPath, {\n sessionKey: options.sessionKey,\n type: typeParam,\n q: options.q,\n limit: options.limit,\n offset: options.offset,\n })\n : ['audit', 'cliSessions', 'no-project'],\n queryFn: () => fetchCliSessionAudit({\n projectPath: projectPath ?? undefined,\n sessionKey: options.sessionKey,\n type: options.type,\n q: options.q,\n limit: options.limit,\n offset: options.offset,\n }),\n enabled,\n staleTime: 10_000,\n retry: 1,\n });\n}\n\n","// ========================================\r\n// useCliExecution Hook\r\n// ========================================\r\n// TanStack Query hook for CLI execution details\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport {\r\n fetchExecutionDetail,\r\n type ConversationRecord,\r\n} from '../lib/api';\r\n\r\n// ========== Query Keys ==========\r\n\r\n/**\r\n * Query key factory for CLI execution queries\r\n */\r\nexport const cliExecutionKeys = {\r\n all: ['cliExecution'] as const,\r\n details: () => [...cliExecutionKeys.all, 'detail'] as const,\r\n detail: (id: string | null) => [...cliExecutionKeys.details(), id] as const,\r\n};\r\n\r\n// ========== Constants ==========\r\n\r\n/**\r\n * Default stale time: 5 minutes\r\n * Execution details don't change frequently after completion\r\n */\r\nconst STALE_TIME = 5 * 60 * 1000;\r\n\r\n/**\r\n * Cache time: 10 minutes\r\n * Keep cached data available for potential re-use\r\n */\r\nconst GC_TIME = 10 * 60 * 1000;\r\n\r\n// ========== Types ==========\r\n\r\nexport interface UseCliExecutionOptions {\r\n /** Override default stale time (ms) */\r\n staleTime?: number;\r\n /** Override default cache time (ms) */\r\n gcTime?: number;\r\n /** Enable/disable the query */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseCliExecutionReturn {\r\n /** Execution detail data */\r\n data: ConversationRecord | undefined;\r\n /** Loading state for initial fetch */\r\n isLoading: boolean;\r\n /** Fetching state (initial or refetch) */\r\n isFetching: boolean;\r\n /** Error object if query failed */\r\n error: Error | null;\r\n /** Manually refetch data */\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n// ========== Hook ==========\r\n\r\n/**\r\n * Hook for fetching CLI execution detail (conversation records)\r\n *\r\n * @param executionId - The CLI execution ID to fetch details for\r\n * @param options - Query options\r\n *\r\n * @example\r\n * ```tsx\r\n * const { data, isLoading, error } = useCliExecutionDetail('exec-123');\r\n * ```\r\n *\r\n * @remarks\r\n * - Query is disabled when executionId is null/undefined\r\n * - Data is cached for 5 minutes by default\r\n * - Auto-refetch is disabled (execution details don't change)\r\n */\r\nexport function useCliExecutionDetail(\r\n executionId: string | null,\r\n options: UseCliExecutionOptions = {}\r\n): UseCliExecutionReturn {\r\n const { staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n\r\n const query = useQuery<ConversationRecord>({\r\n queryKey: cliExecutionKeys.detail(executionId),\r\n queryFn: () => {\r\n if (!executionId) throw new Error('executionId is required');\r\n return fetchExecutionDetail(executionId);\r\n },\r\n enabled: !!executionId && enabled,\r\n staleTime,\r\n gcTime,\r\n refetchOnWindowFocus: false,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n data: query.data,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n };\r\n}\r\n","// ========================================\r\n// useHistory Hook\r\n// ========================================\r\n// TanStack Query hook for CLI execution history\r\n\r\nimport React from 'react';\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport {\r\n fetchHistory,\r\n deleteExecution,\r\n deleteExecutionsByTool,\r\n deleteAllHistory,\r\n type HistoryResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\nexport interface HistoryFilter {\r\n search?: string;\r\n tool?: string;\r\n}\r\n\r\n// Default stale time: 30 seconds\r\nconst STALE_TIME = 30 * 1000;\r\n\r\nexport interface UseHistoryOptions {\r\n /** Filter options */\r\n filter?: HistoryFilter;\r\n /** Override default stale time (ms) */\r\n staleTime?: number;\r\n /** Enable/disable the query */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseHistoryReturn {\r\n /** All executions data */\r\n executions: HistoryResponse['executions'];\r\n /** Loading state for initial fetch */\r\n isLoading: boolean;\r\n /** Fetching state (initial or refetch) */\r\n isFetching: boolean;\r\n /** Error object if query failed */\r\n error: Error | null;\r\n /** Manually refetch data */\r\n refetch: () => Promise<void>;\r\n /** Delete a single execution */\r\n deleteExecution: (id: string) => Promise<void>;\r\n /** Delete executions by tool */\r\n deleteByTool: (tool: string) => Promise<void>;\r\n /** Delete all history */\r\n deleteAll: () => Promise<void>;\r\n /** Is any mutation in progress */\r\n isDeleting: boolean;\r\n}\r\n\r\n/**\r\n * Hook for fetching CLI execution history\r\n *\r\n * @example\r\n * ```tsx\r\n * const { executions, isLoading, deleteExecution } = useHistory();\r\n * ```\r\n */\r\nexport function useHistory(options: UseHistoryOptions = {}): UseHistoryReturn {\r\n const { filter, staleTime = STALE_TIME, enabled = true } = options;\r\n const queryClient = useQueryClient();\r\n\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n const queryEnabled = enabled && !!projectPath;\r\n\r\n const query = useQuery({\r\n queryKey: workspaceQueryKeys.cliHistoryList(projectPath),\r\n queryFn: () => fetchHistory(projectPath),\r\n staleTime,\r\n enabled: queryEnabled,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n // Apply client-side filtering\r\n const executions = React.useMemo(() => {\r\n let executions = query.data?.executions ?? [];\r\n\r\n // Apply search filter\r\n if (filter?.search) {\r\n const searchLower = filter.search.toLowerCase();\r\n executions = executions.filter(\r\n (exec) => {\r\n // Guard against prompt_preview being an object instead of string\r\n const preview = typeof exec.prompt_preview === 'string'\r\n ? exec.prompt_preview\r\n : JSON.stringify(exec.prompt_preview);\r\n return preview.toLowerCase().includes(searchLower) ||\r\n exec.tool.toLowerCase().includes(searchLower);\r\n }\r\n );\r\n }\r\n\r\n // Apply tool filter\r\n if (filter?.tool) {\r\n executions = executions.filter((exec) => exec.tool === filter.tool);\r\n }\r\n\r\n return executions;\r\n }, [query.data, filter]);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n // Delete single execution\r\n const deleteSingleMutation = useMutation({\r\n mutationFn: deleteExecution,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.cliHistory(projectPath) });\r\n },\r\n });\r\n\r\n // Delete by tool\r\n const deleteByToolMutation = useMutation({\r\n mutationFn: deleteExecutionsByTool,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.cliHistory(projectPath) });\r\n },\r\n });\r\n\r\n // Delete all\r\n const deleteAllMutation = useMutation({\r\n mutationFn: deleteAllHistory,\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: workspaceQueryKeys.cliHistory(projectPath) });\r\n },\r\n });\r\n\r\n const isDeleting =\r\n deleteSingleMutation.isPending ||\r\n deleteByToolMutation.isPending ||\r\n deleteAllMutation.isPending;\r\n\r\n return {\r\n executions,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n deleteExecution: deleteSingleMutation.mutateAsync,\r\n deleteByTool: deleteByToolMutation.mutateAsync,\r\n deleteAll: deleteAllMutation.mutateAsync,\r\n isDeleting,\r\n };\r\n}\r\n","// ========================================\r\n// useNativeSessions Hook\r\n// ========================================\r\n// TanStack Query hook for native CLI sessions list\r\n\r\nimport React from 'react';\r\nimport { useQuery, useInfiniteQuery } from '@tanstack/react-query';\r\nimport {\r\n fetchNativeSessions,\r\n type NativeSessionListItem,\r\n type NativeSessionsListResponse,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { workspaceQueryKeys } from '@/lib/queryKeys';\r\n\r\n// ========== Constants ==========\r\n\r\nconst STALE_TIME = 2 * 60 * 1000; // 2 minutes (increased from 30s)\r\nconst GC_TIME = 10 * 60 * 1000; // 10 minutes (increased from 5min)\r\nconst PAGE_SIZE = 50; // Default page size for pagination\r\n\r\n// ========== Types ==========\r\n\r\nexport type NativeTool = 'gemini' | 'qwen' | 'codex' | 'claude' | 'opencode';\r\n\r\nexport interface UseNativeSessionsOptions {\r\n /** Filter by tool type */\r\n tool?: NativeTool;\r\n /** Override default stale time (ms) */\r\n staleTime?: number;\r\n /** Override default gc time (ms) */\r\n gcTime?: number;\r\n /** Enable/disable the query */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface ByToolRecord {\r\n [tool: string]: NativeSessionListItem[];\r\n}\r\n\r\nexport interface UseNativeSessionsReturn {\r\n /** All sessions data */\r\n sessions: NativeSessionListItem[];\r\n /** Sessions grouped by tool */\r\n byTool: ByToolRecord;\r\n /** Total count from API */\r\n count: number;\r\n /** Loading state for initial fetch */\r\n isLoading: boolean;\r\n /** Fetching state (initial or refetch) */\r\n isFetching: boolean;\r\n /** Error object if query failed */\r\n error: Error | null;\r\n /** Manually refetch data */\r\n refetch: () => Promise<void>;\r\n}\r\n\r\nexport interface UseNativeSessionsInfiniteReturn {\r\n /** All sessions data (flattened from all pages) */\r\n sessions: NativeSessionListItem[];\r\n /** Sessions grouped by tool */\r\n byTool: ByToolRecord;\r\n /** Total count from current pages */\r\n count: number;\r\n /** Loading state for initial fetch */\r\n isLoading: boolean;\r\n /** Fetching state (initial or refetch) */\r\n isFetching: boolean;\r\n /** Fetching next page */\r\n isFetchingNextPage: boolean;\r\n /** Whether there are more pages */\r\n hasNextPage: boolean;\r\n /** Error object if query failed */\r\n error: Error | null;\r\n /** Fetch next page */\r\n fetchNextPage: () => Promise<void>;\r\n /** Manually refetch data */\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n// ========== Helper Functions ==========\r\n\r\n/**\r\n * Group sessions by tool type\r\n */\r\nfunction groupByTool(sessions: NativeSessionListItem[]): ByToolRecord {\r\n return sessions.reduce<ByToolRecord>((acc, session) => {\r\n const tool = session.tool;\r\n if (!acc[tool]) {\r\n acc[tool] = [];\r\n }\r\n acc[tool].push(session);\r\n return acc;\r\n }, {});\r\n}\r\n\r\n// ========== Hook ==========\r\n\r\n/**\r\n * Hook for fetching native CLI sessions list\r\n *\r\n * @example\r\n * ```tsx\r\n * const { sessions, byTool, isLoading } = useNativeSessions();\r\n * const geminiSessions = byTool['gemini'] ?? [];\r\n * ```\r\n *\r\n * @example\r\n * ```tsx\r\n * // Filter by tool\r\n * const { sessions } = useNativeSessions({ tool: 'gemini' });\r\n * ```\r\n */\r\nexport function useNativeSessions(\r\n options: UseNativeSessionsOptions = {}\r\n): UseNativeSessionsReturn {\r\n const { tool, staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery<NativeSessionsListResponse>({\r\n queryKey: workspaceQueryKeys.nativeSessionsList(projectPath, tool),\r\n queryFn: () => fetchNativeSessions({ tool, project: projectPath, limit: 200 }),\r\n staleTime,\r\n gcTime,\r\n enabled,\r\n refetchOnWindowFocus: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n // Memoize sessions and byTool calculations\r\n const { sessions, byTool } = React.useMemo(() => {\r\n const sessions = query.data?.sessions ?? [];\r\n const byTool = query.data?.byTool ?? groupByTool(sessions);\r\n return { sessions, byTool };\r\n }, [query.data]);\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n sessions,\r\n byTool,\r\n count: query.data?.count ?? 0,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n };\r\n}\r\n\r\n/**\r\n * Hook for fetching native CLI sessions with infinite scroll/pagination\r\n *\r\n * @example\r\n * ```tsx\r\n * const { sessions, fetchNextPage, hasNextPage, isFetchingNextPage } = useNativeSessionsInfinite();\r\n *\r\n * // Load more button\r\n * <button onClick={() => fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage}>\r\n * {isFetchingNextPage ? 'Loading...' : 'Load More'}\r\n * </button>\r\n * ```\r\n */\r\nexport function useNativeSessionsInfinite(\r\n options: UseNativeSessionsOptions = {}\r\n): UseNativeSessionsInfiniteReturn {\r\n const { tool, staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useInfiniteQuery<NativeSessionsListResponse>({\r\n queryKey: [...workspaceQueryKeys.nativeSessionsList(projectPath, tool), 'infinite'],\r\n queryFn: ({ pageParam }) => fetchNativeSessions({\r\n tool,\r\n project: projectPath,\r\n limit: PAGE_SIZE,\r\n cursor: pageParam as string | null,\r\n }),\r\n initialPageParam: null as string | null,\r\n getNextPageParam: (lastPage) => {\r\n if (!lastPage.hasMore || !lastPage.nextCursor) return undefined;\r\n return lastPage.nextCursor;\r\n },\r\n staleTime,\r\n gcTime,\r\n enabled,\r\n refetchOnWindowFocus: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n // Flatten all pages into a single array and group by tool\r\n const { sessions, byTool, count } = React.useMemo(() => {\r\n const allSessions = query.data?.pages.flatMap(page => page.sessions) ?? [];\r\n // Merge byTool from all pages\r\n const mergedByTool: ByToolRecord = {};\r\n for (const page of query.data?.pages ?? []) {\r\n for (const [toolKey, toolSessions] of Object.entries(page.byTool ?? {})) {\r\n if (!mergedByTool[toolKey]) {\r\n mergedByTool[toolKey] = [];\r\n }\r\n mergedByTool[toolKey].push(...toolSessions);\r\n }\r\n }\r\n return { sessions: allSessions, byTool: mergedByTool, count: allSessions.length };\r\n }, [query.data]);\r\n\r\n const fetchNextPage = async () => {\r\n await query.fetchNextPage();\r\n };\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n sessions,\r\n byTool,\r\n count,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n isFetchingNextPage: query.isFetchingNextPage,\r\n hasNextPage: query.hasNextPage,\r\n error: query.error,\r\n fetchNextPage,\r\n refetch,\r\n };\r\n}\r\n","// ========================================\r\n// ConversationCard Component\r\n// ========================================\r\n// Card component for displaying CLI execution history items\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { cn } from '@/lib/utils';\r\nimport { Card, CardContent } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Button } from '@/components/ui/Button';\r\nimport {\r\n MoreVertical,\r\n Eye,\r\n Trash2,\r\n Copy,\r\n Clock,\r\n Timer,\r\n Hash,\r\n MessagesSquare,\r\n Folder,\r\n FileJson,\r\n} from 'lucide-react';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n} from '@/components/ui/Dropdown';\r\nimport type { CliExecution } from '@/lib/api';\r\n\r\nexport interface ConversationCardProps {\r\n /** Execution data */\r\n execution: CliExecution;\r\n /** Called when view action is triggered */\r\n onView?: (execution: CliExecution) => void;\r\n /** Called when view native session is triggered */\r\n onViewNative?: (execution: CliExecution) => void;\r\n /** Called when delete action is triggered */\r\n onDelete?: (id: string) => void;\r\n /** Called when card is clicked */\r\n onClick?: (execution: CliExecution) => void;\r\n /** Optional className */\r\n className?: string;\r\n /** Disabled state for actions */\r\n actionsDisabled?: boolean;\r\n}\r\n\r\n// Status configuration\r\nconst statusConfig = {\r\n success: {\r\n variant: 'success' as const,\r\n icon: 'check-circle',\r\n },\r\n error: {\r\n variant: 'destructive' as const,\r\n icon: 'x-circle',\r\n },\r\n timeout: {\r\n variant: 'warning' as const,\r\n icon: 'clock',\r\n },\r\n};\r\n\r\n/**\r\n * Format duration to human readable string\r\n */\r\nfunction formatDuration(ms: number): string {\r\n const seconds = Math.floor(ms / 1000);\r\n if (seconds < 60) return `${seconds}s`;\r\n const minutes = Math.floor(seconds / 60);\r\n const remainingSeconds = seconds % 60;\r\n return `${minutes}m ${remainingSeconds}s`;\r\n}\r\n\r\n/**\r\n * Hook to get localized time ago string\r\n */\r\nfunction useTimeAgo() {\r\n const { formatMessage } = useIntl();\r\n\r\n return React.useCallback((dateString: string): string => {\r\n const date = new Date(dateString);\r\n const now = new Date();\r\n const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);\r\n\r\n if (seconds < 60) return formatMessage({ id: 'common.time.justNow' });\r\n const minutes = Math.floor(seconds / 60);\r\n if (minutes < 60) return formatMessage({ id: 'common.time.minutesAgo' }, { count: minutes });\r\n const hours = Math.floor(minutes / 60);\r\n if (hours < 24) return formatMessage({ id: 'common.time.hoursAgo' }, { count: hours });\r\n const days = Math.floor(hours / 24);\r\n return formatMessage({ id: 'common.time.daysAgo' }, { count: days });\r\n }, [formatMessage]);\r\n}\r\n\r\n/**\r\n * ConversationCard component for displaying CLI execution history\r\n */\r\nexport function ConversationCard({\r\n execution,\r\n onView,\r\n onViewNative,\r\n onDelete,\r\n onClick,\r\n className,\r\n actionsDisabled = false,\r\n}: ConversationCardProps) {\r\n const { formatMessage } = useIntl();\r\n const getTimeAgo = useTimeAgo();\r\n const [copied, setCopied] = React.useState(false);\r\n\r\n const status = statusConfig[execution.status] || statusConfig.error;\r\n\r\n const handleCopyId = async (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n await navigator.clipboard.writeText(execution.id);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch {\r\n console.error('Failed to copy ID');\r\n }\r\n };\r\n\r\n const handleCardClick = (e: React.MouseEvent) => {\r\n // Don't trigger if clicking on dropdown\r\n if ((e.target as HTMLElement).closest('[data-radix-popper-content-wrapper]')) {\r\n return;\r\n }\r\n onClick?.(execution);\r\n };\r\n\r\n const handleAction = (\r\n e: React.MouseEvent,\r\n action: 'view' | 'delete' | 'copy'\r\n ) => {\r\n e.stopPropagation();\r\n switch (action) {\r\n case 'view':\r\n onView?.(execution);\r\n break;\r\n case 'delete':\r\n onDelete?.(execution.id);\r\n break;\r\n case 'copy':\r\n handleCopyId(e);\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <Card\r\n className={cn(\r\n 'group cursor-pointer transition-all duration-200 hover:shadow-md',\r\n className\r\n )}\r\n onClick={handleCardClick}\r\n >\r\n <CardContent className=\"p-4\">\r\n <div className=\"flex items-start gap-3\">\r\n {/* Main content */}\r\n <div className=\"flex-1 min-w-0\">\r\n {/* Header row */}\r\n <div className=\"flex flex-wrap items-center gap-2 mb-2\">\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n {execution.tool}\r\n </Badge>\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {execution.mode || 'analysis'}\r\n </Badge>\r\n {execution.turn_count && execution.turn_count > 1 && (\r\n <Badge variant=\"info\" className=\"gap-1 text-xs\">\r\n <MessagesSquare className=\"h-3 w-3\" />\r\n {execution.turn_count}\r\n </Badge>\r\n )}\r\n {execution.sourceDir && execution.sourceDir !== '.' && (\r\n <Badge variant=\"outline\" className=\"gap-1 text-xs\">\r\n <Folder className=\"h-3 w-3\" />\r\n {execution.sourceDir}\r\n </Badge>\r\n )}\r\n {execution.hasNativeSession && (\r\n <Badge variant=\"outline\" className=\"gap-1 text-xs\">\r\n <FileJson className=\"h-3 w-3\" />\r\n {formatMessage({ id: 'history.badge.native' })}\r\n </Badge>\r\n )}\r\n <Badge variant={status.variant} className=\"gap-1 text-xs ml-auto\">\r\n {status.icon === 'check-circle' && '✓'}\r\n {status.icon === 'x-circle' && '✗'}\r\n {status.icon === 'clock' && '⏱'}\r\n {execution.status}\r\n </Badge>\r\n </div>\r\n\r\n {/* Prompt preview */}\r\n <p className=\"text-sm text-foreground line-clamp-2 mb-2\">\r\n {typeof execution.prompt_preview === 'string'\r\n ? execution.prompt_preview\r\n : JSON.stringify(execution.prompt_preview)}\r\n </p>\r\n\r\n {/* Meta info */}\r\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {getTimeAgo(execution.timestamp)}\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <Timer className=\"h-3 w-3\" />\r\n {formatDuration(execution.duration_ms)}\r\n </span>\r\n <span className=\"flex items-center gap-1 font-mono\" title={execution.id}>\r\n <Hash className=\"h-3 w-3\" />\r\n {execution.id.substring(0, 8)}...\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Actions dropdown */}\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-8 w-8 opacity-0 group-hover:opacity-100 transition-opacity\"\r\n onClick={(e) => e.stopPropagation()}\r\n disabled={actionsDisabled}\r\n >\r\n <MoreVertical className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">{formatMessage({ id: 'common.aria.actions' })}</span>\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuItem onClick={(e) => handleAction(e, 'copy')}>\r\n <Copy className=\"mr-2 h-4 w-4\" />\r\n {copied\r\n ? formatMessage({ id: 'history.actions.copied' })\r\n : formatMessage({ id: 'history.actions.copyId' })}\r\n </DropdownMenuItem>\r\n <DropdownMenuItem onClick={(e) => handleAction(e, 'view')}>\r\n <Eye className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'history.actions.view' })}\r\n </DropdownMenuItem>\r\n {execution.hasNativeSession && (\r\n <DropdownMenuItem onClick={(e) => { e.stopPropagation(); onViewNative?.(execution); }}>\r\n <FileJson className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'history.actions.viewNative', defaultMessage: 'View Native Session' })}\r\n </DropdownMenuItem>\r\n )}\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem\r\n onClick={(e) => handleAction(e, 'delete')}\r\n className=\"text-destructive focus:text-destructive\"\r\n >\r\n <Trash2 className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'history.actions.delete' })}\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n","// ========================================\r\n// useNativeSession Hook\r\n// ========================================\r\n// TanStack Query hook for native CLI session content\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport {\r\n fetchNativeSession,\r\n type NativeSession,\r\n} from '../lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\n\r\n// ========== Query Keys ==========\r\n\r\nexport const nativeSessionKeys = {\r\n all: ['nativeSession'] as const,\r\n details: () => [...nativeSessionKeys.all, 'detail'] as const,\r\n detail: (id: string | null) => [...nativeSessionKeys.details(), id] as const,\r\n};\r\n\r\n// ========== Constants ==========\r\n\r\nconst STALE_TIME = 5 * 60 * 1000;\r\nconst GC_TIME = 10 * 60 * 1000;\r\n\r\n// ========== Types ==========\r\n\r\nexport interface UseNativeSessionOptions {\r\n staleTime?: number;\r\n gcTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseNativeSessionReturn {\r\n data: NativeSession | undefined;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n// ========== Hook ==========\r\n\r\n/**\r\n * Hook for fetching native CLI session content\r\n *\r\n * @param executionId - The CCW execution ID to fetch native session for\r\n * @param options - Query options\r\n */\r\nexport function useNativeSession(\r\n executionId: string | null,\r\n options: UseNativeSessionOptions = {}\r\n): UseNativeSessionReturn {\r\n const { staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const query = useQuery<NativeSession>({\r\n queryKey: nativeSessionKeys.detail(executionId),\r\n queryFn: () => {\r\n if (!executionId) throw new Error('executionId is required');\r\n return fetchNativeSession(executionId, projectPath);\r\n },\r\n enabled: !!executionId && enabled,\r\n staleTime,\r\n gcTime,\r\n refetchOnWindowFocus: false,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n data: query.data,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n };\r\n}\r\n","// ========================================\n// CLI Tool Theme Configuration\n// ========================================\n// Centralized theme configuration for CLI tools (gemini, codex, qwen, opencode)\n// Used for Badge variants, icons, and color theming across components\n\nimport type { LucideIcon } from 'lucide-react';\nimport { Sparkles, Code, Brain, Terminal, Cpu } from 'lucide-react';\n\n// ========== Types ==========\n\nexport type BadgeVariant = 'default' | 'secondary' | 'outline' | 'success' | 'warning' | 'info' | 'destructive';\n\nexport interface CliToolTheme {\n /** Badge variant for UI components */\n variant: BadgeVariant;\n /** Lucide icon name */\n icon: LucideIcon;\n /** Color theme (used for CSS classes) */\n color: 'blue' | 'green' | 'amber' | 'gray' | 'purple';\n /** Human-readable display name */\n displayName: string;\n /** Short label for compact display */\n shortLabel: string;\n}\n\n// ========== Tool Theme Configuration ==========\n\n/**\n * Theme configuration for each supported CLI tool\n * Maps tool ID to visual theme properties\n */\nexport const CLI_TOOL_THEMES: Record<string, CliToolTheme> = {\n gemini: {\n variant: 'info',\n icon: Sparkles,\n color: 'blue',\n displayName: 'Gemini',\n shortLabel: 'GEM',\n },\n codex: {\n variant: 'success',\n icon: Code,\n color: 'green',\n displayName: 'Codex',\n shortLabel: 'CDX',\n },\n qwen: {\n variant: 'warning',\n icon: Brain,\n color: 'amber',\n displayName: 'Qwen',\n shortLabel: 'QWN',\n },\n opencode: {\n variant: 'secondary',\n icon: Terminal,\n color: 'gray',\n displayName: 'OpenCode',\n shortLabel: 'OPC',\n },\n claude: {\n variant: 'default',\n icon: Cpu,\n color: 'purple',\n displayName: 'Claude',\n shortLabel: 'CLD',\n },\n};\n\n/**\n * Default theme for unknown tools\n */\nexport const DEFAULT_TOOL_THEME: CliToolTheme = {\n variant: 'secondary',\n icon: Terminal,\n color: 'gray',\n displayName: 'CLI',\n shortLabel: 'CLI',\n};\n\n// ========== Helper Functions ==========\n\n/**\n * Get theme configuration for a CLI tool\n * Falls back to default theme for unknown tools\n *\n * @param tool - Tool identifier (e.g., 'gemini', 'codex', 'qwen')\n * @returns Theme configuration for the tool\n */\nexport function getToolTheme(tool: string): CliToolTheme {\n const normalizedTool = tool.toLowerCase().trim();\n return CLI_TOOL_THEMES[normalizedTool] || DEFAULT_TOOL_THEME;\n}\n\n/**\n * Get Badge variant for a CLI tool\n * Used for tool badges in UI components\n *\n * @param tool - Tool identifier\n * @returns Badge variant\n */\nexport function getToolVariant(tool: string): BadgeVariant {\n return getToolTheme(tool).variant;\n}\n\n/**\n * Get icon component for a CLI tool\n *\n * @param tool - Tool identifier\n * @returns Lucide icon component\n */\nexport function getToolIcon(tool: string): LucideIcon {\n return getToolTheme(tool).icon;\n}\n\n/**\n * Get color class for a CLI tool\n * Returns a Tailwind CSS color class prefix\n *\n * @param tool - Tool identifier\n * @returns Color class prefix (e.g., 'text-blue-500')\n */\nexport function getToolColorClass(tool: string, shade: number = 500): string {\n const color = getToolTheme(tool).color;\n const colorMap: Record<string, string> = {\n blue: 'blue',\n green: 'green',\n amber: 'amber',\n gray: 'gray',\n purple: 'purple',\n };\n return `text-${colorMap[color] || 'gray'}-${shade}`;\n}\n\n/**\n * Get background color class for a CLI tool\n *\n * @param tool - Tool identifier\n * @returns Background color class (e.g., 'bg-blue-100')\n */\nexport function getToolBgClass(tool: string, shade: number = 100): string {\n const color = getToolTheme(tool).color;\n const colorMap: Record<string, string> = {\n blue: 'blue',\n green: 'green',\n amber: 'amber',\n gray: 'gray',\n purple: 'purple',\n };\n return `bg-${colorMap[color] || 'gray'}-${shade}`;\n}\n\n/**\n * Check if a tool is a known CLI tool\n *\n * @param tool - Tool identifier\n * @returns Whether the tool is known\n */\nexport function isKnownTool(tool: string): boolean {\n return tool.toLowerCase().trim() in CLI_TOOL_THEMES;\n}\n\n/**\n * Get all known tool identifiers\n *\n * @returns Array of known tool IDs\n */\nexport function getKnownTools(): string[] {\n return Object.keys(CLI_TOOL_THEMES);\n}\n","// ========================================\r\n// CliStreamPanel Component\r\n// ========================================\r\n// Turn-based CLI execution detail view\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { User, Bot, AlertTriangle, Info, Layers, Clock, Copy, Terminal, Hash, Calendar, CheckCircle2, XCircle, Timer, ChevronDown, ChevronRight, FileJson, Brain, Wrench, Coins, Loader2 } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Card } from '@/components/ui/Card';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '@/components/ui/Dialog';\r\nimport { useCliExecutionDetail } from '@/hooks/useCliExecution';\r\nimport { useNativeSession } from '@/hooks/useNativeSession';\r\nimport type { ConversationRecord, ConversationTurn, NativeSessionTurn, NativeTokenInfo, NativeToolCall } from '@/lib/api';\r\nimport { getToolVariant } from '@/lib/cli-tool-theme';\r\n\r\ntype ViewMode = 'per-turn' | 'concatenated' | 'native';\r\ntype ConcatFormat = 'plain' | 'yaml' | 'json';\r\n\r\nexport interface CliStreamPanelProps {\r\n executionId: string;\r\n sourceDir?: string;\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n}\r\n\r\n// ========== Types ==========\r\n\r\ninterface TurnSectionProps {\r\n turn: ConversationTurn;\r\n isLatest: boolean;\r\n isExpanded: boolean;\r\n onToggle: () => void;\r\n}\r\n\r\ninterface ConcatenatedViewProps {\r\n prompt: string;\r\n format: ConcatFormat;\r\n onFormatChange: (fmt: ConcatFormat) => void;\r\n}\r\n\r\n// ========== Helpers ==========\r\n\r\n/**\r\n * Format duration to human readable string\r\n */\r\nfunction formatDuration(ms: number): string {\r\n if (ms < 1000) return `${ms}ms`;\r\n const seconds = (ms / 1000).toFixed(1);\r\n return `${seconds}s`;\r\n}\r\n\r\n/**\r\n * Get status icon and color for a turn\r\n */\r\nfunction getStatusInfo(status: string) {\r\n const statusMap = {\r\n success: { icon: CheckCircle2, color: 'text-green-600 dark:text-green-400' },\r\n error: { icon: XCircle, color: 'text-destructive' },\r\n timeout: { icon: Timer, color: 'text-warning' },\r\n };\r\n return statusMap[status as keyof typeof statusMap] || statusMap.error;\r\n}\r\n\r\n/**\r\n * Ensure prompt is a string (handle legacy object data)\r\n */\r\nfunction ensureString(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n if (value && typeof value === 'object') return JSON.stringify(value);\r\n return String(value ?? '');\r\n}\r\n\r\n/**\r\n * Build concatenated prompt in specified format\r\n */\r\nfunction buildConcatenatedPrompt(execution: ConversationRecord, format: ConcatFormat, formatMessage: (message: { id: string }) => string): string {\r\n const turns = execution.turns;\r\n\r\n if (format === 'plain') {\r\n const parts: string[] = [];\r\n parts.push(`=== ${formatMessage({ id: 'cli-manager.streamPanel.conversationHistory' })} ===`);\r\n parts.push('');\r\n\r\n for (const turn of turns) {\r\n parts.push(`--- Turn ${turn.turn} ---`);\r\n parts.push('USER:');\r\n parts.push(ensureString(turn.prompt));\r\n parts.push('');\r\n parts.push('ASSISTANT:');\r\n parts.push(turn.output.stdout || formatMessage({ id: 'cli-manager.streamPanel.noOutput' }));\r\n parts.push('');\r\n }\r\n\r\n parts.push(`=== ${formatMessage({ id: 'cli-manager.streamPanel.newRequest' })} ===`);\r\n parts.push('');\r\n parts.push(formatMessage({ id: 'cli-manager.streamPanel.yourNextPrompt' }));\r\n\r\n return parts.join('\\n');\r\n }\r\n\r\n if (format === 'yaml') {\r\n const yaml: string[] = [];\r\n yaml.push('conversation:');\r\n yaml.push(' turns:');\r\n\r\n for (const turn of turns) {\r\n yaml.push(` - turn: ${turn.turn}`);\r\n yaml.push(` timestamp: ${turn.timestamp}`);\r\n yaml.push(` prompt: |`);\r\n ensureString(turn.prompt).split('\\n').forEach(line => {\r\n yaml.push(` ${line}`);\r\n });\r\n yaml.push(` response: |`);\r\n const output = turn.output.stdout || '';\r\n if (output) {\r\n output.split('\\n').forEach(line => {\r\n yaml.push(` ${line}`);\r\n });\r\n } else {\r\n yaml.push(` ${formatMessage({ id: 'cli-manager.streamPanel.noOutput' })}`);\r\n }\r\n }\r\n\r\n return yaml.join('\\n');\r\n }\r\n\r\n // JSON format\r\n return JSON.stringify(\r\n turns.map((t) => ({\r\n turn: t.turn,\r\n timestamp: t.timestamp,\r\n prompt: ensureString(t.prompt),\r\n response: t.output.stdout || '',\r\n })),\r\n null,\r\n 2\r\n );\r\n}\r\n\r\n// ========== Sub-Components ==========\r\n\r\n/**\r\n * TurnSection - Single turn display with collapsible content\r\n */\r\nfunction TurnSection({ turn, isLatest, isExpanded, onToggle }: TurnSectionProps) {\r\n const { formatMessage } = useIntl();\r\n const StatusIcon = getStatusInfo(turn.status as string).icon;\r\n const statusColor = getStatusInfo(turn.status as string).color;\r\n\r\n return (\r\n <Card\r\n className={cn(\r\n 'overflow-hidden transition-all',\r\n isLatest && 'ring-2 ring-primary/50 shadow-md'\r\n )}\r\n >\r\n {/* Turn Header - Clickable for expand/collapse */}\r\n <div\r\n className=\"flex items-center justify-between px-4 py-3 bg-muted/50 border-b cursor-pointer hover:bg-muted/70 transition-colors\"\r\n onClick={onToggle}\r\n role=\"button\"\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onToggle(); }}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <span className=\"font-semibold text-sm\">{formatMessage({ id: 'cli.details.turn' })} {turn.turn}</span>\r\n {isLatest && (\r\n <Badge variant=\"default\" className=\"text-xs h-5 px-1.5\">\r\n {formatMessage({ id: 'cli-manager.streamPanel.latest' })}\r\n </Badge>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'cli.details.timestamp' })}>\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(turn.timestamp).toLocaleTimeString()}\r\n </span>\r\n <span className={cn('flex items-center gap-1 font-medium', statusColor)} title={formatMessage({ id: 'cli.details.status' })}>\r\n <StatusIcon className=\"h-3.5 w-3.5\" />\r\n {turn.status}\r\n </span>\r\n <span className=\"font-mono text-xs\" title={formatMessage({ id: 'cli.details.duration' })}>\r\n {formatDuration(turn.duration_ms)}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Turn Body - Collapsible */}\r\n {isExpanded && (\r\n <div className=\"p-4 space-y-4\">\r\n {/* User Prompt */}\r\n <div>\r\n <h4 className=\"flex items-center gap-2 text-sm font-semibold mb-2 text-foreground\">\r\n <User className=\"h-4 w-4 text-primary\" aria-hidden=\"true\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.userPrompt' })}\r\n </h4>\r\n <pre className=\"p-3 bg-muted/50 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed\">\r\n {ensureString(turn.prompt)}\r\n </pre>\r\n </div>\r\n\r\n {/* Assistant Response */}\r\n {turn.output.stdout && (\r\n <div>\r\n <h4 className=\"flex items-center gap-2 text-sm font-semibold mb-2 text-foreground\">\r\n <Bot className=\"h-4 w-4 text-blue-500\" aria-hidden=\"true\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.assistantResponse' })}\r\n </h4>\r\n <pre className=\"p-3 bg-blue-500/5 dark:bg-blue-500/10 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed\">\r\n {turn.output.stdout}\r\n </pre>\r\n </div>\r\n )}\r\n\r\n {/* Errors */}\r\n {turn.output.stderr && (\r\n <div>\r\n <h4 className=\"flex items-center gap-2 text-sm font-semibold mb-2 text-destructive\">\r\n <AlertTriangle className=\"h-4 w-4\" aria-hidden=\"true\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.errors' })}\r\n </h4>\r\n <pre className=\"p-3 bg-destructive/10 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed text-destructive\">\r\n {turn.output.stderr}\r\n </pre>\r\n </div>\r\n )}\r\n\r\n {/* Truncated Notice */}\r\n {turn.output.truncated && (\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground p-3 bg-muted/50 rounded-lg border border-border/50\">\r\n <Info className=\"h-4 w-4 flex-shrink-0\" aria-hidden=\"true\" />\r\n <span>{formatMessage({ id: 'cli-manager.streamPanel.truncatedNotice' })}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </Card>\r\n );\r\n}\r\n\r\n/**\r\n * PerTurnView - Display all turns with collapsible sections\r\n * Default behavior: only latest turn is expanded, others are collapsed\r\n */\r\nfunction PerTurnView({ turns }: { turns: ConversationTurn[] }) {\r\n // Default: only the latest turn is expanded\r\n const [expandedTurns, setExpandedTurns] = React.useState<Set<number>>(() => {\r\n if (turns.length === 0) return new Set();\r\n return new Set([turns[turns.length - 1].turn]);\r\n });\r\n\r\n const handleToggle = React.useCallback((turnNumber: number) => {\r\n setExpandedTurns((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(turnNumber)) {\r\n next.delete(turnNumber);\r\n } else {\r\n next.add(turnNumber);\r\n }\r\n return next;\r\n });\r\n }, []);\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {turns.map((turn, idx) => (\r\n <React.Fragment key={turn.turn}>\r\n <TurnSection\r\n turn={turn}\r\n isLatest={idx === turns.length - 1}\r\n isExpanded={expandedTurns.has(turn.turn)}\r\n onToggle={() => handleToggle(turn.turn)}\r\n />\r\n {/* Connector line between turns */}\r\n {idx < turns.length - 1 && (\r\n <div className=\"flex justify-center\" aria-hidden=\"true\">\r\n <div className=\"w-px h-6 bg-border\" />\r\n </div>\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * ConcatenatedView - Display all turns merged into a single prompt\r\n */\r\nfunction ConcatenatedView({ prompt, format, onFormatChange }: ConcatenatedViewProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h4 className=\"flex items-center gap-2 text-sm font-semibold\">\r\n <Layers className=\"h-4 w-4\" aria-hidden=\"true\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.concatenatedPrompt' })}\r\n </h4>\r\n <div className=\"flex gap-2\">\r\n {(['plain', 'yaml', 'json'] as const).map((fmt) => (\r\n <Button\r\n key={fmt}\r\n size=\"sm\"\r\n variant={format === fmt ? 'default' : 'outline'}\r\n onClick={() => onFormatChange(fmt)}\r\n className=\"h-7 px-2 text-xs\"\r\n >\r\n {fmt.toUpperCase()}\r\n </Button>\r\n ))}\r\n </div>\r\n </div>\r\n <pre className=\"p-4 bg-muted/50 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-[60vh] overflow-y-auto\">\r\n {prompt}\r\n </pre>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Native View Components ==========\r\n\r\n/**\r\n * Format token count with compact notation\r\n */\r\nfunction formatTokenCount(count: number | undefined): string {\r\n if (count == null || count === 0) return '0';\r\n if (count >= 1_000_000) return `${(count / 1_000_000).toFixed(1)}M`;\r\n if (count >= 1_000) return `${(count / 1_000).toFixed(1)}K`;\r\n return count.toLocaleString();\r\n}\r\n\r\n/**\r\n * NativeTokenDisplay - Compact token info line\r\n */\r\nfunction NativeTokenDisplay({ tokens, className }: { tokens: NativeTokenInfo; className?: string }) {\r\n return (\r\n <div className={cn('flex items-center gap-3 text-xs text-muted-foreground', className)}>\r\n <span className=\"flex items-center gap-1\" title=\"Total tokens\">\r\n <Coins className=\"h-3 w-3\" />\r\n {formatTokenCount(tokens.total)}\r\n </span>\r\n {tokens.input != null && (\r\n <span title=\"Input tokens\">in: {formatTokenCount(tokens.input)}</span>\r\n )}\r\n {tokens.output != null && (\r\n <span title=\"Output tokens\">out: {formatTokenCount(tokens.output)}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * NativeToolCallItem - Single tool call display\r\n */\r\nfunction NativeToolCallItem({ toolCall, index }: { toolCall: NativeToolCall; index: number }) {\r\n return (\r\n <details className=\"group/tool border border-border/50 rounded-md overflow-hidden\">\r\n <summary className=\"flex items-center gap-2 px-3 py-2 text-xs cursor-pointer hover:bg-muted/50 select-none\">\r\n <Wrench className=\"h-3 w-3 text-muted-foreground flex-shrink-0\" />\r\n <span className=\"font-mono font-medium\">{toolCall.name}</span>\r\n <span className=\"text-muted-foreground\">#{index + 1}</span>\r\n </summary>\r\n <div className=\"border-t border-border/50 divide-y divide-border/50\">\r\n {toolCall.arguments && (\r\n <div className=\"p-3\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">Input</p>\r\n <pre className=\"p-2 bg-muted/30 rounded text-xs whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-40 overflow-y-auto\">\r\n {toolCall.arguments}\r\n </pre>\r\n </div>\r\n )}\r\n {toolCall.output && (\r\n <div className=\"p-3\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">Output</p>\r\n <pre className=\"p-2 bg-muted/30 rounded text-xs whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-40 overflow-y-auto\">\r\n {toolCall.output}\r\n </pre>\r\n </div>\r\n )}\r\n </div>\r\n </details>\r\n );\r\n}\r\n\r\ninterface NativeTurnCardProps {\r\n turn: NativeSessionTurn;\r\n isLatest: boolean;\r\n isExpanded: boolean;\r\n onToggle: () => void;\r\n}\r\n\r\n/**\r\n * NativeTurnCard - Single native conversation turn with collapsible content\r\n */\r\nfunction NativeTurnCard({ turn, isLatest, isExpanded, onToggle }: NativeTurnCardProps) {\r\n const { formatMessage } = useIntl();\r\n const isUser = turn.role === 'user';\r\n const RoleIcon = isUser ? User : Bot;\r\n\r\n return (\r\n <Card\r\n className={cn(\r\n 'overflow-hidden transition-all',\r\n isUser ? 'bg-muted/30' : 'bg-blue-500/5 dark:bg-blue-500/10',\r\n isLatest && 'ring-2 ring-primary/50 shadow-md'\r\n )}\r\n >\r\n {/* Header - Clickable */}\r\n <div\r\n className=\"flex items-center justify-between px-4 py-3 border-b border-border/50 cursor-pointer hover:bg-muted/30 transition-colors\"\r\n onClick={onToggle}\r\n role=\"button\"\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onToggle(); }}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <RoleIcon className={cn('h-4 w-4', isUser ? 'text-primary' : 'text-blue-500')} />\r\n <span className=\"font-semibold text-sm capitalize\">{turn.role}</span>\r\n <span className=\"text-xs text-muted-foreground\">#{turn.turnNumber}</span>\r\n {isLatest && (\r\n <Badge variant=\"default\" className=\"text-xs h-5 px-1.5\">\r\n {formatMessage({ id: 'cli-manager.streamPanel.latest' })}\r\n </Badge>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\r\n {turn.timestamp && (\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(turn.timestamp).toLocaleTimeString()}\r\n </span>\r\n )}\r\n {turn.tokens && <NativeTokenDisplay tokens={turn.tokens} />}\r\n </div>\r\n </div>\r\n\r\n {/* Content - Collapsible */}\r\n {isExpanded && (\r\n <div className=\"p-4 space-y-3\">\r\n {turn.content && (\r\n <pre className=\"p-3 bg-background/50 rounded-lg text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-80 overflow-y-auto\">\r\n {ensureString(turn.content)}\r\n </pre>\r\n )}\r\n\r\n {/* Thoughts Section */}\r\n {turn.thoughts && turn.thoughts.length > 0 && (\r\n <details className=\"group/thoughts\" open>\r\n <summary className=\"flex items-center gap-2 text-sm cursor-pointer hover:text-foreground text-muted-foreground select-none py-1\">\r\n <Brain className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">Thoughts</span>\r\n <span className=\"text-xs\">({turn.thoughts.length})</span>\r\n </summary>\r\n <ul className=\"mt-2 space-y-1 pl-6 text-sm text-muted-foreground list-disc\">\r\n {turn.thoughts.map((thought, i) => (\r\n <li key={i} className=\"leading-relaxed\">{thought}</li>\r\n ))}\r\n </ul>\r\n </details>\r\n )}\r\n\r\n {/* Tool Calls Section */}\r\n {turn.toolCalls && turn.toolCalls.length > 0 && (\r\n <details className=\"group/calls\">\r\n <summary className=\"flex items-center gap-2 text-sm cursor-pointer hover:text-foreground text-muted-foreground select-none py-1\">\r\n <Wrench className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">Tool Calls</span>\r\n <span className=\"text-xs\">({turn.toolCalls.length})</span>\r\n </summary>\r\n <div className=\"mt-2 space-y-2\">\r\n {turn.toolCalls.map((tc, i) => (\r\n <NativeToolCallItem key={i} toolCall={tc} index={i} />\r\n ))}\r\n </div>\r\n </details>\r\n )}\r\n </div>\r\n )}\r\n </Card>\r\n );\r\n}\r\n\r\ninterface NativeTurnViewProps {\r\n turns: NativeSessionTurn[];\r\n}\r\n\r\n/**\r\n * NativeTurnView - Display native session turns with collapsible cards\r\n */\r\nfunction NativeTurnView({ turns }: NativeTurnViewProps) {\r\n // Default: only the latest turn is expanded\r\n const [expandedTurns, setExpandedTurns] = React.useState<Set<number>>(() => {\r\n if (turns.length === 0) return new Set();\r\n return new Set([turns[turns.length - 1].turnNumber]);\r\n });\r\n\r\n const handleToggle = React.useCallback((turnNumber: number) => {\r\n setExpandedTurns((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(turnNumber)) {\r\n next.delete(turnNumber);\r\n } else {\r\n next.add(turnNumber);\r\n }\r\n return next;\r\n });\r\n }, []);\r\n\r\n if (turns.length === 0) {\r\n return (\r\n <div className=\"flex items-center justify-center py-8 text-muted-foreground\">\r\n No native session data available\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {turns.map((turn, idx) => (\r\n <React.Fragment key={turn.turnNumber}>\r\n <NativeTurnCard\r\n turn={turn}\r\n isLatest={idx === turns.length - 1}\r\n isExpanded={expandedTurns.has(turn.turnNumber)}\r\n onToggle={() => handleToggle(turn.turnNumber)}\r\n />\r\n {idx < turns.length - 1 && (\r\n <div className=\"flex justify-center\" aria-hidden=\"true\">\r\n <div className=\"w-px h-4 bg-border\" />\r\n </div>\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * CliStreamPanel component - Elegant turn-based conversation view\r\n *\r\n * Displays CLI execution details with:\r\n * - Per-turn view with collapsible timeline layout\r\n * - Concatenated view for resume context\r\n * - Native view for detailed CLI session data\r\n * - Format selection (Plain/YAML/JSON)\r\n */\r\nexport function CliStreamPanel({\r\n executionId,\r\n sourceDir: _sourceDir,\r\n open,\r\n onOpenChange,\r\n}: CliStreamPanelProps) {\r\n const { formatMessage } = useIntl();\r\n const [viewMode, setViewMode] = React.useState<ViewMode>('per-turn');\r\n const [concatFormat, setConcatFormat] = React.useState<ConcatFormat>('plain');\r\n\r\n const { data: execution, isLoading } = useCliExecutionDetail(open ? executionId : null);\r\n\r\n // Load native session only when native view is selected\r\n const { data: nativeSession, isLoading: nativeLoading } = useNativeSession(\r\n viewMode === 'native' && open ? executionId : null\r\n );\r\n\r\n // Build concatenated prompt\r\n const concatenatedPrompt = React.useMemo(() => {\r\n if (!execution?.turns) return '';\r\n return buildConcatenatedPrompt(execution, concatFormat, formatMessage);\r\n }, [execution, concatFormat, formatMessage]);\r\n\r\n // Copy to clipboard\r\n const copyToClipboard = React.useCallback(\r\n async (text: string, label: string) => {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n // Optional: add toast notification here\r\n console.log(`Copied ${label} to clipboard`);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n }\r\n },\r\n []\r\n );\r\n\r\n // Calculate total duration\r\n const totalDuration = React.useMemo(() => {\r\n if (!execution?.turns) return 0;\r\n return execution.turns.reduce((sum, t) => sum + t.duration_ms, 0);\r\n }, [execution]);\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-4xl max-h-[85vh] overflow-hidden flex flex-col p-0\">\r\n <DialogHeader className=\"px-6 pt-6 pb-4 border-b shrink-0\">\r\n <div className=\"flex items-center justify-between pr-8\">\r\n <DialogTitle className=\"flex items-center gap-2\">\r\n <Terminal className=\"h-5 w-5\" />\r\n {formatMessage({ id: 'cli-manager.executionDetails' })}\r\n </DialogTitle>\r\n {execution && (\r\n <div className=\"flex items-center gap-2\">\r\n <Badge variant={getToolVariant(execution.tool)} title={formatMessage({ id: 'cli.details.tool' })}>\r\n {execution.tool.toUpperCase()}\r\n </Badge>\r\n {execution.mode && <Badge variant=\"secondary\" title={formatMessage({ id: 'cli.details.mode' })}>{execution.mode}</Badge>}\r\n <span className=\"text-sm text-muted-foreground font-mono\" title={formatMessage({ id: 'cli.details.duration' })}>\r\n {formatDuration(totalDuration)}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n {execution && (\r\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground mt-2\">\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'cli.details.created' })}>\r\n <Calendar className=\"h-3 w-3\" />\r\n {new Date(execution.created_at).toLocaleString()}\r\n </span>\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'cli.details.id' })}>\r\n <Hash className=\"h-3 w-3\" />\r\n {execution.id.slice(0, 8)}\r\n </span>\r\n <span>{execution.turn_count} {formatMessage({ id: 'cli-manager.streamPanel.turns' })}</span>\r\n </div>\r\n )}\r\n </DialogHeader>\r\n\r\n {isLoading ? (\r\n <div className=\"flex-1 flex items-center justify-center\">\r\n <div className=\"text-muted-foreground\">{formatMessage({ id: 'cli-manager.streamPanel.loading' })}</div>\r\n </div>\r\n ) : execution?.turns && execution.turns.length > 0 ? (\r\n <>\r\n {/* View Toggle - Show for all conversations */}\r\n <div className=\"flex items-center gap-2 px-6 py-3 border-b shrink-0\">\r\n <Button\r\n size=\"sm\"\r\n variant={viewMode === 'per-turn' ? 'default' : 'outline'}\r\n onClick={() => setViewMode('per-turn')}\r\n className=\"h-8\"\r\n >\r\n <Layers className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.perTurnView' })}\r\n </Button>\r\n {execution.turns.length > 1 && (\r\n <Button\r\n size=\"sm\"\r\n variant={viewMode === 'concatenated' ? 'default' : 'outline'}\r\n onClick={() => setViewMode('concatenated')}\r\n className=\"h-8\"\r\n >\r\n <Copy className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.concatenatedView' })}\r\n </Button>\r\n )}\r\n <Button\r\n size=\"sm\"\r\n variant={viewMode === 'native' ? 'default' : 'outline'}\r\n onClick={() => setViewMode('native')}\r\n className=\"h-8\"\r\n >\r\n <FileJson className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.nativeView' })}\r\n </Button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\r\n {viewMode === 'per-turn' ? (\r\n <PerTurnView turns={execution.turns} />\r\n ) : viewMode === 'concatenated' ? (\r\n <ConcatenatedView\r\n prompt={concatenatedPrompt}\r\n format={concatFormat}\r\n onFormatChange={setConcatFormat}\r\n />\r\n ) : viewMode === 'native' ? (\r\n nativeLoading ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <Loader2 className=\"h-5 w-5 animate-spin mr-2\" />\r\n <span className=\"text-muted-foreground\">Loading native session...</span>\r\n </div>\r\n ) : nativeSession ? (\r\n <NativeTurnView turns={nativeSession.turns} />\r\n ) : (\r\n <div className=\"flex items-center justify-center py-8 text-muted-foreground\">\r\n No native session data available\r\n </div>\r\n )\r\n ) : null}\r\n </div>\r\n\r\n {/* Footer Actions */}\r\n <div className=\"flex items-center gap-2 px-6 py-4 border-t bg-muted/30 shrink-0\">\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n onClick={() => copyToClipboard(execution.id, 'ID')}\r\n className=\"h-8\"\r\n >\r\n <Copy className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.copyId' })}\r\n </Button>\r\n {execution.turns.length > 1 && viewMode === 'concatenated' && (\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n onClick={() => copyToClipboard(concatenatedPrompt, 'prompt')}\r\n className=\"h-8\"\r\n >\r\n <Copy className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'cli-manager.streamPanel.copyPrompt' })}\r\n </Button>\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"flex-1 flex items-center justify-center text-muted-foreground\">\r\n {formatMessage({ id: 'cli-manager.streamPanel.noDetails' })}\r\n </div>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n","// ========================================\r\n// useNativeSessionByPath Hook\r\n// ========================================\r\n// TanStack Query hook for native CLI session content by file path\r\n\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport {\r\n fetchNativeSessionWithOptions,\r\n type NativeSession,\r\n} from '../lib/api';\r\n\r\n// ========== Query Keys ==========\r\n\r\nexport const nativeSessionPathKeys = {\r\n all: ['nativeSessionPath'] as const,\r\n details: () => [...nativeSessionPathKeys.all, 'detail'] as const,\r\n detail: (filePath: string | null) => [...nativeSessionPathKeys.details(), filePath] as const,\r\n};\r\n\r\n// ========== Constants ==========\r\n\r\nconst STALE_TIME = 5 * 60 * 1000; // 5 minutes\r\nconst GC_TIME = 30 * 60 * 1000; // 30 minutes\r\n\r\n// ========== Types ==========\r\n\r\nexport interface UseNativeSessionByPathOptions {\r\n staleTime?: number;\r\n gcTime?: number;\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseNativeSessionByPathReturn {\r\n data: NativeSession | undefined;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n error: Error | null;\r\n refetch: () => Promise<void>;\r\n}\r\n\r\n// ========== Hook ==========\r\n\r\n/**\r\n * Hook for fetching native CLI session content by file path\r\n *\r\n * @param filePath - The file path to the session file\r\n * @param tool - The tool type (gemini, qwen, codex, claude, opencode)\r\n * @param options - Query options\r\n */\r\nexport function useNativeSessionByPath(\r\n filePath: string | null,\r\n tool?: string,\r\n options: UseNativeSessionByPathOptions = {}\r\n): UseNativeSessionByPathReturn {\r\n const { staleTime = STALE_TIME, gcTime = GC_TIME, enabled = true } = options;\r\n\r\n const query = useQuery<NativeSession>({\r\n queryKey: nativeSessionPathKeys.detail(filePath),\r\n queryFn: () => {\r\n if (!filePath) throw new Error('filePath is required');\r\n return fetchNativeSessionWithOptions({\r\n filePath,\r\n tool: tool as 'gemini' | 'qwen' | 'codex' | 'claude' | 'opencode' | undefined,\r\n }) as Promise<NativeSession>;\r\n },\r\n enabled: !!filePath && enabled,\r\n staleTime,\r\n gcTime,\r\n refetchOnWindowFocus: false,\r\n refetchOnMount: false,\r\n refetchOnReconnect: false,\r\n retry: 2,\r\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 10000),\r\n });\r\n\r\n const refetch = async () => {\r\n await query.refetch();\r\n };\r\n\r\n return {\r\n data: query.data,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n error: query.error,\r\n refetch,\r\n };\r\n}\r\n","// ========================================\r\n// SessionTimeline Component\r\n// ========================================\r\n// Timeline visualization for native CLI session turns, tokens, and tool calls\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n User,\r\n Bot,\r\n Brain,\r\n Wrench,\r\n Coins,\r\n Clock,\r\n ChevronDown,\r\n ChevronRight,\r\n Archive,\r\n ArrowDownUp,\r\n CheckCircle,\r\n XCircle,\r\n Loader2,\r\n} from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport type {\r\n NativeSession,\r\n NativeSessionTurn,\r\n NativeTokenInfo,\r\n NativeToolCall,\r\n} from '@/lib/api';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface SessionTimelineProps {\r\n session: NativeSession;\r\n className?: string;\r\n}\r\n\r\ninterface TurnNodeProps {\r\n turn: NativeSessionTurn;\r\n isLatest: boolean;\r\n isLast: boolean;\r\n}\r\n\r\ninterface TokenBarProps {\r\n tokens: NativeTokenInfo;\r\n className?: string;\r\n}\r\n\r\ninterface ToolCallPanelProps {\r\n toolCall: NativeToolCall;\r\n index: number;\r\n}\r\n\r\n// ========== Helpers ==========\r\n\r\n/**\r\n * Ensure content is a string (handle legacy object data like {text: \"...\"})\r\n */\r\nfunction ensureString(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n if (value && typeof value === 'object') return JSON.stringify(value);\r\n return String(value ?? '');\r\n}\r\n\r\n/**\r\n * Format token number with compact notation\r\n */\r\nfunction formatTokenCount(count: number | undefined): string {\r\n if (count == null || count === 0) return '0';\r\n if (count >= 1_000_000) return `${(count / 1_000_000).toFixed(1)}M`;\r\n if (count >= 1_000) return `${(count / 1_000).toFixed(1)}K`;\r\n return count.toLocaleString();\r\n}\r\n\r\n/**\r\n * Get status icon for tool call\r\n */\r\nfunction getToolStatusIcon(status?: string): React.ReactNode {\r\n switch (status) {\r\n case 'completed':\r\n case 'success':\r\n return <CheckCircle className=\"h-3.5 w-3.5 text-green-500\" />;\r\n case 'error':\r\n case 'failed':\r\n return <XCircle className=\"h-3.5 w-3.5 text-destructive\" />;\r\n case 'running':\r\n case 'pending':\r\n return <Loader2 className=\"h-3.5 w-3.5 text-blue-500 animate-spin\" />;\r\n default:\r\n return <Wrench className=\"h-3.5 w-3.5 text-muted-foreground\" />;\r\n }\r\n}\r\n\r\n/**\r\n * Get badge variant for tool call status\r\n */\r\nfunction getStatusVariant(status?: string): 'default' | 'secondary' | 'outline' | 'success' | 'warning' | 'info' {\r\n switch (status) {\r\n case 'completed':\r\n case 'success':\r\n return 'success';\r\n case 'error':\r\n case 'failed':\r\n return 'warning';\r\n case 'running':\r\n case 'pending':\r\n return 'info';\r\n default:\r\n return 'secondary';\r\n }\r\n}\r\n\r\n// ========== Sub-Components ==========\r\n\r\n/**\r\n * TokenBar - Horizontal stacked bar for token usage\r\n */\r\nfunction TokenBar({ tokens, className }: TokenBarProps) {\r\n const { formatMessage } = useIntl();\r\n const total = tokens.total || 0;\r\n const input = tokens.input || 0;\r\n const output = tokens.output || 0;\r\n const cached = tokens.cached || 0;\r\n\r\n // Calculate percentages\r\n const inputPercent = total > 0 ? (input / total) * 100 : 0;\r\n const outputPercent = total > 0 ? (output / total) * 100 : 0;\r\n const cachedPercent = total > 0 ? (cached / total) * 100 : 0;\r\n\r\n return (\r\n <div className={cn('space-y-1.5', className)}>\r\n {/* Visual bar */}\r\n <div className=\"flex h-2 w-full rounded-full overflow-hidden bg-muted\">\r\n {input > 0 && (\r\n <div\r\n className=\"bg-blue-500/80\"\r\n style={{ width: `${inputPercent}%` }}\r\n title={formatMessage({ id: 'nativeSession.timeline.tokens.input', defaultMessage: 'Input: {count}' }, { count: formatTokenCount(input) })}\r\n />\r\n )}\r\n {output > 0 && (\r\n <div\r\n className=\"bg-green-500/80\"\r\n style={{ width: `${outputPercent}%` }}\r\n title={formatMessage({ id: 'nativeSession.timeline.tokens.output', defaultMessage: 'Output: {count}' }, { count: formatTokenCount(output) })}\r\n />\r\n )}\r\n {cached > 0 && (\r\n <div\r\n className=\"bg-amber-500/80\"\r\n style={{ width: `${cachedPercent}%` }}\r\n title={formatMessage({ id: 'nativeSession.timeline.tokens.cached', defaultMessage: 'Cached: {count}' }, { count: formatTokenCount(cached) })}\r\n />\r\n )}\r\n </div>\r\n {/* Labels */}\r\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\r\n <span className=\"flex items-center gap-1\">\r\n <Coins className=\"h-3 w-3\" />\r\n {formatTokenCount(total)}\r\n </span>\r\n {input > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <ArrowDownUp className=\"h-3 w-3 text-blue-500\" />\r\n {formatTokenCount(input)}\r\n </span>\r\n )}\r\n {output > 0 && (\r\n <span className=\"text-green-600 dark:text-green-400\">\r\n out: {formatTokenCount(output)}\r\n </span>\r\n )}\r\n {cached > 0 && (\r\n <span className=\"flex items-center gap-1\">\r\n <Archive className=\"h-3 w-3 text-amber-500\" />\r\n {formatTokenCount(cached)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * ToolCallPanel - Collapsible panel for tool call details\r\n */\r\nfunction ToolCallPanel({ toolCall, index }: ToolCallPanelProps) {\r\n const { formatMessage } = useIntl();\r\n const [isExpanded, setIsExpanded] = React.useState(false);\r\n\r\n return (\r\n <div className=\"border border-border/50 rounded-lg overflow-hidden\">\r\n {/* Header */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n className=\"w-full flex items-center justify-between px-3 py-2.5 text-sm hover:bg-muted/50 transition-colors\"\r\n aria-expanded={isExpanded}\r\n aria-controls={`toolcall-panel-${toolCall.name}-${index}`}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <span aria-label={toolCall.output ? 'Tool completed' : 'Tool status unknown'}>\r\n {getToolStatusIcon(toolCall.output ? 'completed' : undefined)}\r\n </span>\r\n <span className=\"font-mono font-medium\">{toolCall.name}</span>\r\n <span className=\"text-muted-foreground text-xs\">#{index + 1}</span>\r\n </div>\r\n <Badge variant={getStatusVariant(toolCall.output ? 'completed' : undefined)} className=\"text-xs\">\r\n {formatMessage({ id: 'nativeSession.timeline.toolCall.completed', defaultMessage: 'completed' })}\r\n </Badge>\r\n </button>\r\n\r\n {/* Collapsible content */}\r\n {isExpanded && (\r\n <div\r\n id={`toolcall-panel-${toolCall.name}-${index}`}\r\n className=\"border-t border-border/50 divide-y divide-border/50\"\r\n >\r\n {toolCall.arguments && (\r\n <div className=\"p-3\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-1.5\">\r\n {formatMessage({ id: 'nativeSession.toolCall.input', defaultMessage: 'Input' })}\r\n </p>\r\n <pre className=\"p-2.5 bg-muted/30 rounded-md text-xs whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-48 overflow-y-auto\">\r\n {toolCall.arguments}\r\n </pre>\r\n </div>\r\n )}\r\n {toolCall.output && (\r\n <div className=\"p-3\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-1.5\">\r\n {formatMessage({ id: 'nativeSession.toolCall.output', defaultMessage: 'Output' })}\r\n </p>\r\n <pre className=\"p-2.5 bg-muted/30 rounded-md text-xs whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-48 overflow-y-auto\">\r\n {toolCall.output}\r\n </pre>\r\n </div>\r\n )}\r\n {!toolCall.arguments && !toolCall.output && (\r\n <div className=\"p-3 text-xs text-muted-foreground italic\">\r\n {formatMessage({ id: 'nativeSession.timeline.toolCall.noData', defaultMessage: 'No data available' })}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * TurnNode - Single conversation turn on the timeline\r\n */\r\nfunction TurnNode({ turn, isLatest, isLast }: TurnNodeProps) {\r\n const { formatMessage } = useIntl();\r\n const isUser = turn.role === 'user';\r\n const RoleIcon = isUser ? User : Bot;\r\n\r\n return (\r\n <div className=\"flex gap-4\">\r\n {/* Timeline column */}\r\n <div className=\"flex flex-col items-center\">\r\n {/* Node dot */}\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center w-8 h-8 rounded-full border-2 shrink-0',\r\n isUser\r\n ? 'bg-primary/10 border-primary text-primary'\r\n : 'bg-blue-500/10 border-blue-500 text-blue-500',\r\n isLatest && 'ring-2 ring-offset-2 ring-offset-background',\r\n isLatest && (isUser ? 'ring-primary/50' : 'ring-blue-500/50')\r\n )}\r\n >\r\n <RoleIcon className=\"h-4 w-4\" />\r\n </div>\r\n {/* Vertical connector line */}\r\n {!isLast && (\r\n <div className=\"w-0.5 flex-1 bg-border min-h-4\" aria-hidden=\"true\" />\r\n )}\r\n </div>\r\n\r\n {/* Content column */}\r\n <div className=\"flex-1 pb-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className={cn(\r\n 'font-semibold text-sm capitalize',\r\n isUser ? 'text-primary' : 'text-blue-500'\r\n )}>\r\n {turn.role}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n {formatMessage(\r\n { id: 'nativeSession.timeline.turnNumber', defaultMessage: 'Turn #{number}' },\r\n { number: turn.turnNumber }\r\n )}\r\n </span>\r\n {isLatest && (\r\n <Badge variant=\"default\" className=\"text-xs h-5 px-1.5\">\r\n {formatMessage({ id: 'nativeSession.turn.latest', defaultMessage: 'Latest' })}\r\n </Badge>\r\n )}\r\n </div>\r\n {turn.timestamp && (\r\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(turn.timestamp).toLocaleTimeString()}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Content card */}\r\n <div\r\n className={cn(\r\n 'rounded-lg border overflow-hidden',\r\n isUser\r\n ? 'bg-muted/30 border-border'\r\n : 'bg-blue-500/5 dark:bg-blue-500/10 border-blue-500/20'\r\n )}\r\n >\r\n {/* Message content */}\r\n {turn.content && (\r\n <div className=\"p-4\">\r\n <pre className=\"text-sm whitespace-pre-wrap overflow-x-auto font-mono leading-relaxed max-h-64 overflow-y-auto\">\r\n {ensureString(turn.content)}\r\n </pre>\r\n </div>\r\n )}\r\n\r\n {/* Thoughts section */}\r\n {turn.thoughts && turn.thoughts.length > 0 && (\r\n <details className=\"group/thoughts border-t border-border/50\">\r\n <summary className=\"flex items-center gap-2 px-4 py-2.5 text-sm cursor-pointer hover:bg-muted/30 select-none\">\r\n <Brain className=\"h-4 w-4 text-purple-500\" />\r\n <span className=\"font-medium text-muted-foreground\">\r\n {formatMessage({ id: 'nativeSession.turn.thoughts', defaultMessage: 'Thoughts' })}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground\">\r\n ({turn.thoughts.length})\r\n </span>\r\n </summary>\r\n <ul className=\"px-4 pb-3 space-y-1 text-sm text-muted-foreground list-disc list-inside\">\r\n {turn.thoughts.map((thought, i) => (\r\n <li key={`thought-${turn.turnNumber}-${i}`} className=\"leading-relaxed pl-2\">{thought}</li>\r\n ))}\r\n </ul>\r\n </details>\r\n )}\r\n\r\n {/* Tool calls section */}\r\n {turn.toolCalls && turn.toolCalls.length > 0 && (\r\n <div className=\"border-t border-border/50 p-4 space-y-2\">\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground mb-2\">\r\n <Wrench className=\"h-4 w-4\" />\r\n <span className=\"font-medium\">\r\n {formatMessage({ id: 'nativeSession.turn.toolCalls', defaultMessage: 'Tool Calls' })}\r\n </span>\r\n <span className=\"text-xs\">({turn.toolCalls.length})</span>\r\n </div>\r\n {turn.toolCalls.map((tc, i) => (\r\n <ToolCallPanel key={`toolcall-${turn.turnNumber}-${tc.name}-${i}`} toolCall={tc} index={i} />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Token usage bar */}\r\n {turn.tokens && (\r\n <div className=\"border-t border-border/50 px-4 py-3\">\r\n <TokenBar tokens={turn.tokens} />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * SessionTimeline - Timeline visualization for native CLI sessions\r\n *\r\n * Displays conversation turns in a vertical timeline layout with:\r\n * - Left side: Timeline nodes with role icons\r\n * - Right side: Content cards with messages, thoughts, and tool calls\r\n * - Token usage bars with stacked input/output/cached visualization\r\n * - Collapsible tool call panels\r\n */\r\nexport function SessionTimeline({ session, className }: SessionTimelineProps) {\r\n const { formatMessage } = useIntl();\r\n const turns = session.turns || [];\r\n\r\n return (\r\n <div className={cn('space-y-0', className)}>\r\n {/* Session token summary bar */}\r\n {session.totalTokens && (\r\n <div className=\"mb-6 p-4 rounded-lg bg-muted/30 border\">\r\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\r\n {formatMessage({ id: 'nativeSession.tokenSummary', defaultMessage: 'Total Tokens' })}\r\n </p>\r\n <TokenBar tokens={session.totalTokens} />\r\n </div>\r\n )}\r\n\r\n {/* Timeline turns */}\r\n {turns.length > 0 ? (\r\n <div className=\"relative\">\r\n {turns.map((turn, idx) => (\r\n <TurnNode\r\n key={turn.turnNumber}\r\n turn={turn}\r\n isLatest={idx === turns.length - 1}\r\n isLast={idx === turns.length - 1}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\r\n {formatMessage({ id: 'nativeSession.empty', defaultMessage: 'No session data available' })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default SessionTimeline;\r\n","// ========================================\r\n// NativeSessionPanel Component\r\n// ========================================\r\n// Dialog for displaying native CLI session content (Gemini/Codex/Qwen)\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Copy,\r\n Clock,\r\n Hash,\r\n FolderOpen,\r\n FileJson,\r\n Loader2,\r\n AlertCircle,\r\n} from 'lucide-react';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '@/components/ui/Dialog';\r\nimport { useNativeSession } from '@/hooks/useNativeSession';\r\nimport { useNativeSessionByPath } from '@/hooks/useNativeSessionByPath';\r\nimport { SessionTimeline } from './SessionTimeline';\r\nimport { getToolVariant } from '@/lib/cli-tool-theme';\r\nimport type { NativeSessionListItem } from '@/lib/api';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface NativeSessionPanelProps {\r\n /** Legacy: CCW execution ID for lookup */\r\n executionId?: string;\r\n /** New: Session metadata with path for direct file loading */\r\n session?: NativeSessionListItem | null;\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n}\r\n\r\n// ========== Helpers ==========\r\n\r\n/**\r\n * Truncate a string to a max length with ellipsis\r\n */\r\nfunction truncate(str: string, maxLen: number): string {\r\n if (str.length <= maxLen) return str;\r\n return str.slice(0, maxLen) + '...';\r\n}\r\n\r\n/**\r\n * Copy text to clipboard\r\n */\r\nasync function copyToClipboard(text: string): Promise<boolean> {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\n/**\r\n * NativeSessionPanel - Dialog for displaying native CLI session content\r\n *\r\n * Shows session metadata, token summary, and all conversation turns\r\n * with thoughts and tool calls for Gemini/Codex/Qwen native sessions.\r\n *\r\n * Supports two modes:\r\n * - executionId: Look up session via CCW database\r\n * - session: Load session directly from file path\r\n */\r\nexport function NativeSessionPanel({\r\n executionId,\r\n session,\r\n open,\r\n onOpenChange,\r\n}: NativeSessionPanelProps) {\r\n const { formatMessage } = useIntl();\r\n\r\n // Use appropriate hook based on what's provided\r\n // Priority: session (path-based) > executionId (lookup-based)\r\n const pathBasedResult = useNativeSessionByPath(\r\n open && session ? session.filePath : null,\r\n session?.tool\r\n );\r\n\r\n const idBasedResult = useNativeSession(\r\n open && !session && executionId ? executionId : null\r\n );\r\n\r\n // Determine which result to use\r\n const { data, isLoading, error } = session\r\n ? pathBasedResult\r\n : idBasedResult;\r\n\r\n const [copiedField, setCopiedField] = React.useState<string | null>(null);\r\n\r\n const handleCopy = React.useCallback(async (text: string, field: string) => {\r\n const ok = await copyToClipboard(text);\r\n if (ok) {\r\n setCopiedField(field);\r\n setTimeout(() => setCopiedField(null), 2000);\r\n }\r\n }, []);\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-4xl max-h-[85vh] overflow-hidden flex flex-col p-0\">\r\n <DialogHeader className=\"px-6 pt-6 pb-4 border-b shrink-0\">\r\n <div className=\"flex items-center justify-between pr-8\">\r\n <DialogTitle className=\"flex items-center gap-2\">\r\n <FileJson className=\"h-5 w-5\" />\r\n {formatMessage({ id: 'nativeSession.title', defaultMessage: 'Native Session' })}\r\n </DialogTitle>\r\n {(data || session) && (\r\n <div className=\"flex items-center gap-2\">\r\n <Badge variant={getToolVariant(data?.tool || session?.tool || 'claude')}>\r\n {(data?.tool || session?.tool || 'unknown').toUpperCase()}\r\n </Badge>\r\n {data?.model && (\r\n <Badge variant=\"secondary\" className=\"text-xs\">\r\n {data.model}\r\n </Badge>\r\n )}\r\n {(data?.sessionId || session?.sessionId) && (\r\n <span\r\n className=\"text-xs text-muted-foreground font-mono\"\r\n title={data?.sessionId || session?.sessionId}\r\n >\r\n {truncate(data?.sessionId || session?.sessionId || '', 16)}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n {(data || session) && (\r\n <div className=\"flex flex-wrap items-center gap-4 text-xs text-muted-foreground mt-2\">\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'nativeSession.meta.startTime', defaultMessage: 'Start time' })}>\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(data?.startTime || session?.createdAt || '').toLocaleString()}\r\n </span>\r\n {(data?.workingDir || session?.projectHash) && (\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'nativeSession.meta.workingDir', defaultMessage: 'Working directory' })}>\r\n <FolderOpen className=\"h-3 w-3\" />\r\n <span className=\"font-mono max-w-48 truncate\">{data?.workingDir || session?.projectHash}</span>\r\n </span>\r\n )}\r\n {data?.projectHash && (\r\n <span className=\"flex items-center gap-1\" title={formatMessage({ id: 'nativeSession.meta.projectHash', defaultMessage: 'Project hash' })}>\r\n <Hash className=\"h-3 w-3\" />\r\n <span className=\"font-mono\">{truncate(data.projectHash, 12)}</span>\r\n </span>\r\n )}\r\n {data && <span>{data.turns.length} {formatMessage({ id: 'nativeSession.meta.turns', defaultMessage: 'turns' })}</span>}\r\n </div>\r\n )}\r\n </DialogHeader>\r\n\r\n {/* Content Area with SessionTimeline */}\r\n {isLoading ? (\r\n <div className=\"flex-1 flex items-center justify-center py-16\">\r\n <div className=\"flex items-center gap-2 text-muted-foreground\">\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n <span>{formatMessage({ id: 'nativeSession.loading', defaultMessage: 'Loading session...' })}</span>\r\n </div>\r\n </div>\r\n ) : error ? (\r\n <div className=\"flex-1 flex flex-col items-center justify-center py-16 gap-3\">\r\n <div className=\"flex items-center gap-2 text-destructive\">\r\n <AlertCircle className=\"h-5 w-5\" />\r\n <span>{formatMessage({ id: 'nativeSession.error', defaultMessage: 'Failed to load session' })}</span>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground\">\r\n {formatMessage({ id: 'nativeSession.errorHint', defaultMessage: 'The session file may have been moved or deleted.' })}\r\n </p>\r\n </div>\r\n ) : data ? (\r\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\r\n <SessionTimeline session={data} />\r\n </div>\r\n ) : (\r\n <div className=\"flex-1 flex items-center justify-center py-16 text-muted-foreground\">\r\n {formatMessage({ id: 'nativeSession.empty', defaultMessage: 'No session data available' })}\r\n </div>\r\n )}\r\n\r\n {/* Footer Actions */}\r\n {data && (\r\n <div className=\"flex items-center gap-2 px-6 py-4 border-t bg-muted/30 shrink-0\">\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n onClick={() => handleCopy(data.sessionId, 'sessionId')}\r\n className=\"h-8\"\r\n >\r\n <Copy className=\"h-4 w-4 mr-2\" />\r\n {copiedField === 'sessionId'\r\n ? formatMessage({ id: 'nativeSession.footer.copied', defaultMessage: 'Copied!' })\r\n : formatMessage({ id: 'nativeSession.footer.copySessionId', defaultMessage: 'Copy Session ID' })}\r\n </Button>\r\n <Button\r\n size=\"sm\"\r\n variant=\"outline\"\r\n onClick={() => {\r\n const json = JSON.stringify(data, null, 2);\r\n handleCopy(json, 'json');\r\n }}\r\n className=\"h-8\"\r\n >\r\n <FileJson className=\"h-4 w-4 mr-2\" />\r\n {copiedField === 'json'\r\n ? formatMessage({ id: 'nativeSession.footer.copied', defaultMessage: 'Copied!' })\r\n : formatMessage({ id: 'nativeSession.footer.exportJson', defaultMessage: 'Export JSON' })}\r\n </Button>\r\n </div>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n","// ========================================\n// Observability Panel\n// ========================================\n// Audit log UI for issue workbench (read-only)\n\nimport { useEffect, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { ChevronDown, ChevronRight, RefreshCw } from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { Badge } from '@/components/ui/Badge';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select';\nimport { useCliSessionAudit } from '@/hooks';\nimport { cn } from '@/lib/utils';\nimport type { CliSessionAuditEvent, CliSessionAuditEventType } from '@/lib/api';\n\nconst EVENT_TYPES: CliSessionAuditEventType[] = [\n 'session_created',\n 'session_closed',\n 'session_send',\n 'session_execute',\n 'session_resize',\n 'session_share_created',\n 'session_share_revoked',\n 'session_idle_reaped',\n];\n\nfunction badgeVariantForType(type: CliSessionAuditEventType): 'default' | 'secondary' | 'destructive' | 'outline' | 'success' | 'warning' | 'info' {\n switch (type) {\n case 'session_created':\n return 'success';\n case 'session_closed':\n case 'session_idle_reaped':\n return 'secondary';\n case 'session_execute':\n return 'info';\n case 'session_send':\n case 'session_resize':\n return 'outline';\n case 'session_share_created':\n return 'warning';\n case 'session_share_revoked':\n return 'secondary';\n default:\n return 'default';\n }\n}\n\nfunction stableEventKey(ev: CliSessionAuditEvent, index: number): string {\n return `${ev.timestamp}|${ev.type}|${ev.sessionKey ?? ''}|${index}`;\n}\n\nexport function ObservabilityPanel() {\n const { formatMessage } = useIntl();\n\n const [q, setQ] = useState('');\n const [sessionKey, setSessionKey] = useState('');\n const [type, setType] = useState<string>('');\n const [limit, setLimit] = useState<number>(200);\n const [offset, setOffset] = useState<number>(0);\n const [expandedKey, setExpandedKey] = useState<string | null>(null);\n\n // Reset paging when filters change\n useEffect(() => {\n setOffset(0);\n }, [q, sessionKey, type, limit]);\n\n const query = useCliSessionAudit({\n q: q.trim() || undefined,\n sessionKey: sessionKey.trim() || undefined,\n type: type ? (type as CliSessionAuditEventType) : undefined,\n limit,\n offset,\n });\n\n const events = query.data?.data.events ?? [];\n const total = query.data?.data.total ?? 0;\n const hasMore = query.data?.data.hasMore ?? false;\n\n const headerRight = useMemo(() => {\n const start = total === 0 ? 0 : offset + 1;\n const end = Math.min(total, offset + limit);\n return `${start}-${end} / ${total}`;\n }, [limit, offset, total]);\n\n const handleRefresh = async () => {\n try {\n await query.refetch();\n } catch (e) {\n // Errors are surfaced by query.error\n }\n };\n\n return (\n <div className=\"space-y-4\">\n <Card className=\"p-4\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-semibold text-foreground\">\n {formatMessage({ id: 'issues.observability.audit.title' })}\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-xs text-muted-foreground font-mono\">\n {headerRight}\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRefresh}\n disabled={query.isFetching}\n className=\"gap-2\"\n >\n <RefreshCw className={cn('h-4 w-4', query.isFetching && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\n <div className=\"md:col-span-2\">\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {formatMessage({ id: 'issues.observability.filters.search' })}\n </label>\n <Input\n value={q}\n onChange={(e) => setQ(e.target.value)}\n placeholder={formatMessage({ id: 'issues.observability.filters.searchPlaceholder' })}\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {formatMessage({ id: 'issues.observability.filters.sessionKey' })}\n </label>\n <Input\n value={sessionKey}\n onChange={(e) => setSessionKey(e.target.value)}\n placeholder={formatMessage({ id: 'issues.observability.filters.sessionKeyPlaceholder' })}\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {formatMessage({ id: 'issues.observability.filters.type' })}\n </label>\n <Select value={type || '__all__'} onValueChange={(v) => setType(v === '__all__' ? '' : v)}>\n <SelectTrigger>\n <SelectValue placeholder={formatMessage({ id: 'issues.observability.filters.typeAll' })} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">{formatMessage({ id: 'issues.observability.filters.typeAll' })}</SelectItem>\n {EVENT_TYPES.map((t) => (\n <SelectItem key={t} value={t}>\n {t}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <label className=\"block text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'issues.observability.filters.limit' })}\n </label>\n <Select value={String(limit)} onValueChange={(v) => setLimit(parseInt(v, 10))}>\n <SelectTrigger className=\"w-[140px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {[50, 100, 200, 500, 1000].map((n) => (\n <SelectItem key={n} value={String(n)}>{n}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOffset(Math.max(0, offset - limit))}\n disabled={offset === 0 || query.isFetching}\n >\n {formatMessage({ id: 'common.actions.previous' })}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOffset(offset + limit)}\n disabled={!hasMore || query.isFetching}\n >\n {formatMessage({ id: 'common.actions.next' })}\n </Button>\n </div>\n </div>\n </div>\n </Card>\n\n {query.error && (\n <Card className=\"p-6 border-destructive/50 bg-destructive/5\">\n <div className=\"text-sm text-destructive\">\n {(query.error as Error).message || formatMessage({ id: 'issues.observability.error' })}\n </div>\n </Card>\n )}\n\n {!query.isLoading && events.length === 0 && (\n <Card className=\"p-10 text-center text-muted-foreground\">\n {formatMessage({ id: 'issues.observability.empty' })}\n </Card>\n )}\n\n {events.length > 0 && (\n <Card className=\"p-0 overflow-hidden\">\n <div className=\"px-4 py-2 border-b border-border bg-card/50 text-xs font-medium text-muted-foreground grid grid-cols-12 gap-3\">\n <div className=\"col-span-3\">{formatMessage({ id: 'issues.observability.table.timestamp' })}</div>\n <div className=\"col-span-2\">{formatMessage({ id: 'issues.observability.table.type' })}</div>\n <div className=\"col-span-3\">{formatMessage({ id: 'issues.observability.table.sessionKey' })}</div>\n <div className=\"col-span-2\">{formatMessage({ id: 'issues.observability.table.tool' })}</div>\n <div className=\"col-span-2\">{formatMessage({ id: 'issues.observability.table.resumeKey' })}</div>\n </div>\n\n <div className=\"divide-y divide-border\">\n {events.map((ev, index) => {\n const key = stableEventKey(ev, index);\n const expanded = expandedKey === key;\n return (\n <div key={key} className=\"px-4 py-2\">\n <button\n type=\"button\"\n className=\"w-full text-left grid grid-cols-12 gap-3 items-center hover:bg-muted/40 rounded-md px-2 py-2\"\n onClick={() => setExpandedKey(expanded ? null : key)}\n >\n <div className=\"col-span-3 flex items-center gap-2 min-w-0\">\n {expanded ? (\n <ChevronDown className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n )}\n <span className=\"font-mono text-xs text-foreground truncate\">\n {ev.timestamp}\n </span>\n </div>\n <div className=\"col-span-2\">\n <Badge variant={badgeVariantForType(ev.type)} className=\"font-mono text-xs\">\n {ev.type}\n </Badge>\n </div>\n <div className=\"col-span-3 font-mono text-xs text-muted-foreground truncate\">\n {ev.sessionKey || '-'}\n </div>\n <div className=\"col-span-2 font-mono text-xs text-muted-foreground truncate\">\n {ev.tool || '-'}\n </div>\n <div className=\"col-span-2 font-mono text-xs text-muted-foreground truncate\">\n {ev.resumeKey || '-'}\n </div>\n </button>\n\n {expanded && (\n <div className=\"mt-2 ml-6 space-y-2\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-2 text-xs\">\n <div className=\"text-muted-foreground\">\n <span className=\"font-medium text-foreground\">{formatMessage({ id: 'issues.observability.table.workingDir' })}: </span>\n <span className=\"font-mono break-all\">{ev.workingDir || '-'}</span>\n </div>\n <div className=\"text-muted-foreground\">\n <span className=\"font-medium text-foreground\">{formatMessage({ id: 'issues.observability.table.ip' })}: </span>\n <span className=\"font-mono break-all\">{ev.ip || '-'}</span>\n </div>\n </div>\n {ev.userAgent && (\n <div className=\"text-xs text-muted-foreground\">\n <span className=\"font-medium text-foreground\">{formatMessage({ id: 'issues.observability.table.userAgent' })}: </span>\n <span className=\"font-mono break-all\">{ev.userAgent}</span>\n </div>\n )}\n <pre className=\"text-xs bg-muted/50 rounded-md p-3 overflow-x-auto\">\n {JSON.stringify(ev.details ?? {}, null, 2)}\n </pre>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </Card>\n )}\n </div>\n );\n}\n\nexport default ObservabilityPanel;\n","// ========================================\r\n// HistoryPage Component\r\n// ========================================\r\n// CLI execution history page with filtering and bulk actions\r\n// Includes tabs: Executions + Session Audit (Observability)\r\n\r\nimport * as React from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Terminal,\r\n SearchX,\r\n RefreshCw,\r\n Trash2,\r\n AlertTriangle,\r\n Search,\r\n X,\r\n Maximize2,\r\n Minimize2,\r\n ChevronDown,\r\n ChevronRight,\r\n FileJson,\r\n Clock,\r\n} from 'lucide-react';\r\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\r\nimport { cn } from '@/lib/utils';\r\nimport { useHistory } from '@/hooks/useHistory';\r\nimport { useNotifications } from '@/hooks/useNotifications';\r\nimport { useNativeSessionsInfinite } from '@/hooks/useNativeSessions';\r\nimport { ConversationCard } from '@/components/shared/ConversationCard';\r\nimport { CliStreamPanel } from '@/components/shared/CliStreamPanel';\r\nimport { NativeSessionPanel } from '@/components/shared/NativeSessionPanel';\r\nimport { ObservabilityPanel } from '@/components/issue/hub/ObservabilityPanel';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogDescription,\r\n DialogFooter,\r\n} from '@/components/ui/Dialog';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuLabel,\r\n} from '@/components/ui/Dropdown';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport type { CliExecution, NativeSessionListItem } from '@/lib/api';\r\nimport { getToolVariant } from '@/lib/cli-tool-theme';\r\n\r\ntype HistoryTab = 'executions' | 'observability' | 'native-sessions';\r\n\r\n/**\r\n * HistoryPage component - Display CLI execution history\r\n */\r\nexport function HistoryPage() {\r\n const { formatMessage } = useIntl();\r\n const { error: showError } = useNotifications();\r\n const [currentTab, setCurrentTab] = React.useState<HistoryTab>('executions');\r\n const [searchQuery, setSearchQuery] = React.useState('');\r\n const [toolFilter, setToolFilter] = React.useState<string | undefined>(undefined);\r\n const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false);\r\n const [deleteType, setDeleteType] = React.useState<'single' | 'tool' | 'all' | null>(null);\r\n const [deleteTarget, setDeleteTarget] = React.useState<string | null>(null);\r\n const [selectedExecution, setSelectedExecution] = React.useState<string | null>(null);\r\n const [isPanelOpen, setIsPanelOpen] = React.useState(false);\r\n const [selectedNativeSession, setSelectedNativeSession] = React.useState<NativeSessionListItem | null>(null);\r\n const [nativeExecutionId, setNativeExecutionId] = React.useState<string | null>(null);\r\n const [isNativePanelOpen, setIsNativePanelOpen] = React.useState(false);\r\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\r\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\r\n\r\n const {\r\n executions,\r\n isLoading,\r\n isFetching,\r\n error,\r\n refetch,\r\n deleteExecution,\r\n deleteByTool,\r\n deleteAll,\r\n isDeleting,\r\n } = useHistory({\r\n filter: { search: searchQuery || undefined, tool: toolFilter },\r\n });\r\n\r\n // Native sessions hook (infinite loading)\r\n const {\r\n sessions: nativeSessions,\r\n byTool: nativeSessionsByTool,\r\n isLoading: isLoadingNativeSessions,\r\n isFetching: isFetchingNativeSessions,\r\n isFetchingNextPage: isLoadingMoreNativeSessions,\r\n hasNextPage: hasMoreNativeSessions,\r\n error: nativeSessionsError,\r\n fetchNextPage: loadMoreNativeSessions,\r\n refetch: refetchNativeSessions,\r\n } = useNativeSessionsInfinite();\r\n\r\n // Track expanded tool groups in native sessions tab\r\n const [expandedTools, setExpandedTools] = React.useState<Set<string>>(new Set());\r\n\r\n const toggleToolExpand = (tool: string) => {\r\n setExpandedTools((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(tool)) {\r\n next.delete(tool);\r\n } else {\r\n next.add(tool);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n // Native session click handler - opens NativeSessionPanel\r\n const handleNativeSessionClick = (session: NativeSessionListItem) => {\r\n setSelectedNativeSession(session);\r\n setIsNativePanelOpen(true);\r\n };\r\n\r\n // Tool order for display\r\n const toolOrder = ['gemini', 'qwen', 'codex', 'claude', 'opencode'] as const;\r\n\r\n const tools = React.useMemo(() => {\r\n const toolSet = new Set(executions.map((e) => e.tool));\r\n return Array.from(toolSet).sort();\r\n }, [executions]);\r\n\r\n // Filter handlers\r\n const handleClearSearch = () => {\r\n setSearchQuery('');\r\n };\r\n\r\n const handleClearFilters = () => {\r\n setSearchQuery('');\r\n setToolFilter(undefined);\r\n };\r\n\r\n const hasActiveFilters = searchQuery.length > 0 || toolFilter !== undefined;\r\n\r\n // Card click handler - open execution details panel\r\n const handleCardClick = (execution: CliExecution) => {\r\n setSelectedExecution(execution.id);\r\n setIsPanelOpen(true);\r\n };\r\n\r\n // View native session handler\r\n const handleViewNative = (execution: CliExecution) => {\r\n setNativeExecutionId(execution.id);\r\n setIsNativePanelOpen(true);\r\n };\r\n\r\n // Delete handlers\r\n const handleDeleteClick = (id: string) => {\r\n setDeleteType('single');\r\n setDeleteTarget(id);\r\n setDeleteDialogOpen(true);\r\n };\r\n\r\n const handleDeleteByTool = (tool: string) => {\r\n setDeleteType('tool');\r\n setDeleteTarget(tool);\r\n setDeleteDialogOpen(true);\r\n };\r\n\r\n const handleDeleteAll = () => {\r\n setDeleteType('all');\r\n setDeleteTarget(null);\r\n setDeleteDialogOpen(true);\r\n };\r\n\r\n const handleConfirmDelete = async () => {\r\n try {\r\n if (deleteType === 'single' && deleteTarget) {\r\n await deleteExecution(deleteTarget);\r\n } else if (deleteType === 'tool' && deleteTarget) {\r\n await deleteByTool(deleteTarget);\r\n } else if (deleteType === 'all') {\r\n await deleteAll();\r\n }\r\n setDeleteDialogOpen(false);\r\n setDeleteType(null);\r\n setDeleteTarget(null);\r\n } catch (err) {\r\n showError(formatMessage({ id: 'history.deleteFailed' }), err instanceof Error ? err.message : String(err));\r\n console.error('Failed to delete:', err);\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(\"space-y-6\", isImmersiveMode && \"h-screen overflow-hidden\")}>\r\n {/* Header */}\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-semibold text-foreground\">\r\n {formatMessage({ id: 'history.title' })}\r\n </h1>\r\n <p className=\"text-sm text-muted-foreground mt-1\">\r\n {formatMessage({ id: 'history.description' })}\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={toggleImmersiveMode}\r\n className={cn(\r\n 'p-2 rounded-md transition-colors',\r\n isImmersiveMode\r\n ? 'bg-primary/10 text-primary'\r\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\r\n )}\r\n title={isImmersiveMode ? 'Exit Fullscreen' : 'Fullscreen'}\r\n >\r\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs - matching IssueHubTabs style */}\r\n <div className=\"flex gap-2 border-b border-border\">\r\n <Button\r\n variant=\"ghost\"\r\n className={cn(\r\n \"border-b-2 rounded-none h-11 px-4\",\r\n currentTab === 'executions'\r\n ? \"border-primary text-primary\"\r\n : \"border-transparent text-muted-foreground hover:text-foreground\"\r\n )}\r\n onClick={() => setCurrentTab('executions')}\r\n >\r\n {formatMessage({ id: 'history.tabs.executions' })}\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n className={cn(\r\n \"border-b-2 rounded-none h-11 px-4\",\r\n currentTab === 'observability'\r\n ? \"border-primary text-primary\"\r\n : \"border-transparent text-muted-foreground hover:text-foreground\"\r\n )}\r\n onClick={() => setCurrentTab('observability')}\r\n >\r\n {formatMessage({ id: 'history.tabs.observability' })}\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n className={cn(\r\n \"border-b-2 rounded-none h-11 px-4\",\r\n currentTab === 'native-sessions'\r\n ? \"border-primary text-primary\"\r\n : \"border-transparent text-muted-foreground hover:text-foreground\"\r\n )}\r\n onClick={() => setCurrentTab('native-sessions')}\r\n >\r\n <FileJson className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'history.tabs.nativeSessions' })}\r\n </Button>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n {currentTab === 'executions' && (\r\n <div className=\"space-y-4\">\r\n {/* Error alert */}\r\n {error && (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <Terminal className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{error.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\r\n {formatMessage({ id: 'common.actions.retry' })}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* Filters and Actions on same row */}\r\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\r\n {/* Search input */}\r\n <div className=\"flex-1 max-w-sm relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\r\n <Input\r\n placeholder={formatMessage({ id: 'history.searchPlaceholder' })}\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n className=\"pl-9 pr-9\"\r\n />\r\n {searchQuery && (\r\n <button\r\n onClick={handleClearSearch}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Tool filter */}\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2 min-w-[160px] justify-between\">\r\n {toolFilter || formatMessage({ id: 'history.filterAllTools' })}\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\" className=\"w-48\">\r\n <DropdownMenuItem onClick={() => setToolFilter(undefined)}>\r\n {formatMessage({ id: 'history.filterAllTools' })}\r\n </DropdownMenuItem>\r\n <DropdownMenuSeparator />\r\n {tools.map((tool) => (\r\n <DropdownMenuItem\r\n key={tool}\r\n onClick={() => setToolFilter(tool)}\r\n className={toolFilter === tool ? 'bg-accent' : ''}\r\n >\r\n {tool}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n\r\n {/* Clear filters */}\r\n {hasActiveFilters && (\r\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClearFilters}>\r\n {formatMessage({ id: 'common.actions.clearFilters' })}\r\n </Button>\r\n )}\r\n\r\n {/* Actions */}\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => refetch()}\r\n disabled={isFetching}\r\n >\r\n <RefreshCw className={cn('h-4 w-4 mr-2', isFetching && 'animate-spin')} />\r\n {formatMessage({ id: 'common.actions.refresh' })}\r\n </Button>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"outline\" size=\"sm\">\r\n <Trash2 className=\"h-4 w-4 mr-2\" />\r\n {formatMessage({ id: 'history.deleteOptions' })}\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n <DropdownMenuLabel>{formatMessage({ id: 'history.deleteBy' })}</DropdownMenuLabel>\r\n <DropdownMenuSeparator />\r\n {tools.map((tool) => (\r\n <DropdownMenuItem key={tool} onClick={() => handleDeleteByTool(tool)}>\r\n {formatMessage({ id: 'history.deleteAllTool' }, { tool })}\r\n </DropdownMenuItem>\r\n ))}\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem\r\n onClick={handleDeleteAll}\r\n className=\"text-destructive focus:text-destructive\"\r\n >\r\n <AlertTriangle className=\"mr-2 h-4 w-4\" />\r\n {formatMessage({ id: 'history.deleteAll' })}\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n\r\n {/* Executions list */}\r\n {isLoading ? (\r\n <div className=\"grid gap-3\">\r\n {Array.from({ length: 5 }).map((_, i) => (\r\n <div key={i} className=\"h-28 rounded-lg bg-muted animate-pulse\" />\r\n ))}\r\n </div>\r\n ) : executions.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n <SearchX className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {hasActiveFilters\r\n ? formatMessage({ id: 'history.empty.filtered' })\r\n : formatMessage({ id: 'history.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground text-center\">\r\n {hasActiveFilters\r\n ? formatMessage({ id: 'history.empty.filteredMessage' })\r\n : formatMessage({ id: 'history.empty.message' })}\r\n </p>\r\n {hasActiveFilters && (\r\n <Button variant=\"outline\" onClick={handleClearFilters} className=\"mt-4\">\r\n {formatMessage({ id: 'common.actions.clearFilters' })}\r\n </Button>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"grid gap-3\">\r\n {executions.map((execution) => (\r\n <ConversationCard\r\n key={execution.id}\r\n execution={execution}\r\n onClick={handleCardClick}\r\n onViewNative={handleViewNative}\r\n onDelete={handleDeleteClick}\r\n actionsDisabled={isDeleting}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {currentTab === 'observability' && (\r\n <div className=\"mt-4\">\r\n <ObservabilityPanel />\r\n </div>\r\n )}\r\n\r\n {currentTab === 'native-sessions' && (\r\n <div className=\"space-y-4\">\r\n {/* Header with refresh */}\r\n <div className=\"flex items-center justify-between\">\r\n <p className=\"text-sm text-muted-foreground\">\r\n {formatMessage(\r\n { id: 'history.nativeSessions.count' },\r\n { count: nativeSessions.length }\r\n )}\r\n </p>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => refetchNativeSessions()}\r\n disabled={isFetchingNativeSessions && !isLoadingMoreNativeSessions}\r\n >\r\n <RefreshCw className={cn('h-4 w-4 mr-2', isFetchingNativeSessions && 'animate-spin')} />\r\n {formatMessage({ id: 'common.actions.refresh' })}\r\n </Button>\r\n </div>\r\n\r\n {/* Error alert */}\r\n {nativeSessionsError && (\r\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\r\n <Terminal className=\"h-5 w-5 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\r\n <p className=\"text-xs mt-0.5\">{nativeSessionsError.message}</p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetchNativeSessions()}>\r\n {formatMessage({ id: 'common.actions.retry' })}\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* Loading state */}\r\n {isLoadingNativeSessions ? (\r\n <div className=\"grid gap-3\">\r\n {Array.from({ length: 3 }).map((_, i) => (\r\n <div key={i} className=\"h-20 rounded-lg bg-muted animate-pulse\" />\r\n ))}\r\n </div>\r\n ) : nativeSessions.length === 0 ? (\r\n /* Empty state */\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n <FileJson className=\"h-12 w-12 text-muted-foreground mb-4\" />\r\n <h3 className=\"text-lg font-medium text-foreground mb-2\">\r\n {formatMessage({ id: 'history.nativeSessions.empty.title' })}\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground text-center\">\r\n {formatMessage({ id: 'history.nativeSessions.empty.message' })}\r\n </p>\r\n </div>\r\n ) : (\r\n /* Sessions grouped by tool */\r\n <div className=\"space-y-2\">\r\n {toolOrder\r\n .filter((tool) => nativeSessionsByTool[tool]?.length > 0)\r\n .map((tool) => {\r\n const sessions = nativeSessionsByTool[tool];\r\n const isExpanded = expandedTools.has(tool);\r\n return (\r\n <div key={tool} className=\"border rounded-lg\">\r\n {/* Tool header - clickable to expand/collapse */}\r\n <button\r\n className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-muted/50 transition-colors\"\r\n onClick={() => toggleToolExpand(tool)}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <Badge variant={getToolVariant(tool)}>\r\n {tool.toUpperCase()}\r\n </Badge>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {sessions.length} {formatMessage({ id: 'history.nativeSessions.sessions' })}\r\n </span>\r\n </div>\r\n </button>\r\n {/* Sessions list */}\r\n {isExpanded && (\r\n <div className=\"border-t divide-y\">\r\n {sessions.map((session) => (\r\n <button\r\n key={session.sessionId}\r\n className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-muted/30 transition-colors text-left\"\r\n onClick={() => handleNativeSessionClick(session)}\r\n >\r\n <div className=\"flex items-center gap-3 min-w-0\">\r\n <span className=\"font-mono text-sm truncate max-w-48\" title={session.sessionId}>\r\n {session.sessionId.length > 24 ? session.sessionId.slice(0, 24) + '...' : session.sessionId}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground shrink-0\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(session.updatedAt).toLocaleString()}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n {/* Other tools not in predefined order */}\r\n {Object.keys(nativeSessionsByTool)\r\n .filter((tool) => !toolOrder.includes(tool as typeof toolOrder[number]))\r\n .sort()\r\n .map((tool) => {\r\n const sessions = nativeSessionsByTool[tool];\r\n const isExpanded = expandedTools.has(tool);\r\n return (\r\n <div key={tool} className=\"border rounded-lg\">\r\n <button\r\n className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-muted/50 transition-colors\"\r\n onClick={() => toggleToolExpand(tool)}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\r\n )}\r\n <Badge variant=\"secondary\">\r\n {tool.toUpperCase()}\r\n </Badge>\r\n <span className=\"text-sm text-muted-foreground\">\r\n {sessions.length} {formatMessage({ id: 'history.nativeSessions.sessions' })}\r\n </span>\r\n </div>\r\n </button>\r\n {isExpanded && (\r\n <div className=\"border-t divide-y\">\r\n {sessions.map((session) => (\r\n <button\r\n key={session.sessionId}\r\n className=\"w-full flex items-center justify-between px-4 py-3 hover:bg-muted/30 transition-colors text-left\"\r\n onClick={() => handleNativeSessionClick(session)}\r\n >\r\n <div className=\"flex items-center gap-3 min-w-0\">\r\n <span className=\"font-mono text-sm truncate max-w-48\" title={session.sessionId}>\r\n {session.sessionId.length > 24 ? session.sessionId.slice(0, 24) + '...' : session.sessionId}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground shrink-0\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {new Date(session.updatedAt).toLocaleString()}\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n\r\n {/* Load More Button */}\r\n {hasMoreNativeSessions && (\r\n <div className=\"flex justify-center pt-4\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => loadMoreNativeSessions()}\r\n disabled={isLoadingMoreNativeSessions}\r\n >\r\n {isLoadingMoreNativeSessions ? (\r\n <>\r\n <RefreshCw className=\"h-4 w-4 mr-2 animate-spin\" />\r\n {formatMessage({ id: 'history.nativeSessions.loading', defaultMessage: 'Loading...' })}\r\n </>\r\n ) : (\r\n formatMessage({ id: 'history.nativeSessions.loadMore', defaultMessage: 'Load More' })\r\n )}\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* CLI Stream Panel */}\r\n <CliStreamPanel\r\n executionId={selectedExecution || ''}\r\n open={isPanelOpen}\r\n onOpenChange={setIsPanelOpen}\r\n />\r\n\r\n {/* Native Session Panel */}\r\n <NativeSessionPanel\r\n session={selectedNativeSession}\r\n executionId={nativeExecutionId || undefined}\r\n open={isNativePanelOpen}\r\n onOpenChange={setIsNativePanelOpen}\r\n />\r\n\r\n {/* Delete Confirmation Dialog */}\r\n <Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>\r\n <DialogContent>\r\n <DialogHeader>\r\n <DialogTitle>\r\n {deleteType === 'all'\r\n ? formatMessage({ id: 'history.dialog.deleteAllTitle' })\r\n : formatMessage({ id: 'history.dialog.deleteTitle' })}\r\n </DialogTitle>\r\n <DialogDescription>\r\n {deleteType === 'all' && formatMessage({ id: 'history.dialog.deleteAllMessage' })}\r\n {deleteType === 'tool' &&\r\n formatMessage({ id: 'history.dialog.deleteToolMessage' }, { tool: deleteTarget })}\r\n {deleteType === 'single' &&\r\n formatMessage({ id: 'history.dialog.deleteMessage' })}\r\n </DialogDescription>\r\n </DialogHeader>\r\n <DialogFooter>\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => setDeleteDialogOpen(false)}\r\n disabled={isDeleting}\r\n >\r\n {formatMessage({ id: 'common.actions.cancel' })}\r\n </Button>\r\n <Button\r\n variant=\"destructive\"\r\n onClick={handleConfirmDelete}\r\n disabled={isDeleting}\r\n >\r\n {isDeleting\r\n ? formatMessage({ id: 'common.status.deleting' })\r\n : formatMessage({ id: 'common.actions.delete' })}\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n </div>\r\n );\r\n}\r\n\r\nexport default HistoryPage;\r\n"],"names":["InfiniteQueryObserver","QueryObserver","client","options","infiniteQueryBehavior","query","state","parentResult","isFetching","isRefetching","isError","isRefetchError","fetchDirection","_b","_a","isFetchNextPageError","isFetchingNextPage","isFetchPreviousPageError","isFetchingPreviousPage","hasNextPage","hasPreviousPage","useInfiniteQuery","queryClient","useBaseQuery","ArrowDownUp","createLucideIcon","Coins","SearchX","useCliSessionAudit","projectPath","useWorkflowStore","selectProjectPath","enabled","typeParam","useQuery","workspaceQueryKeys","fetchCliSessionAudit","cliExecutionKeys","id","STALE_TIME","GC_TIME","useCliExecutionDetail","executionId","staleTime","gcTime","fetchExecutionDetail","attemptIndex","refetch","useHistory","filter","useQueryClient","queryEnabled","fetchHistory","executions","React","searchLower","exec","deleteSingleMutation","useMutation","deleteExecution","deleteByToolMutation","deleteExecutionsByTool","deleteAllMutation","deleteAllHistory","isDeleting","PAGE_SIZE","useNativeSessionsInfinite","tool","pageParam","fetchNativeSessions","lastPage","sessions","byTool","count","allSessions","page","mergedByTool","toolKey","toolSessions","fetchNextPage","statusConfig","formatDuration","ms","seconds","minutes","remainingSeconds","useTimeAgo","formatMessage","useIntl","React.useCallback","dateString","date","hours","days","ConversationCard","execution","onView","onViewNative","onDelete","onClick","className","actionsDisabled","getTimeAgo","copied","setCopied","React.useState","status","handleCopyId","e","handleCardClick","handleAction","action","jsx","Card","cn","CardContent","jsxs","Badge","MessagesSquare","Folder","FileJson","Clock","Timer","Hash","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","Copy","Eye","DropdownMenuSeparator","Trash2","nativeSessionKeys","useNativeSession","fetchNativeSession","CLI_TOOL_THEMES","Sparkles","Code","Brain","Terminal","Cpu","DEFAULT_TOOL_THEME","getToolTheme","normalizedTool","getToolVariant","getStatusInfo","statusMap","CheckCircle2","XCircle","ensureString","value","buildConcatenatedPrompt","format","turns","parts","turn","yaml","line","output","TurnSection","isLatest","isExpanded","onToggle","StatusIcon","statusColor","ChevronDown","ChevronRight","User","Bot","AlertTriangle","Info","PerTurnView","expandedTurns","setExpandedTurns","handleToggle","turnNumber","prev","next","idx","React.Fragment","ConcatenatedView","prompt","onFormatChange","Layers","fmt","formatTokenCount","NativeTokenDisplay","tokens","NativeToolCallItem","toolCall","index","Wrench","NativeTurnCard","isUser","RoleIcon","thought","i","tc","NativeTurnView","CliStreamPanel","_sourceDir","open","onOpenChange","viewMode","setViewMode","concatFormat","setConcatFormat","isLoading","nativeSession","nativeLoading","concatenatedPrompt","React.useMemo","copyToClipboard","text","label","err","totalDuration","sum","t","Dialog","DialogContent","DialogHeader","DialogTitle","Calendar","Fragment","Loader2","nativeSessionPathKeys","filePath","useNativeSessionByPath","fetchNativeSessionWithOptions","getToolStatusIcon","CheckCircle","getStatusVariant","TokenBar","total","input","cached","inputPercent","outputPercent","cachedPercent","Archive","ToolCallPanel","setIsExpanded","TurnNode","isLast","SessionTimeline","session","truncate","str","maxLen","NativeSessionPanel","pathBasedResult","idBasedResult","data","error","copiedField","setCopiedField","handleCopy","field","FolderOpen","AlertCircle","json","EVENT_TYPES","badgeVariantForType","type","stableEventKey","ev","ObservabilityPanel","q","setQ","useState","sessionKey","setSessionKey","setType","limit","setLimit","offset","setOffset","expandedKey","setExpandedKey","useEffect","events","hasMore","_c","headerRight","useMemo","start","end","handleRefresh","RefreshCw","Input","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","n","key","expanded","HistoryPage","showError","useNotifications","currentTab","setCurrentTab","searchQuery","setSearchQuery","toolFilter","setToolFilter","deleteDialogOpen","setDeleteDialogOpen","deleteType","setDeleteType","deleteTarget","setDeleteTarget","selectedExecution","setSelectedExecution","isPanelOpen","setIsPanelOpen","selectedNativeSession","setSelectedNativeSession","nativeExecutionId","setNativeExecutionId","isNativePanelOpen","setIsNativePanelOpen","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","s","deleteByTool","deleteAll","nativeSessions","nativeSessionsByTool","isLoadingNativeSessions","isFetchingNativeSessions","isLoadingMoreNativeSessions","hasMoreNativeSessions","nativeSessionsError","loadMoreNativeSessions","refetchNativeSessions","expandedTools","setExpandedTools","toggleToolExpand","handleNativeSessionClick","toolOrder","tools","toolSet","handleClearSearch","handleClearFilters","hasActiveFilters","handleViewNative","handleDeleteClick","handleDeleteByTool","handleDeleteAll","handleConfirmDelete","Minimize2","Maximize2","Search","X","DropdownMenuLabel","_","DialogDescription","DialogFooter"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}
|