claude-remote-cli 3.11.2 → 3.11.3

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.
@@ -0,0 +1,32 @@
1
+ .pin-gate.svelte-1qp96yb{display:flex;align-items:center;justify-content:center;height:100vh;background:var(--bg);padding:1rem}.pin-container.svelte-1qp96yb{display:flex;flex-direction:column;align-items:center;gap:1rem;width:100%;max-width:320px;text-align:center}.pin-container.svelte-1qp96yb h1:where(.svelte-1qp96yb){font-size:1.5rem;color:var(--text)}.pin-container.svelte-1qp96yb p:where(.svelte-1qp96yb){color:var(--text-muted);font-size:.95rem}input.svelte-1qp96yb{width:100%;padding:14px 16px;background:var(--surface);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:1.2rem;text-align:center;outline:none;-webkit-appearance:none}input.svelte-1qp96yb:focus{border-color:var(--accent)}button.svelte-1qp96yb{width:100%;padding:14px;background:var(--accent);color:#fff;border:none;border-radius:8px;font-size:1rem;font-weight:600;cursor:pointer;touch-action:manipulation}button.svelte-1qp96yb:active{opacity:.8}.error.svelte-1qp96yb{color:var(--accent);font-size:.9rem}.context-menu-trigger.svelte-1nmhce7{background:none;border:none;color:var(--text-muted);font-size:1rem;font-weight:700;cursor:pointer;padding:0 6px;border-radius:4px;touch-action:manipulation;flex-shrink:0;line-height:1;letter-spacing:1px;min-height:24px;display:inline-flex;align-items:center;transition:color .15s,background .15s}.context-menu-trigger.svelte-1nmhce7:hover{color:var(--text);background:var(--border)}.context-menu-backdrop.svelte-1nmhce7{position:fixed;top:0;right:0;bottom:0;left:0;z-index:999}.context-menu.svelte-1nmhce7{position:fixed;list-style:none;margin:0;padding:4px 0;background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 4px 16px #0006;z-index:1000;min-width:175px}.context-menu-item.svelte-1nmhce7{padding:9px 14px;font-size:.85rem;cursor:pointer;color:var(--text);white-space:nowrap}.context-menu-item.svelte-1nmhce7:hover{background:var(--border)}.context-menu-item.svelte-1nmhce7:focus{outline:2px solid var(--accent);outline-offset:-2px}.context-menu-item--danger.svelte-1nmhce7{color:#e74c3c}.context-menu-item--danger.svelte-1nmhce7:hover{background:#e74c3c1f}.context-menu-item--disabled.svelte-1nmhce7{opacity:.4;cursor:default}.context-menu-item--disabled.svelte-1nmhce7:hover{background:none}.workspace-item.svelte-168i8d5{display:flex;flex-direction:column}.workspace-header.svelte-168i8d5{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;cursor:pointer;min-height:44px;transition:background .12s}.workspace-header.svelte-168i8d5:hover{background:var(--surface-hover)}.workspace-item.active.svelte-168i8d5 .workspace-header:where(.svelte-168i8d5){background:var(--surface-hover)}.workspace-left.svelte-168i8d5{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.workspace-header.reorder-mode.svelte-168i8d5{cursor:grab}.workspace-header.reorder-mode.svelte-168i8d5:active{cursor:grabbing}.collapse-chevron.svelte-168i8d5{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:.7rem;color:var(--text-muted);cursor:pointer;flex-shrink:0;transition:color .12s}.collapse-chevron.svelte-168i8d5:hover{color:var(--text)}.collapse-count.svelte-168i8d5{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);background:var(--border);border-radius:8px;padding:1px 6px;flex-shrink:0}.initial-block.svelte-168i8d5{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:4px;font-size:var(--font-size-xs);font-weight:700;color:#000;font-family:var(--font-mono);flex-shrink:0;line-height:1}.workspace-name.svelte-168i8d5{font-size:var(--font-size-sm);font-weight:700;color:var(--text);font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.workspace-actions.svelte-168i8d5{display:flex;align-items:center;gap:2px;opacity:0;transition:opacity .12s;flex-shrink:0}.workspace-header.svelte-168i8d5:hover .workspace-actions:where(.svelte-168i8d5){opacity:1}.action-btn.svelte-168i8d5{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:3px;font-size:var(--font-size-xs);color:var(--text-muted);cursor:pointer;font-family:var(--font-mono);transition:background .1s,color .1s}.action-btn.svelte-168i8d5:hover{background:var(--border);color:var(--text)}.session-list.svelte-168i8d5{list-style:none}.session-row.svelte-168i8d5{position:relative;display:flex;flex-direction:column;gap:2px;padding:6px 10px 6px 36px;cursor:pointer;min-height:44px;font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);transition:background .1s;border-left:3px solid transparent;justify-content:center}.session-row.svelte-168i8d5:hover{background:var(--surface-hover);color:var(--text)}.session-row.selected.svelte-168i8d5{border-left-color:var(--accent);background:var(--surface-hover);color:var(--text)}.session-row.attention.svelte-168i8d5 .session-name:where(.svelte-168i8d5){font-weight:700;color:var(--text)}.session-row-primary.svelte-168i8d5{display:flex;align-items:center;gap:8px;min-width:0}.session-row-secondary.svelte-168i8d5{display:flex;align-items:center;gap:6px;padding-left:15px;font-size:.65rem;color:var(--text-muted);min-width:0}.secondary-branch.svelte-168i8d5{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.row-menu-overlay.svelte-168i8d5{position:absolute;right:8px;top:0;bottom:0;display:flex;align-items:center;opacity:0;transition:opacity .12s}.session-row.svelte-168i8d5:hover .row-menu-overlay:where(.svelte-168i8d5){opacity:1}.secondary-pr.svelte-168i8d5{white-space:nowrap;flex-shrink:0;color:var(--accent)}.secondary-time.svelte-168i8d5{white-space:nowrap;flex-shrink:0;opacity:.7}.session-count-badge.svelte-168i8d5{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;border-radius:8px;background:var(--border);color:var(--text-muted);font-size:.55rem;font-family:var(--font-mono);font-weight:600;padding:0 4px;flex-shrink:0}.diff-badge.svelte-168i8d5{display:inline-flex;align-items:center;gap:4px;font-size:.6rem;flex-shrink:0;margin-left:auto}.diff-add.svelte-168i8d5{color:var(--status-success)}.diff-del.svelte-168i8d5{color:var(--status-error)}.status-dot.svelte-168i8d5{display:inline-block;width:7px;height:7px;border-radius:50%;flex-shrink:0}.status-dot--running.svelte-168i8d5{background:var(--status-success)}.status-dot--idle.svelte-168i8d5{background:var(--status-info)}.dot-inactive.svelte-168i8d5{width:7px;height:7px;border-radius:50%;background:#555;flex-shrink:0}.session-row.inactive.svelte-168i8d5 .session-name:where(.svelte-168i8d5){color:var(--text-muted)}.session-row.inactive.svelte-168i8d5:hover .session-name:where(.svelte-168i8d5){color:var(--text)}.session-row.loading.svelte-168i8d5{pointer-events:none;opacity:.7}.session-row.loading.svelte-168i8d5 .session-name:where(.svelte-168i8d5){color:var(--accent)}.status-dot--attention.svelte-168i8d5{background:var(--status-warning);box-shadow:0 0 5px 1px #fbbf2473;animation:svelte-168i8d5-attention-glow 2s ease-in-out infinite}.status-dot--permission-prompt.svelte-168i8d5{background:#eab308;box-shadow:0 0 5px 1px #eab30873;animation:svelte-168i8d5-attention-glow 1.5s ease-in-out infinite}@keyframes svelte-168i8d5-attention-glow{0%,to{box-shadow:0 0 3px 1px #fbbf244d}50%{box-shadow:0 0 7px 2px #fbbf2499}}.session-name.svelte-168i8d5{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;min-width:0}.session-name.bold.svelte-168i8d5{font-weight:700}.add-worktree-row.svelte-168i8d5{padding:4px 10px 6px 36px}.add-worktree-btn.svelte-168i8d5{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);opacity:.5;cursor:pointer;transition:opacity .1s,color .1s}.add-worktree-btn.svelte-168i8d5:hover{opacity:1;color:var(--text)}.add-worktree-row.disabled.svelte-168i8d5{pointer-events:none}.add-worktree-row.disabled.svelte-168i8d5 .add-worktree-btn:where(.svelte-168i8d5){opacity:.7;color:var(--accent)}.workspace-divider.svelte-168i8d5{height:1px;background:var(--border);margin:0}@media(max-width:600px){.workspace-header.svelte-168i8d5,.session-row.svelte-168i8d5{min-height:48px}.workspace-actions.svelte-168i8d5{opacity:1}.row-menu-overlay.svelte-168i8d5{display:none}}.smart-search.svelte-itm1qs{position:relative;flex-shrink:0}.input-row.svelte-itm1qs{display:flex;align-items:center;padding:6px 10px;border-bottom:1px solid var(--border);gap:6px}.prompt.svelte-itm1qs{font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--accent);flex-shrink:0;line-height:1;-webkit-user-select:none;user-select:none}.search-input.svelte-itm1qs{flex:1;background:transparent;border:none;outline:none;color:var(--text);font-family:var(--font-mono);font-size:var(--font-size-sm);caret-color:var(--accent)}.search-input.svelte-itm1qs::placeholder{color:var(--text-muted);opacity:.5}.dropdown.svelte-itm1qs{position:absolute;top:100%;left:0;right:0;background:var(--surface);border:1px solid var(--border);border-top:none;list-style:none;z-index:200;max-height:240px;overflow-y:auto}.dropdown-item.svelte-itm1qs{display:flex;align-items:baseline;gap:6px;padding:8px 10px;cursor:pointer;font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text-muted);transition:background .1s;white-space:nowrap;overflow:hidden}.dropdown-item.svelte-itm1qs:hover,.dropdown-item.focused.svelte-itm1qs{background:var(--surface-hover);color:var(--text)}.dropdown-item.svelte-itm1qs strong:where(.svelte-itm1qs){color:var(--text);font-weight:700}.dropdown-path.svelte-itm1qs{font-size:var(--font-size-xs);color:var(--text-muted);opacity:.5;overflow:hidden;text-overflow:ellipsis;min-width:0;flex-shrink:1}@media(max-width:600px){.smart-search.svelte-itm1qs{width:100%}.input-row.svelte-itm1qs{width:100%;box-sizing:border-box}.search-input.svelte-itm1qs{width:100%;min-width:0}}.sidebar.svelte-owj5vn{position:relative;display:flex;flex-direction:column;background:var(--bg);border-right:1px solid var(--border);overflow:hidden;transition:transform .25s ease,width .2s ease,min-width .2s ease;z-index:100}.resize-handle.svelte-owj5vn{position:absolute;top:0;right:0;width:4px;height:100%;cursor:col-resize;z-index:10;transition:background .15s}.resize-handle.svelte-owj5vn:hover{background:var(--accent)}.sidebar-header.svelte-owj5vn{display:flex;align-items:center;justify-content:space-between;padding:12px 10px;border-bottom:1px solid var(--border);flex-shrink:0}.sidebar-label.svelte-owj5vn{flex:1;font-size:var(--font-size-xs);font-weight:600;color:var(--text-muted);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em}.collapse-btn.svelte-owj5vn{background:none;border:none;color:var(--text-muted);font-size:1.1rem;cursor:pointer;padding:8px 10px;border-radius:4px;flex-shrink:0;line-height:1;font-family:var(--font-mono);min-width:36px;min-height:36px;display:flex;align-items:center;justify-content:center}.collapse-btn.svelte-owj5vn:hover{color:var(--text);background:var(--border)}.sidebar.collapsed.svelte-owj5vn .sidebar-header:where(.svelte-owj5vn){justify-content:center;padding:12px 4px}.icon-btn.svelte-owj5vn{background:none;border:none;color:var(--text);font-size:1.2rem;cursor:pointer;padding:4px 6px;border-radius:4px;touch-action:manipulation;display:none}.icon-btn.svelte-owj5vn:active{background:var(--border)}.home-btn.svelte-owj5vn{display:flex;align-items:center;gap:8px;padding:8px 10px;min-height:44px;cursor:pointer;border-left:3px solid transparent;transition:background .12s,border-color .12s;flex-shrink:0}.home-btn.svelte-owj5vn:hover{background:var(--surface-hover)}.home-btn--active.svelte-owj5vn{border-left-color:var(--accent);background:var(--surface-hover)}.home-icon.svelte-owj5vn{font-size:1rem;color:var(--text-muted);flex-shrink:0}.home-label.svelte-owj5vn{font-size:var(--font-size-sm);font-family:var(--font-mono);font-weight:600;color:var(--text)}.group-header.svelte-owj5vn{padding:10px 10px 4px;font-size:10px;font-family:var(--font-mono);font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:1.5px}.workspace-list.svelte-owj5vn{flex:1;overflow-y:auto;overflow-x:hidden}.empty-state.svelte-owj5vn{padding:16px 10px;font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);opacity:.5;text-align:center}.sidebar-footer-row.svelte-owj5vn{display:flex;gap:8px;margin:8px;align-items:stretch;flex-shrink:0}.add-workspace-btn.svelte-owj5vn{flex:1;padding:10px 12px;min-height:40px;background:none;border:1px solid var(--accent);border-radius:0;color:var(--accent);font-size:var(--font-size-xs);font-family:var(--font-mono);cursor:pointer;touch-action:manipulation;text-align:center;transition:background .1s}.add-workspace-btn.svelte-owj5vn:hover{background:color-mix(in srgb,var(--accent) 12%,transparent)}.add-workspace-btn.svelte-owj5vn:active{background:var(--border)}.done-reorder-btn.svelte-owj5vn{margin:8px;padding:10px 12px;min-height:40px;background:none;border:1px solid var(--accent);border-radius:0;color:var(--accent);font-size:var(--font-size-xs);font-family:var(--font-mono);cursor:pointer;touch-action:manipulation;text-align:center;flex-shrink:0;transition:background .1s}.done-reorder-btn.svelte-owj5vn:hover{background:color-mix(in srgb,var(--accent) 12%,transparent)}.done-reorder-btn.svelte-owj5vn:active{background:var(--border)}.settings-icon-btn.svelte-owj5vn{width:40px;min-height:40px;background:none;border:1px solid var(--border);border-radius:0;color:var(--text-muted);font-size:1rem;cursor:pointer;touch-action:manipulation;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .1s,color .1s}.settings-icon-btn.svelte-owj5vn:hover{background:var(--surface-hover);color:var(--text)}.settings-icon-btn.svelte-owj5vn:active{background:var(--border)}@media(max-width:600px){.sidebar.svelte-owj5vn{position:fixed;top:0;left:0;height:100%;transform:translate(-100%);box-shadow:2px 0 12px #00000080;transition:transform .25s ease}.sidebar.open.svelte-owj5vn{transform:translate(0)}.collapse-btn.svelte-owj5vn{display:none}.icon-btn.svelte-owj5vn{display:block;font-size:1.4rem;padding:4px 8px}.resize-handle.svelte-owj5vn{display:none}}/**
2
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
+ * https://github.com/chjj/term.js
5
+ * @license MIT
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ *
25
+ * Originally forked from (with the author's permission):
26
+ * Fabrice Bellard's javascript vt100 for jslinux:
27
+ * http://bellard.org/jslinux/
28
+ * Copyright (c) 2011 Fabrice Bellard
29
+ * The original design remains. The terminal itself
30
+ * has been extended to include xterm CSI codes, among
31
+ * other features.
32
+ */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.terminal-wrapper.svelte-5qgfij{display:flex;flex:1;min-height:0;position:relative;overflow:hidden}.terminal-container.svelte-5qgfij{flex:1;min-width:0;min-height:0;overflow:hidden;padding:4px}.terminal-wrapper.drag-over.svelte-5qgfij{outline:2px dashed var(--accent);outline-offset:-2px}.terminal-scrollbar.svelte-5qgfij{width:8px;background:transparent;position:relative;flex-shrink:0}.terminal-scrollbar-thumb.svelte-5qgfij{position:absolute;right:0;width:6px;background:var(--border);border-radius:3px;cursor:pointer}@media(hover:none){.terminal-wrapper.selection-mode.svelte-5qgfij .terminal-container:where(.svelte-5qgfij){outline:2px solid var(--accent);outline-offset:-2px}.terminal-container.svelte-5qgfij{touch-action:none}.terminal-scrollbar.svelte-5qgfij{width:12px}.terminal-scrollbar-thumb.svelte-5qgfij{width:8px;min-height:44px}.scroll-fabs.svelte-5qgfij{position:absolute;right:16px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:12px;z-index:1;opacity:.6;pointer-events:auto}.scroll-fab.svelte-5qgfij{width:44px;height:44px;border-radius:50%;border:1px solid var(--border);background:var(--surface);color:var(--text);font-size:18px;display:flex;align-items:center;justify-content:center;cursor:pointer;touch-action:manipulation;-webkit-user-select:none;user-select:none}.scroll-fab.svelte-5qgfij:active{opacity:1;background:var(--border)}.scroll-fab-bottom.svelte-5qgfij{margin-top:4px}}.branch-switcher.svelte-1ogsozk{position:relative}.branch-trigger.svelte-1ogsozk{display:flex;align-items:center;gap:5px;background:none;border:none;color:var(--text);font-family:var(--font-mono);font-size:var(--font-size-sm);cursor:pointer;padding:4px 6px;border-radius:4px;transition:background .12s;white-space:nowrap;min-width:0}.branch-trigger.svelte-1ogsozk:hover{background:var(--surface-hover)}.branch-icon.svelte-1ogsozk{color:var(--text-muted);font-size:.9rem;flex-shrink:0}.branch-name.svelte-1ogsozk{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px}.branch-caret.svelte-1ogsozk{flex-shrink:0;color:var(--text-muted);margin-left:1px}.branch-dropdown.svelte-1ogsozk{position:absolute;top:calc(100% + 4px);left:0;min-width:220px;max-width:340px;background:var(--surface);border:1px solid var(--border);border-radius:4px;z-index:200;overflow:hidden;box-shadow:0 4px 16px #00000080}.branch-filter-wrap.svelte-1ogsozk{padding:6px 6px 4px;border-bottom:1px solid var(--border)}.branch-filter.svelte-1ogsozk{width:100%;background:var(--bg);border:1px solid var(--border);border-radius:3px;color:var(--text);font-family:var(--font-mono);font-size:var(--font-size-xs);padding:4px 8px;outline:none;box-sizing:border-box}.branch-filter.svelte-1ogsozk:focus{border-color:var(--accent)}.branch-error.svelte-1ogsozk{font-size:var(--font-size-xs);color:var(--status-error);padding:4px 10px}.branch-loading.svelte-1ogsozk,.branch-empty.svelte-1ogsozk{font-size:var(--font-size-xs);color:var(--text-muted);padding:8px 10px;font-style:italic}.branch-list.svelte-1ogsozk{list-style:none;margin:0;padding:4px 0;max-height:240px;overflow-y:auto}.branch-option.svelte-1ogsozk{display:flex;align-items:center;gap:6px;padding:5px 10px;font-size:var(--font-size-xs);cursor:pointer;white-space:nowrap;overflow:hidden;color:var(--text-muted);transition:background .1s,color .1s}.branch-option.svelte-1ogsozk:hover{background:var(--surface-hover);color:var(--text)}.branch-current.svelte-1ogsozk,.branch-current.svelte-1ogsozk:hover{color:var(--accent)}.branch-switching.svelte-1ogsozk{opacity:.6;pointer-events:none}.branch-check.svelte-1ogsozk{font-size:.65rem;width:10px;flex-shrink:0;color:var(--accent)}.branch-check--empty.svelte-1ogsozk{display:inline-block}.branch-option-name.svelte-1ogsozk{overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}.branch-spinner.svelte-1ogsozk{color:var(--text-muted);font-size:var(--font-size-xs);flex-shrink:0}.pr-top-bar.svelte-1shtc4l{display:flex;align-items:center;height:36px;background:var(--surface);border-bottom:1px solid var(--border);padding:0 8px;gap:0;flex-shrink:0;overflow:hidden;font-family:var(--font-mono);font-size:var(--font-size-sm)}.bar-left.svelte-1shtc4l{display:flex;align-items:center;gap:4px;flex:1;min-width:0;overflow:hidden;padding-right:8px;border-right:1px solid var(--border)}.target-branch.svelte-1shtc4l{display:flex;align-items:center;gap:3px;color:var(--text-muted);font-size:var(--font-size-xs);flex-shrink:0;white-space:nowrap}.target-sep.svelte-1shtc4l{color:var(--border);font-size:.75rem}.target-name.svelte-1shtc4l{overflow:hidden;text-overflow:ellipsis;max-width:100px}.bar-middle.svelte-1shtc4l{display:flex;align-items:center;padding:0 12px;border-right:1px solid var(--border);flex-shrink:0;white-space:nowrap}.pr-link.svelte-1shtc4l{display:flex;align-items:center;gap:4px;color:var(--text-muted);text-decoration:none;font-size:var(--font-size-xs);transition:color .12s}.pr-link.svelte-1shtc4l:hover{color:var(--accent)}.pr-ext-icon.svelte-1shtc4l{flex-shrink:0;opacity:.6}.bar-right.svelte-1shtc4l{display:flex;align-items:center;padding-left:10px;gap:6px;flex-shrink:0}.refresh-btn.svelte-1shtc4l{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:4px;border:none;background:transparent;color:var(--text-muted);cursor:pointer;padding:0;transition:color .12s,background .12s}.refresh-btn.svelte-1shtc4l:hover:not(:disabled){color:var(--text);background:var(--border)}.refresh-btn.svelte-1shtc4l:disabled{cursor:default}.refresh-btn.refreshing.svelte-1shtc4l svg:where(.svelte-1shtc4l){animation:svelte-1shtc4l-spin .8s linear infinite}@keyframes svelte-1shtc4l-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.bar-loading.svelte-1shtc4l{color:var(--text-muted);font-size:var(--font-size-xs);padding:0 4px}.action-btn.svelte-1shtc4l{display:inline-flex;align-items:center;justify-content:center;height:22px;padding:0 10px;border-radius:11px;border:none;background:var(--action-color, var(--border));color:#fff;font-family:var(--font-mono);font-size:var(--font-size-xs);font-weight:500;cursor:pointer;white-space:nowrap;transition:opacity .12s,filter .12s;letter-spacing:.01em}.action-btn.svelte-1shtc4l:hover:not(:disabled){filter:brightness(1.15)}.action-btn.svelte-1shtc4l:active:not(:disabled){filter:brightness(.9)}.action-btn--dark-text.svelte-1shtc4l{color:#000}.action-btn--disabled.svelte-1shtc4l{cursor:default;opacity:.7}.bar-merged.svelte-1shtc4l{background:color-mix(in srgb,var(--status-merged) 8%,var(--surface))}.bar-conflicts.svelte-1shtc4l{background:color-mix(in srgb,var(--status-error) 8%,var(--surface))}.diff-stats.svelte-1shtc4l{display:flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:var(--font-size-xs);padding:0 8px;flex-shrink:0}.diff-add.svelte-1shtc4l{color:var(--status-success)}.diff-del.svelte-1shtc4l{color:var(--status-error)}.action-btn--secondary.svelte-1shtc4l{background:var(--border)!important;color:var(--text)!important;margin-right:6px}@media(max-width:600px){.target-branch.svelte-1shtc4l,.bar-middle.svelte-1shtc4l,.diff-stats.svelte-1shtc4l{display:none}.bar-left.svelte-1shtc4l{border-right:none;padding-right:4px}}.session-tab-bar.svelte-3dfyyn{display:flex;align-items:stretch;height:32px;background:var(--bg);border-bottom:1px solid var(--border);flex-shrink:0;font-family:var(--font-mono);font-size:var(--font-size-xs)}.tabs-scroll.svelte-3dfyyn{display:flex;align-items:stretch;overflow-x:auto;overflow-y:hidden;flex:1;min-width:0;scrollbar-width:none}.tabs-scroll.svelte-3dfyyn::-webkit-scrollbar{display:none}.tab.svelte-3dfyyn{display:inline-flex;align-items:center;gap:5px;height:32px;padding:0 10px;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--text-muted);font-family:var(--font-mono);font-size:var(--font-size-xs);cursor:pointer;white-space:nowrap;flex-shrink:0;position:relative;transition:color .12s,background .12s;border-radius:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.tab.svelte-3dfyyn:hover{color:var(--text);background:var(--surface-hover)}.tab--active.svelte-3dfyyn{background:var(--surface);color:var(--text);border-bottom-color:var(--accent)}.tab--active.svelte-3dfyyn:hover{background:var(--surface)}.tab-icon.svelte-3dfyyn{font-size:.7rem;line-height:1;flex-shrink:0}.tab-name.svelte-3dfyyn{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-close.svelte-3dfyyn{font-size:var(--font-size-xs);color:var(--text-muted);cursor:pointer;line-height:1;flex-shrink:0;border-radius:3px;width:14px;height:14px;display:inline-flex;align-items:center;justify-content:center;opacity:0;transition:opacity .1s,color .1s,background .1s}.tab.svelte-3dfyyn:hover .tab-close:where(.svelte-3dfyyn){opacity:1}.tab-close.svelte-3dfyyn:hover{color:var(--text);background:var(--border)}.tab--active.svelte-3dfyyn .tab-close:where(.svelte-3dfyyn){opacity:0}.tab--active.svelte-3dfyyn:hover .tab-close:where(.svelte-3dfyyn){opacity:1}.new-btn-wrap.svelte-3dfyyn{position:relative;display:flex;align-items:center;flex-shrink:0;border-left:1px solid var(--border)}.tab-new.svelte-3dfyyn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:none;border:none;color:var(--text-muted);font-size:1rem;cursor:pointer;font-family:var(--font-mono);transition:color .12s,background .12s;-webkit-appearance:none;-moz-appearance:none;appearance:none;line-height:1}.tab-new.svelte-3dfyyn:hover{color:var(--text);background:var(--surface-hover)}.new-menu.svelte-3dfyyn{position:absolute;top:calc(100% + 2px);right:0;background:var(--surface);border:1px solid var(--border);border-radius:4px;z-index:200;min-width:180px;box-shadow:0 4px 16px #00000080;padding:4px 0}.new-menu-item.svelte-3dfyyn{display:flex;align-items:center;gap:8px;width:100%;padding:7px 12px;background:none;border:none;color:var(--text-muted);font-family:var(--font-mono);font-size:var(--font-size-xs);cursor:pointer;text-align:left;transition:background .1s,color .1s;-webkit-appearance:none;-moz-appearance:none;appearance:none;white-space:nowrap}.new-menu-item.svelte-3dfyyn:hover{background:var(--surface-hover);color:var(--text)}.new-menu-icon.svelte-3dfyyn{font-size:.75rem;flex-shrink:0}.new-menu-divider.svelte-3dfyyn{height:1px;background:var(--border);margin:4px 0}@media(max-width:600px){.session-tab-bar.svelte-3dfyyn{height:44px}.tab.svelte-3dfyyn{height:44px;padding:0 12px;min-width:44px}.tab-close.svelte-3dfyyn{opacity:1;width:18px;height:18px}.tab--active.svelte-3dfyyn .tab-close:where(.svelte-3dfyyn){opacity:1}.tab-new.svelte-3dfyyn{width:44px;height:44px}}.repo-dashboard.svelte-bvvs2r{display:flex;flex-direction:column;gap:20px;padding:20px;background:var(--bg);min-height:0;max-width:none;overflow:hidden;flex:1}.dashboard-section.svelte-bvvs2r{display:flex;flex-direction:column;gap:8px;flex-shrink:0}.dashboard-section--scroll.svelte-bvvs2r{flex:1;min-height:120px;overflow:hidden}.scroll-container.svelte-bvvs2r{position:relative;flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.dashboard-section--scroll.svelte-bvvs2r{position:relative}.dashboard-section--scroll.svelte-bvvs2r:after{content:"";position:absolute;bottom:0;left:0;right:0;height:32px;background:linear-gradient(to bottom,transparent,var(--bg));pointer-events:none;z-index:1}.section-heading.svelte-bvvs2r{font-size:var(--font-size-sm);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);padding-bottom:6px;border-bottom:1px solid var(--border)}.section-message.svelte-bvvs2r{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text-muted);padding:6px 0}.section-message.info.svelte-bvvs2r a:where(.svelte-bvvs2r){color:var(--accent);text-decoration:none}.section-message.info.svelte-bvvs2r a:where(.svelte-bvvs2r):hover{text-decoration:underline}.pr-search.svelte-bvvs2r{padding:8px 10px;font-size:var(--font-size-sm);font-family:var(--font-mono);background:var(--surface);border:1px solid var(--border);border-radius:4px;color:var(--text);outline:none;transition:border-color .12s}.pr-search.svelte-bvvs2r::placeholder{color:var(--text-muted);opacity:.6}.pr-search.svelte-bvvs2r:focus{border-color:var(--accent)}.pr-list.svelte-bvvs2r{display:flex;flex-direction:column;gap:0;border:1px solid var(--border);border-radius:4px;overflow:hidden}.pr-row.svelte-bvvs2r{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border-bottom:1px solid var(--border)}.pr-row.svelte-bvvs2r:last-child{border-bottom:none}.pr-row-left.svelte-bvvs2r{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}.pr-row-title-line.svelte-bvvs2r{display:flex;align-items:center;gap:8px;min-width:0}.pr-title-link.svelte-bvvs2r{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text);text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1}.pr-title-link.svelte-bvvs2r:hover{color:var(--accent);text-decoration:underline}.pr-row-actions.svelte-bvvs2r{display:flex;align-items:center;gap:8px;flex-shrink:0}.pr-session-btn.svelte-bvvs2r{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;border:1px solid var(--border);background:transparent;color:var(--text-muted);font-size:var(--font-size-sm);font-family:var(--font-mono);cursor:pointer;transition:background .12s,color .12s,border-color .12s;flex-shrink:0}.pr-session-btn.svelte-bvvs2r:hover{background:color-mix(in srgb,var(--accent) 12%,transparent);border-color:var(--accent);color:var(--accent)}.pr-conflict-pill.svelte-bvvs2r{--pill-color: var(--status-error);font-weight:600}.pr-merge-pill.svelte-bvvs2r{--pill-color: var(--status-success);color:#1a1a1a;font-weight:600}.pr-row-meta.svelte-bvvs2r{display:flex;align-items:center;gap:4px;font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted)}.pr-sep.svelte-bvvs2r{opacity:.4}.dot.svelte-bvvs2r{width:7px;height:7px;border-radius:50%;flex-shrink:0;display:inline-block}.dot-success.svelte-bvvs2r{background:var(--status-success)}.dot-error.svelte-bvvs2r{background:var(--status-error)}.dot-warning.svelte-bvvs2r{background:var(--status-warning)}.dot-muted.svelte-bvvs2r{background:var(--border)}.pr-action-pill.svelte-bvvs2r{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:6px 12px;min-height:32px;border-radius:20px;border:none;background:var(--pill-color, var(--border));font-size:var(--font-size-xs);font-family:var(--font-mono);color:#fff;text-decoration:none;white-space:nowrap;cursor:pointer;transition:opacity .12s}.pr-action-pill.svelte-bvvs2r:hover{opacity:.85}.pr-action-pill.dark-text.svelte-bvvs2r{color:#1a1a1a}.activity-list.svelte-bvvs2r{display:flex;flex-direction:column;gap:4px}.activity-row.svelte-bvvs2r{display:flex;align-items:baseline;gap:8px;font-size:var(--font-size-xs);font-family:var(--font-mono);min-width:0}.commit-hash.svelte-bvvs2r{color:var(--text-muted);flex-shrink:0;letter-spacing:.02em}.commit-msg.svelte-bvvs2r{color:var(--text);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.commit-branch.svelte-bvvs2r{color:var(--text-muted);flex-shrink:0;white-space:nowrap}.commit-time.svelte-bvvs2r{color:var(--text-muted);flex-shrink:0;white-space:nowrap;opacity:.6}.non-git-notice.svelte-bvvs2r{padding:8px 0}.non-git-msg.svelte-bvvs2r{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text-muted)}.cta-row.svelte-bvvs2r{display:flex;align-items:center;gap:10px;padding-top:4px;flex-shrink:0}.cta-btn.svelte-bvvs2r{display:inline-flex;align-items:center;justify-content:center;padding:10px 18px;min-height:40px;background:transparent;border:1px solid var(--accent);border-radius:4px;color:var(--accent);font-size:var(--font-size-sm);font-family:var(--font-mono);cursor:pointer;transition:background .12s,color .12s;white-space:nowrap}.cta-btn.svelte-bvvs2r:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 12%,transparent)}.cta-btn.svelte-bvvs2r:disabled{opacity:.5;cursor:not-allowed}.skeleton.svelte-bvvs2r{pointer-events:none}.skeleton-line.svelte-bvvs2r{background:var(--border);border-radius:3px;animation:svelte-bvvs2r-skeleton-pulse 1.4s ease-in-out infinite}.skeleton-title.svelte-bvvs2r{height:13px;width:60%;margin-bottom:5px}.skeleton-meta.svelte-bvvs2r{height:10px;width:40%}.skeleton-activity.svelte-bvvs2r{height:12px;width:75%}@keyframes svelte-bvvs2r-skeleton-pulse{0%,to{opacity:.4}50%{opacity:.7}}@media(max-width:600px){.repo-dashboard.svelte-bvvs2r{padding:14px}.pr-row.svelte-bvvs2r{flex-wrap:wrap;gap:8px;padding:12px 10px;min-height:44px;align-items:flex-start}.pr-row-left.svelte-bvvs2r{width:100%}.pr-action-pill.svelte-bvvs2r{align-self:flex-end;margin-left:auto;padding:5px 12px;min-height:32px}.cta-btn.svelte-bvvs2r{flex:1;min-height:44px}}.ticket-card.svelte-wipetl{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border-bottom:1px solid var(--border);background:var(--bg);transition:background .1s}.ticket-card.svelte-wipetl:last-child{border-bottom:none}.ticket-card.svelte-wipetl:hover{background:var(--surface)}.ticket-left.svelte-wipetl{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}.ticket-title-line.svelte-wipetl{display:flex;align-items:center;gap:8px;min-width:0}.ticket-title-link.svelte-wipetl{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text);text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1}.ticket-title-link.svelte-wipetl:hover{color:var(--accent);text-decoration:underline}.ticket-meta.svelte-wipetl{display:flex;align-items:center;gap:4px;font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);flex-wrap:wrap}.ticket-sep.svelte-wipetl{opacity:.4}.ticket-number.svelte-wipetl{opacity:.6}.ticket-key.svelte-wipetl{font-weight:600;opacity:.8}.repo-chip.svelte-wipetl{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;font-size:var(--font-size-xs);font-family:var(--font-mono);font-weight:700;color:#000;white-space:nowrap;line-height:1.4}.label-chip.svelte-wipetl{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;font-size:var(--font-size-xs);font-family:var(--font-mono);font-weight:600;color:#000;white-space:nowrap;line-height:1.4;max-width:80px;overflow:hidden;text-overflow:ellipsis}.status-badge.svelte-wipetl{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;font-size:var(--font-size-xs);font-family:var(--font-mono);font-weight:600;color:var(--text-muted);background:var(--surface);border:1px solid var(--border);white-space:nowrap;line-height:1.4}.priority-badge.svelte-wipetl{font-weight:600;white-space:nowrap}.sprint-chip.svelte-wipetl{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);background:var(--surface);border:1px solid var(--border);white-space:nowrap;line-height:1.4;max-width:100px;overflow:hidden;text-overflow:ellipsis}.points-badge.svelte-wipetl{font-weight:600;opacity:.7}.branch-chip.svelte-wipetl{display:inline-flex;align-items:center;gap:4px;font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);opacity:.8}.dot.svelte-wipetl{width:7px;height:7px;border-radius:50%;flex-shrink:0;display:inline-block}.dot-inline.svelte-wipetl{width:6px;height:6px}.dot-success.svelte-wipetl{background:var(--status-success)}.dot-muted.svelte-wipetl{background:var(--border)}.dot-active.svelte-wipetl{background:var(--accent)}.dot-info.svelte-wipetl{background:var(--accent);opacity:.6}.ticket-actions.svelte-wipetl{display:flex;align-items:center;flex-shrink:0}.start-work-btn.svelte-wipetl{padding:5px 12px;font-size:var(--font-size-xs);font-family:var(--font-mono);background:none;border:1px solid var(--border);border-radius:4px;color:var(--text-muted);cursor:not-allowed;opacity:.45;white-space:nowrap;transition:border-color .12s,color .12s,opacity .12s}.start-work-btn--active.svelte-wipetl{cursor:pointer;opacity:1}.start-work-btn--active.svelte-wipetl:hover{border-color:var(--accent);color:var(--accent)}@media(max-width:600px){.ticket-card.svelte-wipetl{flex-direction:column;align-items:flex-start;gap:8px;padding:12px 10px}.ticket-left.svelte-wipetl{width:100%}.ticket-actions.svelte-wipetl{align-self:flex-end}}.tickets-panel.svelte-htgqk2{display:flex;flex-direction:column;gap:12px}.tab-strip.svelte-htgqk2{display:flex;gap:0;border-bottom:1px solid var(--border);flex-shrink:0}.tab-btn.svelte-htgqk2{padding:6px 14px;font-size:var(--font-size-xs);font-family:var(--font-mono);font-weight:600;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;margin-bottom:-1px;transition:color .12s,border-color .12s;white-space:nowrap;text-transform:uppercase;letter-spacing:.06em}.tab-btn.svelte-htgqk2:hover{color:var(--text)}.tab-btn--active.svelte-htgqk2{color:var(--accent);border-bottom-color:var(--accent)}.panel-header.svelte-htgqk2{display:flex;align-items:baseline;gap:8px;flex-shrink:0}.panel-title.svelte-htgqk2{font-size:var(--font-size-sm);font-family:var(--font-mono);font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted)}.panel-count.svelte-htgqk2{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);opacity:.7;font-weight:400;text-transform:none;letter-spacing:0}.state-message.svelte-htgqk2{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text-muted);padding:6px 0;display:flex;align-items:center;gap:10px;flex-shrink:0}.state-message--info.svelte-htgqk2 a:where(.svelte-htgqk2){color:var(--accent);text-decoration:none}.state-message--info.svelte-htgqk2 a:where(.svelte-htgqk2):hover{text-decoration:underline}.retry-btn.svelte-htgqk2{background:none;border:1px solid var(--border);border-radius:4px;color:var(--text-muted);font-size:var(--font-size-xs);font-family:var(--font-mono);cursor:pointer;padding:4px 10px;transition:border-color .12s,color .12s}.retry-btn.svelte-htgqk2:hover{border-color:var(--accent);color:var(--accent)}.ticket-list.svelte-htgqk2{display:flex;flex-direction:column;gap:0;border:1px solid var(--border);border-radius:4px;overflow:hidden;flex-shrink:0}.ticket-skeleton.svelte-htgqk2{display:flex;flex-direction:column;justify-content:center;gap:6px;padding:10px 12px;border-bottom:1px solid var(--border);min-height:56px;pointer-events:none}.ticket-skeleton.svelte-htgqk2:last-child{border-bottom:none}.skeleton-line.svelte-htgqk2{background:var(--border);border-radius:3px;animation:svelte-htgqk2-skeleton-pulse 1.4s ease-in-out infinite}.skeleton-title.svelte-htgqk2{height:13px;width:60%}.skeleton-meta.svelte-htgqk2{height:10px;width:40%}@keyframes svelte-htgqk2-skeleton-pulse{0%,to{opacity:.4}50%{opacity:.7}}@media(max-width:600px){.tab-btn.svelte-htgqk2{padding:5px 10px}}.modal-backdrop.svelte-1d388up{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.modal.svelte-1d388up{background:var(--bg);border:1px solid var(--border);border-radius:8px;width:90%;max-width:420px;box-shadow:0 8px 32px #0000004d}.modal-header.svelte-1d388up{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--border)}.modal-title.svelte-1d388up{font-size:var(--font-size-sm);font-family:var(--font-mono);font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--text)}.modal-close.svelte-1d388up{background:none;border:none;color:var(--text-muted);font-size:18px;cursor:pointer;padding:0 4px;line-height:1}.modal-close.svelte-1d388up:hover{color:var(--text)}.modal-body.svelte-1d388up{padding:16px;display:flex;flex-direction:column;gap:12px}.ticket-info.svelte-1d388up{display:flex;flex-direction:column;gap:2px}.ticket-info-label.svelte-1d388up{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);text-transform:uppercase;letter-spacing:.06em}.ticket-info-value.svelte-1d388up{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text)}.field.svelte-1d388up{display:flex;flex-direction:column;gap:4px}.field-label.svelte-1d388up{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);text-transform:uppercase;letter-spacing:.06em}.field-input.svelte-1d388up{padding:8px 10px;font-size:var(--font-size-sm);font-family:var(--font-mono);background:var(--surface);border:1px solid var(--border);border-radius:4px;color:var(--text);outline:none;transition:border-color .12s}.field-input.svelte-1d388up:focus{border-color:var(--accent)}.error-msg.svelte-1d388up{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--status-error);padding:6px 8px;background:#ff64641a;border-radius:4px}.modal-footer.svelte-1d388up{display:flex;justify-content:flex-end;gap:8px;padding:12px 16px;border-top:1px solid var(--border)}.btn.svelte-1d388up{padding:7px 16px;font-size:var(--font-size-xs);font-family:var(--font-mono);border-radius:4px;border:1px solid var(--border);cursor:pointer;transition:background .12s,border-color .12s,color .12s;white-space:nowrap}.btn.svelte-1d388up:disabled{opacity:.5;cursor:not-allowed}.btn-secondary.svelte-1d388up{background:none;color:var(--text-muted)}.btn-secondary.svelte-1d388up:hover:not(:disabled){color:var(--text);border-color:var(--text-muted)}.btn-primary.svelte-1d388up{background:var(--accent);color:#000;border-color:var(--accent);font-weight:600}.btn-primary.svelte-1d388up:hover:not(:disabled){opacity:.9}.automation-panel.svelte-13z9fw2{display:flex;flex-direction:column;gap:10px;border:1px solid var(--border);border-radius:4px;padding:12px;background:var(--bg);flex-shrink:0}.panel-header.svelte-13z9fw2{display:flex;align-items:center;gap:8px}.panel-title.svelte-13z9fw2{font-size:var(--font-size-xs);font-family:var(--font-mono);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted)}.panel-loading.svelte-13z9fw2,.panel-error.svelte-13z9fw2{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);display:flex;align-items:center;gap:8px}.retry-btn.svelte-13z9fw2{background:none;border:1px solid var(--border);border-radius:4px;color:var(--text-muted);font-size:var(--font-size-xs);font-family:var(--font-mono);cursor:pointer;padding:3px 8px;transition:border-color .12s,color .12s}.retry-btn.svelte-13z9fw2:hover{border-color:var(--accent);color:var(--accent)}.toggle-list.svelte-13z9fw2{display:flex;flex-direction:column;gap:8px}.toggle-row.svelte-13z9fw2{display:flex;align-items:flex-start;gap:10px;cursor:pointer;padding:4px 0}.toggle-row--disabled.svelte-13z9fw2{opacity:.5;pointer-events:none}.toggle-checkbox.svelte-13z9fw2{margin-top:2px;accent-color:var(--accent);flex-shrink:0;cursor:pointer}.toggle-info.svelte-13z9fw2{display:flex;flex-direction:column;gap:2px}.toggle-label.svelte-13z9fw2{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text)}.toggle-desc.svelte-13z9fw2{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);opacity:.7}.org-dashboard.svelte-126xfdh{display:flex;flex-direction:column;gap:16px;padding:20px;background:var(--bg);flex:1;min-height:0;overflow-y:auto}.org-header.svelte-126xfdh{display:flex;align-items:baseline;gap:12px;padding-bottom:8px;border-bottom:1px solid var(--border);flex-shrink:0}.org-title.svelte-126xfdh{font-size:var(--font-size-sm);font-family:var(--font-mono);font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted)}.org-subtitle.svelte-126xfdh{font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);opacity:.7}.tab-strip.svelte-126xfdh{display:flex;gap:0;border-bottom:1px solid var(--border);flex-shrink:0;margin-top:-4px}.tab-btn.svelte-126xfdh{padding:6px 14px;font-size:var(--font-size-xs);font-family:var(--font-mono);font-weight:600;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;margin-bottom:-1px;transition:color .12s,border-color .12s;white-space:nowrap;text-transform:uppercase;letter-spacing:.06em}.tab-btn.svelte-126xfdh:hover{color:var(--text)}.tab-btn--active.svelte-126xfdh{color:var(--accent);border-bottom-color:var(--accent)}.filter-bar.svelte-126xfdh{display:flex;gap:8px;flex-shrink:0}.filter-select.svelte-126xfdh{padding:6px 10px;font-size:var(--font-size-xs);font-family:var(--font-mono);background:var(--surface);border:1px solid var(--border);border-radius:4px;color:var(--text);cursor:pointer;outline:none;transition:border-color .12s}.filter-select.svelte-126xfdh:focus{border-color:var(--accent)}.state-message.svelte-126xfdh{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text-muted);padding:6px 0;display:flex;align-items:center;gap:10px;flex-shrink:0}.state-message--info.svelte-126xfdh a:where(.svelte-126xfdh){color:var(--accent);text-decoration:none}.state-message--info.svelte-126xfdh a:where(.svelte-126xfdh):hover{text-decoration:underline}.retry-btn.svelte-126xfdh{background:none;border:1px solid var(--border);border-radius:4px;color:var(--text-muted);font-size:var(--font-size-xs);font-family:var(--font-mono);cursor:pointer;padding:4px 10px;transition:border-color .12s,color .12s}.retry-btn.svelte-126xfdh:hover{border-color:var(--accent);color:var(--accent)}.pr-list.svelte-126xfdh{display:flex;flex-direction:column;gap:0;border:1px solid var(--border);border-radius:4px;overflow:hidden;flex-shrink:0}.pr-row.svelte-126xfdh{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border-bottom:1px solid var(--border);background:var(--bg);transition:background .1s}.pr-row.svelte-126xfdh:last-child{border-bottom:none}.pr-row.svelte-126xfdh:hover{background:var(--surface)}.pr-row-left.svelte-126xfdh{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}.pr-row-title-line.svelte-126xfdh{display:flex;align-items:center;gap:8px;min-width:0}.pr-title-link.svelte-126xfdh{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text);text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1}.pr-title-link.svelte-126xfdh:hover{color:var(--accent);text-decoration:underline}.pr-row-actions.svelte-126xfdh{display:flex;align-items:center;gap:8px;flex-shrink:0}.pr-row-meta.svelte-126xfdh{display:flex;align-items:center;gap:4px;font-size:var(--font-size-xs);font-family:var(--font-mono);color:var(--text-muted);flex-wrap:wrap}.pr-sep.svelte-126xfdh{opacity:.4}.repo-chip.svelte-126xfdh{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;font-size:var(--font-size-xs);font-family:var(--font-mono);font-weight:700;color:#000;cursor:pointer;white-space:nowrap;transition:opacity .12s;line-height:1.4}.repo-chip.svelte-126xfdh:hover{opacity:.8}.ticket-chip.svelte-126xfdh{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;font-size:var(--font-size-xs);font-family:var(--font-mono);font-weight:600;color:var(--text-muted);background:var(--surface);border:1px solid var(--border);white-space:nowrap;line-height:1.4}.dot.svelte-126xfdh{width:7px;height:7px;border-radius:50%;flex-shrink:0;display:inline-block}.dot-success.svelte-126xfdh{background:var(--status-success)}.dot-error.svelte-126xfdh{background:var(--status-error)}.dot-muted.svelte-126xfdh{background:var(--border)}.pr-action-pill.svelte-126xfdh{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:6px 12px;min-height:32px;border-radius:20px;border:none;background:var(--pill-color, var(--border));font-size:var(--font-size-xs);font-family:var(--font-mono);color:#fff;text-decoration:none;white-space:nowrap;cursor:pointer;transition:opacity .12s}.pr-action-pill.svelte-126xfdh:hover{opacity:.85}.pr-action-pill.dark-text.svelte-126xfdh{color:#1a1a1a}.skeleton.svelte-126xfdh{pointer-events:none;min-height:56px;flex-direction:column;justify-content:center;gap:6px}.skeleton-line.svelte-126xfdh{background:var(--border);border-radius:3px;animation:svelte-126xfdh-skeleton-pulse 1.4s ease-in-out infinite}.skeleton-title.svelte-126xfdh{height:13px;width:60%}.skeleton-meta.svelte-126xfdh{height:10px;width:40%}@keyframes svelte-126xfdh-skeleton-pulse{0%,to{opacity:.4}50%{opacity:.7}}@media(max-width:600px){.org-dashboard.svelte-126xfdh{padding:14px}.pr-row.svelte-126xfdh{flex-direction:column;align-items:flex-start;gap:8px;padding:12px 10px}.pr-row-left.svelte-126xfdh{width:100%}.pr-row-actions.svelte-126xfdh{align-self:flex-end}.pr-action-pill.svelte-126xfdh{padding:5px 12px;min-height:32px}.filter-bar.svelte-126xfdh{flex-wrap:wrap}}.empty-state.svelte-1luen49{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;max-width:320px;text-align:center;padding:32px 16px;flex:1;margin:0 auto}.empty-icon.svelte-1luen49{font-size:2rem;line-height:1;color:var(--text-muted);opacity:.5}.empty-heading.svelte-1luen49{font-size:var(--font-size-lg);font-family:var(--font-mono);color:var(--text);font-weight:600;line-height:1.3}.empty-description.svelte-1luen49{font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--text-muted);line-height:1.5}.empty-action.svelte-1luen49{display:inline-flex;align-items:center;justify-content:center;padding:10px 18px;min-height:40px;background:transparent;border:1px solid var(--accent);border-radius:4px;color:var(--accent);font-size:var(--font-size-sm);font-family:var(--font-mono);cursor:pointer;margin-top:4px;transition:background .12s,color .12s;white-space:nowrap}.empty-action.svelte-1luen49:hover{background:color-mix(in srgb,var(--accent) 12%,transparent)}.toolbar.svelte-k7we1m{background:var(--surface);border-top:1px solid var(--border);padding:4px;padding-bottom:calc(4px + env(safe-area-inset-bottom,0px));flex-shrink:0}.toolbar-grid.svelte-k7we1m{display:grid;grid-template-columns:repeat(6,1fr);gap:4px}.tb-btn.svelte-k7we1m{background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.85rem;padding:8px 4px;cursor:pointer;touch-action:manipulation;min-height:40px;display:flex;align-items:center;justify-content:center;user-select:none;-webkit-user-select:none}.tb-btn.svelte-k7we1m:active{background:var(--border)}.tb-enter.svelte-k7we1m{background:var(--accent);border-color:var(--accent);color:#fff}.tb-enter.svelte-k7we1m:active{opacity:.8}.mobile-header.svelte-wp0i5g{display:none;align-items:center;gap:8px;padding:8px 12px;background:var(--surface);border-bottom:1px solid var(--border);min-height:44px;flex-shrink:0}@media(max-width:768px){.mobile-header.svelte-wp0i5g{display:flex}.mobile-header.hidden.svelte-wp0i5g{display:none}}.mobile-title.svelte-wp0i5g{font-size:.95rem;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.icon-btn.svelte-wp0i5g{background:none;border:none;color:var(--text);font-size:1.2rem;cursor:pointer;padding:6px;min-width:36px;min-height:36px;display:flex;align-items:center;justify-content:center;border-radius:6px;touch-action:manipulation}.icon-btn.svelte-wp0i5g:hover{background:var(--border)}.update-toast.svelte-1trivgv{position:fixed;bottom:0;left:0;right:0;z-index:150;display:flex;justify-content:center;padding:12px 12px calc(12px + env(safe-area-inset-bottom));pointer-events:none;animation:svelte-1trivgv-toast-slide-up .25s ease-out}@keyframes svelte-1trivgv-toast-slide-up{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}.update-toast-content.svelte-1trivgv{display:flex;flex-direction:row;align-items:center;gap:12px;background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:12px 16px;max-width:500px;box-shadow:0 4px 16px #0000004d;pointer-events:auto}.update-toast-text.svelte-1trivgv{flex:1;font-size:.85rem;color:var(--text)}.update-toast-actions.svelte-1trivgv{display:flex;gap:8px;flex-shrink:0}.update-toast-btn.svelte-1trivgv{padding:8px 14px;border-radius:6px;font-size:.8rem;border:none;background:var(--accent);color:#fff;cursor:pointer;white-space:nowrap}.update-toast-btn.svelte-1trivgv:disabled{opacity:.6;cursor:not-allowed}.update-toast-dismiss.svelte-1trivgv{background:none;border:none;color:var(--text-muted);font-size:1.2rem;padding:4px 6px;cursor:pointer}.update-toast-dismiss.svelte-1trivgv:hover{color:var(--text)}.image-toast.svelte-1y8sviv{position:fixed;bottom:60px;left:50%;transform:translate(-50%);z-index:1000;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:8px 14px;color:var(--text);font-size:13px;max-width:90vw;box-shadow:0 4px 12px #0006}.image-toast-content.svelte-1y8sviv{display:flex;align-items:center;gap:10px}.image-toast-text.svelte-1y8sviv{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:60vw}.image-toast-actions.svelte-1y8sviv{display:flex;gap:6px;align-items:center;flex-shrink:0}.image-toast-insert.svelte-1y8sviv{background:var(--accent);color:#fff;border:none;border-radius:4px;padding:4px 10px;font-size:12px;cursor:pointer}.image-toast-insert.svelte-1y8sviv:active{opacity:.8}.image-toast-dismiss.svelte-1y8sviv{background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:16px;padding:2px 6px}.image-toast-dismiss.svelte-1y8sviv:hover{color:var(--text)}.dialog.svelte-8ywkqk{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:10px;padding:0;width:min(480px,95vw);max-height:90vh;overflow:hidden}.dialog.svelte-8ywkqk::backdrop{background:#0009}.dialog-content.svelte-8ywkqk{display:flex;flex-direction:column;max-height:90vh;overflow:hidden}.dialog-title.svelte-8ywkqk{font-size:1.1rem;font-weight:600;padding:16px 20px 12px;margin:0;border-bottom:1px solid var(--border);flex-shrink:0}.dialog-title-repo.svelte-8ywkqk{font-weight:400;color:var(--text-muted);font-size:1rem}.dialog-body.svelte-8ywkqk{padding:16px 20px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:14px}.dialog-field.svelte-8ywkqk{display:flex;flex-direction:column;gap:5px}.dialog-field--inline.svelte-8ywkqk{flex-direction:row;align-items:center;gap:8px}.dialog-label.svelte-8ywkqk{font-size:.85rem;color:var(--text-muted)}.dialog-label-inline.svelte-8ywkqk{font-size:.9rem;cursor:pointer}.dialog-select.svelte-8ywkqk,.dialog-input.svelte-8ywkqk{background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.9rem;padding:7px 10px;width:100%;box-sizing:border-box}.dialog-select.svelte-8ywkqk:disabled{opacity:.5;cursor:not-allowed}.dialog-checkbox.svelte-8ywkqk{width:16px;height:16px;accent-color:var(--accent);cursor:pointer;flex-shrink:0}.dialog-footer.svelte-8ywkqk{display:flex;justify-content:flex-end;gap:10px;padding:12px 20px 16px;border-top:1px solid var(--border);flex-shrink:0}.btn.svelte-8ywkqk{padding:8px 18px;border-radius:6px;font-size:.9rem;cursor:pointer;border:1px solid transparent;font-weight:500;transition:opacity .15s}.btn.svelte-8ywkqk:disabled{opacity:.4;cursor:not-allowed}.btn-primary.svelte-8ywkqk{background:var(--accent);color:#fff}.btn-primary.svelte-8ywkqk:hover:not(:disabled){opacity:.9}.btn-ghost.svelte-8ywkqk{background:transparent;color:var(--text-muted);border-color:var(--border)}.btn-ghost.svelte-8ywkqk:hover{background:var(--border);color:var(--text)}.dialog.svelte-fdtoa4{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:10px;padding:0;width:min(460px,95vw);max-height:90vh;overflow:hidden}.dialog.svelte-fdtoa4::backdrop{background:#0009}.dialog-content.svelte-fdtoa4{display:flex;flex-direction:column;max-height:90vh;overflow:hidden}.dialog-header.svelte-fdtoa4{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border);flex-shrink:0}.dialog-title.svelte-fdtoa4{font-size:1.1rem;font-weight:600;margin:0}.close-btn.svelte-fdtoa4{background:none;border:none;color:var(--text-muted);font-size:1rem;cursor:pointer;padding:4px 6px;border-radius:4px}.close-btn.svelte-fdtoa4:hover{background:var(--border);color:var(--text)}.dialog-body.svelte-fdtoa4{padding:16px 20px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:20px}.settings-section.svelte-fdtoa4{display:flex;flex-direction:column;gap:10px}.section-title.svelte-fdtoa4{font-size:.9rem;font-weight:600;color:var(--text);margin:0}.section-desc.svelte-fdtoa4{font-size:.82rem;color:var(--text-muted);margin:0}.error-msg.svelte-fdtoa4{font-size:.82rem;color:#e74c3c;margin:0}.agent-select.svelte-fdtoa4{background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:.9rem;padding:7px 10px;width:100%;box-sizing:border-box}.devtools-row.svelte-fdtoa4{display:flex;align-items:center;gap:8px}.dialog-checkbox.svelte-fdtoa4{width:16px;height:16px;accent-color:var(--accent);cursor:pointer;flex-shrink:0}.devtools-label.svelte-fdtoa4{font-size:.9rem;cursor:pointer}.dialog-footer.svelte-fdtoa4{display:flex;justify-content:flex-end;gap:10px;padding:12px 20px 16px;border-top:1px solid var(--border);flex-shrink:0}.btn.svelte-fdtoa4{padding:8px 18px;border-radius:6px;font-size:.9rem;cursor:pointer;border:1px solid transparent;font-weight:500}.btn-primary.svelte-fdtoa4{background:var(--accent);color:#fff;flex-shrink:0}.btn-primary.svelte-fdtoa4:hover{opacity:.9}.btn-ghost.svelte-fdtoa4{background:transparent;color:var(--text-muted);border-color:var(--border)}.btn-ghost.svelte-fdtoa4:hover{background:var(--border);color:var(--text)}.btn-sm.svelte-fdtoa4{padding:5px 12px;font-size:.8rem}.version-row.svelte-fdtoa4{display:flex;align-items:center;gap:10px}.version-current.svelte-fdtoa4{font-size:.9rem;font-family:monospace;color:var(--text)}.version-status.svelte-fdtoa4{font-size:.8rem;color:var(--text-muted)}.version-update-row.svelte-fdtoa4{display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--bg);border:1px solid var(--border);border-radius:6px;padding:8px 10px}.version-update-text.svelte-fdtoa4{font-size:.85rem;color:var(--accent)}.version-status-msg.svelte-fdtoa4{font-size:.82rem;color:var(--text-muted);margin:0}.dialog.svelte-15sco2n{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:10px;padding:0;width:min(400px,95vw);overflow:hidden}.dialog.svelte-15sco2n::backdrop{background:#0009}.dialog-content.svelte-15sco2n{display:flex;flex-direction:column}.dialog-title.svelte-15sco2n{font-size:1.1rem;font-weight:600;padding:16px 20px 12px;margin:0;border-bottom:1px solid var(--border)}.dialog-body.svelte-15sco2n{padding:16px 20px;display:flex;flex-direction:column;gap:8px}.confirm-msg.svelte-15sco2n{font-size:.95rem;margin:0;line-height:1.5}.wt-name.svelte-15sco2n{color:var(--text)}.wt-path.svelte-15sco2n{font-size:.82rem;color:var(--text-muted);font-family:monospace;margin:0;word-break:break-all}.warning-msg.svelte-15sco2n{font-size:.82rem;color:#e74c3c;margin:0}.error-msg.svelte-15sco2n{font-size:.85rem;color:#e74c3c;margin:0;padding:8px 10px;background:#e74c3c1a;border-radius:6px;border:1px solid rgba(231,76,60,.3)}.dialog-footer.svelte-15sco2n{display:flex;justify-content:flex-end;gap:10px;padding:12px 20px 16px;border-top:1px solid var(--border)}.btn.svelte-15sco2n{padding:8px 18px;border-radius:6px;font-size:.9rem;cursor:pointer;border:1px solid transparent;font-weight:500}.btn.svelte-15sco2n:disabled{opacity:.4;cursor:not-allowed}.btn-danger.svelte-15sco2n{background:#e74c3c;color:#fff}.btn-danger.svelte-15sco2n:hover:not(:disabled){opacity:.9}.btn-ghost.svelte-15sco2n{background:transparent;color:var(--text-muted);border-color:var(--border)}.btn-ghost.svelte-15sco2n:hover:not(:disabled){background:var(--border);color:var(--text)}.file-browser.svelte-15gfcbp{display:flex;flex-direction:column;gap:8px}.filter-row.svelte-15gfcbp{display:flex;gap:8px}.filter-input.svelte-15gfcbp{flex:1;background:var(--bg);border:1px solid var(--border);border-radius:0;color:var(--text);font-family:var(--font-mono);font-size:var(--font-size-sm);padding:8px 10px;outline:none}.filter-input.svelte-15gfcbp:focus{border-color:var(--accent)}.filter-input.svelte-15gfcbp::placeholder{color:var(--text-muted);opacity:.5}.tree-container.svelte-15gfcbp{background:var(--bg);border:1px solid var(--border);max-height:50vh;overflow-y:auto;outline:none}.tree-container.svelte-15gfcbp:focus-visible{border-color:var(--accent)}.loading-placeholder.svelte-15gfcbp,.empty-placeholder.svelte-15gfcbp{padding:20px 16px;color:var(--text-muted);font-family:var(--font-mono);font-size:var(--font-size-sm);text-align:center}.tree-row.svelte-15gfcbp{display:flex;align-items:center;gap:6px;padding-top:4px;padding-bottom:4px;padding-right:12px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .1s;min-height:32px}.tree-row.svelte-15gfcbp:hover{background:var(--border)}.tree-row.focused.svelte-15gfcbp{outline:2px solid var(--accent);outline-offset:-2px}.tree-row.selected.svelte-15gfcbp{background:color-mix(in srgb,var(--accent) 10%,transparent)}.expand-btn.svelte-15gfcbp{background:none;border:none;color:var(--text-muted);cursor:pointer;padding:2px;width:18px;height:18px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:10px;border-radius:2px}.expand-btn.svelte-15gfcbp:hover{background:var(--surface);color:var(--text)}.expand-spacer.svelte-15gfcbp{width:18px;flex-shrink:0}.arrow.svelte-15gfcbp{display:inline-block;transition:transform .15s}.arrow.expanded.svelte-15gfcbp{transform:rotate(90deg)}.spinner.svelte-15gfcbp{animation:svelte-15gfcbp-blink 1s infinite;font-size:10px}@keyframes svelte-15gfcbp-blink{0%,to{opacity:1}50%{opacity:.3}}.node-checkbox.svelte-15gfcbp{width:14px;height:14px;accent-color:var(--accent);cursor:pointer;flex-shrink:0;margin:0}.node-name.svelte-15gfcbp{font-family:var(--font-mono);font-size:var(--font-size-sm);color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.git-badge.svelte-15gfcbp{font-family:var(--font-mono);font-size:10px;color:var(--accent);background:color-mix(in srgb,var(--accent) 15%,transparent);padding:1px 5px;border-radius:3px;flex-shrink:0;text-transform:lowercase}.truncated-notice.svelte-15gfcbp{padding:8px 12px;font-family:var(--font-mono);font-size:11px;color:var(--text-muted);border-top:1px solid var(--border);text-align:center}.dialog.svelte-4yj2yx{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:0;width:min(520px,95vw);max-height:85vh;overflow:hidden}.dialog.svelte-4yj2yx::backdrop{background:#000000b3}.dialog-content.svelte-4yj2yx{display:flex;flex-direction:column;max-height:85vh}.dialog-header.svelte-4yj2yx{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border);flex-shrink:0}.dialog-title.svelte-4yj2yx{font-size:var(--font-size-lg, 1.1rem);font-weight:600;font-family:var(--font-mono, monospace);margin:0}.close-btn.svelte-4yj2yx{background:none;border:none;color:var(--text-muted);font-size:1rem;cursor:pointer;padding:4px 6px;border-radius:4px}.close-btn.svelte-4yj2yx:hover{background:var(--border);color:var(--text)}.dialog-body.svelte-4yj2yx{padding:16px 20px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:12px}.dialog-desc.svelte-4yj2yx{font-size:var(--font-size-sm, .85rem);color:var(--text-muted);font-family:var(--font-mono, monospace);margin:0;line-height:1.5}.error-msg.svelte-4yj2yx{font-size:var(--font-size-xs, .75rem);color:var(--status-error, #e57373);font-family:var(--font-mono, monospace);margin:0}.dialog-footer.svelte-4yj2yx{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 20px 16px;border-top:1px solid var(--border);flex-shrink:0}.selected-count.svelte-4yj2yx{font-size:var(--font-size-sm, .85rem);color:var(--text-muted);font-family:var(--font-mono, monospace)}.footer-actions.svelte-4yj2yx{display:flex;gap:10px}.btn.svelte-4yj2yx{padding:8px 18px;border-radius:0;font-size:var(--font-size-sm, .85rem);font-family:var(--font-mono, monospace);cursor:pointer;border:1px solid transparent;font-weight:500}.btn.svelte-4yj2yx:disabled{opacity:.5;cursor:not-allowed}.btn-primary.svelte-4yj2yx{background:var(--accent);color:#fff}.btn-primary.svelte-4yj2yx:hover:not(:disabled){opacity:.9}.btn-ghost.svelte-4yj2yx{background:transparent;color:var(--text-muted);border-color:var(--border)}.btn-ghost.svelte-4yj2yx:hover{background:var(--border);color:var(--text)}.dialog.svelte-1n78dcx{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:10px;padding:0;width:min(480px,95vw);max-height:90vh;overflow:hidden}.dialog.svelte-1n78dcx::backdrop{background:#0009}.dialog-content.svelte-1n78dcx{display:flex;flex-direction:column;max-height:90vh;overflow:hidden}.dialog-header.svelte-1n78dcx{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--border);flex-shrink:0;gap:8px}.dialog-title.svelte-1n78dcx{font-size:1.05rem;font-weight:600;margin:0;display:flex;align-items:center;gap:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.gear-icon.svelte-1n78dcx{flex-shrink:0;color:var(--text-muted);font-size:1rem}.close-btn.svelte-1n78dcx{background:none;border:none;color:var(--text-muted);font-size:1rem;cursor:pointer;padding:4px 6px;border-radius:4px;flex-shrink:0;line-height:1}.close-btn.svelte-1n78dcx:hover{background:var(--border);color:var(--text)}.dialog-body.svelte-1n78dcx{padding:16px 20px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:16px}.settings-section.svelte-1n78dcx{display:flex;flex-direction:column;gap:10px}.section-label.svelte-1n78dcx{font-size:var(--font-size-xs, .72rem);font-weight:600;color:var(--text-muted);letter-spacing:.08em;margin:0 0 2px;text-transform:uppercase}.field-group.svelte-1n78dcx{display:flex;flex-direction:column;gap:4px}.field-label.svelte-1n78dcx{font-size:.82rem;color:var(--text-muted)}.field-input.svelte-1n78dcx{background:var(--bg);border:1px solid var(--border);border-radius:0;color:var(--text);font-family:var(--font-mono, monospace);font-size:.88rem;padding:6px 9px;width:100%;box-sizing:border-box;outline:none}.field-input.svelte-1n78dcx:focus{border-color:var(--accent)}.field-select.svelte-1n78dcx{background:var(--bg);border:1px solid var(--border);border-radius:0;color:var(--text);font-family:var(--font-mono, monospace);font-size:.88rem;padding:6px 9px;width:100%;box-sizing:border-box;cursor:pointer;outline:none}.field-select.svelte-1n78dcx:focus{border-color:var(--accent)}.inline-row.svelte-1n78dcx{display:flex;align-items:center;gap:10px}.inline-row.svelte-1n78dcx .field-label:where(.svelte-1n78dcx){flex-shrink:0}.field-select-inline.svelte-1n78dcx{width:auto;flex:1;max-width:160px}.checkbox-row.svelte-1n78dcx{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.checkbox-label.svelte-1n78dcx{display:flex;align-items:center;gap:6px;font-size:.88rem;cursor:pointer;-webkit-user-select:none;user-select:none}.dialog-checkbox.svelte-1n78dcx{width:15px;height:15px;accent-color:var(--accent);cursor:pointer;flex-shrink:0}.divider.svelte-1n78dcx{height:1px;background:var(--border);margin:0 -20px}.prompt-group.svelte-1n78dcx{display:flex;flex-direction:column;gap:6px}.prompt-toggle.svelte-1n78dcx{background:none;border:none;color:var(--text);font-size:.88rem;cursor:pointer;padding:4px 0;text-align:left;display:flex;align-items:center;gap:6px;width:100%}.prompt-toggle.svelte-1n78dcx:hover{color:var(--accent)}.prompt-arrow.svelte-1n78dcx{color:var(--text-muted);font-size:.8rem;flex-shrink:0;width:10px}.prompt-textarea.svelte-1n78dcx{background:var(--bg);border:1px solid var(--border);border-radius:0;color:var(--text);font-family:var(--font-mono, monospace);font-size:.82rem;padding:8px 10px;width:100%;box-sizing:border-box;resize:vertical;line-height:1.5;outline:none}.prompt-textarea.svelte-1n78dcx:focus{border-color:var(--accent)}.error-msg.svelte-1n78dcx{font-size:.82rem;color:#e74c3c;margin:0;padding:6px 10px;background:#e74c3c14;border:1px solid rgba(231,76,60,.25)}.dialog-footer.svelte-1n78dcx{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 20px 16px;border-top:1px solid var(--border);flex-shrink:0}.footer-right.svelte-1n78dcx{display:flex;align-items:center;gap:10px}.save-success.svelte-1n78dcx{font-size:.82rem;color:var(--accent)}.btn.svelte-1n78dcx{padding:7px 16px;border-radius:4px;font-size:.88rem;cursor:pointer;border:1px solid transparent;font-weight:500;line-height:1.4}.btn.svelte-1n78dcx:disabled{opacity:.6;cursor:not-allowed}.btn-primary.svelte-1n78dcx{background:var(--accent);color:#fff;border-color:var(--accent)}.btn-primary.svelte-1n78dcx:hover:not(:disabled){opacity:.88}.btn-danger.svelte-1n78dcx{background:transparent;color:#c0392b;border-color:#c0392b66}.btn-danger.svelte-1n78dcx:hover{background:#c0392b1a;border-color:#c0392b}.btn-ghost.svelte-1n78dcx{background:transparent;color:var(--text-muted);border-color:var(--border)}.btn-ghost.svelte-1n78dcx:hover:not(:disabled){background:var(--border);color:var(--text)}.override-badge.svelte-1n78dcx{font-size:.68rem;font-weight:400;color:var(--accent);letter-spacing:0;text-transform:none;margin-left:6px}.main-app.svelte-13zv0lp{display:flex;flex-direction:row;width:100%;height:100vh;height:100dvh;overflow:hidden}.sidebar-overlay.svelte-13zv0lp{display:none}.terminal-area.svelte-13zv0lp{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden;position:relative}@media(max-width:600px){.main-app.svelte-13zv0lp{position:fixed;top:0;right:0;bottom:0;left:0;width:100%}.sidebar-overlay.svelte-13zv0lp{display:block;position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:99}.terminal-area.svelte-13zv0lp{width:100%}}:root{--bg: #000000;--surface: #0a0a0a;--surface-hover: #141414;--accent: #d97757;--text: #e0e0e0;--text-muted: #888888;--border: #333333;--status-success: #4ade80;--status-error: #f87171;--status-warning: #fbbf24;--status-merged: #a78bfa;--status-info: #60a5fa;--font-mono: "SF Mono", "Cascadia Code", "JetBrains Mono", "Fira Code", "Consolas", monospace;--font-size-xs: .75rem;--font-size-sm: .8125rem;--font-size-base: .875rem;--font-size-lg: 1rem;--sidebar-width: 240px;--toolbar-height: auto}[hidden]{display:none!important}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}dialog{margin:auto}html,body{height:100%;overflow:hidden;overscroll-behavior:none;background:var(--bg);color:var(--text);font-family:var(--font-mono);font-size:var(--font-size-base);color-scheme:dark}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}::-webkit-scrollbar{width:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}
@@ -11,8 +11,8 @@
11
11
  <meta name="apple-mobile-web-app-capable" content="yes" />
12
12
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
13
13
  <meta name="theme-color" content="#1a1a1a" />
14
- <script type="module" crossorigin src="/assets/index-BKUtECoE.js"></script>
15
- <link rel="stylesheet" crossorigin href="/assets/index-C2q5VIv7.css">
14
+ <script type="module" crossorigin src="/assets/index-BmfWSFP_.js"></script>
15
+ <link rel="stylesheet" crossorigin href="/assets/index-_1qoBHkK.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="app"></div>
@@ -13,7 +13,7 @@ import * as auth from './auth.js';
13
13
  import * as sessions from './sessions.js';
14
14
  import { AGENT_CONTINUE_ARGS, AGENT_YOLO_ARGS, serializeAll, restoreFromDisk, activeTmuxSessionNames, populateMetaCache } from './sessions.js';
15
15
  import { setupWebSocket } from './ws.js';
16
- import { WorktreeWatcher, BranchWatcher, WORKTREE_DIRS, isValidWorktreePath, parseWorktreeListPorcelain, parseAllWorktrees } from './watcher.js';
16
+ import { WorktreeWatcher, BranchWatcher, RefWatcher, WORKTREE_DIRS, isValidWorktreePath, parseWorktreeListPorcelain, parseAllWorktrees } from './watcher.js';
17
17
  import { isInstalled as serviceIsInstalled } from './service.js';
18
18
  import { extensionForMime, setClipboardImage } from './clipboard.js';
19
19
  import { listBranches, isBranchStale } from './git.js';
@@ -256,11 +256,38 @@ async function main() {
256
256
  }
257
257
  }
258
258
  }
259
+ // Rebuild ref watchers when branches change (new upstream to watch)
260
+ rebuildRefWatcher();
259
261
  });
