cc-viewer 1.4.19 → 1.4.21

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.
@@ -38,4 +38,4 @@ body{margin:0;background-color:#0d0d0d}*{scrollbar-width:thin;scrollbar-color:#3
38
38
 
39
39
  Outdated base version: https://github.com/primer/github-syntax-dark
40
40
  Current colors taken from GitHub's CSS
41
- */.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}._fileContentView_1ti8s_1{display:flex;flex-direction:column;height:100%;background:#0d0d0d}._header_1ti8s_8{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #2a2a2a;background:#111;flex-shrink:0}._headerLeft_1ti8s_18{display:flex;align-items:center;gap:8px;flex:1;min-width:0}._backBtn_1ti8s_26{width:28px;height:28px;border:none;background:none;color:#666;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:6px;padding:0;flex-shrink:0;transition:background .15s,color .15s}._backBtn_1ti8s_26:hover{color:#ccc;background:#1a1a1a}._filePath_1ti8s_47{font-size:13px;color:#ccc;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._fileSize_1ti8s_55{font-size:11px;color:#666;flex-shrink:0}._contentContainer_1ti8s_61{flex:1;overflow:hidden;background:#0d0d0d;display:flex}._codeBlock_1ti8s_68{display:flex;flex:1;min-height:0;min-width:0;overflow:hidden}._lineNumberCol_1ti8s_76{flex-shrink:0;overflow:hidden;background:#0d0d0d;border-right:1px solid #2a2a2a;-webkit-user-select:none;user-select:none}._lineNumberRow_1ti8s_84{padding:0 16px;text-align:right;color:#555;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:13px;line-height:1.5;white-space:nowrap}._codeCol_1ti8s_94{flex:1;overflow:auto;min-width:0}._codeContent_1ti8s_100{padding:0;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:13px;line-height:1.5;color:#e0e0e0;-moz-tab-size:2;tab-size:2;margin:0;width:fit-content;min-width:100%}._codeContent_1ti8s_100 code{font-family:inherit;font-size:inherit;line-height:inherit;background:none;padding:0;display:block}._lineContentRow_1ti8s_121{padding:0 16px;white-space:pre}._loading_1ti8s_126{display:flex;align-items:center;justify-content:center;height:100%;color:#666;font-size:14px}._error_1ti8s_135{display:flex;align-items:center;justify-content:center;height:100%;color:#ff6b6b;font-size:14px}._gitChanges_9ib9h_1{width:240px;flex-shrink:0;background:#111;border-right:1px solid #2a2a2a;display:flex;flex-direction:column;overflow:hidden;-webkit-user-select:none;user-select:none}._header_9ib9h_12{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #2a2a2a;flex-shrink:0}._headerTitle_9ib9h_21{font-size:11px;font-weight:600;color:#888;text-transform:uppercase;letter-spacing:.5px}._collapseBtn_9ib9h_29{width:20px;height:20px;border:none;background:none;color:#666;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;padding:0}._collapseBtn_9ib9h_29:hover{color:#ccc;background:#2a2a2a}._changesContainer_9ib9h_48{flex:1;overflow:auto;padding:4px 0}._changeItem_9ib9h_54{display:flex;align-items:center;height:26px;padding:0 8px;cursor:pointer;color:#ccc;font-size:13px;white-space:nowrap;transition:background .1s;gap:6px}._changeItem_9ib9h_54:hover{background:#1a1a1a}._dirItem_9ib9h_71{display:flex;align-items:center;height:26px;padding:0 8px;color:#999;font-size:13px;white-space:nowrap;gap:6px}._dirArrow_9ib9h_82{width:16px;flex-shrink:0;color:#666;display:flex;align-items:center;justify-content:center}._dirName_9ib9h_91{overflow:hidden;text-overflow:ellipsis}._status_9ib9h_96{width:16px;flex-shrink:0;font-size:11px;font-weight:600;text-align:center;margin-left:auto}._icon_9ib9h_105{width:16px;height:16px;flex-shrink:0;display:flex;align-items:center;justify-content:center}._fileName_9ib9h_114{overflow:hidden;text-overflow:ellipsis;flex:1}._loading_9ib9h_120{color:#555;font-size:12px;padding:8px 12px}._error_9ib9h_126{color:#ff6b6b;font-size:12px;padding:8px 12px}._empty_9ib9h_132{color:#666;font-size:12px;padding:8px 12px;text-align:center}._fullFileDiffView_1u9hn_1{width:100%;height:100%;display:flex;flex-direction:column;background:#0d0d0d;overflow:hidden}._diffSummary_1u9hn_10{padding:8px 16px;background:#111;border-bottom:1px solid #2a2a2a;display:flex;gap:8px;align-items:center;flex-shrink:0}._addedBadge_1u9hn_20{padding:2px 8px;background:#73c99126;border:1px solid rgba(115,201,145,.3);border-radius:4px;font-size:11px;font-weight:600;color:#73c991;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}._modifiedBadge_1u9hn_31{padding:2px 8px;background:#e2c08d26;border:1px solid rgba(226,192,141,.3);border-radius:4px;font-size:11px;font-weight:600;color:#e2c08d;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}._deletedBadge_1u9hn_42{padding:2px 8px;background:#f14c4c26;border:1px solid rgba(241,76,76,.3);border-radius:4px;font-size:11px;font-weight:600;color:#f14c4c;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}._codeContainer_1u9hn_53{flex:1;overflow:hidden;display:flex;min-height:0;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:13px;line-height:1.6}._lineNumberCol_1u9hn_63{flex-shrink:0;overflow:hidden;background:#0d0d0d;border-right:1px solid #2a2a2a;-webkit-user-select:none;user-select:none}._lineNumNormal_1u9hn_71{padding:0 12px 0 8px;text-align:right;color:#555;font-size:12px;min-height:21px}._lineNumAdd_1u9hn_79{padding:0 9px 0 8px;text-align:right;color:#73c991;font-weight:600;font-size:12px;min-height:21px;border-right:3px solid #73c991}._lineNumModify_1u9hn_89{padding:0 9px 0 8px;text-align:right;color:#e2c08d;font-weight:600;font-size:12px;min-height:21px;border-right:3px solid #e2c08d}._lineNumDelete_1u9hn_99{padding:0 9px 0 8px;text-align:right;color:#f14c4c;font-weight:600;font-size:12px;min-height:21px;border-right:3px solid #f14c4c}._codeCol_1u9hn_109{flex:1;overflow:auto;min-width:0}._codeInner_1u9hn_115{width:fit-content;min-width:100%}._codeLine_1u9hn_120{position:relative;min-height:21px;transition:background .1s}._codeLine_1u9hn_120:hover{background:#ffffff08}._lineContent_1u9hn_130{padding-right:16px;padding-left:8px;color:#ccc;white-space:pre}._lineNormal_1u9hn_137{background:transparent}._lineAdd_1u9hn_141{background:#73c9911a}._lineModify_1u9hn_145{background:#e2c08d1a;position:relative}._lineDelete_1u9hn_150{background:#f14c4c1a}._lineDelete_1u9hn_150 ._lineContent_1u9hn_130{text-decoration:line-through;opacity:.8}._lineModify_1u9hn_145:hover ._oldContentTooltip_1u9hn_159{display:block}._oldContentTooltip_1u9hn_159{display:none;position:absolute;left:60px;top:100%;z-index:1000;background:#1a1a1a;border:1px solid #444;border-radius:4px;padding:8px 12px;max-width:600px;box-shadow:0 4px 12px #00000080;margin-top:4px}._tooltipLabel_1u9hn_178{font-size:10px;color:#888;margin-bottom:4px;text-transform:uppercase;letter-spacing:.5px}._tooltipContent_1u9hn_186{font-size:12px;color:#f14c4c;white-space:pre;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;text-decoration:line-through;opacity:.8}._gitDiffView_14i1p_1{flex:1;display:flex;flex-direction:column;background:#0d0d0d;overflow:hidden}._header_14i1p_9{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #2a2a2a;background:#111;flex-shrink:0}._headerLeft_14i1p_19{display:flex;align-items:center;gap:12px;flex:1;min-width:0}._backBtn_14i1p_27{width:28px;height:28px;border:none;background:none;color:#888;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;padding:0;flex-shrink:0;transition:all .15s}._backBtn_14i1p_27:hover{color:#ccc;background:#2a2a2a}._filePath_14i1p_48{font-size:13px;color:#ccc;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._diffBadge_14i1p_57{padding:2px 8px;background:#2a2a2a;border:1px solid #444;border-radius:4px;font-size:10px;font-weight:600;color:#e2c08d;letter-spacing:.5px;flex-shrink:0}._contentContainer_14i1p_69{flex:1;overflow:auto;position:relative}._loading_14i1p_75{display:flex;align-items:center;justify-content:center;height:100%;color:#888;font-size:13px}._error_14i1p_84{display:flex;align-items:center;justify-content:center;height:100%;color:#ff6b6b;font-size:13px;padding:20px;text-align:center}._binaryNotice_14i1p_95{display:flex;align-items:center;justify-content:center;height:100%;color:#888;font-size:13px;font-style:italic;padding:20px;text-align:center}._largeFileWarning_14i1p_107{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#e2c08d;font-size:13px;padding:20px;text-align:center;gap:8px}._fileSize_14i1p_120{color:#888;font-size:12px;margin:0}._centerEmpty_8tuwm_1{display:flex;align-items:center;justify-content:center;height:100%}._container_8tuwm_8{flex:1;overflow:auto;padding:16px 24px;display:flex;flex-direction:column;-webkit-overflow-scrolling:touch;overscroll-behavior:contain}._sessionDividerText_8tuwm_18{font-size:11px;color:#555}._lastResponseLabel_8tuwm_23{font-size:11px}._splitContainer_8tuwm_27{display:flex;flex-direction:row;height:100%;overflow:hidden}._chatSection_8tuwm_34{display:flex;flex-direction:column;min-width:0;overflow:hidden}._vResizer_8tuwm_41{width:5px;background:#1a1a1a;cursor:col-resize;flex-shrink:0;border-left:1px solid #2a2a2a;border-right:1px solid #2a2a2a;transition:background .15s}._vResizer_8tuwm_41:hover{background:#2a2a2a}._snapLine_8tuwm_55{position:absolute;top:0;bottom:0;width:2px;background:transparent;border-left:2px dashed rgba(255,255,255,.1);pointer-events:none;z-index:1000;transition:all .15s}._snapLineActive_8tuwm_67{position:absolute;top:0;bottom:0;width:2px;background:transparent;border-left:2px dashed rgba(255,255,255,.5);pointer-events:none;z-index:1001}._snapLineLabel_8tuwm_78{position:absolute;top:50%;left:8px;transform:translateY(-50%);background:#ffffffe6;color:#000;padding:4px 8px;border-radius:4px;font-size:11px;font-weight:600;white-space:nowrap;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;box-shadow:0 2px 8px #0000004d}._snapPreview_8tuwm_94{position:absolute;top:0;bottom:0;background:#ffffff1a;pointer-events:none;z-index:999}._vResizer_8tuwm_41:hover{background:#333}._chatInputBar_8tuwm_107{display:flex;align-items:flex-end;gap:8px;padding:10px 16px;background:#111;border-top:1px solid #2a2a2a;flex-shrink:0}._chatInputWrapper_8tuwm_117{flex:1;display:flex;flex-direction:column;background:#1a1a1a;border:1px solid #333;border-radius:12px;transition:border-color .2s;overflow:hidden}._chatInputWrapper_8tuwm_117:focus-within{border-color:#555}._chatTextareaWrap_8tuwm_132{position:relative;flex:1}._chatTextarea_8tuwm_132{width:100%;min-height:22px;max-height:120px;padding:10px 14px;background:transparent;color:#e0e0e0;border:none;outline:none;resize:none;font-size:14px;line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}._chatTextarea_8tuwm_132::placeholder{color:#555}._chatInputHint_8tuwm_156{font-size:11px;color:#444;padding:0 14px 6px;-webkit-user-select:none;user-select:none}._chatSendBtn_8tuwm_163{width:36px;height:36px;border-radius:10px;border:none;background:#4a9eff;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .15s,opacity .15s}._chatSendBtn_8tuwm_163:hover{background:#3a8eef}._chatSendBtn_8tuwm_163:disabled{opacity:.35;cursor:default}._chatSendBtn_8tuwm_163 svg{width:18px;height:18px}._messageListWrap_8tuwm_192{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}._stickyBottomBtn_8tuwm_200{position:absolute;left:0;bottom:0;display:flex;flex-direction:column;align-items:center;gap:2px;padding:8px 18px;height:60px;justify-content:center;border-radius:0;border:none;background:none;color:#999;font-size:12px;cursor:pointer;transition:color .15s;z-index:10;box-shadow:none}._stickyBottomBtn_8tuwm_200 span{background:#00000080;padding:2px 10px;border-radius:10px}._stickyBottomBtn_8tuwm_200:hover{color:#fff;background:none}._ptyPromptBubble_8tuwm_233{margin:8px 0;padding:12px 16px;border-radius:12px;border:1px solid #3a3a3a;background:#161616;animation:_ptyPromptFadeIn_8tuwm_1 .25s ease-out}._ptyPromptResolved_8tuwm_242{opacity:.55}@keyframes _ptyPromptFadeIn_8tuwm_1{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}._ptyPromptQuestion_8tuwm_251{font-size:13px;color:#ccc;margin-bottom:10px;line-height:1.4}._ptyPromptOptions_8tuwm_258{display:flex;flex-wrap:wrap;gap:8px}._ptyPromptOption_8tuwm_258{padding:6px 14px;border-radius:18px;border:1px solid #3a3a3a;background:#1a1a1a;color:#bbb;font-size:12px;cursor:pointer;transition:background .15s,color .15s,border-color .15s;white-space:nowrap}._ptyPromptOption_8tuwm_258:hover{background:#2a2a2a;color:#eee;border-color:#555}._ptyPromptOptionPrimary_8tuwm_282{padding:6px 14px;border-radius:18px;border:1px solid #4a9eff;background:#4a9eff26;color:#4a9eff;font-size:12px;cursor:pointer;transition:background .15s,color .15s,border-color .15s;white-space:nowrap}._ptyPromptOptionPrimary_8tuwm_282:hover{background:#4a9eff40;color:#6ab4ff;border-color:#6ab4ff}._ptyPromptOptionChosen_8tuwm_300{padding:6px 14px;border-radius:18px;border:1px solid #4a9eff;background:#4a9eff33;color:#4a9eff;font-size:12px;cursor:default;white-space:nowrap}._ptyPromptOptionDimmed_8tuwm_311{padding:6px 14px;border-radius:18px;border:1px solid #2a2a2a;background:transparent;color:#444;font-size:12px;cursor:default;white-space:nowrap}._ghostText_8tuwm_322{position:absolute;top:0;left:0;right:0;padding:10px 14px;color:#444;font-size:14px;line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;pointer-events:none;white-space:pre-wrap;overflow:hidden;max-height:120px}._suggestionChip_8tuwm_338{display:flex;align-items:center;gap:8px;padding:8px 14px;background:#1a1a1a;border-top:1px solid #2a2a2a;cursor:pointer;flex-shrink:0;transition:background .15s}._suggestionChip_8tuwm_338:hover{background:#222}._suggestionChipText_8tuwm_354{flex:1;color:#555;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._suggestionChipAction_8tuwm_363{color:#4a9eff;font-size:14px;flex-shrink:0}._navSidebar_8tuwm_369{width:40px;flex-shrink:0;background:#0d0d0d;border-right:1px solid #2a2a2a;display:flex;flex-direction:column;align-items:center;padding-top:8px;gap:4px}._navBtn_8tuwm_381{width:32px;height:32px;border:none;background:none;color:#666;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:6px;padding:0;transition:background .15s,color .15s}._navBtn_8tuwm_381:hover{color:#ccc;background:#1a1a1a}._navBtnActive_8tuwm_401{width:32px;height:32px;border:none;background:#4a9eff26;color:#4a9eff;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:6px;padding:0;transition:background .15s,color .15s}._navBtnActive_8tuwm_401:hover{background:#4a9eff40;color:#6ab4ff}._resizer_yamj2_1{width:6px;cursor:col-resize;background:#1f1f1f;flex-shrink:0;transition:background .2s}._resizer_yamj2_1:hover{background:#3b82f6}._container_1um1r_1{display:flex;flex-direction:column;height:100%;background:#0a0a0a;overflow:hidden}._fileListSection_1um1r_10{height:300px;flex-shrink:0;display:flex;flex-direction:column;background:#111;border-bottom:1px solid #2a2a2a}._header_1um1r_19{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #2a2a2a;flex-shrink:0}._headerTitle_1um1r_28{font-size:11px;font-weight:600;color:#888;text-transform:uppercase;letter-spacing:.5px}._fileCount_1um1r_36{font-size:10px;color:#555;background:#1a1a1a;padding:1px 6px;border-radius:8px}._changesContainer_1um1r_44{flex:1;overflow:auto;padding:4px 0;-webkit-overflow-scrolling:touch}._changeItem_1um1r_51{display:flex;align-items:center;height:28px;padding:0 8px;cursor:pointer;color:#ccc;font-size:13px;white-space:nowrap;transition:background .1s;gap:6px}._changeItem_1um1r_51:hover{background:#1a1a1a}._changeItemActive_1um1r_68{background:#4a9eff1f;color:#fff}._changeItemActive_1um1r_68:hover{background:#4a9eff2e}._dirItem_1um1r_77{display:flex;align-items:center;height:26px;padding:0 8px;color:#999;font-size:13px;white-space:nowrap;gap:6px}._dirArrow_1um1r_88{width:16px;flex-shrink:0;color:#666;display:flex;align-items:center;justify-content:center}._dirName_1um1r_97{overflow:hidden;text-overflow:ellipsis}._status_1um1r_102{width:16px;flex-shrink:0;font-size:11px;font-weight:600;text-align:center;margin-left:auto}._icon_1um1r_111{width:16px;height:16px;flex-shrink:0;display:flex;align-items:center;justify-content:center}._fileName_1um1r_120{overflow:hidden;text-overflow:ellipsis;flex:1}._diffSection_1um1r_127{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}._diffHeader_1um1r_135{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid #2a2a2a;background:#111;flex-shrink:0}._diffFilePath_1um1r_145{font-size:12px;color:#ccc;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}._diffBadge_1um1r_155{padding:2px 8px;background:#2a2a2a;border:1px solid #444;border-radius:4px;font-size:10px;font-weight:600;color:#e2c08d;letter-spacing:.5px;flex-shrink:0}._diffContent_1um1r_167{flex:1;overflow:auto;-webkit-overflow-scrolling:touch}._diffPlaceholder_1um1r_173{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:#333;font-size:13px}._statusText_1um1r_184{color:#555;font-size:12px;padding:16px 12px;text-align:center}._errorText_1um1r_191{color:#ff6b6b;font-size:12px;padding:16px 12px;text-align:center}._emptyText_1um1r_198{color:#666;font-size:12px;padding:16px 12px;text-align:center}._warningText_1um1r_205{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;color:#e2c08d;font-size:13px;text-align:center;gap:8px}._layout_1iry8_1{height:100vh;overflow:hidden}._header_1iry8_6{background:#111;border-bottom:1px solid #1f1f1f;padding:0 24px;height:60px;line-height:60px}._content_1iry8_14{flex:1;overflow:hidden}._mainContainer_1iry8_19{display:flex;height:100%}._leftPanel_1iry8_24{flex-shrink:0;border-right:1px solid #1f1f1f;display:flex;flex-direction:column;background:#0a0a0a}._leftPanelHeader_1iry8_32{padding:10px 16px;border-bottom:1px solid #1f1f1f;font-size:13px;color:#9ca3af;font-weight:500;display:flex;justify-content:space-between;align-items:center}._leftPanelCount_1iry8_43{font-size:12px;color:#555;font-weight:400}._leftPanelBody_1iry8_49{flex:1;overflow:hidden}._rightPanel_1iry8_54{flex:1;overflow:hidden;background:#0d0d0d}._modalActions_1iry8_60{margin-bottom:12px}._spinCenter_1iry8_64{text-align:center;padding:40px}._emptyCenter_1iry8_69{text-align:center;color:#999;padding:40px}._logCheckbox_1iry8_75{margin-right:8px}._logListContainer_1iry8_79{background:#0d0d0d;border-radius:8px;overflow:hidden}._logListItem_1iry8_85{cursor:pointer;padding:8px 12px;border-bottom:1px solid #222}._logItemRow_1iry8_91{display:flex;align-items:center;width:100%;justify-content:space-between;flex-wrap:nowrap;gap:12px}._logItemRow_1iry8_91>span:first-child{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden}._logFileName_1iry8_108{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._logItemRow_1iry8_91>span:last-child{display:flex;align-items:center;flex-shrink:0;gap:8px}._logFileIcon_1iry8_121{margin-right:8px;color:#3b82f6;flex-shrink:0}._loadingOverlay_1iry8_127{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#000000bf;display:flex;align-items:center;justify-content:center;z-index:9999}._loadingText_1iry8_140{color:#fff;font-size:16px;font-weight:700}._footer_1iry8_146{height:18px;background:#000;display:flex;align-items:center;justify-content:flex-end;padding:0 12px;flex-shrink:0}._footerRight_1iry8_156{display:flex;align-items:center;gap:6px;font-size:11px;color:#555}._footerText_1iry8_164{color:#444;margin-right:2px}._footerLink_1iry8_169{display:inline-flex;align-items:center;gap:3px;color:#555;text-decoration:none}._footerLink_1iry8_169:hover{color:#888}._footerIcon_1iry8_181{width:12px;height:12px}._footerDivider_1iry8_186{color:#333}._footerText_1iry8_164{color:#555}._guideContainer_1iry8_194{display:flex;align-items:center;justify-content:center;height:100%;background:#0a0a0a}._guideContent_1iry8_202{max-width:560px;padding:40px}._guideTitle_1iry8_207{font-size:20px;font-weight:600;color:#e0e0e0;margin:0 0 28px}._guideStep_1iry8_214{display:flex;gap:14px;margin-bottom:22px}._guideStepNum_1iry8_220{flex-shrink:0;width:24px;height:24px;border-radius:50%;background:#1a1a2e;color:#7c8aff;font-size:13px;font-weight:600;display:flex;align-items:center;justify-content:center;margin-top:1px}._guideStepBody_1iry8_235{flex:1;min-width:0}._guideText_1iry8_240{color:#aaa;font-size:14px;line-height:1.6;margin:0 0 8px}._guideCode_1iry8_247{display:block;background:#141414;border:1px solid #252525;border-radius:6px;padding:10px 14px;color:#8b9cf7;font-size:13px;line-height:1.5;word-break:break-all;white-space:pre-wrap}._mobileChatOverlay_1iry8_260{position:absolute;top:0;right:0;bottom:0;left:0;transform:translate(100%);transition:transform .3s ease;z-index:100;background:#0a0a0a;display:flex;flex-direction:column;overflow:hidden}._mobileChatOverlayVisible_1iry8_272{transform:translate(0)}._mobileChatInner_1iry8_276{flex:1;min-height:0;display:flex;flex-direction:column;zoom:.6}._mobileGitDiffOverlay_1iry8_284{position:absolute;top:0;right:0;bottom:0;left:0;transform:translate(-100%);transition:transform .3s ease;z-index:100;background:#0a0a0a;display:flex;flex-direction:column;overflow:hidden}._mobileGitDiffOverlayVisible_1iry8_296{transform:translate(0)}._mobileGitDiffInner_1iry8_300{flex:1;min-height:0;display:flex;flex-direction:column;zoom:.6}
41
+ */.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}._fileContentView_e81mn_1{display:flex;flex-direction:column;height:100%;background:#0d0d0d}._header_e81mn_8{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #2a2a2a;background:#111;flex-shrink:0}._headerLeft_e81mn_18{display:flex;align-items:center;gap:8px;flex:1;min-width:0}._backBtn_e81mn_26{width:28px;height:28px;border:none;background:none;color:#666;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:6px;padding:0;flex-shrink:0;transition:background .15s,color .15s}._backBtn_e81mn_26:hover{color:#ccc;background:#1a1a1a}._filePath_e81mn_47{font-size:13px;color:#ccc;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._fileSize_e81mn_55{font-size:11px;color:#666;flex-shrink:0}._contentContainer_e81mn_61{flex:1;overflow:hidden;background:#0d0d0d;display:flex}._codeBlock_e81mn_68{display:flex;flex:1;min-height:0;min-width:0;overflow:hidden}._lineNumberCol_e81mn_76{flex-shrink:0;overflow:hidden;background:#0d0d0d;border-right:1px solid #2a2a2a;-webkit-user-select:none;user-select:none}._lineNumberRow_e81mn_84{padding:0 16px;text-align:right;color:#555;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:13px;line-height:1.5;white-space:nowrap}._codeCol_e81mn_94{flex:1;overflow:auto;min-width:0}._codePane_e81mn_100{flex:1;min-width:0;display:flex;overflow:hidden}._minimap_e81mn_107{width:72px;flex-shrink:0;position:relative;border-left:1px solid #262626;background:#0f0f0f;cursor:pointer;-webkit-user-select:none;user-select:none}._minimapCanvas_e81mn_117{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}._minimapViewport_e81mn_124{position:absolute;left:2px;right:2px;top:0;height:56px;border:1px solid rgba(128,144,178,.75);background:#5f6e9133;border-radius:3px;pointer-events:none;cursor:grab}._codeCol_e81mn_94{scrollbar-width:none;-ms-overflow-style:none}._codeCol_e81mn_94::-webkit-scrollbar{width:0;height:0}._codeContent_e81mn_147{padding:0;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:13px;line-height:1.5;color:#e0e0e0;-moz-tab-size:2;tab-size:2;margin:0;width:fit-content;min-width:100%}._codeContent_e81mn_147 code{font-family:inherit;font-size:inherit;line-height:inherit;background:none;padding:0;display:block}._lineContentRow_e81mn_168{padding:0 16px;white-space:pre}._loading_e81mn_173{display:flex;align-items:center;justify-content:center;height:100%;color:#666;font-size:14px}._error_e81mn_182{display:flex;align-items:center;justify-content:center;height:100%;color:#ff6b6b;font-size:14px}._gitChanges_9ib9h_1{width:240px;flex-shrink:0;background:#111;border-right:1px solid #2a2a2a;display:flex;flex-direction:column;overflow:hidden;-webkit-user-select:none;user-select:none}._header_9ib9h_12{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #2a2a2a;flex-shrink:0}._headerTitle_9ib9h_21{font-size:11px;font-weight:600;color:#888;text-transform:uppercase;letter-spacing:.5px}._collapseBtn_9ib9h_29{width:20px;height:20px;border:none;background:none;color:#666;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;padding:0}._collapseBtn_9ib9h_29:hover{color:#ccc;background:#2a2a2a}._changesContainer_9ib9h_48{flex:1;overflow:auto;padding:4px 0}._changeItem_9ib9h_54{display:flex;align-items:center;height:26px;padding:0 8px;cursor:pointer;color:#ccc;font-size:13px;white-space:nowrap;transition:background .1s;gap:6px}._changeItem_9ib9h_54:hover{background:#1a1a1a}._dirItem_9ib9h_71{display:flex;align-items:center;height:26px;padding:0 8px;color:#999;font-size:13px;white-space:nowrap;gap:6px}._dirArrow_9ib9h_82{width:16px;flex-shrink:0;color:#666;display:flex;align-items:center;justify-content:center}._dirName_9ib9h_91{overflow:hidden;text-overflow:ellipsis}._status_9ib9h_96{width:16px;flex-shrink:0;font-size:11px;font-weight:600;text-align:center;margin-left:auto}._icon_9ib9h_105{width:16px;height:16px;flex-shrink:0;display:flex;align-items:center;justify-content:center}._fileName_9ib9h_114{overflow:hidden;text-overflow:ellipsis;flex:1}._loading_9ib9h_120{color:#555;font-size:12px;padding:8px 12px}._error_9ib9h_126{color:#ff6b6b;font-size:12px;padding:8px 12px}._empty_9ib9h_132{color:#666;font-size:12px;padding:8px 12px;text-align:center}._fullFileDiffView_1u9hn_1{width:100%;height:100%;display:flex;flex-direction:column;background:#0d0d0d;overflow:hidden}._diffSummary_1u9hn_10{padding:8px 16px;background:#111;border-bottom:1px solid #2a2a2a;display:flex;gap:8px;align-items:center;flex-shrink:0}._addedBadge_1u9hn_20{padding:2px 8px;background:#73c99126;border:1px solid rgba(115,201,145,.3);border-radius:4px;font-size:11px;font-weight:600;color:#73c991;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}._modifiedBadge_1u9hn_31{padding:2px 8px;background:#e2c08d26;border:1px solid rgba(226,192,141,.3);border-radius:4px;font-size:11px;font-weight:600;color:#e2c08d;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}._deletedBadge_1u9hn_42{padding:2px 8px;background:#f14c4c26;border:1px solid rgba(241,76,76,.3);border-radius:4px;font-size:11px;font-weight:600;color:#f14c4c;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}._codeContainer_1u9hn_53{flex:1;overflow:hidden;display:flex;min-height:0;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:13px;line-height:1.6}._lineNumberCol_1u9hn_63{flex-shrink:0;overflow:hidden;background:#0d0d0d;border-right:1px solid #2a2a2a;-webkit-user-select:none;user-select:none}._lineNumNormal_1u9hn_71{padding:0 12px 0 8px;text-align:right;color:#555;font-size:12px;min-height:21px}._lineNumAdd_1u9hn_79{padding:0 9px 0 8px;text-align:right;color:#73c991;font-weight:600;font-size:12px;min-height:21px;border-right:3px solid #73c991}._lineNumModify_1u9hn_89{padding:0 9px 0 8px;text-align:right;color:#e2c08d;font-weight:600;font-size:12px;min-height:21px;border-right:3px solid #e2c08d}._lineNumDelete_1u9hn_99{padding:0 9px 0 8px;text-align:right;color:#f14c4c;font-weight:600;font-size:12px;min-height:21px;border-right:3px solid #f14c4c}._codeCol_1u9hn_109{flex:1;overflow:auto;min-width:0}._codeInner_1u9hn_115{width:fit-content;min-width:100%}._codeLine_1u9hn_120{position:relative;min-height:21px;transition:background .1s}._codeLine_1u9hn_120:hover{background:#ffffff08}._lineContent_1u9hn_130{padding-right:16px;padding-left:8px;color:#ccc;white-space:pre}._lineNormal_1u9hn_137{background:transparent}._lineAdd_1u9hn_141{background:#73c9911a}._lineModify_1u9hn_145{background:#e2c08d1a;position:relative}._lineDelete_1u9hn_150{background:#f14c4c1a}._lineDelete_1u9hn_150 ._lineContent_1u9hn_130{text-decoration:line-through;opacity:.8}._lineModify_1u9hn_145:hover ._oldContentTooltip_1u9hn_159{display:block}._oldContentTooltip_1u9hn_159{display:none;position:absolute;left:60px;top:100%;z-index:1000;background:#1a1a1a;border:1px solid #444;border-radius:4px;padding:8px 12px;max-width:600px;box-shadow:0 4px 12px #00000080;margin-top:4px}._tooltipLabel_1u9hn_178{font-size:10px;color:#888;margin-bottom:4px;text-transform:uppercase;letter-spacing:.5px}._tooltipContent_1u9hn_186{font-size:12px;color:#f14c4c;white-space:pre;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;text-decoration:line-through;opacity:.8}._gitDiffView_14i1p_1{flex:1;display:flex;flex-direction:column;background:#0d0d0d;overflow:hidden}._header_14i1p_9{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #2a2a2a;background:#111;flex-shrink:0}._headerLeft_14i1p_19{display:flex;align-items:center;gap:12px;flex:1;min-width:0}._backBtn_14i1p_27{width:28px;height:28px;border:none;background:none;color:#888;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;padding:0;flex-shrink:0;transition:all .15s}._backBtn_14i1p_27:hover{color:#ccc;background:#2a2a2a}._filePath_14i1p_48{font-size:13px;color:#ccc;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._diffBadge_14i1p_57{padding:2px 8px;background:#2a2a2a;border:1px solid #444;border-radius:4px;font-size:10px;font-weight:600;color:#e2c08d;letter-spacing:.5px;flex-shrink:0}._contentContainer_14i1p_69{flex:1;overflow:auto;position:relative}._loading_14i1p_75{display:flex;align-items:center;justify-content:center;height:100%;color:#888;font-size:13px}._error_14i1p_84{display:flex;align-items:center;justify-content:center;height:100%;color:#ff6b6b;font-size:13px;padding:20px;text-align:center}._binaryNotice_14i1p_95{display:flex;align-items:center;justify-content:center;height:100%;color:#888;font-size:13px;font-style:italic;padding:20px;text-align:center}._largeFileWarning_14i1p_107{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#e2c08d;font-size:13px;padding:20px;text-align:center;gap:8px}._fileSize_14i1p_120{color:#888;font-size:12px;margin:0}._centerEmpty_8tuwm_1{display:flex;align-items:center;justify-content:center;height:100%}._container_8tuwm_8{flex:1;overflow:auto;padding:16px 24px;display:flex;flex-direction:column;-webkit-overflow-scrolling:touch;overscroll-behavior:contain}._sessionDividerText_8tuwm_18{font-size:11px;color:#555}._lastResponseLabel_8tuwm_23{font-size:11px}._splitContainer_8tuwm_27{display:flex;flex-direction:row;height:100%;overflow:hidden}._chatSection_8tuwm_34{display:flex;flex-direction:column;min-width:0;overflow:hidden}._vResizer_8tuwm_41{width:5px;background:#1a1a1a;cursor:col-resize;flex-shrink:0;border-left:1px solid #2a2a2a;border-right:1px solid #2a2a2a;transition:background .15s}._vResizer_8tuwm_41:hover{background:#2a2a2a}._snapLine_8tuwm_55{position:absolute;top:0;bottom:0;width:2px;background:transparent;border-left:2px dashed rgba(255,255,255,.1);pointer-events:none;z-index:1000;transition:all .15s}._snapLineActive_8tuwm_67{position:absolute;top:0;bottom:0;width:2px;background:transparent;border-left:2px dashed rgba(255,255,255,.5);pointer-events:none;z-index:1001}._snapLineLabel_8tuwm_78{position:absolute;top:50%;left:8px;transform:translateY(-50%);background:#ffffffe6;color:#000;padding:4px 8px;border-radius:4px;font-size:11px;font-weight:600;white-space:nowrap;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;box-shadow:0 2px 8px #0000004d}._snapPreview_8tuwm_94{position:absolute;top:0;bottom:0;background:#ffffff1a;pointer-events:none;z-index:999}._vResizer_8tuwm_41:hover{background:#333}._chatInputBar_8tuwm_107{display:flex;align-items:flex-end;gap:8px;padding:10px 16px;background:#111;border-top:1px solid #2a2a2a;flex-shrink:0}._chatInputWrapper_8tuwm_117{flex:1;display:flex;flex-direction:column;background:#1a1a1a;border:1px solid #333;border-radius:12px;transition:border-color .2s;overflow:hidden}._chatInputWrapper_8tuwm_117:focus-within{border-color:#555}._chatTextareaWrap_8tuwm_132{position:relative;flex:1}._chatTextarea_8tuwm_132{width:100%;min-height:22px;max-height:120px;padding:10px 14px;background:transparent;color:#e0e0e0;border:none;outline:none;resize:none;font-size:14px;line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}._chatTextarea_8tuwm_132::placeholder{color:#555}._chatInputHint_8tuwm_156{font-size:11px;color:#444;padding:0 14px 6px;-webkit-user-select:none;user-select:none}._chatSendBtn_8tuwm_163{width:36px;height:36px;border-radius:10px;border:none;background:#4a9eff;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .15s,opacity .15s}._chatSendBtn_8tuwm_163:hover{background:#3a8eef}._chatSendBtn_8tuwm_163:disabled{opacity:.35;cursor:default}._chatSendBtn_8tuwm_163 svg{width:18px;height:18px}._messageListWrap_8tuwm_192{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}._stickyBottomBtn_8tuwm_200{position:absolute;left:0;bottom:0;display:flex;flex-direction:column;align-items:center;gap:2px;padding:8px 18px;height:60px;justify-content:center;border-radius:0;border:none;background:none;color:#999;font-size:12px;cursor:pointer;transition:color .15s;z-index:10;box-shadow:none}._stickyBottomBtn_8tuwm_200 span{background:#00000080;padding:2px 10px;border-radius:10px}._stickyBottomBtn_8tuwm_200:hover{color:#fff;background:none}._ptyPromptBubble_8tuwm_233{margin:8px 0;padding:12px 16px;border-radius:12px;border:1px solid #3a3a3a;background:#161616;animation:_ptyPromptFadeIn_8tuwm_1 .25s ease-out}._ptyPromptResolved_8tuwm_242{opacity:.55}@keyframes _ptyPromptFadeIn_8tuwm_1{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}._ptyPromptQuestion_8tuwm_251{font-size:13px;color:#ccc;margin-bottom:10px;line-height:1.4}._ptyPromptOptions_8tuwm_258{display:flex;flex-wrap:wrap;gap:8px}._ptyPromptOption_8tuwm_258{padding:6px 14px;border-radius:18px;border:1px solid #3a3a3a;background:#1a1a1a;color:#bbb;font-size:12px;cursor:pointer;transition:background .15s,color .15s,border-color .15s;white-space:nowrap}._ptyPromptOption_8tuwm_258:hover{background:#2a2a2a;color:#eee;border-color:#555}._ptyPromptOptionPrimary_8tuwm_282{padding:6px 14px;border-radius:18px;border:1px solid #4a9eff;background:#4a9eff26;color:#4a9eff;font-size:12px;cursor:pointer;transition:background .15s,color .15s,border-color .15s;white-space:nowrap}._ptyPromptOptionPrimary_8tuwm_282:hover{background:#4a9eff40;color:#6ab4ff;border-color:#6ab4ff}._ptyPromptOptionChosen_8tuwm_300{padding:6px 14px;border-radius:18px;border:1px solid #4a9eff;background:#4a9eff33;color:#4a9eff;font-size:12px;cursor:default;white-space:nowrap}._ptyPromptOptionDimmed_8tuwm_311{padding:6px 14px;border-radius:18px;border:1px solid #2a2a2a;background:transparent;color:#444;font-size:12px;cursor:default;white-space:nowrap}._ghostText_8tuwm_322{position:absolute;top:0;left:0;right:0;padding:10px 14px;color:#444;font-size:14px;line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;pointer-events:none;white-space:pre-wrap;overflow:hidden;max-height:120px}._suggestionChip_8tuwm_338{display:flex;align-items:center;gap:8px;padding:8px 14px;background:#1a1a1a;border-top:1px solid #2a2a2a;cursor:pointer;flex-shrink:0;transition:background .15s}._suggestionChip_8tuwm_338:hover{background:#222}._suggestionChipText_8tuwm_354{flex:1;color:#555;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._suggestionChipAction_8tuwm_363{color:#4a9eff;font-size:14px;flex-shrink:0}._navSidebar_8tuwm_369{width:40px;flex-shrink:0;background:#0d0d0d;border-right:1px solid #2a2a2a;display:flex;flex-direction:column;align-items:center;padding-top:8px;gap:4px}._navBtn_8tuwm_381{width:32px;height:32px;border:none;background:none;color:#666;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:6px;padding:0;transition:background .15s,color .15s}._navBtn_8tuwm_381:hover{color:#ccc;background:#1a1a1a}._navBtnActive_8tuwm_401{width:32px;height:32px;border:none;background:#4a9eff26;color:#4a9eff;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:6px;padding:0;transition:background .15s,color .15s}._navBtnActive_8tuwm_401:hover{background:#4a9eff40;color:#6ab4ff}._resizer_yamj2_1{width:6px;cursor:col-resize;background:#1f1f1f;flex-shrink:0;transition:background .2s}._resizer_yamj2_1:hover{background:#3b82f6}._container_1um1r_1{display:flex;flex-direction:column;height:100%;background:#0a0a0a;overflow:hidden}._fileListSection_1um1r_10{height:300px;flex-shrink:0;display:flex;flex-direction:column;background:#111;border-bottom:1px solid #2a2a2a}._header_1um1r_19{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #2a2a2a;flex-shrink:0}._headerTitle_1um1r_28{font-size:11px;font-weight:600;color:#888;text-transform:uppercase;letter-spacing:.5px}._fileCount_1um1r_36{font-size:10px;color:#555;background:#1a1a1a;padding:1px 6px;border-radius:8px}._changesContainer_1um1r_44{flex:1;overflow:auto;padding:4px 0;-webkit-overflow-scrolling:touch}._changeItem_1um1r_51{display:flex;align-items:center;height:28px;padding:0 8px;cursor:pointer;color:#ccc;font-size:13px;white-space:nowrap;transition:background .1s;gap:6px}._changeItem_1um1r_51:hover{background:#1a1a1a}._changeItemActive_1um1r_68{background:#4a9eff1f;color:#fff}._changeItemActive_1um1r_68:hover{background:#4a9eff2e}._dirItem_1um1r_77{display:flex;align-items:center;height:26px;padding:0 8px;color:#999;font-size:13px;white-space:nowrap;gap:6px}._dirArrow_1um1r_88{width:16px;flex-shrink:0;color:#666;display:flex;align-items:center;justify-content:center}._dirName_1um1r_97{overflow:hidden;text-overflow:ellipsis}._status_1um1r_102{width:16px;flex-shrink:0;font-size:11px;font-weight:600;text-align:center;margin-left:auto}._icon_1um1r_111{width:16px;height:16px;flex-shrink:0;display:flex;align-items:center;justify-content:center}._fileName_1um1r_120{overflow:hidden;text-overflow:ellipsis;flex:1}._diffSection_1um1r_127{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}._diffHeader_1um1r_135{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid #2a2a2a;background:#111;flex-shrink:0}._diffFilePath_1um1r_145{font-size:12px;color:#ccc;font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}._diffBadge_1um1r_155{padding:2px 8px;background:#2a2a2a;border:1px solid #444;border-radius:4px;font-size:10px;font-weight:600;color:#e2c08d;letter-spacing:.5px;flex-shrink:0}._diffContent_1um1r_167{flex:1;overflow:auto;-webkit-overflow-scrolling:touch}._diffPlaceholder_1um1r_173{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:#333;font-size:13px}._statusText_1um1r_184{color:#555;font-size:12px;padding:16px 12px;text-align:center}._errorText_1um1r_191{color:#ff6b6b;font-size:12px;padding:16px 12px;text-align:center}._emptyText_1um1r_198{color:#666;font-size:12px;padding:16px 12px;text-align:center}._warningText_1um1r_205{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;color:#e2c08d;font-size:13px;text-align:center;gap:8px}._layout_1iry8_1{height:100vh;overflow:hidden}._header_1iry8_6{background:#111;border-bottom:1px solid #1f1f1f;padding:0 24px;height:60px;line-height:60px}._content_1iry8_14{flex:1;overflow:hidden}._mainContainer_1iry8_19{display:flex;height:100%}._leftPanel_1iry8_24{flex-shrink:0;border-right:1px solid #1f1f1f;display:flex;flex-direction:column;background:#0a0a0a}._leftPanelHeader_1iry8_32{padding:10px 16px;border-bottom:1px solid #1f1f1f;font-size:13px;color:#9ca3af;font-weight:500;display:flex;justify-content:space-between;align-items:center}._leftPanelCount_1iry8_43{font-size:12px;color:#555;font-weight:400}._leftPanelBody_1iry8_49{flex:1;overflow:hidden}._rightPanel_1iry8_54{flex:1;overflow:hidden;background:#0d0d0d}._modalActions_1iry8_60{margin-bottom:12px}._spinCenter_1iry8_64{text-align:center;padding:40px}._emptyCenter_1iry8_69{text-align:center;color:#999;padding:40px}._logCheckbox_1iry8_75{margin-right:8px}._logListContainer_1iry8_79{background:#0d0d0d;border-radius:8px;overflow:hidden}._logListItem_1iry8_85{cursor:pointer;padding:8px 12px;border-bottom:1px solid #222}._logItemRow_1iry8_91{display:flex;align-items:center;width:100%;justify-content:space-between;flex-wrap:nowrap;gap:12px}._logItemRow_1iry8_91>span:first-child{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden}._logFileName_1iry8_108{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._logItemRow_1iry8_91>span:last-child{display:flex;align-items:center;flex-shrink:0;gap:8px}._logFileIcon_1iry8_121{margin-right:8px;color:#3b82f6;flex-shrink:0}._loadingOverlay_1iry8_127{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#000000bf;display:flex;align-items:center;justify-content:center;z-index:9999}._loadingText_1iry8_140{color:#fff;font-size:16px;font-weight:700}._footer_1iry8_146{height:18px;background:#000;display:flex;align-items:center;justify-content:flex-end;padding:0 12px;flex-shrink:0}._footerRight_1iry8_156{display:flex;align-items:center;gap:6px;font-size:11px;color:#555}._footerText_1iry8_164{color:#444;margin-right:2px}._footerLink_1iry8_169{display:inline-flex;align-items:center;gap:3px;color:#555;text-decoration:none}._footerLink_1iry8_169:hover{color:#888}._footerIcon_1iry8_181{width:12px;height:12px}._footerDivider_1iry8_186{color:#333}._footerText_1iry8_164{color:#555}._guideContainer_1iry8_194{display:flex;align-items:center;justify-content:center;height:100%;background:#0a0a0a}._guideContent_1iry8_202{max-width:560px;padding:40px}._guideTitle_1iry8_207{font-size:20px;font-weight:600;color:#e0e0e0;margin:0 0 28px}._guideStep_1iry8_214{display:flex;gap:14px;margin-bottom:22px}._guideStepNum_1iry8_220{flex-shrink:0;width:24px;height:24px;border-radius:50%;background:#1a1a2e;color:#7c8aff;font-size:13px;font-weight:600;display:flex;align-items:center;justify-content:center;margin-top:1px}._guideStepBody_1iry8_235{flex:1;min-width:0}._guideText_1iry8_240{color:#aaa;font-size:14px;line-height:1.6;margin:0 0 8px}._guideCode_1iry8_247{display:block;background:#141414;border:1px solid #252525;border-radius:6px;padding:10px 14px;color:#8b9cf7;font-size:13px;line-height:1.5;word-break:break-all;white-space:pre-wrap}._mobileChatOverlay_1iry8_260{position:absolute;top:0;right:0;bottom:0;left:0;transform:translate(100%);transition:transform .3s ease;z-index:100;background:#0a0a0a;display:flex;flex-direction:column;overflow:hidden}._mobileChatOverlayVisible_1iry8_272{transform:translate(0)}._mobileChatInner_1iry8_276{flex:1;min-height:0;display:flex;flex-direction:column;zoom:.6}._mobileGitDiffOverlay_1iry8_284{position:absolute;top:0;right:0;bottom:0;left:0;transform:translate(-100%);transition:transform .3s ease;z-index:100;background:#0a0a0a;display:flex;flex-direction:column;overflow:hidden}._mobileGitDiffOverlayVisible_1iry8_296{transform:translate(0)}._mobileGitDiffInner_1iry8_300{flex:1;min-height:0;display:flex;flex-direction:column;zoom:.6}
package/dist/index.html CHANGED
@@ -6,8 +6,8 @@
6
6
  <title>Claude Code Viewer</title>
7
7
  <link rel="icon" href="/favicon.ico?v=1">
8
8
  <link rel="shortcut icon" href="/favicon.ico?v=1">
9
- <script type="module" crossorigin src="/assets/index-LxuWMLD-.js"></script>
10
- <link rel="stylesheet" crossorigin href="/assets/index-k2L1uWUr.css">
9
+ <script type="module" crossorigin src="/assets/index-DVJLme9U.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-Daywpj0d.css">
11
11
  </head>
12
12
  <body>
13
13
  <div id="root"></div>
package/findcc.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { resolve, join } from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
- import { existsSync } from 'node:fs';
3
+ import { existsSync, realpathSync } from 'node:fs';
4
4
  import { homedir } from 'node:os';
5
5
  import { execSync } from 'node:child_process';
6
6
 
@@ -68,6 +68,11 @@ export function resolveNativePath() {
68
68
  const result = execSync(cmd, { encoding: 'utf-8', shell: true, env: process.env }).trim();
69
69
  // 排除 shell function 的输出(多行说明不是路径)
70
70
  if (result && !result.includes('\n') && existsSync(result)) {
71
+ // 排除 npm 安装的符号链接(解析后指向 node_modules)
72
+ try {
73
+ const real = realpathSync(result);
74
+ if (real.includes('node_modules')) continue;
75
+ } catch {}
71
76
  return result;
72
77
  }
73
78
  } catch {
package/i18n.js CHANGED
@@ -366,12 +366,32 @@ const i18nData = {
366
366
  "tr": "❌ Shell hook temizlenemedi: {error}",
367
367
  "uk": "❌ Не вдалося очистити shell hook: {error}"
368
368
  },
369
+ "cli.uninstall.reloadShell": {
370
+ "zh": "💡 运行 'unset -f claude' 或重启终端以在当前会话中立即生效",
371
+ "en": "💡 Run 'unset -f claude' or restart your terminal to apply changes in the current session",
372
+ "zh-TW": "💡 運行 'unset -f claude' 或重啟終端以在當前會話中立即生效",
373
+ "ko": "💡 현재 세션에 즉시 적용하려면 'unset -f claude'를 실행하거나 터미널을 재시작하세요",
374
+ "ja": "💡 現在のセッションに即座に反映するには 'unset -f claude' を実行するか、ターミナルを再起動してください",
375
+ "de": "💡 Führen Sie 'unset -f claude' aus oder starten Sie das Terminal neu, um die Änderungen sofort anzuwenden",
376
+ "es": "💡 Ejecute 'unset -f claude' o reinicie su terminal para aplicar los cambios en la sesión actual",
377
+ "fr": "💡 Exécutez 'unset -f claude' ou redémarrez votre terminal pour appliquer les changements dans la session actuelle",
378
+ "it": "💡 Esegui 'unset -f claude' o riavvia il terminale per applicare le modifiche nella sessione corrente",
379
+ "da": "💡 Kør 'unset -f claude' eller genstart terminalen for at anvende ændringer i den aktuelle session",
380
+ "pl": "💡 Uruchom 'unset -f claude' lub zrestartuj terminal, aby zastosować zmiany w bieżącej sesji",
381
+ "ru": "💡 Выполните 'unset -f claude' или перезапустите терминал для применения изменений в текущей сессии",
382
+ "ar": "💡 قم بتشغيل 'unset -f claude' أو أعد تشغيل الطرفية لتطبيق التغييرات في الجلسة الحالية",
383
+ "no": "💡 Kjør 'unset -f claude' eller start terminalen på nytt for å anvende endringer i gjeldende økt",
384
+ "pt-BR": "💡 Execute 'unset -f claude' ou reinicie o terminal para aplicar as alterações na sessão atual",
385
+ "th": "💡 รัน 'unset -f claude' หรือรีสตาร์ทเทอร์มินัลเพื่อใช้การเปลี่ยนแปลงในเซสชันปัจจุบัน",
386
+ "tr": "💡 Mevcut oturumda değişiklikleri uygulamak için 'unset -f claude' çalıştırın veya terminali yeniden başlatın",
387
+ "uk": "💡 Виконайте 'unset -f claude' або перезапустіть термінал, щоб застосувати зміни в поточній сесії"
388
+ },
369
389
  "cli.uninstall.done": {
370
390
  "zh": "\n🗑️ CC Viewer 集成已移除 (运行 'npm uninstall -g cc-viewer' 以彻底删除命令)",
371
391
  "en": "\n🗑️ CC Viewer integration removed (Run 'npm uninstall -g cc-viewer' to remove command)",
372
392
  "zh-TW": "\n🗑️ CC Viewer 集成已移除 (運行 'npm uninstall -g cc-viewer' 以徹底刪除命令)",
373
393
  "ko": "\n🗑️ CC Viewer 통합 제거됨 ('npm uninstall -g cc-viewer'를 실행하여 명령 삭제)",
374
- "ja": "\n🗑️ CC Viewer 統合を削除しました (コマンドを完全に削除するには 'npm uninstall -g cc-viewer' を実行)",
394
+ "ja": "\n🗑️ CC Viewer 統合を削除しました (コマンドを完全に削除するには 'npm uninstall -g cc-viewer' を実행)",
375
395
  "de": "\n🗑️ CC Viewer-Integration entfernt (Führen Sie 'npm uninstall -g cc-viewer' aus, um den Befehl zu entfernen)",
376
396
  "es": "\n🗑️ Integración de CC Viewer eliminada (Ejecute 'npm uninstall -g cc-viewer' para eliminar el comando)",
377
397
  "fr": "\n🗑️ Intégration CC Viewer supprimée (Exécutez 'npm uninstall -g cc-viewer' pour supprimer la commande)",
@@ -1,6 +1,6 @@
1
1
  import { readdirSync, existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { LOG_DIR } from './findcc.js';
3
+ import { LOG_DIR } from '../findcc.js';
4
4
 
5
5
  export const PLUGINS_DIR = join(LOG_DIR, 'plugins');
6
6
  const PREFS_FILE = join(LOG_DIR, 'preferences.json');
@@ -4,7 +4,7 @@ import { join } from 'node:path';
4
4
  import { homedir } from 'node:os';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import { dirname } from 'node:path';
7
- import { t } from './i18n.js';
7
+ import { t } from '../i18n.js';
8
8
 
9
9
  const __filename = fileURLToPath(import.meta.url);
10
10
  const __dirname = dirname(__filename);
@@ -15,7 +15,7 @@ const CACHE_FILE = join(CACHE_DIR, 'update-check.json');
15
15
  const CC_SETTINGS_FILE = join(homedir(), '.claude', 'settings.json');
16
16
 
17
17
  function getCurrentVersion() {
18
- const pkg = JSON.parse(readFileSync(join(__dirname, 'package.json'), 'utf-8'));
18
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
19
19
  return pkg.version;
20
20
  }
21
21
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-viewer",
3
- "version": "1.4.19",
3
+ "version": "1.4.21",
4
4
  "description": "Claude Code Logger visualization management tool",
5
5
  "license": "MIT",
6
6
  "main": "server.js",
@@ -50,9 +50,7 @@
50
50
  "proxy-env.js",
51
51
  "i18n.js",
52
52
  "findcc.js",
53
- "stats-worker.js",
54
- "updater.js",
55
- "plugin-loader.js",
53
+ "lib/",
56
54
  "pty-manager.js",
57
55
  "locales/",
58
56
  "workspace-registry.js",
@@ -75,6 +73,7 @@
75
73
  },
76
74
  "dependencies": {
77
75
  "@xterm/addon-web-links": "^0.12.0",
76
+ "chokidar": "^5.0.0",
78
77
  "node-pty": "^1.1.0",
79
78
  "undici": "^7.22.0",
80
79
  "ws": "^8.19.0"
package/proxy.js CHANGED
@@ -124,10 +124,15 @@ export function startProxy() {
124
124
  res.writeHead(response.status, responseHeaders);
125
125
 
126
126
  if (response.body) {
127
- const { Readable } = await import('node:stream');
127
+ const { Readable, pipeline } = await import('node:stream');
128
128
  // @ts-ignore
129
129
  const nodeStream = Readable.fromWeb(response.body);
130
- nodeStream.pipe(res);
130
+ // pipeline handles stream errors; without this, unhandled 'error' events crash the process.
131
+ pipeline(nodeStream, res, (err) => {
132
+ if (err && process.env.CCV_DEBUG) {
133
+ console.error('[CC-Viewer Proxy] Stream pipeline error:', err.message);
134
+ }
135
+ });
131
136
  } else {
132
137
  res.end();
133
138
  }
package/server.js CHANGED
@@ -10,13 +10,20 @@ import { Worker } from 'node:worker_threads';
10
10
  import { LOG_FILE, _initPromise, _resumeState, resolveResumeChoice, _projectName, _logDir, _cachedApiKey, _cachedAuthHeader, _cachedHaikuModel, initForWorkspace, resetWorkspace } from './interceptor.js';
11
11
  import { LOG_DIR } from './findcc.js';
12
12
  import { t, detectLanguage } from './i18n.js';
13
- import { checkAndUpdate } from './updater.js';
14
- import { loadPlugins, runWaterfallHook, runParallelHook, getPluginsInfo, PLUGINS_DIR } from './plugin-loader.js';
13
+ import { checkAndUpdate } from './lib/updater.js';
14
+ import { loadPlugins, runWaterfallHook, runParallelHook, getPluginsInfo, PLUGINS_DIR } from './lib/plugin-loader.js';
15
15
 
16
16
  const PREFS_FILE = join(LOG_DIR, 'preferences.json');
17
17
  const isCliMode = process.env.CCV_CLI_MODE === '1';
18
18
  const isWorkspaceMode = process.env.CCV_WORKSPACE_MODE === '1';
19
19
 
20
+ // 统一的文件/目录忽略规则
21
+ const IGNORED_PATTERNS = new Set([
22
+ 'node_modules', '.git', '.svn', '.hg', '.DS_Store',
23
+ '__pycache__', '.next', '.nuxt', 'dist',
24
+ '.cache', '.idea', '.vscode'
25
+ ]);
26
+
20
27
  // 工作区模式:保存 Claude 额外参数,供 launch API 使用
21
28
  let _workspaceClaudeArgs = [];
22
29
  let _workspaceLaunched = false; // 工作区是否已经启动了会话
@@ -72,7 +79,7 @@ let statsWorker = null;
72
79
 
73
80
  function startStatsWorker() {
74
81
  try {
75
- statsWorker = new Worker(new URL('./stats-worker.js', import.meta.url));
82
+ statsWorker = new Worker(new URL('./lib/stats-worker.js', import.meta.url));
76
83
  statsWorker.on('error', (err) => {
77
84
  console.error('[CC Viewer] Stats worker error:', err.message);
78
85
  statsWorker = null;
@@ -709,9 +716,8 @@ async function handleRequest(req, res) {
709
716
  const targetDir = join(cwd, reqPath);
710
717
  try {
711
718
  const entries = readdirSync(targetDir, { withFileTypes: true });
712
- const HIDDEN = new Set(['node_modules', '.git', '.svn', '.hg', '.DS_Store', '__pycache__', '.next', '.nuxt', 'dist', '.cache', '.idea', '.vscode']);
713
719
  const items = entries
714
- .filter(e => !e.name.startsWith('.') && !HIDDEN.has(e.name))
720
+ .filter(e => !e.name.startsWith('.') && !IGNORED_PATTERNS.has(e.name))
715
721
  .map(e => ({ name: e.name, type: e.isDirectory() ? 'directory' : 'file' }))
716
722
  .sort((a, b) => {
717
723
  if (a.type !== b.type) return a.type === 'directory' ? -1 : 1;
@@ -1272,7 +1278,8 @@ export async function startViewer() {
1272
1278
  async function setupTerminalWebSocket(httpServer) {
1273
1279
  try {
1274
1280
  const { WebSocketServer } = await import('ws');
1275
- const { writeToPty, resizePty, onPtyData, onPtyExit, getPtyState, getOutputBuffer } = await import('./pty-manager.js');
1281
+ const { writeToPty, resizePty, onPtyData, onPtyExit, getPtyState, getOutputBuffer, getCurrentWorkspace } = await import('./pty-manager.js');
1282
+ const { default: chokidar } = await import('chokidar');
1276
1283
 
1277
1284
  const wss = new WebSocketServer({ noServer: true });
1278
1285
 
@@ -1295,6 +1302,138 @@ async function setupTerminalWebSocket(httpServer) {
1295
1302
  return null;
1296
1303
  };
1297
1304
 
1305
+ // 文件监控器:监控工作区目录变更
1306
+ let fileWatcher = null;
1307
+ let fileWatchDebounceTimer = null;
1308
+ let currentWatchPath = null;
1309
+
1310
+ // 忽略规则:从统一的 IGNORED_PATTERNS 生成,并忽略所有隐藏目录
1311
+ const ignoredPaths = [
1312
+ ...Array.from(IGNORED_PATTERNS).map(p => `**/${p}/**`),
1313
+ '**/.*/**', // 忽略所有隐藏目录(.git, .Trash, .docker 等)
1314
+ ];
1315
+
1316
+ // 启动文件监控
1317
+ const startFileWatcher = (watchPath) => {
1318
+ if (fileWatcher) {
1319
+ fileWatcher.close();
1320
+ }
1321
+ currentWatchPath = watchPath;
1322
+
1323
+ try {
1324
+ fileWatcher = chokidar.watch(watchPath, {
1325
+ ignored: ignoredPaths,
1326
+ persistent: true,
1327
+ ignoreInitial: true, // 忽略初始扫描,只监控变更
1328
+ awaitWriteFinish: {
1329
+ stabilityThreshold: 100,
1330
+ pollInterval: 50
1331
+ }
1332
+ });
1333
+
1334
+ // 监听 chokidar 错误事件,避免崩溃
1335
+ fileWatcher.on('error', (error) => {
1336
+ console.error('[CC Viewer] File watcher error:', error.message);
1337
+ // 不要让错误导致进程崩溃,只记录日志
1338
+ });
1339
+
1340
+ // 使用防抖避免频繁触发
1341
+ fileWatcher.on('all', (eventType, path) => {
1342
+ if (fileWatchDebounceTimer) {
1343
+ clearTimeout(fileWatchDebounceTimer);
1344
+ }
1345
+
1346
+ fileWatchDebounceTimer = setTimeout(() => {
1347
+ console.log(`[CC Viewer] File change detected: ${eventType} - ${path}`);
1348
+
1349
+ // 广播文件变更事件给所有连接的客户端
1350
+ const changeEvent = {
1351
+ type: 'file-change',
1352
+ eventType,
1353
+ path,
1354
+ watchPath: currentWatchPath
1355
+ };
1356
+
1357
+ const clientCount = wss.clients.size;
1358
+ console.log(`[CC Viewer] Broadcasting file-change to ${clientCount} client(s)`);
1359
+
1360
+ wss.clients.forEach((client) => {
1361
+ if (client.readyState === 1) { // WebSocket.OPEN
1362
+ try {
1363
+ client.send(JSON.stringify(changeEvent));
1364
+ } catch (err) {
1365
+ console.error('[CC Viewer] Failed to send file-change event:', err.message);
1366
+ }
1367
+ }
1368
+ });
1369
+ }, 200); // 200ms 防抖延迟
1370
+ });
1371
+
1372
+ console.log(`[CC Viewer] File watcher started for: ${watchPath}`);
1373
+ } catch (err) {
1374
+ console.error('[CC Viewer] Failed to start file watcher:', err.message);
1375
+ }
1376
+ };
1377
+
1378
+ // 停止文件监控
1379
+ const stopFileWatcher = () => {
1380
+ if (fileWatchDebounceTimer) {
1381
+ clearTimeout(fileWatchDebounceTimer);
1382
+ fileWatchDebounceTimer = null;
1383
+ }
1384
+ if (fileWatcher) {
1385
+ fileWatcher.close();
1386
+ fileWatcher = null;
1387
+ }
1388
+ currentWatchPath = null;
1389
+ };
1390
+
1391
+ // 监听 PTY 退出事件,停止文件监控(只在监控器运行时停止)
1392
+ onPtyExit(() => {
1393
+ if (fileWatcher && !fileWatcher.closed) {
1394
+ stopFileWatcher();
1395
+ console.log('[CC Viewer] File watcher stopped (PTY exited)');
1396
+ }
1397
+ });
1398
+
1399
+ // 初始化时检查是否有活跃的工作区
1400
+ const workspace = getCurrentWorkspace();
1401
+ if (workspace.running && workspace.cwd) {
1402
+ startFileWatcher(workspace.cwd);
1403
+ }
1404
+
1405
+ // 定期检查工作区状态,确保监控器在 PTY 启动后自动开始工作
1406
+ const workspaceCheckInterval = setInterval(() => {
1407
+ const currentWorkspace = getCurrentWorkspace();
1408
+ const isRunning = currentWorkspace.running && currentWorkspace.cwd;
1409
+
1410
+ // 调试日志
1411
+ if (process.env.CCV_DEBUG) {
1412
+ console.log('[CC Viewer] Workspace check:', {
1413
+ running: currentWorkspace.running,
1414
+ cwd: currentWorkspace.cwd,
1415
+ fileWatcher: fileWatcher ? (fileWatcher.closed ? 'closed' : 'active') : 'none',
1416
+ currentWatchPath
1417
+ });
1418
+ }
1419
+
1420
+ // 如果 PTY 正在运行但监控器未启动,则启动监控器
1421
+ if (isRunning && (!fileWatcher || fileWatcher.closed)) {
1422
+ if (currentWatchPath !== currentWorkspace.cwd) {
1423
+ console.log(`[CC Viewer] Starting file watcher for: ${currentWorkspace.cwd}`);
1424
+ startFileWatcher(currentWorkspace.cwd);
1425
+ }
1426
+ }
1427
+ }, 1000); // 每秒检查一次
1428
+
1429
+ // 清理定时器
1430
+ const originalClose = wss.close;
1431
+ wss.close = function() {
1432
+ clearInterval(workspaceCheckInterval);
1433
+ stopFileWatcher();
1434
+ return originalClose.call(this);
1435
+ };
1436
+
1298
1437
  httpServer.on('upgrade', (req, socket, head) => {
1299
1438
  const pathname = new URL(req.url, `http://${req.headers.host}`).pathname;
1300
1439
  if (pathname === '/ws/terminal') {
File without changes