@runfusion/fusion 0.76.0-beta.3 → 0.77.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +13802 -9587
- package/dist/child-process-worker.js +6472 -4028
- package/dist/client/.vite/manifest.json +280 -269
- package/dist/client/assets/AgentDetailView-0G9qFd4j.js +13 -0
- package/dist/client/assets/{AgentDetailView-Cc3ATg8a.css → AgentDetailView-jzgy1BAS.css} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor--u9jyUf2.js → AgentPermissionPolicyEditor-BM68g7wo.js} +1 -1
- package/dist/client/assets/AgentsView-DkOUZWw4.js +24 -0
- package/dist/client/assets/ChatView-BPSm2JIH.js +13 -0
- package/dist/client/assets/{CommandCenter-CSRYoveB.js → CommandCenter-DxRSFWNc.js} +26 -26
- package/dist/client/assets/CommandCenter-ilm-DbtI.css +1 -0
- package/dist/client/assets/{DevServerView-B9So_oYx.js → DevServerView-DO-bqJFE.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-BhyDL_2m.js → DirectoryPicker-Cp2gddTE.js} +1 -1
- package/dist/client/assets/DocumentsView-D0E-3G96.js +1 -0
- package/dist/client/assets/EvalsView-BoFVq5hw.js +1 -0
- package/dist/client/assets/ExperimentalAgentOnboardingModal-CS1Sdogm.js +1 -0
- package/dist/client/assets/{GoalsView-B6X5_0Ve.js → GoalsView-sybf7JY4.js} +1 -1
- package/dist/client/assets/InsightsView-nHa7aShn.js +11 -0
- package/dist/client/assets/{MemoryView-DN_3IFmA.css → MemoryView-CdpQqPJJ.css} +1 -1
- package/dist/client/assets/MemoryView-D0IG44za.js +3 -0
- package/dist/client/assets/{PiExtensionsManager-B8At6fO8.js → PiExtensionsManager-CU76weJe.js} +2 -2
- package/dist/client/assets/PluginManager-DyT8XbcG.js +1 -0
- package/dist/client/assets/{PullRequestView-B1hZFrWo.js → PullRequestView-CnxWUSen.js} +2 -2
- package/dist/client/assets/{ReportModal-C46V_zEa.js → ReportModal-CMrmMQjD.js} +5 -5
- package/dist/client/assets/{ResearchView-D8G85BYN.js → ResearchView-BTytQSgy.js} +2 -2
- package/dist/client/assets/{SecretsView-CTri9LRK.js → SecretsView-BuSH5J87.js} +1 -1
- package/dist/client/assets/SessionTerminal-D04kYRrT.js +2 -0
- package/dist/client/assets/SettingsModal-C0FY8MPW.css +1 -0
- package/dist/client/assets/{SettingsModal-rUQcSTJp.js → SettingsModal-Dm-ngbRr.js} +1 -1
- package/dist/client/assets/{SettingsModal-DmfMotcd.css → SettingsModal-Ds0Yj47X.css} +1 -1
- package/dist/client/assets/SettingsModal-xSLhH7Tr.js +21 -0
- package/dist/client/assets/{SettingsTextareaRow-BirlBcem.js → SettingsTextareaRow-CHPgocEp.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-xnCBM9EL.js → SetupWizardModal-y88aXNIQ.js} +2 -2
- package/dist/client/assets/{SkillsView-O5U0ep50.js → SkillsView-CYyQW1Hv.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-BX4d2qqF.js → WorkflowNodeEditor-hYeoz1X8.js} +3 -3
- package/dist/client/assets/{agent-import-generation-DnqVkPkz.js → agent-import-generation-CjiYXzCr.js} +1 -1
- package/dist/client/assets/agentsOrgChartLayout-C0UP_X3z.js +1 -0
- package/dist/client/assets/app-BgpuMvTU.js +13 -0
- package/dist/client/assets/app-BlexHhbW.js +13 -0
- package/dist/client/assets/app-BsuUOR0P.js +13 -0
- package/dist/client/assets/app-DQVOujmO.js +13 -0
- package/dist/client/assets/app-DjyTRx1N.js +5 -0
- package/dist/client/assets/app-Dniggype.js +13 -0
- package/dist/client/assets/app-EV-lyZ0T.js +5 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-gi467xY0.js → architectureDiagram-3BPJPVTR-Dd6GPcqM.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-B_gpcYiR.js → blockDiagram-GPEHLZMM-CC6pLxlz.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-DeylEYsQ.js → c4Diagram-AAUBKEIU-DxMP_l6y.js} +1 -1
- package/dist/client/assets/channel-DlCEMoEf.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BL2WY0HN.js → chunk-2J33WTMH-BKYToL43.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-BkLExGMe.js → chunk-4BX2VUAB-Bg6rjQb3.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-CSTvCF5T.js → chunk-55IACEB6-CPUwbbGa.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-9J8pKk4x.js → chunk-727SXJPM-DScQBCvv.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-DXC1vPWr.js → chunk-AQP2D5EJ-DbX7uaXK.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-CFRUb-zD.js → chunk-FMBD7UC4-DvYKea1c.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-B87HFYS8.js → chunk-ND2GUHAM-CH-Tvw7w.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-CTjHiGbd.js → chunk-QZHKN3VN-CbyEvOoM.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-Bc92O8Ks.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Bc92O8Ks.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-D3Edq3L9.js → cose-bilkent-S5V4N54A-BPB5fV3A.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-CwwbeQfN.js → dagre-BM42HDAG-CilYJ3rR.js} +1 -1
- package/dist/client/assets/{dashboard-view-QxQwJFLz.js → dashboard-view-BnGe8cWo.js} +1 -1
- package/dist/client/assets/{dashboard-view-BLAoW3D4.js → dashboard-view-DnVf3tmI.js} +1 -1
- package/dist/client/assets/{dashboard-view-DAlJxqiJ.js → dashboard-view-DoLU6FxZ.js} +1 -1
- package/dist/client/assets/{dashboard-view-aPzfv99T.js → dashboard-view-dChSM_So.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-koJWWXE4.js → diagram-2AECGRRQ-m9u1Qhyx.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-Yob5cOKT.js → diagram-5GNKFQAL-DVr7Kf0N.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DelvFSkK.js → diagram-KO2AKTUF-D7sgJDFx.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-CMput2h2.js → diagram-LMA3HP47-DNKNDS6r.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-04VXDl79.js → diagram-OG6HWLK6-1Bff4FWn.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-C9iP8Uyp.js → erDiagram-TEJ5UH35-DGua1UHN.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-DENQvu_t.js → flowDiagram-I6XJVG4X-UDfDtwsE.js} +1 -1
- package/dist/client/assets/{folder-open-D-554oji.js → folder-open-CteOypVk.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BqOttZAT.js → ganttDiagram-6RSMTGT7-COdmD328.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CDcydi-5.js → gitGraphDiagram-PVQCEYII-SUSls7Kw.js} +1 -1
- package/dist/client/assets/index-0ovTXt3t.css +1 -0
- package/dist/client/assets/index-DpCHwyiD.js +2818 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-B5LQQnxt.js → infoDiagram-5YYISTIA-e_DloXj7.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DpFEt7D2.js → ishikawaDiagram-YF4QCWOH-DVWqihXg.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-MELtgu22.js → journeyDiagram-JHISSGLW-BcPY-XP0.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-h33PLATd.js → kanban-definition-UN3LZRKU-BCFG2Jle.js} +1 -1
- package/dist/client/assets/{mermaid.core-Dk2mUPOq.js → mermaid.core-5yPje9Bi.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-B_T4O2-B.js → mindmap-definition-RKZ34NQL-DDApeT3K.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-B1YIFkRl.js → pieDiagram-4H26LBE5-N61_jyeP.js} +1 -1
- package/dist/client/assets/{puzzle-hvecxlpJ.js → puzzle-BkaCP30D.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BoGQR_hO.js → quadrantDiagram-W4KKPZXB-C5qHiApF.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-BSDmUBIx.js → requirementDiagram-4Y6WPE33-C71okgzt.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Dz_GqOa5.js → sankeyDiagram-5OEKKPKP-B2iKyLjB.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B6twjYUH.js → sequenceDiagram-3UESZ5HK-DfdoYKKk.js} +1 -1
- package/dist/client/assets/{shield-alert-BX4WRJOv.js → shield-alert-BNSeDB8l.js} +1 -1
- package/dist/client/assets/standing-instructions-template-pZtzo1lK.js +20 -0
- package/dist/client/assets/standing-instructions-template-w7Ouw_37.css +1 -0
- package/dist/client/assets/{stateDiagram-AJRCARHV-DuwqWLx-.js → stateDiagram-AJRCARHV-lS-sUi12.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Bu8Sk187.js → stateDiagram-v2-BHNVJYJU-DXJNDrV9.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-BS6VnqSI.js → timeline-definition-PNZ67QCA-CCwvX81K.js} +1 -1
- package/dist/client/assets/{upload-CaDoyaMW.js → upload-CDovVbu2.js} +1 -1
- package/dist/client/assets/useDiscoveredSkillsCache-BYqP-afh.js +1 -0
- package/dist/client/assets/{users-C5uCLwVM.js → users-CTqECGLo.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CUbzqT5Y.js → vennDiagram-CIIHVFJN-DaiR5nv9.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-Mv-NotFS.js → wardley-L42UT6IY-hA5IHyPW.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DuYpvLZX.js → wardleyDiagram-YWT4CUSO-CILUNESc.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-24_7QXdw.js → xychartDiagram-2RQKCTM6-72eNMmjz.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +10671 -6904
- package/dist/migrations/0059_fn_9037_tasks_source_agent_index.sql +3 -0
- package/dist/migrations/0060_fn_9059_workspace_coordination_leases.sql +10 -0
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +190 -9
- package/dist/plugin-sdk/index.js +74 -28
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +83 -29
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +83 -29
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +1096 -73
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +83 -29
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +302 -71
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +83 -29
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +176 -46
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +74 -28
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/references/extension-tools.md +2 -0
- package/dist/client/assets/AgentDetailView-T767kKTg.js +0 -13
- package/dist/client/assets/AgentsView-6Ifu7qDr.js +0 -24
- package/dist/client/assets/ChatView-BV3lixQi.js +0 -13
- package/dist/client/assets/CommandCenter-CE4rYjHn.css +0 -1
- package/dist/client/assets/DocumentsView-pbERA7O-.js +0 -1
- package/dist/client/assets/EvalsView-DJQ4ltCg.js +0 -1
- package/dist/client/assets/ExperimentalAgentOnboardingModal-BwJuzkzB.js +0 -1
- package/dist/client/assets/InsightsView-CJgI0J7S.js +0 -11
- package/dist/client/assets/MemoryView-BHq1AHPu.js +0 -3
- package/dist/client/assets/PluginManager-k7hV7_9e.js +0 -1
- package/dist/client/assets/SessionTerminal-BRf6r4Vp.js +0 -2
- package/dist/client/assets/SettingsModal-B30rPfYC.css +0 -1
- package/dist/client/assets/SettingsModal-D0RBeZik.js +0 -21
- package/dist/client/assets/agentsOrgChartLayout-CKuzbhFf.js +0 -1
- package/dist/client/assets/app-B2FwULu2.js +0 -5
- package/dist/client/assets/app-B6nJaqAl.js +0 -13
- package/dist/client/assets/app-CGXZeIRc.js +0 -13
- package/dist/client/assets/app-CGtkeBF5.js +0 -13
- package/dist/client/assets/app-CNzN1Plu.js +0 -13
- package/dist/client/assets/app-DLs-f5yM.js +0 -13
- package/dist/client/assets/app-DsvtcRUG.js +0 -5
- package/dist/client/assets/channel-BoE8DeM4.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-qnbLX_9_.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-qnbLX_9_.js +0 -1
- package/dist/client/assets/index-CXTd3LAB.css +0 -1
- package/dist/client/assets/index-CtYRoouR.js +0 -2818
- package/dist/client/assets/standing-instructions-template-BJY317CC.js +0 -20
- package/dist/client/assets/standing-instructions-template-Ddi_4TIk.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.cc-date-range{position:relative;display:inline-block}.cc-date-range-trigger{display:inline-flex;align-items:center;gap:var(--space-xs)}.cc-date-range-popover{position:absolute;top:calc(100% + var(--space-xs));right:0;z-index:20;min-width:16rem;padding:var(--space-md);background:var(--surface-1, #1c1c1c);border:1px solid var(--border-subtle, color-mix(in srgb, #7f7f7f 25%, transparent));border-radius:var(--radius-md, 8px);box-shadow:var(--shadow-md);display:flex;flex-direction:column;gap:var(--space-md)}.cc-date-range-presets{display:flex;flex-wrap:wrap;gap:var(--space-sm)}.cc-date-range-custom{display:flex;flex-direction:column;gap:var(--space-sm)}.cc-date-range-field{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);font-size:.8125rem;color:var(--text-muted)}.cc-date-range-field input{background:var(--surface-2, color-mix(in srgb, #7f7f7f 12%, transparent));border:1px solid var(--border-subtle, color-mix(in srgb, #7f7f7f 25%, transparent));border-radius:var(--radius-sm, 4px);color:var(--text);padding:var(--space-xs) var(--space-sm)}.cc-bar-chart,.cc-stacked-bar,.cc-sparkline,.cc-token-series,.cc-token-series-plot,.cc-token-series-axis,.cc-line-chart,.cc-radial-gauge,.cc-funnel,.cc-funnel-stage{min-inline-size:0;max-inline-size:100%}.cc-bar-chart{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-sm)}.cc-bar-row{display:grid;grid-template-columns:minmax(calc(var(--space-2xl) * 2 + var(--space-lg)),32%) minmax(0,1fr) auto;align-items:center;gap:var(--space-sm)}.cc-bar-label{min-inline-size:0;display:inline-flex;align-items:center;gap:var(--space-xs);font-size:.8125rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cc-bar-label>.provider-icon{flex:0 0 auto}.cc-bar-label-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cc-model-label{min-inline-size:0;max-inline-size:100%;display:inline-flex;align-items:center;gap:var(--space-xs);vertical-align:middle}.cc-model-label .provider-icon{flex:0 0 auto}.cc-model-label-text{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cc-bar-track{min-inline-size:0;position:relative;block-size:var(--space-md);background:var(--surface-2);border-radius:var(--radius-sm);overflow:hidden}.cc-bar-fill{block-size:100%;background:var(--accent);border-radius:var(--radius-sm);transition:width var(--transition-normal)}.cc-bar-row:nth-child(8n+1) .cc-bar-fill{background:var(--accent)}.cc-bar-row:nth-child(8n+2) .cc-bar-fill{background:var(--todo)}.cc-bar-row:nth-child(8n+3) .cc-bar-fill{background:var(--in-progress)}.cc-bar-row:nth-child(8n+4) .cc-bar-fill{background:var(--in-review)}.cc-bar-row:nth-child(8n+5) .cc-bar-fill{background:var(--triage)}.cc-bar-row:nth-child(8n+6) .cc-bar-fill{background:var(--color-success)}.cc-bar-row:nth-child(8n+7) .cc-bar-fill{background:var(--color-warning)}.cc-bar-row:nth-child(8n) .cc-bar-fill{background:var(--color-error)}.cc-bar-value{min-inline-size:0;font-size:.8125rem;font-variant-numeric:tabular-nums;color:var(--text);overflow-wrap:anywhere;text-align:end}.cc-stacked-bar{display:flex;flex-direction:column;gap:var(--space-sm)}.cc-stacked-track{display:flex;block-size:var(--space-md);background:var(--surface-2);border-radius:var(--radius-sm);overflow:hidden}.cc-stacked-segment{block-size:100%;background:var(--accent);transition:width var(--transition-normal)}.cc-stacked-legend{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:var(--space-md)}.cc-stacked-legend-item{min-inline-size:0;display:flex;align-items:center;gap:var(--space-xs);font-size:.8125rem;color:var(--text-muted);overflow-wrap:anywhere}.cc-stacked-swatch{inline-size:var(--space-sm);block-size:var(--space-sm);border-radius:var(--radius-sm);background:var(--accent);display:inline-block}.cc-stacked-segment:nth-child(8n+1),.cc-stacked-legend-item:nth-child(8n+1) .cc-stacked-swatch{background:var(--accent)}.cc-stacked-segment:nth-child(8n+2),.cc-stacked-legend-item:nth-child(8n+2) .cc-stacked-swatch{background:var(--todo)}.cc-stacked-segment:nth-child(8n+3),.cc-stacked-legend-item:nth-child(8n+3) .cc-stacked-swatch{background:var(--in-progress)}.cc-stacked-segment:nth-child(8n+4),.cc-stacked-legend-item:nth-child(8n+4) .cc-stacked-swatch{background:var(--in-review)}.cc-stacked-segment:nth-child(8n+5),.cc-stacked-legend-item:nth-child(8n+5) .cc-stacked-swatch{background:var(--triage)}.cc-stacked-segment:nth-child(8n+6),.cc-stacked-legend-item:nth-child(8n+6) .cc-stacked-swatch{background:var(--color-success)}.cc-stacked-segment:nth-child(8n+7),.cc-stacked-legend-item:nth-child(8n+7) .cc-stacked-swatch{background:var(--color-warning)}.cc-stacked-segment:nth-child(8n),.cc-stacked-legend-item:nth-child(8n) .cc-stacked-swatch{background:var(--color-error)}.cc-sparkline{display:flex;align-items:flex-end;gap:1px;block-size:var(--space-2xl)}.cc-sparkline-bar{flex:1 1 0;min-inline-size:1px;background:var(--accent);border-radius:1px;transition:height var(--transition-normal)}.cc-sparkline-bar:nth-child(8n+1){background:var(--accent)}.cc-sparkline-bar:nth-child(8n+2){background:var(--todo)}.cc-sparkline-bar:nth-child(8n+3){background:var(--in-progress)}.cc-sparkline-bar:nth-child(8n+4){background:var(--in-review)}.cc-sparkline-bar:nth-child(8n+5){background:var(--triage)}.cc-sparkline-bar:nth-child(8n+6){background:var(--color-success)}.cc-sparkline-bar:nth-child(8n+7){background:var(--color-warning)}.cc-sparkline-bar:nth-child(8n){background:var(--color-error)}.cc-token-series{display:flex;flex-direction:column;gap:var(--space-sm);min-inline-size:0}.cc-token-series-plot{display:flex;align-items:flex-end;gap:var(--space-xs);block-size:clamp(calc(var(--space-2xl) * 2),24vw,calc(var(--space-2xl) * 5));padding:var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:linear-gradient(180deg,color-mix(in srgb,var(--accent) 10%,transparent),transparent),var(--surface-1);overflow:hidden}.cc-token-series-bar{flex:1 1 0;min-inline-size:var(--space-xs);border-radius:var(--radius-sm) var(--radius-sm) 0 0;background:linear-gradient(180deg,var(--accent),color-mix(in srgb,var(--accent) 45%,var(--surface-2)));box-shadow:0 0 var(--space-sm) color-mix(in srgb,var(--accent) 24%,transparent);transition:height var(--transition-normal);animation:cc-token-series-rise var(--duration-normal) ease-out both}.cc-token-series-empty{inline-size:100%;block-size:2px;align-self:flex-end;border-radius:var(--radius-pill);background:var(--border-subtle)}.cc-token-series-axis{display:flex;justify-content:space-between;gap:var(--space-sm);color:var(--text-muted);font-size:.75rem;font-variant-numeric:tabular-nums}.cc-token-series-axis span{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cc-token-series-axis span:last-child{text-align:end}@keyframes cc-token-series-rise{0%{transform:scaleY(.82);opacity:.72}to{transform:scaleY(1);opacity:1}}@media(prefers-reduced-motion:reduce){.cc-token-series-bar{transition:none;animation:none}}@media(max-width:768px){.cc-token-series-plot{block-size:clamp(calc(var(--space-2xl) + var(--space-xl)),38vw,calc(var(--space-2xl) * 4));padding:var(--space-sm)}}.cc-line-chart{display:block;inline-size:100%;block-size:clamp(calc(var(--space-2xl) * 2),22vw,calc(var(--space-2xl) * 5));aspect-ratio:5 / 2;color:var(--accent);overflow:hidden}.cc-line-chart-series{color:var(--accent)}.cc-line-chart-series:nth-child(2n){color:var(--color-success)}.cc-line-chart-series:nth-child(3n){color:var(--color-warning)}.cc-line-chart-path{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:100;stroke-dashoffset:100;animation:cc-line-chart-draw calc(var(--duration-slow) * 4) ease-out forwards}.cc-line-chart-point{fill:var(--surface-1);stroke:currentColor;stroke-width:2px}@keyframes cc-line-chart-draw{to{stroke-dashoffset:0}}@media(prefers-reduced-motion:reduce){.cc-line-chart-path{animation:none;stroke-dashoffset:0}}@media(max-width:768px){.cc-line-chart{block-size:clamp(calc(var(--space-2xl) * 2),44vw,calc(var(--space-2xl) * 4));aspect-ratio:auto}}.cc-recharts-chart,.cc-recharts-empty{inline-size:100%;block-size:calc(var(--space-2xl) * 7 + var(--space-lg));min-inline-size:0}.cc-recharts-chart .recharts-wrapper{inline-size:100%!important;max-inline-size:100%}.cc-recharts-chart .recharts-legend-wrapper{inset-inline:0!important;inset-block-start:auto!important;inset-block-end:0!important;inline-size:100%!important;max-inline-size:100%;overflow:hidden}.cc-recharts-chart .recharts-default-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--space-xs) var(--space-sm);inline-size:100%;max-inline-size:100%;margin:0;padding:0}.cc-recharts-chart .recharts-legend-item{display:inline-flex!important;align-items:center;max-inline-size:min(100%,calc(var(--space-2xl) * 5));margin-inline-end:0!important;min-inline-size:0}.cc-recharts-chart .recharts-legend-item-text{display:inline-block;min-inline-size:0;max-inline-size:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}@media(max-width:768px){.cc-recharts-chart,.cc-recharts-empty{block-size:calc(var(--space-2xl) * 8 + var(--space-md))}.cc-model-label{max-inline-size:100%}}.cc-radial-gauge{min-inline-size:0;display:grid;place-items:center;gap:var(--space-sm);color:var(--text)}.cc-radial-gauge-ring{position:relative;display:grid;place-items:center;inline-size:clamp(calc(var(--space-2xl) * 3),32vw,calc(var(--space-2xl) * 4 + var(--space-lg)));aspect-ratio:1;border-radius:50%;background:radial-gradient(circle at center,var(--surface-1) 0 54%,transparent 55%),conic-gradient(var(--accent) var(--cc-radial-value),var(--surface-2) 0);box-shadow:0 0 var(--space-lg) color-mix(in srgb,var(--accent) 35%,transparent);isolation:isolate;animation:cc-radial-gauge-pulse calc(var(--duration-slow) * 6) ease-in-out infinite}.cc-radial-gauge-ring:before{content:"";position:absolute;inset:var(--space-sm);border-radius:inherit;border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);box-shadow:inset 0 0 var(--space-md) color-mix(in srgb,var(--accent) 22%,transparent);animation:cc-radial-gauge-sweep calc(var(--duration-slow) * 8) linear infinite}.cc-radial-gauge-core{position:relative;z-index:1;display:grid;place-items:center;inline-size:58%;aspect-ratio:1;background:var(--surface-1);border-radius:50%;box-shadow:inset 0 0 var(--space-md) var(--surface-2)}.cc-radial-gauge-value{font-size:1.5rem;font-weight:700;font-variant-numeric:tabular-nums}.cc-radial-gauge-label{max-inline-size:100%;color:var(--text-muted);font-size:.8125rem;overflow-wrap:anywhere;text-align:center}@keyframes cc-radial-gauge-pulse{0%,to{filter:saturate(1)}50%{filter:saturate(1.35)}}@keyframes cc-radial-gauge-sweep{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@media(prefers-reduced-motion:reduce){.cc-radial-gauge-ring,.cc-radial-gauge-ring:before{animation:none}}.cc-funnel{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-sm)}.cc-funnel-stage{display:flex;flex-direction:column;gap:var(--space-xs)}.cc-funnel-header{min-inline-size:0;display:flex;justify-content:space-between;gap:var(--space-sm);font-size:.8125rem;color:var(--text-muted)}.cc-funnel-label,.cc-funnel-conversion,.cc-funnel-value{min-inline-size:0;overflow-wrap:anywhere}.cc-funnel-conversion{flex:0 1 auto;text-align:end}.cc-funnel-conversion{font-variant-numeric:tabular-nums}.cc-funnel-track{block-size:var(--space-lg);background:var(--surface-2);border-radius:var(--radius-sm);overflow:hidden}.cc-funnel-fill{block-size:100%;background:var(--accent);border-radius:var(--radius-sm);transition:width var(--transition-normal)}.cc-funnel-stage:nth-child(8n+1) .cc-funnel-fill{background:var(--accent)}.cc-funnel-stage:nth-child(8n+2) .cc-funnel-fill{background:var(--todo)}.cc-funnel-stage:nth-child(8n+3) .cc-funnel-fill{background:var(--in-progress)}.cc-funnel-stage:nth-child(8n+4) .cc-funnel-fill{background:var(--in-review)}.cc-funnel-stage:nth-child(8n+5) .cc-funnel-fill{background:var(--triage)}.cc-funnel-stage:nth-child(8n+6) .cc-funnel-fill{background:var(--color-success)}.cc-funnel-stage:nth-child(8n+7) .cc-funnel-fill{background:var(--color-warning)}.cc-funnel-stage:nth-child(8n) .cc-funnel-fill{background:var(--color-error)}.cc-funnel-value{font-size:.8125rem;font-variant-numeric:tabular-nums;color:var(--text)}.cc-chart-skeleton{block-size:var(--space-md);border-radius:var(--radius-sm);background:var(--surface-2);animation:cc-chart-pulse var(--duration-slow) ease-in-out infinite}@keyframes cc-chart-pulse{0%,to{opacity:.4}50%{opacity:.9}}@media(max-width:768px){.cc-bar-row{grid-template-columns:minmax(0,1fr) minmax(calc(var(--space-2xl) + var(--space-lg)),2fr);align-items:start}.cc-bar-label{max-inline-size:100%}.cc-bar-value{grid-column:1 / -1;justify-self:end;max-inline-size:100%}.cc-radial-gauge-ring{inline-size:clamp(calc(var(--space-2xl) * 2 + var(--space-lg)),44vw,calc(var(--space-2xl) * 4))}.cc-sparkline{block-size:clamp(var(--space-2xl),18vw,calc(var(--space-2xl) + var(--space-xl)))}}.cc-area{display:flex;flex-direction:column;gap:var(--space-lg);min-inline-size:0}.cc-area-section{display:flex;flex-direction:column;gap:var(--space-md);min-inline-size:0}.cc-area-section-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.cc-area-section-title{margin:0;font-size:.8125rem;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}.cc-area .cc-recharts-chart,.cc-area .cc-recharts-empty{inline-size:100%;block-size:calc(var(--space-2xl) * 7 + var(--space-lg));min-inline-size:0}.cc-area .cc-stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,calc(var(--space-2xl) * 5)),1fr));gap:var(--space-md)}.cc-stat-sub{font-size:.75rem;color:var(--text-muted)}.cc-token-granularity{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--space-xs)}.cc-token-granularity .btn.active{border-color:var(--accent);color:var(--text);background:color-mix(in srgb,var(--accent) 14%,var(--surface-1))}@media(prefers-reduced-motion:reduce){.cc-token-count-live{animation:none}}@media(max-width:768px){.cc-area-section-header{align-items:flex-start;flex-direction:column}.cc-token-granularity{justify-content:flex-start;inline-size:100%}}.cc-table-wrap{max-inline-size:100%;border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:var(--surface-1);overflow-x:auto;overflow-y:hidden}.cc-table{inline-size:100%;border-collapse:collapse;font-size:.8125rem;font-variant-numeric:tabular-nums}.cc-table th,.cc-table td{padding:var(--space-sm) var(--space-md);text-align:right;border-bottom:1px solid var(--border-subtle);white-space:nowrap}.cc-table th:first-child,.cc-table td:first-child{text-align:left}.cc-table thead th{color:var(--text-muted);font-weight:600}.cc-table th.cc-sortable{cursor:pointer;user-select:none}.cc-table th.cc-sortable:hover{color:var(--text)}.cc-table tbody tr{cursor:pointer}.cc-table tbody tr.cc-row-selected{background:var(--surface-2)}.cc-table tbody tr.cc-row-selected td{color:var(--text)}.cc-github-resolved-table-wrap{box-shadow:var(--shadow-sm)}.cc-github-resolved-table{table-layout:fixed}.cc-github-resolved-table th,.cc-github-resolved-table td{border-color:var(--border-subtle);white-space:normal}.cc-github-resolved-table thead th{background:var(--surface-2)}.cc-github-resolved-table th:first-child,.cc-github-resolved-table td:first-child{inline-size:28%}.cc-github-resolved-table th:nth-child(2),.cc-github-resolved-table td:nth-child(2){inline-size:48%;text-align:left}.cc-github-resolved-table th:last-child,.cc-github-resolved-table td:last-child{inline-size:24%}.cc-github-resolved-table tbody tr{cursor:default;transition:background-color var(--duration-fast) ease}.cc-github-resolved-table tbody tr:hover{background:color-mix(in srgb,var(--accent) 8%,var(--surface-1))}.cc-github-resolved-table tbody tr:last-child td{border-block-end:0}.cc-github-resolved-issue-cell,.cc-github-resolved-task-cell,.cc-github-resolved-date-cell{vertical-align:top}.cc-github-resolved-issue-link{color:var(--accent);font-weight:600;overflow-wrap:anywhere;text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--accent) 55%,transparent);text-underline-offset:var(--space-xs);transition:color var(--duration-fast) ease,text-decoration-color var(--duration-fast) ease}.cc-github-resolved-issue-link:hover{color:var(--text);text-decoration-color:currentColor}.cc-github-resolved-issue-link:focus-visible{outline:none;box-shadow:var(--focus-ring)}.cc-github-resolved-issue-ref{color:var(--text-muted);overflow-wrap:anywhere}.cc-github-resolved-task{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-xs);min-inline-size:0}.cc-github-resolved-task-title{color:var(--text);font-weight:600;overflow-wrap:anywhere}.cc-github-resolved-task-id{font-variant-numeric:tabular-nums;white-space:nowrap}.cc-github-resolved-date{display:inline-flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--space-xs);color:var(--text)}.cc-github-resolved-date-approx{white-space:nowrap}@media(min-width:769px)and (max-width:1024px){.cc-github-resolved-table th:first-child,.cc-github-resolved-table td:first-child{inline-size:32%}.cc-github-resolved-table th:nth-child(2),.cc-github-resolved-table td:nth-child(2){inline-size:44%}}@media(max-width:768px){.cc-github-resolved-table th,.cc-github-resolved-table td{padding:var(--space-sm)}.cc-github-resolved-table th:first-child,.cc-github-resolved-table td:first-child{inline-size:31%}.cc-github-resolved-table th:nth-child(2),.cc-github-resolved-table td:nth-child(2){inline-size:45%}.cc-github-resolved-table th:last-child,.cc-github-resolved-table td:last-child{inline-size:24%}.cc-github-resolved-date{justify-content:flex-start}}.cc-sort-caret{margin-inline-start:var(--space-xs);font-size:.7em;color:var(--accent)}.cc-unavailable{color:var(--text-muted);cursor:help;border-bottom:1px dotted var(--border-subtle)}.cc-loading-inline{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-lg);color:var(--text-muted)}.cc-area-empty,.cc-area-error{display:flex;flex-direction:column;align-items:center;gap:var(--space-sm);padding:var(--space-xl);color:var(--text-muted);text-align:center}.cc-area-error{color:var(--color-error)}.cc-pricing-note{font-size:.75rem;color:var(--text-muted)}.cc-team-area{display:flex;flex-direction:column;gap:var(--space-lg);min-inline-size:0}.cc-team-ops-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--space-md);min-inline-size:0}.cc-team-ops-card{min-inline-size:0;padding:var(--space-md);border:thin solid var(--border-subtle);border-radius:var(--radius-md);background:var(--surface-1)}.cc-team-ops-card--org{grid-column:1 / -1}.cc-team-ops-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-block-end:var(--space-md)}.cc-team-ops-card-header h3{margin:0;color:var(--text);font-size:.9375rem}.cc-team-ops-card-header p,.cc-team-muted{margin:var(--space-xs) 0 0;color:var(--text-muted);font-size:.8125rem}.cc-team-error{margin:0;color:var(--color-error);font-size:.8125rem}.cc-team-status-pill{display:inline-flex;flex:0 0 auto;align-items:center;gap:var(--space-xs);color:var(--text-muted);font-size:.8125rem}.cc-team-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);margin:0 0 var(--space-md)}.cc-team-facts div{min-inline-size:0}.cc-team-facts dt{color:var(--text-muted);font-size:.75rem}.cc-team-facts dd{margin:var(--space-xs) 0 0;color:var(--text);font-size:.875rem;overflow-wrap:anywhere}.cc-team-action{gap:var(--space-xs)}.cc-team-ops-card--heartbeat{grid-column:1 / -1}.cc-team-heartbeat-multiplier{margin-block-start:var(--space-md)}.cc-team-heartbeat-multiplier .heartbeat-multiplier-controls{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-md)}.cc-team-heartbeat-multiplier .heartbeat-multiplier-slider{flex:1 1 calc(var(--space-2xl) * 5);min-inline-size:calc(var(--space-2xl) * 4)}.cc-team-org-scroll{max-block-size:calc(var(--space-2xl) * 13);overflow:auto;overscroll-behavior:contain;cursor:grab}.cc-team-org-scroll.is-dragging{cursor:grabbing;user-select:none}.cc-team-org-roots,.cc-team-org-children{display:flex;gap:var(--space-sm);margin:0;padding:0;list-style:none}.cc-team-org-scroll[data-layout=vertical] .cc-team-org-roots,.cc-team-org-scroll[data-layout=vertical] .cc-team-org-children{flex-direction:column}.cc-team-org-scroll[data-layout=vertical] .cc-team-org-children{margin-block-start:var(--space-sm);margin-inline-start:var(--space-xl);padding-inline-start:var(--space-md);border-inline-start:thin solid var(--border-subtle)}.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-roots,.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-children{flex-direction:row;align-items:flex-start;justify-content:center;gap:var(--space-md)}.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-children{position:relative;margin-block-start:var(--space-md);padding-block-start:var(--space-md)}.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-children:before,.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-children:after,.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-children>.cc-team-org-item:before{position:absolute;content:"";pointer-events:none}.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-children:before{inset-block-start:calc(var(--space-md) * -1);inset-inline-start:50%;block-size:var(--space-md);border-inline-start:thin solid var(--border-subtle)}.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-children:after{inset-block-start:calc(var(--space-md) / 2);inset-inline:0;border-block-start:thin solid var(--border-subtle)}.cc-team-org-item{min-inline-size:max-content}.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-item{position:relative;display:flex;flex-direction:column;align-items:center}.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-children>.cc-team-org-item:before{inset-block-start:calc(var(--space-md) * -1);inset-inline-start:50%;block-size:var(--space-md);border-inline-start:thin solid var(--border-subtle)}.cc-team-org-card{display:inline-flex;min-inline-size:calc(var(--space-2xl) * 5);max-inline-size:calc(var(--space-2xl) * 10);padding:var(--space-sm);border:thin solid var(--border-subtle);border-radius:var(--radius-md);background:var(--surface-2);box-shadow:var(--shadow-sm)}.cc-team-org-card-header{display:flex;align-items:center;gap:var(--space-sm);min-inline-size:0}.cc-team-org-avatar{display:inline-flex;flex:0 0 auto}.cc-team-org-name{color:var(--text);font-size:.8125rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cc-team-org-badge{flex:0 0 auto;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);background:color-mix(in srgb,var(--accent) 12%,var(--surface-1));color:var(--text-muted);font-size:.75rem;text-transform:capitalize}.cc-team-chart-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md)}.cc-team-chart-panel{display:flex;flex-direction:column;gap:var(--space-md);min-inline-size:0;padding:var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:var(--surface-1);animation:cc-team-panel-reveal var(--duration-fast) ease-out both}.cc-team-spark-panel{grid-column:1 / -1}.cc-muted-hint,.cc-team-agent-role{color:var(--text-muted)}.cc-muted-hint{margin:0;font-size:.8125rem}.cc-team-agent-cell{display:inline-flex;align-items:center;gap:var(--space-sm);min-inline-size:0}.cc-team-agent-name,.cc-team-agent-role{display:block}.cc-team-agent-name{color:var(--text);font-weight:600}.cc-team-agent-role{font-size:.75rem;text-transform:capitalize}@keyframes cc-team-panel-reveal{0%{opacity:0;transform:translateY(var(--space-xs))}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){.cc-team-chart-panel{animation:none}}@media(min-width:769px)and (max-width:1024px){.cc-area .cc-stat-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,calc(var(--space-2xl) * 5)),1fr))}.cc-team-chart-grid{min-inline-size:0;grid-template-columns:minmax(0,1fr)}.cc-team-spark-panel{grid-column:auto}}@media(max-width:768px){.cc-team-ops-grid,.cc-team-chart-grid{min-inline-size:0;grid-template-columns:minmax(0,1fr)}.cc-team-ops-card--org,.cc-team-ops-card--heartbeat,.cc-team-spark-panel{grid-column:auto}.cc-team-ops-card,.cc-team-chart-panel{padding:var(--space-sm)}.cc-team-ops-card-header{flex-direction:column}.cc-team-facts{grid-template-columns:minmax(0,1fr)}.cc-team-action{justify-content:center;inline-size:100%}.cc-team-org-scroll{max-block-size:calc(var(--space-2xl) * 10)}.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-roots,.cc-team-org-scroll[data-layout=horizontal] .cc-team-org-children{justify-content:flex-start;gap:var(--space-sm)}}.activity-feed{display:flex;flex-direction:column;gap:var(--space-lg);max-height:600px;overflow-y:auto;padding:var(--space-md)}@media(max-width:768px){.activity-feed{padding:var(--space-md) var(--space-lg)}}.activity-feed-group{display:flex;flex-direction:column;gap:var(--space-sm)}.activity-feed-group-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) 0;border-bottom:1px solid var(--border);margin-bottom:var(--space-sm);position:sticky;top:0;background:var(--surface);z-index:1}.activity-feed-group-date{font-size:13px;font-weight:600;color:var(--text);text-transform:uppercase;letter-spacing:.5px}.activity-feed-group-count{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);background:var(--card);padding:2px 8px;border-radius:var(--radius-sm)}.activity-feed-list{display:flex;flex-direction:column;gap:var(--space-sm)}.activity-feed-item{display:flex;gap:var(--space-md);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);transition:background-color var(--transition-fast)}.activity-feed-item:hover{background:var(--card-hover)}.activity-feed-icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:var(--surface);border-radius:var(--radius-md);flex-shrink:0}.activity-feed-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-xs)}.activity-feed-header{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.activity-feed-type{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted)}.activity-feed-project-badge{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:11px;color:var(--todo);background:color-mix(in srgb,var(--todo) 10%,transparent);padding:2px 8px;border-radius:var(--radius-sm)}.activity-feed-details{display:flex;flex-direction:column;gap:2px}.activity-feed-task-id{font-family:var(--font-mono);font-size:12px;color:var(--text-muted)}.activity-feed-task-title{font-size:14px;font-weight:500;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.activity-feed-description{font-size:13px;color:var(--text-muted);line-height:1.4}.activity-feed-meta{display:flex;align-items:center;gap:var(--space-sm);margin-top:2px}.activity-feed-time{font-size:11px;color:var(--text-dim)}.activity-feed-loading{display:flex;align-items:center;justify-content:center;min-height:200px}.activity-feed-skeleton{display:flex;flex-direction:column;gap:var(--space-md);width:100%}.activity-feed-skeleton-item{display:flex;gap:var(--space-md);padding:var(--space-md)}.activity-feed-skeleton-icon{width:32px;height:32px;background:var(--border);border-radius:var(--radius-md);flex-shrink:0;animation:pulse 1.5s ease-in-out infinite}.activity-feed-skeleton-content{flex:1;display:flex;flex-direction:column;gap:var(--space-sm)}.activity-feed-skeleton-line{height:12px;background:var(--border);border-radius:var(--radius-sm);animation:pulse 1.5s ease-in-out infinite}.activity-feed-skeleton-line.short{width:60%}.activity-feed-error{display:flex;align-items:center;justify-content:center;min-height:200px;padding:var(--space-xl)}.activity-feed-error-message{display:flex;flex-direction:column;align-items:center;gap:var(--space-md);color:var(--color-error);text-align:center}.activity-feed-empty{display:flex;align-items:center;justify-content:center;min-height:300px;padding:var(--space-xl)}.activity-feed-empty-state{display:flex;flex-direction:column;align-items:center;gap:var(--space-md);color:var(--text-muted);text-align:center}.activity-feed-empty-state p{font-size:15px;font-weight:500;color:var(--text);margin:0}.activity-feed-empty-hint{font-size:13px;color:var(--text-dim);max-width:300px}.cc-agent-activity{display:grid;gap:var(--space-md);min-inline-size:0}.cc-agent-activity-mode,.cc-agent-activity-filters,.cc-agent-activity-target{display:flex;align-items:center;gap:var(--space-sm);min-inline-size:0}.cc-agent-activity-filters{flex-wrap:wrap}.cc-agent-activity-filters .input{flex:1 1 auto;min-inline-size:0}.cc-agent-activity-range-note,.cc-agent-activity-end,.cc-agent-activity-copy small{color:var(--text-muted);font-size:var(--font-size-xs)}.cc-agent-activity-list{display:grid;gap:var(--space-sm)}.cc-agent-activity-row{display:flex;align-items:center;gap:var(--space-sm);min-inline-size:0;padding:var(--space-sm);border:0;border-radius:var(--radius-sm);background:transparent;color:inherit;text-align:left}button.cc-agent-activity-row{cursor:pointer;transition:background var(--transition-fast)}button.cc-agent-activity-row:hover,button.cc-agent-activity-row:focus-visible{background:color-mix(in srgb,var(--surface-2) 80%,transparent)}.cc-agent-activity-copy{display:grid;gap:var(--space-xs);min-inline-size:0;overflow-wrap:anywhere}.cc-agent-activity-target .cc-agent-activity-row{flex:1 1 auto}@media(max-width:768px){.cc-agent-activity-mode,.cc-agent-activity-filters,.cc-agent-activity-target{align-items:stretch;flex-direction:column}.cc-agent-activity-mode .btn,.cc-agent-activity-filters .input,.cc-agent-activity-target .btn{inline-size:100%}.cc-agent-activity-row{align-items:flex-start}}@media(max-height:480px)and (max-width:768px){.cc-agent-activity{gap:var(--space-sm)}}.cc-portability-card{display:flex;flex-direction:column;gap:var(--space-sm)}.cc-portability-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm)}.cc-portability-import-label{color:var(--text);font-size:.8125rem}.cc-portability-import-input{min-block-size:calc(var(--space-2xl) * 3);resize:vertical}@media(max-width:768px){.cc-portability-actions{flex-direction:column}.cc-portability-actions .cc-controls-action{inline-size:100%;justify-content:center}}.cc-system-refresh{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-sm);color:var(--text-muted);font-size:.8125rem}.cc-system-refresh .btn-icon{flex:0 0 auto}.cc-system-node-selector{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--text)}.cc-system-node-selector .input{min-inline-size:10rem}.cc-system-gauges .cc-stat-card{min-block-size:100%}.cc-system-chart-grid{min-inline-size:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md)}.cc-system-chart-grid .cc-stat-card{gap:var(--space-md)}.cc-system-section-title-with-icon{display:inline-flex;align-items:center;gap:var(--space-sm)}.cc-system-section-title-with-icon svg{color:var(--text-muted)}.cc-system-vitest-card{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-md);padding:var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:var(--surface-1)}.cc-system-vitest-card .btn,.cc-system-toggle-row,.cc-system-threshold-row,.cc-system-threshold-controls{display:inline-flex;align-items:center;gap:var(--space-sm)}.cc-system-toggle-row,.cc-system-threshold-row{color:var(--text);font-size:.8125rem}.cc-system-threshold-controls input[type=range]{accent-color:var(--accent)}.cc-system-threshold-controls .input{inline-size:5rem}.cc-system-note{margin:0;color:var(--text-muted);font-size:.8125rem}.cc-system-note--error,.cc-system-value--critical{color:var(--color-error)}.cc-system-value--warning{color:var(--color-warning)}.cc-system-note--success{color:var(--color-success)}@media(max-width:768px){.cc-system-refresh{align-items:flex-start;justify-content:flex-start;flex-direction:column}.cc-system-chart-grid{grid-template-columns:minmax(0,1fr)}.cc-system-node-selector,.cc-system-vitest-card,.cc-system-toggle-row,.cc-system-threshold-row,.cc-system-threshold-controls{align-items:stretch;flex-direction:column;inline-size:100%}.cc-system-node-selector .input,.cc-system-vitest-card .btn,.cc-system-threshold-controls .input{inline-size:100%}}.cc-area-section-header.cc-system-controls-header{flex-direction:row;align-items:center;justify-content:space-between}@media(max-width:768px){.cc-area-section-header.cc-system-controls-header{flex-direction:row;align-items:center;justify-content:space-between}}.cc-syscontrols-grid{min-inline-size:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,16rem),1fr));gap:var(--space-md)}.cc-syscontrol-card{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md)}.cc-syscontrol-head{display:inline-flex;align-items:center;gap:var(--space-sm)}.cc-syscontrol-icon{color:var(--text-muted);flex:0 0 auto}.cc-syscontrol-title{font-weight:600}.cc-syscontrol-desc{margin:0;color:var(--text-muted);font-size:.8125rem;flex:1 1 auto}.cc-syscontrol-note{margin:0;color:var(--text-muted);font-size:.75rem;font-style:italic}.cc-syscontrol-cta{align-self:flex-start}.cc-syscontrols-banner{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);margin-block-end:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface-2, var(--surface))}.cc-syscontrols-banner--back{justify-content:space-between}.cc-syscontrols-banner--error{justify-content:space-between;border-color:var(--color-error)}.cc-syscontrols-job-status{font-size:.8125rem;color:var(--text-muted)}.cc-syscontrols-job-status--succeeded{color:var(--color-success)}.cc-syscontrols-job-status--failed{color:var(--color-error)}.cc-syscontrols-output{margin:0;padding:var(--space-md);max-block-size:20rem;overflow-y:auto;overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface-2, var(--surface));font-family:var(--font-mono, ui-monospace, monospace);font-size:.75rem;line-height:1.5;white-space:pre-wrap;word-break:break-word}.cc-syscontrols-logs{display:flex;flex-direction:column}.cc-syscontrols-log-line{display:flex;gap:var(--space-sm);min-inline-size:0}.cc-syscontrols-log-line--warn .cc-syscontrols-log-message{color:var(--color-warning)}.cc-syscontrols-log-line--error .cc-syscontrols-log-message{color:var(--color-error)}.cc-syscontrols-log-time,.cc-syscontrols-log-prefix{color:var(--text-muted);flex:0 0 auto}.cc-syscontrols-log-message{word-break:break-word}.cc-mission-control{display:flex;flex-direction:column;gap:var(--space-lg)}.cc-mc-columns{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-lg)}.cc-mc-section{display:flex;flex-direction:column;gap:var(--space-sm);min-width:0}.cc-mc-muted{color:var(--text-muted);font-size:.85rem;margin:0}.cc-mc-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-xs)}.cc-mc-session,.cc-mc-node{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm);border:1px solid var(--border-subtle, color-mix(in srgb, #ffffff 8%, transparent));border-radius:var(--radius-sm, 6px);background:var(--surface-1, color-mix(in srgb, #ffffff 2%, transparent));min-width:0}.cc-mc-node.inactive{opacity:.55}.cc-mc-session-purpose,.cc-mc-node-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.cc-mc-session-meta,.cc-mc-node-meta{display:flex;align-items:center;gap:var(--space-sm);flex-shrink:0}.cc-mc-badge{font-size:.7rem;text-transform:uppercase;letter-spacing:.03em;padding:2px 6px;border-radius:var(--radius-sm, 6px);background:var(--surface-2, color-mix(in srgb, #3b82f6 15%, transparent));color:var(--text)}.cc-mc-badge.inactive{background:var(--surface-2, color-mix(in srgb, #ffffff 6%, transparent));color:var(--text-muted)}.cc-mc-task,.cc-mc-node-count{font-size:.75rem;color:var(--text-muted)}@media(max-width:768px),(max-height:480px){.cc-mc-columns{grid-template-columns:1fr}}.cc-controls{min-inline-size:0}.cc-controls-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md);align-items:stretch}.cc-controls-card{min-inline-size:0;padding:var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:var(--surface-1)}.cc-controls-card--concurrency{grid-column:1 / -1}.cc-controls-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-block-end:var(--space-md)}.cc-controls-card-header h3{margin:0;color:var(--text);font-size:.9375rem}.cc-controls-card-header p,.cc-controls-muted{margin:var(--space-xs) 0 0;color:var(--text-muted);font-size:.8125rem}.cc-controls-error{margin:0;color:var(--color-error);font-size:.8125rem}.cc-controls-status-pill{display:inline-flex;flex:0 0 auto;align-items:center;gap:var(--space-xs);color:var(--text-muted);font-size:.8125rem}.cc-controls-action{gap:var(--space-xs)}.cc-controls-save-state{flex:0 0 auto;color:var(--text-muted);font-size:.8125rem}.cc-controls-save-state--saved{color:var(--color-success)}.cc-controls-save-state--error{color:var(--color-error)}.cc-controls-sliders{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-items:stretch;gap:var(--space-md)}.cc-controls-slider{display:flex;align-self:stretch;min-inline-size:0;flex-direction:column;gap:var(--space-sm);color:var(--text);font-size:.8125rem}.cc-controls-slider-caption{color:var(--text-muted);font-size:.75rem}.cc-controls-slider-label{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.cc-controls-slider-label strong{color:var(--accent);font-variant-numeric:tabular-nums}.cc-controls-range-wrap{--cc-controls-range-thumb-size: calc(var(--space-lg) + var(--space-xs) / 2);position:relative;display:flex;align-items:center;inline-size:100%;min-inline-size:0}.cc-controls-range-wrap,.cc-controls-slider>input[type=range]{margin-block-start:auto}.cc-controls-use-marker{--use-pct: 0%;--use-offset: 0%;position:absolute;inset-block-start:50%;inset-inline-start:var(--use-offset, var(--use-pct));transform:translate(-50%,-50%);pointer-events:none}.cc-controls-slider input[type=range],.cc-controls-touch-slider{inline-size:100%;min-block-size:var(--space-xl);accent-color:var(--accent);touch-action:none}.cc-controls-slider input[type=range]::-webkit-slider-thumb,.cc-controls-touch-slider::-webkit-slider-thumb{width:var(--cc-controls-range-thumb-size);height:var(--cc-controls-range-thumb-size)}.cc-controls-slider input[type=range]::-moz-range-thumb,.cc-controls-touch-slider::-moz-range-thumb{width:var(--cc-controls-range-thumb-size);height:var(--cc-controls-range-thumb-size)}@media(max-width:768px){.cc-controls-grid{grid-template-columns:minmax(0,1fr)}.cc-controls-card{padding:var(--space-sm)}.cc-controls-card-header{flex-direction:column}.cc-controls-sliders{grid-template-columns:minmax(0,1fr)}.cc-controls-range-wrap{--cc-controls-range-thumb-size: var(--space-xl)}.cc-controls-slider input[type=range],.cc-controls-touch-slider{min-block-size:var(--space-2xl)}.cc-controls-slider input[type=range]::-webkit-slider-thumb,.cc-controls-touch-slider::-webkit-slider-thumb{inline-size:var(--space-xl);block-size:var(--space-xl)}.cc-controls-slider input[type=range]::-moz-range-thumb,.cc-controls-touch-slider::-moz-range-thumb{inline-size:var(--space-xl);block-size:var(--space-xl)}.cc-controls-action{justify-content:center;inline-size:100%}}.reliability-view{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--space-lg);height:100%;min-height:0;min-width:0;overflow-y:auto;-webkit-overflow-scrolling:touch}.reliability-card{padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card)}.reliability-loading{display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);height:100%;min-width:0;padding:var(--space-2xl);color:var(--text-muted)}.reliability-error{display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);height:100%;min-width:0;padding:var(--space-2xl);text-align:center}.reliability-error p{color:var(--text-muted);margin:0}.reliability-headline-card{display:flex;flex-direction:column;gap:var(--space-sm)}.reliability-headline{font-size:1.75rem;font-weight:700}.reliability-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,calc(var(--space-2xl) * 12)),1fr));gap:var(--space-lg)}.reliability-section-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.reliability-chart-section{display:flex;flex-direction:column;gap:var(--space-sm);min-inline-size:0;margin-block-start:var(--space-md);padding:var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:var(--surface-1)}.reliability-chart-section h4{margin:0;color:var(--text-muted);font-size:var(--font-size-xs);font-weight:600}.reliability-chart-section .cc-recharts-chart,.reliability-chart-section .cc-recharts-empty{block-size:clamp(calc(var(--space-2xl) * 4),34vh,calc(var(--space-2xl) * 7))}.reliability-table{width:100%;border-collapse:collapse;margin-top:var(--space-sm)}.reliability-table th,.reliability-table td{text-align:left;padding:var(--space-xs) var(--space-sm);border-bottom:1px solid var(--border)}.reliability-stat-row{display:flex;justify-content:space-between;align-items:center;padding:var(--space-xs) 0}.reliability-muted{color:var(--text-muted)}.reliability-details{margin-top:var(--space-sm)}.reliability-details summary{color:var(--text-muted);cursor:pointer}.reliability-details-content{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-xs);color:var(--text-muted)}.reliability-histogram{list-style:none;margin:var(--space-sm) 0 0;padding:0;display:flex;flex-direction:column;gap:var(--space-sm)}.reliability-histogram li{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,6fr) minmax(0,1fr);align-items:center;gap:var(--space-sm)}.reliability-histogram-bar-wrap{width:100%;border-radius:var(--radius-pill);background:color-mix(in srgb,var(--color-info) 15%,transparent);overflow:hidden}.reliability-histogram-bar{height:var(--space-md);background:var(--color-info)}@media(max-width:768px){.reliability-view,.reliability-loading,.reliability-error{padding-bottom:calc(var(--space-lg) + var(--mobile-nav-height) + env(safe-area-inset-bottom,0px) + var(--standalone-bottom-gap))}.reliability-grid{grid-template-columns:minmax(0,1fr)}.reliability-section-header{flex-direction:column;align-items:flex-start}.reliability-chart-section{padding:var(--space-sm)}.reliability-chart-section .cc-recharts-chart,.reliability-chart-section .cc-recharts-empty{block-size:clamp(calc(var(--space-2xl) * 3),46vh,calc(var(--space-2xl) * 6))}}.nodes-view{--nodes-view-spin-duration: calc(var(--duration-slow) * 4);--nodes-view-pulse-duration: calc(var(--duration-slow) * 5);display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-sm) var(--space-md) var(--space-xl)}.nodes-view-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--space-sm)}.nodes-view-title{display:flex;align-items:center;gap:var(--space-sm)}.nodes-view-title h2{margin:0;display:flex;align-items:center;gap:var(--space-sm)}.nodes-view-count{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) / 4)}.nodes-view-actions{display:flex;gap:var(--space-sm)}.nodes-view-close{margin-left:auto}.nodes-view-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(calc(var(--space-xl) * 5.833),1fr));gap:var(--space-sm)}.nodes-view-stat{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-sm) var(--space-md);display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.nodes-view-stat span{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.nodes-view-stat strong{font-size:calc(var(--space-lg) + var(--space-xs) / 2)}.nodes-view-stat--online strong{color:var(--color-success)}.nodes-view-stat--offline strong{color:var(--color-error)}.nodes-view-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-lg) * 20),1fr));gap:var(--space-md)}.nodes-view-empty{padding:var(--space-xl);border:1px dashed var(--border);border-radius:var(--radius-md);text-align:center;color:var(--text-muted);display:flex;flex-direction:column;align-items:center;gap:var(--space-md)}.nodes-view-error{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) / 4)}.node-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-md);cursor:pointer;transition:border-color var(--transition-fast),transform var(--transition-fast)}.node-card:hover{border-color:var(--accent);transform:translateY(calc(var(--space-xs) * -.25))}.node-card:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.node-card--loading{min-height:calc(var(--space-xl) * 9.167);opacity:.55;pointer-events:none}.node-card__header{display:flex;align-items:center;justify-content:space-between}.node-card__title-wrap{display:flex;align-items:center;gap:var(--space-sm)}.node-card__icon{width:calc(var(--space-lg) * 2.125);height:calc(var(--space-lg) * 2.125);border-radius:var(--radius-sm);display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent)}.node-card__name{margin:0;font-size:calc(var(--space-md) + var(--space-xs));line-height:1.25}.node-card__meta-row{margin-top:var(--space-xs);display:flex;align-items:center;gap:var(--space-xs)}.node-card__type-badge{border:1px solid var(--border);border-radius:var(--radius-pill);padding:var(--space-xs) var(--space-sm);font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.node-card__status{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs) * .75);font-weight:600}.node-card__status-indicator{width:var(--space-sm);height:var(--space-sm);border-radius:50%}.node-card__status--online .node-card__status-indicator{background:var(--color-success)}.node-card__status--offline .node-card__status-indicator,.node-card__status--error .node-card__status-indicator{background:var(--color-error)}.node-card__status--connecting .node-card__status-indicator{background:var(--color-warning)}.node-card__auth-indicator{display:inline-flex;align-items:center;margin-left:var(--space-xs);vertical-align:middle}.node-card__url{font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted);word-break:break-all}.node-card__metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.node-card__metric{display:flex;flex-direction:column;gap:var(--space-xs)}.node-card__metric-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-transform:uppercase;letter-spacing:.03em}.node-card__metric-value{font-size:calc(var(--space-md) + var(--space-xs));font-weight:600}.node-card__sync{display:flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-sm);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.node-card__sync-dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;flex-shrink:0}.node-card__sync-time{color:var(--text-muted)}.nodes-view-stat--synced strong{color:var(--color-success)}.node-card__actions{display:flex;gap:var(--space-xs);flex-wrap:wrap}.node-card__action{display:inline-flex;align-items:center;gap:var(--space-xs)}.node-card__action--remove{margin-left:auto}.node-card__action--remove:not(.btn-danger){color:var(--color-error);border-color:color-mix(in srgb,var(--color-error) 45%,var(--border))}.node-card__action--remove.is-armed{background:color-mix(in srgb,var(--color-error) 14%,transparent)}.node-card__docker-badge{display:inline-flex;align-items:center;gap:var(--space-xs);border-radius:var(--radius-pill);padding:var(--space-xs) var(--space-sm);font-size:calc(var(--space-sm) + var(--space-xs) * .75);background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.node-card__docker-meta{display:flex;gap:var(--space-sm);margin-top:var(--space-xs);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.node-card__docker-meta span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mesh-topology{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);min-height:calc(var(--space-2xl) * 6.25);padding:var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md)}.mesh-topology__svg{width:100%;max-width:calc(var(--space-2xl) * 12.5);height:auto;aspect-ratio:1}.mesh-topology__node{transition:filter var(--transition-fast)}.mesh-topology__node:hover{filter:brightness(1.1)}.mesh-topology__node-circle{stroke:var(--border);stroke-width:calc(var(--space-xs) / 2);transition:fill var(--transition-fast)}.mesh-topology__node-label{font-size:calc(var(--space-sm) + var(--space-xs) * .75);fill:var(--text);font-weight:500}.mesh-topology__node-type-badge{fill:color-mix(in srgb,var(--surface) 75%,var(--bg));stroke:var(--border);stroke-width:calc(var(--space-xs) / 4)}.mesh-topology__node-type-text{font-size:calc(var(--space-sm) + var(--space-xs) / 2);font-weight:700;fill:var(--text-muted);text-transform:uppercase;letter-spacing:.03em}.mesh-topology__link{stroke:var(--border);stroke-width:calc((var(--space-xs) * 3) / 8);stroke-dasharray:var(--space-xs),var(--space-xs);opacity:.6}.mesh-topology__legend{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.mesh-topology__legend-item{display:flex;align-items:center;gap:var(--space-sm)}.mesh-topology__notice{margin:var(--space-md) 0 0;text-align:center;color:var(--text-dim);font-size:calc(var(--space-sm) + var(--space-xs))}.mesh-topology__legend-dot{width:calc(var(--space-sm) + var(--space-xs) / 2);height:calc(var(--space-sm) + var(--space-xs) / 2);border-radius:50%;border:1px solid var(--border)}.mesh-topology--empty{justify-content:center}.mesh-topology__empty-state{text-align:center;color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) / 2)}.connect-node-modal{width:min(calc(var(--space-lg) * 30),calc(100vw - (var(--space-lg) * 2)))}.connect-node-form{display:flex;flex-direction:column;gap:var(--space-md)}.connect-node-form .form-group{padding:0;margin-top:0}.connect-node-form .form-group:last-of-type{margin-bottom:0}.connect-node-field{display:flex;flex-direction:column;gap:var(--space-xs)}.connect-node-field__input{width:100%}.connect-node-field__input[aria-invalid=true]{border-color:var(--color-error);background:color-mix(in srgb,var(--color-error) 5%,var(--surface))}.connect-node-field__input[aria-invalid=true]:focus-visible{border-color:var(--color-error);box-shadow:var(--glow-danger)}.connect-node-url-preview{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);background:color-mix(in srgb,var(--surface) 50%,var(--bg));border-radius:var(--radius-sm);border-left:var(--space-xs) solid var(--accent);font-size:calc(var(--space-sm) + var(--space-xs))}.connect-node-url-preview-label{color:var(--text-muted)}.connect-node-url-preview code{font-family:var(--font-mono);color:var(--text);font-size:calc(var(--space-sm) + var(--space-xs))}.connect-node-actions{display:flex;justify-content:flex-end;gap:var(--space-sm);padding:var(--modal-padding);border-top:1px solid var(--border)}.nodes-view-topology{margin-bottom:var(--space-md)}.nodes-view-section-title{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:600;color:var(--text);margin:0 0 var(--space-sm)}.nodes-view .node-status-indicator{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs) * .625)}.nodes-view .node-status-indicator__label,.nodes-view .node-status-indicator--local{color:var(--text-muted)}.nodes-view .node-status-indicator--remote{color:var(--text)}.nodes-view .node-status-indicator__dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;position:relative;display:inline-block}.nodes-view .node-status-indicator__dot--online{background:var(--color-success);box-shadow:var(--glow-success)}.nodes-view .node-status-indicator__dot--offline,.nodes-view .node-status-indicator__dot--error{background:var(--color-error)}.nodes-view .node-status-indicator__dot--connecting{background:var(--color-warning);animation:pulse-warning var(--nodes-view-pulse-duration) ease-in-out infinite}.nodes-view .node-status-indicator__spinner{position:absolute;inset:0;border:calc(var(--space-xs) / 2) solid transparent;border-top-color:currentColor;border-radius:50%;animation:nodes-view-spinner-spin var(--nodes-view-spin-duration) linear infinite}.nodes-view .node-status-indicator__name{font-weight:500}.nodes-view .node-status-indicator__details{font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}@keyframes pulse-warning{0%,to{opacity:1;box-shadow:var(--glow-warning)}50%{opacity:.6;box-shadow:var(--glow-warning)}}@keyframes nodes-view-spinner-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.nodes-view .spin{animation:nodes-view-spinner-spin var(--nodes-view-spin-duration) linear infinite}@media(max-width:768px){.nodes-view{padding-inline:var(--space-sm)}.nodes-view-grid,.node-card__metrics{grid-template-columns:1fr}.node-card__docker-badge,.node-card__docker-meta{gap:var(--space-xs)}.node-card__docker-meta span{max-width:calc(var(--space-2xl) * 4.5)}.connect-node-modal{width:calc(100vw - (var(--space-md) * 2))}.connect-node-field__input{min-height:calc(var(--space-2xl) + var(--space-md))}.nodes-view-header{flex-wrap:wrap;gap:var(--space-sm)}.nodes-view-title h2{font-size:calc(var(--space-md) + var(--space-xs))}.nodes-view-title h2 svg{flex-shrink:0}.nodes-view-count{font-size:calc(var(--space-sm) + var(--space-xs))}.nodes-view-actions{flex-wrap:wrap;gap:var(--space-sm);width:100%;justify-content:flex-end}.nodes-view-close{min-height:calc(var(--space-xl) + var(--space-md));min-width:calc(var(--space-xl) + var(--space-md))}.nodes-view-actions .btn{min-height:calc(var(--space-xl) + var(--space-md))}.nodes-view-stats{grid-template-columns:repeat(2,1fr);gap:var(--space-sm)}.nodes-view-stat{padding:var(--space-xs) var(--space-sm)}.nodes-view-stat span{font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.nodes-view-stat strong{font-size:calc(var(--space-md) + var(--space-xs) / 2)}.nodes-view-empty{padding:var(--space-xl) var(--space-md);text-align:center}.nodes-view-error{padding:var(--space-md);margin:var(--space-md) 0}.nodes-view-topology{padding:var(--space-sm) 0}.nodes-view-section-title{font-size:calc(var(--space-md) + var(--space-xs) / 4)}}.add-node-modal{width:min(calc(var(--space-lg) * 32.5),calc(100vw - (var(--space-lg) * 2)))}.add-node-modal__body{display:flex;flex-direction:column;gap:var(--space-md)}.add-node-modal__row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.add-node-modal__fieldset{border:1px solid var(--border);border-radius:var(--radius-sm);padding:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.add-node-modal__fieldset legend{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .625);padding:0 var(--space-xs)}.add-node-modal__storage-toggle{border:1px solid var(--border);border-radius:var(--radius-sm);padding:var(--space-sm)}.add-node-modal__advanced-btn{align-self:flex-start}.add-node-modal__advanced{border:1px dashed var(--border);border-radius:var(--radius-sm);padding:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.add-node-modal__textarea{min-height:calc(var(--space-2xl) * 2.25);resize:vertical;font-family:var(--font-mono)}.add-node-modal__description{font-size:calc(var(--space-sm) + var(--space-xs) * .625);color:var(--text-muted);margin-bottom:var(--space-sm);padding:0}.add-node-modal__field{display:flex;flex-direction:column;gap:var(--space-xs)}.add-node-modal__field>span{font-size:calc(var(--space-sm) + var(--space-xs) * .625);font-weight:600;color:var(--text-muted)}.add-node-modal__field .input{width:100%;padding:var(--space-sm) var(--space-md);font-size:calc(var(--space-md) + var(--space-xs) * .5)}.add-node-modal__field .input:focus-visible{border-color:var(--accent);box-shadow:var(--focus-ring-strong)}.add-node-modal__field .input[aria-invalid=true]{border-color:var(--color-error);background:color-mix(in srgb,var(--color-error) 5%,var(--surface))}.add-node-modal__field .input[aria-invalid=true]:focus{box-shadow:var(--glow-danger)}.add-node-modal__hint{font-size:calc(var(--space-sm) + var(--space-xs) * .375);color:var(--text-dim);margin-top:calc(var(--space-xs) / 2)}.add-node-modal__error{margin-top:calc(var(--space-xs) / 2)}.add-node-modal__type-toggle{display:flex;gap:0;border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;background:var(--surface)}.add-node-modal__type-btn{flex:1;padding:calc(var(--space-sm) + var(--space-xs) / 2) var(--space-lg);border:none;background:transparent;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .625);font-weight:500;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.add-node-modal__type-btn:hover:not(:disabled){background:color-mix(in srgb,var(--bg) 50%,var(--surface))}.add-node-modal__type-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);z-index:1}.add-node-modal__type-btn.active{background:var(--accent);color:var(--bg)}.add-node-modal__type-btn:disabled{opacity:.6;cursor:not-allowed}.add-node-modal__remote-fields{display:grid;gap:var(--space-sm)}.add-node-modal__discovery-actions{display:flex;flex-direction:column;gap:var(--space-xs)}.add-node-modal__discovery-state{font-size:calc(var(--space-sm) + var(--space-xs) * .375);color:var(--color-success)}.add-node-modal__discovered-list{display:flex;flex-direction:column;gap:var(--space-xs)}.add-node-modal__discovered-card{padding:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-xs)}.add-node-modal__discovered-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.add-node-modal__projects{display:flex;flex-direction:column;gap:var(--space-sm)}.add-node-modal__projects-title{margin:0;font-size:calc(var(--space-md) + var(--space-xs) * .5)}.add-node-modal__project-list{display:flex;flex-direction:column;gap:var(--space-sm)}.add-node-modal__project-card{padding:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.add-node-modal__project-toggle{margin:0}@media(max-width:768px){.add-node-modal{width:calc(100vw - (var(--space-md) * 2))}.add-node-modal__type-toggle{width:100%}.add-node-modal__type-btn{flex:1;padding:var(--space-md) var(--space-lg)}.add-node-modal__field input{min-height:calc(var(--space-2xl) + var(--space-md));font-size:calc(var(--space-md) + var(--space-xs) * .5)}.add-node-modal__row{grid-template-columns:1fr}.add-node-modal__project-card{padding:var(--space-md)}.add-node-modal__discovered-row{flex-direction:column;align-items:flex-start}}.docker-tls-config{display:flex;flex-direction:column;gap:var(--space-md)}.docker-tls-config__fields{display:grid;gap:var(--space-md)}.docker-tls-config__field{display:flex;flex-direction:column;gap:var(--space-xs)}.docker-tls-config__field label{color:var(--text-muted)}@media(max-width:768px){.docker-tls-config .input{min-height:calc(var(--mobile-nav-height) - var(--space-sm))}}.docker-target-selector{display:flex;flex-direction:column;gap:var(--space-md)}.docker-target-selector__modes{display:flex;gap:var(--space-sm);flex-wrap:wrap}.docker-target-selector__mode-active{border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.docker-target-selector__panel{display:grid;gap:var(--space-md)}.docker-target-selector__field{display:flex;flex-direction:column;gap:var(--space-xs)}.docker-target-selector__field label{color:var(--text-muted)}.docker-target-selector__context-row{display:grid;gap:var(--space-sm);grid-template-columns:minmax(0,1fr) auto;align-items:center}.docker-target-selector__status{color:var(--text-muted)}.docker-target-selector__success{color:var(--color-success)}.docker-target-selector__error{color:var(--color-error)}@media(max-width:768px){.docker-target-selector__modes .btn{min-height:calc(var(--mobile-nav-height) - var(--space-sm))}}.docker-onboarding{width:min(calc(var(--space-2xl) * 22.5),calc(100vw - (var(--space-lg) * 2)))}.docker-onboarding__body{display:flex;flex-direction:column;gap:var(--space-md)}.docker-onboarding__section{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.docker-onboarding__section-title{margin:0;display:flex;align-items:center;gap:var(--space-sm);font-size:calc(var(--space-md) + var(--space-xs) / 2)}.docker-onboarding__field{display:flex;flex-direction:column;gap:var(--space-xs)}.docker-onboarding__inline-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.docker-onboarding__radio-group{display:flex;align-items:center;gap:var(--space-md);flex-wrap:wrap}.docker-onboarding__type-toggle{display:flex;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}.docker-onboarding__type-btn{flex:1;border:none;background:var(--surface);color:var(--text);padding:var(--space-sm) var(--space-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.docker-onboarding__type-btn+.docker-onboarding__type-btn{border-left:1px solid var(--border)}.docker-onboarding__type-btn.is-active{background:var(--todo);color:var(--bg)}.docker-onboarding__type-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);position:relative;z-index:1}.docker-onboarding__checkbox-group{display:flex;flex-direction:column;gap:var(--space-xs)}.docker-onboarding__kv-list{display:flex;flex-direction:column;gap:var(--space-sm)}.docker-onboarding__kv-list h5{margin:0;font-size:calc(var(--space-sm) + var(--space-xs))}.docker-onboarding__kv-row{display:grid;gap:var(--space-sm);align-items:center}.docker-onboarding__kv-row--env{grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto}.docker-onboarding__kv-row--mount{grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto auto}.docker-onboarding__kv-add{align-self:flex-start}.docker-onboarding__advanced-toggle{border:none;background:none;color:var(--text);padding:var(--space-xs);margin:calc(var(--space-xs) * -1);border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;font-size:calc(var(--space-md) + var(--space-xs) / 2);font-weight:600}.docker-onboarding__advanced-toggle:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.docker-onboarding__advanced-toggle svg{transition:transform var(--transition-fast)}.docker-onboarding__advanced-toggle.is-expanded svg{transform:rotate(180deg)}.docker-onboarding__advanced-content{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--transition-fast)}.docker-onboarding__advanced-content>div{overflow:hidden;display:flex;flex-direction:column;gap:var(--space-sm)}.docker-onboarding__advanced-content.is-expanded{grid-template-rows:1fr}.docker-onboarding__tls-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.docker-onboarding__tls-fields .docker-onboarding__field:first-child{grid-column:1 / -1}@media(max-width:768px){.docker-onboarding{width:calc(100vw - (var(--space-md) * 2))}.docker-onboarding__inline-fields,.docker-onboarding__tls-fields,.docker-onboarding__kv-row{grid-template-columns:1fr}.docker-onboarding .input,.docker-onboarding .select,.docker-onboarding .btn{min-height:calc(var(--space-2xl) + var(--space-md))}.docker-onboarding__advanced-content{transition:none}}.settings-sync-log{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-sync-log__header{display:flex;align-items:center;gap:var(--space-xs);cursor:pointer;padding:var(--space-xs) 0;border-radius:var(--radius-sm);border:none;background:transparent;color:var(--text);font:inherit;text-align:left;transition:background-color var(--transition-fast)}.settings-sync-log__header:hover{background:var(--surface-hover)}.settings-sync-log__header:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);background:var(--surface-hover)}.settings-sync-log__chevron{transform:rotate(0);transition:transform var(--transition-fast)}.settings-sync-log__chevron--expanded{transform:rotate(180deg)}.settings-sync-log__filters{display:flex;gap:var(--space-sm);align-items:center;flex-wrap:wrap}.settings-sync-log__filters label{display:flex;align-items:center;gap:var(--space-xs);font-size:var(--font-size-xs);color:var(--text-muted)}.settings-sync-log__filters select{font-size:var(--font-size-xs);padding:4px 8px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text)}.settings-sync-log__filters select:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.settings-sync-log__list{display:flex;flex-direction:column}.settings-sync-log__entry{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-xs) 0;border-bottom:1px solid var(--border)}.settings-sync-log__entry:last-child{border-bottom:none}.settings-sync-log__entry-timestamp{font-size:var(--font-size-xs);color:var(--text-muted);min-width:140px}.settings-sync-log__entry-direction{display:flex;align-items:center;color:var(--text-muted)}.settings-sync-log__entry-result{display:inline-flex;padding:2px 8px;border-radius:999px;font-size:var(--font-size-2xs);font-weight:500}.settings-sync-log__badge--success{background:color-mix(in srgb,var(--color-success, #2da44e) 14%,transparent);color:var(--color-success, #2da44e)}.settings-sync-log__badge--conflict{background:color-mix(in srgb,var(--color-warning, #d29922) 14%,transparent);color:var(--color-warning, #d29922)}.settings-sync-log__badge--error{background:color-mix(in srgb,var(--color-error, #cf222e) 14%,transparent);color:var(--color-error, #cf222e)}.settings-sync-log__entry-node{font-weight:500;font-size:var(--font-size-xs)}.settings-sync-log__entry-details{font-size:var(--font-size-xs);color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.settings-sync-log__empty{text-align:center;color:var(--text-muted);padding:var(--space-md);font-size:var(--font-size-sm)}.node-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;background:color-mix(in srgb,var(--accent) 14%,transparent);border:1px solid color-mix(in srgb,var(--accent) 36%,transparent);color:var(--text-muted);font-size:var(--font-size-2xs);width:fit-content;margin-top:4px}@media(max-width:768px){.settings-sync-conflict-modal__diff-panel{grid-template-columns:1fr}}.settings-sync-conflict-modal{max-width:860px;width:min(860px,calc(100vw - 32px))}.settings-sync-conflict-modal__conflict-list{display:flex;flex-direction:column;gap:var(--space-md);max-height:min(50vh,400px);overflow-y:auto}.settings-sync-conflict-modal__conflict-item{border:1px solid var(--border);border-radius:var(--radius);padding:var(--space-md)}.settings-sync-conflict-modal__key{font-weight:600;font-family:monospace;margin-bottom:var(--space-sm)}.settings-sync-conflict-modal__diff-panel{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-sm);margin-bottom:var(--space-sm)}.settings-sync-conflict-modal__diff-side{border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}.settings-sync-conflict-modal__diff-label{font-size:var(--font-size-xs);color:var(--text-muted);padding:4px 8px;border-bottom:1px solid var(--border);background:var(--surface)}.settings-sync-conflict-modal__diff-content{padding:var(--space-xs) var(--space-sm);white-space:pre;font-family:monospace;font-size:var(--font-size-xs);line-height:1.5;overflow-x:auto}.settings-sync-conflict-modal__resolution{display:flex;gap:var(--space-md);align-items:center}.settings-sync-conflict-modal__resolution label{display:flex;align-items:center;gap:var(--space-xs);cursor:pointer}.settings-sync-conflict-modal__resolution input[type=radio]{cursor:pointer}.settings-sync-conflict-modal__manual-input{width:100%;font-family:monospace;font-size:var(--font-size-xs);min-height:80px;margin-top:var(--space-xs);padding:var(--space-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);resize:vertical}.settings-sync-conflict-modal__manual-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.settings-sync-conflict-modal__bulk-actions{display:flex;gap:var(--space-xs);padding-top:var(--space-sm);border-top:1px solid var(--border)}.settings-sync-conflict-modal__footer{display:flex;justify-content:flex-end;gap:var(--space-xs)}.node-detail-modal{max-width:calc(var(--space-lg) * 53.75);width:min(calc(var(--space-lg) * 53.75),calc(100vw - (var(--space-lg) * 2)))}.node-detail-modal__body{display:flex;flex-direction:column;gap:var(--space-md);max-height:min(72vh,calc(var(--space-lg) * 42.5));overflow-y:auto}.node-detail-modal__section{border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md)}.node-detail-modal__section h4{margin:0 0 var(--space-sm) 0}.node-detail-modal__section-header{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-sm)}.node-detail-modal__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.node-detail-modal__field{display:flex;flex-direction:column;gap:var(--space-xs)}.node-detail-modal__field--full{grid-column:span 2}.node-detail-modal__field span{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.node-detail-modal__edit-actions{margin-top:var(--space-sm);display:flex;gap:var(--space-xs)}.node-detail-modal__project-list{margin:0;padding-left:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-sm)}.node-detail-modal__project-item{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.node-detail-modal__project-item code{color:var(--text-muted)}.node-detail-modal__empty{margin:0;color:var(--text-muted)}.node-detail-modal__health-row{display:flex;flex-wrap:wrap;gap:var(--space-md)}.node-detail-modal__actions{justify-content:space-between}.node-detail-modal__docker-config{display:flex;flex-direction:column;gap:var(--space-sm)}.node-detail-modal__docker-toggle{align-self:flex-start}.node-detail-modal__docker-toggle-icon--expanded{transform:rotate(180deg)}.node-detail-modal__docker-config-content{display:flex;flex-direction:column;gap:var(--space-sm)}.node-detail-modal__docker-list{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.node-detail-modal__docker-row{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:var(--space-sm)}.node-detail-modal__docker-stack{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.node-detail-modal__checkbox{display:flex;align-items:center;gap:var(--space-sm);color:var(--text-muted)}.node-detail-modal__docker-meta{display:flex;flex-wrap:wrap;gap:var(--space-sm);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.node-detail-modal__docker-recreate{color:var(--color-warning)}.node-detail-modal__docker-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);margin-top:var(--space-sm)}.node-detail-modal__textarea{min-height:calc(var(--space-2xl) * 2.25);resize:vertical;font-family:var(--font-mono)}.node-detail-modal__sync-status{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm);margin-bottom:var(--space-sm)}.node-detail-modal__sync-dot{width:calc(var(--space-sm) + var(--space-xs) / 2);height:calc(var(--space-sm) + var(--space-xs) / 2);border-radius:50%;flex-shrink:0}.node-detail-modal__sync-dot--synced{background:var(--color-success)}.node-detail-modal__sync-dot--diff,.node-detail-modal__sync-dot--pending{background:var(--color-warning)}.node-detail-modal__sync-dot--error{background:var(--color-error)}.node-detail-modal__sync-dot--never{background:var(--text-muted)}.node-detail-modal__sync-diff{color:var(--color-warning);font-size:calc(var(--space-sm) + var(--space-xs))}.node-detail-modal__sync-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-sm)}.node-detail-modal__sync-error{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);margin-top:var(--space-sm);padding:var(--space-sm);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid color-mix(in srgb,var(--color-error) 30%,transparent);border-radius:var(--radius-sm);color:var(--color-error);font-size:calc(var(--space-sm) + var(--space-xs))}.node-detail-modal__sync-error-dismiss{background:transparent;border:none;color:var(--color-error);cursor:pointer;padding:calc(var(--space-xs) / 2);display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm)}.node-detail-modal__sync-error-dismiss:hover{background:color-mix(in srgb,var(--color-error) 20%,transparent)}.node-detail-modal__sync-error-dismiss:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);background:color-mix(in srgb,var(--color-error) 20%,transparent)}.docker-management{display:flex;flex-direction:column;gap:var(--space-md)}.docker-management__status-card{display:flex;flex-direction:column;gap:var(--space-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md)}.docker-management__status-row{display:inline-flex;align-items:center;gap:var(--space-sm)}.docker-management__status-dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%}.docker-management__status-dot--success{background:var(--color-success)}.docker-management__status-dot--warning{background:var(--color-warning)}.docker-management__status-dot--error{background:var(--color-error)}.docker-management__status-meta{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));display:flex;gap:var(--space-md);flex-wrap:wrap}.docker-management__actions{display:flex;flex-wrap:wrap;gap:var(--space-sm)}.docker-management__info-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.docker-management__log-viewer{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md)}.docker-management__log-viewer-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-sm)}.docker-management__log-viewer pre{margin:0;max-height:calc(var(--space-2xl) * 9.375);overflow-y:auto;font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text);white-space:pre-wrap}.docker-management__env-list{margin:var(--space-sm) 0 0}.docker-management__env-list div{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,2fr);gap:var(--space-sm);padding:var(--space-xs) 0}.docker-management__env-list dt{color:var(--text-muted);font-family:var(--font-mono)}.docker-management__env-list dd{margin:0;font-family:var(--font-mono);word-break:break-all}.docker-management__mounts-list{margin:var(--space-sm) 0 0;padding-left:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-sm)}.docker-management__mounts-list li{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}@media(max-width:768px){.node-detail-modal__grid,.node-detail-modal__docker-grid{grid-template-columns:1fr}.node-detail-modal__field--full{grid-column:span 1}.docker-management__actions{flex-direction:column}.docker-management__actions .btn{width:100%;justify-content:center}.docker-management__info-grid,.node-detail-modal__docker-row{grid-template-columns:1fr}.node-detail-modal__docker-toggle,.node-detail-modal__docker-config-content .btn{min-height:calc(var(--space-lg) * 2.25)}.docker-management__env-list div{grid-template-columns:1fr}.docker-management__mounts-list li{flex-direction:column;align-items:flex-start}.docker-management__log-viewer pre{max-height:calc(var(--space-2xl) * 6.25)}}.cc-area[data-testid=cc-area-funnel] .cc-area-section+.cc-area-section{margin-top:var(--space-lg)}.command-center{display:flex;flex:1;flex-direction:column;gap:0;min-height:0;inline-size:100%;padding:0}.cc-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;gap:var(--space-md)}.cc-header{box-sizing:border-box;min-block-size:var(--view-header-min-height);padding:var(--space-lg) var(--space-xl);background:var(--surface)}@media(min-width:769px)and (min-height:481px){.cc-header{height:var(--view-header-min-height)}.cc-header>.cc-date-range{max-height:var(--view-header-content-row)}.cc-header>.cc-date-range .cc-date-range-trigger{min-height:0;max-height:var(--view-header-content-row);white-space:nowrap}}.cc-title{display:flex;align-items:center;gap:var(--space-sm);margin:0;font-size:1.125rem;font-weight:600;color:var(--text)}.cc-title svg{flex-shrink:0;color:var(--todo)}.cc-tablist{display:flex;flex-shrink:0;flex-wrap:wrap;gap:var(--space-xs);padding:var(--space-md) var(--space-xl) 0;border-bottom:1px solid var(--border-subtle)}.cc-tab{appearance:none;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);padding:var(--space-sm) var(--space-md);cursor:pointer;font-size:.8125rem;transition:color var(--transition-fast),border-color var(--transition-fast)}.cc-tab:hover{color:var(--text)}.cc-tab.active{color:var(--text);border-bottom-color:var(--accent)}.cc-tabpanel{flex:1;min-height:0;min-inline-size:0;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;outline:none;padding:var(--space-lg) var(--space-xl) var(--space-xl);-webkit-overflow-scrolling:touch}.cc-system-tab{display:flex;flex-direction:column;gap:var(--space-lg);min-inline-size:0}@media(max-width:768px){.cc-tabpanel{padding-bottom:calc(var(--space-lg) + env(safe-area-inset-bottom,0) + var(--standalone-bottom-gap))}.cc-system-tab{gap:var(--space-lg)}}.cc-overview{min-inline-size:0;display:flex;flex-direction:column;gap:var(--space-lg)}.cc-verification-requests{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md)}.cc-verification-requests__item{display:grid;grid-template-columns:minmax(calc(var(--space-2xl) * 2),auto) minmax(0,1fr);gap:var(--space-sm);align-items:start}.cc-verification-requests__task{padding:var(--space-sm) 0;color:var(--text-muted);font-size:.8125rem;font-variant-numeric:tabular-nums}@media(max-width:768px){.cc-verification-requests__item{grid-template-columns:1fr}}.cc-stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,calc(var(--space-2xl) * 5)),1fr));gap:var(--space-md)}.cc-stat-card{container-type:inline-size;display:flex;flex-direction:column;gap:var(--space-sm);min-inline-size:0;padding:var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:var(--surface-1)}.cc-stat-label{font-size:.8125rem;color:var(--text-muted)}.cc-stat-value{max-width:100%;min-width:0;overflow:hidden;white-space:nowrap;font-size:clamp(.95rem,16cqi,2.4rem);line-height:1.1;font-variant-numeric:tabular-nums;color:var(--text)}.cc-stat-card--gauge{align-items:center;text-align:center}.cc-github-backfill-actions,.cc-productivity-backfill-actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.cc-github-backfill-status,.cc-productivity-backfill-status{display:flex;flex-direction:column;gap:var(--space-xs);color:var(--text-muted);font-size:.75rem}.cc-github-backfill-status--error,.cc-productivity-backfill-status--error{color:var(--color-error)}.cc-github-backfill-status--warning,.cc-productivity-backfill-status--warning{color:var(--color-warning)}@media(max-width:768px){.cc-github-backfill-actions,.cc-productivity-backfill-actions{align-items:stretch;flex-direction:column}.cc-github-backfill-actions .btn,.cc-productivity-backfill-actions .btn{justify-content:center;inline-size:100%}}.cc-live-strip{position:relative;display:grid;grid-template-columns:minmax(calc(var(--space-2xl) * 5),1fr) minmax(calc(var(--space-2xl) * 8),2fr) minmax(calc(var(--space-2xl) * 5),1fr);align-items:center;gap:var(--space-md);padding:var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:linear-gradient(135deg,color-mix(in srgb,var(--accent) 7%,transparent),transparent),var(--surface-1);box-shadow:0 0 var(--space-lg) color-mix(in srgb,var(--accent) 9%,transparent);overflow:hidden;font-size:.8125rem}.cc-live-strip:before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--accent) 10%,transparent),transparent);opacity:.25;transform:translate(-100%);animation:cc-live-signal-sweep calc(var(--duration-slow) * 8) linear infinite;pointer-events:none}.cc-live-strip-heading,.cc-live-strip-metrics,.cc-live-trend{min-inline-size:0;position:relative;z-index:1}.cc-live-strip-heading{display:flex;align-items:center;gap:var(--space-sm)}.cc-live-strip-label{color:var(--text);font-weight:600}.cc-live-strip-metrics{min-inline-size:0;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--space-sm)}.cc-live-metric{container-type:inline-size;min-inline-size:0;display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--surface-2) 70%,transparent);animation:cc-live-signal-pulse calc(var(--duration-slow) * 6) ease-in-out infinite}.cc-live-metric-value{max-width:100%;min-width:0;overflow:hidden;white-space:nowrap;color:var(--text);font-size:clamp(.75rem,6cqi,1.125rem);font-weight:700;font-variant-numeric:tabular-nums}.cc-token-count-live{animation:cc-token-count-pop var(--duration-normal) ease-out both}@keyframes cc-token-count-pop{0%{transform:translateY(var(--space-xs));opacity:.7}to{transform:translateY(0);opacity:1}}.cc-live-metric-label,.cc-live-trend-label{color:var(--text-muted);font-size:.75rem;text-transform:uppercase;letter-spacing:.04em}.cc-live-trend{min-inline-size:0;display:flex;flex-direction:column;gap:var(--space-sm)}.cc-live-trend .cc-sparkline{block-size:calc(var(--space-2xl) + var(--space-sm))}.cc-live-trend .cc-sparkline-bar{box-shadow:0 0 var(--space-sm) color-mix(in srgb,var(--accent) 28%,transparent);animation:cc-live-signal-pulse calc(var(--duration-slow) * 5) ease-in-out infinite}@keyframes cc-live-signal-sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes cc-live-signal-pulse{0%,to{opacity:.78}50%{opacity:1}}@media(prefers-reduced-motion:reduce){.cc-live-strip:before,.cc-live-metric,.cc-live-trend .cc-sparkline-bar,.cc-token-count-live{animation:none}}.cc-overview-charts{min-inline-size:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md);align-items:stretch}.cc-overview-chart-card{min-inline-size:0;position:relative;display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:linear-gradient(145deg,color-mix(in srgb,var(--accent) 6%,transparent),transparent),var(--surface-1);box-shadow:0 0 var(--space-lg) color-mix(in srgb,var(--accent) 7%,transparent);overflow:hidden;animation:cc-overview-chart-rise var(--duration-normal) ease-out both}.cc-overview-chart-card--trend{grid-column:1 / -1}.cc-overview-chart-card:before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--accent) 8%,transparent),transparent);opacity:0;pointer-events:none;animation:cc-overview-chart-sheen calc(var(--duration-slow) * 7) ease-in-out infinite}.cc-overview-chart-header{position:relative;z-index:1;display:flex;flex-direction:column;gap:var(--space-xs)}.cc-overview-chart-header p{margin:0;color:var(--text-muted);font-size:.8125rem}.cc-overview-chart-card .cc-bar-chart,.cc-overview-chart-card .cc-sparkline,.cc-overview-chart-card .cc-recharts-chart,.cc-overview-chart-card .cc-recharts-empty{position:relative;z-index:1}.cc-overview-chart-card .cc-recharts-chart,.cc-overview-chart-card .cc-recharts-empty{inline-size:100%;block-size:calc(var(--space-2xl) * 7 + var(--space-lg));min-inline-size:0}.cc-overview-chart-card .cc-sparkline{block-size:calc(var(--space-2xl) * 2)}.cc-overview-chart-card .cc-bar-fill,.cc-overview-chart-card .cc-sparkline-bar{box-shadow:0 0 var(--space-sm) color-mix(in srgb,var(--accent) 30%,transparent)}@keyframes cc-overview-chart-rise{0%{opacity:0;transform:translateY(var(--space-sm))}to{opacity:1;transform:translateY(0)}}@keyframes cc-overview-chart-sheen{0%{opacity:0;transform:translate(-100%)}45%,55%{opacity:.35}to{opacity:0;transform:translate(100%)}}@media(prefers-reduced-motion:reduce){.cc-overview-chart-card,.cc-overview-chart-card:before{animation:none}}@media(min-width:769px)and (max-width:1024px){.command-center{flex:1;min-block-size:0;overflow:hidden}.cc-tabpanel{flex:1;min-block-size:0;overflow-x:hidden;overflow-y:auto}.cc-live-strip,.cc-overview-charts,.cc-team-chart-grid{min-inline-size:0;grid-template-columns:minmax(0,1fr)}.cc-live-strip-metrics{min-inline-size:0;grid-template-columns:repeat(2,minmax(0,1fr))}.cc-overview-chart-card--trend,.cc-team-spark-panel{grid-column:auto}.cc-stat-grid,.cc-area .cc-stat-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,calc(var(--space-2xl) * 5)),1fr))}}@media(max-width:768px){.cc-stat-grid{min-inline-size:0;grid-template-columns:minmax(0,1fr)}.cc-live-strip{grid-template-columns:1fr}.cc-live-strip-metrics,.cc-overview-charts{min-inline-size:0;grid-template-columns:1fr}.cc-overview-chart-card--trend{grid-column:auto}}.cc-loading,.cc-error,.cc-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl);color:var(--text-muted);text-align:center}.cc-error{color:var(--color-error)}.cc-loading .cc-chart-skeleton{block-size:var(--space-lg);border-radius:var(--radius-sm);background:var(--surface-2);animation:cc-shell-pulse var(--duration-slow) ease-in-out infinite}@keyframes cc-shell-pulse{0%,to{opacity:.4}50%{opacity:.9}}.cc-overview-engine-panel{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md);border:1px solid var(--border-subtle);border-radius:var(--radius-md);background:var(--surface-1)}.cc-overview-engine-panel-header{display:flex;align-items:center;gap:var(--space-sm);color:var(--text)}.cc-overview-engine-panel-title{font-size:.9375rem;font-weight:600}.cc-overview-engine-panel-status{margin:0;font-size:.8125rem;color:var(--text-muted)}.cc-overview-engine-nav{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-lg)}.cc-overview-engine-nav-btn{flex:1 1 auto;justify-content:center}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a as $,w as T,db as ar,bh as ir,aW as Or,c$ as le,L as ge,aI as Fr,dc as $r,dd as zr,de as Hr,C as Br,a$ as or,df as me,dg as Vr,dh as Wr,di as Ir,V as qr,dj as Jr,bV as Xr,bY as Kr,dk as Yr,p as We,X as Gr,aR as Qr,R as Zr}from"./index-CtYRoouR.js";import{u as we}from"./vendor-i18n-Duky4gdQ.js";import{S as lr}from"./shield-alert-BX4WRJOv.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const t=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",s=t==="root"?".":t,i=e.name,a=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():s,u=typeof e.confidence=="number"?e.confidence:1,f=t==="root"?"root":t,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:i,packagePath:a,confidence:u,cwd:s,source:t,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${i} (${f})`}}function se(e){const t=e.status,s=t==="starting"||t==="running"||t==="failed"||t==="stopped"?t:"stopped",i=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,a=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:s,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:i,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:i,detectedPort:e.detectedPort,manualPreviewUrl:a,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:a,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function et(e,t){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:t,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function rt(e){const s=(Array.isArray(e.lines)?e.lines:[]).map((i,a)=>et(i,a+1));return{lines:s,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:s.length}}function tt(e,t){const s=typeof t.maxLines=="number"&&Number.isFinite(t.maxLines)?Math.max(1,Math.floor(t.maxLines)):100,i=typeof t.offset=="number"&&Number.isFinite(t.offset)?Math.max(0,Math.floor(t.offset)):0,a=typeof t.lastEventId=="number"&&Number.isFinite(t.lastEventId)?Math.max(0,Math.floor(t.lastEventId)):null,u=e.length,f=e.map((N,z)=>({id:z+1,text:N,stream:"stdout",timestamp:""}));if(a!==null)return{lines:f.filter(N=>N.id>a).slice(0,s),totalLines:u};const m=Math.max(u-i,0),C=Math.max(m-s,0);return{lines:f.slice(C,m),totalLines:u}}function qe(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function cr(e){try{const t=await $(T("/dev-server/candidates",e));return qe(t)}catch(t){if(t instanceof Error&&/\/dev-server\/candidates/.test(t.message)){const s=await $(T("/dev-server/detect",e));return qe(s)}throw t}}function be(e){return $(T("/dev-server/status",e)).then(se)}async function Ee(e={},t){const s=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&s.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&s.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&s.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const i=s.size>0?`?${s.toString()}`:"";try{const a=await $(T(`/dev-server/logs/history${i}`,t));return rt(a)}catch(a){if(a instanceof Error&&/\/dev-server\/logs\/history/.test(a.message)){const u=await be(t);return tt(u.logs,e)}throw a}}function dr(e,t){const s=e.cwd??e.packagePath??".",i=e.scriptName;return $(T("/dev-server/start",t),{method:"POST",body:JSON.stringify({command:e.command,scriptName:i,scriptId:i,cwd:s,packagePath:e.packagePath})}).then(se)}function vr(e){return $(T("/dev-server/stop",e),{method:"POST"}).then(se)}function ur(e){return $(T("/dev-server/restart",e),{method:"POST"}).then(se)}async function mr(e,t){const s=typeof e=="string"?{url:e}:e;try{const i=await $(T("/dev-server/preview-url",t),{method:"POST",body:JSON.stringify(s)});return se(i)}catch(i){if(i instanceof Error&&/\/dev-server\/preview-url/.test(i.message)){const a=await $(T("/dev-server/preview-url",t),{method:"PUT",body:JSON.stringify(s)});return se(a)}throw i}}function Pe(e){return ar(T("/dev-server/logs/stream",e))}async function Me(e){try{return(await $(T("/devserver",e))).sessions??[]}catch{try{const t=await be(e);return[{config:{id:t.id??"default",name:t.name??"Dev Server",command:t.command??"",cwd:t.cwd??"."},status:t.status,runtime:t.pid?{pid:t.pid,startedAt:t.startedAt??new Date().toISOString(),exitCode:t.exitCode??void 0,previewUrl:t.previewUrl}:void 0,previewUrl:t.previewUrl??t.detectedUrl??void 0,logHistory:(t.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function pr(e,t){try{return await $(T(`/devserver/${encodeURIComponent(e)}`,t))}catch{try{const s=await be(t);return!e||e==="default"||e===s.id?{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Je(e,t){try{return await $(T(`/devserver/${encodeURIComponent(e)}/start`,t),{method:"POST"})}catch{const s=await dr({command:""},t);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,t){try{return await $(T(`/devserver/${encodeURIComponent(e)}/stop`,t),{method:"POST"})}catch{const s=await vr(t);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Ke(e,t){try{return await $(T(`/devserver/${encodeURIComponent(e)}/restart`,t),{method:"POST"})}catch{const s=await ur(t);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Ye(e,t,s){try{const i=await $(T(`/devserver/${encodeURIComponent(e)}/preview`,s),{method:"POST",body:JSON.stringify({url:t})});return{url:i.url??null,source:i.source??null}}catch{const i=await mr({url:t},s);return{url:i.previewUrl??i.manualUrl??null,source:"manual"}}}async function Le(e){try{return(await $(T("/devserver/detect",e))).candidates??[]}catch{try{return(await cr(e)).map(s=>({name:s.name,command:s.command,cwd:s.cwd,scriptName:s.scriptName,packagePath:s.packagePath}))}catch{return[]}}}function st(e,t){return ar(T(`/devserver/${encodeURIComponent(e)}/logs/stream`,t))}const _e=500,nt=3e3;function J(e){return e instanceof Error?e.message:String(e)}function fr(e){return e.length<=_e?e:e.slice(-_e)}function je(e,t){return fr([...e,t])}function te(e){try{return JSON.parse(e)}catch{return null}}function pe(e){const t=e.text??"";return e.stream==="stderr"?`[stderr] ${t}`:t}function at(e){return e?.previewUrl??null}async function Ge(e){return be(e)}async function Qe(e,t){return dr(e,t)}async function it(e){return vr(e)}async function ot(e){return ur(e)}async function Ze(e){return cr(e)}function K(e){try{return e()}catch{return null}}function Re(){return typeof K(()=>Me)=="function"&&typeof K(()=>pr)=="function"}function ee(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}function lt(e){const{t}=we("app"),[s,i]=n.useState(null),[a,u]=n.useState([]),[f,m]=n.useState([]),[C,N]=n.useState([]),[z,L]=n.useState(!0),[E,h]=n.useState(null),v=n.useRef(0),[g,k]=n.useState(null),A=n.useCallback(d=>{if(i(d),d?.logHistory){const l=d.logHistory.slice(-_e).map(pe);m(l)}},[]),U=n.useCallback(async()=>{const d=v.current;try{if(Re())if(g){const l=await pr(g,e);if(v.current!==d)return;A(l)}else{const l=await Me(e);if(v.current!==d)return;u(l),l.length>0&&(k(l[0].config.id),A(l[0]))}else{const l=await Ge(e);if(v.current!==d)return;const b=ee(l);u([b]),A(b)}h(null)}catch(l){if(v.current!==d)return;h(J(l))}},[A,e,g]);n.useEffect(()=>{v.current+=1;const d=v.current;i(null),u([]),m([]),N([]),L(!0),h(null),k(null),(async()=>{try{const[b,p]=await Promise.allSettled([Re()?Me(e):Ge(e).then(x=>[ee(x)]),typeof K(()=>Le)=="function"?Le(e):Ze(e).then(x=>x.map(R=>({name:R.name,command:R.command,cwd:R.cwd,scriptName:R.scriptName,packagePath:R.packagePath})))]);if(v.current!==d)return;let w=null;if(b.status==="fulfilled"){const x=b.value;if(u(x),x.length>0){const R=x[0];Re()&&k(R.config.id),A(R)}}else w=J(b.reason);p.status==="fulfilled"&&N(p.value),w&&h(w)}catch(b){if(v.current!==d)return;h(J(b))}finally{v.current===d&&L(!1)}})()},[A,e]),n.useEffect(()=>{const d=g?st(g,e):typeof K(()=>Pe)=="function"?Pe(e):null;if(!d)return;const l=v.current,b=ir(d,{events:{history:p=>{if(v.current!==l)return;const w=te(p.data);if(w?.lines){const x=w.lines.map(pe);m(fr(x))}},log:p=>{if(v.current!==l)return;const w=te(p.data);if(w){const x=typeof w.line=="string"?w.line:pe(w);m(R=>je(R,x))}},"dev-server:log":p=>{if(v.current!==l)return;const w=te(p.data);if(w){const x=typeof w.line=="string"?w.line:pe(w);m(R=>je(R,x))}},"dev-server:output":p=>{if(v.current!==l)return;const w=te(p.data);w?.line&&m(x=>je(x,w.line))},status:p=>{if(v.current!==l)return;const w=te(p.data),x=w?.status;x&&i(R=>R&&{...R,status:x,runtime:w.pid?{...R.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:R.runtime})},"dev-server:status":p=>{if(v.current!==l)return;const w=te(p.data);if(w?.status){const x=ee(w);i(x),u([x])}},stopped:()=>{v.current},failed:()=>{v.current}},onReconnect:()=>{v.current===l&&U()},onError:()=>{v.current===l&&h(p=>p??t("devserver.lostConnection","Lost log stream connection."))}});return()=>{b()}},[e,U,g]);const O=s?.status==="running"||s?.status==="starting";Or(U,nt,{enabled:O});const j=n.useCallback(async(d,l)=>{v.current+=1;const b=v.current;try{let p;const w=typeof l=="string"&&l.length>0,x=s?.config?.cwd??".";if(!(w&&l!==x)&&g&&typeof K(()=>Je)=="function")p=await Je(g,e);else{const ne=await Qe({command:d,cwd:l},e);p=ee(ne)}if(v.current!==b)return;i(p),h(null)}catch(p){if(v.current!==b)return;throw h(J(p)),p}},[e,s?.config?.cwd,g]),H=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;if(g&&typeof K(()=>Xe)=="function")l=await Xe(g,e);else{const b=await it(e);l=ee(b)}if(v.current!==d)return;i(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e,g]),I=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;if(g&&typeof K(()=>Ke)=="function")l=await Ke(g,e);else{const b=await ot(e);l=ee(b)}if(v.current!==d)return;i(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e,g]),B=n.useCallback(async d=>{v.current+=1;const l=v.current;try{let b;if(g&&typeof K(()=>Ye)=="function")b=await Ye(g,d,e);else{const p=await mr({url:d},e);b={url:p.manualUrl??p.previewUrl??p.detectedUrl??null,source:p.manualUrl?"manual":"auto"}}if(v.current!==l)return;i(p=>p?{...p,previewUrl:b.url??void 0}:null),h(null)}catch(b){if(v.current!==l)return;throw h(J(b)),b}},[e,g]),P=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;try{l=await Le(e)}catch{l=(await Ze(e)).map(p=>({name:p.name,command:p.command,cwd:p.cwd,scriptName:p.scriptName,packagePath:p.packagePath}))}if(v.current!==d)return;N(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e]),V=n.useCallback(async(d,l)=>{if(typeof d!="string"&&!g)try{const w=d,x=await Qe({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),R=ee(x);i(R),u([R]),h(null);return}catch(w){throw h(J(w)),w}const b=typeof d=="string"?d:d.command,p=typeof d=="string"?l:d.cwd;await j(b,p)},[e,j,g]),c=n.useCallback(async()=>{await H()},[H]),M=n.useCallback(async()=>{await I()},[I]),F=n.useCallback(async d=>{await B(d)},[B]),W=n.useCallback(async()=>{await P()},[P]),D=n.useCallback(async()=>{await U()},[U]),S=at(s),y=s?{...s,pid:s.runtime?.pid}:null;return{session:s,sessions:a,logs:f,detectedCommands:C,previewUrl:S,isLoading:z,error:E,startServer:j,stopServer:H,restartServer:I,setPreviewUrl:B,detectCommands:P,refresh:U,candidates:C,serverState:y,loading:z,start:V,stop:c,restart:M,setManualUrl:F,detect:W,refreshStatus:D}}const er=500,rr=100;function hr(e){return e.length>er?e.slice(-er):e}function gr(e){return e==="stderr"?"stderr":"stdout"}function fe(e){try{return JSON.parse(e.data)}catch{return null}}function he(e,t){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:t,text:typeof e.text=="string"?e.text:"",stream:gr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function ct(e,t){return{id:t,text:e,stream:"stdout",timestamp:""}}function Ue(e,t){if(t.length===0)return e;const s=[...e],i=new Set(e.map(a=>a.id));for(const a of t)i.has(a.id)||(i.add(a.id),s.push(a));return s.sort((a,u)=>a.id-u.id),hr(s)}function dt(e,t){const[s,i]=n.useState([]),[a,u]=n.useState(!1),[f,m]=n.useState(!1),[C,N]=n.useState(!1),[z,L]=n.useState(null),E=n.useRef(null),h=n.useRef(!1),v=n.useRef(0),g=n.useRef(0),k=n.useRef(e),A=n.useRef(t),U=n.useRef(0),O=n.useRef(1);(k.current!==e||A.current!==t)&&(k.current=e,A.current=t,v.current++,le({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,U.current=0,O.current=1,i([]),u(!1),m(!1),N(!1),L(null),E.current&&(E.current(),E.current=null)),n.useEffect(()=>{if(!t){E.current&&(E.current(),E.current=null);return}const P=v.current,V=++g.current;h.current=!1,u(!0);const c=(D,S)=>{const y=hr(D);i(y),L(S),N(S!==null?S>y.length:!1);const d=y.length>0?y[y.length-1].id:0;U.current=d,O.current=d+1},M=D=>{if(h.current||v.current!==P||!D||typeof D!="object")return;const S=D.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const d=S.filter(l=>typeof l=="string").map((l,b)=>ct(l,b+1));c(d,d.length);return}const y=S.filter(d=>!!d&&typeof d=="object").map((d,l)=>he(d,l+1));c(y,y.length)},F=D=>{if(h.current||v.current!==P)return;const S=typeof D.text=="string"?D.text:typeof D.line=="string"?D.line:null;if(!S)return;const y=O.current,d=typeof D.id=="number"&&Number.isFinite(D.id)?D.id:y,l={id:d,text:S,stream:gr(D.stream),timestamp:typeof D.timestamp=="string"?D.timestamp:""};U.current=Math.max(U.current,d),O.current=Math.max(O.current,d+1),i(b=>Ue(b,[l])),L(b=>b===null?b:Math.max(b+1,l.id))};async function W(){try{const S=await Ee({maxLines:rr},e);if(h.current||v.current!==P||g.current!==V)return;const y=S.lines.map((d,l)=>he(d,l+1));c(y,S.totalLines)}catch{if(h.current||v.current!==P||g.current!==V)return;c([],null)}finally{!h.current&&v.current===P&&g.current===V&&u(!1)}const D=Pe(e);E.current=ir(D,{events:{"dev-server:log":S=>{const y=fe(S);y&&F(y)},log:S=>{const y=fe(S);y&&F(y)},history:S=>{const y=fe(S);M(y)},"dev-server:history":S=>{const y=fe(S);M(y)}},onReconnect:()=>{le({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:U.current??null,sseChannel:D,reason:"history-replay"}),!(h.current||v.current!==P)&&Ee({lastEventId:U.current,maxLines:50},e).then(S=>{if(h.current||v.current!==P)return;const y=S.lines.map((d,l)=>he(d,O.current+l));if(y.length>0){const d=y[y.length-1].id;U.current=Math.max(U.current,d),O.current=Math.max(O.current,d+1)}i(d=>Ue(d,y)),L(S.totalLines)}).catch(()=>{})}}),le({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:D})}return W(),()=>{h.current=!0,E.current&&(E.current(),E.current=null)}},[t,e]);const H=n.useCallback(async()=>{if(!t||f)return;const P=v.current,V=s.length;m(!0);try{const c=await Ee({maxLines:rr,offset:V},e);if(h.current||v.current!==P)return;const M=c.lines.map((F,W)=>he(F,W+1));i(F=>Ue(M,F)),N(c.totalLines>V+M.length),L(c.totalLines)}catch{}finally{m(!1)}},[t,s.length,f,e]),I=n.useCallback(()=>{i([])},[]),B=E.current!==null&&!a&&!h.current;return{entries:s,loading:a,loadingMore:f,hasMore:C,total:z,loadMore:H,clear:I,logs:s,isStreaming:B,clearLogs:I}}const vt="This preview appears to block iframe embedding. Open it in a new tab instead.",ut="The preview URL could not be loaded. Verify the server is running and the URL is correct.",mt="Preview is taking longer than expected and may block iframe embedding.";function pt(e){return e==="blocked"?vt:e==="error"?ut:null}function ft(e,t={}){const{loadTimeoutMs:s=1e4,detectionMethod:i=null}=t,a=n.useRef(null),u=n.useRef(null),[f,m]=n.useState("unknown"),[C,N]=n.useState(null),[z]=n.useState(i),L=n.useCallback(()=>{u.current!==null&&(window.clearTimeout(u.current),u.current=null)},[]),E=n.useCallback(j=>{m(j),N(pt(j))},[]),h=n.useCallback(()=>{m("blocked"),N(mt)},[]);n.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let j=!1;return queueMicrotask(()=>{j||(m("loading"),N(null))}),()=>{j=!0,L()}},[L,e]),n.useEffect(()=>{if(f!=="loading"){L();return}const j=setTimeout(()=>{u.current=null,h()},s);return u.current=j,()=>{clearTimeout(j),u.current===j&&(u.current=null)}},[L,f,s,h]);const v=n.useCallback(()=>{const j=a.current;if(!j){E("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){E("blocked");return}}catch{}E("embedded")},[E]),g=n.useCallback(()=>{E("error")},[E]);n.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[L]);const k=n.useCallback(()=>{L(),m("unknown"),N(null)},[L]),A=k,U=n.useMemo(()=>f==="embedded",[f]),O=n.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:U,isBlocked:O,blockReason:C,detectionMethod:z,iframeRef:a,resetEmbedStatus:k,setEmbedStatus:E,retry:A,embedContext:C,handleIframeLoad:v,handleIframeError:g}}const ht=/\x1b\[[0-9;]*m/g,gt=50;function wt(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=gt}function Ae(e){return e.replace(ht,"")}function bt(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?"":t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function xt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function yt(e){if(e.stream==="stderr")return"error";const t=Ae(e.text).toLowerCase();return/\b(warn|warning)\b/.test(t)?"warn":/\b(error|fatal)\b/.test(t)?"error":"info"}function St(e,t){if(!t)return e;const s=new RegExp(`(${xt(t)})`,"ig"),i=e.split(s),a=t.toLowerCase();return r.jsx(r.Fragment,{children:i.map((u,f)=>u.toLowerCase()===a?r.jsx("mark",{children:u},`${u}-${f}`):r.jsx("span",{children:u},`${u}-${f}`))})}function Nt({entries:e,loading:t,loadingMore:s,hasMore:i,total:a,onLoadMore:u,isRunning:f}){const{t:m}=we("app"),C=n.useRef(null),N=n.useRef(e.length),z=n.useRef(f),[L,E]=n.useState(!1),[h,v]=n.useState(!1),g=n.useRef(!1),[k,A]=n.useState(""),[U,O]=n.useState("all"),j=n.useMemo(()=>U==="all"?e:e.filter(c=>yt(c)===U),[e,U]),H=n.useMemo(()=>{const c=k.trim().toLowerCase();return c?j.filter(M=>Ae(M.text).toLowerCase().includes(c)):j},[j,k]),I=H.length,B=n.useCallback(c=>{g.current=c,v(c)},[]),P=n.useCallback(()=>{const c=C.current;c&&(c.scrollTop=c.scrollHeight,B(!1))},[B]);n.useEffect(()=>{const c=z.current,M=N.current,F=e.length>M;f&&(!c||!h&&F)&&P(),z.current=f,N.current=e.length},[e.length,f,h,P]);const V=n.useCallback(()=>{const c=C.current;c&&B(!wt(c))},[B]);return n.useEffect(()=>{t||e.length===0||!h&&f&&P()},[e,f,h,t,P]),n.useEffect(()=>{const c=C.current;if(!c||!f||typeof MutationObserver>"u")return;const M=new MutationObserver(()=>{g.current||P()});return M.observe(c,{childList:!0,characterData:!0,subtree:!0}),()=>M.disconnect()},[f,P]),t&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(ge,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${L?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:m("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[a!==null?`${e.length}/${a}`:`${e.length}`," ",m("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:U,onChange:c=>O(c.target.value),"data-testid":"devserver-log-severity-filter","aria-label":m("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:m("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:m("devserver.info","Info")}),r.jsx("option",{value:"warn",children:m("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:m("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.searchLogs","Search logs")}),r.jsx(Fr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:k,onChange:c=>A(c.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),k.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:I,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>E(c=>!c),"data-testid":"devserver-log-fullscreen-toggle","aria-label":L?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:L?r.jsx($r,{size:14}):r.jsx(zr,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[i&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:u,disabled:s,"data-testid":"devserver-log-load-more-button",children:s?r.jsxs(r.Fragment,{children:[r.jsx(ge,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:C,className:"devserver-log-viewer__content",onScroll:V,"data-testid":"devserver-log-content",children:[!t&&H.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?m("devserver.noLogsYet","No logs yet. Start the dev server to see output."):j.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),H.map(c=>{const M=Ae(c.text),F=bt(c.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[F&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:F}),c.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:m("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Hr(St(M,k.trim()))})]},c.id)})]}),h&&f&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx(Br,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const kt="devserver-preview-iframe";function Ct({url:e,embedStatus:t,onEmbedStatusChange:s,iframeRef:i,blockReason:a,onRetry:u,className:f=kt,embedContext:m}){const{t:C}=we("app"),N=a??m??null,[z,L]=n.useState(0);n.useEffect(()=>{!e||t!=="unknown"||(L(g=>g+1),s("loading"))},[t,s,e]);const E=n.useCallback(()=>{const g=i.current;if(!g){s("embedded");return}try{if(g.contentWindow?.location?.href==="about:blank"&&g.src!=="about:blank"){s("blocked");return}}catch{}s("embedded")},[i,s]),h=n.useCallback(g=>{g.stopPropagation(),s("error")},[s]),v=n.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:i,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:E,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),t==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(ge,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:C("preview.loading","Loading preview...")})]}),t==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(lr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:C("preview.blockedTitle","Preview cannot be embedded")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:C("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:v,children:C("preview.openInNewTab","Open in new tab")}),u&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:u,children:C("actions.retry","Retry")})]})]}),t==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(or,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:C("preview.errorTitle","Unable to load preview")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:C("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:v,children:C("preview.openInNewTab","Open in new tab")}),u&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:u,children:C("actions.retry","Retry")})]})]})]}):null}function Et(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}const Lt=480;function jt(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function wr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const t=e.parentElement;return t?.classList.contains("right-dock__body")?t:null}function Rt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function Ut(e){if(!e||jt())return!1;const t=wr(e);return t?Rt(t)<=Lt:!1}function Dt(e){const[t,s]=n.useState(!1);return n.useEffect(()=>{const i=e.current;if(!i){s(!1);return}const a=wr(i),u=()=>s(Ut(i));if(u(),!a||typeof ResizeObserver>"u")return window.addEventListener("resize",u),()=>window.removeEventListener("resize",u);const f=new ResizeObserver(u);return f.observe(a),window.addEventListener("resize",u),()=>{f.disconnect(),window.removeEventListener("resize",u)}},[e]),t}let De=!1;function tr(e){return e instanceof Error?e.message:String(e)}function br(e){return e==="."?"root":e}function sr(e){return e?e==="root"?".":e:null}function nr(e,t,s){return!t||e.scriptName!==t?!1:s?br(e.cwd)===s:!0}function Pt(e){return e.cwd==="."?"root":e.cwd}function Mt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Ht({addToast:e,projectId:t,tasks:s,columnFlagsByTaskId:i}){const{t:a}=we("app");n.useEffect(()=>(le({view:"DevServerView",trigger:De?"route-active":"remount",projectId:t,replayAttempted:!1}),De=!1,()=>{De=!0,le({view:"DevServerView",trigger:"route-inactive",projectId:t,replayAttempted:!1})}),[t]);const{session:u,detectedCommands:f,previewUrl:m,isLoading:C,error:N,startServer:z,stopServer:L,restartServer:E,setPreviewUrl:h,detectCommands:v,refresh:g}=lt(t),k=u?.status??"stopped",A=k==="running"||k==="starting",U=Et(a),O=U[k]??U.stopped,{entries:j,loading:H,loadingMore:I,hasMore:B,total:P,loadMore:V}=dt(t,!!t),c=m,M=u?.config?.cwd??null,F=n.useRef(null),W=Dt(F),[D,S]=n.useState(!0),[y,d]=n.useState(()=>me(t)?.commandInput??""),[l,b]=n.useState(""),[p,w]=n.useState(()=>me(t)?.selectedScript??null),[x,R]=n.useState(()=>me(t)?.selectedTaskId??null),ne=n.useRef(t);n.useEffect(()=>{if(ne.current===t)return;ne.current=t;const o=me(t);d(o?.commandInput??""),w(o?.selectedScript??null),R(o?.selectedTaskId??null)},[t]),n.useEffect(()=>{ne.current===t&&Vr({selectedScript:p,selectedTaskId:x,commandInput:y},t)},[y,t,p,x]);const[Y,Te]=n.useState(null),G=n.useMemo(()=>(s??[]).filter(o=>Wr(i?.get(o.id),o.column)&&typeof o.worktree=="string"&&o.worktree.length>0),[s,i]),X=n.useMemo(()=>G.find(o=>o.id===x)??null,[G,x]);n.useEffect(()=>{x&&!G.some(o=>o.id===x)&&R(null)},[G,x]);const[ae,xr]=n.useState("embedded"),[ie,xe]=n.useState(!1),Oe=n.useRef(null),ye=n.useRef(null),yr=ae==="embedded"?c:null,{embedStatus:q,setEmbedStatus:Sr,resetEmbedStatus:ce,iframeRef:re,isEmbedded:Nr,isBlocked:Se,blockReason:Ne,retry:Fe}=ft(yr),[$e,Q]=n.useState(!1),ze=n.useRef(q);n.useEffect(()=>{const o=ze.current!==q;Se&&o&&Q(!0),q==="embedded"&&Q(!1),ze.current=q},[q,Se]),n.useEffect(()=>{Q(!1)},[c]);const de=n.useMemo(()=>{if(!p)return null;const o=sr(M);return f.find(_=>!(_.scriptName!==p||o&&_.cwd!==o||u?.config?.command&&_.command!==u.config.command))??f.find(_=>nr(_,p,M))??null},[f,u?.config?.command,p,M]);n.useEffect(()=>{typeof v=="function"&&v().catch(o=>{e(tr(o),"error")})},[e,v]),n.useEffect(()=>{if(p){S(!1);return}S(!0)},[p]),n.useEffect(()=>{if(u?.status==="running"||u?.status==="starting"){u.config?.command?.trim().length>0&&d(u.config.command);return}if(de){d(o=>o.trim().length>0?o:de.command);return}f.length>0&&d(o=>o.trim().length>0?o:f[0]?.command??"")},[f,de,u?.config?.command,u?.status]),n.useEffect(()=>{b(c??"")},[c]);const ve=n.useCallback(()=>{xe(!1),window.requestAnimationFrame(()=>Oe.current?.focus())},[]),kr=Ir(ve);n.useEffect(()=>{if(!ie)return;ye.current?.focus();const o=_=>{if(_.key==="Escape"){ve();return}if(_.key!=="Tab")return;const oe=Array.from(ye.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(Ve=>!Ve.hasAttribute("disabled")&&Ve.getAttribute("aria-hidden")!=="true"),Z=oe[0],Ce=oe.at(-1);!Z||!Ce||(_.shiftKey&&document.activeElement===Z?(_.preventDefault(),Ce.focus()):!_.shiftKey&&document.activeElement===Ce&&(_.preventDefault(),Z.focus()))};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[ve,ie]),n.useEffect(()=>{!W&&ie&&xe(!1)},[W,ie]);const ke=n.useCallback(()=>{c&&window.open(c,"_blank","noopener,noreferrer")},[c]),He=n.useCallback(()=>{Q(!1),Fe()},[Fe]),Cr=n.useCallback(()=>{try{const o=re.current;if(o?.contentWindow){o.contentWindow.location.reload(),Q(!1),ce();return}}catch{}if(!(!c||!re.current))try{const o=new URL(c);o.searchParams.set("_t",Date.now().toString()),re.current.src=o.toString(),Q(!1),ce()}catch{re.current.src=c,Q(!1),ce()}},[c,re,ce]),ue=n.useCallback(async(o,_,oe)=>{Te(o);try{await _(),e(oe,"success")}catch(Z){e(tr(Z),"error")}finally{Te(null)}},[e]),Er=n.useCallback(o=>{w(o.scriptName),S(!1),d(o.command),e(a("devserver.toast.selectedScript","Selected {{name}} script.",{name:o.scriptName}),"success")},[e]),Lr=n.useCallback(()=>{w(null),S(!0),e(a("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),jr=n.useCallback(o=>{A&&o&&o!==x&&e(a("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),R(o)},[e,A,x,a]),Rr=()=>{const o=y.trim();if(o.length===0){e(a("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const _=sr(M)??".",Z=X?.worktree??null??de?.cwd??_;ue("start",()=>z(o,Z),a("devserver.toast.started","Dev server started."))},Ur=()=>{ue("stop",L,a("devserver.toast.stopped","Dev server stopped."))},Dr=()=>{ue("restart",E,a("devserver.toast.restarted","Dev server restarted."))},Pr=()=>{const o=l.trim(),_=o.length>0?o:null;ue("preview",()=>h(_),_?a("devserver.toast.previewUpdated","Preview URL updated."):a("devserver.toast.previewCleared","Preview URL override cleared."))},Mr=n.useCallback(()=>{N&&g()},[N,g]),_r=k==="starting"||k==="running"||Y!==null,Ar=k==="stopped"||Y!==null,Tr=k==="stopped"||k==="starting"||Y!==null,Be=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(We,{size:14}),r.jsx("span",{children:a("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:c??a("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[a("devserver.auto","Auto"),c?` · ${c}`:a("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>xr(o=>o==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:ae==="embedded"?a("devserver.externalOnly","External only"):a("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:a("devserver.openInNewTab","Open in new tab"),onClick:ke,disabled:!c,"data-testid":"devserver-preview-open-tab",children:r.jsx(Qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:a("devserver.refreshPreview","Refresh preview"),onClick:Cr,disabled:!c,"data-testid":"devserver-preview-refresh",children:r.jsx(Zr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":q,"data-embedded":Nr?"true":"false",children:[!c&&!A&&r.jsx("p",{className:"devserver-preview-empty",children:a("devserver.startDevServer","Start a dev server to see a live preview here.")}),!c&&A&&r.jsx("p",{className:"devserver-preview-empty",children:a("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),c&&ae==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:a("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ke,"data-testid":"devserver-preview-external-open-tab",children:a("devserver.openInNewTab","Open in new tab")})]}),c&&ae==="embedded"&&$e&&Se&&r.jsxs("div",{className:q==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[q==="error"?r.jsx(or,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(lr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:q==="error"?a("devserver.previewFailed","Preview failed"):a("devserver.previewBlocked","Preview blocked")}),Ne&&r.jsx("p",{className:"devserver-preview-blocked-context",children:Ne})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:a("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:ke,"data-testid":"devserver-preview-fallback-open-tab",children:a("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:He,"data-testid":"devserver-preview-fallback-retry",children:a("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),c&&ae==="embedded"&&!$e&&r.jsx(Ct,{url:c,embedStatus:q,onEmbedStatusChange:Sr,iframeRef:re,blockReason:Ne,onRetry:He})]})]});return r.jsxs("div",{ref:F,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":W?"true":"false",children:[r.jsx(qr,{icon:Jr,title:a("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${O.className}`,"data-testid":"dev-server-status-badge",children:O.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Rr,disabled:_r,"data-testid":"dev-server-start-button",children:[r.jsx(Xr,{size:14}),r.jsx("span",{children:Y==="start"?a("devserver.starting","Starting..."):a("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ur,disabled:Ar,"data-testid":"dev-server-stop-button",children:[r.jsx(Kr,{size:14}),r.jsx("span",{children:Y==="stop"?a("devserver.stopping","Stopping..."):a("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Dr,disabled:Tr,"data-testid":"dev-server-restart-button",children:[r.jsx(Yr,{size:14}),r.jsx("span",{children:Y==="restart"?a("devserver.restarting","Restarting..."):a("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":a("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:a("devserver.configuration","Configuration")}),C&&r.jsx("span",{className:"dev-server-muted",children:a("devserver.loading","Loading...")})]}),C&&!u&&f.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(ge,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:a("devserver.loadingConfig","Loading dev server configuration...")})]}),N&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:N}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Mr,children:a("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:a("devserver.scriptSelection","Script Selection")}),p&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:p}),r.jsx("span",{className:"dev-server-candidate-source",children:M??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>S(!0),"data-testid":"dev-server-change-selection",children:a("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Lr,"data-testid":"dev-server-clear-selection",children:a("devserver.clear","Clear")})]}),D&&f.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:a("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),D&&f.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:f.map(o=>{const _=nr(o,p,M);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${_?"dev-server-candidate--selected":""}`,onClick:()=>Er(o),"data-testid":`dev-server-candidate-${o.scriptName}-${br(o.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:o.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Mt(o.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:Pt(o)})]},`${o.cwd}::${o.scriptName}::${o.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:a("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:a("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:x??"",onChange:o=>jr(o.target.value.length>0?o.target.value:null),disabled:G.length===0,"aria-label":a("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:a("devserver.projectRootNoTask","Project root (no task)")}),G.map(o=>r.jsx("option",{value:o.id,children:o.title?`${o.id} — ${o.title}`:o.id},o.id))]}),G.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:a("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),X&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:X.title?`${X.id} — ${X.title}`:X.id})}),r.jsx("p",{className:"dev-server-task-description",children:X.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:a("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:X.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:a("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:y,onChange:o=>d(o.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:k==="running"||k==="starting"})]}),(k==="running"||k==="starting")&&u&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:a("devserver.runningCommand","Running command")}),r.jsx("code",{children:u.config?.command??y})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:a("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:l,onChange:o=>b(o.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Pr,disabled:Y==="preview","data-testid":"dev-server-set-preview",children:a("devserver.save","Save")})]}),c&&r.jsx("p",{className:"dev-server-preview-hint",children:a("devserver.autoDetected","Auto-detected: {{url}}",{url:c})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":a("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:a("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:a("devserver.lines","{{count}} lines",{count:P??j.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(Nt,{entries:j,loading:H,loadingMore:I,hasMore:B,total:P,onLoadMore:V,isRunning:A})})]})}),W?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":a("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(We,{size:14}),r.jsx("span",{children:a("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:c??a("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:c||a("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:c?a("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):a("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:Oe,onClick:()=>xe(!0),"data-testid":"devserver-preview-modal-open",children:a("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":a("devserver.previewLabel","Dev server preview"),children:Be()}),W&&ie&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...kr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:ye,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:a("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ve,"aria-label":a("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Gr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:Be()})]})})]})}export{Ht as DevServerView};
|
|
1
|
+
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a as $,w as T,dc as ar,bh as ir,aX as Or,c_ as le,L as ge,aJ as Fr,dd as $r,de as zr,df as Hr,C as Br,a$ as or,dg as me,dh as Vr,di as Wr,dj as Ir,V as qr,dk as Jr,bV as Xr,bY as Kr,dl as Yr,y as We,X as Gr,aS as Qr,R as Zr}from"./index-DpCHwyiD.js";import{u as we}from"./vendor-i18n-Duky4gdQ.js";import{S as lr}from"./shield-alert-BNSeDB8l.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const t=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",s=t==="root"?".":t,i=e.name,a=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():s,u=typeof e.confidence=="number"?e.confidence:1,f=t==="root"?"root":t,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:i,packagePath:a,confidence:u,cwd:s,source:t,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${i} (${f})`}}function se(e){const t=e.status,s=t==="starting"||t==="running"||t==="failed"||t==="stopped"?t:"stopped",i=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,a=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:s,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:i,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:i,detectedPort:e.detectedPort,manualPreviewUrl:a,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:a,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function et(e,t){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:t,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function rt(e){const s=(Array.isArray(e.lines)?e.lines:[]).map((i,a)=>et(i,a+1));return{lines:s,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:s.length}}function tt(e,t){const s=typeof t.maxLines=="number"&&Number.isFinite(t.maxLines)?Math.max(1,Math.floor(t.maxLines)):100,i=typeof t.offset=="number"&&Number.isFinite(t.offset)?Math.max(0,Math.floor(t.offset)):0,a=typeof t.lastEventId=="number"&&Number.isFinite(t.lastEventId)?Math.max(0,Math.floor(t.lastEventId)):null,u=e.length,f=e.map((N,z)=>({id:z+1,text:N,stream:"stdout",timestamp:""}));if(a!==null)return{lines:f.filter(N=>N.id>a).slice(0,s),totalLines:u};const m=Math.max(u-i,0),C=Math.max(m-s,0);return{lines:f.slice(C,m),totalLines:u}}function qe(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function cr(e){try{const t=await $(T("/dev-server/candidates",e));return qe(t)}catch(t){if(t instanceof Error&&/\/dev-server\/candidates/.test(t.message)){const s=await $(T("/dev-server/detect",e));return qe(s)}throw t}}function be(e){return $(T("/dev-server/status",e)).then(se)}async function Ee(e={},t){const s=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&s.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&s.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&s.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const i=s.size>0?`?${s.toString()}`:"";try{const a=await $(T(`/dev-server/logs/history${i}`,t));return rt(a)}catch(a){if(a instanceof Error&&/\/dev-server\/logs\/history/.test(a.message)){const u=await be(t);return tt(u.logs,e)}throw a}}function dr(e,t){const s=e.cwd??e.packagePath??".",i=e.scriptName;return $(T("/dev-server/start",t),{method:"POST",body:JSON.stringify({command:e.command,scriptName:i,scriptId:i,cwd:s,packagePath:e.packagePath})}).then(se)}function vr(e){return $(T("/dev-server/stop",e),{method:"POST"}).then(se)}function ur(e){return $(T("/dev-server/restart",e),{method:"POST"}).then(se)}async function mr(e,t){const s=typeof e=="string"?{url:e}:e;try{const i=await $(T("/dev-server/preview-url",t),{method:"POST",body:JSON.stringify(s)});return se(i)}catch(i){if(i instanceof Error&&/\/dev-server\/preview-url/.test(i.message)){const a=await $(T("/dev-server/preview-url",t),{method:"PUT",body:JSON.stringify(s)});return se(a)}throw i}}function Pe(e){return ar(T("/dev-server/logs/stream",e))}async function Me(e){try{return(await $(T("/devserver",e))).sessions??[]}catch{try{const t=await be(e);return[{config:{id:t.id??"default",name:t.name??"Dev Server",command:t.command??"",cwd:t.cwd??"."},status:t.status,runtime:t.pid?{pid:t.pid,startedAt:t.startedAt??new Date().toISOString(),exitCode:t.exitCode??void 0,previewUrl:t.previewUrl}:void 0,previewUrl:t.previewUrl??t.detectedUrl??void 0,logHistory:(t.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function pr(e,t){try{return await $(T(`/devserver/${encodeURIComponent(e)}`,t))}catch{try{const s=await be(t);return!e||e==="default"||e===s.id?{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Je(e,t){try{return await $(T(`/devserver/${encodeURIComponent(e)}/start`,t),{method:"POST"})}catch{const s=await dr({command:""},t);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,t){try{return await $(T(`/devserver/${encodeURIComponent(e)}/stop`,t),{method:"POST"})}catch{const s=await vr(t);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Ke(e,t){try{return await $(T(`/devserver/${encodeURIComponent(e)}/restart`,t),{method:"POST"})}catch{const s=await ur(t);return{config:{id:s.id??e,name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}}async function Ye(e,t,s){try{const i=await $(T(`/devserver/${encodeURIComponent(e)}/preview`,s),{method:"POST",body:JSON.stringify({url:t})});return{url:i.url??null,source:i.source??null}}catch{const i=await mr({url:t},s);return{url:i.previewUrl??i.manualUrl??null,source:"manual"}}}async function Le(e){try{return(await $(T("/devserver/detect",e))).candidates??[]}catch{try{return(await cr(e)).map(s=>({name:s.name,command:s.command,cwd:s.cwd,scriptName:s.scriptName,packagePath:s.packagePath}))}catch{return[]}}}function st(e,t){return ar(T(`/devserver/${encodeURIComponent(e)}/logs/stream`,t))}const _e=500,nt=3e3;function J(e){return e instanceof Error?e.message:String(e)}function fr(e){return e.length<=_e?e:e.slice(-_e)}function je(e,t){return fr([...e,t])}function te(e){try{return JSON.parse(e)}catch{return null}}function pe(e){const t=e.text??"";return e.stream==="stderr"?`[stderr] ${t}`:t}function at(e){return e?.previewUrl??null}async function Ge(e){return be(e)}async function Qe(e,t){return dr(e,t)}async function it(e){return vr(e)}async function ot(e){return ur(e)}async function Ze(e){return cr(e)}function K(e){try{return e()}catch{return null}}function Re(){return typeof K(()=>Me)=="function"&&typeof K(()=>pr)=="function"}function ee(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}function lt(e){const{t}=we("app"),[s,i]=n.useState(null),[a,u]=n.useState([]),[f,m]=n.useState([]),[C,N]=n.useState([]),[z,L]=n.useState(!0),[E,h]=n.useState(null),v=n.useRef(0),[g,k]=n.useState(null),A=n.useCallback(d=>{if(i(d),d?.logHistory){const l=d.logHistory.slice(-_e).map(pe);m(l)}},[]),U=n.useCallback(async()=>{const d=v.current;try{if(Re())if(g){const l=await pr(g,e);if(v.current!==d)return;A(l)}else{const l=await Me(e);if(v.current!==d)return;u(l),l.length>0&&(k(l[0].config.id),A(l[0]))}else{const l=await Ge(e);if(v.current!==d)return;const b=ee(l);u([b]),A(b)}h(null)}catch(l){if(v.current!==d)return;h(J(l))}},[A,e,g]);n.useEffect(()=>{v.current+=1;const d=v.current;i(null),u([]),m([]),N([]),L(!0),h(null),k(null),(async()=>{try{const[b,p]=await Promise.allSettled([Re()?Me(e):Ge(e).then(x=>[ee(x)]),typeof K(()=>Le)=="function"?Le(e):Ze(e).then(x=>x.map(R=>({name:R.name,command:R.command,cwd:R.cwd,scriptName:R.scriptName,packagePath:R.packagePath})))]);if(v.current!==d)return;let w=null;if(b.status==="fulfilled"){const x=b.value;if(u(x),x.length>0){const R=x[0];Re()&&k(R.config.id),A(R)}}else w=J(b.reason);p.status==="fulfilled"&&N(p.value),w&&h(w)}catch(b){if(v.current!==d)return;h(J(b))}finally{v.current===d&&L(!1)}})()},[A,e]),n.useEffect(()=>{const d=g?st(g,e):typeof K(()=>Pe)=="function"?Pe(e):null;if(!d)return;const l=v.current,b=ir(d,{events:{history:p=>{if(v.current!==l)return;const w=te(p.data);if(w?.lines){const x=w.lines.map(pe);m(fr(x))}},log:p=>{if(v.current!==l)return;const w=te(p.data);if(w){const x=typeof w.line=="string"?w.line:pe(w);m(R=>je(R,x))}},"dev-server:log":p=>{if(v.current!==l)return;const w=te(p.data);if(w){const x=typeof w.line=="string"?w.line:pe(w);m(R=>je(R,x))}},"dev-server:output":p=>{if(v.current!==l)return;const w=te(p.data);w?.line&&m(x=>je(x,w.line))},status:p=>{if(v.current!==l)return;const w=te(p.data),x=w?.status;x&&i(R=>R&&{...R,status:x,runtime:w.pid?{...R.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:R.runtime})},"dev-server:status":p=>{if(v.current!==l)return;const w=te(p.data);if(w?.status){const x=ee(w);i(x),u([x])}},stopped:()=>{v.current},failed:()=>{v.current}},onReconnect:()=>{v.current===l&&U()},onError:()=>{v.current===l&&h(p=>p??t("devserver.lostConnection","Lost log stream connection."))}});return()=>{b()}},[e,U,g]);const O=s?.status==="running"||s?.status==="starting";Or(U,nt,{enabled:O});const j=n.useCallback(async(d,l)=>{v.current+=1;const b=v.current;try{let p;const w=typeof l=="string"&&l.length>0,x=s?.config?.cwd??".";if(!(w&&l!==x)&&g&&typeof K(()=>Je)=="function")p=await Je(g,e);else{const ne=await Qe({command:d,cwd:l},e);p=ee(ne)}if(v.current!==b)return;i(p),h(null)}catch(p){if(v.current!==b)return;throw h(J(p)),p}},[e,s?.config?.cwd,g]),H=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;if(g&&typeof K(()=>Xe)=="function")l=await Xe(g,e);else{const b=await it(e);l=ee(b)}if(v.current!==d)return;i(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e,g]),I=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;if(g&&typeof K(()=>Ke)=="function")l=await Ke(g,e);else{const b=await ot(e);l=ee(b)}if(v.current!==d)return;i(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e,g]),B=n.useCallback(async d=>{v.current+=1;const l=v.current;try{let b;if(g&&typeof K(()=>Ye)=="function")b=await Ye(g,d,e);else{const p=await mr({url:d},e);b={url:p.manualUrl??p.previewUrl??p.detectedUrl??null,source:p.manualUrl?"manual":"auto"}}if(v.current!==l)return;i(p=>p?{...p,previewUrl:b.url??void 0}:null),h(null)}catch(b){if(v.current!==l)return;throw h(J(b)),b}},[e,g]),P=n.useCallback(async()=>{v.current+=1;const d=v.current;try{let l;try{l=await Le(e)}catch{l=(await Ze(e)).map(p=>({name:p.name,command:p.command,cwd:p.cwd,scriptName:p.scriptName,packagePath:p.packagePath}))}if(v.current!==d)return;N(l),h(null)}catch(l){if(v.current!==d)return;throw h(J(l)),l}},[e]),V=n.useCallback(async(d,l)=>{if(typeof d!="string"&&!g)try{const w=d,x=await Qe({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),R=ee(x);i(R),u([R]),h(null);return}catch(w){throw h(J(w)),w}const b=typeof d=="string"?d:d.command,p=typeof d=="string"?l:d.cwd;await j(b,p)},[e,j,g]),c=n.useCallback(async()=>{await H()},[H]),M=n.useCallback(async()=>{await I()},[I]),F=n.useCallback(async d=>{await B(d)},[B]),W=n.useCallback(async()=>{await P()},[P]),D=n.useCallback(async()=>{await U()},[U]),S=at(s),y=s?{...s,pid:s.runtime?.pid}:null;return{session:s,sessions:a,logs:f,detectedCommands:C,previewUrl:S,isLoading:z,error:E,startServer:j,stopServer:H,restartServer:I,setPreviewUrl:B,detectCommands:P,refresh:U,candidates:C,serverState:y,loading:z,start:V,stop:c,restart:M,setManualUrl:F,detect:W,refreshStatus:D}}const er=500,rr=100;function hr(e){return e.length>er?e.slice(-er):e}function gr(e){return e==="stderr"?"stderr":"stdout"}function fe(e){try{return JSON.parse(e.data)}catch{return null}}function he(e,t){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:t,text:typeof e.text=="string"?e.text:"",stream:gr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function ct(e,t){return{id:t,text:e,stream:"stdout",timestamp:""}}function Ue(e,t){if(t.length===0)return e;const s=[...e],i=new Set(e.map(a=>a.id));for(const a of t)i.has(a.id)||(i.add(a.id),s.push(a));return s.sort((a,u)=>a.id-u.id),hr(s)}function dt(e,t){const[s,i]=n.useState([]),[a,u]=n.useState(!1),[f,m]=n.useState(!1),[C,N]=n.useState(!1),[z,L]=n.useState(null),E=n.useRef(null),h=n.useRef(!1),v=n.useRef(0),g=n.useRef(0),k=n.useRef(e),A=n.useRef(t),U=n.useRef(0),O=n.useRef(1);(k.current!==e||A.current!==t)&&(k.current=e,A.current=t,v.current++,le({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,U.current=0,O.current=1,i([]),u(!1),m(!1),N(!1),L(null),E.current&&(E.current(),E.current=null)),n.useEffect(()=>{if(!t){E.current&&(E.current(),E.current=null);return}const P=v.current,V=++g.current;h.current=!1,u(!0);const c=(D,S)=>{const y=hr(D);i(y),L(S),N(S!==null?S>y.length:!1);const d=y.length>0?y[y.length-1].id:0;U.current=d,O.current=d+1},M=D=>{if(h.current||v.current!==P||!D||typeof D!="object")return;const S=D.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const d=S.filter(l=>typeof l=="string").map((l,b)=>ct(l,b+1));c(d,d.length);return}const y=S.filter(d=>!!d&&typeof d=="object").map((d,l)=>he(d,l+1));c(y,y.length)},F=D=>{if(h.current||v.current!==P)return;const S=typeof D.text=="string"?D.text:typeof D.line=="string"?D.line:null;if(!S)return;const y=O.current,d=typeof D.id=="number"&&Number.isFinite(D.id)?D.id:y,l={id:d,text:S,stream:gr(D.stream),timestamp:typeof D.timestamp=="string"?D.timestamp:""};U.current=Math.max(U.current,d),O.current=Math.max(O.current,d+1),i(b=>Ue(b,[l])),L(b=>b===null?b:Math.max(b+1,l.id))};async function W(){try{const S=await Ee({maxLines:rr},e);if(h.current||v.current!==P||g.current!==V)return;const y=S.lines.map((d,l)=>he(d,l+1));c(y,S.totalLines)}catch{if(h.current||v.current!==P||g.current!==V)return;c([],null)}finally{!h.current&&v.current===P&&g.current===V&&u(!1)}const D=Pe(e);E.current=ir(D,{events:{"dev-server:log":S=>{const y=fe(S);y&&F(y)},log:S=>{const y=fe(S);y&&F(y)},history:S=>{const y=fe(S);M(y)},"dev-server:history":S=>{const y=fe(S);M(y)}},onReconnect:()=>{le({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:U.current??null,sseChannel:D,reason:"history-replay"}),!(h.current||v.current!==P)&&Ee({lastEventId:U.current,maxLines:50},e).then(S=>{if(h.current||v.current!==P)return;const y=S.lines.map((d,l)=>he(d,O.current+l));if(y.length>0){const d=y[y.length-1].id;U.current=Math.max(U.current,d),O.current=Math.max(O.current,d+1)}i(d=>Ue(d,y)),L(S.totalLines)}).catch(()=>{})}}),le({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:D})}return W(),()=>{h.current=!0,E.current&&(E.current(),E.current=null)}},[t,e]);const H=n.useCallback(async()=>{if(!t||f)return;const P=v.current,V=s.length;m(!0);try{const c=await Ee({maxLines:rr,offset:V},e);if(h.current||v.current!==P)return;const M=c.lines.map((F,W)=>he(F,W+1));i(F=>Ue(M,F)),N(c.totalLines>V+M.length),L(c.totalLines)}catch{}finally{m(!1)}},[t,s.length,f,e]),I=n.useCallback(()=>{i([])},[]),B=E.current!==null&&!a&&!h.current;return{entries:s,loading:a,loadingMore:f,hasMore:C,total:z,loadMore:H,clear:I,logs:s,isStreaming:B,clearLogs:I}}const vt="This preview appears to block iframe embedding. Open it in a new tab instead.",ut="The preview URL could not be loaded. Verify the server is running and the URL is correct.",mt="Preview is taking longer than expected and may block iframe embedding.";function pt(e){return e==="blocked"?vt:e==="error"?ut:null}function ft(e,t={}){const{loadTimeoutMs:s=1e4,detectionMethod:i=null}=t,a=n.useRef(null),u=n.useRef(null),[f,m]=n.useState("unknown"),[C,N]=n.useState(null),[z]=n.useState(i),L=n.useCallback(()=>{u.current!==null&&(window.clearTimeout(u.current),u.current=null)},[]),E=n.useCallback(j=>{m(j),N(pt(j))},[]),h=n.useCallback(()=>{m("blocked"),N(mt)},[]);n.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let j=!1;return queueMicrotask(()=>{j||(m("loading"),N(null))}),()=>{j=!0,L()}},[L,e]),n.useEffect(()=>{if(f!=="loading"){L();return}const j=setTimeout(()=>{u.current=null,h()},s);return u.current=j,()=>{clearTimeout(j),u.current===j&&(u.current=null)}},[L,f,s,h]);const v=n.useCallback(()=>{const j=a.current;if(!j){E("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){E("blocked");return}}catch{}E("embedded")},[E]),g=n.useCallback(()=>{E("error")},[E]);n.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[L]);const k=n.useCallback(()=>{L(),m("unknown"),N(null)},[L]),A=k,U=n.useMemo(()=>f==="embedded",[f]),O=n.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:U,isBlocked:O,blockReason:C,detectionMethod:z,iframeRef:a,resetEmbedStatus:k,setEmbedStatus:E,retry:A,embedContext:C,handleIframeLoad:v,handleIframeError:g}}const ht=/\x1b\[[0-9;]*m/g,gt=50;function wt(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=gt}function Ae(e){return e.replace(ht,"")}function bt(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?"":t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function xt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function yt(e){if(e.stream==="stderr")return"error";const t=Ae(e.text).toLowerCase();return/\b(warn|warning)\b/.test(t)?"warn":/\b(error|fatal)\b/.test(t)?"error":"info"}function St(e,t){if(!t)return e;const s=new RegExp(`(${xt(t)})`,"ig"),i=e.split(s),a=t.toLowerCase();return r.jsx(r.Fragment,{children:i.map((u,f)=>u.toLowerCase()===a?r.jsx("mark",{children:u},`${u}-${f}`):r.jsx("span",{children:u},`${u}-${f}`))})}function Nt({entries:e,loading:t,loadingMore:s,hasMore:i,total:a,onLoadMore:u,isRunning:f}){const{t:m}=we("app"),C=n.useRef(null),N=n.useRef(e.length),z=n.useRef(f),[L,E]=n.useState(!1),[h,v]=n.useState(!1),g=n.useRef(!1),[k,A]=n.useState(""),[U,O]=n.useState("all"),j=n.useMemo(()=>U==="all"?e:e.filter(c=>yt(c)===U),[e,U]),H=n.useMemo(()=>{const c=k.trim().toLowerCase();return c?j.filter(M=>Ae(M.text).toLowerCase().includes(c)):j},[j,k]),I=H.length,B=n.useCallback(c=>{g.current=c,v(c)},[]),P=n.useCallback(()=>{const c=C.current;c&&(c.scrollTop=c.scrollHeight,B(!1))},[B]);n.useEffect(()=>{const c=z.current,M=N.current,F=e.length>M;f&&(!c||!h&&F)&&P(),z.current=f,N.current=e.length},[e.length,f,h,P]);const V=n.useCallback(()=>{const c=C.current;c&&B(!wt(c))},[B]);return n.useEffect(()=>{t||e.length===0||!h&&f&&P()},[e,f,h,t,P]),n.useEffect(()=>{const c=C.current;if(!c||!f||typeof MutationObserver>"u")return;const M=new MutationObserver(()=>{g.current||P()});return M.observe(c,{childList:!0,characterData:!0,subtree:!0}),()=>M.disconnect()},[f,P]),t&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(ge,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${L?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:m("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[a!==null?`${e.length}/${a}`:`${e.length}`," ",m("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:U,onChange:c=>O(c.target.value),"data-testid":"devserver-log-severity-filter","aria-label":m("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:m("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:m("devserver.info","Info")}),r.jsx("option",{value:"warn",children:m("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:m("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.searchLogs","Search logs")}),r.jsx(Fr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:k,onChange:c=>A(c.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),k.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:I,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>E(c=>!c),"data-testid":"devserver-log-fullscreen-toggle","aria-label":L?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:L?r.jsx($r,{size:14}):r.jsx(zr,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[i&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:u,disabled:s,"data-testid":"devserver-log-load-more-button",children:s?r.jsxs(r.Fragment,{children:[r.jsx(ge,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:C,className:"devserver-log-viewer__content",onScroll:V,"data-testid":"devserver-log-content",children:[!t&&H.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?m("devserver.noLogsYet","No logs yet. Start the dev server to see output."):j.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),H.map(c=>{const M=Ae(c.text),F=bt(c.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[F&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:F}),c.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:m("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Hr(St(M,k.trim()))})]},c.id)})]}),h&&f&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx(Br,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const kt="devserver-preview-iframe";function Ct({url:e,embedStatus:t,onEmbedStatusChange:s,iframeRef:i,blockReason:a,onRetry:u,className:f=kt,embedContext:m}){const{t:C}=we("app"),N=a??m??null,[z,L]=n.useState(0);n.useEffect(()=>{!e||t!=="unknown"||(L(g=>g+1),s("loading"))},[t,s,e]);const E=n.useCallback(()=>{const g=i.current;if(!g){s("embedded");return}try{if(g.contentWindow?.location?.href==="about:blank"&&g.src!=="about:blank"){s("blocked");return}}catch{}s("embedded")},[i,s]),h=n.useCallback(g=>{g.stopPropagation(),s("error")},[s]),v=n.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:i,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:E,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),t==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(ge,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:C("preview.loading","Loading preview...")})]}),t==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(lr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:C("preview.blockedTitle","Preview cannot be embedded")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:C("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:v,children:C("preview.openInNewTab","Open in new tab")}),u&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:u,children:C("actions.retry","Retry")})]})]}),t==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(or,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:C("preview.errorTitle","Unable to load preview")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:C("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:v,children:C("preview.openInNewTab","Open in new tab")}),u&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:u,children:C("actions.retry","Retry")})]})]})]}):null}function Et(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}const Lt=480;function jt(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function wr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const t=e.parentElement;return t?.classList.contains("right-dock__body")?t:null}function Rt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function Ut(e){if(!e||jt())return!1;const t=wr(e);return t?Rt(t)<=Lt:!1}function Dt(e){const[t,s]=n.useState(!1);return n.useEffect(()=>{const i=e.current;if(!i){s(!1);return}const a=wr(i),u=()=>s(Ut(i));if(u(),!a||typeof ResizeObserver>"u")return window.addEventListener("resize",u),()=>window.removeEventListener("resize",u);const f=new ResizeObserver(u);return f.observe(a),window.addEventListener("resize",u),()=>{f.disconnect(),window.removeEventListener("resize",u)}},[e]),t}let De=!1;function tr(e){return e instanceof Error?e.message:String(e)}function br(e){return e==="."?"root":e}function sr(e){return e?e==="root"?".":e:null}function nr(e,t,s){return!t||e.scriptName!==t?!1:s?br(e.cwd)===s:!0}function Pt(e){return e.cwd==="."?"root":e.cwd}function Mt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Ht({addToast:e,projectId:t,tasks:s,columnFlagsByTaskId:i}){const{t:a}=we("app");n.useEffect(()=>(le({view:"DevServerView",trigger:De?"route-active":"remount",projectId:t,replayAttempted:!1}),De=!1,()=>{De=!0,le({view:"DevServerView",trigger:"route-inactive",projectId:t,replayAttempted:!1})}),[t]);const{session:u,detectedCommands:f,previewUrl:m,isLoading:C,error:N,startServer:z,stopServer:L,restartServer:E,setPreviewUrl:h,detectCommands:v,refresh:g}=lt(t),k=u?.status??"stopped",A=k==="running"||k==="starting",U=Et(a),O=U[k]??U.stopped,{entries:j,loading:H,loadingMore:I,hasMore:B,total:P,loadMore:V}=dt(t,!!t),c=m,M=u?.config?.cwd??null,F=n.useRef(null),W=Dt(F),[D,S]=n.useState(!0),[y,d]=n.useState(()=>me(t)?.commandInput??""),[l,b]=n.useState(""),[p,w]=n.useState(()=>me(t)?.selectedScript??null),[x,R]=n.useState(()=>me(t)?.selectedTaskId??null),ne=n.useRef(t);n.useEffect(()=>{if(ne.current===t)return;ne.current=t;const o=me(t);d(o?.commandInput??""),w(o?.selectedScript??null),R(o?.selectedTaskId??null)},[t]),n.useEffect(()=>{ne.current===t&&Vr({selectedScript:p,selectedTaskId:x,commandInput:y},t)},[y,t,p,x]);const[Y,Te]=n.useState(null),G=n.useMemo(()=>(s??[]).filter(o=>Wr(i?.get(o.id),o.column)&&typeof o.worktree=="string"&&o.worktree.length>0),[s,i]),X=n.useMemo(()=>G.find(o=>o.id===x)??null,[G,x]);n.useEffect(()=>{x&&!G.some(o=>o.id===x)&&R(null)},[G,x]);const[ae,xr]=n.useState("embedded"),[ie,xe]=n.useState(!1),Oe=n.useRef(null),ye=n.useRef(null),yr=ae==="embedded"?c:null,{embedStatus:q,setEmbedStatus:Sr,resetEmbedStatus:ce,iframeRef:re,isEmbedded:Nr,isBlocked:Se,blockReason:Ne,retry:Fe}=ft(yr),[$e,Q]=n.useState(!1),ze=n.useRef(q);n.useEffect(()=>{const o=ze.current!==q;Se&&o&&Q(!0),q==="embedded"&&Q(!1),ze.current=q},[q,Se]),n.useEffect(()=>{Q(!1)},[c]);const de=n.useMemo(()=>{if(!p)return null;const o=sr(M);return f.find(_=>!(_.scriptName!==p||o&&_.cwd!==o||u?.config?.command&&_.command!==u.config.command))??f.find(_=>nr(_,p,M))??null},[f,u?.config?.command,p,M]);n.useEffect(()=>{typeof v=="function"&&v().catch(o=>{e(tr(o),"error")})},[e,v]),n.useEffect(()=>{if(p){S(!1);return}S(!0)},[p]),n.useEffect(()=>{if(u?.status==="running"||u?.status==="starting"){u.config?.command?.trim().length>0&&d(u.config.command);return}if(de){d(o=>o.trim().length>0?o:de.command);return}f.length>0&&d(o=>o.trim().length>0?o:f[0]?.command??"")},[f,de,u?.config?.command,u?.status]),n.useEffect(()=>{b(c??"")},[c]);const ve=n.useCallback(()=>{xe(!1),window.requestAnimationFrame(()=>Oe.current?.focus())},[]),kr=Ir(ve);n.useEffect(()=>{if(!ie)return;ye.current?.focus();const o=_=>{if(_.key==="Escape"){ve();return}if(_.key!=="Tab")return;const oe=Array.from(ye.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(Ve=>!Ve.hasAttribute("disabled")&&Ve.getAttribute("aria-hidden")!=="true"),Z=oe[0],Ce=oe.at(-1);!Z||!Ce||(_.shiftKey&&document.activeElement===Z?(_.preventDefault(),Ce.focus()):!_.shiftKey&&document.activeElement===Ce&&(_.preventDefault(),Z.focus()))};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[ve,ie]),n.useEffect(()=>{!W&&ie&&xe(!1)},[W,ie]);const ke=n.useCallback(()=>{c&&window.open(c,"_blank","noopener,noreferrer")},[c]),He=n.useCallback(()=>{Q(!1),Fe()},[Fe]),Cr=n.useCallback(()=>{try{const o=re.current;if(o?.contentWindow){o.contentWindow.location.reload(),Q(!1),ce();return}}catch{}if(!(!c||!re.current))try{const o=new URL(c);o.searchParams.set("_t",Date.now().toString()),re.current.src=o.toString(),Q(!1),ce()}catch{re.current.src=c,Q(!1),ce()}},[c,re,ce]),ue=n.useCallback(async(o,_,oe)=>{Te(o);try{await _(),e(oe,"success")}catch(Z){e(tr(Z),"error")}finally{Te(null)}},[e]),Er=n.useCallback(o=>{w(o.scriptName),S(!1),d(o.command),e(a("devserver.toast.selectedScript","Selected {{name}} script.",{name:o.scriptName}),"success")},[e]),Lr=n.useCallback(()=>{w(null),S(!0),e(a("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),jr=n.useCallback(o=>{A&&o&&o!==x&&e(a("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),R(o)},[e,A,x,a]),Rr=()=>{const o=y.trim();if(o.length===0){e(a("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const _=sr(M)??".",Z=X?.worktree??null??de?.cwd??_;ue("start",()=>z(o,Z),a("devserver.toast.started","Dev server started."))},Ur=()=>{ue("stop",L,a("devserver.toast.stopped","Dev server stopped."))},Dr=()=>{ue("restart",E,a("devserver.toast.restarted","Dev server restarted."))},Pr=()=>{const o=l.trim(),_=o.length>0?o:null;ue("preview",()=>h(_),_?a("devserver.toast.previewUpdated","Preview URL updated."):a("devserver.toast.previewCleared","Preview URL override cleared."))},Mr=n.useCallback(()=>{N&&g()},[N,g]),_r=k==="starting"||k==="running"||Y!==null,Ar=k==="stopped"||Y!==null,Tr=k==="stopped"||k==="starting"||Y!==null,Be=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(We,{size:14}),r.jsx("span",{children:a("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:c??a("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[a("devserver.auto","Auto"),c?` · ${c}`:a("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>xr(o=>o==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:ae==="embedded"?a("devserver.externalOnly","External only"):a("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:a("devserver.openInNewTab","Open in new tab"),onClick:ke,disabled:!c,"data-testid":"devserver-preview-open-tab",children:r.jsx(Qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:a("devserver.refreshPreview","Refresh preview"),onClick:Cr,disabled:!c,"data-testid":"devserver-preview-refresh",children:r.jsx(Zr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":q,"data-embedded":Nr?"true":"false",children:[!c&&!A&&r.jsx("p",{className:"devserver-preview-empty",children:a("devserver.startDevServer","Start a dev server to see a live preview here.")}),!c&&A&&r.jsx("p",{className:"devserver-preview-empty",children:a("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),c&&ae==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:a("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ke,"data-testid":"devserver-preview-external-open-tab",children:a("devserver.openInNewTab","Open in new tab")})]}),c&&ae==="embedded"&&$e&&Se&&r.jsxs("div",{className:q==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[q==="error"?r.jsx(or,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(lr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:q==="error"?a("devserver.previewFailed","Preview failed"):a("devserver.previewBlocked","Preview blocked")}),Ne&&r.jsx("p",{className:"devserver-preview-blocked-context",children:Ne})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:a("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:ke,"data-testid":"devserver-preview-fallback-open-tab",children:a("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:He,"data-testid":"devserver-preview-fallback-retry",children:a("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),c&&ae==="embedded"&&!$e&&r.jsx(Ct,{url:c,embedStatus:q,onEmbedStatusChange:Sr,iframeRef:re,blockReason:Ne,onRetry:He})]})]});return r.jsxs("div",{ref:F,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":W?"true":"false",children:[r.jsx(qr,{icon:Jr,title:a("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${O.className}`,"data-testid":"dev-server-status-badge",children:O.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Rr,disabled:_r,"data-testid":"dev-server-start-button",children:[r.jsx(Xr,{size:14}),r.jsx("span",{children:Y==="start"?a("devserver.starting","Starting..."):a("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ur,disabled:Ar,"data-testid":"dev-server-stop-button",children:[r.jsx(Kr,{size:14}),r.jsx("span",{children:Y==="stop"?a("devserver.stopping","Stopping..."):a("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Dr,disabled:Tr,"data-testid":"dev-server-restart-button",children:[r.jsx(Yr,{size:14}),r.jsx("span",{children:Y==="restart"?a("devserver.restarting","Restarting..."):a("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":a("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:a("devserver.configuration","Configuration")}),C&&r.jsx("span",{className:"dev-server-muted",children:a("devserver.loading","Loading...")})]}),C&&!u&&f.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(ge,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:a("devserver.loadingConfig","Loading dev server configuration...")})]}),N&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:N}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Mr,children:a("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:a("devserver.scriptSelection","Script Selection")}),p&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:p}),r.jsx("span",{className:"dev-server-candidate-source",children:M??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>S(!0),"data-testid":"dev-server-change-selection",children:a("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Lr,"data-testid":"dev-server-clear-selection",children:a("devserver.clear","Clear")})]}),D&&f.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:a("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),D&&f.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:f.map(o=>{const _=nr(o,p,M);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${_?"dev-server-candidate--selected":""}`,onClick:()=>Er(o),"data-testid":`dev-server-candidate-${o.scriptName}-${br(o.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:o.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Mt(o.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:Pt(o)})]},`${o.cwd}::${o.scriptName}::${o.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:a("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:a("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:x??"",onChange:o=>jr(o.target.value.length>0?o.target.value:null),disabled:G.length===0,"aria-label":a("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:a("devserver.projectRootNoTask","Project root (no task)")}),G.map(o=>r.jsx("option",{value:o.id,children:o.title?`${o.id} — ${o.title}`:o.id},o.id))]}),G.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:a("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),X&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:X.title?`${X.id} — ${X.title}`:X.id})}),r.jsx("p",{className:"dev-server-task-description",children:X.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:a("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:X.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:a("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:y,onChange:o=>d(o.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:k==="running"||k==="starting"})]}),(k==="running"||k==="starting")&&u&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:a("devserver.runningCommand","Running command")}),r.jsx("code",{children:u.config?.command??y})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:a("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:l,onChange:o=>b(o.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Pr,disabled:Y==="preview","data-testid":"dev-server-set-preview",children:a("devserver.save","Save")})]}),c&&r.jsx("p",{className:"dev-server-preview-hint",children:a("devserver.autoDetected","Auto-detected: {{url}}",{url:c})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":a("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:a("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:a("devserver.lines","{{count}} lines",{count:P??j.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(Nt,{entries:j,loading:H,loadingMore:I,hasMore:B,total:P,onLoadMore:V,isRunning:A})})]})}),W?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":a("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(We,{size:14}),r.jsx("span",{children:a("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:c??a("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:c||a("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:c?a("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):a("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:Oe,onClick:()=>xe(!0),"data-testid":"devserver-preview-modal-open",children:a("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":a("devserver.previewLabel","Dev server preview"),children:Be()}),W&&ie&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...kr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:ye,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:a("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ve,"aria-label":a("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Gr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:Be()})]})})]})}export{Ht as DevServerView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{
|
|
1
|
+
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{ab as z,ac as D,ad as S,ae as w,k as j,af as T,E as B,y as A,P as L,L as K,l as N}from"./index-DpCHwyiD.js";import{u as R}from"./vendor-i18n-Duky4gdQ.js";import{F as U}from"./folder-open-CteOypVk.js";function M({value:b,onChange:h,placeholder:F,onInputKeyDown:g,nodeId:k,localNodeId:m,selectCreatedDirectory:x=!1}){const{t:i}=R("app"),[e,s]=n.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1,createFolderOpen:!1,createFolderError:null}),[p,u]=n.useState(""),d=n.useCallback(async(t,c=!1)=>{s(o=>({...o,loading:!0,error:null}));try{const o=await z(t,c,k,m);s(a=>({...a,loading:!1,currentPath:o.currentPath,parentPath:o.parentPath,entries:o.entries}))}catch(o){s(a=>({...a,loading:!1,error:o instanceof Error?o.message:"Failed to browse directory"}))}},[k,m]),C=n.useCallback(()=>{s(t=>t.isOpen?{...t,isOpen:!1}:{...t,isOpen:!0})},[]);n.useEffect(()=>{e.isOpen&&!e.loading&&!e.currentPath&&!e.error&&d(b||void 0,e.showHidden)},[e.isOpen,e.loading,e.currentPath,e.error,b,e.showHidden,d,k,m]);const y=n.useCallback(t=>{d(t,e.showHidden)},[d,e.showHidden]),H=n.useCallback(()=>{h(e.currentPath),s(t=>({...t,isOpen:!1}))},[e.currentPath,h]),E=n.useCallback(()=>{s(t=>{const c=!t.showHidden;return{...t,showHidden:c}})},[]);n.useEffect(()=>{e.isOpen&&e.currentPath&&d(e.currentPath,e.showHidden)},[e.showHidden,d]);const f=n.useCallback(()=>{s(t=>({...t,createFolderOpen:!t.createFolderOpen,createFolderError:null})),u("")},[]),P=n.useCallback(async()=>{if(!p.trim()||!e.currentPath)return;const t=p.trim();if(t.includes("/")||t.includes("\\")||t.includes("..")){s(a=>({...a,createFolderError:i("dirPicker.createFolderError","Folder name cannot contain path separators or '..'")}));return}const c=e.currentPath.includes("\\")?"\\":"/",o=e.currentPath.endsWith(c)?e.currentPath+t:e.currentPath+c+t;s(a=>({...a,loading:!0,createFolderError:null}));try{const a=await D(o);u(""),s(l=>({...l,createFolderOpen:!1})),x?(h(a.path),await d(a.path,e.showHidden),s(l=>l.error?{...l,isOpen:!1,error:null}:l)):await d(e.currentPath,e.showHidden)}catch(a){s(l=>({...l,loading:!1,createFolderError:a instanceof Error?a.message:"Failed to create folder"}))}},[p,e.currentPath,e.showHidden,d,h,x]),O=n.useCallback(t=>{t.key==="Enter"?(t.preventDefault(),P()):t.key==="Escape"&&(s(c=>({...c,createFolderOpen:!1,createFolderError:null})),u(""))},[P]),v=e.currentPath?S(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:b,onChange:t=>h(t.target.value),onKeyDown:g,placeholder:F||i("dirPicker.defaultPlaceholder","/path/to/your/project")}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:C,"aria-label":e.isOpen?i("dirPicker.closeBrowser","Close directory browser"):i("dirPicker.openBrowser","Browse directories"),children:[e.isOpen?r.jsx(U,{size:16}):r.jsx(w,{size:16}),r.jsx("span",{children:i("dirPicker.browse","Browse")})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":i("dirPicker.ariaLabel","Directory browser"),children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:v.map((t,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(j,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>y(t.path),title:t.path,children:t.label})]},t.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>y(e.parentPath),"aria-label":i("dirPicker.parentDir","Go to parent directory"),title:i("dirPicker.parentDirTitle","Parent directory"),children:[r.jsx(T,{size:14}),r.jsx("span",{children:i("dirPicker.up","Up")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:E,"aria-label":e.showHidden?i("dirPicker.hideHiddenAria","Hide hidden directories"):i("dirPicker.showHiddenAria","Show hidden directories"),title:e.showHidden?i("dirPicker.hideHiddenTitle","Hide hidden"):i("dirPicker.showHiddenTitle","Show hidden"),children:[e.showHidden?r.jsx(B,{size:14}):r.jsx(A,{size:14}),r.jsx("span",{children:e.showHidden?i("dirPicker.hideHidden","Hide hidden"):i("dirPicker.showHidden","Show hidden")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-create-folder-toggle",onClick:f,"aria-label":i("dirPicker.createFolderAria","Create new folder"),title:i("dirPicker.createFolderTitle","Create folder"),children:[r.jsx(L,{size:14}),r.jsx("span",{children:i("dirPicker.createFolder","New folder")})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(K,{size:20,className:"animate-spin"}),r.jsx("span",{children:i("dirPicker.loading","Loading…")})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(N,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:i("dirPicker.noSubdirs","No subdirectories")}):e.entries.map(t=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>y(t.path),role:"treeitem",title:t.path,children:[r.jsx(w,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:t.name}),t.hasChildren&&r.jsx(j,{size:14,className:"directory-picker-entry-arrow"})]},t.path))}),e.createFolderOpen&&r.jsxs("div",{className:"directory-picker-create-folder",children:[r.jsx("input",{type:"text",className:"input directory-picker-create-folder-input",value:p,onChange:t=>u(t.target.value),onKeyDown:O,placeholder:i("dirPicker.newFolderPlaceholder","Folder name"),autoFocus:!0}),r.jsxs("div",{className:"directory-picker-create-folder-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm btn-primary",onClick:P,disabled:!p.trim()||e.loading||!e.currentPath,children:i("dirPicker.createFolderConfirm","Create")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-secondary",onClick:f,children:i("dirPicker.cancel","Cancel")})]}),e.createFolderError&&r.jsxs("div",{className:"directory-picker-create-folder-error",children:[r.jsx(N,{size:14}),r.jsx("span",{children:e.createFolderError})]})]}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:H,children:i("dirPicker.select","Select")})]})]})]})}export{M as D};
|