260
262
  branchWatcher.rebuild(config.workspaces || []);
261
263
  watcher.on('worktrees-changed', () => {
262
264
  branchWatcher.rebuild(config.workspaces || []);
263
265
  });
266
+ // Watch upstream tracking refs for push/fetch and broadcast ref-changed events
267
+ const refWatcher = new RefWatcher((cwdPath, branch) => {
268
+ broadcastEvent('ref-changed', { cwdPath, branch });
269
+ });
270
+ let refWatcherRebuildPending = false;
271
+ let refWatcherNeedsRebuild = false;
272
+ function rebuildRefWatcher() {
273
+ if (refWatcherRebuildPending) {
274
+ refWatcherNeedsRebuild = true;
275
+ return;
276
+ }
277
+ refWatcherRebuildPending = true;
278
+ refWatcherNeedsRebuild = false;
279
+ const entries = sessions.list()
280
+ .filter(s => s.branchName)
281
+ .map(s => ({ cwdPath: s.cwd, branch: s.branchName }));
282
+ refWatcher.rebuild(entries).finally(() => {
283
+ refWatcherRebuildPending = false;
284
+ if (refWatcherNeedsRebuild)
285
+ rebuildRefWatcher();
286
+ });
287
+ }
288
+ rebuildRefWatcher();
289
+ sessions.onSessionCreate(() => rebuildRefWatcher());
290
+ sessions.onSessionEnd(() => rebuildRefWatcher());
264
291
  // Configure session defaults for hooks injection
