claude-remote-cli 3.11.1 → 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
@@ -346,6 +373,8 @@ async function main() {
346
373
  args: [...resolved.claudeArgs, ...(resolved.yolo ? AGENT_YOLO_ARGS[resolved.agent] : [])],
347
374
  configPath: CONFIG_PATH,
348
375
  useTmux: resolved.useTmux,
376
+ yolo: resolved.yolo,
377
+ claudeArgs: resolved.claudeArgs,
349
378
  ...(opts.initialPrompt != null && { initialPrompt: opts.initialPrompt }),
350
379
  });
351
380
  },
@@ -891,6 +920,8 @@ async function main() {
891
920
  displayName: sessions.nextAgentName(),
892
921
  args: baseArgs,
893
922
  useTmux: resolved.useTmux,
923
+ yolo: resolved.yolo,
924
+ claudeArgs: resolved.claudeArgs,
894
925
  ...(safeCols != null && { cols: safeCols }),
895
926
  ...(safeRows != null && { rows: safeRows }),
896
927
  ...(initialPrompt != null && { initialPrompt }),
@@ -923,6 +954,8 @@ async function main() {
923
954
  args,
924
955
  configPath: CONFIG_PATH,
925
956
  useTmux: resolved.useTmux,
957
+ yolo: resolved.yolo,
958
+ claudeArgs: resolved.claudeArgs,
926
959
  ...(safeCols != null && { cols: safeCols }),
927
960
  ...(safeRows != null && { rows: safeRows }),
928
961
  ...(initialPrompt != null && { initialPrompt }),
@@ -974,6 +1007,8 @@ async function main() {
974
1007
  args,
975
1008
  configPath: CONFIG_PATH,
976
1009
  useTmux: resolved.useTmux,
1010
+ yolo: resolved.yolo,
1011
+ claudeArgs: resolved.claudeArgs,
977
1012
  ...(safeCols != null && { cols: safeCols }),
978
1013
  ...(safeRows != null && { rows: safeRows }),
979
1014
  needsBranchRename: isMountainName || (needsBranchRename ?? false),
@@ -1035,6 +1070,8 @@ async function main() {
1035
1070
  args,
1036
1071
  branchName,
1037
1072
  useTmux: resolved.useTmux,
1073
+ yolo: resolved.yolo,
1074
+ claudeArgs: resolved.claudeArgs,
1038
1075
  ...(safeCols != null && { cols: safeCols }),
1039
1076
  ...(safeRows != null && { rows: safeRows }),
1040
1077
  });
@@ -1186,6 +1223,7 @@ async function main() {
1186
1223
  await stopPolling();
1187
1224
  closeAnalytics();
1188
1225
  branchWatcher.close();
1226
+ refWatcher.close();
1189
1227
  server.close();
1190
1228
  // Serialize sessions to disk BEFORE killing them
1191
1229
  const configDir = path.dirname(CONFIG_PATH);
@@ -48,7 +48,7 @@ function writeHooksSettingsFile(sessionId, port, token) {
48
48
  return filePath;
49
49
  }
50
50
  export function createPtySession(params, sessionsMap, idleChangeCallbacks, stateChangeCallbacks = [], sessionEndCallbacks = []) {
51
- const { id, type, agent = 'claude', repoName, repoPath, cwd, root, worktreeName, branchName, displayName, command, args: rawArgs = [], cols = 80, rows = 24, configPath, useTmux: paramUseTmux, tmuxSessionName: paramTmuxSessionName, initialScrollback, restored: paramRestored, port, forceOutputParser, } = params;
51
+ const { id, type, agent = 'claude', repoName, repoPath, cwd, root, worktreeName, branchName, displayName, command, args: rawArgs = [], cols = 80, rows = 24, configPath, useTmux: paramUseTmux, tmuxSessionName: paramTmuxSessionName, initialScrollback, restored: paramRestored, port, forceOutputParser, yolo: paramYolo, claudeArgs: paramClaudeArgs, } = params;
52
52
  let args = rawArgs;
53
53
  const createdAt = new Date().toISOString();
54
54
  const resolvedCommand = command || AGENT_COMMANDS[agent];
@@ -121,6 +121,8 @@ export function createPtySession(params, sessionsMap, idleChangeCallbacks, state
121
121
  hookToken,
122
122
  hooksActive,
123
123
  cleanedUp: false,
124
+ yolo: paramYolo ?? false,
125
+ claudeArgs: paramClaudeArgs ?? [],
124
126
  _lastHookTime: undefined,
125
127
  };
126
128
  sessionsMap.set(id, session);
@@ -242,10 +242,12 @@ function serializeAll(configDir) {
242
242
  tmuxSessionName: session.tmuxSessionName,
243
243
  customCommand: session.customCommand,
244
244
  cwd: session.cwd,
245
+ yolo: session.yolo,
246
+ claudeArgs: session.claudeArgs,
245
247
  });
246
248
  }
247
249
  const pending = {
248
- version: 1,
250
+ version: 2,
249
251
  timestamp: new Date().toISOString(),
250
252
  sessions: serializedPty,
251
253
  };
@@ -306,13 +308,23 @@ async function restoreFromDisk(configDir) {
306
308
  args = ['-u', 'attach-session', '-t', s.tmuxSessionName];
307
309
  }
308
310
  else {
309
- // Tmux session died — fall back to agent with continue args
310
- args = [...AGENT_CONTINUE_ARGS[s.agent]];
311
+ // Tmux session died — fall back to agent with continue args + preserved flags
312
+ // Continue args first: Codex uses subcommands (resume --last) that must precede flags
313
+ args = [
314
+ ...AGENT_CONTINUE_ARGS[s.agent],
315
+ ...(s.claudeArgs ?? []),
316
+ ...(s.yolo ? AGENT_YOLO_ARGS[s.agent] : []),
317
+ ];
311
318
  }
312
319
  }
313
320
  else {
314
- // Non-tmux agent session — respawn with continue args
315
- args = [...AGENT_CONTINUE_ARGS[s.agent]];
321
+ // Non-tmux agent session — respawn with continue args + preserved flags
322
+ // Continue args first: Codex uses subcommands (resume --last) that must precede flags
323
+ args = [
324
+ ...AGENT_CONTINUE_ARGS[s.agent],
325
+ ...(s.claudeArgs ?? []),
326
+ ...(s.yolo ? AGENT_YOLO_ARGS[s.agent] : []),
327
+ ];
316
328
  }
317
329
  try {
318
330
  const createParams = {
@@ -330,6 +342,8 @@ async function restoreFromDisk(configDir) {
330
342
  useTmux: false, // Don't re-wrap in tmux — either attaching to existing or using plain agent
331
343
  tmuxSessionName: s.tmuxSessionName,
332
344
  restored: true,
345
+ yolo: s.yolo ?? false,
346
+ claudeArgs: s.claudeArgs ?? [],
333
347
  };
334
348
  if (command)
335
349
  createParams.command = command;
@@ -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();