265
292
  sessions.configure({ port: config.port, forceOutputParser: config.forceOutputParser ?? false });
266
293
  // Mount hooks router BEFORE auth middleware — hook callbacks come from localhost Claude Code
@@ -1196,6 +1223,7 @@ async function main() {
1196
1223
  await stopPolling();
1197
1224
  closeAnalytics();
1198
1225
  branchWatcher.close();
1226
+ refWatcher.close();
1199
1227
  server.close();
1200
1228
  // Serialize sessions to disk BEFORE killing them
1201
1229
  const configDir = path.dirname(CONFIG_PATH);
@@ -5,64 +5,53 @@ import { promisify } from 'node:util';
5
5
  import { EventEmitter } from 'node:events';
6
6
  const execFileAsync = promisify(execFile);
7
7
  export const WORKTREE_DIRS = ['.worktrees', '.claude/worktrees'];
8
+ function closeWatchers(watchers) {
9
+ for (const w of watchers) {
10
+ try {
11
+ w.close();
12
+ }
13
+ catch (_) { }
14
+ }
15
+ }
8
16
  export function isValidWorktreePath(worktreePath) {
9
17
  const resolved = path.resolve(worktreePath);
10
18
  return WORKTREE_DIRS.some(function (dir) {
11
19
  return resolved.includes(path.sep + dir + path.sep);
12
20
  });
13
21
  }
14
- /**
15
- * Parse `git worktree list --porcelain` output into ALL entries (including main worktree).
16
- * Skips bare entries. Detached HEAD entries get empty branch string.
17
- */
18
- export function parseAllWorktrees(stdout, repoPath) {
19
- const results = [];
20
- const blocks = stdout.split('\n\n').filter(Boolean);
21
- for (const block of blocks) {
22
- const lines = block.split('\n');
23
- let wtPath = '';
22
+ function parseWorktreeBlocks(stdout) {
23
+ return stdout.split('\n\n').filter(Boolean).map(block => {
24
+ let path = '';
24
25
  let branch = '';
25
26
  let bare = false;
26
- for (const line of lines) {
27
+ for (const line of block.split('\n')) {
27
28
  if (line.startsWith('worktree '))
28
- wtPath = line.slice(9);
29
- if (line.startsWith('branch refs/heads/'))
29
+ path = line.slice(9);
30
+ else if (line.startsWith('branch refs/heads/'))
30
31
  branch = line.slice(18);
31
- if (line === 'bare')
32
+ else if (line === 'bare')
32
33
  bare = true;
33
34
  }
34
- if (!wtPath || bare)
35
- continue;
36
- results.push({ path: wtPath, branch, isMain: wtPath === repoPath });
37
- }
38
- return results;
35
+ return { path, branch, bare };
36
+ });
37
+ }
38
+ /**
39
+ * Parse `git worktree list --porcelain` output into ALL entries (including main worktree).
40
+ * Skips bare entries. Detached HEAD entries get empty branch string.
41
+ */
42
+ export function parseAllWorktrees(stdout, repoPath) {
43
+ return parseWorktreeBlocks(stdout)
44
+ .filter(b => b.path && !b.bare)
45
+ .map(b => ({ path: b.path, branch: b.branch, isMain: b.path === repoPath }));
39
46
  }
40
47
  /**
41
48
  * Parse `git worktree list --porcelain` output into structured entries.
42
49
  * Skips the main worktree (matching repoPath) and bare/detached entries.
43
50
  */
44
51
  export function parseWorktreeListPorcelain(stdout, repoPath) {
45
- const results = [];
46
- const blocks = stdout.split('\n\n').filter(Boolean);
47
- for (const block of blocks) {
48
- const lines = block.split('\n');
49
- let wtPath = '';
50
- let branch = '';
51
- let bare = false;
52
- for (const line of lines) {
53
- if (line.startsWith('worktree '))
54
- wtPath = line.slice(9);
55
- if (line.startsWith('branch refs/heads/'))
56
- branch = line.slice(18);
57
- if (line === 'bare')
58
- bare = true;
59
- }
60
- // Skip the main worktree (repo root), bare repos, and detached HEAD
61
- if (!wtPath || wtPath === repoPath || bare || !branch)
62
- continue;
63
- results.push({ path: wtPath, branch });
64
- }
65
- return results;
52
+ return parseWorktreeBlocks(stdout)
53
+ .filter(b => b.path && b.path !== repoPath && !b.bare && b.branch)
54
+ .map(b => ({ path: b.path, branch: b.branch }));
66
55
  }
67
56
  export class WorktreeWatcher extends EventEmitter {
68
57
  _watchers;
@@ -124,12 +113,7 @@ export class WorktreeWatcher extends EventEmitter {
124
113
  }, 500);
125
114
  }
126
115
  _closeAll() {
127
- for (const w of this._watchers) {
128
- try {
129
- w.close();
130
- }
131
- catch (_) { }
132
- }
116
+ closeWatchers(this._watchers);
133
117
  this._watchers = [];
134
118
  if (this._debounceTimer) {
135
119
  clearTimeout(this._debounceTimer);
@@ -244,18 +228,160 @@ export class BranchWatcher {
244
228
  }
245
229
  }
246
230
  _closeAll() {
247
- for (const w of this._watchers) {
231
+ closeWatchers(this._watchers);
232
+ this._watchers = [];
233
+ for (const timer of this._debounceTimers.values()) {
234
+ clearTimeout(timer);
235
+ }
236
+ this._debounceTimers.clear();
237
+ this._lastBranch.clear();
238
+ }
239
+ close() {
240
+ this._closeAll();
241
+ }
242
+ }
243
+ /**
244
+ * Resolve the git directory for a checkout path, handling both regular repos
245
+ * and worktrees. For worktrees, follows the `commondir` file to find the main
246
+ * repo's git dir (where remote refs live).
247
+ */
248
+ export function resolveGitDir(cwdPath) {
249
+ const dotGit = path.join(cwdPath, '.git');
250
+ let stat;
251
+ try {
252
+ stat = fs.statSync(dotGit, { throwIfNoEntry: false });
253
+ }
254
+ catch (_) {
255
+ return null; // EACCES, ENOTDIR, etc.
256
+ }
257
+ if (!stat)
258
+ return null;
259
+ if (stat.isDirectory())
260
+ return dotGit;
261
+ // Worktree: .git is a file containing "gitdir: <path>"
262
+ let content;
263
+ try {
264
+ content = fs.readFileSync(dotGit, 'utf-8').trim();
265
+ }
266
+ catch (_) {
267
+ return null;
268
+ }
269
+ const match = content.match(/^gitdir:\s*(.+)$/);
270
+ if (!match)
271
+ return null;
272
+ const worktreeGitDir = path.resolve(cwdPath, match[1]);
273
+ // Follow commondir to find the main repo's git dir (where refs/remotes/ lives)
274
+ const commondirFile = path.join(worktreeGitDir, 'commondir');
275
+ try {
276
+ const commondir = fs.readFileSync(commondirFile, 'utf-8').trim();
277
+ return path.resolve(worktreeGitDir, commondir);
278
+ }
279
+ catch (_) {
280
+ // No commondir — fall back to the worktree git dir itself
281
+ return worktreeGitDir;
282
+ }
283
+ }
284
+ export class RefWatcher {
285
+ _watchers = [];
286
+ _debounceTimers = new Map();
287
+ _lastSha = new Map();
288
+ _entries = new Map();
289
+ _callback;
290
+ constructor(callback) {
291
+ this._callback = callback;
292
+ }
293
+ async rebuild(entries) {
294
+ this._closeAll();
295
+ // Dedupe entries — multiple sessions can share the same cwdPath:branch
296
+ const seen = new Set();
297
+ for (const { cwdPath, branch } of entries) {
298
+ const dedupeKey = `${cwdPath}:${branch}`;
299
+ if (seen.has(dedupeKey))
300
+ continue;
301
+ seen.add(dedupeKey);
302
+ // Resolve the upstream tracking ref
303
+ let upstreamRef;
304
+ try {
305
+ const { stdout } = await execFileAsync('git', ['rev-parse', '--symbolic-full-name', '@{u}'], { cwd: cwdPath });
306
+ upstreamRef = stdout.trim();
307
+ if (!upstreamRef)
308
+ continue;
309
+ }
310
+ catch (_) {
311
+ // No upstream (detached HEAD, unpushed branch) — skip
312
+ continue;
313
+ }
314
+ const key = `${cwdPath}:${branch}`;
315
+ this._entries.set(key, { cwdPath, branch, upstreamRef });
316
+ // Seed last known SHA
248
317
  try {
249
- w.close();
318
+ const { stdout } = await execFileAsync('git', ['rev-parse', upstreamRef], { cwd: cwdPath });
319
+ this._lastSha.set(key, stdout.trim());
320
+ }
321
+ catch (_) {
322
+ this._lastSha.set(key, null);
250
323
  }
251
- catch (_) { }
324
+ // Resolve git dir (handles worktrees via commondir)
325
+ const gitDir = resolveGitDir(cwdPath);
326
+ if (!gitDir)
327
+ continue;
328
+ // Watch the loose ref file if it exists (e.g. refs/remotes/origin/feature-x)
329
+ // upstreamRef is like "refs/remotes/origin/feature-x"
330
+ const refFile = path.join(gitDir, upstreamRef);
331
+ this._addWatch(refFile, key);
332
+ // Watch the remote's ref directory to catch new ref creation
333
+ const refDir = path.dirname(refFile);
334
+ this._addWatch(refDir, key);
252
335
  }
336
+ }
337
+ _addWatch(target, key) {
338
+ try {
339
+ if (!fs.existsSync(target))
340
+ return;
341
+ const watcher = fs.watch(target, { persistent: false }, () => {
342
+ this._debouncedCheck(key);
343
+ });
344
+ watcher.on('error', () => { });
345
+ this._watchers.push(watcher);
346
+ }
347
+ catch (_) { }
348
+ }
349
+ _debouncedCheck(key) {
350
+ const existing = this._debounceTimers.get(key);
351
+ if (existing)
352
+ clearTimeout(existing);
353
+ this._debounceTimers.set(key, setTimeout(() => {
354
+ this._debounceTimers.delete(key);
355
+ this._checkAndEmit(key);
356
+ }, 300));
357
+ }
358
+ async _checkAndEmit(key) {
359
+ const entry = this._entries.get(key);
360
+ if (!entry)
361
+ return;
362
+ let newSha;
363
+ try {
364
+ const { stdout } = await execFileAsync('git', ['rev-parse', entry.upstreamRef], { cwd: entry.cwdPath });
365
+ newSha = stdout.trim();
366
+ }
367
+ catch (_) {
368
+ newSha = null; // Ref deleted or pruned
369
+ }
370
+ const lastSha = this._lastSha.get(key);
371
+ if (newSha !== lastSha) {
372
+ this._lastSha.set(key, newSha);
373
+ this._callback(entry.cwdPath, entry.branch);
374
+ }
375
+ }
376
+ _closeAll() {
377
+ closeWatchers(this._watchers);
253
378
  this._watchers = [];
254
379
  for (const timer of this._debounceTimers.values()) {
255
380
  clearTimeout(timer);
256
381
  }
257
382
  this._debounceTimers.clear();
258
- this._lastBranch.clear();
383
+ this._lastSha.clear();
384
+ this._entries.clear();
259
385
  }
260
386
  close() {
261
387
  this._closeAll();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-remote-cli",
3
- "version": "3.11.2",
3
+ "version": "3.11.3",
4
4
  "description": "Remote web interface for Claude Code CLI sessions",
5
5
  "type": "module",
6
6
  "main": "dist/server/index.js",